diff --git a/src/devices/water.cpp b/src/devices/water.cpp index f3a9903d9..32f98a984 100644 --- a/src/devices/water.cpp +++ b/src/devices/water.cpp @@ -33,6 +33,7 @@ Water::Water(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_telegram_type(0x07D6, "SM100wwTemperature", false, MAKE_PF_CB(process_SM100wwTemperature)); register_telegram_type(0x07AA, "SM100wwStatus", false, MAKE_PF_CB(process_SM100wwStatus)); register_telegram_type(0x07AB, "SM100wwCommand", false, MAKE_PF_CB(process_SM100wwCommand)); + register_telegram_type(0x07AC, "SM100wwParam1", false, MAKE_PF_CB(process_SM100wwParam2)); register_telegram_type(0x07A5, "SM100wwCirc", true, MAKE_PF_CB(process_SM100wwCirc)); register_telegram_type(0x07A6, "SM100wwParam", true, MAKE_PF_CB(process_SM100wwParam)); register_telegram_type(0x07AE, "SM100wwKeepWarm", true, MAKE_PF_CB(process_SM100wwKeepWarm)); @@ -58,6 +59,8 @@ Water::Water(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(tag, &wwPumpMod_, DeviceValueType::UINT, FL_(wwPumpMod), DeviceValueUOM::PERCENT); register_device_value(tag, &wwFlow_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(wwFlow), DeviceValueUOM::LMIN); register_device_value(tag, &wwRetValve_, DeviceValueType::BOOL, FL_(valveReturn), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwKeepWarm)); + register_device_value(tag, &wwDeltaTRet_, DeviceValueType::UINT, FL_(deltaTRet), DeviceValueUOM::K, MAKE_CF_CB(set_wwDeltaTRet)); + register_device_value(tag, &errorDisp_, DeviceValueType::ENUM, FL_(enum_errorDisp), FL_(errorDisp), DeviceValueUOM::NONE, MAKE_CF_CB(set_errorDisp)); } else if (device_id >= EMSdevice::EMS_DEVICE_ID_DHW1 && device_id <= EMSdevice::EMS_DEVICE_ID_DHW2) { wwc_ = device_id - EMSdevice::EMS_DEVICE_ID_DHW1; @@ -75,6 +78,7 @@ Water::Water(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(tag, &wwRequiredTemp_, DeviceValueType::UINT, FL_(wwRequiredTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwRequiredTemp)); register_device_value(tag, &wwCirc_, DeviceValueType::BOOL, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCirc)); register_device_value(tag, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircMode)); + register_device_value(tag, &wwCircTc_, DeviceValueType::BOOL, FL_(wwCircTc), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircTc)); } else if (device_id == 0x40) { // flags == EMSdevice::EMS_DEVICE_FLAG_IPM, special DHW pos 10 wwc_ = 0; tag = DeviceValueTAG::TAG_WWC1; @@ -126,6 +130,11 @@ void Water::process_SM100wwParam(std::shared_ptr telegram) { has_update(telegram, wwRedTemp_, 10); has_update(telegram, wwDisinfectionTemp_, 12); // (daily heating time thermostat 2F5, offset 9, offset 8 on/off) + has_update(telegram, errorDisp_, 19); +} +// SM100wwParam2 - 0x07AC, Solar Module(0x2A) -> (0x00) +void Water::process_SM100wwParam2(std::shared_ptr telegram) { + has_update(telegram, wwDeltaTRet_, 1); } // SM100wwCirc - 0x07A5 @@ -133,6 +142,7 @@ void Water::process_SM100wwParam(std::shared_ptr telegram) { void Water::process_SM100wwCirc(std::shared_ptr telegram) { has_update(telegram, wwCirc_, 0); has_update(telegram, wwCircMode_, 3); + has_update(telegram, wwCircTc_, 4); // time controled on/off } // SM100wwKeepWarm - 0x7AE, keepWarm @@ -345,6 +355,16 @@ bool Water::set_wwCircMode(const char * value, const int8_t id) { return true; } +// set time controled mode on/off +bool Water::set_wwCircTc(const char * value, const int8_t id) { + bool b; + if (!Helpers::value2bool(value, b)) { + return false; + } + write_command(0x33B + wwc_, 4, b ? 0x01 : 0x00, 0x33B + wwc_); + return true; +} + bool Water::set_wwKeepWarm(const char * value, const int8_t id) { bool b; if (!Helpers::value2bool(value, b)) { @@ -407,4 +427,23 @@ bool Water::set_wwHystOff(const char * value, const int8_t id) { write_command(0x33, 4, n, 0x33); return true; } + +bool Water::set_errorDisp(const char * value, const int8_t id) { + uint8_t n; + if (!Helpers::value2enum(value, n, FL_(enum_errorDisp))) { + return false; + } + write_command(0x7A6, 19, n, 0x7A6); + return true; +} + +bool Water::set_wwDeltaTRet(const char * value, const int8_t id) { + int n; + if (!Helpers::value2number(value, n)) { + return false; + } + write_command(0x7AC, 1, n, 0x7AC); + return true; +} + } // namespace emsesp diff --git a/src/devices/water.h b/src/devices/water.h index 95de288d6..d954c8e79 100644 --- a/src/devices/water.h +++ b/src/devices/water.h @@ -46,6 +46,9 @@ class Water : public EMSdevice { // SM100wwStatus - 0x07AA uint8_t wwPump_; + // SM100wwParam2 - 0x07AC + uint8_t wwDeltaTRet_; + // SM100wwParam - 0x07A6 uint8_t wwMaxTemp_; uint8_t wwSelTemp_; @@ -53,6 +56,7 @@ class Water : public EMSdevice { uint8_t wwDailyTemp_; uint8_t wwDisinfectionTemp_; uint8_t wwHotTemp_; + uint8_t errorDisp_; // error display off/normal/inverted // SM100wwKeepWarm - 0x07AE uint8_t wwKeepWarm_; @@ -60,6 +64,7 @@ class Water : public EMSdevice { // SM100wwCirc - 0x07A5 uint8_t wwCirc_; uint8_t wwCircMode_; + uint8_t wwCircTc_; // SM100wwStatus2 - 0x07E0 uint8_t wwPumpMod_; @@ -83,6 +88,7 @@ class Water : public EMSdevice { void process_SM100wwCommand(std::shared_ptr telegram); void process_SM100wwCirc(std::shared_ptr telegram); void process_SM100wwParam(std::shared_ptr telegram); + void process_SM100wwParam2(std::shared_ptr telegram); void process_SM100wwKeepWarm(std::shared_ptr telegram); void process_SM100ValveStatus(std::shared_ptr telegram); @@ -101,6 +107,7 @@ class Water : public EMSdevice { bool set_wwHotTemp(const char * value, const int8_t id); bool set_wwCirc(const char * value, const int8_t id); bool set_wwCircMode(const char * value, const int8_t id); + bool set_wwCircTc(const char * value, const int8_t id); bool set_wwKeepWarm(const char * value, const int8_t id); bool set_wwDisinfectionTemp(const char * value, const int8_t id); bool set_wwDailyTemp(const char * value, const int8_t id); @@ -111,6 +118,9 @@ class Water : public EMSdevice { bool set_wwFlowTempOffset(const char * value, const int8_t id); bool set_wwHystOn(const char * value, const int8_t id); bool set_wwHystOff(const char * value, const int8_t id); + + bool set_wwDeltaTRet(const char * value, const int8_t id); + bool set_errorDisp(const char * value, const int8_t id); }; } // namespace emsesp diff --git a/src/locale_common.h b/src/locale_common.h index 86b10f48a..a2d327835 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -364,6 +364,9 @@ MAKE_ENUM(enum_blockTerm, FL_(n_o), FL_(n_c)) // Ventilation MAKE_ENUM(enum_ventMode, FL_(auto), FL_(off), FL_(L1), FL_(L2), FL_(L3), FL_(L4), FL_(demand), FL_(sleep), FL_(intense), FL_(bypass), FL_(partymode), FL_(fireplace)) +// water +MAKE_ENUM(enum_errorDisp, FL_(off), FL_(normal), FL_(inverted)) + #pragma GCC diagnostic pop // clang-format on diff --git a/src/locale_translations.h b/src/locale_translations.h index d0f4c9341..033effe57 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -166,6 +166,7 @@ MAKE_WORD_TRANSLATION(intern, "intern", "intern", "intern", "intern", "wewnętrz MAKE_WORD_TRANSLATION(lower, "lower", "niedirger", "lager", "lägre", "mniejszy", "nedre", "inférieur", "daha düşük", "basso") MAKE_WORD_TRANSLATION(error, "error", "Fehler", "error", "Fel", "błąd", "feil", "erreur", "Hata", "errore") MAKE_WORD_TRANSLATION(na, "n/a", "n/a", "n/a", "n/a", "nd.", "n/a", "n/c", "mevcut değil", "n/a") +MAKE_WORD_TRANSLATION(inverted, "inverted", "invertiert", "", "", "", "", "", "", "") // boiler MAKE_WORD_TRANSLATION(time, "time", "Zeit", "tijd", "Tid", "godzina", "tid", "heure", "zaman", "ora") @@ -746,6 +747,9 @@ MAKE_TRANSLATION(wwTemp5, "wwtemp5", "temperature 5", "Temperatur 5", "Temperatu MAKE_TRANSLATION(wwTemp6, "wwtemp6", "temperature 6", "Temperatur 6", "Temperatuur 6", "Temperatur 6", "temperatura 6", "temperatur 6", "température 6", "sıcaklık 6", "Temperatura 6") // MAKE_TRANSLATION(wwTemp7, "wwtemp7", "temperature 7", "Temperatur 7", "Temperatuur 7", "Temperatur 7", "temperatura 7", "Temperatur 7", "température 7", "sıcaklık 7", "Temperatura 7") MAKE_TRANSLATION(wwPump, "wwpump", "pump", "Pumpe", "Pomp", "Pump", "pompa", "pumpe", "pompe", "pompa", "Pompa") +MAKE_TRANSLATION(wwCircTc, "wwcirctc", "circulation time controled", "zeitgesteuerte Zirkulation", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(errorDisp, "errordisp", "error display", "Fehleranzeige", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(deltaTRet, "deltatret", "temp. diff. return valve", "Temperaturdifferenz Rücklaufventil", "", "", "", "", "", "", "") // TODO translate // solar ww and mixer wwc MAKE_TRANSLATION(wwMinTemp, "wwmintemp", "minimum temperature", "minimale Temperatur", "Minimale temperatuur", "Min Temperatur", "temperatura minimalna", "min temperatur", "température min", "minimum sıcaklık", "temperatura minima") MAKE_TRANSLATION(wwRedTemp, "wwredtemp", "reduced temperature", "reduzierte Temperatur", "Gereduceerde temperatuur", "Reducerad Temperatur", "temperatura zredukowana", "reducert temperatur", "température réduite", "düşürülmüş sıcaklık", "temperatura ridotta")