From 227060591f3eb575a2b7f8827a0789343a41169d Mon Sep 17 00:00:00 2001 From: Yurii Date: Wed, 22 Nov 2023 20:59:37 +0300 Subject: [PATCH] add parameter for max modulation --- src/HaHelper.h | 22 ++++++++++++++++++++++ src/MqttTask.h | 10 ++++++++++ src/OpenThermTask.h | 2 +- src/Settings.h | 1 + 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/HaHelper.h b/src/HaHelper.h index d156a4e..cc087b5 100644 --- a/src/HaHelper.h +++ b/src/HaHelper.h @@ -257,6 +257,28 @@ public: return publish(getTopic("number", "heating_hysteresis").c_str(), doc); } + bool publishNumberHeatingMaxModulation(bool enabledByDefault = true) { + StaticJsonDocument<1536> doc; + doc[FPSTR(HA_ENABLED_BY_DEFAULT)] = enabledByDefault; + doc[FPSTR(HA_UNIQUE_ID)] = devicePrefix + F("_heating_max_modulation"); + doc[FPSTR(HA_OBJECT_ID)] = devicePrefix + F("_heating_max_modulation"); + doc[FPSTR(HA_ENTITY_CATEGORY)] = F("config"); + doc[FPSTR(HA_DEVICE_CLASS)] = F("power_factor"); + doc[FPSTR(HA_UNIT_OF_MEASUREMENT)] = F("%"); + doc[FPSTR(HA_NAME)] = F("Max modulation"); + doc[FPSTR(HA_ICON)] = F("mdi:speedometer"); + doc[FPSTR(HA_STATE_TOPIC)] = devicePrefix + F("/settings"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.heating.maxModulation|int(1) }}"); + doc[FPSTR(HA_COMMAND_TOPIC)] = devicePrefix + F("/settings/set"); + doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"heating\": {\"maxModulation\" : {{ value }}}}"); + doc[FPSTR(HA_MIN)] = 1; + doc[FPSTR(HA_MAX)] = 100; + doc[FPSTR(HA_STEP)] = 1; + doc[FPSTR(HA_MODE)] = "box"; + + return publish(getTopic("number", "heating_max_modulation").c_str(), doc); + } + bool publishSensorHeatingSetpoint(bool enabledByDefault = true) { StaticJsonDocument<1536> doc; doc[FPSTR(HA_AVAILABILITY)][FPSTR(HA_TOPIC)] = devicePrefix + F("/status"); diff --git a/src/MqttTask.h b/src/MqttTask.h index 9fa8eb9..37d4bf0 100644 --- a/src/MqttTask.h +++ b/src/MqttTask.h @@ -27,6 +27,7 @@ protected: Log.sinfoln("MQTT", "Started"); client.setCallback(__callback); + client.setBufferSize(1024); haHelper.setDevicePrefix(settings.mqtt.prefix); haHelper.setDeviceVersion(PROJECT_VERSION); haHelper.setDeviceModel(PROJECT_NAME); @@ -138,6 +139,13 @@ protected: } } + if (!doc["heating"]["maxModulation"].isNull() && doc["heating"]["maxModulation"].is()) { + if (doc["heating"]["maxModulation"].as() > 0 && doc["heating"]["maxModulation"].as() <= 100) { + settings.heating.maxModulation = doc["heating"]["maxModulation"].as(); + flag = true; + } + } + if (!doc["heating"]["maxTemp"].isNull() && doc["heating"]["maxTemp"].is()) { if (doc["heating"]["maxTemp"].as() > 0 && doc["heating"]["maxTemp"].as() <= 100 && doc["heating"]["maxTemp"].as() > settings.heating.minTemp) { settings.heating.maxTemp = doc["heating"]["maxTemp"].as(); @@ -386,6 +394,7 @@ protected: haHelper.publishSwitchHeatingTurbo(); //haHelper.publishNumberHeatingTarget(false); haHelper.publishNumberHeatingHysteresis(); + haHelper.publishNumberHeatingMaxModulation(false); haHelper.publishSensorHeatingSetpoint(false); haHelper.publishSensorCurrentHeatingMinTemp(false); haHelper.publishSensorCurrentHeatingMaxTemp(false); @@ -542,6 +551,7 @@ protected: doc["heating"]["turbo"] = settings.heating.turbo; doc["heating"]["target"] = settings.heating.target; doc["heating"]["hysteresis"] = settings.heating.hysteresis; + doc["heating"]["maxModulation"] = settings.heating.maxModulation; doc["heating"]["minTemp"] = settings.heating.minTemp; doc["heating"]["maxTemp"] = settings.heating.maxTemp; diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index d30fa4d..8fa7f9f 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -79,7 +79,7 @@ protected: vars.states.fault = ot->isFault(localResponse); vars.states.diagnostic = ot->isDiagnostic(localResponse); - setMaxModulationLevel(heatingEnabled ? 100 : 0); + setMaxModulationLevel(heatingEnabled ? settings.heating.maxModulation : 0); yield(); // Команды чтения данных котла diff --git a/src/Settings.h b/src/Settings.h index 6339f32..ceaa17f 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -32,6 +32,7 @@ struct Settings { bool turbo = false; float target = 40.0f; float hysteresis = 0.5f; + byte maxModulation = 100; byte minTemp = 20.0f; byte maxTemp = 90.0f; } heating;