diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 5e4084018..fcd4448e4 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -136,7 +136,6 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(TAG_BOILER_DATA, &serviceCode_, DeviceValueType::TEXT, nullptr, FL_(serviceCode), DeviceValueUOM::NONE); register_device_value(TAG_BOILER_DATA, &serviceCodeNumber_, DeviceValueType::USHORT, nullptr, FL_(serviceCodeNumber), DeviceValueUOM::NONE); register_device_value(TAG_BOILER_DATA, &maintenanceMessage_, DeviceValueType::TEXT, nullptr, FL_(maintenanceMessage), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &maintenanceDate_, DeviceValueType::TEXT, nullptr, FL_(maintenanceDate), DeviceValueUOM::NONE); register_device_value(TAG_BOILER_DATA, &maintenanceType_, DeviceValueType::ENUM, @@ -144,7 +143,20 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(maintenanceType), DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenance)); - register_device_value(TAG_BOILER_DATA, &maintenanceTime_, DeviceValueType::USHORT, nullptr, FL_(maintenanceTime), DeviceValueUOM::HOURS); + register_device_value(TAG_BOILER_DATA, + &maintenanceTime_, + DeviceValueType::USHORT, + nullptr, + FL_(maintenanceTime), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_maintenancetime)); + register_device_value(TAG_BOILER_DATA, + &maintenanceDate_, + DeviceValueType::TEXT, + nullptr, + FL_(maintenanceDate), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_maintenancedate)); // heatpump info if (model() == EMS_DEVICE_FLAG_HEATPUMP) { register_device_value(TAG_BOILER_DATA, &upTimeControl_, DeviceValueType::TIME, FL_(div60), FL_(upTimeControl), DeviceValueUOM::MINUTES); @@ -192,6 +204,8 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value( TAG_BOILER_DATA_WW, &wWCircPump_, DeviceValueType::BOOL, nullptr, FL_(wWCircPump), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_warmwater_circulation_pump)); register_device_value(TAG_BOILER_DATA_WW, &wWChargeType_, DeviceValueType::ENUM, FL_(enum_charge), FL_(wWChargeType), DeviceValueUOM::NONE); + register_device_value(TAG_BOILER_DATA_WW, &wWHystOn_, DeviceValueType::INT, nullptr, FL_(wWHystOn), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_hyst_on)); + register_device_value(TAG_BOILER_DATA_WW, &wWHystOff_, DeviceValueType::INT, nullptr, FL_(wWHystOff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_hyst_off)); register_device_value(TAG_BOILER_DATA_WW, &wWDisinfectionTemp_, DeviceValueType::UINT, @@ -315,8 +329,8 @@ void Boiler::process_UBAParameterWW(std::shared_ptr telegram) { // has_update(telegram->read_bitvalue(wwEquipt_,0,3)); // 8=boiler has ww has_update(telegram->read_value(wWActivated_, 1)); // 0xFF means on has_update(telegram->read_value(wWSelTemp_, 2)); - // has_update(telegram->read_value(wW?_, 3)); // Hyst on (default -5) - // has_update(telegram->read_value(wW?_, 4)); // (0xFF) Maybe: Hyst off -1? + has_update(telegram->read_value(wWHystOn_, 3)); // Hyst on (default -5) + has_update(telegram->read_value(wWHystOff_, 4)); // Hyst off (default -1) has_update(telegram->read_value(wWFlowTempOffset_, 5)); // default 40 has_update(telegram->read_value(wWCircPump_, 6)); // 0xFF means on has_update(telegram->read_value(wWCircMode_, 7)); // 1=1x3min 6=6x3min 7=continuous @@ -554,6 +568,8 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram 11)); // 1=1x3min... 6=6x3min, 7=continuous // has_update(telegram->read_value(wWDisinfectTemp_, 12)); // settings, status in E9 // has_update(telegram->read_value(wWSelTemp_, 6)); // settings, status in E9 + has_update(telegram->read_value(wWHystOn_, 7)); + has_update(telegram->read_value(wWHystOff_, 8)); } // 0xE9 - WW monitor ems+ @@ -902,6 +918,42 @@ bool Boiler::set_max_power(const char * value, const int8_t id) { return true; } +// set ww on hysteresis +bool Boiler::set_ww_hyst_on(const char * value, const int8_t id) { + int v = 0; + if (!Helpers::value2number(value, v)) { + LOG_WARNING(F("Set ww on hysteresis: Invalid value")); + return false; + } + + LOG_INFO(F("Setting ww on hysteresis on to %d C"), v); + if (get_toggle_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAParameterWWPlus, 7, v, EMS_TYPE_UBAParameterWWPlus); + } else { + write_command(EMS_TYPE_UBAParameterWW, 3, v, EMS_TYPE_UBAParameterWW); + } + + return true; +} + +// set ww off hysteresis +bool Boiler::set_ww_hyst_off(const char * value, const int8_t id) { + int v = 0; + if (!Helpers::value2number(value, v)) { + LOG_WARNING(F("Set ww off hysteresis: Invalid value")); + return false; + } + + LOG_INFO(F("Setting ww off hysteresis off to %d C"), v); + if (get_toggle_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAParameterWWPlus, 8, v, EMS_TYPE_UBAParameterWWPlus); + } else { + write_command(EMS_TYPE_UBAParameterWW, 4, v, EMS_TYPE_UBAParameterWW); + } + + return true; +} + // set warm water max power bool Boiler::set_warmwater_maxpower(const char * value, const int8_t id) { int v = 0; @@ -1268,5 +1320,40 @@ bool Boiler::set_maintenance(const char * value, const int8_t id) { LOG_WARNING(F("Setting maintenance: wrong format")); return false; } +//maintenance +bool Boiler::set_maintenancetime(const char * value, const int8_t id) { + int hrs; + if (Helpers::value2number(value, hrs)) { + if (hrs > 99 && hrs < 25600) { + LOG_INFO(F("Setting maintenance time %d hours"), hrs); + uint8_t data[2] = {1, (uint8_t)(hrs / 100)}; + write_command(0x15, 0, data, 2, 0x15); + return true; + } + } + LOG_WARNING(F("Setting maintenance: wrong format")); + return false; +} + +//maintenance +bool Boiler::set_maintenancedate(const char * value, const int8_t id) { + if (strlen(value) == 10) { // date + uint8_t day = (value[0] - '0') * 10 + (value[1] - '0'); + uint8_t month = (value[3] - '0') * 10 + (value[4] - '0'); + uint8_t year = (uint8_t)(Helpers::atoint(&value[6]) - 2000); + if (day > 0 && day < 32 && month > 0 && month < 13) { + LOG_INFO(F("Setting maintenance date to %02d.%02d.%04d"), day, month, year + 2000); + uint8_t data[5] = {2, (uint8_t)(maintenanceTime_ / 100), day, month, year}; + write_command(0x15, 0, data, 5, 0x15); + } else { + LOG_WARNING(F("Setting maintenance: wrong format %d.%d.%d"), day, month, year + 2000); + return false; + } + return true; + } + + LOG_WARNING(F("Setting maintenance: wrong format")); + return false; +} } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index deeb3585c..7c3a0ba70 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -83,6 +83,8 @@ class Boiler : public EMSdevice { uint32_t wWStarts_; // Warm Water # starts uint32_t wWStarts2_; // Warm water control starts uint32_t wWWorkM_; // Warm Water # minutes + int8_t wWHystOn_; + int8_t wWHystOff_; uint16_t mixerTemp_; // mixing temperature uint16_t tankMiddleTemp_; // Tank middle temperature (TS3) @@ -220,6 +222,10 @@ class Boiler : public EMSdevice { bool set_pump_delay(const char * value, const int8_t id); bool set_reset(const char * value, const int8_t id); bool set_maintenance(const char * value, const int8_t id); + bool set_maintenancetime(const char * value, const int8_t id); + bool set_maintenancedate(const char * value, const int8_t id); + bool set_ww_hyst_on(const char * value, const int8_t id); + bool set_ww_hyst_off(const char * value, const int8_t id); }; } // namespace emsesp diff --git a/src/locale_EN.h b/src/locale_EN.h index e9bcd0eb3..64a5bb607 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -463,6 +463,8 @@ MAKE_PSTR_LIST(tankMiddleTemp, F("tankmiddletemp"), F("ww tank middle temperatur MAKE_PSTR_LIST(wWStarts, F("wwstarts"), F("ww # starts")) MAKE_PSTR_LIST(wWStarts2, F("wwstarts2"), F("ww # control starts")) MAKE_PSTR_LIST(wWWorkM, F("wwworkm"), F("ww active time")) +MAKE_PSTR_LIST(wWHystOn, F("wwhyston"), F("ww hysteresis on temperature")) +MAKE_PSTR_LIST(wWHystOff, F("wwhystoff"), F("ww hysteresis off temperature")) // thermostat // extra commands, with no long name so they don't show up in WebUI