From 21c23e1fd85dda1530641e63b6cb6e286fdd1f58 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 2 Aug 2024 12:04:17 +0200 Subject: [PATCH 1/4] remove useless http check --- src/web/WebSchedulerService.cpp | 2 +- src/web/shuntingYard.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index de72da031..5296e46f8 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -346,7 +346,7 @@ bool WebSchedulerService::command(const char * name, const std::string & command commands(s, false); url.replace(q + 1, l, s); } - if (!url.find("http") && http.begin(url.c_str())) { + if (http.begin(url.c_str())) { // add any given headers for (JsonPair p : doc["header"].as()) { http.addHeader(p.key().c_str(), p.value().as().c_str()); diff --git a/src/web/shuntingYard.hpp b/src/web/shuntingYard.hpp index 46f5b2174..09e9fffcf 100644 --- a/src/web/shuntingYard.hpp +++ b/src/web/shuntingYard.hpp @@ -614,7 +614,7 @@ std::string compute(const std::string & expr) { if (DeserializationError::Ok == deserializeJson(doc, cmd)) { HTTPClient http; std::string url = doc["url"] | ""; - if (!url.find("http") && http.begin(url.c_str())) { + if (http.begin(url.c_str())) { int httpResult = 0; for (JsonPair p : doc["header"].as()) { http.addHeader(p.key().c_str(), p.value().as().c_str()); From aeafb5f5663f69fdbcfc410957a9334c0421ce61 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 2 Aug 2024 12:05:49 +0200 Subject: [PATCH 2/4] remove useless boiler setBurnPow and wrong wwsetpumppow #1910 --- src/devices/boiler.cpp | 12 +++++------- src/devices/boiler.h | 3 --- src/locale_translations.h | 1 - src/modbus_entity_parameters.hpp | 6 +++--- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index df138beb4..5e3f5f1e3 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -283,8 +283,6 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_pumpCharacter)); register_device_value( DeviceValueTAG::TAG_DEVICE_DATA, &pumpDelay_, DeviceValueType::UINT8, FL_(pumpDelay), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_pump_delay), 0, 60); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &setFlowTemp_, DeviceValueType::UINT8, FL_(setFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &setBurnPow_, DeviceValueType::UINT8, FL_(setBurnPow), DeviceValueUOM::PERCENT); register_device_value( DeviceValueTAG::TAG_DEVICE_DATA, &selBurnPow_, DeviceValueType::UINT8, FL_(selBurnPow), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_burn_power), 0, 254); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &curBurnPow_, DeviceValueType::UINT8, FL_(curBurnPow), DeviceValueUOM::PERCENT); @@ -986,7 +984,6 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DHW1, &wwTempOK_, DeviceValueType::BOOL, FL_(wwTempOK), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DHW1, &wwActive_, DeviceValueType::BOOL, FL_(wwActive), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DHW1, &ww3wayValve_, DeviceValueType::BOOL, FL_(ww3wayValve), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DHW1, &wwSetPumpPower_, DeviceValueType::UINT8, FL_(wwSetPumpPower), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DHW1, &wwMixerTemp_, DeviceValueType::UINT16, @@ -1731,12 +1728,13 @@ void Boiler::process_UBAOutdoorTemp(std::shared_ptr telegram) { // UBASetPoint 0x1A void Boiler::process_UBASetPoints(std::shared_ptr telegram) { - has_update(telegram, setFlowTemp_, 0); // boiler set temp from thermostat - has_update(telegram, setBurnPow_, 1); // max burner power in % - has_update(telegram, wwSetPumpPower_, 2); // ww pump speed/power? + uint8_t setFlowTemp_, setBurnPow_, wwSetBurnPow_; + telegram->read_value(setFlowTemp_, 0); + telegram->read_value(setBurnPow_, 1); + telegram->read_value(wwSetBurnPow_, 2); // overwrite other settings on receive? - if (forceHeatingOff_ == EMS_VALUE_BOOL_ON && telegram->dest == 0x08 && (setFlowTemp_ + setBurnPow_ + wwSetPumpPower_) != 0) { + if (forceHeatingOff_ == EMS_VALUE_BOOL_ON && telegram->dest == 0x08 && (setFlowTemp_ + setBurnPow_ + wwSetBurnPow_) != 0) { uint8_t data[] = {0, 0, 0, 0}; write_command(EMS_TYPE_UBASetPoints, 0, data, sizeof(data), 0); } diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 172fcd9f0..dc12d7c72 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -81,7 +81,6 @@ class Boiler : public EMSdevice { uint8_t wwTempOK_; // DHW temperature ok on/off uint8_t wwActive_; // uint8_t ww3wayValve_; // 3-way valve on WW - uint8_t wwSetPumpPower_; // ww pump speed/power? uint8_t wwFlowTempOffset_; // Boiler offset for ww heating uint8_t wwMaxPower_; // DHW maximum power uint8_t wwMaxTemp_; // DHW maximum temperature @@ -139,9 +138,7 @@ class Boiler : public EMSdevice { int8_t boilHystOff_; int8_t boil2HystOn_; int8_t boil2HystOff_; - uint8_t setFlowTemp_; // boiler setpoint temp uint8_t curBurnPow_; // Burner current power % - uint8_t setBurnPow_; // max output power in % uint32_t burnStarts_; // burner restarts uint32_t heatStarts_; // burner starts for heating uint32_t burnWorkMin_; // Total burner operating time diff --git a/src/locale_translations.h b/src/locale_translations.h index 6b93877d2..2f4fb023f 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -605,7 +605,6 @@ MAKE_TRANSLATION(wwRecharging, "recharging", "recharging", "Nachladen", "herlade MAKE_TRANSLATION(wwTempOK, "tempok", "temperature ok", "Temperatur ok", "Temperatuur OK", "Temperatur OK", "temperatura OK", "temperatur ok!", "température ok", "sıcaklık tamam", "Temperatura OK", "teplota ok") MAKE_TRANSLATION(wwActive, "active", "active", "aktiv", "Actief", "Aktiv", "aktywna", "aktiv", "actif", "devrede", "attivo", "aktívny") MAKE_TRANSLATION(ww3wayValve, "3wayvalve", "3-way valve active", "3-Wegeventil aktiv", "3-wegklep actief", "Trevägsventil aktiv", "zawór 3-drogowy aktywny", "aktiv trevisventil", "vanne 3 voies active", "3 yollu vana", "valvola 3-vie", "3-cestný ventil aktívny") -MAKE_TRANSLATION(wwSetPumpPower, "setpumppower", "set pump power", "Soll Pumpenleistung", "Streefwaarde pompvermogen", "Vald pumpeffekt", "ustawione wysterowanie pompy", "valgt pumpeeffekt", "régler puissance pompe", "ayarlı pompa gücü", "imposta potenza pompa", "nastaviť výkon čerpadla") MAKE_TRANSLATION(wwMixerTemp, "mixertemp", "mixer temperature", "Mischertemperatur", "Mixertemperatuur", "Blandningsventil-tempertur", "temperatura mieszacza", "temperatur blandeventil", "température mélangeur", "karıştırıcı sıcaklığı", "temperatura miscelatore", "teplota mixéra") MAKE_TRANSLATION(wwStarts, "starts", "starts", "Anzahl Starts", "Aantal starts", "Antal starter", "liczba załączeń", "antall starter", "démarrages", "başlıyor", "avvii", "Počet štartov") MAKE_TRANSLATION(wwStarts2, "starts2", "control starts2", "Kreis 2 Anzahl Starts", "Aantal starts circuit 2", "Antal starter Krets 2", "liczba załączeń 2", "antall starter krets 2", "démarrages contrôle 2", "devre 2 başlıyor", "avvii controllati 2", "Okruh 2 počet štartov") diff --git a/src/modbus_entity_parameters.hpp b/src/modbus_entity_parameters.hpp index 5d3b7f18f..9a22fd2ea 100644 --- a/src/modbus_entity_parameters.hpp +++ b/src/modbus_entity_parameters.hpp @@ -37,8 +37,8 @@ const std::initializer_list Modbus::modbus_register_ma REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(pumpMode), 18, 1), // pumpmode REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(pumpCharacter), 19, 1), // pumpcharacter REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(pumpDelay), 20, 1), // pumpdelay - REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(setFlowTemp), 21, 1), // setflowtemp - REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(setBurnPow), 22, 1), // setburnpow + // REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(setFlowTemp), 21, 1), // setflowtemp + // REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(setBurnPow), 22, 1), // setburnpow REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(selBurnPow), 23, 1), // selburnpow REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curBurnPow), 24, 1), // curburnpow REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(burnStarts), 25, 2), // burnstarts @@ -239,7 +239,7 @@ const std::initializer_list Modbus::modbus_register_ma REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(wwTempOK), 60, 1), // tempok REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(wwActive), 61, 1), // active REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(ww3wayValve), 62, 1), // 3wayvalve - REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(wwSetPumpPower), 63, 1), // setpumppower + // REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(wwSetPumpPower), 63, 1), // setpumppower REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(wwMixerTemp), 64, 1), // mixertemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(cylMiddleTemp), 65, 1), // cylmiddletemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(wwStarts), 66, 2), // starts From ab587fa1b72a9b56a6249634e851d2b46a63e880 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 2 Aug 2024 12:40:16 +0200 Subject: [PATCH 3/4] move 6x identical code to one function `add_ha_bool` --- src/analogsensor.cpp | 24 ++--------------------- src/mqtt.cpp | 31 +++++++++++++++++------------- src/mqtt.h | 1 + src/shower.cpp | 12 +----------- src/web/WebCustomEntityService.cpp | 12 +----------- src/web/WebSchedulerService.cpp | 13 +------------ 6 files changed, 24 insertions(+), 69 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index d317c2844..942c6e0e5 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -572,17 +572,7 @@ void AnalogSensor::publish_values(const bool force) { snprintf(topic, sizeof(topic), "switch/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio()); snprintf(command_topic, sizeof(command_topic), "%s/%s/%s", Mqtt::base().c_str(), F_(analogsensor), sensor.name().c_str()); config["cmd_t"] = command_topic; - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - config["pl_on"] = true; - config["pl_off"] = false; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - config["pl_on"] = 1; - config["pl_off"] = 0; - } else { - char result[12]; - config["pl_on"] = Helpers::render_boolean(result, true); - config["pl_off"] = Helpers::render_boolean(result, false); - } + Mqtt::add_ha_bool(config); } else if (sensor.type() == AnalogType::DIGITAL_OUT) { // DAC snprintf(topic, sizeof(topic), "number/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio()); snprintf(command_topic, sizeof(command_topic), "%s/%s/%s", Mqtt::base().c_str(), F_(analogsensor), sensor.name().c_str()); @@ -608,17 +598,7 @@ void AnalogSensor::publish_values(const bool force) { // config["step"] = sensor.factor(); } else if (sensor.type() == AnalogType::DIGITAL_IN) { snprintf(topic, sizeof(topic), "binary_sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio()); - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - config["pl_on"] = true; - config["pl_off"] = false; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - config["pl_on"] = 1; - config["pl_off"] = 0; - } else { - char result[12]; - config["pl_on"] = Helpers::render_boolean(result, true); - config["pl_off"] = Helpers::render_boolean(result, false); - } + Mqtt::add_ha_bool(config); } else { snprintf(topic, sizeof(topic), "sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio()); config["stat_cla"] = "measurement"; diff --git a/src/mqtt.cpp b/src/mqtt.cpp index c161b3e49..8f044bd14 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1113,19 +1113,8 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // applies to both Binary Sensor (read only) and a Switch (for a command) // has no unit of measure or icon if (type == DeviceValueType::BOOL) { - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - doc["pl_on"] = true; - doc["pl_off"] = false; - snprintf(sample_val, sizeof(sample_val), "false"); - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - doc["pl_on"] = 1; - doc["pl_off"] = 0; - } else { - char result[12]; - doc["pl_on"] = Helpers::render_boolean(result, true); - doc["pl_off"] = Helpers::render_boolean(result, false); - snprintf(sample_val, sizeof(sample_val), "'%s'", Helpers::render_boolean(result, false)); - } + add_ha_bool(doc); + Helpers::render_boolean(sample_val, false); } doc["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else " + sample_val + "}}"; @@ -1449,4 +1438,20 @@ void Mqtt::add_ha_sections_to_doc(const char * name, } } +void Mqtt::add_ha_bool(JsonDocument & config) { + const char * pl_on = "pl_on"; + const char * pl_off = "pl_off"; + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + config[pl_on] = true; + config[pl_off] = false; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + config[pl_on] = 1; + config[pl_off] = 0; + } else { + char result[12]; + config[pl_on] = Helpers::render_boolean(result, true); + config[pl_off] = Helpers::render_boolean(result, false); + } +} + } // namespace emsesp \ No newline at end of file diff --git a/src/mqtt.h b/src/mqtt.h index c4acca9de..7a1688b78 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -231,6 +231,7 @@ class Mqtt { const char * cond1 = nullptr, const char * cond2 = nullptr, const char * negcond = nullptr); + static void add_ha_bool(JsonDocument & config); private: static uuid::log::Logger logger_; diff --git a/src/shower.cpp b/src/shower.cpp index 729ee2dfc..3d33b4ad3 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -202,17 +202,7 @@ void Shower::set_shower_state(bool state, bool force) { snprintf(stat_t, sizeof(stat_t), "%s/shower_active", Mqtt::base().c_str()); doc["stat_t"] = stat_t; - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - doc["pl_on"] = "true"; - doc["pl_off"] = "false"; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - doc["pl_on"] = 1; - doc["pl_off"] = 0; - } else { - char result[12]; - doc["pl_on"] = Helpers::render_boolean(result, true); - doc["pl_off"] = Helpers::render_boolean(result, false); - } + Mqtt::add_ha_bool(doc); Mqtt::add_ha_sections_to_doc("shower", stat_t, doc, true); // create first dev & ids diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index 989f760da..4ddacf70a 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -405,17 +405,7 @@ void WebCustomEntityService::publish(const bool force) { if (entityItem.value_type == DeviceValueType::BOOL) { // applies to both Binary Sensor (read only) and a Switch (for a command) - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - config["pl_on"] = true; - config["pl_off"] = false; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - config["pl_on"] = 1; - config["pl_off"] = 0; - } else { - char result[12]; - config["pl_on"] = Helpers::render_boolean(result, true); - config["pl_off"] = Helpers::render_boolean(result, false); - } + Mqtt::add_ha_bool(config); } Mqtt::add_ha_uom(config.as(), entityItem.value_type, entityItem.uom); // add uom diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 5296e46f8..0b60ad849 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -280,18 +280,7 @@ void WebSchedulerService::publish(const bool force) { snprintf(command_topic, sizeof(command_topic), "%s/%s/%s", Mqtt::base().c_str(), F_(scheduler), scheduleItem.name.c_str()); config["cmd_t"] = command_topic; - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - config["pl_on"] = true; - config["pl_off"] = false; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - config["pl_on"] = 1; - config["pl_off"] = 0; - } else { - char result[12]; - config["pl_on"] = Helpers::render_boolean(result, true); - config["pl_off"] = Helpers::render_boolean(result, false); - } - + Mqtt::add_ha_bool(config); Mqtt::add_ha_sections_to_doc(F_(scheduler), stat_t, config, !ha_created, val_cond); ha_created |= Mqtt::queue_ha(topic, config.as()); From 732949fdb80880e34d12892fcf13bf7d1b230f72 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 2 Aug 2024 14:16:37 +0200 Subject: [PATCH 4/4] fix api `no dhw in boiler` --- src/command.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index f0642d3de..5f5d3a064 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -98,7 +98,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec // some commands may be prefixed with hc. dhw. or hc/ or dhw/ so extract these if they exist // parse_command_string returns the extracted command - if (device_type > EMSdevice::DeviceType::BOILER) { + if (device_type >= EMSdevice::DeviceType::BOILER) { command_p = parse_command_string(command_p, id_n); } if (command_p == nullptr) { @@ -151,7 +151,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec data_p = device_end + 1; int8_t id_d = -1; uint8_t device_type = EMSdevice::device_name_2_device_type(device_p); - if (device_type > EMSdevice::DeviceType::BOILER) { + if (device_type >= EMSdevice::DeviceType::BOILER) { data_p = parse_command_string(data_p, id_d); } if (data_p == nullptr) {