From 91b78f9a23b57c05ce06b274280c580b6d774487 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 10 Nov 2025 09:54:33 +0100 Subject: [PATCH] pumpmode enum for HT3 boilers #2721, add commands manual defrost, chimneysweeper --- src/core/locale_common.h | 1 + src/core/locale_translations.h | 8 +++++ src/devices/boiler.cpp | 56 ++++++++++++++++++++++------- src/devices/boiler.h | 2 ++ src/web/WebCustomizationService.cpp | 4 +-- 5 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/core/locale_common.h b/src/core/locale_common.h index 85536d038..26b5755ff 100644 --- a/src/core/locale_common.h +++ b/src/core/locale_common.h @@ -305,6 +305,7 @@ MAKE_ENUM(enum_maxHeat2, FL_(3kW), FL_(6kW), FL_(9kW)) MAKE_ENUM(enum_pumpMode, FL_(proportional), FL_(deltaP1), FL_(deltaP2), FL_(deltaP3), FL_(deltaP4)) MAKE_ENUM(enum_pumpCharacter, FL_(proportional), FL_(pressure1), FL_(pressure2), FL_(pressure3), FL_(pressure4), FL_(pressure5), FL_(pressure6)) MAKE_ENUM(enum_hpPumpMode, FL_(auto), FL_(continuous)) +MAKE_ENUM(enum_pumpMode2, FL_(pumpstep), FL_(consthigh), FL_(constmed), FL_(constlow), FL_(prophigh), FL_(proplow)) // thermostat lists MAKE_ENUM(enum_ibaMainDisplay, FL_(internal_temperature), FL_(internal_setpoint), FL_(external_temperature), FL_(burner_temperature), FL_(ww_temperature), FL_(functioning_mode), FL_(time), FL_(date), FL_(smoke_temperature)) diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h index 0d1247bd5..499017ad0 100644 --- a/src/core/locale_translations.h +++ b/src/core/locale_translations.h @@ -233,6 +233,12 @@ MAKE_WORD_TRANSLATION(pressure3, "250mbar", "250mbar", "250mbar", "250mbar", "25 MAKE_WORD_TRANSLATION(pressure4, "300mbar", "300mbar", "300mbar", "300mbar", "300mbar", "300mbar", "300mbar", "300mbar", "300mbar", "300mbar", "300mbar") // TODO translate MAKE_WORD_TRANSLATION(pressure5, "350mbar", "350mbar", "350mbar", "350mbar", "350mbar", "350mbar", "350mbar", "350mbar", "350mbar", "350mbar", "350mbar") // TODO translate MAKE_WORD_TRANSLATION(pressure6, "400mbar", "400mbar", "400mbar", "400mbar", "400mbar", "400mbar", "400mbar", "400mbar", "400mbar", "400mbar", "400mbar") // TODO translate +MAKE_WORD_TRANSLATION(pumpstep, "pumpstep", "Stufen") +MAKE_WORD_TRANSLATION(consthigh, "const.high", "konst.hoch") +MAKE_WORD_TRANSLATION(constmed, "const.medium", "konst.mittel") +MAKE_WORD_TRANSLATION(constlow, "const.low", "konst.niedrig") +MAKE_WORD_TRANSLATION(prophigh, "prop.high", "prop.hoch") +MAKE_WORD_TRANSLATION(proplow, "propo.low", "prop.niedrig") // heatpump MAKE_WORD_TRANSLATION(none, "none", "keine", "geen", "ingen", "brak", "ingen", "aucun", "hiçbiri", "nessuno", "žiadny", "žádné") @@ -355,6 +361,7 @@ MAKE_TRANSLATION(haclimate, "haclimate", "mqtt discovery current room temperatur // Entity translations: tag, mqtt, en, de, nl, sv, pl, no, fr, tr, it, sk, cz // Boiler +MAKE_TRANSLATION(chimneysweeper, "chimneysweeper", "chimney sweeper", "Schornsteinfeger", "", "", "", "", "", "", "", "") // TODO translate MAKE_TRANSLATION(reset, "reset", "reset", "Reset", "Reset", "Återställ", "kasowanie komunikatu", "nullstill", "reset", "Sıfırla", "Reset", "reset", "reset") MAKE_TRANSLATION(forceHeatingOff, "heatingoff", "force heating off", "Heizen abschalten", "", "Uppvärmning avstängd", "wymuś wyłączenie grzania", "", "", "", "", "vynútené vypnutie kúrenia", "vynutit vypnutí vytápění") // TODO translate MAKE_TRANSLATION(wwtapactivated, "tapactivated", "turn on/off", "Durchlauferhitzer aktiv", "zet aan/uit", "på/av", "system przygotowywania", "Varmtvann active", "ecs activée", "aç/kapa", "commuta on/off", "zapnúť/vypnúť", "zapnout/vypnout") @@ -524,6 +531,7 @@ MAKE_TRANSLATION(auxHeatMode, "auxheatrmode", "aux heater mode", "Zusatzheizungs MAKE_TRANSLATION(auxMaxLimit, "auxmaxlimit", "aux heater max limit", "Zusatzheizer max. Grenze", "Bijverwarmer grensinstelling maximaal", "Eltillskott max begränsning", "dogrzewacz, maksymalny limit", "tillegsvarme maksgrense", "ilave ısıtıcı maks limit", "limite massimo riscaldatore addizionale", "maximálny limit pomocného ohrievača", "maximální limit pomocného topení") MAKE_TRANSLATION(auxLimitStart, "auxlimitstart", "aux heater limit start", "Zusatzheizer Grenze Start", "Bijverwarmer grens voor start", "Eltillskott begränsningsstart", "dogrzewacz, początek ograniczenia", "tillegsvarme startgrense", "ilave ısıtıcı limir başlangıcı", "avvio limite massimo riscaldatore addizionale", "spustenie limitu pomocného ohrievača", "startovací limit pomocného topení") MAKE_TRANSLATION(auxHeaterSource, "auxheatersource", "aux heater source", "Quelle Zusatzheizer", "", "", "", "", "", "", "", "pomocný zdroj tepla", "") // TODO translate +MAKE_TRANSLATION(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "Handmatige ontdooicyclus", "Manuell avfrostning", "ręczne odladzanie", "manuell avisning", "", "manuel buz çözme", "sbrinamento manuale", "manuálne odmrazovanie", "ruční odmrazování") // TODO translate MAKE_TRANSLATION(pvCooling, "pvcooling", "cooling only with PV", "Kühlen nur mit PV", "Koelen alleen met solar PV", "Kyla endast med solpanel", "chłodzenie tylko z PV", "kjøling med solpanel", "", "sadece PV ile soğutma", "solo raffrescamento con solare", "Chladenie len s FV", "chlazení pouze s FV") // TODO translate MAKE_TRANSLATION(hpCircPumpWw, "hpcircpump", "circulation pump available during dhw", "Zirkulation möglich bei WW-Bereitung", "Circulatiepomp WP beschikbaar tijdens ww", "Värmebärarpump på vid varmvattenberedning", "pompa cyrkulacji dostępna w trakcie c.w.u.", "sirkulasjonspumpe tilgjengelig under varmtvann", "", "SKS esnasında sirkülasyon pompasu uygun", "pompa di circolazione disponibile durante ACS", "obehové čerpadlo k dispozícii počas TÚV", "oběhové čerpadlo dostupné během TUV") // TODO translate MAKE_TRANSLATION(vp_cooling, "vpcooling", "valve/pump cooling", "Ventil/Pumpe für Kühlen", "Klep koeling", "Ventil/Pump kyla", "zawór/pompa chłodzenia", "varmepumpe kjøling", "", "vana/pompa soğuyor", "valvola/pompa raffrescamento", "chladenie ventilu/čerpadla", "ventil/čerpadlo chlazení") // TODO translate diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 954b18491..f5de7d3d9 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -142,7 +142,14 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const // reset is a command uses a dummy variable which is always zero, shown as blank, but provides command enum options register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &reset_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset)); - has_update(reset_, 0); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &reset_, + DeviceValueType::CMD, + FL_(enum_modetype5), + FL_(chimneysweeper), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_chimneysweeper)); + has_update(reset_, 0); // set reset to zero register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &forceHeatingOff_, DeviceValueType::BOOL, @@ -277,8 +284,13 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPump_, DeviceValueType::BOOL, FL_(heatingPump), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMax_, DeviceValueType::UINT8, FL_(pumpModMax), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_pump)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMin_, DeviceValueType::UINT8, FL_(pumpModMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_pump)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &pumpMode_, DeviceValueType::ENUM, FL_(enum_pumpMode), FL_(pumpMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_pumpMode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pumpMode_, + DeviceValueType::ENUM, + model() == EMSdevice::EMS_DEVICE_FLAG_HT3 ? FL_(enum_pumpMode2) : FL_(enum_pumpMode), + FL_(pumpMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_pumpMode)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpCharacter_, DeviceValueType::ENUM, @@ -438,6 +450,13 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const // heatpump info if (isHeatPump()) { + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &reset_, + DeviceValueType::CMD, + FL_(enum_modetype5), + FL_(manDefrost), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_manDefrost)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgTotal_, DeviceValueType::UINT24, @@ -2670,16 +2689,9 @@ bool Boiler::set_max_pump(const char * value, const int8_t id) { bool Boiler::set_pumpMode(const char * value, const int8_t id) { uint8_t v; - if (is_received(EMS_TYPE_UBAParametersPlus)) { - if (Helpers::value2enum(value, v, FL_(enum_pumpCharacter))) { - write_command(EMS_TYPE_UBAParametersPlus, 15, v, EMS_TYPE_UBAParametersPlus); - return true; - } - } else { - if (Helpers::value2enum(value, v, FL_(enum_pumpMode))) { - write_command(EMS_TYPE_UBAParameters, 11, v, EMS_TYPE_UBAParameters); - return true; - } + if (Helpers::value2enum(value, v, model() == EMSdevice::EMS_DEVICE_FLAG_HT3 ? FL_(enum_pumpMode2) : FL_(enum_pumpMode))) { + write_command(EMS_TYPE_UBAParameters, 11, v, EMS_TYPE_UBAParameters); + return true; } return false; } @@ -2979,6 +2991,24 @@ bool Boiler::set_reset(const char * value, const int8_t id) { return false; } +bool Boiler::set_manDefrost(const char * value, const int8_t id) { + bool b; + if (!Helpers::value2bool(value, b)) { + return false; + } + write_command(0x05, 52, b ? 1 : 0); + return true; +} + +bool Boiler::set_chimneysweeper(const char * value, const int8_t id) { + bool b; + if (!Helpers::value2bool(value, b)) { + return false; + } + write_command(0x05, 0x04, b ? 100 : 0); + return true; +} + // maintenance bool Boiler::set_maintenance(const char * value, const int8_t id) { if (value == nullptr) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index d893a911a..51b514aab 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -446,6 +446,8 @@ class Boiler : public EMSdevice { bool set_burn_period(const char * value, const int8_t id); bool set_pump_delay(const char * value, const int8_t id); bool set_reset(const char * value, const int8_t id); + bool set_chimneysweeper(const char * value, const int8_t id); + bool set_manDefrost(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); diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 1d43ce05b..0889eda89 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -105,7 +105,7 @@ StateUpdateResult WebCustomization::update(JsonObject root, WebCustomization & c if (sensor.id == sensor.name) { sensor.name = ""; // no need to store id as name } - sensor.is_system = sensorJson["is_system"]; + sensor.is_system = sensorJson["is_system"] | false; std::replace(sensor.id.begin(), sensor.id.end(), '-', '_'); // change old ids to v3.7 style customizations.sensorCustomizations.push_back(sensor); // add to list } @@ -124,7 +124,7 @@ StateUpdateResult WebCustomization::update(JsonObject root, WebCustomization & c analog.factor = analogJson["factor"]; analog.uom = analogJson["uom"]; analog.type = analogJson["type"]; - analog.is_system = analogJson["is_system"]; + analog.is_system = analogJson["is_system"] | false; if (_start && analog.type == EMSESP::analogsensor_.AnalogType::DIGITAL_OUT && analog.uom > DeviceValue::DeviceValueUOM::NONE) { analog.offset = analog.uom - 1; }