diff --git a/interface/pnpm-workspace.yaml b/interface/pnpm-workspace.yaml index 1b81f607b..514f0380e 100644 --- a/interface/pnpm-workspace.yaml +++ b/interface/pnpm-workspace.yaml @@ -1,3 +1,28 @@ +allowBuilds: + cwebp-bin: set this to true or false + esbuild: set this to true or false + gifsicle: set this to true or false + jpegtran-bin: set this to true or false + mozjpeg: set this to true or false + optipng-bin: set this to true or false + pngquant-bin: set this to true or false +minimumReleaseAgeExclude: + - '@babel/code-frame@7.29.7' + - '@babel/compat-data@7.29.7' + - '@babel/core@7.29.7' + - '@babel/generator@7.29.7' + - '@babel/helper-compilation-targets@7.29.7' + - '@babel/helper-globals@7.29.7' + - '@babel/helper-module-imports@7.29.7' + - '@babel/helper-module-transforms@7.29.7' + - '@babel/helper-string-parser@7.29.7' + - '@babel/helper-validator-identifier@7.29.7' + - '@babel/helper-validator-option@7.29.7' + - '@babel/helpers@7.29.7' + - '@babel/parser@7.29.7' + - '@babel/template@7.29.7' + - '@babel/traverse@7.29.7' + - '@babel/types@7.29.7' onlyBuiltDependencies: - cwebp-bin - esbuild diff --git a/src/core/device_library.h b/src/core/device_library.h index a225998e1..0c28cddf2 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -105,7 +105,7 @@ {215, DeviceType::THERMOSTAT, "Comfort RF", DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 {216, DeviceType::THERMOSTAT, "CRF200S", DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 {246, DeviceType::THERMOSTAT, "Comfort+2RF", DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 -{253, DeviceType::THERMOSTAT, "Rego 3000, UI800, Logamatic BC400", DeviceFlags::EMS_DEVICE_FLAG_BC400}, // 0x10 +{253, DeviceType::THERMOSTAT, "Rego 3000, UI800, Logamatic BC400", DeviceFlags::EMS_DEVICE_FLAG_UI800}, // 0x10 // Thermostat - Sieger - 0x10 / 0x17 { 66, DeviceType::THERMOSTAT, "ES72, RC20", DeviceFlags::EMS_DEVICE_FLAG_RC20_N}, // 0x17 or remote diff --git a/src/core/emsdevice.h b/src/core/emsdevice.h index 793313f3d..7473113f0 100644 --- a/src/core/emsdevice.h +++ b/src/core/emsdevice.h @@ -513,6 +513,7 @@ class EMSdevice { static constexpr uint8_t EMS_DEVICE_FLAG_CR120 = 16; // mostly like RC300, but some changes static constexpr uint8_t EMS_DEVICE_FLAG_CR11 = 17; // CRF200 only monitor static constexpr uint8_t EMS_DEVICE_FLAG_HMC310 = 18; + static constexpr uint8_t EMS_DEVICE_FLAG_UI800 = 19; uint8_t count_entities(); uint8_t count_entities_fav(); diff --git a/src/core/locale_common.h b/src/core/locale_common.h index d5b88c789..4ab1beb5a 100644 --- a/src/core/locale_common.h +++ b/src/core/locale_common.h @@ -190,7 +190,11 @@ MAKE_NOTRANSLATION(rc100, "RC100") MAKE_NOTRANSLATION(rc100h, "RC100H") MAKE_NOTRANSLATION(tc100, "TC100") MAKE_NOTRANSLATION(rc120rf, "RC120RF") -MAKE_NOTRANSLATION(rc220, "RC220/RT800") +MAKE_NOTRANSLATION(rc220, "RC220") +MAKE_NOTRANSLATION(rt800, "RT800") +MAKE_NOTRANSLATION(cr10, "CR10") +MAKE_NOTRANSLATION(cr10h, "CR10H") +MAKE_NOTRANSLATION(cr20rf, "CR20RF") MAKE_NOTRANSLATION(single, "single") MAKE_NOTRANSLATION(dash, "-") MAKE_NOTRANSLATION(BLANK, "") @@ -370,6 +374,7 @@ MAKE_ENUM(enum_roomsensor, FL_(extern), FL_(intern), FL_(auto)) MAKE_ENUM(enum_roominfluence, FL_(off), FL_(intern), FL_(extern), FL_(auto)) MAKE_ENUM(enum_control1, FL_(rc310), FL_(rc200), FL_(rc100), FL_(rc100h), FL_(tc100)) MAKE_ENUM(enum_control2, FL_(off), FL_(dash), FL_(rc100), FL_(rc100h), FL_(dash), FL_(rc120rf), FL_(rc220), FL_(single)) // BC400 +MAKE_ENUM(enum_control3, FL_(off), FL_(dash), FL_(cr10), FL_(cr10h), FL_(dash), FL_(cr20rf), FL_(rt800), FL_(single)) // UI800 MAKE_ENUM(enum_switchmode, FL_(off), FL_(eco), FL_(comfort), FL_(heat)) MAKE_ENUM(enum_switchProgMode, FL_(level), FL_(absolute)) diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index c16b2c5cb..cdf3564a9 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -276,7 +276,7 @@ void TxService::start() { // sends a 1 byte poll which is our own deviceID void TxService::send_poll() const { // LOG_DEBUG("Ack %02X",ems_bus_id() ^ ems_mask()); - if (tx_mode() != EMS_TXMODE_OFF) { + if (tx_mode() != EMS_TXMODE_OFF && ems_bus_id() != 0x0D) { EMSuart::send_poll(ems_bus_id() ^ ems_mask()); } } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 4a7cf74cc..43e048119 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -543,7 +543,7 @@ uint8_t Thermostat::HeatingCircuit::get_mode() const { } else { return HeatingCircuit::Mode::OFF; } - } else if (model == EMSdevice::EMS_DEVICE_FLAG_BC400 || model == EMSdevice::EMS_DEVICE_FLAG_CR120) { + } else if (model == EMSdevice::EMS_DEVICE_FLAG_BC400 || model == EMSdevice::EMS_DEVICE_FLAG_UI800 || model == EMSdevice::EMS_DEVICE_FLAG_CR120) { if (mode_new == 0) { return HeatingCircuit::Mode::OFF; } else if (mode_new == 1) { @@ -607,7 +607,7 @@ uint8_t Thermostat::HeatingCircuit::get_mode_type() const { return HeatingCircuit::Mode::ON; } } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC300 || model == EMSdevice::EMS_DEVICE_FLAG_R3000 || model == EMSdevice::EMS_DEVICE_FLAG_BC400 - || model == EMSdevice::EMS_DEVICE_FLAG_HMC310) { + || model == EMSdevice::EMS_DEVICE_FLAG_UI800 || model == EMSdevice::EMS_DEVICE_FLAG_HMC310) { if (modetype == 0) { return HeatingCircuit::Mode::ECO; } else if (modetype == 1) { @@ -1334,7 +1334,7 @@ void Thermostat::process_RC300WWmode(std::shared_ptr telegram) { // circulation pump see: https://github.com/Th3M3/buderus_ems-wiki/blob/master/Einstellungen%20der%20Bedieneinheit%20RC310.md has_update(telegram, dhw->wwCircPump_, 1); // FF=off, 0=on ? - if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { + if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { has_enumupdate(telegram, dhw->wwMode_, 2, {0, 5, 1, 2, 4}); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_R3000) { // https://github.com/emsesp/EMS-ESP32/pull/1722#discussion_r1582823521 @@ -2355,7 +2355,7 @@ bool Thermostat::set_control(const char * value, const int8_t id) { } // BC400 // 1-RC100, 2-RC100H, 3-RC200 - } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400) { + } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (Helpers::value2enum(value, ctrl, FL_(enum_control2))) { write_command(hpmode_typeids[hc->hc()], 3, ctrl); hc->control = ctrl; // set in advance, dont wait for verify @@ -2435,7 +2435,7 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return false; } write_command(0xB0, 2, set, 0xB0); - } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { + } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { if (!Helpers::value2enum(value, set, FL_(enum_wwMode4), {0, 5, 1, 2, 4})) { // off, eco+, eco, comfort, auto return false; } @@ -2599,7 +2599,11 @@ bool Thermostat::set_coolondelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 6, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 6, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 6, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -2613,7 +2617,11 @@ bool Thermostat::set_cooloffdelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 7, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 7, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 7, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -3142,6 +3150,7 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { mode_list = FL_(enum_mode3); break; case EMSdevice::EMS_DEVICE_FLAG_BC400: + case EMSdevice::EMS_DEVICE_FLAG_UI800: case EMSdevice::EMS_DEVICE_FLAG_CR120: mode_list = FL_(enum_mode2); break; @@ -3279,6 +3288,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const int8_t id) { offset = EMS_OFFSET_RC35Set_mode; break; case EMSdevice::EMS_DEVICE_FLAG_BC400: + case EMSdevice::EMS_DEVICE_FLAG_UI800: case EMSdevice::EMS_DEVICE_FLAG_CR120: offset = EMS_OFFSET_RCPLUSSet_mode_new; break; @@ -3318,7 +3328,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const int8_t id) { // set hc->mode temporary until validate is received if (model_ == EMSdevice::EMS_DEVICE_FLAG_RC10) { hc->mode = set_mode_value >> 1; - } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_BC400 || model_ == EMSdevice::EMS_DEVICE_FLAG_CR120) { + } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_BC400 || model_ == EMSdevice::EMS_DEVICE_FLAG_UI800 || model_ == EMSdevice::EMS_DEVICE_FLAG_CR120) { hc->mode_new = set_mode_value; } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_RC300 || model_ == EMSdevice::EMS_DEVICE_FLAG_R3000 || model_ == EMSdevice::EMS_DEVICE_FLAG_HMC310 || model_ == EMSdevice::EMS_DEVICE_FLAG_RC100) { @@ -3495,7 +3505,11 @@ bool Thermostat::set_heatondelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 2, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 2, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 2, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -3508,7 +3522,11 @@ bool Thermostat::set_heatoffdelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 3, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 3, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 3, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -4443,6 +4461,7 @@ void Thermostat::register_device_values() { case EMSdevice::EMS_DEVICE_FLAG_RC300: case EMSdevice::EMS_DEVICE_FLAG_R3000: case EMSdevice::EMS_DEVICE_FLAG_BC400: + case EMSdevice::EMS_DEVICE_FLAG_UI800: case EMSdevice::EMS_DEVICE_FLAG_CR120: case EMSdevice::EMS_DEVICE_FLAG_HMC310: register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, @@ -4902,9 +4921,10 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode_new, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); } else { register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); @@ -4997,6 +5017,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrhpminflowtemp, DeviceValueType::UINT8, FL_(hpminflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_hpminflowtemp)); if (model == EMSdevice::EMS_DEVICE_FLAG_BC400) { register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control2), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); + } else if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control3), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); } else { register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control1), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); } @@ -5012,24 +5034,49 @@ void Thermostat::register_device_values_hc(std::shared_ptrremotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101); } - register_device_value(tag, - &hc->heatondelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(heatondelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_heatondelay), - 1, - 48); - register_device_value(tag, - &hc->heatoffdelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(heatoffdelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_heatoffdelay), - 1, - 48); + if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_device_value(tag, + &hc->heatondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatondelay), + 1, + 48); + register_device_value(tag, + &hc->heatoffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatoffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatoffdelay), + 1, + 48); + register_device_value(tag, + &hc->coolondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(coolondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_coolondelay), + 1, + 48); + register_device_value(tag, + &hc->cooloffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(cooloffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_cooloffdelay), + 1, + 48); + } else { + 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->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->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); 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)); @@ -5391,9 +5438,10 @@ void Thermostat::register_device_values_dhw(std::shared_ptrwwMode_, DeviceValueType::ENUM, FL_(enum_wwMode4), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_R3000) { register_device_value(tag, &dhw->wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode5), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 4c33b78b9..0bd39bd42 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -241,7 +241,7 @@ class Thermostat : public EMSdevice { // check to see if the thermostat is a hybrid of the R300 inline bool isRC300() const { return (model() == EMSdevice::EMS_DEVICE_FLAG_RC300 || model() == EMSdevice::EMS_DEVICE_FLAG_R3000 || model() == EMSdevice::EMS_DEVICE_FLAG_BC400 - || model() == EMSdevice::EMS_DEVICE_FLAG_CR120 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310); + || model() == EMSdevice::EMS_DEVICE_FLAG_CR120 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800); } inline uint8_t id2dhw(const int8_t id) const { // returns telegram offset for TAG(id) diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 0958eb06d..41a5ebd5c 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.4" +#define EMSESP_APP_VERSION "3.8.3-dev.4a"