From 5e07e9a11be26a49738bf220226d1c4c8aafce0a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 8 Jan 2026 12:06:48 +0100 Subject: [PATCH] add ha number mode selection #2900 --- interface/src/app/settings/MqttSettings.tsx | 14 ++++++++++++++ interface/src/i18n/cz/index.ts | 1 + interface/src/i18n/de/index.ts | 1 + interface/src/i18n/en/index.ts | 1 + interface/src/i18n/fr/index.ts | 1 + interface/src/i18n/it/index.ts | 1 + interface/src/i18n/nl/index.ts | 1 + interface/src/i18n/no/index.ts | 1 + interface/src/i18n/pl/index.ts | 1 + interface/src/i18n/sk/index.ts | 1 + interface/src/i18n/sv/index.ts | 1 + interface/src/i18n/tr/index.ts | 1 + interface/src/types/mqtt.ts | 1 + src/ESP32React/MqttSettingsService.cpp | 2 ++ src/ESP32React/MqttSettingsService.h | 1 + src/core/default_settings.h | 4 ++++ src/core/mqtt.cpp | 10 ++++++++-- src/core/mqtt.h | 1 + 18 files changed, 42 insertions(+), 2 deletions(-) diff --git a/interface/src/app/settings/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx index 2d02f94b3..662f9a620 100644 --- a/interface/src/app/settings/MqttSettings.tsx +++ b/interface/src/app/settings/MqttSettings.tsx @@ -411,6 +411,20 @@ const MqttSettings = () => { + + + Box + Slider + + )} diff --git a/interface/src/i18n/cz/index.ts b/interface/src/i18n/cz/index.ts index efc1c6887..cc8173df0 100644 --- a/interface/src/i18n/cz/index.ts +++ b/interface/src/i18n/cz/index.ts @@ -219,6 +219,7 @@ const cz: Translation = { MQTT_PUBLISH_TEXT_3: 'Povolit MQTT Discovery', MQTT_PUBLISH_TEXT_4: 'Prefix pro Discovery témata', MQTT_PUBLISH_TEXT_5: 'Typ Discovery', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Intervaly publikování', MQTT_INT_BOILER: 'Kotle a tepelná čerpadla', MQTT_INT_THERMOSTATS: 'Termostaty', diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 8aa4e1dc8..969708d2d 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -219,6 +219,7 @@ const de: Translation = { MQTT_PUBLISH_TEXT_3: 'Aktiviere `MQTT Discovery`', MQTT_PUBLISH_TEXT_4: 'Prefix für die `Discovery`-Topics', MQTT_PUBLISH_TEXT_5: 'Discovery Typ', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Veröffentlichungs-Intervalle', MQTT_INT_BOILER: 'Boiler und Wärmepumpen', MQTT_INT_THERMOSTATS: 'Thermostate', diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index bdb05a480..c561cd0ba 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -219,6 +219,7 @@ const en: Translation = { MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery', MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics', MQTT_PUBLISH_TEXT_5: 'Discovery type', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Publish Intervals', MQTT_INT_BOILER: 'Boilers and Heat Pumps', MQTT_INT_THERMOSTATS: 'Thermostats', diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 008df1fcd..80499a5df 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -219,6 +219,7 @@ const fr: Translation = { MQTT_PUBLISH_TEXT_3: 'Activer la découverte MQTT', MQTT_PUBLISH_TEXT_4: 'Préfixe pour les topics découverte', MQTT_PUBLISH_TEXT_5: 'Type de découverte', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Intervalles de publication', MQTT_INT_BOILER: 'Chaudières et pompes à chaleur', MQTT_INT_THERMOSTATS: 'Thermostats', diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index cd38ed18a..f8d557d94 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -219,6 +219,7 @@ const it: Translation = { MQTT_PUBLISH_TEXT_3: 'Abilita rilevamento MQTT (Home Assistant, Domoticz)', MQTT_PUBLISH_TEXT_4: 'Prefisso per gli argomenti di scoperta', MQTT_PUBLISH_TEXT_5: 'Discovery type', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Pubblica intervalli', MQTT_INT_BOILER: 'Caldaie e Pompe di Calore', MQTT_INT_THERMOSTATS: 'Termostati', diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index 3f23c42db..57d026140 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -219,6 +219,7 @@ const nl: Translation = { MQTT_PUBLISH_TEXT_3: 'Activeer MQTT Discovery', MQTT_PUBLISH_TEXT_4: 'Prefix voor de Discovery topics', MQTT_PUBLISH_TEXT_5: 'Discovery type', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Publicatie intervallen', MQTT_INT_BOILER: 'CV ketels en warmtepompen', MQTT_INT_THERMOSTATS: 'Thermostaten', diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 88af2bc43..60d0a485d 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -219,6 +219,7 @@ const no: Translation = { MQTT_PUBLISH_TEXT_3: 'Aktiver MQTT Discovery', MQTT_PUBLISH_TEXT_4: 'Prefiks for Discovery topics', MQTT_PUBLISH_TEXT_5: 'Discovery type', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Publiseringsintervall', MQTT_INT_BOILER: 'Fyr/Varmepumpe', MQTT_INT_THERMOSTATS: 'Termostat', diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 07b003447..2135d8e97 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -219,6 +219,7 @@ const pl: BaseTranslation = { MQTT_PUBLISH_TEXT_3: 'Włącz opcję "MQTT discovery"', MQTT_PUBLISH_TEXT_4: 'Prefiks dla "MQTT discovery"', MQTT_PUBLISH_TEXT_5: 'Typ "MQTT discovery"', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Interwały publikowania', MQTT_INT_BOILER: 'Kotły i pompy ciepła', MQTT_INT_THERMOSTATS: 'Termostaty', diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index 7950f2e05..635d1eb4c 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -219,6 +219,7 @@ const sk: Translation = { MQTT_PUBLISH_TEXT_3: 'Povolenie zisťovania MQTT', MQTT_PUBLISH_TEXT_4: 'Predpona tém Discovery', MQTT_PUBLISH_TEXT_5: 'Typ zistenia', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Intervaly zverejňovania', MQTT_INT_BOILER: 'Kotly a tepelné čerpadlá', MQTT_INT_THERMOSTATS: 'Termostaty', diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index a8fd58d23..79bee288f 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -219,6 +219,7 @@ const sv: Translation = { MQTT_PUBLISH_TEXT_3: 'Aktivera MQTT Discovery', MQTT_PUBLISH_TEXT_4: 'Prefix för Discovery topics', MQTT_PUBLISH_TEXT_5: 'Discoverytyp', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Publiceringsintervall', MQTT_INT_BOILER: 'Värmepump/panna', MQTT_INT_THERMOSTATS: 'Termostater', diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index d931077f1..f27982ca8 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -219,6 +219,7 @@ const tr: Translation = { MQTT_PUBLISH_TEXT_3: 'MQTT keşfi etkinleştir (Home Assistant, Domoticz)', MQTT_PUBLISH_TEXT_4: 'Keşif konuları için ön ek', MQTT_PUBLISH_TEXT_5: 'Domoticz Format', + MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_PUBLISH_INTERVALS: 'Yayınlama aralıkları', MQTT_INT_BOILER: 'Kazanlar ve Isı Pompaları', MQTT_INT_THERMOSTATS: 'Termostatlar', diff --git a/interface/src/types/mqtt.ts b/interface/src/types/mqtt.ts index 738dafa75..346df7fe6 100644 --- a/interface/src/types/mqtt.ts +++ b/interface/src/types/mqtt.ts @@ -49,4 +49,5 @@ export interface MqttSettingsType { publish_single2cmd: boolean; discovery_prefix: string; discovery_type: number; + ha_number_mode: number; } diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index d616f3491..11c84462e 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -248,6 +248,7 @@ void MqttSettings::read(MqttSettings & settings, JsonObject root) { root["nested_format"] = settings.nested_format; root["discovery_prefix"] = settings.discovery_prefix; root["discovery_type"] = settings.discovery_type; + root["ha_number_mode"] = settings.ha_number_mode; root["publish_single"] = settings.publish_single; root["publish_single2cmd"] = settings.publish_single2cmd; root["send_response"] = settings.send_response; @@ -288,6 +289,7 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings) newSettings.nested_format = static_cast(root["nested_format"] | EMSESP_DEFAULT_NESTED_FORMAT); newSettings.discovery_prefix = root["discovery_prefix"] | EMSESP_DEFAULT_DISCOVERY_PREFIX; newSettings.discovery_type = static_cast(root["discovery_type"] | EMSESP_DEFAULT_DISCOVERY_TYPE); + newSettings.ha_number_mode = static_cast(root["ha_number_mode"] | EMSESP_DEFAULT_HA_NUMBER_MODE); newSettings.publish_single = root["publish_single"] | EMSESP_DEFAULT_PUBLISH_SINGLE; newSettings.publish_single2cmd = root["publish_single2cmd"] | EMSESP_DEFAULT_PUBLISH_SINGLE2CMD; newSettings.send_response = root["send_response"] | EMSESP_DEFAULT_SEND_RESPONSE; diff --git a/src/ESP32React/MqttSettingsService.h b/src/ESP32React/MqttSettingsService.h index b31859201..83cf751dd 100644 --- a/src/ESP32React/MqttSettingsService.h +++ b/src/ESP32React/MqttSettingsService.h @@ -93,6 +93,7 @@ class MqttSettings { uint8_t nested_format = EMSESP_DEFAULT_NESTED_FORMAT; String discovery_prefix = EMSESP_DEFAULT_DISCOVERY_PREFIX; uint8_t discovery_type = EMSESP_DEFAULT_DISCOVERY_TYPE; + uint8_t ha_number_mode = EMSESP_DEFAULT_HA_NUMBER_MODE; bool publish_single = EMSESP_DEFAULT_PUBLISH_SINGLE; bool publish_single2cmd = EMSESP_DEFAULT_PUBLISH_SINGLE2CMD; bool send_response = EMSESP_DEFAULT_SEND_RESPONSE; diff --git a/src/core/default_settings.h b/src/core/default_settings.h index 6ef742329..86a2683b1 100644 --- a/src/core/default_settings.h +++ b/src/core/default_settings.h @@ -210,6 +210,10 @@ #define EMSESP_DEFAULT_DISCOVERY_TYPE 0 // HA #endif +#ifndef EMSESP_DEFAULT_HA_NUMBER_MODE +#define EMSESP_DEFAULT_HA_NUMBER_MODE 0 // BOX +#endif + #ifndef EMSESP_DEFAULT_PUBLISH_SINGLE #define EMSESP_DEFAULT_PUBLISH_SINGLE false #endif diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index e1e664d71..03d9b2eb5 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -43,6 +43,7 @@ bool Mqtt::ha_enabled_; uint8_t Mqtt::nested_format_; std::string Mqtt::discovery_prefix_; uint8_t Mqtt::discovery_type_; +uint8_t Mqtt::ha_number_mode_; bool Mqtt::send_response_; bool Mqtt::publish_single_; bool Mqtt::publish_single2cmd_; @@ -343,6 +344,7 @@ void Mqtt::load_settings() { discovery_prefix_ = mqttSettings.discovery_prefix.c_str(); entity_format_ = mqttSettings.entity_format; discovery_type_ = mqttSettings.discovery_type; + ha_number_mode_ = mqttSettings.ha_number_mode; // convert to milliseconds publish_time_boiler_ = mqttSettings.publish_time_boiler * 1000; @@ -1024,8 +1026,12 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev snprintf(sample_val, sizeof(sample_val), "'%s'", Helpers::translated_word(options[0])); } } else if (type != DeviceValueType::STRING && type != DeviceValueType::BOOL) { - // For numeric's add the range - doc["mode"] = "box"; // auto, slider or box + // For numeric's add the range and mode + if (ha_number_mode_ == 1 && (dv_set_max - dv_set_min) <= 100) { + doc["mode"] = "slider"; + } else { + doc["mode"] = "box"; // auto, slider or box + } if (num_op > 0) { doc["step"] = 1.0 / num_op; } else if (num_op < 0) { diff --git a/src/core/mqtt.h b/src/core/mqtt.h index 8a2f82137..c6e754fb4 100644 --- a/src/core/mqtt.h +++ b/src/core/mqtt.h @@ -341,6 +341,7 @@ class Mqtt { static uint8_t entity_format_; static std::string discovery_prefix_; static uint8_t discovery_type_; + static uint8_t ha_number_mode_; static bool publish_single_; static bool publish_single2cmd_; static bool send_response_;