diff --git a/include/Configuration.h b/include/Configuration.h index a88fa236..7e33e72d 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -77,6 +77,7 @@ struct CONFIG_T { bool Vedirect_Enabled; bool Vedirect_UpdatesOnly; + uint32_t Vedirect_PollInterval; char Mqtt_Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1]; }; diff --git a/include/defaults.h b/include/defaults.h index 4068b193..0f8582a5 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -77,4 +77,5 @@ #define MQTT_HASS_INDIVIDUALPANELS false #define VEDIRECT_ENABLED false -#define VEDIRECT_UPDATESONLY true \ No newline at end of file +#define VEDIRECT_UPDATESONLY true +#define VEDIRECT_POLL_INTERVAL 5 \ No newline at end of file diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp index 13c39e34..e29b8871 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp @@ -63,16 +63,27 @@ void VeDirectFrameHandler::init() Serial2.flush(); } +void VeDirectFrameHandler::setPollInterval(uint32_t interval) +{ + _pollInterval = interval; +} + void VeDirectFrameHandler::loop() { unsigned long now = millis(); - while ( Serial2.available()) { - if ((millis() - now) > 500) { - now = millis(); - yield(); + if (millis() - _lastPoll > (_pollInterval * 1000)) { + Serial.print(F("Start polling ve.direct interface... ")); + + while ( Serial2.available()) { + if ((millis() - now) > 500) { + now = millis(); + yield(); + } + rxData(Serial2.read()); } - rxData(Serial2.read()); + _lastPoll = millis(); + Serial.println(F("done")); } } diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h index 13f1817d..279d2546 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h @@ -30,6 +30,7 @@ public: VeDirectFrameHandler(); void init(); + void setPollInterval(uint32_t interval); void loop(); uint32_t getLastUpdate(); void setLastUpdate(); @@ -74,6 +75,8 @@ private: void logE(const char *, const char *); bool hexRxEvent(uint8_t); uint32_t _lastUpdate = 0; + uint32_t _pollInterval; + uint32_t _lastPoll = 0; }; extern VeDirectFrameHandler VeDirect; diff --git a/src/Configuration.cpp b/src/Configuration.cpp index 46fd73ab..69457a12 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -59,6 +59,7 @@ void ConfigurationClass::init() config.Vedirect_Enabled = VEDIRECT_ENABLED; config.Vedirect_UpdatesOnly = VEDIRECT_UPDATESONLY; + config.Vedirect_PollInterval = VEDIRECT_POLL_INTERVAL; } bool ConfigurationClass::write() @@ -150,6 +151,7 @@ void ConfigurationClass::migrate() strlcpy(config.Mqtt_RootCaCert, MQTT_ROOT_CA_CERT, sizeof(config.Mqtt_RootCaCert)); config.Vedirect_Enabled = VEDIRECT_ENABLED; config.Vedirect_UpdatesOnly = VEDIRECT_UPDATESONLY; + config.Vedirect_PollInterval = VEDIRECT_POLL_INTERVAL; } if (config.Cfg_Version < 0x00011400) { diff --git a/src/WebApi_vedirect.cpp b/src/WebApi_vedirect.cpp index ea0e4dcc..c7dd3a87 100644 --- a/src/WebApi_vedirect.cpp +++ b/src/WebApi_vedirect.cpp @@ -3,6 +3,7 @@ * Copyright (C) 2022 Thomas Basler and others */ #include "WebApi_vedirect.h" +#include "VeDirectFrameHandler.h" #include "ArduinoJson.h" #include "AsyncJson.h" #include "Configuration.h" @@ -30,6 +31,7 @@ void WebApiVedirectClass::onVedirectStatus(AsyncWebServerRequest* request) CONFIG_T& config = Configuration.get(); root[F("vedirect_enabled")] = config.Vedirect_Enabled; + root[F("vedirect_pollinterval")] = config.Vedirect_PollInterval; root[F("vedirect_updatesonly")] = config.Vedirect_UpdatesOnly; response->setLength(); @@ -43,6 +45,7 @@ void WebApiVedirectClass::onVedirectAdminGet(AsyncWebServerRequest* request) CONFIG_T& config = Configuration.get(); root[F("vedirect_enabled")] = config.Vedirect_Enabled; + root[F("vedirect_pollinterval")] = config.Vedirect_PollInterval; root[F("vedirect_updatesonly")] = config.Vedirect_UpdatesOnly; response->setLength(); @@ -81,16 +84,24 @@ void WebApiVedirectClass::onVedirectAdminPost(AsyncWebServerRequest* request) return; } - if (!(root.containsKey("vedirect_enabled"))) { + if (!(root.containsKey("vedirect_enabled") && root.containsKey("vedirect_pollinterval") && root.containsKey("vedirect_updatesonly")) ) { retMsg[F("message")] = F("Values are missing!"); response->setLength(); request->send(response); return; } + if (root[F("vedirect_pollinterval")].as() == 0) { + retMsg[F("message")] = F("Poll interval must be greater zero!"); + response->setLength(); + request->send(response); + return; + } + CONFIG_T& config = Configuration.get(); config.Vedirect_Enabled = root[F("vedirect_enabled")].as(); config.Vedirect_UpdatesOnly = root[F("vedirect_updatesonly")].as(); + config.Vedirect_PollInterval = root[F("vedirect_pollinterval")].as(); Configuration.write(); retMsg[F("type")] = F("success"); @@ -99,5 +110,5 @@ void WebApiVedirectClass::onVedirectAdminPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); - + VeDirect.setPollInterval(config.Vedirect_PollInterval); } \ No newline at end of file diff --git a/src/WebApi_ws_vedirect_live.cpp b/src/WebApi_ws_vedirect_live.cpp index b84e653b..04de8e10 100644 --- a/src/WebApi_ws_vedirect_live.cpp +++ b/src/WebApi_ws_vedirect_live.cpp @@ -105,6 +105,8 @@ void WebApiWsVedirectLiveClass::generateJsonResponse(JsonVariant& root) root[F(VeDirect.veName[i])] = VeDirect.veValue[i]; } } + root[F("data_age")] = (millis() - VeDirect.getLastUpdate() ) / 1000; + root[F("age_critical")] = ((millis() - VeDirect.getLastUpdate()) / 1000) > Configuration.get().Vedirect_PollInterval * 5; if (VeDirect.getLastUpdate() > _newestVedirectTimestamp) { _newestVedirectTimestamp = VeDirect.getLastUpdate(); diff --git a/src/main.cpp b/src/main.cpp index 74980055..9058c9f6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -103,6 +103,7 @@ void setup() // Initialize ve.direct communication Serial.print(F("Initialize ve.direct interface... ")); VeDirect.init(); + VeDirect.setPollInterval(config.Vedirect_PollInterval); Serial.println(F("done")); } diff --git a/webapp/src/components/VedirectAdminView.vue b/webapp/src/components/VedirectAdminView.vue index 6f854e85..e3326d89 100644 --- a/webapp/src/components/VedirectAdminView.vue +++ b/webapp/src/components/VedirectAdminView.vue @@ -18,14 +18,25 @@
Ve.direct Configuration
- -
+ +
+
+ +
+
+ + seconds +
+
+
@@ -57,6 +68,7 @@ export default defineComponent({ dataLoading: true, vedirectConfigList: { vedirect_enabled: false, + vedirect_pollinterval: 0, vedirect_updatesonly: true, }, alertMessage: "", diff --git a/webapp_dist/js/app.js.gz b/webapp_dist/js/app.js.gz index 741ef5b5..d97c5b0f 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ