Browse Source

0.8.53

* fix history graph
* fix MqTT yield day #1331
pull/1356/head
lumapu 9 months ago
parent
commit
ca6ebfe0fe
  1. 4
      src/CHANGES.md
  2. 16
      src/app.cpp
  3. 1
      src/app.h
  4. 2
      src/defines.h
  5. 15
      src/publisher/pubMqtt.h
  6. 35
      src/publisher/pubMqttIvData.h

4
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

16
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);
}
}
//-----------------------------------------------------------------------------

1
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);

2
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 {

15
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<bool, MAX_NUM_INVERTERS> mSendAlarm{};
subscriptionCb mSubscriptionCb;
bool mLastAnyAvail;
bool mZeroValues;
InverterStatus mLastIvState[MAX_NUM_INVERTERS];
uint32_t mIvLastRTRpub[MAX_NUM_INVERTERS];
uint16_t mIntervalTimeout;

35
src/publisher/pubMqttIvData.h

@ -22,11 +22,11 @@ template<class HMSYSTEM>
class PubMqttIvData {
public:
void setup(HMSYSTEM *sys, uint32_t *utcTs, std::queue<sendListCmdIv> *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<sendListCmdIv> *mSendList;
};

Loading…
Cancel
Save