diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 1614b7824..85b3a5148 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -83,6 +83,8 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x48B, "HPPumps", true, MAKE_PF_CB(process_HpPumps)); register_telegram_type(0x491, "HPAdditionalHeater", true, MAKE_PF_CB(process_HpAdditionalHeater)); register_telegram_type(0x499, "HPDhwSettings", true, MAKE_PF_CB(process_HpDhwSettings)); + register_telegram_type(0x49C, "HPSettings2", true, MAKE_PF_CB(process_HpSettings2)); + register_telegram_type(0x49D, "HPSettings3", true, MAKE_PF_CB(process_HpSettings3)); } /* @@ -555,6 +557,40 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_tempDiffCool), 3, 10); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &vp_cooling_, DeviceValueType::BOOL, FL_(vp_cooling), DeviceValueUOM::NONE, MAKE_CF_CB(set_vp_cooling)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatCable_, DeviceValueType::BOOL, FL_(heatCable), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatCable)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &VC0valve_, DeviceValueType::BOOL, FL_(VC0valve), DeviceValueUOM::NONE, MAKE_CF_CB(set_VC0valve)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &primePump_, DeviceValueType::BOOL, FL_(primePump), DeviceValueUOM::NONE, MAKE_CF_CB(set_primePump)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &primePumpMod_, + DeviceValueType::UINT, + FL_(primePumpMod), + DeviceValueUOM::PERCENT, + MAKE_CF_CB(set_primePumpMod)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &hp3wayValve_, + DeviceValueType::BOOL, + FL_(hp3wayValve), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_hp3wayValve)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &elHeatStep1_, + DeviceValueType::BOOL, + FL_(elHeatStep1), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_elHeatStep1)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &elHeatStep2_, + DeviceValueType::BOOL, + FL_(elHeatStep2), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_elHeatStep2)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &elHeatStep3_, + DeviceValueType::BOOL, + FL_(elHeatStep3), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_elHeatStep3)); // heatpump DHW settings register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwComfOffTemp_, @@ -1448,6 +1484,25 @@ void Boiler::process_HpDhwSettings(std::shared_ptr telegram) { has_update(telegram, wwEcoPlusOffTemp_, 5); } +// 0x49C: +// Boiler(0x08) -B-> All(0x00), ?(0x049C), data: 00 00 00 00 +void Boiler::process_HpSettings2(std::shared_ptr telegram) { + has_update(telegram, vp_cooling_, 3); +} + +// 0x49D +// Boiler(0x08) -B-> All(0x00), ?(0x049D), data: 00 00 00 00 00 00 00 00 00 00 00 00 +void Boiler::process_HpSettings3(std::shared_ptr telegram) { + has_update(telegram, heatCable_, 2); + has_update(telegram, VC0valve_, 3); + has_update(telegram, primePump_, 4); + has_update(telegram, primePumpMod_, 5); + has_update(telegram, hp3wayValve_, 6); + has_update(telegram, elHeatStep1_, 7); + has_update(telegram, elHeatStep2_, 8); + has_update(telegram, elHeatStep3_, 9); +} + /* * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat * thermostat always overwrites settings in boiler @@ -2350,4 +2405,67 @@ bool Boiler::set_hpCircPumpWw(const char * value, const int8_t id) { return false; } +bool Boiler::set_vp_cooling(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x49C, 3, v ? 1 : 0, 0x49C); + return true; + } + return false; +} + +bool Boiler::set_heatCable(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x49D, 2, v ? 1 : 0, 0x49D); + return true; + } + return false; +} + +bool Boiler::set_VC0valve(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x49D, 3, v ? 1 : 0, 0x49D); + return true; + } + return false; +} + +bool Boiler::set_primePump(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x49D, 4, v ? 1 : 0, 0x49D); + return true; + } + return false; +} + +bool Boiler::set_primePumpMod(const char * value, const int8_t id) { + int v; + if (Helpers::value2number(value, v)) { + write_command(0x49D, 5, v, 0x49D); + return true; + } + return false; +} + +bool Boiler::set_hp3wayValve(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x49D, 6, v ? 1 : 0, 0x49D); + return true; + } + return false; +} + +bool Boiler::set_elHeatStep(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x49D, 6 + id, v ? 1 : 0, 0x49D); + return true; + } + return false; +} + } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 9a3451ef0..2ceccf52c 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -235,6 +235,16 @@ class Boiler : public EMSdevice { uint8_t wwEcoOffTemp_; uint8_t wwEcoPlusOffTemp_; + uint8_t vp_cooling_; + uint8_t heatCable_; + uint8_t VC0valve_; + uint8_t primePump_; + uint8_t primePumpMod_; + uint8_t hp3wayValve_; + uint8_t elHeatStep1_; + uint8_t elHeatStep2_; + uint8_t elHeatStep3_; + /* // Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat // thermostat always overwrites settings in boiler @@ -287,6 +297,8 @@ class Boiler : public EMSdevice { void process_HpValve(std::shared_ptr telegram); void process_HpPumps(std::shared_ptr telegram); void process_HpDhwSettings(std::shared_ptr telegram); + void process_HpSettings2(std::shared_ptr telegram); + void process_HpSettings3(std::shared_ptr telegram); // commands - none of these use the additional id parameter bool set_ww_mode(const char * value, const int8_t id); @@ -395,6 +407,22 @@ class Boiler : public EMSdevice { inline bool set_wwEcoPlusOffTemp(const char * value, const int8_t id) { return set_wwOffTemp(value, 5); } + bool set_vp_cooling(const char * value, const int8_t id); + bool set_heatCable(const char * value, const int8_t id); + bool set_VC0valve(const char * value, const int8_t id); + bool set_primePump(const char * value, const int8_t id); + bool set_primePumpMod(const char * value, const int8_t id); + bool set_hp3wayValve(const char * value, const int8_t id); + bool set_elHeatStep(const char * value, const int8_t id); + inline bool set_elHeatStep1(const char * value, const int8_t id) { + return set_elHeatStep(value, 1); + } + inline bool set_elHeatStep2(const char * value, const int8_t id) { + return set_elHeatStep(value, 2); + } + inline bool set_elHeatStep3(const char * value, const int8_t id) { + return set_elHeatStep(value, 3); + } /* bool set_hybridStrategy(const char * value, const int8_t id); bool set_switchOverTemp(const char * value, const int8_t id); diff --git a/src/locale_translations.h b/src/locale_translations.h index 6a1206191..6d4ef260e 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -405,6 +405,14 @@ MAKE_PSTR_LIST(auxMaxTemp, "auxmaxtemp", "aux heater max temperature", "Zusatzhe MAKE_PSTR_LIST(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "", "", "", "", "") // TODO translate MAKE_PSTR_LIST(pvCooling, "pvcooling", "Cooling only with PV", "Kühlen nur mit PV", "", "", "", "", "") // TODO translate MAKE_PSTR_LIST(hpCircPumpWw, "hpcircpumpww", "circulation pump available during dhw", "", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(vp_cooling, "vpcooling", "valve/pump cooling") // TODO translate +MAKE_PSTR_LIST(VC0valve, "vc0valve", "VC0 valve") // TODO translate +MAKE_PSTR_LIST(primePump, "primepump", "primary heatpump") // TODO translate +MAKE_PSTR_LIST(primePumpMod, "primepumpmod", "primary heatpump modulation") // TODO translate +MAKE_PSTR_LIST(hp3wayValve, "hp3way", "3-way valve") // TODO translate +MAKE_PSTR_LIST(elHeatStep1, "elheatstep1", "el. heater step 1") // TODO translate +MAKE_PSTR_LIST(elHeatStep2, "elheatstep2", "el. heater step 2") // TODO translate +MAKE_PSTR_LIST(elHeatStep3, "elheatstep3", "el. heater step 3") // TODO translate // hybrid heatpump MAKE_PSTR_LIST(hybridStrategy, "hybridstrategy", "hybrid control strategy", "Hybrid Strategie", "Hybride strategie", "Hybrid kontrollstrategi", "strategia sterowania hybrydowego", "hybrid kontrollstrategi", "stratégie contrôle hybride")