From 8d1a36c66913045e2ada8185694d7d1db7565b4c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 3 Jan 2024 08:04:20 +0100 Subject: [PATCH] wwcomfort on ems+ --- src/devices/boiler.cpp | 15 ++++++++++++--- src/devices/boiler.h | 3 ++- src/devices/heatpump.cpp | 4 ++-- src/locale_common.h | 4 ++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index ba58b6020..999b475d3 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -846,6 +846,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(wwComfort), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_mode)); + wwComfort2_ = EMS_VALUE_UINT_NOTSET; // read separately, but published as wwComfort1_ register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwComfort1_, DeviceValueType::ENUM, @@ -1468,9 +1469,12 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram has_update(telegram, wwMaxTemp_, 20); has_update(telegram, wwChargeOptimization_, 25); has_update(telegram, wwSelTempEcoplus_, 27); + has_update(telegram, wwComfort2_, 26); uint8_t wwComfort1 = EMS_VALUE_UINT_NOTSET; - if (telegram->read_value(wwComfort1, 13)) { + if (Helpers::hasValue(wwComfort2_)) { + has_update(wwComfort1_, wwComfort1); + } else if (telegram->read_value(wwComfort1, 13)) { if (wwComfort1 == 0) { wwComfort1 = 0; // High_Comfort } else if (wwComfort1 == 0xD8) { @@ -2417,10 +2421,15 @@ bool Boiler::set_ww_mode(const char * value, const int8_t id) { uint8_t set; uint8_t comfort[] = {0x00, 0xD8, 0xEC}; // heat, eco, intelligent - if (is_received(EMS_TYPE_UBAParameterWWPlus)) { + if (Helpers::hasValue(wwComfort2_)) { + if (Helpers::value2enum(value, set, FL_(enum_comfort1))) { + write_command(EMS_TYPE_UBAParameterWWPlus, 26, set, EMS_TYPE_UBAParameterWWPlus); + return true; + } + } else if (is_received(EMS_TYPE_UBAParameterWWPlus)) { if (Helpers::value2enum(value, set, FL_(enum_comfort1))) { write_command(EMS_TYPE_UBAParameterWWPlus, 13, comfort[set], EMS_TYPE_UBAParameterWWPlus); - write_command(0x05, 70, set == 0 ? 0xAA : 0x55); // + write_command(0x05, 70, set == 1 ? 0xAA : 0x55); // return true; } } else { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 7a76337f5..70fa992c0 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -60,7 +60,8 @@ class Boiler : public EMSdevice { uint8_t wwSelTempEcoplus_; // DHW ECO+ temperature uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer uint8_t wwComfort_; // WW comfort mode - uint8_t wwComfort1_; // WW comfort mode RC310 + uint8_t wwComfort1_; // WW comfort mode RC310, 0xEA offset 13 + uint8_t wwComfort2_; // WW comfort mode emsplus 0xEA, offset 26 uint8_t wwCircPump_; // DHW circulation pump available uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) uint8_t wwChargeOptimization_; // DHW charge optimization diff --git a/src/devices/heatpump.cpp b/src/devices/heatpump.cpp index 862ba121a..8a1c214b6 100644 --- a/src/devices/heatpump.cpp +++ b/src/devices/heatpump.cpp @@ -88,7 +88,7 @@ Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, c register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hybridDHW_, DeviceValueType::ENUM, - FL_(enum_comfort1), + FL_(enum_comfort2), FL_(hybridDHW), DeviceValueUOM::NONE, MAKE_CF_CB(set_hybridDHW)); @@ -332,7 +332,7 @@ bool Heatpump::set_lowNoiseStop(const char * value, const int8_t id) { } bool Heatpump::set_hybridDHW(const char * value, const int8_t id) { uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_comfort1))) { + if (!Helpers::value2enum(value, v, FL_(enum_comfort2))) { return false; } write_command(0x998, 1, v, 0x998); diff --git a/src/locale_common.h b/src/locale_common.h index 99220b246..9a4f69c07 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -279,8 +279,8 @@ MAKE_ENUM(enum_charge, FL_(chargepump), FL_(3wayvalve)) MAKE_ENUM(enum_freq, FL_(off), FL_(1x3min), FL_(2x3min), FL_(3x3min), FL_(4x3min), FL_(5x3min), FL_(6x3min), FL_(continuous)) MAKE_ENUM(enum_off_time_date_manual, FL_(off), FL_(time), FL_(date), FL_(manual)) MAKE_ENUM(enum_comfort, FL_(hot), FL_(eco), FL_(intelligent)) -// MAKE_ENUM(enum_comfort1, FL_(high_comfort), FL_(eco)) -MAKE_ENUM(enum_comfort1, FL_(eco), FL_(high_comfort)) +MAKE_ENUM(enum_comfort1, FL_(high_comfort), FL_(eco)) +MAKE_ENUM(enum_comfort2, FL_(eco), FL_(high_comfort)) MAKE_ENUM(enum_flow, FL_(off), FL_(flow), FL_(bufferedflow), FL_(buffer), FL_(layeredbuffer)) MAKE_ENUM(enum_reset, FL_(dash), FL_(maintenance), FL_(error)) MAKE_ENUM(enum_maxHeat, FL_(0kW), FL_(2kW), FL_(3kW), FL_(4kW), FL_(6kW), FL_(9kW))