From 8c732f9f1ef720518fc1dadd8555e6658a611306 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Mar 2026 16:12:50 +0100 Subject: [PATCH] allow modbus start/stop without reboot --- src/core/emsesp.cpp | 8 +------- src/core/modbus.cpp | 2 +- src/core/system.cpp | 35 +++++++++++++++++++++++++++++----- src/web/WebSettingsService.cpp | 4 ---- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/core/emsesp.cpp b/src/core/emsesp.cpp index 4b9dae4a4..ba4711d1d 100644 --- a/src/core/emsesp.cpp +++ b/src/core/emsesp.cpp @@ -84,7 +84,7 @@ uuid::log::Logger EMSESP::logger() { RxService EMSESP::rxservice_; // incoming Telegram Rx handler TxService EMSESP::txservice_; // outgoing Telegram Tx handler Mqtt EMSESP::mqtt_; // mqtt handler -Modbus * EMSESP::modbus_; // modbus handler +Modbus * EMSESP::modbus_ = nullptr; // modbus handler System EMSESP::system_; // core system services TemperatureSensor EMSESP::temperaturesensor_; // Temperature sensors AnalogSensor EMSESP::analogsensor_; // Analog sensors @@ -1795,12 +1795,6 @@ void EMSESP::start() { #endif } - // start services - if (system_.modbus_enabled()) { - modbus_ = new Modbus; - modbus_->start(1, system_.modbus_port(), system_.modbus_max_clients(), system_.modbus_timeout() * 1000); - } - mqtt_.start(); // mqtt init system_.start(); // starts commands, led, adc, button, network (sets hostname), syslog & uart shower_.start(); // initialize shower timer and shower alert diff --git a/src/core/modbus.cpp b/src/core/modbus.cpp index 803ab80d4..bec679a22 100644 --- a/src/core/modbus.cpp +++ b/src/core/modbus.cpp @@ -52,7 +52,7 @@ void Modbus::stop() { #ifndef EMSESP_STANDALONE modbusServer_->stop(); // virtual ~ModbusServerTCPasync() = default; - // delete modbusServer_; + delete modbusServer_; modbusServer_ = nullptr; #endif } diff --git a/src/core/system.cpp b/src/core/system.cpp index 8a0e76070..2157aec72 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -556,11 +556,6 @@ void System::store_settings(WebSettings & settings) { board_profile_ = settings.board_profile; telnet_enabled_ = settings.telnet_enabled; - modbus_enabled_ = settings.modbus_enabled; - modbus_port_ = settings.modbus_port; - modbus_max_clients_ = settings.modbus_max_clients; - modbus_timeout_ = settings.modbus_timeout; - tx_mode_ = settings.tx_mode; syslog_enabled_ = settings.syslog_enabled; syslog_level_ = settings.syslog_level; @@ -581,6 +576,24 @@ void System::store_settings(WebSettings & settings) { locale_ = settings.locale; developer_mode_ = settings.developer_mode; + // start services + if (settings.modbus_enabled) { + if (EMSESP::modbus_ == nullptr) { + EMSESP::modbus_ = new Modbus; + EMSESP::modbus_->start(1, settings.modbus_port, settings.modbus_max_clients, settings.modbus_timeout * 1000); + } else if (settings.modbus_port != modbus_port_ || settings.modbus_max_clients != modbus_max_clients_ || settings.modbus_timeout != modbus_timeout_) { + EMSESP::modbus_->stop(); + EMSESP::modbus_->start(1, settings.modbus_port, settings.modbus_max_clients, settings.modbus_timeout * 1000); + } + } else if (EMSESP::modbus_ != nullptr) { + EMSESP::modbus_->stop(); + delete EMSESP::modbus_; + EMSESP::modbus_ = nullptr; + } + modbus_enabled_ = settings.modbus_enabled; + modbus_port_ = settings.modbus_port; + modbus_max_clients_ = settings.modbus_max_clients; + modbus_timeout_ = settings.modbus_timeout; } // Starts up core services @@ -2173,6 +2186,15 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output } #endif + // Modbus Status + node = output["Modbus"].to(); + node["enabled"] = EMSESP::system_.modbus_enabled_; + if (EMSESP::system_.modbus_enabled_) { + node["maxClients"] = EMSESP::system_.modbus_max_clients_; + node["port"] = EMSESP::system_.modbus_port_; + node["timeout"] = EMSESP::system_.modbus_timeout_; + } + // Sensor Status node = output["sensor"].to(); if (EMSESP::sensor_enabled()) { @@ -2180,6 +2202,9 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output node["temperatureSensorReads"] = EMSESP::temperaturesensor_.reads(); node["temperatureSensorFails"] = EMSESP::temperaturesensor_.fails(); } + + node = output["Analog"].to(); + node["enabled"] = EMSESP::analog_enabled(); if (EMSESP::analog_enabled()) { node["analogSensors"] = EMSESP::analogsensor_.count_entities(); node["analogSensorReads"] = EMSESP::analogsensor_.reads(); diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 1c65e684d..6a7beca54 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -243,13 +243,9 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) { // Modbus settings settings.modbus_enabled = root["modbus_enabled"] | EMSESP_DEFAULT_MODBUS_ENABLED; - check_flag(original_settings.modbus_enabled, settings.modbus_enabled, ChangeFlags::RESTART); settings.modbus_port = root["modbus_port"] | EMSESP_DEFAULT_MODBUS_PORT; - check_flag(original_settings.modbus_port, settings.modbus_port, ChangeFlags::RESTART); settings.modbus_max_clients = root["modbus_max_clients"] | EMSESP_DEFAULT_MODBUS_MAX_CLIENTS; - check_flag(original_settings.modbus_max_clients, settings.modbus_max_clients, ChangeFlags::RESTART); settings.modbus_timeout = root["modbus_timeout"] | EMSESP_DEFAULT_MODBUS_TIMEOUT; - check_flag(original_settings.modbus_timeout, settings.modbus_timeout, ChangeFlags::RESTART); // // these may need mqtt restart to rebuild HA discovery topics