This commit is contained in:
proddy
2026-09-30 18:04:34 +02:00
parent 619fe46a4e
commit 52b24d5641
4 changed files with 26 additions and 21 deletions
+1
View File
@@ -37,6 +37,7 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready - HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready
- hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181) - hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181)
- solar module switches [#3223](https://github.com/emsesp/EMS-ESP32/issues/3223) - solar module switches [#3223](https://github.com/emsesp/EMS-ESP32/issues/3223)
- UI800/HMI800.2 thermostats without telegram 0x470 reported `summertemp` as 0 and lost the per-hc heat/cool delays [#3257](https://github.com/emsesp/EMS-ESP32/issues/3257)
- possible crash when the WebUI asked for version information while the versions.json refresh was rewriting the cache from the main loop task - possible crash when the WebUI asked for version information while the versions.json refresh was rewriting the cache from the main loop task
- HTTP client could write past a fixed 64 byte buffer when a URL had a hostname of 64 characters or more, could busy-spin for the whole read budget if the socket reported bytes it wouldn't return, and buffered responses without any size limit - HTTP client could write past a fixed 64 byte buffer when a URL had a hostname of 64 characters or more, could busy-spin for the whole read budget if the socket reported bytes it wouldn't return, and buffered responses without any size limit
- the "Ethernet clock mode (GPIO16/17) conflicts with PSRAM" error was never logged because Ethernet had already been skipped by the time the check ran - the "Ethernet clock mode (GPIO16/17) conflicts with PSRAM" error was never logged because Ethernet had already been skipped by the time the check ran
+21 -20
View File
@@ -181,9 +181,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
register_telegram_type(set_typeids[i], "RC300Set", false, MAKE_PF_CB(process_RC300Set), 29); register_telegram_type(set_typeids[i], "RC300Set", false, MAKE_PF_CB(process_RC300Set), 29);
register_telegram_type(summer_typeids[i], "RC300Summer", false, MAKE_PF_CB(process_RC300Summer), 14); register_telegram_type(summer_typeids[i], "RC300Summer", false, MAKE_PF_CB(process_RC300Summer), 14);
register_telegram_type(curve_typeids[i], "RC300Curves", false, MAKE_PF_CB(process_RC300Curve), 9); register_telegram_type(curve_typeids[i], "RC300Curves", false, MAKE_PF_CB(process_RC300Curve), 9);
if (model != EMSdevice::EMS_DEVICE_FLAG_UI800) { register_telegram_type(summer2_typeids[i], "RC300Summer2", false, MAKE_PF_CB(process_RC300Summer2), 8);
register_telegram_type(summer2_typeids[i], "RC300Summer2", false, MAKE_PF_CB(process_RC300Summer2), 8);
}
} }
const size_t set2_size = set2_typeids.size(); const size_t set2_size = set2_typeids.size();
for (uint8_t i = 0; i < set2_size; i++) { for (uint8_t i = 0; i < set2_size; i++) {
@@ -1256,7 +1254,7 @@ void Thermostat::process_RC300Summer(const std::shared_ptr<const Telegram> & tel
has_update(telegram, hc->roominfl_factor, 1); // is * 10 has_update(telegram, hc->roominfl_factor, 1); // is * 10
has_update(telegram, hc->offsettemp, 2); has_update(telegram, hc->offsettemp, 2);
has_update(telegram, hc->solarInfl, 3); has_update(telegram, hc->solarInfl, 3);
if (!is_received(summer2_typeids[hc->hc()])) { if (!is_received(summer2_typeids[hc->hc()]) && !has_summer3()) {
has_update(telegram, hc->summertemp, 6); has_update(telegram, hc->summertemp, 6);
has_update(telegram, hc->summersetmode, 7); has_update(telegram, hc->summersetmode, 7);
} }
@@ -1274,6 +1272,11 @@ void Thermostat::process_RC300Summer(const std::shared_ptr<const Telegram> & tel
has_update(telegram, hc->comfortPointTemp, 12); has_update(telegram, hc->comfortPointTemp, 12);
} }
// some UI800 (e.g. HMI800.2) don't send 0x470 and use the per-hc 0x471 ff instead, #3257
bool Thermostat::has_summer3() const {
return model() == EMSdevice::EMS_DEVICE_FLAG_UI800 && is_received(0x470);
}
// type 0x470, only BC400/UI800 // type 0x470, only BC400/UI800
// (0x470), data: 01 0E 01 01 02 17 04 48 // (0x470), data: 01 0E 01 01 02 17 04 48
void Thermostat::process_RC300Summer3(const std::shared_ptr<const Telegram> & telegram) { void Thermostat::process_RC300Summer3(const std::shared_ptr<const Telegram> & telegram) {
@@ -2654,7 +2657,7 @@ bool Thermostat::set_coolondelay(const char * value, const int8_t id) {
if (!Helpers::value2float(value, f)) { if (!Helpers::value2float(value, f)) {
return false; return false;
} }
if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 6, (uint8_t)(f * 4), 0x470); write_command(0x470, 6, (uint8_t)(f * 4), 0x470);
return true; return true;
} }
@@ -2671,7 +2674,7 @@ bool Thermostat::set_cooloffdelay(const char * value, const int8_t id) {
if (!Helpers::value2float(value, f)) { if (!Helpers::value2float(value, f)) {
return false; return false;
} }
if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 7, (uint8_t)(f * 4), 0x470); write_command(0x470, 7, (uint8_t)(f * 4), 0x470);
return true; return true;
} }
@@ -3438,7 +3441,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const int8_t id) {
// sets the thermostat summermode for RC300 // sets the thermostat summermode for RC300
bool Thermostat::set_summermode(const char * value, const int8_t id) { bool Thermostat::set_summermode(const char * value, const int8_t id) {
uint8_t set; uint8_t set;
if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
if (Helpers::value2enum(value, set, FL_(enum_summermode))) { if (Helpers::value2enum(value, set, FL_(enum_summermode))) {
write_command(0x470, 0, set, 0x470); write_command(0x470, 0, set, 0x470);
return true; return true;
@@ -3599,7 +3602,7 @@ bool Thermostat::set_heatondelay(const char * value, const int8_t id) {
if (!Helpers::value2float(value, f)) { if (!Helpers::value2float(value, f)) {
return false; return false;
} }
if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 2, (uint8_t)(f * 4), 0x470); write_command(0x470, 2, (uint8_t)(f * 4), 0x470);
return true; return true;
} }
@@ -3616,7 +3619,7 @@ bool Thermostat::set_heatoffdelay(const char * value, const int8_t id) {
if (!Helpers::value2float(value, f)) { if (!Helpers::value2float(value, f)) {
return false; return false;
} }
if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 3, (uint8_t)(f * 4), 0x470); write_command(0x470, 3, (uint8_t)(f * 4), 0x470);
return true; return true;
} }
@@ -3633,7 +3636,7 @@ bool Thermostat::set_instantstart(const char * value, const int8_t id) {
if (!Helpers::value2number(value, v)) { if (!Helpers::value2number(value, v)) {
return false; return false;
} }
if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 4, (uint8_t)v, 0x470); write_command(0x470, 4, (uint8_t)v, 0x470);
return true; return true;
} }
@@ -4163,7 +4166,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co
validate_typeid = set_typeids[hc->hc()]; validate_typeid = set_typeids[hc->hc()];
switch (mode) { switch (mode) {
case HeatingCircuit::Mode::SUMMER: case HeatingCircuit::Mode::SUMMER:
if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 1, temperature, 0x470); write_command(0x470, 1, temperature, 0x470);
return true; return true;
} }
@@ -4178,7 +4181,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co
factor = 1; factor = 1;
break; break;
case HeatingCircuit::Mode::COOLSTART: case HeatingCircuit::Mode::COOLSTART:
if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (has_summer3()) {
write_command(0x470, 5, temperature, 0x470); write_command(0x470, 5, temperature, 0x470);
return true; return true;
} }
@@ -5206,14 +5209,12 @@ void Thermostat::register_device_values_hc(std::shared_ptr<Thermostat::HeatingCi
101); 101);
register_device_value(tag, &hc->remotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101); register_device_value(tag, &hc->remotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101);
} }
if (model != EMSdevice::EMS_DEVICE_FLAG_UI800) { register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48);
register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48); register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48);
register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48); register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48);
register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48); register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48);
register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48); register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10);
register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); register_device_value(tag, &hc->coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35);
register_device_value(tag, &hc->coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35);
}
register_device_value(tag, &hc->boost, DeviceValueType::BOOL, FL_(boost), DeviceValueUOM::NONE, MAKE_CF_CB(set_boost)); register_device_value(tag, &hc->boost, DeviceValueType::BOOL, FL_(boost), DeviceValueUOM::NONE, MAKE_CF_CB(set_boost));
register_device_value(tag, &hc->boosttime, DeviceValueType::UINT8, FL_(boosttime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_boosttime)); register_device_value(tag, &hc->boosttime, DeviceValueType::UINT8, FL_(boosttime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_boosttime));
register_device_value(tag, register_device_value(tag,
+3
View File
@@ -459,9 +459,12 @@ class Thermostat : public EMSdevice {
void process_RC300Monitor(const std::shared_ptr<const Telegram> & telegram); void process_RC300Monitor(const std::shared_ptr<const Telegram> & telegram);
void process_RC300Set(const std::shared_ptr<const Telegram> & telegram); void process_RC300Set(const std::shared_ptr<const Telegram> & telegram);
void process_RC300Set2(const std::shared_ptr<const Telegram> & telegram); void process_RC300Set2(const std::shared_ptr<const Telegram> & telegram);
void process_RC300Summer(const std::shared_ptr<const Telegram> & telegram); void process_RC300Summer(const std::shared_ptr<const Telegram> & telegram);
void process_RC300Summer2(const std::shared_ptr<const Telegram> & telegram); void process_RC300Summer2(const std::shared_ptr<const Telegram> & telegram);
void process_RC300Summer3(const std::shared_ptr<const Telegram> & telegram); void process_RC300Summer3(const std::shared_ptr<const Telegram> & telegram);
bool has_summer3() const;
void process_RC300WWmode(const std::shared_ptr<const Telegram> & telegram); void process_RC300WWmode(const std::shared_ptr<const Telegram> & telegram);
void process_RC300WWmode2(const std::shared_ptr<const Telegram> & telegram); void process_RC300WWmode2(const std::shared_ptr<const Telegram> & telegram);
void process_RC300WWtemp(const std::shared_ptr<const Telegram> & telegram); void process_RC300WWtemp(const std::shared_ptr<const Telegram> & telegram);
+1 -1
View File
@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.9.0-dev.15" #define EMSESP_APP_VERSION "3.9.0-dev.16"