From b01fbe205eb7f10d5a3dd4edd4e43ac33ac27742 Mon Sep 17 00:00:00 2001 From: lumapu Date: Mon, 21 Aug 2023 01:46:13 +0200 Subject: [PATCH] 0.7.38 * reset alarms at midnight (if inverter is not available) #1105, #1096 * add option to reset 'max' values on midnight #1102 * added default pins for CMT2300A (matching OpenDTU) --- src/CHANGES.md | 5 +++++ src/app.cpp | 40 +++++++++++++++++++++++++++++++--------- src/config/config.h | 4 ++++ src/config/settings.h | 10 +++++++--- src/defines.h | 2 +- src/hm/hmInverter.h | 6 ++++++ src/web/RestApi.h | 3 ++- src/web/html/setup.html | 8 ++++++-- src/web/web.h | 1 + 9 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 8b2ca4d6..c6daf2ac 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,10 @@ # Development Changes +## 0.7.38 - 2023-08-21 +* reset alarms at midnight (if inverter is not available) #1105, #1096 +* add option to reset 'max' values on midnight #1102 +* added default pins for CMT2300A (matching OpenDTU) + ## 0.7.37 - 2023-08-18 * fix alarm time on WebGui #1099 * added RSSI info for HMS and HMT inverters (MqTT + REST API) diff --git a/src/app.cpp b/src/app.cpp index 179e3ba3..4fd1a6a6 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -276,11 +276,11 @@ void app::updateNtp(void) { if (mMqttReconnect) { // @TODO: mMqttReconnect is variable which scope has changed if (mConfig->inst.rstValsNotAvail) everyMin(std::bind(&app::tickMinute, this), "tMin"); - if (mConfig->inst.rstYieldMidNight) { - uint32_t localTime = gTimezone.toLocal(mTimestamp); - uint32_t midTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86400); // next midnight local time - onceAt(std::bind(&app::tickMidnight, this), midTrig, "midNi"); - } + + uint32_t localTime = gTimezone.toLocal(mTimestamp); + uint32_t midTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86400); // next midnight local time + onceAt(std::bind(&app::tickMidnight, this), midTrig, "midNi"); + if (mConfig->sys.schedReboot) { uint32_t localTime = gTimezone.toLocal(mTimestamp); uint32_t rebootTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86410); // reboot 10 secs after midnght @@ -392,15 +392,37 @@ void app::tickMinute(void) { //----------------------------------------------------------------------------- void app::tickMidnight(void) { - // only triggered if 'reset values at midnight is enabled' uint32_t localTime = gTimezone.toLocal(mTimestamp); uint32_t nxtTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86400); // next midnight local time onceAt(std::bind(&app::tickMidnight, this), nxtTrig, "mid2"); - zeroIvValues(!CHECK_AVAIL, !SKIP_YIELD_DAY); + Inverter<> *iv; + for (uint8_t id = 0; id < mSys.getNumInverters(); id++) { + iv = mSys.getInverterByPos(id); + if (NULL == iv) + continue; // skip to next inverter + + // reset alarms + if(InverterStatus::OFF == iv->status) + iv->resetAlarms(); - if (mMqttEnabled) - mMqtt.tickerMidnight(); + // clear max values + if(mConfig->inst.rstMaxValsMidNight) { + uint8_t pos; + record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); + for(uint8_t i = 0; i <= iv->channels; i++) { + pos = iv->getPosByChFld(i, FLD_MP, rec); + iv->setValue(pos, rec, 0.0f); + } + } + } + + if (mConfig->inst.rstYieldMidNight) { + zeroIvValues(!CHECK_AVAIL, !SKIP_YIELD_DAY); + + if (mMqttEnabled) + mMqtt.tickerMidnight(); + } } //----------------------------------------------------------------------------- diff --git a/src/config/config.h b/src/config/config.h index c4947ec8..5169edd3 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -66,6 +66,10 @@ #define DEF_MISO_PIN 19 #define DEF_MOSI_PIN 23 #define DEF_SCLK_PIN 18 + + #define DEF_CMT_CSB 27 + #define DEF_CMT_FCSB 26 + #define DEF_CMT_IRQ 34 #else #define DEF_CS_PIN 15 #define DEF_CE_PIN 0 diff --git a/src/config/settings.h b/src/config/settings.h index a7cb6a4c..4581bb6a 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -151,6 +151,7 @@ typedef struct { bool rstYieldMidNight; bool rstValsNotAvail; bool rstValsCommStop; + bool rstMaxValsMidNight; bool startWithoutTime; float yieldEffiency; } cfgInst_t; @@ -394,9 +395,9 @@ class settings { mCfg.nrf.amplifierPower = DEF_AMPLIFIERPOWER & 0x03; mCfg.nrf.enabled = true; - mCfg.cmt.pinCsb = DEF_PIN_OFF; - mCfg.cmt.pinFcsb = DEF_PIN_OFF; - mCfg.cmt.pinIrq = DEF_PIN_OFF; + mCfg.cmt.pinCsb = DEF_CMT_CSB; + mCfg.cmt.pinFcsb = DEF_CMT_FCSB; + mCfg.cmt.pinIrq = DEF_CMT_IRQ; mCfg.cmt.enabled = false; snprintf(mCfg.ntp.addr, NTP_ADDR_LEN, "%s", DEF_NTP_SERVER_NAME); @@ -423,6 +424,7 @@ class settings { mCfg.inst.rstValsNotAvail = false; mCfg.inst.rstValsCommStop = false; mCfg.inst.startWithoutTime = false; + mCfg.inst.rstMaxValsMidNight = false; mCfg.inst.yieldEffiency = 0.955f; mCfg.led.led0 = DEF_PIN_OFF; @@ -651,6 +653,7 @@ class settings { obj[F("rstNotAvail")] = (bool)mCfg.inst.rstValsNotAvail; obj[F("rstComStop")] = (bool)mCfg.inst.rstValsCommStop; obj[F("strtWthtTime")] = (bool)mCfg.inst.startWithoutTime; + obj[F("rstMaxMidNight")] = (bool)mCfg.inst.rstMaxValsMidNight; obj[F("yldEff")] = mCfg.inst.yieldEffiency; } else { @@ -659,6 +662,7 @@ class settings { getVal(obj, F("rstNotAvail"), &mCfg.inst.rstValsNotAvail); getVal(obj, F("rstComStop"), &mCfg.inst.rstValsCommStop); getVal(obj, F("strtWthtTime"), &mCfg.inst.startWithoutTime); + getVal(obj, F("rstMaxMidNight"), &mCfg.inst.rstMaxValsMidNight); getVal(obj, F("yldEff"), &mCfg.inst.yieldEffiency); if(mCfg.inst.yieldEffiency < 0.5) diff --git a/src/defines.h b/src/defines.h index 163e22b5..021b4010 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 7 -#define VERSION_PATCH 37 +#define VERSION_PATCH 38 //------------------------------------- typedef struct { diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index cfcd134a..2ccd7610 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -556,6 +556,12 @@ class Inverter { } } + void resetAlarms() { + lastAlarm.fill({0, 0, 0}); + alarmNxtWrPos = 0; + alarmCnt = 0; + } + uint16_t parseAlarmLog(uint8_t id, uint8_t pyld[], uint8_t len) { uint8_t startOff = 2 + id * ALARM_LOG_ENTRY_SIZE; if((startOff + ALARM_LOG_ENTRY_SIZE) > len) diff --git a/src/web/RestApi.h b/src/web/RestApi.h index ddc16d52..e63ca6f4 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -342,9 +342,10 @@ class RestApi { obj[F("retries")] = String(mConfig->nrf.maxRetransPerPyld); obj[F("max_num_inverters")] = MAX_NUM_INVERTERS; obj[F("rstMid")] = (bool)mConfig->inst.rstYieldMidNight; - obj[F("rstNAvail")] = (bool)mConfig->inst.rstValsNotAvail; + obj[F("rstNotAvail")] = (bool)mConfig->inst.rstValsNotAvail; obj[F("rstComStop")] = (bool)mConfig->inst.rstValsCommStop; obj[F("strtWthtTm")] = (bool)mConfig->inst.startWithoutTime; + obj[F("rstMaxMid")] = (bool)mConfig->inst.rstMaxValsMidNight; obj[F("yldEff")] = mConfig->inst.yieldEffiency; } diff --git a/src/web/html/setup.html b/src/web/html/setup.html index fc855055..536cf2ca 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -172,6 +172,10 @@
Reset values when inverter status is 'not available'
+
+
Reset 'max' values at midnight
+
+
Start without time sync (useful in AP-Only-Mode)
@@ -653,8 +657,8 @@ function ivGlob(obj) { for(var i of [["invInterval", "interval"], ["invRetry", "retries"], ["yldEff", "yldEff"]]) document.getElementsByName(i[0])[0].value = obj[i[1]]; - for(var i of [["Mid", "rstMid"], ["ComStop", "rstComStop"], ["NotAvail", "rstNAvail"]]) - document.getElementsByName("invRst"+i[0])[0].checked = obj[i[1]]; + for(var i of ["Mid", "ComStop", "NotAvail", "MaxMid"]) + document.getElementsByName("invRst"+i)[0].checked = obj["rst" + i]; document.getElementsByName("strtWthtTm")[0].checked = obj["strtWthtTm"]; } diff --git a/src/web/web.h b/src/web/web.h index 4d8ef1e8..ae099656 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -537,6 +537,7 @@ class Web { mConfig->inst.rstValsCommStop = (request->arg("invRstComStop") == "on"); mConfig->inst.rstValsNotAvail = (request->arg("invRstNotAvail") == "on"); mConfig->inst.startWithoutTime = (request->arg("strtWthtTm") == "on"); + mConfig->inst.rstMaxValsMidNight = (request->arg("invRstMaxMid") == "on"); mConfig->inst.yieldEffiency = (request->arg("yldEff")).toFloat();