From 6e607f7f67a535078a337681a249a82b316876c7 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Fri, 31 May 2024 00:07:28 +0200 Subject: [PATCH] Feature: Add option to clear eventlog at midnight --- include/Configuration.h | 1 + lib/Hoymiles/src/Hoymiles.cpp | 3 +++ lib/Hoymiles/src/inverters/InverterAbstract.cpp | 10 ++++++++++ lib/Hoymiles/src/inverters/InverterAbstract.h | 6 +++++- src/Configuration.cpp | 2 ++ src/InverterSettings.cpp | 1 + src/WebApi_inverter.cpp | 3 +++ webapp/src/locales/de.json | 1 + webapp/src/locales/en.json | 1 + webapp/src/locales/fr.json | 1 + webapp/src/types/InverterConfig.ts | 1 + webapp/src/views/InverterAdminView.vue | 2 ++ 12 files changed, 31 insertions(+), 1 deletion(-) diff --git a/include/Configuration.h b/include/Configuration.h index e13b558..0ad2cb3 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -47,6 +47,7 @@ struct INVERTER_CONFIG_T { uint8_t ReachableThreshold; bool ZeroRuntimeDataIfUnrechable; bool ZeroYieldDayOnMidnight; + bool ClearEventlogOnMidnight; bool YieldDayCorrection; CHANNEL_CONFIG_T channel[INV_MAX_CHAN_COUNT]; }; diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index b145859..1416a73 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -141,6 +141,9 @@ void HoymilesClass::loop() if (inv->getZeroYieldDayOnMidnight()) { inv->Statistics()->zeroDailyData(); } + if (inv->getClearEventlogOnMidnight()) { + inv->EventLog()->clearBuffer(); + } } lastWeekDay = currentWeekDay; diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 17a0d4e..68d6118 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -127,6 +127,16 @@ bool InverterAbstract::getZeroYieldDayOnMidnight() const return _zeroYieldDayOnMidnight; } +void InverterAbstract::setClearEventlogOnMidnight(const bool enabled) +{ + _clearEventlogOnMidnight = enabled; +} + +bool InverterAbstract::getClearEventlogOnMidnight() const +{ + return _clearEventlogOnMidnight; +} + bool InverterAbstract::sendChangeChannelRequest() { return false; diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 3d9929d..2a51079 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -58,6 +58,9 @@ public: void setZeroYieldDayOnMidnight(const bool enabled); bool getZeroYieldDayOnMidnight() const; + void setClearEventlogOnMidnight(const bool enabled); + bool getClearEventlogOnMidnight() const; + void clearRxFragmentBuffer(); void addRxFragment(const uint8_t fragment[], const uint8_t len); uint8_t verifyAllFragments(CommandAbstract& cmd); @@ -102,6 +105,7 @@ private: bool _zeroValuesIfUnreachable = false; bool _zeroYieldDayOnMidnight = false; + bool _clearEventlogOnMidnight = false; std::unique_ptr _alarmLogParser; std::unique_ptr _devInfoParser; @@ -109,4 +113,4 @@ private: std::unique_ptr _powerCommandParser; std::unique_ptr _statisticsParser; std::unique_ptr _systemConfigParaParser; -}; \ No newline at end of file +}; diff --git a/src/Configuration.cpp b/src/Configuration.cpp index 8e80307..780abb8 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -128,6 +128,7 @@ bool ConfigurationClass::write() inv["reachable_threshold"] = config.Inverter[i].ReachableThreshold; inv["zero_runtime"] = config.Inverter[i].ZeroRuntimeDataIfUnrechable; inv["zero_day"] = config.Inverter[i].ZeroYieldDayOnMidnight; + inv["clear_eventlog"] = config.Inverter[i].ClearEventlogOnMidnight; inv["yieldday_correction"] = config.Inverter[i].YieldDayCorrection; JsonArray channel = inv["channel"].to(); @@ -302,6 +303,7 @@ bool ConfigurationClass::read() config.Inverter[i].ReachableThreshold = inv["reachable_threshold"] | REACHABLE_THRESHOLD; config.Inverter[i].ZeroRuntimeDataIfUnrechable = inv["zero_runtime"] | false; config.Inverter[i].ZeroYieldDayOnMidnight = inv["zero_day"] | false; + config.Inverter[i].ClearEventlogOnMidnight = inv["clear_eventlog"] | false; config.Inverter[i].YieldDayCorrection = inv["yieldday_correction"] | false; JsonArray channel = inv["channel"]; diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index c08585e..0e90318 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -82,6 +82,7 @@ void InverterSettingsClass::init(Scheduler& scheduler) inv->setReachableThreshold(config.Inverter[i].ReachableThreshold); inv->setZeroValuesIfUnreachable(config.Inverter[i].ZeroRuntimeDataIfUnrechable); inv->setZeroYieldDayOnMidnight(config.Inverter[i].ZeroYieldDayOnMidnight); + inv->setClearEventlogOnMidnight(config.Inverter[i].ClearEventlogOnMidnight); inv->Statistics()->setYieldDayCorrection(config.Inverter[i].YieldDayCorrection); for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) { inv->Statistics()->setStringMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower); diff --git a/src/WebApi_inverter.cpp b/src/WebApi_inverter.cpp index 2d9a563..0a38d63 100644 --- a/src/WebApi_inverter.cpp +++ b/src/WebApi_inverter.cpp @@ -55,6 +55,7 @@ void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request) obj["reachable_threshold"] = config.Inverter[i].ReachableThreshold; obj["zero_runtime"] = config.Inverter[i].ZeroRuntimeDataIfUnrechable; obj["zero_day"] = config.Inverter[i].ZeroYieldDayOnMidnight; + obj["clear_eventlog"] = config.Inverter[i].ClearEventlogOnMidnight; obj["yieldday_correction"] = config.Inverter[i].YieldDayCorrection; auto inv = Hoymiles.getInverterBySerial(config.Inverter[i].Serial); @@ -225,6 +226,7 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request) inverter.ReachableThreshold = root["reachable_threshold"] | REACHABLE_THRESHOLD; inverter.ZeroRuntimeDataIfUnrechable = root["zero_runtime"] | false; inverter.ZeroYieldDayOnMidnight = root["zero_day"] | false; + inverter.ClearEventlogOnMidnight = root["clear_eventlog"] | false; inverter.YieldDayCorrection = root["yieldday_correction"] | false; arrayCount++; @@ -254,6 +256,7 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request) inv->setReachableThreshold(inverter.ReachableThreshold); inv->setZeroValuesIfUnreachable(inverter.ZeroRuntimeDataIfUnrechable); inv->setZeroYieldDayOnMidnight(inverter.ZeroYieldDayOnMidnight); + inv->setClearEventlogOnMidnight(inverter.ClearEventlogOnMidnight); inv->Statistics()->setYieldDayCorrection(inverter.YieldDayCorrection); for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) { inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower); diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index e4b8f62..8b13227 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -515,6 +515,7 @@ "ZeroRuntimeHint": "Nulle Laufzeit Daten (keine Ertragsdaten), wenn der Wechselrichter nicht erreichbar ist.", "ZeroDay": "Nulle Tagesertrag um Mitternacht", "ZeroDayHint": "Das funktioniert nur wenn der Wechselrichter nicht erreichbar ist. Wenn Daten aus dem Wechselrichter gelesen werden, werden deren Werte verwendet. (Ein Reset erfolgt nur beim Neustarten)", + "ClearEventlog": "Lösche Ereignisanzeige um Mitternacht", "Cancel": "@:base.Cancel", "Save": "@:base.Save", "DeleteMsg": "Soll der Wechselrichter \"{name}\" mit der Seriennummer {serial} wirklich gelöscht werden?", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 5eb9c4b..c918e53 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -515,6 +515,7 @@ "ZeroRuntimeHint": "Zero runtime data (no yield data) if inverter becomes unreachable.", "ZeroDay": "Zero daily yield at midnight", "ZeroDayHint": "This only works if the inverter is unreachable. If data is read from the inverter, it's values will be used. (Reset only occours on power cycle)", + "ClearEventlog": "Clear Eventlog at midnight", "Cancel": "@:base.Cancel", "Save": "@:base.Save", "DeleteMsg": "Are you sure you want to delete the inverter \"{name}\" with serial number {serial}?", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 5b9673f..acd1280 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -515,6 +515,7 @@ "ZeroRuntimeHint": "Zero runtime data (no yield data) if inverter becomes unreachable.", "ZeroDay": "Zero daily yield at midnight", "ZeroDayHint": "This only works if the inverter is unreachable. If data is read from the inverter, it's values will be used. (Reset only occours on power cycle)", + "ClearEventlog": "Clear Eventlog at midnight", "Cancel": "@:base.Cancel", "Save": "@:base.Save", "DeleteMsg": "Êtes-vous sûr de vouloir supprimer l'onduleur \"{name}\" avec le numéro de série \"{serial}\" ?", diff --git a/webapp/src/types/InverterConfig.ts b/webapp/src/types/InverterConfig.ts index da7fa43..ba268c4 100644 --- a/webapp/src/types/InverterConfig.ts +++ b/webapp/src/types/InverterConfig.ts @@ -17,6 +17,7 @@ export interface Inverter { reachable_threshold: number; zero_runtime: boolean; zero_day: boolean; + clear_eventlog: boolean; yieldday_correction: boolean; channel: Array; } diff --git a/webapp/src/views/InverterAdminView.vue b/webapp/src/views/InverterAdminView.vue index 9216f59..5953a7a 100644 --- a/webapp/src/views/InverterAdminView.vue +++ b/webapp/src/views/InverterAdminView.vue @@ -176,6 +176,8 @@ + +