Feature: Add option to clear eventlog at midnight

This commit is contained in:
Thomas Basler 2024-05-31 00:07:28 +02:00
parent 3a4f70dc75
commit 6e607f7f67
12 changed files with 31 additions and 1 deletions

View File

@ -47,6 +47,7 @@ struct INVERTER_CONFIG_T {
uint8_t ReachableThreshold; uint8_t ReachableThreshold;
bool ZeroRuntimeDataIfUnrechable; bool ZeroRuntimeDataIfUnrechable;
bool ZeroYieldDayOnMidnight; bool ZeroYieldDayOnMidnight;
bool ClearEventlogOnMidnight;
bool YieldDayCorrection; bool YieldDayCorrection;
CHANNEL_CONFIG_T channel[INV_MAX_CHAN_COUNT]; CHANNEL_CONFIG_T channel[INV_MAX_CHAN_COUNT];
}; };

View File

@ -141,6 +141,9 @@ void HoymilesClass::loop()
if (inv->getZeroYieldDayOnMidnight()) { if (inv->getZeroYieldDayOnMidnight()) {
inv->Statistics()->zeroDailyData(); inv->Statistics()->zeroDailyData();
} }
if (inv->getClearEventlogOnMidnight()) {
inv->EventLog()->clearBuffer();
}
} }
lastWeekDay = currentWeekDay; lastWeekDay = currentWeekDay;

View File

@ -127,6 +127,16 @@ bool InverterAbstract::getZeroYieldDayOnMidnight() const
return _zeroYieldDayOnMidnight; return _zeroYieldDayOnMidnight;
} }
void InverterAbstract::setClearEventlogOnMidnight(const bool enabled)
{
_clearEventlogOnMidnight = enabled;
}
bool InverterAbstract::getClearEventlogOnMidnight() const
{
return _clearEventlogOnMidnight;
}
bool InverterAbstract::sendChangeChannelRequest() bool InverterAbstract::sendChangeChannelRequest()
{ {
return false; return false;

View File

@ -58,6 +58,9 @@ public:
void setZeroYieldDayOnMidnight(const bool enabled); void setZeroYieldDayOnMidnight(const bool enabled);
bool getZeroYieldDayOnMidnight() const; bool getZeroYieldDayOnMidnight() const;
void setClearEventlogOnMidnight(const bool enabled);
bool getClearEventlogOnMidnight() const;
void clearRxFragmentBuffer(); void clearRxFragmentBuffer();
void addRxFragment(const uint8_t fragment[], const uint8_t len); void addRxFragment(const uint8_t fragment[], const uint8_t len);
uint8_t verifyAllFragments(CommandAbstract& cmd); uint8_t verifyAllFragments(CommandAbstract& cmd);
@ -102,6 +105,7 @@ private:
bool _zeroValuesIfUnreachable = false; bool _zeroValuesIfUnreachable = false;
bool _zeroYieldDayOnMidnight = false; bool _zeroYieldDayOnMidnight = false;
bool _clearEventlogOnMidnight = false;
std::unique_ptr<AlarmLogParser> _alarmLogParser; std::unique_ptr<AlarmLogParser> _alarmLogParser;
std::unique_ptr<DevInfoParser> _devInfoParser; std::unique_ptr<DevInfoParser> _devInfoParser;
@ -109,4 +113,4 @@ private:
std::unique_ptr<PowerCommandParser> _powerCommandParser; std::unique_ptr<PowerCommandParser> _powerCommandParser;
std::unique_ptr<StatisticsParser> _statisticsParser; std::unique_ptr<StatisticsParser> _statisticsParser;
std::unique_ptr<SystemConfigParaParser> _systemConfigParaParser; std::unique_ptr<SystemConfigParaParser> _systemConfigParaParser;
}; };

View File

@ -128,6 +128,7 @@ bool ConfigurationClass::write()
inv["reachable_threshold"] = config.Inverter[i].ReachableThreshold; inv["reachable_threshold"] = config.Inverter[i].ReachableThreshold;
inv["zero_runtime"] = config.Inverter[i].ZeroRuntimeDataIfUnrechable; inv["zero_runtime"] = config.Inverter[i].ZeroRuntimeDataIfUnrechable;
inv["zero_day"] = config.Inverter[i].ZeroYieldDayOnMidnight; inv["zero_day"] = config.Inverter[i].ZeroYieldDayOnMidnight;
inv["clear_eventlog"] = config.Inverter[i].ClearEventlogOnMidnight;
inv["yieldday_correction"] = config.Inverter[i].YieldDayCorrection; inv["yieldday_correction"] = config.Inverter[i].YieldDayCorrection;
JsonArray channel = inv["channel"].to<JsonArray>(); JsonArray channel = inv["channel"].to<JsonArray>();
@ -302,6 +303,7 @@ bool ConfigurationClass::read()
config.Inverter[i].ReachableThreshold = inv["reachable_threshold"] | REACHABLE_THRESHOLD; config.Inverter[i].ReachableThreshold = inv["reachable_threshold"] | REACHABLE_THRESHOLD;
config.Inverter[i].ZeroRuntimeDataIfUnrechable = inv["zero_runtime"] | false; config.Inverter[i].ZeroRuntimeDataIfUnrechable = inv["zero_runtime"] | false;
config.Inverter[i].ZeroYieldDayOnMidnight = inv["zero_day"] | 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; config.Inverter[i].YieldDayCorrection = inv["yieldday_correction"] | false;
JsonArray channel = inv["channel"]; JsonArray channel = inv["channel"];

View File

@ -82,6 +82,7 @@ void InverterSettingsClass::init(Scheduler& scheduler)
inv->setReachableThreshold(config.Inverter[i].ReachableThreshold); inv->setReachableThreshold(config.Inverter[i].ReachableThreshold);
inv->setZeroValuesIfUnreachable(config.Inverter[i].ZeroRuntimeDataIfUnrechable); inv->setZeroValuesIfUnreachable(config.Inverter[i].ZeroRuntimeDataIfUnrechable);
inv->setZeroYieldDayOnMidnight(config.Inverter[i].ZeroYieldDayOnMidnight); inv->setZeroYieldDayOnMidnight(config.Inverter[i].ZeroYieldDayOnMidnight);
inv->setClearEventlogOnMidnight(config.Inverter[i].ClearEventlogOnMidnight);
inv->Statistics()->setYieldDayCorrection(config.Inverter[i].YieldDayCorrection); inv->Statistics()->setYieldDayCorrection(config.Inverter[i].YieldDayCorrection);
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) { for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
inv->Statistics()->setStringMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower); inv->Statistics()->setStringMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower);

View File

@ -55,6 +55,7 @@ void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request)
obj["reachable_threshold"] = config.Inverter[i].ReachableThreshold; obj["reachable_threshold"] = config.Inverter[i].ReachableThreshold;
obj["zero_runtime"] = config.Inverter[i].ZeroRuntimeDataIfUnrechable; obj["zero_runtime"] = config.Inverter[i].ZeroRuntimeDataIfUnrechable;
obj["zero_day"] = config.Inverter[i].ZeroYieldDayOnMidnight; obj["zero_day"] = config.Inverter[i].ZeroYieldDayOnMidnight;
obj["clear_eventlog"] = config.Inverter[i].ClearEventlogOnMidnight;
obj["yieldday_correction"] = config.Inverter[i].YieldDayCorrection; obj["yieldday_correction"] = config.Inverter[i].YieldDayCorrection;
auto inv = Hoymiles.getInverterBySerial(config.Inverter[i].Serial); 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.ReachableThreshold = root["reachable_threshold"] | REACHABLE_THRESHOLD;
inverter.ZeroRuntimeDataIfUnrechable = root["zero_runtime"] | false; inverter.ZeroRuntimeDataIfUnrechable = root["zero_runtime"] | false;
inverter.ZeroYieldDayOnMidnight = root["zero_day"] | false; inverter.ZeroYieldDayOnMidnight = root["zero_day"] | false;
inverter.ClearEventlogOnMidnight = root["clear_eventlog"] | false;
inverter.YieldDayCorrection = root["yieldday_correction"] | false; inverter.YieldDayCorrection = root["yieldday_correction"] | false;
arrayCount++; arrayCount++;
@ -254,6 +256,7 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
inv->setReachableThreshold(inverter.ReachableThreshold); inv->setReachableThreshold(inverter.ReachableThreshold);
inv->setZeroValuesIfUnreachable(inverter.ZeroRuntimeDataIfUnrechable); inv->setZeroValuesIfUnreachable(inverter.ZeroRuntimeDataIfUnrechable);
inv->setZeroYieldDayOnMidnight(inverter.ZeroYieldDayOnMidnight); inv->setZeroYieldDayOnMidnight(inverter.ZeroYieldDayOnMidnight);
inv->setClearEventlogOnMidnight(inverter.ClearEventlogOnMidnight);
inv->Statistics()->setYieldDayCorrection(inverter.YieldDayCorrection); inv->Statistics()->setYieldDayCorrection(inverter.YieldDayCorrection);
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) { for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower); inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower);

View File

@ -515,6 +515,7 @@
"ZeroRuntimeHint": "Nulle Laufzeit Daten (keine Ertragsdaten), wenn der Wechselrichter nicht erreichbar ist.", "ZeroRuntimeHint": "Nulle Laufzeit Daten (keine Ertragsdaten), wenn der Wechselrichter nicht erreichbar ist.",
"ZeroDay": "Nulle Tagesertrag um Mitternacht", "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)", "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", "Cancel": "@:base.Cancel",
"Save": "@:base.Save", "Save": "@:base.Save",
"DeleteMsg": "Soll der Wechselrichter \"{name}\" mit der Seriennummer {serial} wirklich gelöscht werden?", "DeleteMsg": "Soll der Wechselrichter \"{name}\" mit der Seriennummer {serial} wirklich gelöscht werden?",

View File

@ -515,6 +515,7 @@
"ZeroRuntimeHint": "Zero runtime data (no yield data) if inverter becomes unreachable.", "ZeroRuntimeHint": "Zero runtime data (no yield data) if inverter becomes unreachable.",
"ZeroDay": "Zero daily yield at midnight", "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)", "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", "Cancel": "@:base.Cancel",
"Save": "@:base.Save", "Save": "@:base.Save",
"DeleteMsg": "Are you sure you want to delete the inverter \"{name}\" with serial number {serial}?", "DeleteMsg": "Are you sure you want to delete the inverter \"{name}\" with serial number {serial}?",

View File

@ -515,6 +515,7 @@
"ZeroRuntimeHint": "Zero runtime data (no yield data) if inverter becomes unreachable.", "ZeroRuntimeHint": "Zero runtime data (no yield data) if inverter becomes unreachable.",
"ZeroDay": "Zero daily yield at midnight", "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)", "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", "Cancel": "@:base.Cancel",
"Save": "@:base.Save", "Save": "@:base.Save",
"DeleteMsg": "Êtes-vous sûr de vouloir supprimer l'onduleur \"{name}\" avec le numéro de série \"{serial}\" ?", "DeleteMsg": "Êtes-vous sûr de vouloir supprimer l'onduleur \"{name}\" avec le numéro de série \"{serial}\" ?",

View File

@ -17,6 +17,7 @@ export interface Inverter {
reachable_threshold: number; reachable_threshold: number;
zero_runtime: boolean; zero_runtime: boolean;
zero_day: boolean; zero_day: boolean;
clear_eventlog: boolean;
yieldday_correction: boolean; yieldday_correction: boolean;
channel: Array<InverterChannel>; channel: Array<InverterChannel>;
} }

View File

@ -176,6 +176,8 @@
<InputElement :label="$t('inverteradmin.ZeroDay')" v-model="selectedInverterData.zero_day" type="checkbox" <InputElement :label="$t('inverteradmin.ZeroDay')" v-model="selectedInverterData.zero_day" type="checkbox"
:tooltip="$t('inverteradmin.ZeroDayHint')" wide /> :tooltip="$t('inverteradmin.ZeroDayHint')" wide />
<InputElement :label="$t('inverteradmin.ClearEventlog')" v-model="selectedInverterData.clear_eventlog" type="checkbox" wide />
<InputElement :label="$t('inverteradmin.YieldDayCorrection')" <InputElement :label="$t('inverteradmin.YieldDayCorrection')"
v-model="selectedInverterData.yieldday_correction" type="checkbox" v-model="selectedInverterData.yieldday_correction" type="checkbox"
:tooltip="$t('inverteradmin.YieldDayCorrectionHint')" wide /> :tooltip="$t('inverteradmin.YieldDayCorrectionHint')" wide />