diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 1c64d5598..c7f3746d2 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -47,6 +47,8 @@ This release is based on the latest Espressif/Arduino core version 3. It brings - 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 - heat limit entities (`maxheatcomp`, `maxheatheat`, `dhw.maxheat`) read as unknown on heat pumps with an auxiliary heater larger than 9 kW - `enum_maxHeat` was missing the 12 kW and 15 kW steps +- add 0kW to heat limits [#3262](https://github.com/emsesp/EMS-ESP32/issues/3262), [#3265](https://github.com/emsesp/EMS-ESP32/issues/3265) +- show temperature value for sensor 0x40 [#3272](https://github.com/emsesp/EMS-ESP32/issues/3272) - no EMS bus on custom boards whose interface relies on a pull-up on the Rx line. The newer ESP-IDF no longer enables the internal pull-up on the UART Rx pin, so it is now set explicitly as it was in 3.8 [#3258](https://github.com/emsesp/EMS-ESP32/discussions/3258) ## Changed diff --git a/docs/Modbus-Entity-Registers.md b/docs/Modbus-Entity-Registers.md index ce2905541..61f4c2cad 100644 --- a/docs/Modbus-Entity-Registers.md +++ b/docs/Modbus-Entity-Registers.md @@ -223,11 +223,11 @@ uint8 uint8 | dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | uint8 -| dhw.comfdiff | comfort diff | uint8 (>=4<=15) | K | true | DHW | 21 | 1 | 1 | +| dhw.comfdiff | comfort diff | uint8 (>=6<=18) | K | true | DHW | 21 | 1 | 1 | uint8 -| dhw.ecodiff | eco diff | uint8 (>=4<=15) | K | true | DHW | 22 | 1 | 1 | +| dhw.ecodiff | eco diff | uint8 (>=6<=18) | K | true | DHW | 22 | 1 | 1 | uint8 -| dhw.ecoplusdiff | eco+ diff | uint8 (>=4<=15) | K | true | DHW | 23 | 1 | 1 | +| dhw.ecoplusdiff | eco+ diff | uint8 (>=6<=15) | K | true | DHW | 23 | 1 | 1 | uint8 | dhw.comfstop | comfort stop temp | uint8 (>=0<=0) | C | true | DHW | 24 | 1 | 1 | uint8 @@ -3721,11 +3721,11 @@ uint8 uint8 | dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | uint8 -| dhw.comfdiff | comfort diff | uint8 (>=4<=15) | K | true | DHW | 21 | 1 | 1 | +| dhw.comfdiff | comfort diff | uint8 (>=6<=18) | K | true | DHW | 21 | 1 | 1 | uint8 -| dhw.ecodiff | eco diff | uint8 (>=4<=15) | K | true | DHW | 22 | 1 | 1 | +| dhw.ecodiff | eco diff | uint8 (>=6<=18) | K | true | DHW | 22 | 1 | 1 | uint8 -| dhw.ecoplusdiff | eco+ diff | uint8 (>=4<=15) | K | true | DHW | 23 | 1 | 1 | +| dhw.ecoplusdiff | eco+ diff | uint8 (>=6<=15) | K | true | DHW | 23 | 1 | 1 | uint8 | dhw.comfstop | comfort stop temp | uint8 (>=0<=0) | C | true | DHW | 24 | 1 | 1 | uint8 @@ -3999,11 +3999,11 @@ uint8 uint8 | dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | uint8 -| dhw.comfdiff | comfort diff | uint8 (>=4<=15) | K | true | DHW | 21 | 1 | 1 | +| dhw.comfdiff | comfort diff | uint8 (>=6<=18) | K | true | DHW | 21 | 1 | 1 | uint8 -| dhw.ecodiff | eco diff | uint8 (>=4<=15) | K | true | DHW | 22 | 1 | 1 | +| dhw.ecodiff | eco diff | uint8 (>=6<=18) | K | true | DHW | 22 | 1 | 1 | uint8 -| dhw.ecoplusdiff | eco+ diff | uint8 (>=4<=15) | K | true | DHW | 23 | 1 | 1 | +| dhw.ecoplusdiff | eco+ diff | uint8 (>=6<=15) | K | true | DHW | 23 | 1 | 1 | uint8 | dhw.comfstop | comfort stop temp | uint8 (>=0<=0) | C | true | DHW | 24 | 1 | 1 | uint8 diff --git a/docs/dump_entities.csv b/docs/dump_entities.csv index e3150436c..a6e59358d 100644 --- a/docs/dump_entities.csv +++ b/docs/dump_entities.csv @@ -128,7 +128,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin4opt,input 4 options,string (>=0<=0), ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,6,0,1,209,8 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maxheatcomp,heat limit compressor,enum [0 kW\|3 kW\|6 kW\|9 kW] (>=0<=0), ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,6,0,1,217,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maxheatheat,heat limit heating,enum [3 kW\|6 kW\|9 kW] (>=0<=0), ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,6,0,1,218,1 -"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.maxheat,heat limit,enum [3 kW\|6 kW\|9 kW] (>=0<=0), ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,6,9,1,14,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.maxheat,heat limit,enum [0 kW\|3 kW\|6 kW\|9 kW] (>=0<=0), ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,6,9,1,14,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheatersource,aux heater source,enum [not installed\|electric heater\|exclusive\|parallel\|hybrid] (>=0<=0), ,true,select.boiler_aux_heater_source,select.boiler_auxheatersource,6,0,1,219,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pvcooling,cooling only with PV,boolean (>=0<=0), ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,6,0,1,220,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheateronly,aux heater only,boolean (>=0<=0), ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,6,0,1,221,1 @@ -172,9 +172,9 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,6,9,1,18,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,6,9,1,19,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,6,9,1,20,1 -"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfdiff,comfort diff,uint8 (>=4<=15),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,6,9,1,21,1 -"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecodiff,eco diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,6,9,1,22,1 -"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusdiff,eco+ diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,6,9,1,23,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfdiff,comfort diff,uint8 (>=6<=18),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,6,9,1,21,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecodiff,eco diff,uint8 (>=6<=18),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,6,9,1,22,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusdiff,eco+ diff,uint8 (>=6<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,6,9,1,23,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfstop,comfort stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,6,9,1,24,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecostop,eco stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,6,9,1,25,1 "CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,6,9,1,26,1 @@ -2813,9 +2813,9 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,6,9,1,18,1 "Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,6,9,1,19,1 "Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,6,9,1,20,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfdiff,comfort diff,uint8 (>=4<=15),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,6,9,1,21,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecodiff,eco diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,6,9,1,22,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusdiff,eco+ diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,6,9,1,23,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfdiff,comfort diff,uint8 (>=6<=18),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,6,9,1,21,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecodiff,eco diff,uint8 (>=6<=18),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,6,9,1,22,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusdiff,eco+ diff,uint8 (>=6<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,6,9,1,23,1 "Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfstop,comfort stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,6,9,1,24,1 "Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecostop,eco stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,6,9,1,25,1 "Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,6,9,1,26,1 @@ -3034,9 +3034,9 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Geo 5xx",boiler,173,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,6,9,1,18,1 "Geo 5xx",boiler,173,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,6,9,1,19,1 "Geo 5xx",boiler,173,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,6,9,1,20,1 -"Geo 5xx",boiler,173,dhw.comfdiff,comfort diff,uint8 (>=4<=15),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,6,9,1,21,1 -"Geo 5xx",boiler,173,dhw.ecodiff,eco diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,6,9,1,22,1 -"Geo 5xx",boiler,173,dhw.ecoplusdiff,eco+ diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,6,9,1,23,1 +"Geo 5xx",boiler,173,dhw.comfdiff,comfort diff,uint8 (>=6<=18),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,6,9,1,21,1 +"Geo 5xx",boiler,173,dhw.ecodiff,eco diff,uint8 (>=6<=18),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,6,9,1,22,1 +"Geo 5xx",boiler,173,dhw.ecoplusdiff,eco+ diff,uint8 (>=6<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,6,9,1,23,1 "Geo 5xx",boiler,173,dhw.comfstop,comfort stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,6,9,1,24,1 "Geo 5xx",boiler,173,dhw.ecostop,eco stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,6,9,1,25,1 "Geo 5xx",boiler,173,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=0),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,6,9,1,26,1 diff --git a/interface/src/app/settings/ApplicationSettings.tsx b/interface/src/app/settings/ApplicationSettings.tsx index 328852b0e..08ceaf45b 100644 --- a/interface/src/app/settings/ApplicationSettings.tsx +++ b/interface/src/app/settings/ApplicationSettings.tsx @@ -848,6 +848,7 @@ const ApplicationSettings = () => { sx={{ width: '15ch' }} select > + {data.developer_mode && {LL.OFF()}} EMS EMS+ HT3 diff --git a/src/core/led.cpp b/src/core/led.cpp index abf649756..cbe068c3a 100644 --- a/src/core/led.cpp +++ b/src/core/led.cpp @@ -31,17 +31,17 @@ namespace rgb_led { namespace { -// durations in 100 ns ticks -constexpr uint16_t T0H = 3; // 300 ns -constexpr uint16_t T0L = 9; // 900 ns -constexpr uint16_t T1H = 8; // 800 ns -constexpr uint16_t T1L = 6; // 600 ns +// durations in 12.5 ns ticks +constexpr uint16_t T0H = 3.5 * 8; // 350 ns +constexpr uint16_t T0L = 9 * 8; // 900 ns +constexpr uint16_t T1H = 8 * 8; // 800 ns +constexpr uint16_t T1L = 6 * 8; // 600 ns // rmt_data_t.val layout: duration0:15, level0:1, duration1:15, level1:1 (high then low) constexpr uint32_t SYMBOL_0 = T0H | (1UL << 15) | (static_cast(T0L) << 16); constexpr uint32_t SYMBOL_1 = T1H | (1UL << 15) | (static_cast(T1L) << 16); -constexpr uint32_t RMT_FREQ_HZ = 10000000; // 10 MHz +constexpr uint32_t RMT_FREQ_HZ = 80000000; // 80 MHz constexpr uint32_t RESET_US = 300; constexpr uint8_t NO_PIN = 0xFF; constexpr uint8_t MAX_PINS = 2; // status LED + an RGB analog sensor; the ESP32-C3 only has 2 RMT TX channels diff --git a/src/core/system.cpp b/src/core/system.cpp index b7ef78b9e..3d4523a8a 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -3933,9 +3933,14 @@ void System::remove_optional_gpio(uint8_t pin) { // set unused gpios to default state input high-Z void System::reset_unused_gpios() { +#if CONFIG_IDF_TARGET_ESP32 +constexpr uint8_t tx0 = 1; // don't change tx0 pin +#else +constexpr uint8_t tx0 = 255; // no valid pin, chips have native USB, tx0 not connected to transceiver +#endif for (const auto & pin : valid_system_gpios_) { auto it = std::find_if(used_gpios_.begin(), used_gpios_.end(), [pin](const GpioUsage & usage) { return usage.pin == pin; }); - if (it == used_gpios_.end()) { + if (it == used_gpios_.end() && pin != tx0) { LOG_DEBUG("reset pin %d", pin); pinMode(pin, INPUT); } diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 9f71c9e8a..029ac0d6d 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -726,7 +726,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DHW1, &maxHeatDhw_, DeviceValueType::ENUM, - FL_(enum_maxHeat2), + FL_(enum_maxHeat1), FL_(maxHeatDhw), DeviceValueUOM::NONE, MAKE_CF_CB(set_maxHeatDhw)); @@ -994,16 +994,16 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const 48, 63); register_device_value( - DeviceValueTAG::TAG_DHW1, &wwComfDiffTemp_, DeviceValueType::UINT8, FL_(wwComfDiffTemp), DeviceValueUOM::K, MAKE_CF_CB(set_wwComfDiffTemp), 4, 15); + DeviceValueTAG::TAG_DHW1, &wwComfDiffTemp_, DeviceValueType::UINT8, FL_(wwComfDiffTemp), DeviceValueUOM::K, MAKE_CF_CB(set_wwComfDiffTemp), 6, 18); register_device_value( - DeviceValueTAG::TAG_DHW1, &wwEcoDiffTemp_, DeviceValueType::UINT8, FL_(wwEcoDiffTemp), DeviceValueUOM::K, MAKE_CF_CB(set_wwEcoDiffTemp), 4, 15); + DeviceValueTAG::TAG_DHW1, &wwEcoDiffTemp_, DeviceValueType::UINT8, FL_(wwEcoDiffTemp), DeviceValueUOM::K, MAKE_CF_CB(set_wwEcoDiffTemp), 6, 18); register_device_value(DeviceValueTAG::TAG_DHW1, &wwEcoPlusDiffTemp_, DeviceValueType::UINT8, FL_(wwEcoPlusDiffTemp), DeviceValueUOM::K, MAKE_CF_CB(set_wwEcoPlusDiffTemp), - 4, + 6, 15); register_device_value(DeviceValueTAG::TAG_DHW1, &wwComfStopTemp_, @@ -1873,7 +1873,7 @@ void Boiler::process_HpHeaterConfig(const std::shared_ptr & tele if (model() == EMSdevice::EMS_DEVICE_FLAG_CS6800) { has_enumupdate(telegram, maxHeatComp_, 2, {0, 2, 4, 5}); has_enumupdate(telegram, maxHeatHeat_, 3, {2, 4, 5}); - has_enumupdate(telegram, maxHeatDhw_, 4, {2, 4, 5}); + has_enumupdate(telegram, maxHeatDhw_, 4, {0, 2, 4, 5}); return; } has_update(telegram, maxHeatComp_, 2); @@ -3238,7 +3238,7 @@ bool Boiler::set_HpInLogic(const char * value, const int8_t id) { bool Boiler::set_maxHeat(const char * value, const int8_t id) { uint8_t v; if (model() == EMSdevice::EMS_DEVICE_FLAG_CS6800) { - if (id == 0) { + if (id == 2 || id == 4) { // maxHeatComp, maxHeatDhw if (!Helpers::value2enum(value, v, FL_(enum_maxHeat1), {0, 2, 4, 5})) { return false; } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d10e8dc70..eacbc6220 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -35,6 +35,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i // RF remote sensor seen at 0x40, maybe this is also for different hc with id 0x40 - 0x47? emsesp.cpp maps only 0x40 if (device_id >= 0x40 && device_id <= 0x47) { register_telegram_type(0x0435, "RFTemp", false, MAKE_PF_CB(process_RemoteTemp)); + register_device_values(); return; } // remote thermostats with humidity: RC100H remote, each thermostat is for one hc