13 Commits
1.3.1 ... 1.3.2

Author SHA1 Message Date
Yurii
5c0dfc544e update to 1.3.2 2023-10-21 03:02:38 +03:00
Yurii
5fba94312b added build functions 2023-10-21 03:01:48 +03:00
Yurii
62bea87f8a upd env 2023-10-21 01:48:44 +03:00
Yurii
f52aa8e889 removed unused code 2023-10-20 21:07:12 +03:00
Yurii
df8354866f fix entity climate.heating 2023-10-20 21:06:44 +03:00
Yurii
6242db7a29 removed unused code 2023-10-19 02:20:37 +03:00
Yurii
dc00fdcdb6 Fix Error ''max' must be > 'min'' when processing MQTT 2023-10-19 02:18:39 +03:00
Yurii
2615e9106e upd readme 2023-10-19 00:45:06 +03:00
Yurii
0f60a07a71 upd readme 2023-10-19 00:43:17 +03:00
Yurii
f8750373d4 format code 2023-10-19 00:40:07 +03:00
Yurii
d5a92c47c7 Fixed get current dhw temp 2023-10-19 00:34:11 +03:00
Yurii
bc91168bbf added interval for forced set temperatures 2023-10-17 14:50:43 +03:00
Yurii
96c1a187cd upd readme, get modulation fix 2023-10-17 14:14:24 +03:00
15 changed files with 125 additions and 209 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
.pio .pio
.vscode .vscode
build/*

View File

@@ -33,6 +33,10 @@
| BAXI ECO Nova | default | Pressure sensor not supported, modulation level not stable | | BAXI ECO Nova | default | Pressure sensor not supported, modulation level not stable |
| BAXI Ampera | 1028 | Pressure sensor not supported, only heating (DHW not tested) | | BAXI Ampera | 1028 | Pressure sensor not supported, only heating (DHW not tested) |
| [Remeha Calenta Ace 40C](https://github.com/Laxilef/OTGateway/issues/1#issuecomment-1726081554) | default | - | | [Remeha Calenta Ace 40C](https://github.com/Laxilef/OTGateway/issues/1#issuecomment-1726081554) | default | - |
| [Baxi Nuvola DUO-TEC HT 16](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1751061488) | default | - |
| [AEG GBA124](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1765857609) | default | Pressure sensor not supported |
| [Ferroli DOMIcompact C 24](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1765310058)<br><sub>Board: MF08FA</sub> | 211 | Pressure sensor not supported |
| [Thermet Ecocondens Silver 35kW)](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1767026384) | default | Pressure sensor not supported |
## PCB ## PCB
<img src="/assets/pcb.svg" width="27%" /> <img src="/assets/pcb_3d.png" width="30%" /> <img src="/assets/after_assembly.png" width="40%" /> <img src="/assets/pcb.svg" width="27%" /> <img src="/assets/pcb_3d.png" width="30%" /> <img src="/assets/after_assembly.png" width="40%" />

14
build.py Normal file
View File

@@ -0,0 +1,14 @@
import shutil
import os
Import("env")
def post_build(source, target, env):
src = target[0].get_abspath()
dest = os.path.join(env["PROJECT_DIR"], "build", "firmware_%s_%s.bin" % (env.GetProjectOption("board"), env.GetProjectOption("version")))
#print("dest:"+dest)
#print("source:"+src)
shutil.copy(src, dest)
env.AddPostAction("$BUILD_DIR/firmware.bin", post_build)

View File

@@ -92,7 +92,7 @@ public:
const byte valueLB = response & 0xFF; const byte valueLB = response & 0xFF;
const byte valueHB = (response >> 8) & 0xFF; const byte valueHB = (response >> 8) & 0xFF;
float value = (int8_t) valueHB; float value = (int8_t)valueHB;
return value + (float)valueLB / 256.0; return value + (float)valueLB / 256.0;
} }

View File

@@ -15,7 +15,7 @@ public:
const char* noChecked = "type=\"checkbox\""; const char* noChecked = "type=\"checkbox\"";
const char* trueVal = "T"; const char* trueVal = "T";
CheckboxParameter(const char* id, const char* label, bool value): WiFiManagerParameter("") { CheckboxParameter(const char* id, const char* label, bool value) : WiFiManagerParameter("") {
init(id, label, value ? trueVal : "0", 1, "", WFM_LABEL_AFTER); init(id, label, value ? trueVal : "0", 1, "", WFM_LABEL_AFTER);
} }
@@ -34,5 +34,5 @@ public:
class SeparatorParameter : public WiFiManagerParameter { class SeparatorParameter : public WiFiManagerParameter {
public: public:
SeparatorParameter(): WiFiManagerParameter("<hr>") {} SeparatorParameter() : WiFiManagerParameter("<hr>") {}
}; };

View File

@@ -8,9 +8,8 @@
; Please visit documentation for the other options and examples ; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[env:d1_mini_pro] [env]
platform = espressif8266 platform = espressif8266
board = d1_mini_pro
framework = arduino framework = arduino
lib_deps = lib_deps =
nrwiersma/ESP8266Scheduler@^1.0 nrwiersma/ESP8266Scheduler@^1.0
@@ -27,3 +26,14 @@ lib_deps =
build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
upload_speed = 921600 upload_speed = 921600
monitor_speed = 115200 monitor_speed = 115200
extra_scripts = post:build.py
version = 1.3.2
[env:d1_mini]
board = d1_mini
[env:d1_mini_lite]
board = d1_mini_lite
[env:d1_mini_pro]
board = d1_mini_pro

View File

@@ -51,9 +51,6 @@ public:
doc[F("options")][2] = F("External"); doc[F("options")][2] = F("External");
client.beginPublish((F("homeassistant/select/") + _prefix + F("/outdoor_sensor_type/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/select/") + _prefix + F("/outdoor_sensor_type/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -81,9 +78,6 @@ public:
doc[F("options")][1] = F("External"); doc[F("options")][1] = F("External");
client.beginPublish((F("homeassistant/select/") + _prefix + F("/indoor_sensor_type/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/select/") + _prefix + F("/indoor_sensor_type/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -182,9 +176,6 @@ public:
doc[F("payload_off")] = F("{\"debug\": false}"); doc[F("payload_off")] = F("{\"debug\": false}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/debug/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/debug/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -215,9 +206,6 @@ public:
doc[F("payload_off")] = F("{\"emergency\": {\"enable\" : false}}"); doc[F("payload_off")] = F("{\"emergency\": {\"enable\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -250,9 +238,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/emergency_target/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/emergency_target/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -284,9 +269,6 @@ public:
doc[F("payload_off")] = F("{\"emergency\": {\"useEquitherm\" : false}}"); doc[F("payload_off")] = F("{\"emergency\": {\"useEquitherm\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency_use_equitherm/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency_use_equitherm/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -318,9 +300,6 @@ public:
doc[F("payload_off")] = F("{\"heating\": {\"enable\" : false}}"); doc[F("payload_off")] = F("{\"heating\": {\"enable\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -351,9 +330,6 @@ public:
doc[F("payload_off")] = F("{\"heating\": {\"turbo\" : false}}"); doc[F("payload_off")] = F("{\"heating\": {\"turbo\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating_turbo/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating_turbo/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -382,14 +358,11 @@ public:
doc[F("command_topic")] = _prefix + F("/settings/set"); doc[F("command_topic")] = _prefix + F("/settings/set");
doc[F("command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}"); doc[F("command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}");
doc[F("min")] = minTemp; doc[F("min")] = minTemp;
doc[F("max")] = maxTemp <= minTemp ? maxTemp : maxTemp; doc[F("max")] = maxTemp;
doc[F("step")] = 0.5; doc[F("step")] = 0.5;
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_target/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_target/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -422,9 +395,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_hysteresis/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_hysteresis/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -453,9 +423,6 @@ public:
doc[F("value_template")] = F("{{ value_json.parameters.heatingSetpoint|int(0) }}"); doc[F("value_template")] = F("{{ value_json.parameters.heatingSetpoint|int(0) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_setpoint/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_setpoint/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -607,9 +574,6 @@ public:
doc[F("payload_off")] = F("{\"dhw\": {\"enable\" : false}}"); doc[F("payload_off")] = F("{\"dhw\": {\"enable\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -643,9 +607,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -796,9 +757,6 @@ public:
doc[F("payload_off")] = F("{\"pid\": {\"enable\" : false}}"); doc[F("payload_off")] = F("{\"pid\": {\"enable\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/pid/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/pid/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -828,9 +786,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_p_factor/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_p_factor/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -860,9 +815,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_i_factor/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_i_factor/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -892,9 +844,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_d_factor/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_d_factor/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -989,9 +938,6 @@ public:
doc[F("payload_off")] = F("{\"equitherm\": {\"enable\" : false}}"); doc[F("payload_off")] = F("{\"equitherm\": {\"enable\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/equitherm/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/equitherm/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1021,9 +967,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_n_factor/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_n_factor/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1053,9 +996,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_k_factor/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_k_factor/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1087,9 +1027,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_t_factor/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_t_factor/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1120,9 +1057,6 @@ public:
doc[F("payload_off")] = F("{\"tuning\": {\"enable\" : false}}"); doc[F("payload_off")] = F("{\"tuning\": {\"enable\" : false}}");
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/tuning/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/switch/") + _prefix + F("/tuning/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1152,9 +1086,6 @@ public:
doc[F("options")][1] = F("PID"); doc[F("options")][1] = F("PID");
client.beginPublish((F("homeassistant/select/") + _prefix + F("/tuning_regulator/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/select/") + _prefix + F("/tuning_regulator/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1182,9 +1113,6 @@ public:
doc[F("expire_after")] = 60; doc[F("expire_after")] = 60;
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/status/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/status/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1210,9 +1138,6 @@ public:
doc[F("value_template")] = F("{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}"); doc[F("value_template")] = F("{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}");
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/ot_status/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/ot_status/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1239,9 +1164,6 @@ public:
doc[F("value_template")] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}"); doc[F("value_template")] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}");
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1268,9 +1190,6 @@ public:
doc[F("value_template")] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}"); doc[F("value_template")] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}");
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1297,9 +1216,6 @@ public:
doc[F("value_template")] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}"); doc[F("value_template")] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}");
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/flame/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/flame/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1327,9 +1243,6 @@ public:
doc[F("value_template")] = F("{{ iif(value_json.states.fault, 'ON', 'OFF') }}"); doc[F("value_template")] = F("{{ iif(value_json.states.fault, 'ON', 'OFF') }}");
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/fault/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/fault/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1356,9 +1269,6 @@ public:
doc[F("value_template")] = F("{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}"); doc[F("value_template")] = F("{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}");
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/diagnostic/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/diagnostic/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1385,9 +1295,6 @@ public:
doc[F("value_template")] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}"); doc[F("value_template")] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/fault_code/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/fault_code/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1416,9 +1323,6 @@ public:
doc["value_template"] = "{{ value_json.states.rssi|float(0)|round(1) }}"; doc["value_template"] = "{{ value_json.states.rssi|float(0)|round(1) }}";
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/rssi/config").c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + "/rssi/config").c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1448,9 +1352,6 @@ public:
doc[F("value_template")] = F("{{ value_json.sensors.modulation|float(0)|round(0) }}"); doc[F("value_template")] = F("{{ value_json.sensors.modulation|float(0)|round(0) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/modulation/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/modulation/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1479,9 +1380,6 @@ public:
doc[F("value_template")] = F("{{ value_json.sensors.pressure|float(0)|round(2) }}"); doc[F("value_template")] = F("{{ value_json.sensors.pressure|float(0)|round(2) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/pressure/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/pressure/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1515,9 +1413,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1547,9 +1442,6 @@ public:
doc[F("value_template")] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}"); doc[F("value_template")] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1582,9 +1474,6 @@ public:
doc[F("mode")] = "box"; doc[F("mode")] = "box";
client.beginPublish((F("homeassistant/number/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/number/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1614,9 +1503,6 @@ public:
doc[F("value_template")] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}"); doc[F("value_template")] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1645,9 +1531,6 @@ public:
doc[F("value_template")] = F("{{ value_json.temperatures.heating|float(0)|round(2) }}"); doc[F("value_template")] = F("{{ value_json.temperatures.heating|float(0)|round(2) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_temp/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_temp/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
@@ -1676,16 +1559,13 @@ public:
doc[F("value_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(2) }}"); doc[F("value_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(2) }}");
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) { bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) {
StaticJsonDocument<2048> doc; StaticJsonDocument<2560> doc;
doc[F("availability")][F("topic")] = _prefix + F("/status"); doc[F("availability")][F("topic")] = _prefix + F("/status");
doc[F("device")][F("identifiers")][0] = _prefix; doc[F("device")][F("identifiers")][0] = _prefix;
doc[F("device")][F("sw_version")] = _deviceVersion; doc[F("device")][F("sw_version")] = _deviceVersion;
@@ -1734,15 +1614,12 @@ public:
doc[F("temp_step")] = 0.5; doc[F("temp_step")] = 0.5;
client.beginPublish((F("homeassistant/climate/") + _prefix + F("_heating/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/climate/") + _prefix + F("_heating/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }
bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) { bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) {
StaticJsonDocument<1536> doc; StaticJsonDocument<2560> doc;
doc[F("availability")][F("topic")] = _prefix + F("/status"); doc[F("availability")][F("topic")] = _prefix + F("/status");
doc[F("device")][F("identifiers")][0] = _prefix; doc[F("device")][F("identifiers")][0] = _prefix;
doc[F("device")][F("sw_version")] = _deviceVersion; doc[F("device")][F("sw_version")] = _deviceVersion;
@@ -1783,9 +1660,6 @@ public:
doc[F("max_temp")] = maxTemp; doc[F("max_temp")] = maxTemp;
client.beginPublish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), measureJson(doc), true); client.beginPublish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), measureJson(doc), true);
//BufferingPrint bufferedClient(client, 32);
//serializeJson(doc, bufferedClient);
//bufferedClient.flush();
serializeJson(doc, client); serializeJson(doc, client);
return client.endPublish(); return client.endPublish();
} }

View File

@@ -2,9 +2,9 @@ extern MqttTask* tMqtt;
extern SensorsTask* tSensors; extern SensorsTask* tSensors;
extern OpenThermTask* tOt; extern OpenThermTask* tOt;
class MainTask: public Task { class MainTask : public Task {
public: public:
MainTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {} MainTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
protected: protected:
unsigned long lastHeapInfo = 0; unsigned long lastHeapInfo = 0;
@@ -25,7 +25,7 @@ protected:
tMqtt->enable(); tMqtt->enable();
} }
if ( firstFailConnect != 0 ) { if (firstFailConnect != 0) {
firstFailConnect = 0; firstFailConnect = 0;
} }

View File

@@ -8,9 +8,9 @@ PubSubClient client(espClient);
HomeAssistantHelper haHelper; HomeAssistantHelper haHelper;
class MqttTask: public Task { class MqttTask : public Task {
public: public:
MqttTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {} MqttTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
protected: protected:
unsigned long lastReconnectAttempt = 0; unsigned long lastReconnectAttempt = 0;
@@ -101,7 +101,7 @@ protected:
} }
if (!doc["emergency"]["target"].isNull() && doc["emergency"]["target"].is<float>()) { if (!doc["emergency"]["target"].isNull() && doc["emergency"]["target"].is<float>()) {
if ( doc["emergency"]["target"].as<float>() > 0 && doc["emergency"]["target"].as<float>() < 100 ) { if (doc["emergency"]["target"].as<float>() > 0 && doc["emergency"]["target"].as<float>() < 100) {
settings.emergency.target = round(doc["emergency"]["target"].as<float>() * 10) / 10; settings.emergency.target = round(doc["emergency"]["target"].as<float>() * 10) / 10;
flag = true; flag = true;
} }
@@ -125,21 +125,21 @@ protected:
} }
if (!doc["heating"]["target"].isNull() && doc["heating"]["target"].is<float>()) { if (!doc["heating"]["target"].isNull() && doc["heating"]["target"].is<float>()) {
if ( doc["heating"]["target"].as<float>() > 0 && doc["heating"]["target"].as<float>() < 100 ) { if (doc["heating"]["target"].as<float>() > 0 && doc["heating"]["target"].as<float>() < 100) {
settings.heating.target = round(doc["heating"]["target"].as<float>() * 10) / 10; settings.heating.target = round(doc["heating"]["target"].as<float>() * 10) / 10;
flag = true; flag = true;
} }
} }
if (!doc["heating"]["hysteresis"].isNull() && doc["heating"]["hysteresis"].is<float>()) { if (!doc["heating"]["hysteresis"].isNull() && doc["heating"]["hysteresis"].is<float>()) {
if ( doc["heating"]["hysteresis"].as<float>() >= 0 && doc["heating"]["hysteresis"].as<float>() <= 5 ) { if (doc["heating"]["hysteresis"].as<float>() >= 0 && doc["heating"]["hysteresis"].as<float>() <= 5) {
settings.heating.hysteresis = round(doc["heating"]["hysteresis"].as<float>() * 10) / 10; settings.heating.hysteresis = round(doc["heating"]["hysteresis"].as<float>() * 10) / 10;
flag = true; flag = true;
} }
} }
if (!doc["heating"]["maxTemp"].isNull() && doc["heating"]["maxTemp"].is<unsigned char>()) { if (!doc["heating"]["maxTemp"].isNull() && doc["heating"]["maxTemp"].is<unsigned char>()) {
if ( doc["heating"]["maxTemp"].as<unsigned char>() > 0 && doc["heating"]["maxTemp"].as<unsigned char>() <= 100 && doc["heating"]["maxTemp"].as<unsigned char>() > settings.heating.minTemp ) { if (doc["heating"]["maxTemp"].as<unsigned char>() > 0 && doc["heating"]["maxTemp"].as<unsigned char>() <= 100 && doc["heating"]["maxTemp"].as<unsigned char>() > settings.heating.minTemp) {
settings.heating.maxTemp = doc["heating"]["maxTemp"].as<unsigned char>(); settings.heating.maxTemp = doc["heating"]["maxTemp"].as<unsigned char>();
vars.parameters.heatingMaxTemp = settings.heating.maxTemp; vars.parameters.heatingMaxTemp = settings.heating.maxTemp;
flag = true; flag = true;
@@ -147,7 +147,7 @@ protected:
} }
if (!doc["heating"]["minTemp"].isNull() && doc["heating"]["minTemp"].is<unsigned char>()) { if (!doc["heating"]["minTemp"].isNull() && doc["heating"]["minTemp"].is<unsigned char>()) {
if ( doc["heating"]["minTemp"].as<unsigned char>() >= 0 && doc["heating"]["minTemp"].as<unsigned char>() < 100 && doc["heating"]["minTemp"].as<unsigned char>() < settings.heating.maxTemp ) { if (doc["heating"]["minTemp"].as<unsigned char>() >= 0 && doc["heating"]["minTemp"].as<unsigned char>() < 100 && doc["heating"]["minTemp"].as<unsigned char>() < settings.heating.maxTemp) {
settings.heating.minTemp = doc["heating"]["minTemp"].as<unsigned char>(); settings.heating.minTemp = doc["heating"]["minTemp"].as<unsigned char>();
vars.parameters.heatingMinTemp = settings.heating.minTemp; vars.parameters.heatingMinTemp = settings.heating.minTemp;
flag = true; flag = true;
@@ -162,14 +162,14 @@ protected:
} }
if (!doc["dhw"]["target"].isNull() && doc["dhw"]["target"].is<unsigned char>()) { if (!doc["dhw"]["target"].isNull() && doc["dhw"]["target"].is<unsigned char>()) {
if ( doc["dhw"]["target"].as<unsigned char>() >= 0 && doc["dhw"]["target"].as<unsigned char>() < 100 ) { if (doc["dhw"]["target"].as<unsigned char>() >= 0 && doc["dhw"]["target"].as<unsigned char>() < 100) {
settings.dhw.target = doc["dhw"]["target"].as<unsigned char>(); settings.dhw.target = doc["dhw"]["target"].as<unsigned char>();
flag = true; flag = true;
} }
} }
if (!doc["dhw"]["maxTemp"].isNull() && doc["dhw"]["maxTemp"].is<unsigned char>()) { if (!doc["dhw"]["maxTemp"].isNull() && doc["dhw"]["maxTemp"].is<unsigned char>()) {
if ( doc["dhw"]["maxTemp"].as<unsigned char>() > 0 && doc["dhw"]["maxTemp"].as<unsigned char>() <= 100 && doc["dhw"]["maxTemp"].as<unsigned char>() > settings.dhw.minTemp ) { if (doc["dhw"]["maxTemp"].as<unsigned char>() > 0 && doc["dhw"]["maxTemp"].as<unsigned char>() <= 100 && doc["dhw"]["maxTemp"].as<unsigned char>() > settings.dhw.minTemp) {
settings.dhw.maxTemp = doc["dhw"]["maxTemp"].as<unsigned char>(); settings.dhw.maxTemp = doc["dhw"]["maxTemp"].as<unsigned char>();
vars.parameters.dhwMaxTemp = settings.dhw.maxTemp; vars.parameters.dhwMaxTemp = settings.dhw.maxTemp;
flag = true; flag = true;
@@ -177,7 +177,7 @@ protected:
} }
if (!doc["dhw"]["minTemp"].isNull() && doc["dhw"]["minTemp"].is<unsigned char>()) { if (!doc["dhw"]["minTemp"].isNull() && doc["dhw"]["minTemp"].is<unsigned char>()) {
if ( doc["dhw"]["minTemp"].as<unsigned char>() >= 0 && doc["dhw"]["minTemp"].as<unsigned char>() < 100 && doc["dhw"]["minTemp"].as<unsigned char>() < settings.dhw.maxTemp ) { if (doc["dhw"]["minTemp"].as<unsigned char>() >= 0 && doc["dhw"]["minTemp"].as<unsigned char>() < 100 && doc["dhw"]["minTemp"].as<unsigned char>() < settings.dhw.maxTemp) {
settings.dhw.minTemp = doc["dhw"]["minTemp"].as<unsigned char>(); settings.dhw.minTemp = doc["dhw"]["minTemp"].as<unsigned char>();
vars.parameters.dhwMinTemp = settings.dhw.minTemp; vars.parameters.dhwMinTemp = settings.dhw.minTemp;
flag = true; flag = true;
@@ -192,35 +192,35 @@ protected:
} }
if (!doc["pid"]["p_factor"].isNull() && doc["pid"]["p_factor"].is<float>()) { if (!doc["pid"]["p_factor"].isNull() && doc["pid"]["p_factor"].is<float>()) {
if ( doc["pid"]["p_factor"].as<float>() >= 0 && doc["pid"]["p_factor"].as<float>() <= 20 ) { if (doc["pid"]["p_factor"].as<float>() >= 0 && doc["pid"]["p_factor"].as<float>() <= 20) {
settings.pid.p_factor = round(doc["pid"]["p_factor"].as<float>() * 1000) / 1000; settings.pid.p_factor = round(doc["pid"]["p_factor"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
} }
if (!doc["pid"]["i_factor"].isNull() && doc["pid"]["i_factor"].is<float>()) { if (!doc["pid"]["i_factor"].isNull() && doc["pid"]["i_factor"].is<float>()) {
if ( doc["pid"]["i_factor"].as<float>() >= 0 && doc["pid"]["i_factor"].as<float>() <= 20 ) { if (doc["pid"]["i_factor"].as<float>() >= 0 && doc["pid"]["i_factor"].as<float>() <= 20) {
settings.pid.i_factor = round(doc["pid"]["i_factor"].as<float>() * 1000) / 1000; settings.pid.i_factor = round(doc["pid"]["i_factor"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
} }
if (!doc["pid"]["d_factor"].isNull() && doc["pid"]["d_factor"].is<float>()) { if (!doc["pid"]["d_factor"].isNull() && doc["pid"]["d_factor"].is<float>()) {
if ( doc["pid"]["d_factor"].as<float>() >= 0 && doc["pid"]["d_factor"].as<float>() <= 20 ) { if (doc["pid"]["d_factor"].as<float>() >= 0 && doc["pid"]["d_factor"].as<float>() <= 20) {
settings.pid.d_factor = round(doc["pid"]["d_factor"].as<float>() * 1000) / 1000; settings.pid.d_factor = round(doc["pid"]["d_factor"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
} }
if (!doc["pid"]["maxTemp"].isNull() && doc["pid"]["maxTemp"].is<unsigned char>()) { if (!doc["pid"]["maxTemp"].isNull() && doc["pid"]["maxTemp"].is<unsigned char>()) {
if ( doc["pid"]["maxTemp"].as<unsigned char>() > 0 && doc["pid"]["maxTemp"].as<unsigned char>() <= 100 && doc["pid"]["maxTemp"].as<unsigned char>() > settings.pid.minTemp ) { if (doc["pid"]["maxTemp"].as<unsigned char>() > 0 && doc["pid"]["maxTemp"].as<unsigned char>() <= 100 && doc["pid"]["maxTemp"].as<unsigned char>() > settings.pid.minTemp) {
settings.pid.maxTemp = doc["pid"]["maxTemp"].as<unsigned char>(); settings.pid.maxTemp = doc["pid"]["maxTemp"].as<unsigned char>();
flag = true; flag = true;
} }
} }
if (!doc["pid"]["minTemp"].isNull() && doc["pid"]["minTemp"].is<unsigned char>()) { if (!doc["pid"]["minTemp"].isNull() && doc["pid"]["minTemp"].is<unsigned char>()) {
if ( doc["pid"]["minTemp"].as<unsigned char>() >= 0 && doc["pid"]["minTemp"].as<unsigned char>() < 100 && doc["pid"]["minTemp"].as<unsigned char>() < settings.pid.maxTemp ) { if (doc["pid"]["minTemp"].as<unsigned char>() >= 0 && doc["pid"]["minTemp"].as<unsigned char>() < 100 && doc["pid"]["minTemp"].as<unsigned char>() < settings.pid.maxTemp) {
settings.pid.minTemp = doc["pid"]["minTemp"].as<unsigned char>(); settings.pid.minTemp = doc["pid"]["minTemp"].as<unsigned char>();
flag = true; flag = true;
} }
@@ -233,21 +233,21 @@ protected:
} }
if (!doc["equitherm"]["n_factor"].isNull() && doc["equitherm"]["n_factor"].is<float>()) { if (!doc["equitherm"]["n_factor"].isNull() && doc["equitherm"]["n_factor"].is<float>()) {
if ( doc["equitherm"]["n_factor"].as<float>() >= 0 && doc["equitherm"]["n_factor"].as<float>() <= 20 ) { if (doc["equitherm"]["n_factor"].as<float>() >= 0 && doc["equitherm"]["n_factor"].as<float>() <= 20) {
settings.equitherm.n_factor = round(doc["equitherm"]["n_factor"].as<float>() * 1000) / 1000; settings.equitherm.n_factor = round(doc["equitherm"]["n_factor"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
} }
if (!doc["equitherm"]["k_factor"].isNull() && doc["equitherm"]["k_factor"].is<float>()) { if (!doc["equitherm"]["k_factor"].isNull() && doc["equitherm"]["k_factor"].is<float>()) {
if ( doc["equitherm"]["k_factor"].as<float>() >= 0 && doc["equitherm"]["k_factor"].as<float>() <= 20 ) { if (doc["equitherm"]["k_factor"].as<float>() >= 0 && doc["equitherm"]["k_factor"].as<float>() <= 20) {
settings.equitherm.k_factor = round(doc["equitherm"]["k_factor"].as<float>() * 1000) / 1000; settings.equitherm.k_factor = round(doc["equitherm"]["k_factor"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
} }
if (!doc["equitherm"]["t_factor"].isNull() && doc["equitherm"]["t_factor"].is<float>()) { if (!doc["equitherm"]["t_factor"].isNull() && doc["equitherm"]["t_factor"].is<float>()) {
if ( doc["equitherm"]["t_factor"].as<float>() >= 0 && doc["equitherm"]["t_factor"].as<float>() <= 20 ) { if (doc["equitherm"]["t_factor"].as<float>() >= 0 && doc["equitherm"]["t_factor"].as<float>() <= 20) {
settings.equitherm.t_factor = round(doc["equitherm"]["t_factor"].as<float>() * 1000) / 1000; settings.equitherm.t_factor = round(doc["equitherm"]["t_factor"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
@@ -256,28 +256,28 @@ protected:
// sensors // sensors
if (!doc["sensors"]["outdoor"]["type"].isNull() && doc["sensors"]["outdoor"]["type"].is<unsigned char>()) { if (!doc["sensors"]["outdoor"]["type"].isNull() && doc["sensors"]["outdoor"]["type"].is<unsigned char>()) {
if ( doc["sensors"]["outdoor"]["type"].as<unsigned char>() >= 0 && doc["sensors"]["outdoor"]["type"].as<unsigned char>() <= 2 ) { if (doc["sensors"]["outdoor"]["type"].as<unsigned char>() >= 0 && doc["sensors"]["outdoor"]["type"].as<unsigned char>() <= 2) {
settings.sensors.outdoor.type = doc["sensors"]["outdoor"]["type"].as<unsigned char>(); settings.sensors.outdoor.type = doc["sensors"]["outdoor"]["type"].as<unsigned char>();
flag = true; flag = true;
} }
} }
if (!doc["sensors"]["outdoor"]["offset"].isNull() && doc["sensors"]["outdoor"]["offset"].is<float>()) { if (!doc["sensors"]["outdoor"]["offset"].isNull() && doc["sensors"]["outdoor"]["offset"].is<float>()) {
if ( doc["sensors"]["outdoor"]["offset"].as<float>() >= -10 && doc["sensors"]["outdoor"]["offset"].as<float>() <= 10 ) { if (doc["sensors"]["outdoor"]["offset"].as<float>() >= -10 && doc["sensors"]["outdoor"]["offset"].as<float>() <= 10) {
settings.sensors.outdoor.offset = round(doc["sensors"]["outdoor"]["offset"].as<float>() * 1000) / 1000; settings.sensors.outdoor.offset = round(doc["sensors"]["outdoor"]["offset"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
} }
if (!doc["sensors"]["indoor"]["type"].isNull() && doc["sensors"]["indoor"]["type"].is<unsigned char>()) { if (!doc["sensors"]["indoor"]["type"].isNull() && doc["sensors"]["indoor"]["type"].is<unsigned char>()) {
if ( doc["sensors"]["indoor"]["type"].as<unsigned char>() >= 1 && doc["sensors"]["indoor"]["type"].as<unsigned char>() <= 2 ) { if (doc["sensors"]["indoor"]["type"].as<unsigned char>() >= 1 && doc["sensors"]["indoor"]["type"].as<unsigned char>() <= 2) {
settings.sensors.indoor.type = doc["sensors"]["indoor"]["type"].as<unsigned char>(); settings.sensors.indoor.type = doc["sensors"]["indoor"]["type"].as<unsigned char>();
flag = true; flag = true;
} }
} }
if (!doc["sensors"]["indoor"]["offset"].isNull() && doc["sensors"]["indoor"]["offset"].is<float>()) { if (!doc["sensors"]["indoor"]["offset"].isNull() && doc["sensors"]["indoor"]["offset"].is<float>()) {
if ( doc["sensors"]["indoor"]["offset"].as<float>() >= -10 && doc["sensors"]["indoor"]["offset"].as<float>() <= 10 ) { if (doc["sensors"]["indoor"]["offset"].as<float>() >= -10 && doc["sensors"]["indoor"]["offset"].as<float>() <= 10) {
settings.sensors.indoor.offset = round(doc["sensors"]["indoor"]["offset"].as<float>() * 1000) / 1000; settings.sensors.indoor.offset = round(doc["sensors"]["indoor"]["offset"].as<float>() * 1000) / 1000;
flag = true; flag = true;
} }
@@ -314,14 +314,14 @@ protected:
} }
if (!doc["temperatures"]["indoor"].isNull() && doc["temperatures"]["indoor"].is<float>()) { if (!doc["temperatures"]["indoor"].isNull() && doc["temperatures"]["indoor"].is<float>()) {
if ( settings.sensors.indoor.type == 1 && doc["temperatures"]["indoor"].as<float>() > -100 && doc["temperatures"]["indoor"].as<float>() < 100 ) { if (settings.sensors.indoor.type == 1 && doc["temperatures"]["indoor"].as<float>() > -100 && doc["temperatures"]["indoor"].as<float>() < 100) {
vars.temperatures.indoor = round(doc["temperatures"]["indoor"].as<float>() * 100) / 100; vars.temperatures.indoor = round(doc["temperatures"]["indoor"].as<float>() * 100) / 100;
flag = true; flag = true;
} }
} }
if (!doc["temperatures"]["outdoor"].isNull() && doc["temperatures"]["outdoor"].is<float>()) { if (!doc["temperatures"]["outdoor"].isNull() && doc["temperatures"]["outdoor"].is<float>()) {
if ( settings.sensors.outdoor.type == 1 && doc["temperatures"]["outdoor"].as<float>() > -100 && doc["temperatures"]["outdoor"].as<float>() < 100 ) { if (settings.sensors.outdoor.type == 1 && doc["temperatures"]["outdoor"].as<float>() > -100 && doc["temperatures"]["outdoor"].as<float>() < 100) {
vars.temperatures.outdoor = round(doc["temperatures"]["outdoor"].as<float>() * 100) / 100; vars.temperatures.outdoor = round(doc["temperatures"]["outdoor"].as<float>() * 100) / 100;
flag = true; flag = true;
} }

View File

@@ -3,9 +3,9 @@
CustomOpenTherm* ot; CustomOpenTherm* ot;
class OpenThermTask: public Task { class OpenThermTask : public Task {
public: public:
OpenThermTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {} OpenThermTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
protected: protected:
void setup() { void setup() {
@@ -28,7 +28,7 @@ protected:
static byte currentHeatingTemp, currentDHWTemp = 0; static byte currentHeatingTemp, currentDHWTemp = 0;
unsigned long localResponse; unsigned long localResponse;
if ( setMasterMemberIdCode() ) { if (setMasterMemberIdCode()) {
DEBUG_F("Slave member id code: %u\r\n", vars.parameters.slaveMemberIdCode); DEBUG_F("Slave member id code: %u\r\n", vars.parameters.slaveMemberIdCode);
DEBUG_F("Master member id code: %u\r\n", settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode); DEBUG_F("Master member id code: %u\r\n", settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode);
@@ -48,7 +48,7 @@ protected:
return; return;
} }
if ( vars.parameters.heatingEnabled != heatingEnabled ) { if (vars.parameters.heatingEnabled != heatingEnabled) {
vars.parameters.heatingEnabled = heatingEnabled; vars.parameters.heatingEnabled = heatingEnabled;
INFO_F("Heating enabled: %s\r\n", heatingEnabled ? "on\0" : "off\0"); INFO_F("Heating enabled: %s\r\n", heatingEnabled ? "on\0" : "off\0");
} }
@@ -70,7 +70,7 @@ protected:
DEBUG_F("Master type: %u, version: %u\r\n", vars.parameters.masterType, vars.parameters.masterVersion); DEBUG_F("Master type: %u, version: %u\r\n", vars.parameters.masterType, vars.parameters.masterVersion);
DEBUG_F("Slave type: %u, version: %u\r\n", vars.parameters.slaveType, vars.parameters.slaveVersion); DEBUG_F("Slave type: %u, version: %u\r\n", vars.parameters.slaveType, vars.parameters.slaveVersion);
if ( settings.opentherm.dhwPresent ) { if (settings.opentherm.dhwPresent) {
updateMinMaxDhwTemp(); updateMinMaxDhwTemp();
} }
updateMinMaxHeatingTemp(); updateMinMaxHeatingTemp();
@@ -83,7 +83,7 @@ protected:
ot->sendBoilerReset(); ot->sendBoilerReset();
} }
if ( vars.states.diagnostic ) { if (vars.states.diagnostic) {
ot->sendServiceReset(); ot->sendServiceReset();
} }
@@ -92,28 +92,27 @@ protected:
} }
updatePressure(); updatePressure();
if ((settings.opentherm.dhwPresent && settings.dhw.enable) || settings.heating.enable || heatingEnabled ) { if ((settings.opentherm.dhwPresent && settings.dhw.enable) || settings.heating.enable || heatingEnabled) {
updateModulationLevel(); updateModulationLevel();
} else {
vars.sensors.modulation = 0;
} }
yield(); yield();
if ( settings.opentherm.dhwPresent && settings.dhw.enable ) { if (settings.opentherm.dhwPresent) {
updateDHWTemp(); updateDHWTemp();
} else { } else {
vars.temperatures.dhw = 0; vars.temperatures.dhw = 0;
} }
//if ( settings.heating.enable || heatingEnabled ) { updateHeatingTemp();
updateHeatingTemp();
//} else {
// vars.temperatures.heating = 0;
//}
yield(); yield();
// //
// Температура ГВС // Температура ГВС
byte newDHWTemp = settings.dhw.target; byte newDHWTemp = settings.dhw.target;
if (settings.opentherm.dhwPresent && settings.dhw.enable && newDHWTemp != currentDHWTemp) { if (settings.opentherm.dhwPresent && settings.dhw.enable && (needSetDhwTemp() || newDHWTemp != currentDHWTemp)) {
if (newDHWTemp < vars.parameters.dhwMinTemp || newDHWTemp > vars.parameters.dhwMaxTemp) { if (newDHWTemp < vars.parameters.dhwMinTemp || newDHWTemp > vars.parameters.dhwMaxTemp) {
newDHWTemp = constrain(newDHWTemp, vars.parameters.dhwMinTemp, vars.parameters.dhwMaxTemp); newDHWTemp = constrain(newDHWTemp, vars.parameters.dhwMinTemp, vars.parameters.dhwMaxTemp);
} }
@@ -123,6 +122,7 @@ protected:
// Записываем заданную температуру ГВС // Записываем заданную температуру ГВС
if (ot->setDHWSetpoint(newDHWTemp)) { if (ot->setDHWSetpoint(newDHWTemp)) {
currentDHWTemp = newDHWTemp; currentDHWTemp = newDHWTemp;
dhwSetTempTime = millis();
} else { } else {
WARN("Failed set DHW temp"); WARN("Failed set DHW temp");
@@ -131,12 +131,13 @@ protected:
// //
// Температура отопления // Температура отопления
if (heatingEnabled && fabs(vars.parameters.heatingSetpoint - currentHeatingTemp) > 0.0001) { if (heatingEnabled && (needSetHeatingTemp() || fabs(vars.parameters.heatingSetpoint - currentHeatingTemp) > 0.0001)) {
INFO_F("Setting heating temp = %u \n", vars.parameters.heatingSetpoint); INFO_F("Setting heating temp = %u \n", vars.parameters.heatingSetpoint);
// Записываем заданную температуру // Записываем заданную температуру
if (ot->setBoilerTemperature(vars.parameters.heatingSetpoint)) { if (ot->setBoilerTemperature(vars.parameters.heatingSetpoint)) {
currentHeatingTemp = vars.parameters.heatingSetpoint; currentHeatingTemp = vars.parameters.heatingSetpoint;
heatingSetTempTime = millis();
} else { } else {
WARN("Failed set heating temp"); WARN("Failed set heating temp");
@@ -200,13 +201,27 @@ protected:
} }
protected: protected:
unsigned short readyTime = 60000;
unsigned short dhwSetTempInterval = 60000;
unsigned short heatingSetTempInterval = 60000;
bool pump = true; bool pump = true;
unsigned long prevUpdateNonEssentialVars = 0; unsigned long prevUpdateNonEssentialVars = 0;
unsigned long startupTime = millis(); unsigned long startupTime = millis();
unsigned long dhwSetTempTime = 0;
unsigned long heatingSetTempTime = 0;
bool isReady() { bool isReady() {
return millis() - startupTime > 60000; return millis() - startupTime > readyTime;
}
bool needSetDhwTemp() {
return millis() - dhwSetTempTime > dhwSetTempInterval;
}
bool needSetHeatingTemp() {
return millis() - heatingSetTempTime > heatingSetTempInterval;
} }
void static printRequestDetail(OpenThermMessageID id, OpenThermResponseStatus status, unsigned long request, unsigned long response, byte attempt) { void static printRequestDetail(OpenThermMessageID id, OpenThermResponseStatus status, unsigned long request, unsigned long response, byte attempt) {
@@ -248,7 +263,7 @@ protected:
response & 0xFF response & 0xFF
);*/ );*/
} else if ( settings.opentherm.memberIdCode <= 0 ) { } else if (settings.opentherm.memberIdCode <= 0) {
return false; return false;
} }

View File

@@ -6,9 +6,9 @@ Equitherm etRegulator;
GyverPID pidRegulator(0, 0, 0); GyverPID pidRegulator(0, 0, 0);
PIDtuner pidTuner; PIDtuner pidTuner;
class RegulatorTask: public LeanTask { class RegulatorTask : public LeanTask {
public: public:
RegulatorTask(bool _enabled = false, unsigned long _interval = 0): LeanTask(_enabled, _interval) {} RegulatorTask(bool _enabled = false, unsigned long _interval = 0) : LeanTask(_enabled, _interval) {}
protected: protected:
bool tunerInit = false; bool tunerInit = false;
@@ -139,7 +139,7 @@ protected:
newTemp += prevPidResult; newTemp += prevPidResult;
} }
} else if ( settings.pid.enable && !vars.parameters.heatingEnabled && prevPidResult != 0 ) { } else if (settings.pid.enable && !vars.parameters.heatingEnabled && prevPidResult != 0) {
newTemp += prevPidResult; newTemp += prevPidResult;
} }

View File

@@ -1,9 +1,9 @@
#include <OneWire.h> #include <OneWire.h>
#include <DallasTemperature.h> #include <DallasTemperature.h>
class SensorsTask: public LeanTask { class SensorsTask : public LeanTask {
public: public:
SensorsTask(bool _enabled = false, unsigned long _interval = 0): LeanTask(_enabled, _interval) {} SensorsTask(bool _enabled = false, unsigned long _interval = 0) : LeanTask(_enabled, _interval) {}
protected: protected:
OneWire* oneWireOutdoorSensor; OneWire* oneWireOutdoorSensor;
@@ -24,17 +24,17 @@ protected:
void setup() {} void setup() {}
void loop() { void loop() {
if ( settings.sensors.outdoor.type == 2 ) { if (settings.sensors.outdoor.type == 2) {
outdoorTemperatureSensor(); outdoorTemperatureSensor();
} }
if ( settings.sensors.indoor.type == 2 ) { if (settings.sensors.indoor.type == 2) {
indoorTemperatureSensor(); indoorTemperatureSensor();
} }
} }
void outdoorTemperatureSensor() { void outdoorTemperatureSensor() {
if ( !initOutdoorSensor ) { if (!initOutdoorSensor) {
oneWireOutdoorSensor = new OneWire(settings.sensors.outdoor.pin); oneWireOutdoorSensor = new OneWire(settings.sensors.outdoor.pin);
outdoorSensor = new DallasTemperature(oneWireOutdoorSensor); outdoorSensor = new DallasTemperature(oneWireOutdoorSensor);
outdoorSensor->begin(); outdoorSensor->begin();
@@ -46,12 +46,12 @@ protected:
} }
unsigned long estimateConversionTime = millis() - startConversionTime; unsigned long estimateConversionTime = millis() - startConversionTime;
if ( estimateConversionTime < outdoorSensor->millisToWaitForConversion() ) { if (estimateConversionTime < outdoorSensor->millisToWaitForConversion()) {
return; return;
} }
bool completed = outdoorSensor->isConversionComplete(); bool completed = outdoorSensor->isConversionComplete();
if ( !completed && estimateConversionTime >= 1000 ) { if (!completed && estimateConversionTime >= 1000) {
// fail, retry // fail, retry
outdoorSensor->requestTemperatures(); outdoorSensor->requestTemperatures();
startConversionTime = millis(); startConversionTime = millis();
@@ -59,7 +59,7 @@ protected:
ERROR("[SENSORS][OUTDOOR] Could not read temperature data (no response)"); ERROR("[SENSORS][OUTDOOR] Could not read temperature data (no response)");
} }
if ( !completed ) { if (!completed) {
return; return;
} }
@@ -91,7 +91,7 @@ protected:
} }
void indoorTemperatureSensor() { void indoorTemperatureSensor() {
if ( !initIndoorSensor ) { if (!initIndoorSensor) {
oneWireIndoorSensor = new OneWire(settings.sensors.indoor.pin); oneWireIndoorSensor = new OneWire(settings.sensors.indoor.pin);
indoorSensor = new DallasTemperature(oneWireIndoorSensor); indoorSensor = new DallasTemperature(oneWireIndoorSensor);
indoorSensor->begin(); indoorSensor->begin();
@@ -103,12 +103,12 @@ protected:
} }
unsigned long estimateConversionTime = millis() - startConversionTime; unsigned long estimateConversionTime = millis() - startConversionTime;
if ( estimateConversionTime < indoorSensor->millisToWaitForConversion() ) { if (estimateConversionTime < indoorSensor->millisToWaitForConversion()) {
return; return;
} }
bool completed = indoorSensor->isConversionComplete(); bool completed = indoorSensor->isConversionComplete();
if ( !completed && estimateConversionTime >= 1000 ) { if (!completed && estimateConversionTime >= 1000) {
// fail, retry // fail, retry
indoorSensor->requestTemperatures(); indoorSensor->requestTemperatures();
startConversionTime = millis(); startConversionTime = millis();
@@ -116,7 +116,7 @@ protected:
ERROR("[SENSORS][INDOOR] Could not read temperature data (no response)"); ERROR("[SENSORS][INDOOR] Could not read temperature data (no response)");
} }
if ( !completed ) { if (!completed) {
return; return;
} }

View File

@@ -107,11 +107,11 @@ struct Variables {
struct { struct {
bool heatingEnabled = false; bool heatingEnabled = false;
byte heatingMinTemp = 0; byte heatingMinTemp = 20;
byte heatingMaxTemp = 0; byte heatingMaxTemp = 90;
byte heatingSetpoint = 0.0f; byte heatingSetpoint = 0.0f;
byte dhwMinTemp = 0; byte dhwMinTemp = 30;
byte dhwMaxTemp = 0; byte dhwMaxTemp = 60;
uint8_t slaveMemberIdCode; uint8_t slaveMemberIdCode;
uint8_t slaveType; uint8_t slaveType;
uint8_t slaveVersion; uint8_t slaveVersion;

View File

@@ -1,4 +1,4 @@
#define OT_GATEWAY_VERSION "1.3.1" #define OT_GATEWAY_VERSION "1.3.2"
#define AP_SSID "OpenTherm Gateway" #define AP_SSID "OpenTherm Gateway"
#define AP_PASSWORD "otgateway123456" #define AP_PASSWORD "otgateway123456"
#define USE_TELNET #define USE_TELNET
@@ -11,8 +11,6 @@
#define EXT_SENSORS_INTERVAL 5000 #define EXT_SENSORS_INTERVAL 5000
#define EXT_SENSORS_FILTER_K 0.15 #define EXT_SENSORS_FILTER_K 0.15
#define DS_CHECK_CRC true
#define DS_CRC_USE_TABLE true
#define LED_STATUS_PIN 13 #define LED_STATUS_PIN 13
#define LED_OT_RX_PIN 15 #define LED_OT_RX_PIN 15

View File

@@ -40,7 +40,7 @@ void setup() {
if (eeSettingsResult == 0) { if (eeSettingsResult == 0) {
INFO("Settings loaded"); INFO("Settings loaded");
if ( strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0 ) { if (strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0) {
INFO("Settings not valid, reset and restart..."); INFO("Settings not valid, reset and restart...");
eeSettings.reset(); eeSettings.reset();
delay(1000); delay(1000);