From b4137d4da9836e050e299f65289d0fc609a8d364 Mon Sep 17 00:00:00 2001 From: battifreund Date: Wed, 31 Aug 2022 09:16:11 +0200 Subject: [PATCH] Option for expire_after --- include/Configuration.h | 4 +++- include/defaults.h | 1 + src/Configuration.cpp | 5 +++++ src/MqttHassPublishing.cpp | 4 +++- src/WebApi_mqtt.cpp | 21 ++++++++++++++++++++- webapp/src/components/MqttAdminView.vue | 11 +++++++++++ webapp/src/components/MqttInfoView.vue | 10 ++++++++++ webapp_dist/js/app.js.gz | Bin 297578 -> 297667 bytes webapp_dist/zones.json.gz | Bin 4100 -> 4121 bytes 9 files changed, 53 insertions(+), 3 deletions(-) diff --git a/include/Configuration.h b/include/Configuration.h index b5d64be3..83bdf757 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -4,7 +4,7 @@ #include #define CONFIG_FILENAME "/config.bin" -#define CONFIG_VERSION 0x00011400 // 0.1.20 // make sure to clean all after change +#define CONFIG_VERSION 0x00011500 // 0.1.21 // make sure to clean all after change #define WIFI_MAX_SSID_STRLEN 31 #define WIFI_MAX_PASSWORD_STRLEN 64 @@ -76,6 +76,8 @@ struct CONFIG_T { char Mqtt_RootCaCert[MQTT_MAX_ROOT_CA_CERT_STRLEN + 1]; char Mqtt_Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1]; + + bool Mqtt_Hass_Expire; }; class ConfigurationClass { diff --git a/include/defaults.h b/include/defaults.h index fefd8606..298a87ff 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -72,6 +72,7 @@ #define DTU_PA_LEVEL 0 #define MQTT_HASS_ENABLED false +#define MQTT_HASS_EXPIRE true #define MQTT_HASS_RETAIN true #define MQTT_HASS_TOPIC "homeassistant/" #define MQTT_HASS_INDIVIDUALPANELS false \ No newline at end of file diff --git a/src/Configuration.cpp b/src/Configuration.cpp index de7f58fc..8926ea9a 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -53,6 +53,7 @@ void ConfigurationClass::init() config.Dtu_PaLevel = DTU_PA_LEVEL; config.Mqtt_Hass_Enabled = MQTT_HASS_ENABLED; + config.Mqtt_Hass_Expire = MQTT_HASS_EXPIRE; config.Mqtt_Hass_Retain = MQTT_HASS_RETAIN; strlcpy(config.Mqtt_Hass_Topic, MQTT_HASS_TOPIC, sizeof(config.Mqtt_Hass_Topic)); config.Mqtt_Hass_IndividualPanels = MQTT_HASS_INDIVIDUALPANELS; @@ -151,6 +152,10 @@ void ConfigurationClass::migrate() strlcpy(config.Mqtt_Hostname, config.Mqtt_Hostname_Short, sizeof(config.Mqtt_Hostname_Short)); } + if (config.Cfg_Version < 0x00011500) { + config.Mqtt_Hass_Expire = MQTT_HASS_EXPIRE; + } + config.Cfg_Version = CONFIG_VERSION; write(); } diff --git a/src/MqttHassPublishing.cpp b/src/MqttHassPublishing.cpp index 8ffda9af..99f46871 100644 --- a/src/MqttHassPublishing.cpp +++ b/src/MqttHassPublishing.cpp @@ -116,7 +116,9 @@ void MqttHassPublishingClass::publishField(std::shared_ptr inv root[F("unit_of_meas")] = inv->Statistics()->getChannelFieldUnit(channel, fieldType.fieldId); root[F("uniq_id")] = String(serial) + "_ch" + String(channel) + "_" + fieldName; root[F("dev")] = deviceObj; - root[F("exp_aft")] = Hoymiles.getNumInverters() * Configuration.get().Mqtt_PublishInterval * 2; + if (Configuration.get().Mqtt_Hass_Expire) { + root[F("exp_aft")] = Hoymiles.getNumInverters() * Configuration.get().Mqtt_PublishInterval * 2; + } if (devCls != 0) { root[F("dev_cla")] = devCls; } diff --git a/src/WebApi_mqtt.cpp b/src/WebApi_mqtt.cpp index 97d078e7..e0903ad1 100644 --- a/src/WebApi_mqtt.cpp +++ b/src/WebApi_mqtt.cpp @@ -43,6 +43,7 @@ void WebApiMqttClass::onMqttStatus(AsyncWebServerRequest* request) root[F("mqtt_lwt_topic")] = String(config.Mqtt_Topic) + config.Mqtt_LwtTopic; root[F("mqtt_publish_interval")] = config.Mqtt_PublishInterval; root[F("mqtt_hass_enabled")] = config.Mqtt_Hass_Enabled; + root[F("mqtt_hass_expire")] = config.Mqtt_Hass_Expire; root[F("mqtt_hass_retain")] = config.Mqtt_Hass_Retain; root[F("mqtt_hass_topic")] = config.Mqtt_Hass_Topic; root[F("mqtt_hass_individualpanels")] = config.Mqtt_Hass_IndividualPanels; @@ -71,6 +72,7 @@ void WebApiMqttClass::onMqttAdminGet(AsyncWebServerRequest* request) root[F("mqtt_lwt_offline")] = config.Mqtt_LwtValue_Offline; root[F("mqtt_publish_interval")] = config.Mqtt_PublishInterval; root[F("mqtt_hass_enabled")] = config.Mqtt_Hass_Enabled; + root[F("mqtt_hass_expire")] = config.Mqtt_Hass_Expire; root[F("mqtt_hass_retain")] = config.Mqtt_Hass_Retain; root[F("mqtt_hass_topic")] = config.Mqtt_Hass_Topic; root[F("mqtt_hass_individualpanels")] = config.Mqtt_Hass_IndividualPanels; @@ -111,7 +113,23 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request) return; } - if (!(root.containsKey("mqtt_enabled") && root.containsKey("mqtt_hostname") && root.containsKey("mqtt_port") && root.containsKey("mqtt_username") && root.containsKey("mqtt_password") && root.containsKey("mqtt_topic") && root.containsKey("mqtt_retain") && root.containsKey("mqtt_tls") && root.containsKey("mqtt_lwt_topic") && root.containsKey("mqtt_lwt_online") && root.containsKey("mqtt_lwt_offline") && root.containsKey("mqtt_publish_interval") && root.containsKey("mqtt_hass_enabled") && root.containsKey("mqtt_hass_retain") && root.containsKey("mqtt_hass_topic") && root.containsKey("mqtt_hass_individualpanels"))) { + if (!(root.containsKey("mqtt_enabled") && + root.containsKey("mqtt_hostname") && + root.containsKey("mqtt_port") && + root.containsKey("mqtt_username") && + root.containsKey("mqtt_password") && + root.containsKey("mqtt_topic") && + root.containsKey("mqtt_retain") && + root.containsKey("mqtt_tls") && + root.containsKey("mqtt_lwt_topic") && + root.containsKey("mqtt_lwt_online") && + root.containsKey("mqtt_lwt_offline") && + root.containsKey("mqtt_publish_interval") && + root.containsKey("mqtt_hass_enabled") && + root.containsKey("mqtt_hass_expire") && + root.containsKey("mqtt_hass_retain") && + root.containsKey("mqtt_hass_topic") && + root.containsKey("mqtt_hass_individualpanels"))) { retMsg[F("message")] = F("Values are missing!"); response->setLength(); request->send(response); @@ -233,6 +251,7 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request) strcpy(config.Mqtt_LwtValue_Offline, root[F("mqtt_lwt_offline")].as().c_str()); config.Mqtt_PublishInterval = root[F("mqtt_publish_interval")].as(); config.Mqtt_Hass_Enabled = root[F("mqtt_hass_enabled")].as(); + config.Mqtt_Hass_Expire = root[F("mqtt_hass_expire")].as(); config.Mqtt_Hass_Retain = root[F("mqtt_hass_retain")].as(); config.Mqtt_Hass_IndividualPanels = root[F("mqtt_hass_individualpanels")].as(); strcpy(config.Mqtt_Hass_Topic, root[F("mqtt_hass_topic")].as().c_str()); diff --git a/webapp/src/components/MqttAdminView.vue b/webapp/src/components/MqttAdminView.vue index 2c70fcda..d501b154 100644 --- a/webapp/src/components/MqttAdminView.vue +++ b/webapp/src/components/MqttAdminView.vue @@ -195,6 +195,16 @@ +
+ +
+
+ +
+
+
+
@@ -241,6 +251,7 @@ export default defineComponent({ mqtt_lwt_online: "", mqtt_lwt_offline: "", mqtt_hass_enabled: false, + mqtt_hass_expire: false, mqtt_hass_retain: false, mqtt_hass_topic: "", mqtt_hass_individualpanels: false diff --git a/webapp/src/components/MqttInfoView.vue b/webapp/src/components/MqttInfoView.vue index 97738dfb..46ff4194 100644 --- a/webapp/src/components/MqttInfoView.vue +++ b/webapp/src/components/MqttInfoView.vue @@ -107,6 +107,16 @@ disabled + + Expire + + enabled + disabled + + Individual Panels