From 8774ca5f7f0800c15475a43efb5132bc1d25646c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 12 Apr 2024 10:35:48 +0200 Subject: [PATCH] fix multiple remotes, add RC100 --- src/devices/thermostat.cpp | 83 ++++++++++++++------------------------ src/roomcontrol.cpp | 20 ++++++--- src/roomcontrol.h | 2 +- 3 files changed, 45 insertions(+), 60 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d82b61f3f..a6b77ff9d 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1865,12 +1865,13 @@ bool Thermostat::set_remotetemp(const char * value, const int8_t id) { } else if ((model() == EMSdevice::EMS_DEVICE_FLAG_BC400) || model() == EMSdevice::EMS_DEVICE_FLAG_RC300) { if (hc->control == 1) { Roomctrl::set_remotetemp(Roomctrl::RC200, hc->hc(), hc->remotetemp); // RC200 - } else if (hc->control == 2 || hc->control == 3) { // RC100(2) and RC100H(3) + } else if (hc->control == 3) { // RC100H(3) Roomctrl::set_remotetemp(Roomctrl::RC100H, hc->hc(), hc->remotetemp); // RC100H + } else if (hc->control == 2 || hc->control == 0) { // RC100(2) and RC310(0) + Roomctrl::set_remotetemp(Roomctrl::RC100, hc->hc(), hc->remotetemp); // RC100 } else { - // test for #1691 - Roomctrl::set_remotetemp(Roomctrl::RC200, hc->hc(), hc->remotetemp); // RC200 - // Roomctrl::set_remotetemp(0, hc->hc(), EMS_VALUE_SHORT_NOTSET); // no remote set, switch off + hc->remotetemp = EMS_VALUE_SHORT_NOTSET; + Roomctrl::set_remotetemp(0, hc->hc(), EMS_VALUE_SHORT_NOTSET); // unknown remote set, switch off } } @@ -1989,9 +1990,19 @@ bool Thermostat::set_control(const char * value, const int8_t id) { } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_RC300 || model() == EMSdevice::EMS_DEVICE_FLAG_RC100) { if (Helpers::value2enum(value, ctrl, FL_(enum_control1))) { write_command(hpmode_typeids[hc->hc()], 3, ctrl); - // if (hc->remotetemp != EMS_VALUE_SHORT_NOTSET && ctrl > 0) { - // Roomctrl::set_remotetemp(ctrl == 1 ? Roomctrl::RC200 : Roomctrl::RC100H, hc->hc(), hc->remotetemp); - // } + if (hc->remotetemp != EMS_VALUE_SHORT_NOTSET && ctrl > 0) { + if (ctrl == 1) { + Roomctrl::set_remotetemp(Roomctrl::RC200, hc->hc(), hc->remotetemp); + } else if (ctrl == 2) { + Roomctrl::set_remotetemp(Roomctrl::RC100, hc->hc(), hc->remotetemp); + } else if (ctrl == 3) { + Roomctrl::set_remotetemp(Roomctrl::RC100H, hc->hc(), hc->remotetemp); + } else { + hc->remotetemp = EMS_VALUE_SHORT_NOTSET; + Roomctrl::set_remotetemp(0, hc->hc(), hc->remotetemp); + } + // Roomctrl::set_remotetemp(ctrl == 1 ? Roomctrl::RC200 : ctrl == 3 ? Roomctrl::RC100H : Roomctrl::RC100, hc->hc(), hc->remotetemp); + } return true; } } else if (Helpers::value2enum(value, ctrl, FL_(enum_control))) { @@ -3849,33 +3860,18 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaDamping_, DeviceValueType::BOOL, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwSetTemp_, DeviceValueType::UINT, FL_(wwSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemp)); if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400) { - register_device_value(DeviceValueTAG::TAG_DHW1, - &wwMode_, - DeviceValueType::ENUM, - FL_(enum_wwMode4), - FL_(wwMode), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_wwmode)); + register_device_value( + DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode4), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value( DeviceValueTAG::TAG_DHW2, &wwMode2_, DeviceValueType::ENUM, FL_(enum_wwMode4), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } else { - register_device_value(DeviceValueTAG::TAG_DHW1, - &wwMode_, - DeviceValueType::ENUM, - FL_(enum_wwMode), - FL_(wwMode), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_wwmode)); + register_device_value( + DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value( DeviceValueTAG::TAG_DHW2, &wwMode2_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } - register_device_value(DeviceValueTAG::TAG_DHW1, - &wwSetTempLow_, - DeviceValueType::UINT, - FL_(wwSetTempLow), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_wwtemplow)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwSetTempLow_, DeviceValueType::UINT, FL_(wwSetTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemplow)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwCircMode_, DeviceValueType::ENUM, @@ -4062,8 +4058,7 @@ void Thermostat::register_device_values() { DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &backlight_, DeviceValueType::BOOL, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); - register_device_value( - DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); break; case EMSdevice::EMS_DEVICE_FLAG_RC20_N: case EMSdevice::EMS_DEVICE_FLAG_RC25: @@ -4121,8 +4116,7 @@ void Thermostat::register_device_values() { FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); - register_device_value( - DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwWhenModeOff_, DeviceValueType::BOOL, @@ -4215,8 +4209,7 @@ void Thermostat::register_device_values() { FL_(ibaBuildingType), DeviceValueUOM::NONE, MAKE_CF_CB(set_building)); - register_device_value( - DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwCircMode_, DeviceValueType::ENUM, @@ -4259,18 +4252,8 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_wwDisinfectHour), 0, 23); - register_device_value(DeviceValueTAG::TAG_DHW1, - &wwMaxTemp_, - DeviceValueType::UINT, - FL_(wwMaxTemp), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_wwMaxTemp)); - register_device_value(DeviceValueTAG::TAG_DHW1, - &wwOneTimeKey_, - DeviceValueType::BOOL, - FL_(wwOneTimeKey), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_wwOneTimeKey)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwOneTimeKey_, DeviceValueType::BOOL, FL_(wwOneTimeKey), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwOneTimeKey)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwSwitchTime_, DeviceValueType::STRING, @@ -4346,8 +4329,7 @@ void Thermostat::register_device_values() { FL_(ibaBuildingType), DeviceValueUOM::NONE, MAKE_CF_CB(set_building)); - register_device_value( - DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwCircMode_, DeviceValueType::ENUM, @@ -4392,12 +4374,7 @@ void Thermostat::register_device_values() { 23); register_device_value( DeviceValueTAG::TAG_DHW1, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp), 60, 80); - register_device_value(DeviceValueTAG::TAG_DHW1, - &wwOneTimeKey_, - DeviceValueType::BOOL, - FL_(wwOneTimeKey), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_wwOneTimeKey)); + register_device_value(DeviceValueTAG::TAG_DHW1, &wwOneTimeKey_, DeviceValueType::BOOL, FL_(wwOneTimeKey), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwOneTimeKey)); register_device_value(DeviceValueTAG::TAG_DHW1, &wwSwitchTime_, DeviceValueType::STRING, diff --git a/src/roomcontrol.cpp b/src/roomcontrol.cpp index 56a58ec84..694730a97 100644 --- a/src/roomcontrol.cpp +++ b/src/roomcontrol.cpp @@ -42,7 +42,7 @@ void Roomctrl::set_remotetemp(const uint8_t type, const uint8_t hc, const int16_ sendcnt[hc] = 0; return; } - if (hc >= HCS || (type != RC20 && type != FB10 && type != RC100H && type != SENSOR && type != RC200)) { + if (hc >= HCS || (type != RC20 && type != FB10 && type != RC100H && type != SENSOR && type != RC200 && type != RC100)) { return; } type_[hc] = type; @@ -67,11 +67,11 @@ void Roomctrl::set_remotehum(const uint8_t type, const uint8_t hc, const int8_t uint8_t Roomctrl::get_hc(uint8_t addr) { addr &= 0x7F; - if (addr >= 0x40 && addr <= 0x44) { + if (addr >= 0x40 && addr <= 0x44 && type_[addr - 0x40] == SENSOR) { return addr - 0x40; // SENSOR - } else if (addr >= 0x38 && addr <= 0x3B) { + } else if (addr >= 0x38 && addr <= 0x3B && (type_[addr - 0x38] == RC100H || type_[addr - 0x38] == RC200 || type_[addr - 0x38] == RC100)) { return addr - 0x38; // RC100H, RC200 - } else if (addr >= 0x18 && addr <= 0x1B) { + } else if (addr >= 0x18 && addr <= 0x1B && (type_[addr - 0x18] == RC20 || type_[addr - 0x18] == FB10)) { return addr - 0x18; // RC20, FB10 } return 0xFF; // invalid @@ -109,7 +109,7 @@ void Roomctrl::send(uint8_t addr) { } temperature(addr, 0x10, hc); // send to master-thermostat } - } else if (type_[hc] == RC200) { + } else if (type_[hc] == RC200 || type_[hc] == RC100) { rc_time_[hc] = uuid::get_uptime(); temperature(addr, 0x10, hc); } else if (type_[hc] == FB10) { @@ -223,6 +223,14 @@ void Roomctrl::version(uint8_t addr, uint8_t dst, uint8_t hc) { data[9] = EMSbus::calculate_crc(data, 9); // apppend CRC EMSuart::transmit(data, 10); return; + } else if (type_[hc] == RC100) { + data[5] = 40; // version 40.03 + data[6] = 3; + data[7] = 0; + data[8] = 0xFF; + data[9] = EMSbus::calculate_crc(data, 9); // apppend CRC + EMSuart::transmit(data, 10); + return; } } @@ -288,7 +296,7 @@ void Roomctrl::temperature(uint8_t addr, uint8_t dst, uint8_t hc) { data[10] = 1; // not sure what this is and if we need it, maybe mode? data[11] = EMSbus::calculate_crc(data, 11); // apppend CRC EMSuart::transmit(data, 12); - } else if (type_[hc] == RC100H) { // RC100H, telegram 42B, ff + } else if (type_[hc] == RC100H || type_[hc] == RC100) { // RC100H, telegram 42B, ff data[2] = 0xFF; data[3] = 0; data[4] = 3; diff --git a/src/roomcontrol.h b/src/roomcontrol.h index 7d7610750..5cc33b8bd 100644 --- a/src/roomcontrol.h +++ b/src/roomcontrol.h @@ -28,7 +28,7 @@ class Roomctrl { static void check(uint8_t addr, const uint8_t * data, const uint8_t length); static void set_remotetemp(const uint8_t type, const uint8_t hc, const int16_t temp); static void set_remotehum(const uint8_t type, const uint8_t hc, const int8_t hum); - enum : uint8_t { RC20 = 113, FB10 = 109, RC100H = 200, SENSOR = 0x40, RC200 = 157 }; + enum : uint8_t { RC20 = 113, FB10 = 109, RC100H = 200, SENSOR = 0x40, RC200 = 157, RC100 = 165 }; static bool is_remote(const uint8_t hc) { return (hc < 4 && remotetemp_[hc] != EMS_VALUE_SHORT_NOTSET); }