New Entity: Cooling status for free cooling

Fixes #3097
This commit is contained in:
proddy
2026-10-13 22:40:09 +02:00
parent 8693d27a02
commit 68d7f6e444
3 changed files with 20 additions and 1 deletions
+18 -1
View File
@@ -1176,7 +1176,9 @@ void Thermostat::process_RC300Monitor(const std::shared_ptr<const Telegram> & te
// summermode is bit 4 for boilers and bit 6 for heatpumps: 0:winter, 1:summer
telegram->read_value(hc->statusbyte, 2);
// use summertemp or hpoperatingstate, https://github.com/emsesp/EMS-ESP32/issues/747, #550, #503
if ((hc->statusbyte & 1) || !is_received(summer2_typeids[hc->hc()])) {
// 0x470 or any 0x471+ means offset 20 is the heat-pump state. Publish it on every circuit:
// some BC400/UI800 only answer 0x471, while hc2+ still broadcast the state in 0x2A6 ff. #3097
if ((hc->statusbyte & 1) || !has_hpoperatingstate()) {
has_update(hc->summermode, hc->statusbyte & 0x50 ? 1 : 0);
has_update(hc->hpoperatingstate, EMS_VALUE_UINT8_NOTSET);
} else {
@@ -1283,6 +1285,21 @@ bool Thermostat::has_summer3() const {
return model() == EMSdevice::EMS_DEVICE_FLAG_UI800 && is_received(0x470);
}
// monitor offset 20 is heating/off/cooling once this thermostat is known to be a heat pump.
// 0x470 covers every circuit. A single answered 0x471+ does too: hc2 may never reply to 0x472
// but still broadcasts its state in 0x2A6. #3097
bool Thermostat::has_hpoperatingstate() const {
if (has_summer3()) {
return true;
}
for (const uint16_t type_id : summer2_typeids) {
if (is_received(type_id)) {
return true;
}
}
return false;
}
// type 0x470, only BC400/UI800
// (0x470), data: 01 0E 01 01 02 17 04 48
void Thermostat::process_RC300Summer3(const std::shared_ptr<const Telegram> & telegram) {