From c414354708058cd6bffb76e90173f92c1dd12351 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 2 Oct 2022 09:52:04 +0200 Subject: [PATCH] climate min/max values --- .../src/project/SettingsCustomization.tsx | 20 ++++++---- src/devices/thermostat.cpp | 23 ++++++++--- src/emsdevice.cpp | 38 +++++++++++++++---- src/emsdevice.h | 1 + src/locale_common.h | 2 +- src/mqtt.cpp | 6 +-- src/mqtt.h | 2 +- 7 files changed, 65 insertions(+), 27 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index f3d36fcbb..afa0f41a8 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -165,17 +165,21 @@ const SettingsCustomization: FC = () => { } function formatName(de: DeviceEntity) { - if (de.n === undefined || de.n === de.id) { - return de.id; - } - - if (de.n[0] === '!') { - return LL.COMMAND() + ': ' + de.n.slice(1); + if (de.n === undefined) { + return ( + <> + ( + + {de.id} + + ) + + ); } return ( <> - {de.cn !== undefined && de.cn !== '' ? de.cn : de.n} + {de.n[0] === '!' ? LL.COMMAND() + ': ' + de.n.slice(1) : de.cn !== undefined && de.cn !== '' ? de.cn : de.n}  ( {de.id} @@ -322,7 +326,7 @@ const SettingsCustomization: FC = () => { }; const editEntity = (de: DeviceEntity) => { - if (de.n && de.n[0] === '!') { + if (de.n === undefined || (de.n && de.n[0] === '!')) { return; } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d1f018194..9c8dd1797 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -3950,7 +3950,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrselTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_temp), 0, 30); } register_device_value(tag, &hc->roomTemp, DeviceValueType::SHORT, roomtemp_divider, FL_(roomTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &hc->climate, DeviceValueType::ENUM, FL_(enum_climate), FL_(climate), DeviceValueUOM::NONE); + register_device_value(tag, &hc->climate, DeviceValueType::ENUM, FL_(enum_climate), FL_(climate), DeviceValueUOM::NONE, nullptr, 5, 30); switch (model) { case EMS_DEVICE_FLAG_RC10: @@ -4135,9 +4135,16 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype3), FL_(modetype), DeviceValueUOM::NONE); register_device_value( - tag, &hc->daytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value( - tag, &hc->nighttemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + tag, &hc->daytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp), 5, 30); + register_device_value(tag, + &hc->nighttemp, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(nighttemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_nighttemp), + 5, + 30); register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp), 30, 90); register_device_value(tag, &hc->offsettemp, @@ -4154,7 +4161,9 @@ void Thermostat::register_device_values_hc(std::shared_ptrtargetflowtemp, DeviceValueType::UINT, FL_(targetflowtemp), DeviceValueUOM::DEGREES); register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 9, 25); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); @@ -4183,7 +4192,9 @@ void Thermostat::register_device_values_hc(std::shared_ptrnoreducetemp, DeviceValueType::INT, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp), -30, 10); register_device_value(tag, &hc->reducetemp, DeviceValueType::INT, FL_(reducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_reducetemp), -20, 10); register_device_value(tag, &hc->vacreducetemp, DeviceValueType::INT, FL_(vacreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_vacreducetemp), -20, 10); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index d95c15f1f..7db14612b 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -986,6 +986,20 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { } } +void EMSdevice::set_climate_minmax(uint8_t tag, int16_t min, uint16_t max) { + for (auto & dv : devicevalues_) { + if (dv.tag == tag && dv.short_name == FL_(climate[0])) { + if (dv.min != min || dv.max != max) { + dv.min = min; + dv.max = max; + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) + } + return; + } + } +} + // set mask per device entity based on the id which is prefixed with the 2 char hex mask value // returns true if the entity has a mask set (not 0 the default) void EMSdevice::setCustomEntity(const std::string & entity_id) { @@ -1009,7 +1023,7 @@ void EMSdevice::setCustomEntity(const std::string & entity_id) { uint8_t new_mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags // if it's a new mask, reconfigure HA - if (Mqtt::ha_enabled() && ((current_mask ^ new_mask) & (DeviceValueState::DV_READONLY >> 4))) { + if (Mqtt::ha_enabled() && (has_custom_name || ((current_mask ^ new_mask) & (DeviceValueState::DV_READONLY >> 4)))) { // remove ha config on change of dv_readonly flag dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) @@ -1024,7 +1038,13 @@ void EMSdevice::setCustomEntity(const std::string & entity_id) { } else { dv.custom_fullname = ""; } + + auto min = dv.min; + auto max = dv.max; dv.set_custom_minmax(); + if (dv.short_name == FL_(seltemp)[0] && (min != dv.min || max != dv.max)) { + set_climate_minmax(dv.tag, dv.min, dv.max); + } return; } } @@ -1192,11 +1212,13 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 break; } - // set the min and max - int16_t dv_set_min, dv_set_max; - if (dv.get_min_max(dv_set_min, dv_set_max)) { - json["min"] = dv_set_min; - json["max"] = dv_set_max; + // set the min and max only for commands + if (dv.has_cmd) { + int16_t dv_set_min, dv_set_max; + if (dv.get_min_max(dv_set_min, dv_set_max)) { + json["min"] = dv_set_min; + json["max"] = dv_set_max; + } } // add uom if it's not a " " (single space) @@ -1474,12 +1496,12 @@ void EMSdevice::mqtt_ha_entity_config_create() { if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); - Mqtt::publish_ha_climate_config(dv.tag, true); + Mqtt::publish_ha_climate_config(dv.tag, true, false, dv.min, dv.max); } else if (*(int8_t *)(dv.value_p) == 0 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); - Mqtt::publish_ha_climate_config(dv.tag, false); + Mqtt::publish_ha_climate_config(dv.tag, false, false, dv.min, dv.max); } } if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && (dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) diff --git a/src/emsdevice.h b/src/emsdevice.h index 0ff13ba38..519f58326 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -187,6 +187,7 @@ class EMSdevice { void list_device_entries(JsonObject & output) const; void add_handlers_ignored(const uint16_t handler); + void set_climate_minmax(uint8_t tag, int16_t min, uint16_t max); void setCustomEntity(const std::string & entity_id); void getCustomEntities(std::vector & entity_ids); diff --git a/src/locale_common.h b/src/locale_common.h index 13766f233..7a568be62 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -273,7 +273,7 @@ MAKE_PSTR(response, "response") MAKE_PSTR(tag_boiler_data_ww_mqtt, "ww") MAKE_PSTR(tag_device_data_ww_mqtt, "") -MAKE_PSTR_LIST(climate, F("HA climate config creation")) +MAKE_PSTR_LIST(climate, F("HA climate config creation"), F("")) // empty fullname // syslog MAKE_PSTR_LIST(list_syslog_level, F("off"), F("emerg"), F("alert"), F("crit"), F("error"), F("warn"), F("notice"), F("info"), F("debug"), F("trace"), F("all")) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index c5f930993..a0e6aae0a 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1248,7 +1248,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, publish_ha(topic, doc.as()); } -void Mqtt::publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove) { +void Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, const bool remove, const int16_t min, const uint16_t max) { uint8_t hc_num = tag - DeviceValueTAG::TAG_HC1 + 1; char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; @@ -1321,8 +1321,8 @@ void Mqtt::publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove doc["curr_temp_tpl"] = currtemp_s; } - doc["min_temp"] = Helpers::render_value(min_s, (uint32_t)5, 0, EMSESP::system_.fahrenheit() ? 2 : 0); - doc["max_temp"] = Helpers::render_value(max_s, (uint32_t)30, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + doc["min_temp"] = Helpers::render_value(min_s, min, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + doc["max_temp"] = Helpers::render_value(max_s, max, 0, EMSESP::system_.fahrenheit() ? 2 : 0); doc["temp_step"] = "0.5"; // the HA climate component only responds to auto, heat and off diff --git a/src/mqtt.h b/src/mqtt.h index 26cfb51dc..ffc93ab34 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -108,7 +108,7 @@ class Mqtt { const JsonObject & dev_json); static void publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom); - static void publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove = false); + static void publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, const bool remove = false, const int16_t min = 5, const uint16_t max = 30); static void show_topic_handlers(uuid::console::Shell & shell, const uint8_t device_type); static void show_mqtt(uuid::console::Shell & shell);