From ca6ebfe0fe95d8cfd95956243e4f94f43070de90 Mon Sep 17 00:00:00 2001 From: lumapu Date: Fri, 12 Jan 2024 21:42:22 +0100 Subject: [PATCH] 0.8.53 * fix history graph * fix MqTT yield day #1331 --- src/CHANGES.md | 4 ++++ src/app.cpp | 16 ++++++++++------ src/app.h | 1 + src/defines.h | 2 +- src/publisher/pubMqtt.h | 15 +++++---------- src/publisher/pubMqttIvData.h | 35 ++++++++++++++++++----------------- 6 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 34ea7b72..3fb87fce 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,9 @@ # Development Changes +## 0.8.53 - 2024-01-12 +* fix history graph +* fix MqTT yield day #1331 + ## 0.8.52 - 2024-01-11 * possible fix of 'division by zero' #1345 * fix lang #1348 #1346 diff --git a/src/app.cpp b/src/app.cpp index 88135099..97afe16f 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -152,7 +152,7 @@ void app::regularTickers(void) { //everySec([this]() { mImprov.tickSerial(); }, "impro"); #endif - everySec(std::bind(&HistoryType::tickerSecond, mHistory), "hist"); + everySec(std::bind(&HistoryType::tickerSecond, &mHistory), "hist"); } #if defined(ETHERNET) @@ -241,7 +241,7 @@ void app::tickCalcSunrise(void) { if (mMqttEnabled) { tickSun(); nxtTrig = mSunrise + mConfig->sun.offsetSecMorning + 1; // one second safety to trigger correctly - onceAt(std::bind(&app::tickSun, this), nxtTrig, "mqSr"); // trigger on sunrise to update 'dis_night_comm' + onceAt(std::bind(&app::tickSunrise, this), nxtTrig, "mqSr"); // trigger on sunrise to update 'dis_night_comm' } } @@ -291,6 +291,13 @@ void app::tickSun(void) { once(std::bind(&app::tickSun, this), 1, "mqSun"); // MQTT not connected, retry } +//----------------------------------------------------------------------------- +void app::tickSunrise(void) { + // only used and enabled by MQTT (see setup()) + if (!mMqtt.tickerSun(mSunrise, mSunset, mConfig->sun.offsetSecMorning, mConfig->sun.offsetSecEvening, true)) + once(std::bind(&app::tickSun, this), 1, "mqSun"); // MQTT not connected, retry +} + //----------------------------------------------------------------------------- void app::tickZeroValues(void) { zeroIvValues(!CHECK_AVAIL, SKIP_YIELD_DAY); @@ -423,11 +430,8 @@ void app:: zeroIvValues(bool checkAvail, bool skipYieldDay) { changed = true; } - if(changed) { - if(mMqttEnabled && !skipYieldDay) - mMqtt.setZeroValuesEnable(); + if(changed) payloadEventListener(RealTimeRunData_Debug, NULL); - } } //----------------------------------------------------------------------------- diff --git a/src/app.h b/src/app.h index a4e51113..04a7f1cc 100644 --- a/src/app.h +++ b/src/app.h @@ -314,6 +314,7 @@ class app : public IApp, public ah::Scheduler { void tickCalcSunrise(void); void tickIVCommunication(void); void tickSun(void); + void tickSunrise(void); void tickComm(void); void tickSend(void); void tickMinute(void); diff --git a/src/defines.h b/src/defines.h index e6a1d147..0fb35f2f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 52 +#define VERSION_PATCH 53 //------------------------------------- typedef struct { diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index a1efa5fb..e36338c9 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -43,7 +43,6 @@ class PubMqtt { memset(mLastIvState, (uint8_t)InverterStatus::OFF, MAX_NUM_INVERTERS); memset(mIvLastRTRpub, 0, MAX_NUM_INVERTERS * 4); mLastAnyAvail = false; - mZeroValues = false; } ~PubMqtt() { } @@ -134,7 +133,7 @@ class PubMqtt { #endif } - bool tickerSun(uint32_t sunrise, uint32_t sunset, int16_t offsM, int16_t offsE) { + bool tickerSun(uint32_t sunrise, uint32_t sunset, int16_t offsM, int16_t offsE, bool isSunrise = false) { if (!mClient.connected()) return false; @@ -153,10 +152,12 @@ class PubMqtt { publish(mSubTopic, ((iv->commEnabled) ? dict[STR_TRUE] : dict[STR_FALSE]), true); } - snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "comm_disabled"); publish(mSubTopic, (((*mUtcTimestamp > (sunset + offsE)) || (*mUtcTimestamp < (sunrise + offsM))) ? dict[STR_TRUE] : dict[STR_FALSE]), true); + if(isSunrise) + mSendIvData.resetYieldDay(); + return true; } @@ -239,10 +240,6 @@ class PubMqtt { } } - void setZeroValuesEnable(void) { - mZeroValues = true; - } - private: void onConnect(bool sessionPreset) { DPRINTLN(DBG_INFO, F("MQTT connected")); @@ -592,8 +589,7 @@ class PubMqtt { if(mSendList.empty()) return; - mSendIvData.start(mZeroValues); - mZeroValues = false; + mSendIvData.start(); mLastAnyAvail = anyAvail; } @@ -612,7 +608,6 @@ class PubMqtt { std::array mSendAlarm{}; subscriptionCb mSubscriptionCb; bool mLastAnyAvail; - bool mZeroValues; InverterStatus mLastIvState[MAX_NUM_INVERTERS]; uint32_t mIvLastRTRpub[MAX_NUM_INVERTERS]; uint16_t mIntervalTimeout; diff --git a/src/publisher/pubMqttIvData.h b/src/publisher/pubMqttIvData.h index 9a76d646..c6fc5d10 100644 --- a/src/publisher/pubMqttIvData.h +++ b/src/publisher/pubMqttIvData.h @@ -22,11 +22,11 @@ template class PubMqttIvData { public: void setup(HMSYSTEM *sys, uint32_t *utcTs, std::queue *sendList) { - mSys = sys; - mUtcTimestamp = utcTs; - mSendList = sendList; - mState = IDLE; - mZeroValues = false; + mSys = sys; + mUtcTimestamp = utcTs; + mSendList = sendList; + mState = IDLE; + mYldTotalStore = 0; mRTRDataHasBeenSent = false; @@ -42,11 +42,14 @@ class PubMqttIvData { yield(); } - bool start(bool zeroValues = false) { + void resetYieldDay() { + mYldTotalStore = 0; + } + + bool start() { if(IDLE != mState) return false; - mZeroValues = zeroValues; mRTRDataHasBeenSent = false; mState = START; return true; @@ -117,10 +120,14 @@ class PubMqttIvData { mIv->isProducing(); // recalculate status mState = SEND_DATA; } else if(mSendTotals && mTotalFound) { + if(mYldTotalStore > mTotal[2]) + mSendTotalYd = false; // don't send yield total if last value was greater + else + mYldTotalStore = mTotal[2]; + mState = SEND_TOTALS; } else { mSendList->pop(); - mZeroValues = false; mState = START; } } @@ -141,7 +148,7 @@ class PubMqttIvData { // calculate total values for RealTimeRunData_Debug if (CH0 == rec->assign[mPos].ch) { - if(mIv->getStatus() > InverterStatus::OFF) { + if(mIv->getStatus() != InverterStatus::OFF) { if(mIv->config->add2Total) { mTotalFound = true; switch (rec->assign[mPos].fieldId) { @@ -152,11 +159,7 @@ class PubMqttIvData { mTotal[1] += mIv->getValue(mPos, rec); break; case FLD_YD: { - float val = mIv->getValue(mPos, rec); - if(0 == val) // inverter restarted during day - mSendTotalYd = false; - else - mTotal[2] += val; + mTotal[2] += mIv->getValue(mPos, rec); break; } case FLD_PDC: @@ -236,7 +239,6 @@ class PubMqttIvData { mPos++; } else { mSendList->pop(); - mZeroValues = false; mPos = 0; mState = IDLE; } @@ -251,7 +253,7 @@ class PubMqttIvData { uint8_t mCmd; uint8_t mLastIvId; bool mSendTotals, mTotalFound, mAllTotalFound, mSendTotalYd; - float mTotal[4]; + float mTotal[4], mYldTotalStore; Inverter<> *mIv, *mIvSend; uint8_t mPos; @@ -259,7 +261,6 @@ class PubMqttIvData { char mSubTopic[32 + MAX_NAME_LENGTH + 1]; char mVal[140]; - bool mZeroValues; // makes sure that yield day is sent even if no inverter is online std::queue *mSendList; };