Skip to content

Commit

Permalink
Upgrade ArduinoJson dependency and fix use of deprecated APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
rbroker committed Mar 9, 2024
1 parent 97243e1 commit c1c0aed
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 37 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Uses the CN105 connector on the Cased Flow Temp Controller (FTC6 in my setup) to
- Output power
- Legionella prevention temperature setting
- Zone 1 room temperature
- Zone 1 flow temperature target
- Zone 1 flow temperature target
- Zone 2 room temperature
- Zone 2 flow temperature target
- Dhw current temperature
Expand Down Expand Up @@ -59,9 +59,9 @@ Uses the CN105 connector on the Cased Flow Temp Controller (FTC6 in my setup) to
- WROOM-32

## Library Dependencies
- ArduinoJson v6.21.2
- ArduinoJson v7.0.3
- Seeed_Arduino_mbedtls v3.0.1
- MQTT v2.5.1
- MQTT v2.5.2

## First Time Setup
- Clone this repository and build with the Arduino IDE
Expand Down Expand Up @@ -150,7 +150,7 @@ Some parameters of your Mitsubishi Ecodan HVAC
| Check this option to fall back to broadcasting a "captive portal" WiFi access point if the network connection is lost for a long time (~20 mins). Intended to avoid the need for physically accessing the ESP32 if (e.g. a router is replaced, and the SSID / password are different). If a device password is set, a device password will be required to connect to the captive port access point. | False |

### Hostname
The network hostname the device will use to identify itself.
The network hostname the device will use to identify itself.

| Default | Required |
| ----------------- | -------- |
Expand All @@ -164,7 +164,7 @@ The IP address or hostname of the MQTT server on your local network.
| `""` | No |

### MQTT Port
The port on which your MQTT server is listening.
The port on which your MQTT server is listening.

| Default | Required |
| ------- | -------- |
Expand Down
7 changes: 4 additions & 3 deletions ecodan-ha-local/ehal_http.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,14 +276,15 @@ namespace ehal::http
{
log_web(F("Wifi Scan Result: %u"), result);

DynamicJsonDocument json(8192);
JsonArray wifi = json.createNestedArray(F("wifi"));
JsonDocument doc;
JsonObject json = doc.to<JsonObject>();
JsonArray wifi = json["wifi"].to<JsonArray>();
String jsonOut;

for (int i = 0; i < result; ++i)
{
log_web(F("SSID: %s"), WiFi.SSID(i).c_str());
JsonObject obj = wifi.createNestedObject();
JsonObject obj = wifi.add<JsonObject>();
obj[F("ssid")] = WiFi.SSID(i);
obj[F("rssi")] = WiFi.RSSI(i);
}
Expand Down
65 changes: 38 additions & 27 deletions ecodan-ha-local/ehal_mqtt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -410,10 +410,10 @@ off
return name + "_" + device_mac();
}

void add_discovery_device_object(DynamicJsonDocument& doc)
void add_discovery_device_object(JsonObject obj)
{
JsonObject device = doc.createNestedObject(F("device"));
JsonArray identifiers = device.createNestedArray(F("ids"));
JsonObject device = obj["device"].to<JsonObject>();
JsonArray identifiers = device["ids"].to<JsonArray>();
identifiers.add(device_mac());

device[F("name")] = F("Mitsubishi A2W Heat Pump");
Expand All @@ -428,7 +428,7 @@ off
return mqttClient.publish(topic, payload, retain, static_cast<int>(LWMQTT_QOS1));
}

bool publish_mqtt(const String& topic, const DynamicJsonDocument& json, bool retain = false)
bool publish_mqtt(const String& topic, const JsonDocument& json, bool retain = false)
{
String output;
serializeJson(json, output);
Expand All @@ -445,7 +445,8 @@ off
String stateTopic = config.MqttTopic + "/" + uniqueName + F("/state");
String tempCmdTopic = config.MqttTopic + "/" + uniqueName + F("/temp_cmd");

DynamicJsonDocument payloadJson(8192);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;
payloadJson[F("icon")] = F("mdi:heat-pump-outline");
Expand Down Expand Up @@ -475,11 +476,11 @@ off
payloadJson[F("temp_step")] = hp::get_temperature_step();
}

JsonArray modes = payloadJson.createNestedArray(F("modes"));
JsonArray modes = payloadJson["modes"].to<JsonArray>();
modes.add(F("heat"));
modes.add(F("off"));

if (!publish_mqtt(discoveryTopic, payloadJson, /* retain =*/true))
if (!publish_mqtt(discoveryTopic, doc, /* retain =*/true))
{
log_web(F("Failed to publish homeassistant climate entity auto-discover"));
return false;
Expand All @@ -498,7 +499,8 @@ off
String stateTopic = config.MqttTopic + "/" + unique_entity_name(F("mode_dhw_forced")) + F("/state");
String cmdTopic = config.MqttTopic + "/" + uniqueName + F("/set");

DynamicJsonDocument payloadJson(8192);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;
payloadJson[F("icon")] = F("mdi:toggle-switch-variant");
Expand All @@ -512,7 +514,7 @@ off
payloadJson[F("cmd_t")] = cmdTopic;
payloadJson[F("cmd_tpl")] = F("{{ value }}");

if (!publish_mqtt(discoveryTopic, payloadJson, /* retain =*/true))
if (!publish_mqtt(discoveryTopic, doc, /* retain =*/true))
{
log_web(F("Failed to publish homeassistant force DHW entity auto-discover"));
return false;
Expand All @@ -532,7 +534,8 @@ off
String stateTopic = config.MqttTopic + "/" + unique_entity_name(F("z1_flow_temp_target")) + F("/state");
String cmdTopic = config.MqttTopic + "/" + uniqueName + F("/set");

DynamicJsonDocument payloadJson(8192);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;

Expand All @@ -549,7 +552,7 @@ off
payloadJson[F("unit_of_meas")] = F("°C");
payloadJson[F("icon")] = String("mdi:thermometer-water");

if (!publish_mqtt(discoveryTopic, payloadJson, /* retain =*/true))
if (!publish_mqtt(discoveryTopic, doc, /* retain =*/true))
{
log_web(F("Failed to publish homeassistant Z1 flow temperature set entity auto-discover"));
return false;
Expand All @@ -568,7 +571,8 @@ off
String stateTopic = config.MqttTopic + "/" + unique_entity_name(F("mode_power")) + F("/state");
String cmdTopic = config.MqttTopic + "/" + uniqueName + F("/set");

DynamicJsonDocument payloadJson(8192);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;
payloadJson[F("icon")] = F("mdi:power");
Expand All @@ -582,7 +586,7 @@ off
payloadJson[F("cmd_t")] = cmdTopic;
payloadJson[F("cmd_tpl")] = F("{{ value }}");

if (!publish_mqtt(discoveryTopic, payloadJson, /* retain =*/true))
if (!publish_mqtt(discoveryTopic, doc, /* retain =*/true))
{
log_web(F("Failed to publish homeassistant turn On/Off HP entity auto-discover"));
return false;
Expand All @@ -599,7 +603,8 @@ off
const auto& config = config_instance();
String discoveryTopic = String(F("homeassistant/water_heater/")) + uniqueName + F("/config");

DynamicJsonDocument payloadJson(8192);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;

Expand All @@ -614,14 +619,14 @@ off
payloadJson[F("mode_cmd_t")] = config.MqttTopic + "/" + unique_entity_name(F("dhw_mode")) + F("/set");
payloadJson[F("min_temp")] = String(ehal::hp::get_min_dhw_temperature());
payloadJson[F("max_temp")] = String(ehal::hp::get_max_dhw_temperature());
JsonArray modes = payloadJson.createNestedArray(F("modes"));
JsonArray modes = payloadJson["modes"].to<JsonArray>();
modes.add("off");
modes.add("eco");
modes.add("performance");
payloadJson[F("temp_unit")] = "C";
payloadJson[F("precision")] = 0.5f;

if (!publish_mqtt(discoveryTopic, payloadJson, /* retain =*/true))
if (!publish_mqtt(discoveryTopic, doc, /* retain =*/true))
{
log_web(F("Failed to publish homeassistant DHW temperature set entity auto-discover"));
return false;
Expand All @@ -638,15 +643,16 @@ off
const auto& config = config_instance();
String discoveryTopic = String(F("homeassistant/select/")) + uniqueName + F("/config");

DynamicJsonDocument payloadJson(8192);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;

add_discovery_device_object(payloadJson);

payloadJson[F("stat_t")] = config.MqttTopic + "/" + unique_entity_name(F("mode_heating_cooling")) + F("/state");
payloadJson[F("cmd_t")] = config.MqttTopic + "/" + unique_entity_name(F("sh_mode")) + F("/set");
JsonArray options = payloadJson.createNestedArray(F("options"));
JsonArray options = payloadJson["options"].to<JsonArray>();
options.add("Heat Target Temperature");
options.add("Heat Flow Temperature");
options.add("Heat Compensation Curve");
Expand All @@ -655,7 +661,7 @@ off
options.add("Cool Flow Temperature");
}

if (!publish_mqtt(discoveryTopic, payloadJson, /* retain =*/true))
if (!publish_mqtt(discoveryTopic, doc, /* retain =*/true))
{
log_web(F("Failed to publish homeassistant SH mode entity auto-discover"));
return false;
Expand All @@ -672,7 +678,8 @@ off
String stateTopic = config.MqttTopic + "/" + uniqueName + F("/state");

// https://www.home-assistant.io/integrations/binary_sensor.mqtt/
DynamicJsonDocument payloadJson(4096);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;

Expand All @@ -683,7 +690,7 @@ off
payloadJson[F("payload_on")] = F("on");
payloadJson[F("exp_aft")] = SENSOR_STATE_TIMEOUT;

if (!publish_mqtt(discoveryTopic, payloadJson))
if (!publish_mqtt(discoveryTopic, doc))
{
log_web(F("Failed to publish homeassistant %s entity auto-discover"), uniqueName.c_str());
return false;
Expand All @@ -700,7 +707,8 @@ off
String stateTopic = config.MqttTopic + "/" + uniqueName + F("/state");

// https://www.home-assistant.io/integrations/sensor.mqtt/
DynamicJsonDocument payloadJson(4096);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;

Expand Down Expand Up @@ -752,7 +760,7 @@ off
break;
}

if (!publish_mqtt(discoveryTopic, payloadJson))
if (!publish_mqtt(discoveryTopic, doc))
{
log_web(F("Failed to publish homeassistant %s entity auto-discover"), uniqueName.c_str());
return false;
Expand All @@ -769,7 +777,8 @@ off
String stateTopic = config.MqttTopic + "/" + uniqueName + F("/state");

// https://www.home-assistant.io/integrations/sensor.mqtt/
DynamicJsonDocument payloadJson(4096);
JsonDocument doc;
JsonObject payloadJson = doc.to<JsonObject>();
payloadJson[F("name")] = uniqueName;
payloadJson[F("unique_id")] = uniqueName;

Expand All @@ -784,7 +793,7 @@ off
payloadJson[F("icon")] = icon;
}

if (!publish_mqtt(discoveryTopic, payloadJson))
if (!publish_mqtt(discoveryTopic, doc))
{
log_web(F("Failed to publish homeassistant %s entity auto-discover"), uniqueName.c_str());
return false;
Expand Down Expand Up @@ -912,7 +921,9 @@ off

void publish_climate_status()
{
DynamicJsonDocument json(1024);
JsonDocument doc;
JsonObject json = doc.to<JsonObject>();


{
auto& status = hp::get_status();
Expand All @@ -926,7 +937,7 @@ off

const auto& config = config_instance();
String stateTopic = config.MqttTopic + "/" + unique_entity_name(F("climate_control")) + F("/state");
if (!publish_mqtt(stateTopic, json))
if (!publish_mqtt(stateTopic, doc))
log_web(F("Failed to publish MQTT state for: %s"), unique_entity_name(F("climate_control")).c_str());
}

Expand Down
4 changes: 2 additions & 2 deletions ecodan-ha-local/ehal_thirdparty.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
* (anything not included with the ESP32 package)
*/

#include <ArduinoJson.h> // ArduinoJson v6.21.2
#include <ArduinoJson.h> // ArduinoJson v7.0.3
#include <mbedtls/md.h> // Seeed_Arduino_mdedtls v3.0.1
#include <MQTT.h> // MQTT v2.5.1
#include <MQTT.h> // MQTT v2.5.2

0 comments on commit c1c0aed

Please sign in to comment.