From 30fca2a190f8c06692b19a4a63bf62ea5033b1b4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 28 Nov 2024 15:40:42 +0100 Subject: [PATCH 1/5] system commands withing command (api/mqtt/console), alternative to #2182 --- src/command.cpp | 46 +++++++++++++++++++- src/console.cpp | 32 -------------- src/locale_translations.h | 6 +++ src/shower.cpp | 42 ------------------ src/shower.h | 8 ++++ src/system.cpp | 90 ++++++++++++++++++++++++++++++++++++++- src/system.h | 9 ++++ 7 files changed, 155 insertions(+), 78 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 4b92d61ca..0e655a3a4 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -326,7 +326,7 @@ uint8_t Command::call(const uint8_t device_type, const char * command, const cha return CommandRet::NOT_FOUND; } char cmd[COMMAND_MAX_LENGTH]; - strcpy(cmd, Helpers::toLower(command).c_str()); + strlcpy(cmd, Helpers::toLower(command).c_str(), sizeof(cmd)); auto dname = EMSdevice::device_type_2_device_name(device_type); // device name, not translated @@ -342,6 +342,11 @@ uint8_t Command::call(const uint8_t device_type, const char * command, const cha LOG_DEBUG("Fetched device entity/attributes for %s/%s", dname, cmd); return CommandRet::OK; } + } else if (device_type == EMSdevice::DeviceType::SYSTEM && strchr(cmd, '/')) { + // check service commands, if not found continue with commandsfunctions + if (EMSESP::system_.command_service(cmd, value)) { + return CommandRet::OK; + } } uint8_t device_id = EMSESP::device_id_from_cmd(device_type, cmd, id); @@ -531,6 +536,17 @@ bool Command::list(const uint8_t device_type, JsonObject output) { output[F_(commands)] = Helpers::translated_word(FL_(commands_cmd)); output[F_(entities)] = Helpers::translated_word(FL_(entities_cmd)); + if (device_type == EMSdevice::DeviceType::SYSTEM) { + output["settings/showertimer"] = Helpers::translated_word(FL_(system_cmd)); + output["settings/showeralert"] = Helpers::translated_word(FL_(system_cmd)); + output["settings/hideled"] = Helpers::translated_word(FL_(system_cmd)); + output["settings/txmode"] = Helpers::translated_word(FL_(system_cmd)); + output["settings/analogenabled"] = Helpers::translated_word(FL_(system_cmd)); + output["mqtt/enabled"] = Helpers::translated_word(FL_(system_cmd)); + output["ntp/enabled"] = Helpers::translated_word(FL_(system_cmd)); + output["ap/enabled"] = Helpers::translated_word(FL_(system_cmd)); + output["syslog/enabled"] = Helpers::translated_word(FL_(system_cmd)); + } // create a list of commands we have registered, and sort them std::list sorted_cmds; for (const auto & cf : cmdfunctions_) { @@ -559,7 +575,17 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo sorted_cmds.push_back(tagged_cmd(cf.cmd_, cf.flags_)); } } - + if (device_type == EMSdevice::DeviceType::SYSTEM) { + sorted_cmds.emplace_back("settings/showertimer"); + sorted_cmds.emplace_back("settings/showeralert"); + sorted_cmds.emplace_back("settings/hideled"); + sorted_cmds.emplace_back("settings/txmode"); + sorted_cmds.emplace_back("settings/analogenabled"); + sorted_cmds.emplace_back("mqtt/enabled"); + sorted_cmds.emplace_back("ntp/enabled"); + sorted_cmds.emplace_back("ap/enabled"); + sorted_cmds.emplace_back("syslog/enabled"); + } sorted_cmds.sort(); // sort them // if not in verbose mode, just print them on a single line and exit @@ -567,6 +593,7 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo sorted_cmds.emplace_front(F_(info)); sorted_cmds.emplace_front(F_(commands)); sorted_cmds.emplace_front(F_(values)); + sorted_cmds.emplace_front(F_(entities)); for (const auto & cl : sorted_cmds) { shell.print(cl); shell.print(" "); @@ -590,6 +617,19 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo shell.print(' '); } shell.print(COLOR_BRIGHT_CYAN); + if (cf.has_flags(CommandFlag::CMD_FLAG_HC)) { + shell.print(Helpers::translated_word(FL_(tag_hcx))); + shell.print(' '); + } else if (cf.has_flags(CommandFlag::CMD_FLAG_DHW)) { + shell.print(Helpers::translated_word(FL_(tag_dhwx))); + shell.print(' '); + } else if (cf.has_flags(CommandFlag::CMD_FLAG_AHS)) { + shell.print(Helpers::translated_word(FL_(tag_ahsx))); + shell.print(' '); + } else if (cf.has_flags(CommandFlag::CMD_FLAG_HS)) { + shell.print(Helpers::translated_word(FL_(tag_hsx))); + shell.print(' '); + } shell.print(Helpers::translated_word(cf.description_)); if (!cf.has_flags(CommandFlag::ADMIN_ONLY)) { shell.print(' '); @@ -677,6 +717,8 @@ void Command::show_all(uuid::console::Shell & shell) { shell.println(COLOR_RESET); shell.printf(" values \t\t\t%slist all values %s*", COLOR_BRIGHT_CYAN, COLOR_BRIGHT_GREEN); shell.println(COLOR_RESET); + shell.printf(" entities \t\t\t%slist all entities %s*", COLOR_BRIGHT_CYAN, COLOR_BRIGHT_GREEN); + shell.println(COLOR_RESET); // show system ones first show(shell, EMSdevice::DeviceType::SYSTEM, true); diff --git a/src/console.cpp b/src/console.cpp index 262f02632..f45c165b3 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -327,38 +327,6 @@ static void setup_commands(std::shared_ptr const & commands) { EMSESP::uart_init(); }); - commands->add_command(ShellContext::MAIN, - CommandFlags::ADMIN, - string_vector{F_(set), F_(service)}, - string_vector{F_(service_mandatory), F_(enable_mandatory)}, - [](Shell & shell, const std::vector & arguments) { - if (arguments.back() == "enable" || arguments.back() == "disable") { - bool enable = arguments.back() == "enable"; - if (arguments.front() == "mqtt") { - EMSESP::esp8266React.getMqttSettingsService()->update([&](MqttSettings & Settings) { - Settings.enabled = enable; - return StateUpdateResult::CHANGED; - }); - } else if (arguments.front() == "ntp") { - EMSESP::esp8266React.getNTPSettingsService()->update([&](NTPSettings & Settings) { - Settings.enabled = enable; - return StateUpdateResult::CHANGED; - }); - } else if (arguments.front() == "ap") { - EMSESP::esp8266React.getAPSettingsService()->update([&](APSettings & Settings) { - Settings.provisionMode = enable ? 0 : 2; - return StateUpdateResult::CHANGED; - }); - } else { - shell.printfln("unknown service: %s", arguments.front().c_str()); - return; - } - shell.printfln("service '%s' %sd", arguments.front().c_str(), arguments.back().c_str()); - } else { - shell.println("Must be `enable` or `disable`"); - } - }); - // // EMS device commands // diff --git a/src/locale_translations.h b/src/locale_translations.h index 5c9f68c83..153409ee4 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -79,6 +79,7 @@ MAKE_WORD_TRANSLATION(commands_response, "get response", "Hole Antwort", "Verzoe MAKE_WORD_TRANSLATION(coldshot_cmd, "send a cold shot of water", "Zugabe einer Menge kalten Wassers", "", "", "uruchom tryśnięcie zimnej wody", "", "", "soğuk su gönder", "", "pošlite studenú dávku vody", "poslat studenou vodu") // TODO translate MAKE_WORD_TRANSLATION(message_cmd, "send a message", "Eine Nachricht senden", "", "", "", "", "", "", "", "poslať správu", "odeslat zprávu") // TODO translate MAKE_WORD_TRANSLATION(values_cmd, "list all values", "Liste alle Werte auf", "", "", "", "", "", "", "", "vypísať všetky hodnoty", "vypsat všechny hodnoty") // TODO translate +MAKE_WORD_TRANSLATION(system_cmd, "system setting", "System Einstellung", "", "", "", "", "", "", "", "vypísať všetky hodnoty", "vypsat všechny hodnoty") // TODO translate MAKE_WORD_TRANSLATION(showertimer_cmd, "enable shower timer", "aktiviere Duschzeitmessung", "", "", "", "", "", "", "", "povoliť časovač sprchovania", "") // TODO translate MAKE_WORD_TRANSLATION(showeralert_cmd, "enable shower alert", "aktiviere Duschzeitwarnung", "", "", "", "", "", "", "", "povoliť upozornenie na sprchu", "") // TODO translate @@ -120,6 +121,11 @@ MAKE_WORD_TRANSLATION(tag_hs14, "hs14", "hs14", "hs14", "VK14", "ŹC14", "hs14", MAKE_WORD_TRANSLATION(tag_hs15, "hs15", "hs15", "hs15", "VK15", "ŹC15", "hs15", "hs15", "hs15", "hs15", "hs15", "hs15") MAKE_WORD_TRANSLATION(tag_hs16, "hs16", "hs16", "hs16", "VK16", "ŹC16", "hs16", "hs16", "hs16", "hs16", "hs16", "hs16") +MAKE_WORD_TRANSLATION(tag_hcx, "hc", "HK", "hc", "VK", "OG", "hc", "hc", "ID", "hc", "hc", "hc") +MAKE_WORD_TRANSLATION(tag_dhwx, "dhw[n]", "WWK[n]", "dhw[n]", "VVK[n]", "CWU[n]", "dhw[n]", "ecs[n]", "SKS[n]", "dhw[n]", "TÚV[n]", "TUV[n]") +MAKE_WORD_TRANSLATION(tag_ahsx, "ahs", "AHQ", "ahs", "ahs", "AŹC", "ahs", "ahs", "ahs", "ahs", "ahs", "ahs") +MAKE_WORD_TRANSLATION(tag_hsx, "hs", "HQ", "hs", "hs", "ŹC", "hs", "hs", "hs", "hs", "hs", "hs") + // General MAKE_WORD_TRANSLATION(on, "on", "an", "aan", "på", "włączono", "på", "on", "açık", "on", "zap", "zap") MAKE_WORD_TRANSLATION(off, "off", "aus", "uit", "av", "wyłączono", "av", "off", "kapalı", "off", "vyp", "vyp") diff --git a/src/shower.cpp b/src/shower.cpp index b88f86266..88226cd79 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -51,48 +51,6 @@ void Shower::start() { FL_(coldshot_cmd), CommandFlag::ADMIN_ONLY); - Command::add( - EMSdevice::DeviceType::SYSTEM, - F_(showertimer), - [&](const char * value, const int8_t id, JsonObject output) { - bool b; - if (!Helpers::value2bool(value, b)) { - return false; - } - shower_timer_ = b; - EMSESP::webSettingsService.update([&](WebSettings & settings) { - if (settings.shower_timer != b) { - settings.shower_timer = b; - return StateUpdateResult::CHANGED; - } - return StateUpdateResult::UNCHANGED; - }); - return true; - }, - FL_(showertimer_cmd), - CommandFlag::ADMIN_ONLY); - - Command::add( - EMSdevice::DeviceType::SYSTEM, - F_(showeralert), - [&](const char * value, const int8_t id, JsonObject output) { - bool b; - if (!Helpers::value2bool(value, b)) { - return false; - } - shower_alert_ = b; - EMSESP::webSettingsService.update([&](WebSettings & settings) { - if (settings.shower_alert != b) { - settings.shower_alert = b; - return StateUpdateResult::CHANGED; - } - return StateUpdateResult::UNCHANGED; - }); - return true; - }, - FL_(showeralert_cmd), - CommandFlag::ADMIN_ONLY); - if (shower_timer_) { set_shower_state(false, true); // turns shower to off and creates HA topic if not already done } diff --git a/src/shower.h b/src/shower.h index 6711f0af3..2876a80cb 100644 --- a/src/shower.h +++ b/src/shower.h @@ -33,6 +33,14 @@ class Shower { // commands static bool command_coldshot(const char * value, const int8_t id); + void shower_timer(bool enable) { + shower_timer_ = enable; + } + + void shower_alert(bool enable) { + shower_alert_ = enable; + } + private: static uuid::log::Logger logger_; diff --git a/src/system.cpp b/src/system.cpp index 96565589e..78e767887 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1347,6 +1347,91 @@ bool System::saveSettings(const char * filename, const char * section, JsonObjec return false; // not found } +// set a entity of services 'network', 'settings', 'mqtt', etc. +bool System::command_service(const char * cmd, const char * value) { + bool ok = false; + bool b; + if (Helpers::value2bool(value, b)) { + if (!strcmp(cmd, "settings/showertimer")) { + EMSESP::webSettingsService.update([&](WebSettings & settings) { + settings.shower_timer = b; + return StateUpdateResult::CHANGED; + }); + EMSESP::shower_.shower_timer(b); + ok = true; + } else if (!strcmp(cmd, "settings/showeralert")) { + EMSESP::webSettingsService.update([&](WebSettings & settings) { + settings.shower_alert = b; + return StateUpdateResult::CHANGED; + }); + EMSESP::shower_.shower_alert(b); + ok = true; + } else if (!strcmp(cmd, "settings/hideled")) { + EMSESP::webSettingsService.update([&](WebSettings & settings) { + settings.hide_led = b; + return StateUpdateResult::CHANGED; + }); + EMSESP::system_.hide_led(b); + ok = true; + } else if (!strcmp(cmd, "settings/analogenabled")) { + EMSESP::webSettingsService.update([&](WebSettings & settings) { + settings.analog_enabled = b; + return StateUpdateResult::CHANGED; + }); + EMSESP::system_.analog_enabled(b); + ok = true; + } else if (!strcmp(cmd, "mqtt/enabled")) { + EMSESP::esp8266React.getMqttSettingsService()->update([&](MqttSettings & Settings) { + Settings.enabled = b; + return StateUpdateResult::CHANGED; + }); + ok = true; + } else if (!strcmp(cmd, "ap/enabled")) { + EMSESP::esp8266React.getAPSettingsService()->update([&](APSettings & Settings) { + Settings.provisionMode = b ? 0 : 2; + return StateUpdateResult::CHANGED; + }); + ok = true; + } else if (!strcmp(cmd, "ntp/enabled")) { + EMSESP::esp8266React.getNTPSettingsService()->update([&](NTPSettings & Settings) { + Settings.enabled = b; + return StateUpdateResult::CHANGED; + }); + ok = true; + } else if (!strcmp(cmd, "ap/enabled")) { + EMSESP::esp8266React.getAPSettingsService()->update([&](APSettings & Settings) { + Settings.provisionMode = b ? 0 : 2; + return StateUpdateResult::CHANGED; + }); + ok = true; + } else if (!strcmp(cmd, "syslog/enabled")) { + EMSESP::webSettingsService.update([&](WebSettings & settings) { + settings.syslog_enabled = b; + return StateUpdateResult::CHANGED; + }); + EMSESP::system_.syslog_enabled_ = b; + EMSESP::system_.syslog_init(); + ok = true; + } + } + int n; + if (!ok && Helpers::value2number(value, n)) { + if (!strcmp(cmd, "settings/txmode") && n >= 0 && n <= 4) { + EMSESP::webSettingsService.update([&](WebSettings & settings) { + settings.tx_mode = n; + return StateUpdateResult::CHANGED; + }); + EMSESP::uart_init(); + ok = true; + } + } + + if (ok) { + LOG_INFO("System command '%s' with value '%s'", cmd, value); + } + return ok; +} + // return back a system value bool System::get_value_info(JsonObject output, const char * cmd) { if (cmd == nullptr || strlen(cmd) == 0) { @@ -1428,8 +1513,9 @@ void System::get_value_json(JsonObject output, const std::string & circuit, cons output["circuit"] = circuit; } output["readable"] = true; - output["writable"] = false; - output["visible"] = true; + output["writeable"] = + (name == "txmode" || name == "showertimer" || name == "showeralert" || name == "enabled" || name == "hideled" || name == "analogenabled"); + output["visible"] = true; if (val.is()) { output["value"] = val.as(); output["type"] = "boolean"; diff --git a/src/system.h b/src/system.h index ffc620a3f..35db0cd83 100644 --- a/src/system.h +++ b/src/system.h @@ -73,6 +73,7 @@ class System { static bool command_message(const char * value, const int8_t id); static bool command_info(const char * value, const int8_t id, JsonObject output); static bool command_response(const char * value, const int8_t id, JsonObject output); + static bool command_service(const char * cmd, const char * value); static bool get_value_info(JsonObject root, const char * cmd); static void get_value_json(JsonObject output, const std::string & circuit, const std::string & name, JsonVariant val); @@ -165,6 +166,14 @@ class System { return analog_enabled_; } + void analog_enabled(bool b) { + analog_enabled_ = b; + } + + void hide_led(bool b) { + hide_led_ = b; + } + bool readonly_mode() { return readonly_mode_; } From e3861d54c93af686cd45e187598eb891c33a0556 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 29 Nov 2024 11:00:04 +0100 Subject: [PATCH 2/5] remove command txMode, fix writeable camelCase names --- src/command.cpp | 2 -- src/system.cpp | 13 +------------ 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 0e655a3a4..ce346bea6 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -540,7 +540,6 @@ bool Command::list(const uint8_t device_type, JsonObject output) { output["settings/showertimer"] = Helpers::translated_word(FL_(system_cmd)); output["settings/showeralert"] = Helpers::translated_word(FL_(system_cmd)); output["settings/hideled"] = Helpers::translated_word(FL_(system_cmd)); - output["settings/txmode"] = Helpers::translated_word(FL_(system_cmd)); output["settings/analogenabled"] = Helpers::translated_word(FL_(system_cmd)); output["mqtt/enabled"] = Helpers::translated_word(FL_(system_cmd)); output["ntp/enabled"] = Helpers::translated_word(FL_(system_cmd)); @@ -579,7 +578,6 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo sorted_cmds.emplace_back("settings/showertimer"); sorted_cmds.emplace_back("settings/showeralert"); sorted_cmds.emplace_back("settings/hideled"); - sorted_cmds.emplace_back("settings/txmode"); sorted_cmds.emplace_back("settings/analogenabled"); sorted_cmds.emplace_back("mqtt/enabled"); sorted_cmds.emplace_back("ntp/enabled"); diff --git a/src/system.cpp b/src/system.cpp index 78e767887..de288ecf2 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1414,17 +1414,6 @@ bool System::command_service(const char * cmd, const char * value) { ok = true; } } - int n; - if (!ok && Helpers::value2number(value, n)) { - if (!strcmp(cmd, "settings/txmode") && n >= 0 && n <= 4) { - EMSESP::webSettingsService.update([&](WebSettings & settings) { - settings.tx_mode = n; - return StateUpdateResult::CHANGED; - }); - EMSESP::uart_init(); - ok = true; - } - } if (ok) { LOG_INFO("System command '%s' with value '%s'", cmd, value); @@ -1514,7 +1503,7 @@ void System::get_value_json(JsonObject output, const std::string & circuit, cons } output["readable"] = true; output["writeable"] = - (name == "txmode" || name == "showertimer" || name == "showeralert" || name == "enabled" || name == "hideled" || name == "analogenabled"); + (name == "showerTimer" || name == "showerAlert" || name == "enabled" || name == "hideLed" || name == "analogEnabled"); output["visible"] = true; if (val.is()) { output["value"] = val.as(); From 5d2a6e289849c578f8d6da5b8db4410ae6471210 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 1 Dec 2024 17:56:23 +0100 Subject: [PATCH 3/5] pretty telegram with operation between src and dst --- src/emsesp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index c80ed3d6b..f2efd0037 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -914,14 +914,14 @@ std::string EMSESP::pretty_telegram(std::shared_ptr telegram) { std::string str; str.reserve(200); if (telegram->operation == Telegram::Operation::RX_READ) { - str = src_name + "(" + Helpers::hextoa(src) + ") -> " + dest_name + "(" + Helpers::hextoa(dest) + "), R, " + type_name + "(" + str = src_name + "(" + Helpers::hextoa(src) + ") R " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "(" + Helpers::hextoa(telegram->type_id) + "), length: " + Helpers::itoa(telegram->message_data[0]) + ((telegram->message_length > 1) ? ", data: " + Helpers::data_to_hex(telegram->message_data + 1, telegram->message_length - 1) : ""); } else if (telegram->dest == 0) { - str = src_name + "(" + Helpers::hextoa(src) + ") -> " + dest_name + "(" + Helpers::hextoa(dest) + "), B, " + type_name + "(" + str = src_name + "(" + Helpers::hextoa(src) + ") B " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "(" + Helpers::hextoa(telegram->type_id) + "), data: " + telegram->to_string_message(); } else { - str = src_name + "(" + Helpers::hextoa(src) + ") -> " + dest_name + "(" + Helpers::hextoa(dest) + "), W, " + type_name + "(" + str = src_name + "(" + Helpers::hextoa(src) + ") W " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "(" + Helpers::hextoa(telegram->type_id) + "), data: " + telegram->to_string_message(); } From c0d693c1c85c66fd3fb850e45645b53a6a25820a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 1 Dec 2024 18:06:09 +0100 Subject: [PATCH 4/5] add RC35 heatingtypes for remote room control, #2268 --- src/devices/thermostat.cpp | 19 ++++++++++++------- src/emsdevice.cpp | 15 ++++++++++++++- src/emsdevice.h | 1 + src/locale_common.h | 1 + src/locale_translations.h | 2 ++ 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index ca05d4b84..0c50654a9 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1454,6 +1454,7 @@ void Thermostat::process_RC35Set(std::shared_ptr telegram) { has_update(telegram, hc->designtemp, 17); // is * 1 has_update(telegram, hc->maxflowtemp, 15); // is * 1 } + setValueEnum(&hc->heatingtype, hc->control == 1 ? FL_(enum_heatingtype2) : FL_(enum_heatingtype)); } // type 0x3F (HC1), 0x49 (HC2), 0x53 (HC3), 0x5D (HC4) - timer setting @@ -3208,14 +3209,18 @@ bool Thermostat::set_heatingtype(const char * value, const int8_t id) { } uint8_t set; - if (model() == EMSdevice::EMS_DEVICE_FLAG_JUNKERS && Helpers::value2enum(value, set, FL_(enum_heatingtype1))) { - write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); - return true; - } - if (Helpers::value2enum(value, set, FL_(enum_heatingtype))) { - if ((model() == EMSdevice::EMS_DEVICE_FLAG_RC20_N) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC25)) { + if (model() == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) { + if (Helpers::value2enum(value, set, FL_(enum_heatingtype1))) { write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); - } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC35 || model() == EMSdevice::EMS_DEVICE_FLAG_RC30_N) { + return true; + } + } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC35 || model() == EMSdevice::EMS_DEVICE_FLAG_RC30_N) { + if (Helpers::value2enum(value, set, hc->control == 1 ? FL_(enum_heatingtype2) : FL_(enum_heatingtype))) { + write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); + return true; + } + } else if (Helpers::value2enum(value, set, FL_(enum_heatingtype))) { + if ((model() == EMSdevice::EMS_DEVICE_FLAG_RC20_N) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC25)) { write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC30) { write_command(curve_typeids[hc->hc()], 0, set, curve_typeids[hc->hc()]); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 752dcc955..c5c5108f0 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1182,6 +1182,19 @@ void EMSdevice::set_climate_minmax(int8_t tag, int16_t min, uint32_t max) { } } +void EMSdevice::setValueEnum(const void * value_p, const char * const ** options) { + for (auto & dv : devicevalues_) { + if (dv.value_p == value_p) { + if (dv.options != options && Mqtt::ha_enabled()) { + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + } + dv.options = options; + dv.options_size = Helpers::count_items(options); + break; + } + } +} + // 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::setCustomizationEntity(const std::string & entity_id) { @@ -1984,7 +1997,7 @@ std::string EMSdevice::name() { if (model().empty()) { return default_name(); } - return model() + "/" + default_name(); + return model() + "/" + std::string(default_name()); } return custom_name(); diff --git a/src/emsdevice.h b/src/emsdevice.h index 4f02fd76e..e4ce9743e 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -216,6 +216,7 @@ class EMSdevice { void add_handlers_ignored(const uint16_t handler); void set_climate_minmax(int8_t tag, int16_t min, uint32_t max); + void setValueEnum(const void * value_p, const char * const ** options); void setCustomizationEntity(const std::string & entity_id); void getCustomizationEntities(std::vector & entity_ids); diff --git a/src/locale_common.h b/src/locale_common.h index 75ad68e1e..220da8b25 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -317,6 +317,7 @@ MAKE_ENUM(enum_wwMode5, FL_(normal), FL_(comfort), FL_(ecoplus)) // Rego3000 MAKE_ENUM(enum_wwMode6, FL_(off), FL_(comfort), FL_(auto)) // CR120 MAKE_ENUM(enum_heatingtype, FL_(off), FL_(radiator), FL_(convector), FL_(floor)) MAKE_ENUM(enum_heatingtype1, FL_(off), FL_(curve), FL_(radiator), FL_(convector), FL_(floor)) +MAKE_ENUM(enum_heatingtype2, FL_(off), FL_(radiator), FL_(convector), FL_(floor), FL_(roomflow), FL_(roomload)) MAKE_ENUM(enum_summermode, FL_(summer), FL_(auto), FL_(winter)) MAKE_ENUM(enum_hpoperatingmode, FL_(off), FL_(auto), FL_(heating), FL_(cooling)) MAKE_ENUM(enum_summer, FL_(winter), FL_(summer)) diff --git a/src/locale_translations.h b/src/locale_translations.h index 153409ee4..c0d817623 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -253,6 +253,8 @@ MAKE_WORD_TRANSLATION(curve, "heatingcurve", "Heizkurve", "", "", "krzywa grzani MAKE_WORD_TRANSLATION(radiator, "radiator", "Heizkörper", "radiator", "Radiator", "grzejniki", "radiator", "radiateur", "radyatör", "radiatore", "radiátor", "radiátor") MAKE_WORD_TRANSLATION(convector, "convector", "Konvektor", "convector", "Konvektor", "konwektory", "konvektor", "convecteur", "convector", "convettore", "konvektor", "konvektor") MAKE_WORD_TRANSLATION(floor, "floor", "Fussboden", "vloer", "Golv", "podłoga", "gulv", "sol", "yer", "pavimento", "podlaha", "podlaha") +MAKE_WORD_TRANSLATION(roomflow, "roomflow", "Raum Fluß", "", "", "", "", "", "", "", "", "") // TODO translate +MAKE_WORD_TRANSLATION(roomload, "roomload", "Raum Bedarf", "", "", "", "", "", "", "", "", "") // TODO translate MAKE_WORD_TRANSLATION(summer, "summer", "Sommer", "zomer", "Sommar", "lato", "sommer", "été", "yaz", "estate", "leto", "léto") MAKE_WORD_TRANSLATION(winter, "winter", "Winter", "winter", "Vinter", "zima", "vinter", "hiver", "kış", "inverno", "zima", "zima") MAKE_WORD_TRANSLATION(outdoor, "outdoor", "Außen", "buiten", "Utomhus", "temp. zewnętrzna", "utendørs", "extérieur", "dış", "esterno", "vonku", "venkovní") From c8fd08b6d210d950d618cecb5c99a4addbd71c32 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 1 Dec 2024 18:06:35 +0100 Subject: [PATCH 5/5] changelog v3.7.2-dev.2 --- CHANGELOG_LATEST.md | 4 ++++ src/version.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index dc87aa27a..32ce84afb 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -6,7 +6,11 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/). ## Added +- change enum_heatingtype for remote control [#2268](https://github.com/emsesp/EMS-ESP32/issues/2268) +- system service commands [#2182](https://github.com/emsesp/EMS-ESP32/issues/2282) + ## Fixed ## Changed +- show operation in pretty telegram between src and dst [#2263](https://github.com/emsesp/EMS-ESP32/discussions/2263) diff --git a/src/version.h b/src/version.h index 7a5f11d06..682d170c3 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.7.2-dev.1" \ No newline at end of file +#define EMSESP_APP_VERSION "3.7.2-dev.2" \ No newline at end of file