From 5c4aaa451011ae7b935da74c8957947a01af6143 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 20 Feb 2026 09:56:08 +0100 Subject: [PATCH] add pumpkick #2965, dev.8 --- CHANGELOG_LATEST.md | 1 + src/core/locale_translations.h | 4 +++ src/devices/boiler.cpp | 54 ++++++++++++++++++++++++++++++++++ src/devices/boiler.h | 8 +++++ src/emsesp_version.h | 2 +- 5 files changed, 68 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 305f92ea2..9adde9275 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -10,6 +10,7 @@ For more details go to [emsesp.org](https://emsesp.org/). - customize device brand [#2784](https://github.com/emsesp/EMS-ESP32/issues/2784) - set model for ems-esp devices temperature, analog, etc. [#2958](https://github.com/emsesp/EMS-ESP32/discussions/2958) - prometheus metrics for temperature/analog/scheduler/custom [#2962](https://github.com/emsesp/EMS-ESP32/issues/2962) +- boiler pumpkick [#2965](https://github.com/emsesp/EMS-ESP32/discussions/2965) ## Fixed diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h index c7fee26d3..faf364abc 100644 --- a/src/core/locale_translations.h +++ b/src/core/locale_translations.h @@ -424,6 +424,10 @@ MAKE_TRANSLATION(pumpOnTemp, "pumpontemp", "pump logic temperature", "Pumpenlogi MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "Fördelare", "sprzęgło hydrauliczne", "lav tap header", "bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.", "nízkostratová hlavica", "hydraulický oddělovač") MAKE_TRANSLATION(heatblock, "heatblock", "heating block", "Wärmezelle", "Aanvoertemp. warmtecel", "Värmeblock", "blok grzewczy", "varmeblokk", "départ corps de chauffe", "Hid.denge kabı sıcaklığı", "mandata scamb. pr.", "vykurovací blok", "blok topení") +MAKE_TRANSLATION(pumpKickHour, "pumpkickhour", "pump kick hour", "Stunde Pumpkick") +MAKE_TRANSLATION(pumpKickDay, "pumpkickday", "pump kick day", "Tag Pumpkick") +MAKE_TRANSLATION(pumpKickDelay, "pumpkickdelay", "pump kick delay", "Pause vor Pumpkick") + MAKE_TRANSLATION(curveOn, "curveon", "heatingcurve on", "Heizkurve an", "stookkromme aan", "Värmekurva På", "krzywa grzewcza włączona", "varmekurve på", "courbe de chauffage activée", "ısıtma eğrisi açık", "curva di riscaldamento attiva", "vykurovacia krivka zapnutá", "topná křivka zapnutá") MAKE_TRANSLATION(curveBase, "curvebase", "heatingcurve base", "Heizkurve Basis", "stookkromme basis", "Värmekurva Bas", "podstawa krzywej grzewczej", "varmekurve basis", "base de courbe de chauffage", "ısıtma eğrisi tabanı", "base curva di riscaldamento", "základňa vykurovacej krivky", "základ topné křivky") MAKE_TRANSLATION(curveEnd, "curveend", "heatingcurve end", "Heizkurve Ende", "stookkromme einde", "Värmekurva Slut", "koniec krzywej grzewczej", "varmekurve slutt", "fin de courbe de chauffage", "ısıtma eğrisi sonu", "fine curva di riscaldamento", "koniec vykurovacej krivky", "konec topné křivky") diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 1c6157cf9..94cc96969 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -65,6 +65,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0xE6, "UBAParametersPlus", true, MAKE_PF_CB(process_UBAParametersPlus)); register_telegram_type(0xE9, "UBAMonitorWWPlus", false, MAKE_PF_CB(process_UBAMonitorWWPlus)); register_telegram_type(0xEA, "UBAParameterWWPlus", true, MAKE_PF_CB(process_UBAParameterWWPlus)); + register_telegram_type(0xEB, "PumpKick", true, MAKE_PF_CB(process_PumpKick)); register_telegram_type(0x28, "WeatherComp", true, MAKE_PF_CB(process_WeatherComp)); register_telegram_type(0x2E0, "UBASetPoints", false, MAKE_PF_CB(process_UBASetPoints2)); register_telegram_type(0x2CC, "HPPressure", true, MAKE_PF_CB(process_HpPressure)); @@ -355,6 +356,24 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pc1On_, DeviceValueType::BOOL, FL_(pc1On), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pc1Rate_, DeviceValueType::UINT8, FL_(pc1Rate), DeviceValueUOM::PERCENT); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &pumpKickHour_, DeviceValueType::UINT8, FL_(pumpKickHour), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pumpKickHour), 0, 23); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pumpKickDay_, + DeviceValueType::ENUM, + FL_(enum_dayOfWeek), + FL_(pumpKickDay), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_pumpKickDay)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pumpKickDelay_, + DeviceValueType::UINT16, + FL_(pumpKickDelay), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_pumpKickDelay), + 0, + 32767); + /* * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat * thermostat always overwrites settings in boiler @@ -2246,6 +2265,13 @@ void Boiler::process_HpPowerLimit(std::shared_ptr telegram) { has_update(telegram, hpPowerLimit_, 0); } +// 0x0EB +void Boiler::process_PumpKick(std::shared_ptr telegram) { + has_update(telegram, pumpKickHour_, 0); + has_enumupdate(telegram, pumpKickDay_, 1, 1); // 1-mo, ... + has_update(telegram, pumpKickDelay_, 2); +} + // Boiler(0x08) -B-> All(0x00), ?(0x2E), data: 00 00 1C CE 00 00 05 E8 00 00 00 18 00 00 00 02 void Boiler::process_Meters(std::shared_ptr telegram) { has_update(telegram, gasMeterHeat_, 0); @@ -3628,4 +3654,32 @@ bool Boiler::set_shutdown(const char * value, const int8_t id) { return false; } +bool Boiler::set_pumpKickHour(const char * value, const int8_t id) { + int v; + if (Helpers::value2number(value, v, 0, 23)) { + write_command(0xEB, 0, v, 0xEB); + return true; + } + return false; +} + +bool Boiler::set_pumpKickDay(const char * value, const int8_t id) { + uint8_t v; + if (Helpers::value2enum(value, v, FL_(enum_dayOfWeek))) { + write_command(0xEB, 1, v + 1, 0xEB); + return true; + } + return false; +} + +bool Boiler::set_pumpKickDelay(const char * value, const int8_t id) { + int v; + if (Helpers::value2number(value, v, 0, 32767)) { + uint8_t data[2] = {(uint8_t)(v >> 8), (uint8_t)v}; + write_command(0xEB, 2, data, 2, 0xEB); + return true; + } + return false; +} + } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index becd74bb2..c0b7dab9b 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -319,6 +319,9 @@ class Boiler : public EMSdevice { int16_t pc1Flow_; uint8_t pc1Rate_; uint8_t pc1On_; + uint8_t pumpKickHour_; // hour + uint8_t pumpKickDay_; // day 1=mo + uint16_t pumpKickDelay_; // delay minutes after pump running // HIU // uint16_t cwFlowRate_; // cold water flow rate *10 @@ -397,6 +400,7 @@ class Boiler : public EMSdevice { void process_HpFan(std::shared_ptr telegram); void process_HpPower2(std::shared_ptr telegram); void process_HpPowerLimit(std::shared_ptr telegram); + void process_PumpKick(std::shared_ptr telegram); void process_Meters(std::shared_ptr telegram); void process_Energy(std::shared_ptr telegram); @@ -602,6 +606,10 @@ class Boiler : public EMSdevice { bool set_nrgHeat(const char * value, const int8_t id); bool set_nrgWw(const char * value, const int8_t id); bool set_nomPower(const char * value, const int8_t id); + + bool set_pumpKickHour(const char * value, const int8_t id); + bool set_pumpKickDay(const char * value, const int8_t id); + bool set_pumpKickDelay(const char * value, const int8_t id); }; } // namespace emsesp diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 73961265b..5ac15a43a 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.2-dev.7" +#define EMSESP_APP_VERSION "3.8.2-dev.8"