From 6ef7720324ec0c802a1aa6e1e273664d7caafb98 Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 8 Mar 2023 23:43:21 +0100 Subject: [PATCH 1/6] added Nokia display again for ESP8266 #764 changed `var` / `VAr` to SI unit `var` #732 fix MQTT retained flags for totals (P_AC, P_DC) #726, #721 --- src/CHANGES.md | 5 +++++ src/defines.h | 2 +- src/hm/miPayload.h | 6 +++--- src/plugins/Display/Display.h | 3 ++- src/plugins/Display/Display_Mono.cpp | 10 +++++++--- src/plugins/Display/Display_Mono.h | 3 ++- src/publisher/pubMqtt.h | 18 +++++++++++++++--- src/web/html/setup.html | 8 +++----- src/web/html/visualization.html | 5 +++-- 9 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 602af895..27d64cd7 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -2,6 +2,11 @@ (starting from release version `0.5.66`) +## 0.5.96 +* added Nokia display again for ESP8266 #764 +* changed `var` / `VAr` to SI unit `var` #732 +* fix MQTT retained flags for totals (P_AC, P_DC) #726, #721 + ## 0.5.95 * merged #742 MI Improvments * merged #736 remove obsolete JSON Endpoint diff --git a/src/defines.h b/src/defines.h index 83157143..f36c147f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 5 -#define VERSION_PATCH 95 +#define VERSION_PATCH 96 //------------------------------------- typedef struct { diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index 24e6693a..af0b2d8a 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -561,9 +561,9 @@ class MiPayload { iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); if ( mPayload[iv->id].complete || //4ch device - iv->type != INV_TYPE_4CH //other devices + ((iv->type != INV_TYPE_4CH) //other devices && mPayload[iv->id].dataAB[CH0] - && mPayload[iv->id].stsAB[CH0] ) { + && mPayload[iv->id].stsAB[CH0])) { mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short... DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); @@ -620,7 +620,7 @@ class MiPayload { //uint8_t cmd = getQueuedCmd(); if(!*complete) { DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX)); - if (txCmd == 0x09 || txCmd == 0x11 || txCmd >= 0x36 && txCmd <= 0x39 ) + if (txCmd == 0x09 || txCmd == 0x11 || (txCmd >= 0x36 && txCmd <= 0x39)) return false; } diff --git a/src/plugins/Display/Display.h b/src/plugins/Display/Display.h index 1f229ba4..5b572219 100644 --- a/src/plugins/Display/Display.h +++ b/src/plugins/Display/Display.h @@ -42,6 +42,7 @@ class Display { } void tickerSecond() { + loop(); if (mNewPayload || ((++mLoopCnt % 10) == 0)) { mNewPayload = false; mLoopCnt = 0; @@ -79,7 +80,7 @@ class Display { } if ((1 < mCfg->type) && (mCfg->type < 10)) { - mMono.loop(totalPower, totalYieldDay, totalYieldTotal, isprod); + mMono.disp(totalPower, totalYieldDay, totalYieldTotal, isprod); } else if (mCfg->type >= 10) { #if defined(ESP32) mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod); diff --git a/src/plugins/Display/Display_Mono.cpp b/src/plugins/Display/Display_Mono.cpp index af9cd870..57d3cf6b 100644 --- a/src/plugins/Display/Display_Mono.cpp +++ b/src/plugins/Display/Display_Mono.cpp @@ -31,7 +31,7 @@ void DisplayMono::init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_ u8g2_cb_t *rot = (u8g2_cb_t *)((rot != 0x00) ? U8G2_R2 : U8G2_R0); switch(type) { case 1: - mDisplay = new U8G2_PCD8544_84X48_F_4W_HW_SPI(rot, cs, dc, reset); + mDisplay = new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset); break; case 2: mDisplay = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data); @@ -64,10 +64,14 @@ void DisplayMono::config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) { mLuminance = lum; } -void DisplayMono::loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) { +void DisplayMono::loop(void) { if (mEnPowerSafe) if(mTimeout != 0) mTimeout--; +} + +void DisplayMono::disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) { + mDisplay->clearBuffer(); @@ -144,6 +148,6 @@ void DisplayMono::printText(const char* text, uint8_t line, uint8_t dispX) { } setFont(line); - dispX += (mEnPowerSafe) ? (_mExtra % 7) : 0; + dispX += (mEnScreenSaver) ? (_mExtra % 7) : 0; mDisplay->drawStr(dispX, mLineOffsets[line], text); } diff --git a/src/plugins/Display/Display_Mono.h b/src/plugins/Display/Display_Mono.h index cf14f27e..1b62328f 100644 --- a/src/plugins/Display/Display_Mono.h +++ b/src/plugins/Display/Display_Mono.h @@ -11,7 +11,8 @@ class DisplayMono { void init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char* version); void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum); - void loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod); + void loop(void); + void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod); private: void calcLineHeights(); diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index 78478536..4ec4c3f5 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -59,7 +59,16 @@ class PubMqtt { if((strlen(mCfgMqtt->user) > 0) && (strlen(mCfgMqtt->pwd) > 0)) mClient.setCredentials(mCfgMqtt->user, mCfgMqtt->pwd); - snprintf(mClientId, 24, "%s-%s%s%s", mDevName, WiFi.macAddress().substring(9,11).c_str(), WiFi.macAddress().substring(12,14).c_str(), WiFi.macAddress().substring(15,17).c_str()); + snprintf(mClientId, 26, "%s-", mDevName); + uint8_t pos = strlen(mClientId); + mClientId[pos++] = WiFi.macAddress().substring( 9, 10).c_str()[0]; + mClientId[pos++] = WiFi.macAddress().substring(10, 11).c_str()[0]; + mClientId[pos++] = WiFi.macAddress().substring(12, 13).c_str()[0]; + mClientId[pos++] = WiFi.macAddress().substring(13, 14).c_str()[0]; + mClientId[pos++] = WiFi.macAddress().substring(15, 16).c_str()[0]; + mClientId[pos++] = WiFi.macAddress().substring(16, 17).c_str()[0]; + mClientId[pos++] = '\0'; + mClient.setClientId(mClientId); mClient.setServer(mCfgMqtt->broker, mCfgMqtt->port); mClient.setWill(mLwtTopic, QOS_0, true, mqttStr[MQTT_STR_LWT_NOT_CONN]); @@ -560,11 +569,13 @@ class PubMqtt { if (sendTotals) { uint8_t fieldId; + bool retained = true; for (uint8_t i = 0; i < 4; i++) { switch (i) { default: case 0: fieldId = FLD_PAC; + retained = false; break; case 1: fieldId = FLD_YT; @@ -574,11 +585,12 @@ class PubMqtt { break; case 3: fieldId = FLD_PDC; + retained = false; break; } snprintf(topic, 32 + MAX_NAME_LENGTH, "total/%s", fields[fieldId]); snprintf(val, 40, "%g", ah::round3(total[i])); - publish(topic, val, true); + publish(topic, val, retained); } RTRDataHasBeenSent = true; yield(); @@ -610,7 +622,7 @@ class PubMqtt { // last will topic and payload must be available trough lifetime of 'espMqttClient' char mLwtTopic[MQTT_TOPIC_LEN+5]; const char *mDevName, *mVersion; - char mClientId[24]; // number of chars is limited to 23 up to v3.1 of MQTT + char mClientId[26]; // number of chars is limited to 23 up to v3.1 of MQTT }; #endif /*__PUB_MQTT_H__*/ diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 09cc4a67..53ad13fd 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -636,7 +636,7 @@ var e = document.getElementById("dispPins"); pins = [['clock', 'disp_clk'], ['data', 'disp_data'], ['cs', 'disp_cs'], ['dc', 'disp_dc'], ['reset', 'disp_rst'], ['busy', 'disp_bsy']]; for(p of pins) { - if(("ESP8266" == type) && p[0] == "cs") + if(("ESP8266" == type) && p[0] == "busy") break; e.append( ml("div", {class: "row mb-3"}, [ @@ -648,11 +648,9 @@ ); } - var opts = [[0, "None"], [2, "SSD1306 0.96\""], [3, "SH1106 1.3\""]]; - if("ESP32" == type) { - opts.push([1, "Nokia5110"]); + var opts = [[0, "None"], [1, "Nokia5110"], [2, "SSD1306 0.96\""], [3, "SH1106 1.3\""]]; + if("ESP32" == type) opts.push([10, "ePaper"]); - } document.getElementById("dispType").append( ml("div", {class: "row mb-3"}, [ ml("div", {class: "col-12 col-sm-3 my-2"}, "Type"), diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html index 9b6dd5d5..44764a49 100644 --- a/src/web/html/visualization.html +++ b/src/web/html/visualization.html @@ -116,7 +116,7 @@ numMid(obj.ch[0][1], "A", "Current"), numMid(obj.ch[0][3], "Hz", "Frequency"), numMid(obj.ch[0][9], "%", "Efficiency"), - numMid(obj.ch[0][10], "VAr", "Reactive Power"), + numMid(obj.ch[0][10], "var", "Reactive Power"), numMid(obj.ch[0][4], "", "Power Factor") ]) ]) @@ -216,9 +216,10 @@ mNum = 0; total.fill(0); for(var i = 0; i < obj.iv.length; i++) { - if(obj.iv[i]) + if(obj.iv[i]) { getAjax("/api/inverter/id/" + i, parseIv); break; + } } document.getElementById("refresh").innerHTML = obj["refresh"]; if(true == exeOnce) { From ad64d737b760bee011e72588860f7b4d2538c18f Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Thu, 9 Mar 2023 07:41:56 +0100 Subject: [PATCH 2/6] MI - request firmware infos --- src/hm/hmInverter.h | 14 +++----- src/hm/miPayload.h | 82 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index e8b83726..18512812 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -161,26 +161,20 @@ class Inverter { } } - uint8_t getQueuedCmd() { + uint8_t getQueuedCmd() { if (_commandQueue.empty()) { if (ivGen != IV_MI) { if (getFwVersion() == 0) enqueCommand(InverterDevInform_All); // firmware version enqueCommand(RealTimeRunData_Debug); // live data } else if (ivGen == IV_MI){ + if (getFwVersion() == 0) + enqueCommand(InverterDevInform_All); // firmware version; might not work, esp. for 1/2 ch hardware if (type == INV_TYPE_4CH) { enqueCommand(0x36); - /*for(uint8_t i = 0x36; i <= 0x39; i++) { - enqueCommand(i); // live data - }*/ - } else if (type == INV_TYPE_2CH) { - enqueCommand(0x09); - //enqueCommand(0x11); - } else if (type == INV_TYPE_1CH) { + } else { enqueCommand(0x09); } - //if (getFwVersion() == 0) - // enqueCommand(InverterDevInform_All); // firmware version, might not work, esp. for 1/2 ch hardware } if ((actPowerLimit == 0xffff) && isConnected) diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index af0b2d8a..d1c76f50 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -24,6 +24,7 @@ typedef struct { uint8_t txId; uint8_t invId; uint8_t retransmits; + uint8_t skipfirstrepeat; bool gotFragment; /* uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE]; @@ -93,12 +94,14 @@ class MiPayload { DBGPRINT(F(") prepareDevInformCmd 0x")); DBGPRINTLN(String(cmd, HEX)); uint8_t cmd2 = cmd; - if (cmd == 0x1 ) { - cmd = TX_REQ_INFO; + if (cmd == 0x1 ) { //0x1 + cmd = 0x0f; cmd2 = 0x00; + mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd2, false); + } else { + mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); }; - mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); mPayload[iv->id].txCmd = cmd; if (iv->type == INV_TYPE_1CH || iv->type == INV_TYPE_2CH) { mPayload[iv->id].dataAB[CH1] = false; @@ -154,7 +157,41 @@ class MiPayload { //iv->setQueuedCmdFinished(); }*/ - //} + } + else if (p->packet[0] == ( 0x0f + ALL_FRAMES)) { + // MI response from get hardware information request + record_t<> *rec = iv->getRecordStruct(InverterDevInform_All); // choose the record structure + rec->ts = mPayload[iv->id].ts; +/* +case InverterDevInform_All: + rec->length = (uint8_t)(HMINFO_LIST_LEN); + rec->assign = (byteAssign_t *)InfoAssignment; + rec->pyldLen = HMINFO_PAYLOAD_LEN; + break; + +const byteAssign_t InfoAssignment[] = { + { FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, + { FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, + { FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 }, + { FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 }, + { FLD_HW_ID, UNIT_NONE, CH0, 8, 2, 1 } +}; +*/ + + if ( p->packet[9] == 0x00 ) {//first frame + //FLD_FW_VERSION + for (uint8_t i = 0; i < 5; i++) { + iv->setValue(i, rec, (float) ((p->packet[(12+2*i)] << 8) + p->packet[(13+2*i)])/1); + } + iv->setQueuedCmdFinished(); + mStat->rxSuccess++; + mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x01, false); + } else if ( p->packet[9] == 0x01 ) {//second frame + DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got 2nd frame (hw info)")); + mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x12, false); + } else if ( p->packet[9] == 0x12 ) {//3rd frame + DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got 3rd frame (hw info)")); + } } else if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command // atm, we just do nothing else than print out what we got... @@ -291,7 +328,8 @@ class MiPayload { if (IV_HM == iv->ivGen) // only process MI inverters continue; // skip to next inverter - if ((mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && + if ( !mPayload[iv->id].complete && + (mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && (mPayload[iv->id].txId < (0x36 + ALL_FRAMES)) && (mPayload[iv->id].txId > (0x39 + ALL_FRAMES)) && (mPayload[iv->id].txId != (0x09 + ALL_FRAMES)) && @@ -304,6 +342,13 @@ class MiPayload { continue; // skip to next inverter } + //delayed next message? + //mPayload[iv->id].skipfirstrepeat++; + if (mPayload[iv->id].skipfirstrepeat) { + mPayload[iv->id].skipfirstrepeat = 0; //reset counter*/ + continue; // skip to next inverter + } + if (!mPayload[iv->id].complete) { //DPRINTLN(DBG_INFO, F("Pyld incompl code")); //info for testing only bool crcPass, pyldComplete; @@ -339,6 +384,10 @@ class MiPayload { if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] ) cmd = 0x09; } + } else if ( cmd == 0x0f ) { + //hard/firmware request; might not work, so just one try... + iv->setQueuedCmdFinished(); + cmd = iv->getQueuedCmd(); } DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") next request is 0x") + String(cmd, HEX)); //mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true); @@ -357,7 +406,9 @@ class MiPayload { DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") prepareDevInformCmd 0x") + String(mPayload[iv->id].txCmd, HEX)); mSys->Radio.prepareDevInformCmd(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true); } - } else { // payload complete + } + /*else { // payload complete + //This tree is not really tested, most likely it's not truly complete.... DPRINTLN(DBG_INFO, F("procPyld: cmd: 0x") + String(mPayload[iv->id].txCmd, HEX)); DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX)); //DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId)); @@ -371,7 +422,7 @@ class MiPayload { record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); - DPRINTLN(DBG_INFO, F("proces: compl. set of msgs detected")); + DPRINTLN(DBG_INFO, F("process: compl. set of msgs detected")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); iv->doCalculations(); @@ -425,7 +476,7 @@ class MiPayload { } iv->setQueuedCmdFinished(); */ - } + //}*/ } yield(); } @@ -466,15 +517,17 @@ class MiPayload { if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){ iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!? - DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(iv->alarmMesIndex)); + DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") alarm ID incremented to ") + String(iv->alarmMesIndex)); iv->enqueCommand(AlarmData); } + //mPayload[iv->id].skipfirstrepeat = 1; if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) { mPayload[iv->id].complete = true; - DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); + DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); iv->setQueuedCmdFinished(); iv->doCalculations(); + mPayload[iv->id].skipfirstrepeat = 0; notify(mPayload[iv->id].txCmd); } @@ -561,11 +614,11 @@ class MiPayload { iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); if ( mPayload[iv->id].complete || //4ch device - ((iv->type != INV_TYPE_4CH) //other devices + iv->type != INV_TYPE_4CH //other devices && mPayload[iv->id].dataAB[CH0] - && mPayload[iv->id].stsAB[CH0])) { + && mPayload[iv->id].stsAB[CH0] ) { mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short... - DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); + DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); iv->doCalculations(); /*} else { @@ -620,7 +673,7 @@ class MiPayload { //uint8_t cmd = getQueuedCmd(); if(!*complete) { DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX)); - if (txCmd == 0x09 || txCmd == 0x11 || (txCmd >= 0x36 && txCmd <= 0x39)) + if (txCmd == 0x09 || txCmd == 0x11 || txCmd >= 0x36 && txCmd <= 0x39 ) return false; } @@ -654,6 +707,7 @@ class MiPayload { mPayload[id].stsAB[CH1] = true; //required for 1CH and 2CH devices mPayload[id].stsAB[CH2] = true; //only required for 2CH devices mPayload[id].txCmd = 0; + mPayload[id].skipfirstrepeat = 0; mPayload[id].requested = false; mPayload[id].ts = *mTimestamp; mPayload[id].sts[0] = 0; //disable this in case gotFragment is not working From 133f018d0421ff089fa3ffea865eb3854ea50468 Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Thu, 9 Mar 2023 19:04:41 +0100 Subject: [PATCH 3/6] MI - code restructuring esp. wrt. AC power calculation --- src/hm/miPayload.h | 227 +++++++++++++++++++-------------------------- 1 file changed, 94 insertions(+), 133 deletions(-) diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index d1c76f50..e4ae2bf7 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -28,10 +28,8 @@ typedef struct { bool gotFragment; /* uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE]; - uint8_t maxPackId; - bool lastFound; - bool gotFragment;*/ + bool lastFound;*/ } miPayload_t; @@ -121,54 +119,50 @@ class MiPayload { if (p->packet[0] == (0x08 + ALL_FRAMES)) { // 0x88; MI status response to 0x09 miStsDecode(iv, p); - } else if (p->packet[0] == (0x11 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11 - miStsDecode(iv, p, CH2); - /*} else if (p->packet[0] == (0x09 + ALL_FRAMES)) { // MI data response to 0x09 - mPayload[iv->id].txId = p->packet[0]; - miDataDecode(iv,p); - //iv->setQueuedCmdFinished(); - if (INV_TYPE_2CH == iv->type) { - //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11); - //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, 0x11, mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11); - } else { // additional check for mPayload[iv->id].stsa == true might be a good idea (request retransmit?) - mPayload[iv->id].complete = true; - //iv->setQueuedCmdFinished(); - } + } - } else if (p->packet[0] == ()) { // MI data response to 0x11 - mPayload[iv->id].txId = p->packet[0]; - miDataDecode(iv,p); - mStat->rxSuccess++; - //iv->setQueuedCmdFinished();*/ + else if (p->packet[0] == (0x11 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11 + miStsDecode(iv, p, CH2); + } - } else if ( p->packet[0] == 0x09 + ALL_FRAMES || + else if ( p->packet[0] == 0x09 + ALL_FRAMES || p->packet[0] == 0x11 + ALL_FRAMES || ( p->packet[0] >= (0x36 + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) ) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 mPayload[iv->id].txId = p->packet[0]; miDataDecode(iv,p); - //mStat->rxSuccess++; - //iv->setQueuedCmdFinished(); - /*if (p->packet[0] < (0x39 + ALL_FRAMES)) { - //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES); - //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, p->packet[0] + 1 - ALL_FRAMES, mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES); - } else { - mPayload[iv->id].complete = true; - //iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, CALC_YD_CH0); - //iv->setQueuedCmdFinished(); - }*/ - } + else if (p->packet[0] == ( 0x0f + ALL_FRAMES)) { // MI response from get hardware information request record_t<> *rec = iv->getRecordStruct(InverterDevInform_All); // choose the record structure rec->ts = mPayload[iv->id].ts; + mPayload[iv->id].gotFragment = true; + +/* + Polling the device software and hardware version number command + start byte Command word routing address target address User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] + 0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f + Command Receipt - First Frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f + Command Receipt - Second Frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f + Command receipt - third frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f +*/ + /* case InverterDevInform_All: rec->length = (uint8_t)(HMINFO_LIST_LEN); rec->assign = (byteAssign_t *)InfoAssignment; rec->pyldLen = HMINFO_PAYLOAD_LEN; break; - const byteAssign_t InfoAssignment[] = { { FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, { FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, @@ -196,26 +190,6 @@ const byteAssign_t InfoAssignment[] = { } else if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command // atm, we just do nothing else than print out what we got... // for decoding see xls- Data collection instructions - #147ff -/* - Polling the device software and hardware version number command - start byte Command word routing address target address User data check end byte - byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] - 0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f - - Command Receipt - First Frame - start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte - byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] - 0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f - Command Receipt - Second Frame - start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte - byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] - 0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f - Command receipt - third frame - start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte - byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] - 0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f - -*/ mPayload[iv->id].txId = p->packet[0]; DPRINTLN(DBG_DEBUG, F("Response from info request received")); uint8_t *pid = &p->packet[9]; @@ -231,7 +205,6 @@ const byteAssign_t InfoAssignment[] = { mPayload[iv->id].len[(*pid & 0x7F) - 1] = p->len - 11; mPayload[iv->id].gotFragment = true; } - if ((*pid & ALL_FRAMES) == ALL_FRAMES) { // Last packet if (((*pid & 0x7f) > mPayload[iv->id].maxPackId) || (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId)) { @@ -360,9 +333,12 @@ const byteAssign_t InfoAssignment[] = { DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm...")); mPayload[iv->id].retransmits = mMaxRetrans; } else if(iv->devControlCmd == ActivePowerContr) { - DPRINTLN(DBG_INFO, F("retransmit power limit")); + DPRINT(DBG_INFO, F("(#")); + DBGPRINT(String(iv->id)); + DBGPRINTLN(F(") retransmit power limit")); mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true); } else { + uint8_t cmd = mPayload[iv->id].txCmd; if (mPayload[iv->id].retransmits < mMaxRetrans) { mPayload[iv->id].retransmits++; if( !mPayload[iv->id].gotFragment ) { @@ -370,26 +346,40 @@ const byteAssign_t InfoAssignment[] = { DBGPRINT(String(iv->id)); DBGPRINTLN(F(") nothing received")); mPayload[iv->id].retransmits = mMaxRetrans; + } else if ( cmd == 0x0f ) { + //hard/firmware request + mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x00, true); + //iv->setQueuedCmdFinished(); + //cmd = iv->getQueuedCmd(); } else { - uint8_t cmd = mPayload[iv->id].txCmd; + bool change = false; if ( cmd >= 0x36 && cmd < 0x39 ) { // MI-1500 Data command cmd++; // just request the next channel + change = true; } else if ( cmd == 0x09 ) {//MI single or dual channel device if ( mPayload[iv->id].dataAB[CH1] && iv->type == INV_TYPE_2CH ) { - if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] ) + if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] ) { cmd = 0x11; + change = true; + } } } else if ( cmd == 0x11) { if ( mPayload[iv->id].dataAB[CH2] ) { // data is there, but no status - if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] ) + if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] ) { cmd = 0x09; + change = true; + } } - } else if ( cmd == 0x0f ) { - //hard/firmware request; might not work, so just one try... - iv->setQueuedCmdFinished(); - cmd = iv->getQueuedCmd(); } - DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") next request is 0x") + String(cmd, HEX)); + DPRINT(DBG_INFO, F("(#")); + DBGPRINT(String(iv->id)); + DBGPRINT(F(") ")); + if (change) { + DBGPRINT(F("next request is 0x")); + } else { + DBGPRINT(F("not complete: Request Retransmit 0x")); + } + DBGPRINTLN(String(cmd, HEX)); //mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true); mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd); mPayload[iv->id].txCmd = cmd; @@ -413,7 +403,6 @@ const byteAssign_t InfoAssignment[] = { DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX)); //DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId)); //record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser - mPayload[iv->id].complete = true; uint8_t ac_pow = 0; //if (mPayload[iv->id].sts[0] == 3) { @@ -421,34 +410,27 @@ const byteAssign_t InfoAssignment[] = { //} record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); - DPRINTLN(DBG_INFO, F("process: compl. set of msgs detected")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); iv->doCalculations(); - /*uint8_t payload[128]; uint8_t payloadLen = 0; - memset(payload, 0, 128); - for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); payloadLen += (mPayload[iv->id].len[i]); yield(); } payloadLen -= 2; - if (mSerialDebug) { DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): "); mSys->Radio.dumpBuf(payload, payloadLen); } - if (NULL == rec) { DPRINTLN(DBG_ERROR, F("record is NULL!")); } else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) mStat->rxSuccess++; - rec->ts = mPayload[iv->id].ts; for (uint8_t i = 0; i < rec->length; i++) { iv->addValue(i, payload, rec); @@ -456,7 +438,6 @@ const byteAssign_t InfoAssignment[] = { } iv->doCalculations(); notify(mPayload[iv->id].txCmd); - if(AlarmData == mPayload[iv->id].txCmd) { uint8_t i = 0; uint16_t code; @@ -474,7 +455,6 @@ const byteAssign_t InfoAssignment[] = { DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); mStat->rxFail++; } - iv->setQueuedCmdFinished(); */ //}*/ } @@ -506,14 +486,6 @@ const byteAssign_t InfoAssignment[] = { iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status); } - /*if ( !mPayload[iv->id].dataAB[0] || !mPayload[iv->id].dataAB[1] ) { - uint8_t cmd = mPayload[iv->id].dataAB[0] ? 0x11 : 0x09; - DPRINTLN(DBG_INFO, F("request missing status 0x") + String(cmd, HEX)); - mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); - mPayload[iv->id].txCmd = cmd; - rem: gotFragment should be a better solution - } */ - if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){ iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!? @@ -522,15 +494,22 @@ const byteAssign_t InfoAssignment[] = { } //mPayload[iv->id].skipfirstrepeat = 1; if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) { - mPayload[iv->id].complete = true; + miComplete(iv); + /*mPayload[iv->id].complete = true; DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); + //preliminary AC calculation... + uint8_t ac_pow = 0; + //if (mPayload[iv->id].sts[0] == 3) { + ac_pow = calcPowerDcCh0(iv, 0)*9.5; + //} + iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); iv->setQueuedCmdFinished(); iv->doCalculations(); mPayload[iv->id].skipfirstrepeat = 0; notify(mPayload[iv->id].txCmd); + yield();*/ } - } void miDataDecode(Inverter<> *iv, packet_t *p) { @@ -606,43 +585,30 @@ const byteAssign_t InfoAssignment[] = { } - //preliminary AC calculation... - uint8_t ac_pow = 0; - //if (mPayload[iv->id].sts[0] == 3) { - ac_pow = calcPowerDcCh0(iv, 0)*9.5; - //} - iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); + if ( mPayload[iv->id].complete || //4ch device iv->type != INV_TYPE_4CH //other devices && mPayload[iv->id].dataAB[CH0] && mPayload[iv->id].stsAB[CH0] ) { - mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short... + miComplete(iv); + /*mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short... DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); + //preliminary AC calculation... + uint8_t ac_pow = 0; + //if (mPayload[iv->id].sts[0] == 3) { + ac_pow = calcPowerDcCh0(iv, 0)*9.5; + //} + iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); iv->doCalculations(); - /*} else { - //retry to get missing status info for one or two channel devices - DPRINTLN(DBG_INFO, F("request missing data or status 0x") + String(cmd, HEX)); - mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); - mPayload[iv->id].txCmd = cmd; - //iv->enqueCommand(cmd); // mPayload[iv->id].dataAB[1] ? 0x09 : 0x11) - }*/ + iv->setQueuedCmdFinished(); + mStat->rxSuccess++; + yield(); + notify(mPayload[iv->id].txCmd);*/ } - /* should be included in process() - else if (mPayload[iv->id].txCmd == 0x09 && iv->type == INV_TYPE_2CH) { - uint8_t cmd = 0x11; - DPRINTLN(DBG_INFO, F("request second data channel 0x") + String(cmd, HEX)); - mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); - mPayload[iv->id].txCmd = cmd; - mPayload[iv->id].complete = false; - }*/ - iv->setQueuedCmdFinished(); - mStat->rxSuccess++; - yield(); - notify(mPayload[iv->id].txCmd); /* if(AlarmData == mPayload[iv->id].txCmd) { @@ -660,6 +626,24 @@ const byteAssign_t InfoAssignment[] = { }*/ } + void miComplete(Inverter<> *iv) { + mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short... + DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); + record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); + iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); + //preliminary AC calculation... + uint8_t ac_pow = 0; + //if (mPayload[iv->id].sts[0] == 3) { + ac_pow = calcPowerDcCh0(iv, 0)*9.5; + //} + iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); + iv->doCalculations(); + iv->setQueuedCmdFinished(); + mStat->rxSuccess++; + yield(); + notify(mPayload[iv->id].txCmd); + } + bool build(uint8_t id, bool *complete) { DPRINTLN(DBG_VERBOSE, F("build")); /*uint16_t crc = 0xffff, crcRcv = 0x0000; @@ -687,7 +671,6 @@ const byteAssign_t InfoAssignment[] = { } yield(); } - return (crc == crcRcv) ? true : false;*/ return true; } @@ -718,28 +701,6 @@ const byteAssign_t InfoAssignment[] = { } -/* template - static T calcMiSts(Inverter<> *iv) { - if(NULL != iv) { - T result = 0; - bool stsComplete = true; - uint8_t stsCh; - for(uint8_t i = 1; i <= iv->channels; i++) { - stsCh = mPayload[iv->id].sts[i]; - if (!stsCh) { - stsComplete = false; - } else if ( !result || stsCh < result ) { - result = stsCh; - if (stsComplete && stsCh > stsComplete) { - stsComplete = stsCh; - } - } - } - mPayload[iv->id].sts[0] = stsComplete; - return result; - } - return 0; - } */ IApp *mApp; HMSYSTEM *mSys; From 8a7b1a07e54edade6e85c55e08e051f05ab3484b Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Thu, 9 Mar 2023 19:12:17 +0100 Subject: [PATCH 4/6] add MI types to firmware version collection --- User_Manual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/User_Manual.md b/User_Manual.md index 298eb262..0a0caaed 100644 --- a/User_Manual.md +++ b/User_Manual.md @@ -308,6 +308,8 @@ To get the information open the URL `/api/record/info` on your AhoyDTU. The info | B5r1oJ0A9G | HM-800 | | 1.0.10 | 2021 | | 104 | | | | B5r1oJ0A9G | HM-800 | | 1.0.10 | 2021 | | 104 | | | | tomquist | TSOL-M1600 | | 1.0.12 | 2020 | 06-24 | 100 | | | +| rejoe2 | MI-600 | | 236 | 2018 | 11-27 | 17 | | | +| rejoe2 | MI-1500 | | 1.0.12 | 2020 | 06-24 | 100 | | | | | | | | | | | | | ## Developer Information about Command Queue From 96046871572d54c81feab3acd04202b896f6453f Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 9 Mar 2023 22:59:33 +0100 Subject: [PATCH 5/6] Attention: re-ordered display types, check your settings! #746 improved saving settings of display #747, #746 disabled contrast for Nokia display #746 added Prometheus as compile option #719, #615 update MQTT lib to v1.4.1 limit decimal places to 2 in `live` added `-DPIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48` to esp8266 debug build #657 a `max-module-power` of `0` disables channel in live view `setup` --- .github/workflows/compile_development.yml | 2 +- .github/workflows/compile_release.yml | 2 +- scripts/getVersion.py | 10 +++ src/CHANGES.md | 10 +++ src/config/settings.h | 10 +-- src/defines.h | 2 +- src/platformio.ini | 77 +++++++++++++++-------- src/plugins/Display/Display_Mono.cpp | 16 +++-- src/plugins/Display/Display_Mono.h | 1 + src/web/RestApi.h | 15 ++--- src/web/html/setup.html | 8 ++- src/web/html/visualization.html | 11 ++-- src/web/web.h | 14 ++--- 13 files changed, 116 insertions(+), 62 deletions(-) diff --git a/.github/workflows/compile_development.yml b/.github/workflows/compile_development.yml index ec435880..59460d5c 100644 --- a/.github/workflows/compile_development.yml +++ b/.github/workflows/compile_development.yml @@ -47,7 +47,7 @@ jobs: run: python convert.py - name: Run PlatformIO - run: pio run -d src --environment esp8266-release --environment esp8285-release --environment esp32-wroom32-release + run: pio run -d src --environment esp8266-release --environment esp8266-release-prometheus --environment esp8285-release --environment esp32-wroom32-release --environment esp32-wroom32-release-prometheus - name: Rename Binary files id: rename-binary-files diff --git a/.github/workflows/compile_release.yml b/.github/workflows/compile_release.yml index 91ae35bf..bd7cef5a 100644 --- a/.github/workflows/compile_release.yml +++ b/.github/workflows/compile_release.yml @@ -51,7 +51,7 @@ jobs: run: python convert.py - name: Run PlatformIO - run: pio run -d src --environment esp8266-release --environment esp8285-release --environment esp32-wroom32-release + run: pio run -d src --environment esp8266-release --environment esp8266-release-prometheus --environment esp8285-release --environment esp32-wroom32-release --environment esp32-wroom32-release-prometheus - name: Rename Binary files id: rename-binary-files diff --git a/scripts/getVersion.py b/scripts/getVersion.py index 4ecb714e..77c5816b 100644 --- a/scripts/getVersion.py +++ b/scripts/getVersion.py @@ -56,6 +56,11 @@ def readVersion(path, infile): src = path + ".pio/build/esp8266-release/firmware.bin" dst = path + "firmware/" + versionout os.rename(src, dst) + + versionout = version[:-1] + "_" + sha + "_esp8266_prometheus.bin" + src = path + ".pio/build/esp8266-release-prometheus/firmware.bin" + dst = path + "firmware/" + versionout + os.rename(src, dst) versionout = version[:-1] + "_" + sha + "_esp8285.bin" src = path + ".pio/build/esp8285-release/firmware.bin" @@ -68,6 +73,11 @@ def readVersion(path, infile): dst = path + "firmware/" + versionout os.rename(src, dst) + versionout = version[:-1] + "_" + sha + "_esp32_prometheus.bin" + src = path + ".pio/build/esp32-wroom32-release-prometheus/firmware.bin" + dst = path + "firmware/" + versionout + os.rename(src, dst) + # other ESP32 bin files src = path + ".pio/build/esp32-wroom32-release/" dst = path + "firmware/" diff --git a/src/CHANGES.md b/src/CHANGES.md index 27d64cd7..27937299 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -2,6 +2,16 @@ (starting from release version `0.5.66`) +## 0.5.97 +* Attention: re-ordered display types, check your settings! #746 +* improved saving settings of display #747, #746 +* disabled contrast for Nokia display #746 +* added Prometheus as compile option #719, #615 +* update MQTT lib to v1.4.1 +* limit decimal places to 2 in `live` +* added `-DPIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48` to esp8266 debug build #657 +* a `max-module-power` of `0` disables channel in live view `setup` + ## 0.5.96 * added Nokia display again for ESP8266 #764 * changed `var` / `VAr` to SI unit `var` #732 diff --git a/src/config/settings.h b/src/config/settings.h index 0e118bde..9dcca1c4 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -347,12 +347,12 @@ class settings { mCfg.plugin.display.contrast = 60; mCfg.plugin.display.pxShift = true; mCfg.plugin.display.rot = 0; - mCfg.plugin.display.disp_data = DEF_PIN_OFF; // SDA - mCfg.plugin.display.disp_clk = DEF_PIN_OFF; // SCL - mCfg.plugin.display.disp_cs = DEF_PIN_OFF; + mCfg.plugin.display.disp_data = DEF_PIN_OFF; // SDA + mCfg.plugin.display.disp_clk = DEF_PIN_OFF; // SCL + mCfg.plugin.display.disp_cs = DEF_PIN_OFF; mCfg.plugin.display.disp_reset = DEF_PIN_OFF; - mCfg.plugin.display.disp_busy = DEF_PIN_OFF; - mCfg.plugin.display.disp_dc = DEF_PIN_OFF; + mCfg.plugin.display.disp_busy = DEF_PIN_OFF; + mCfg.plugin.display.disp_dc = DEF_PIN_OFF; } void jsonWifi(JsonObject obj, bool set = false) { diff --git a/src/defines.h b/src/defines.h index f36c147f..13e525bc 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 5 -#define VERSION_PATCH 96 +#define VERSION_PATCH 97 //------------------------------------- typedef struct { diff --git a/src/platformio.ini b/src/platformio.ini index e52cf3fb..6d3f8d23 100644 --- a/src/platformio.ini +++ b/src/platformio.ini @@ -20,12 +20,12 @@ upload_speed = 921600 ;build_flags = ; ;;;;; Possible Debug options ;;;;;; ; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level - ;-DDEBUG_ESP_PORT=Serial + ;-DDEBUG_ESP_PORT=Serial ;-DDEBUG_ESP_CORE - ;-DDEBUG_ESP_WIFI - ;-DDEBUG_ESP_HTTP_CLIENT - ;-DDEBUG_ESP_HTTP_SERVER - ;-DDEBUG_ESP_OOM + ;-DDEBUG_ESP_WIFI + ;-DDEBUG_ESP_HTTP_CLIENT + ;-DDEBUG_ESP_HTTP_SERVER + ;-DDEBUG_ESP_OOM monitor_speed = 115200 @@ -35,18 +35,18 @@ extra_scripts = lib_deps = https://github.com/yubox-node-org/ESPAsyncWebServer - nrf24/RF24 - paulstoffregen/Time - https://github.com/bertmelis/espMqttClient#v1.3.3 - bblanchon/ArduinoJson + nrf24/RF24 + paulstoffregen/Time + https://github.com/bertmelis/espMqttClient#v1.4.1 + bblanchon/ArduinoJson https://github.com/JChristensen/Timezone olikraus/U8g2 zinggjm/GxEPD2@^1.5.0 - ;esp8266/DNSServer - ;esp8266/EEPROM - ;esp8266/ESP8266WiFi - ;esp8266/SPI - ;esp8266/Ticker + ;esp8266/DNSServer + ;esp8266/EEPROM + ;esp8266/ESP8266WiFi + ;esp8266/SPI + ;esp8266/Ticker [env:esp8266-release] @@ -55,8 +55,20 @@ board = esp12e board_build.f_cpu = 80000000L build_flags = -D RELEASE monitor_filters = - ;default ; Remove typical terminal control codes from input - ;time ; Add timestamp with milliseconds for each new line + ;default ; Remove typical terminal control codes from input + ;time ; Add timestamp with milliseconds for each new line + ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory + esp8266_exception_decoder + + +[env:esp8266-release-prometheus] +platform = espressif8266 +board = esp12e +board_build.f_cpu = 80000000L +build_flags = -D RELEASE -DENABLE_PROMETHEUS_EP +monitor_filters = + ;default ; Remove typical terminal control codes from input + ;time ; Add timestamp with milliseconds for each new line ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory esp8266_exception_decoder @@ -64,11 +76,11 @@ monitor_filters = platform = espressif8266 board = esp12e board_build.f_cpu = 80000000L -build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial +build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial -DPIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48 build_type = debug monitor_filters = - ;default ; Remove typical terminal control codes from input - time ; Add timestamp with milliseconds for each new line + ;default ; Remove typical terminal control codes from input + time ; Add timestamp with milliseconds for each new line log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory [env:esp8285-release] @@ -78,8 +90,8 @@ board_build.ldscript = eagle.flash.1m64.ld board_build.f_cpu = 80000000L build_flags = -D RELEASE monitor_filters = - ;default ; Remove typical terminal control codes from input - time ; Add timestamp with milliseconds for each new line + ;default ; Remove typical terminal control codes from input + time ; Add timestamp with milliseconds for each new line ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory [env:esp8285-debug] @@ -90,8 +102,8 @@ board_build.f_cpu = 80000000L build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial build_type = debug monitor_filters = - ;default ; Remove typical terminal control codes from input - time ; Add timestamp with milliseconds for each new line + ;default ; Remove typical terminal control codes from input + time ; Add timestamp with milliseconds for each new line log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory [env:esp32-wroom32-release] @@ -100,8 +112,19 @@ board = lolin_d32 build_flags = -D RELEASE -std=gnu++14 build_unflags = -std=gnu++11 monitor_filters = - ;default ; Remove typical terminal control codes from input - ;time ; Add timestamp with milliseconds for each new line + ;default ; Remove typical terminal control codes from input + ;time ; Add timestamp with milliseconds for each new line + ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory + esp32_exception_decoder + +[env:esp32-wroom32-release-prometheus] +platform = espressif32 +board = lolin_d32 +build_flags = -D RELEASE -std=gnu++14 -DENABLE_PROMETHEUS_EP +build_unflags = -std=gnu++11 +monitor_filters = + ;default ; Remove typical terminal control codes from input + ;time ; Add timestamp with milliseconds for each new line ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory esp32_exception_decoder @@ -112,6 +135,6 @@ build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ build_unflags = -std=gnu++11 build_type = debug monitor_filters = - ;default ; Remove typical terminal control codes from input - time ; Add timestamp with milliseconds for each new line + ;default ; Remove typical terminal control codes from input + time ; Add timestamp with milliseconds for each new line log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory diff --git a/src/plugins/Display/Display_Mono.cpp b/src/plugins/Display/Display_Mono.cpp index 57d3cf6b..ad27ebcc 100644 --- a/src/plugins/Display/Display_Mono.cpp +++ b/src/plugins/Display/Display_Mono.cpp @@ -22,6 +22,7 @@ DisplayMono::DisplayMono() { _dispY = 0; mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds) mUtcTs = NULL; + mType = 0; } @@ -29,17 +30,18 @@ DisplayMono::DisplayMono() { void DisplayMono::init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char* version) { if ((0 < type) && (type < 4)) { u8g2_cb_t *rot = (u8g2_cb_t *)((rot != 0x00) ? U8G2_R2 : U8G2_R0); + mType = type; switch(type) { case 1: - mDisplay = new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset); - break; - case 2: mDisplay = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data); break; default: - case 3: + case 2: mDisplay = new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, reset, clock, data); break; + case 3: + mDisplay = new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset); + break; } mUtcTs = utcTs; @@ -50,7 +52,8 @@ void DisplayMono::init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_ calcLineHeights(); mDisplay->clearBuffer(); - mDisplay->setContrast(mLuminance); + if (3 != mType) + mDisplay->setContrast(mLuminance); printText("AHOY!", 0, 35); printText("ahoydtu.de", 2, 20); printText(version, 3, 46); @@ -76,7 +79,8 @@ void DisplayMono::disp(float totalPower, float totalYieldDay, float totalYieldTo mDisplay->clearBuffer(); // set Contrast of the Display to raise the lifetime - mDisplay->setContrast(mLuminance); + if (3 != mType) + mDisplay->setContrast(mLuminance); if ((totalPower > 0) && (isprod > 0)) { mTimeout = DISP_DEFAULT_TIMEOUT; diff --git a/src/plugins/Display/Display_Mono.h b/src/plugins/Display/Display_Mono.h index 1b62328f..ad04c9f4 100644 --- a/src/plugins/Display/Display_Mono.h +++ b/src/plugins/Display/Display_Mono.h @@ -21,6 +21,7 @@ class DisplayMono { U8G2* mDisplay; + uint8_t mType; bool mEnPowerSafe, mEnScreenSaver; uint8_t mLuminance; diff --git a/src/web/RestApi.h b/src/web/RestApi.h index e9479a0b..9b14e439 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -305,8 +305,8 @@ class RestApi { for(uint8_t j = 0; j < iv->channels; j ++) { obj2[F("ch_yield_cor")][j] = iv->config->yieldCor[j]; - obj2[F("ch_max_power")][j] = iv->config->chMaxPwr[j]; obj2[F("ch_name")][j] = iv->config->chName[j]; + obj2[F("ch_max_pwr")][j] = iv->config->chMaxPwr[j]; } } } @@ -344,6 +344,7 @@ class RestApi { // DC for(uint8_t j = 0; j < iv->channels; j ++) { obj[F("ch_name")][j+1] = iv->config->chName[j]; + obj[F("ch_max_pwr")][j+1] = iv->config->chMaxPwr[j]; JsonArray cur = ch.createNestedArray(); for (uint8_t fld = 0; fld < sizeof(dcList); fld++) { pos = (iv->getPosByChFld((j+1), dcList[fld], rec)); @@ -410,12 +411,12 @@ class RestApi { obj[F("disp_pxshift")] = (bool)mConfig->plugin.display.pxShift; obj[F("disp_rot")] = (uint8_t)mConfig->plugin.display.rot; obj[F("disp_cont")] = (uint8_t)mConfig->plugin.display.contrast; - obj[F("disp_clk")] = mConfig->plugin.display.disp_clk; - obj[F("disp_data")] = mConfig->plugin.display.disp_data; - obj[F("disp_cs")] = mConfig->plugin.display.disp_cs; - obj[F("disp_dc")] = mConfig->plugin.display.disp_dc; - obj[F("disp_rst")] = mConfig->plugin.display.disp_reset; - obj[F("disp_bsy")] = mConfig->plugin.display.disp_busy; + obj[F("disp_clk")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_clk; + obj[F("disp_data")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_data; + obj[F("disp_cs")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_cs; + obj[F("disp_dc")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_dc; + obj[F("disp_rst")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_reset; + obj[F("disp_bsy")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_busy; } void getIndex(JsonObject obj) { diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 53ad13fd..e3188f05 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -136,6 +136,10 @@
+
+

Note

+

A 'max module power' value of '0' disables the channel in 'live' view

+

General

@@ -499,7 +503,7 @@ iv.append(mlE("Name*", inp(id + "Name", obj["name"], 16, ["text"], null, "text", "[A-Za-z0-9./#$%&=+_-]+", "Invalid input"))); for(var j of [ - ["ModPwr", "ch_max_power", "Max Module Power (Wp)", 4, "[0-9]+"], + ["ModPwr", "ch_max_pwr", "Max Module Power (Wp)", 4, "[0-9]+"], ["ModName", "ch_name", "Module Name", 15, null], ["YieldCor", "ch_yield_cor", "Yield Total Correction [kWh]", 8, "[0-9-]+"]]) { @@ -648,7 +652,7 @@ ); } - var opts = [[0, "None"], [1, "Nokia5110"], [2, "SSD1306 0.96\""], [3, "SH1106 1.3\""]]; + var opts = [[0, "None"], [1, "SSD1306 0.96\""], [2, "SH1106 1.3\""], [3, "Nokia5110"]]; if("ESP32" == type) opts.push([10, "ePaper"]); document.getElementById("dispType").append( diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html index 44764a49..de5b0069 100644 --- a/src/web/html/visualization.html +++ b/src/web/html/visualization.html @@ -34,7 +34,7 @@ return ml("div", {class: "col-6 col-sm-4 a-c"}, [ ml("div", {class: "row"}, ml("div", {class: "col"}, [ - ml("span", {class: "fs-5 fs-md-4"}, String(val)), + ml("span", {class: "fs-5 fs-md-4"}, String(Math.round(val * 100) / 100)), ml("span", {class: "fs-6 fs-md-7 mx-1"}, unit) ])), ml("div", {class: "row"}, @@ -49,7 +49,7 @@ return ml("div", {class: "col-6 col-sm-4 col-md-3 mb-2"}, [ ml("div", {class: "row"}, ml("div", {class: "col"}, [ - ml("span", {class: "fs-6"}, String(val)), + ml("span", {class: "fs-6"}, String(Math.round(val * 100) / 100)), ml("span", {class: "fs-8 mx-1"}, unit) ])), ml("div", {class: "row"}, @@ -94,7 +94,7 @@ total[3] += obj.ch[0][8]; // P_DC total[4] += obj.ch[0][10]; // Q_AC var t = span(" ° C"); - return ml("div", {class: "row"}, + return ml("div", {class: "row mt-2"}, ml("div", {class: "col"}, [ ml("div", {class: "p-2 iv-h"}, ml("div", {class: "row"}, [ @@ -128,7 +128,7 @@ return ml("div", {class: "col-12 col-sm-6 col-md-12 mb-2"}, [ ml("div", {class: "row"}, ml("div", {class: "col"}, [ - ml("span", {class: "fs-6 fs-md-7"}, String(val)), + ml("span", {class: "fs-6 fs-md-7"}, String(Math.round(val * 100) / 100)), ml("span", {class: "fs-8 mx-2"}, unit) ])), ml("div", {class: "row"}, @@ -182,7 +182,8 @@ var name = obj.ch_name[i]; if(name.length == 0) name = "CHANNEL " + i; - chn.push(ch(name, obj.ch[i])); + if(obj.ch_max_pwr[i] > 0) // show channel only if max mod pwr + chn.push(ch(name, obj.ch[i])); } mIvHtml.push( ml("div", {}, [ diff --git a/src/web/web.h b/src/web/web.h index 15b22eb0..fe4a53e6 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -582,13 +582,13 @@ class Web { mConfig->plugin.display.pxShift = (request->arg("disp_pxshift") == "on"); mConfig->plugin.display.rot = request->arg("disp_rot").toInt(); mConfig->plugin.display.type = request->arg("disp_typ").toInt(); - mConfig->plugin.display.contrast = request->arg("disp_cont").toInt(); - mConfig->plugin.display.disp_data = request->arg("disp_data").toInt(); - mConfig->plugin.display.disp_clk = request->arg("disp_clk").toInt(); - mConfig->plugin.display.disp_cs = request->arg("disp_cs").toInt(); - mConfig->plugin.display.disp_reset = request->arg("disp_rst").toInt(); - mConfig->plugin.display.disp_busy = request->arg("disp_bsy").toInt(); - mConfig->plugin.display.disp_dc = request->arg("disp_dc").toInt(); + mConfig->plugin.display.contrast = (mConfig->plugin.display.type == 0) ? 60 : request->arg("disp_cont").toInt(); + mConfig->plugin.display.disp_data = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : request->arg("disp_data").toInt(); + mConfig->plugin.display.disp_clk = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : request->arg("disp_clk").toInt(); + mConfig->plugin.display.disp_cs = (mConfig->plugin.display.type < 3) ? DEF_PIN_OFF : request->arg("disp_cs").toInt(); + mConfig->plugin.display.disp_reset = (mConfig->plugin.display.type < 3) ? DEF_PIN_OFF : request->arg("disp_rst").toInt(); + mConfig->plugin.display.disp_dc = (mConfig->plugin.display.type < 3) ? DEF_PIN_OFF : request->arg("disp_dc").toInt(); + mConfig->plugin.display.disp_busy = (mConfig->plugin.display.type < 10) ? DEF_PIN_OFF : request->arg("disp_bsy").toInt(); mApp->saveSettings(); From 28bd99ed1e47d04c7008cab63ad9f7b17d08f9a9 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 9 Mar 2023 23:09:37 +0100 Subject: [PATCH 6/6] 0.5.97 merge MI improvements, get firmware information #753 --- src/CHANGES.md | 1 + src/hm/miPayload.h | 92 +++++++++++++++++++++++----------------------- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 27937299..26b2c09d 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -11,6 +11,7 @@ * limit decimal places to 2 in `live` * added `-DPIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48` to esp8266 debug build #657 * a `max-module-power` of `0` disables channel in live view `setup` +* merge MI improvements, get firmware information #753 ## 0.5.96 * added Nokia display again for ESP8266 #764 diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index e4ae2bf7..c4fc2a2a 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -413,49 +413,49 @@ const byteAssign_t InfoAssignment[] = { DPRINTLN(DBG_INFO, F("process: compl. set of msgs detected")); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); iv->doCalculations(); - /*uint8_t payload[128]; - uint8_t payloadLen = 0; - memset(payload, 0, 128); - for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { - memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); - payloadLen += (mPayload[iv->id].len[i]); - yield(); - } - payloadLen -= 2; - if (mSerialDebug) { - DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): "); - mSys->Radio.dumpBuf(payload, payloadLen); - } - if (NULL == rec) { - DPRINTLN(DBG_ERROR, F("record is NULL!")); - } else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { - if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) - mStat->rxSuccess++; - rec->ts = mPayload[iv->id].ts; - for (uint8_t i = 0; i < rec->length; i++) { - iv->addValue(i, payload, rec); - yield(); - } - iv->doCalculations(); - notify(mPayload[iv->id].txCmd); - if(AlarmData == mPayload[iv->id].txCmd) { - uint8_t i = 0; - uint16_t code; - uint32_t start, end; - while(1) { - code = iv->parseAlarmLog(i++, payload, payloadLen, &start, &end); - if(0 == code) - break; - if (NULL != mCbAlarm) - (mCbAlarm)(code, start, end); - yield(); - } - } - } else { - DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); - mStat->rxFail++; - } - iv->setQueuedCmdFinished(); */ + //uint8_t payload[128]; + //uint8_t payloadLen = 0; + //memset(payload, 0, 128); + //for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { + // memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); + // payloadLen += (mPayload[iv->id].len[i]); + // yield(); + //} + //payloadLen -= 2; + //if (mSerialDebug) { + // DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): "); + // mSys->Radio.dumpBuf(payload, payloadLen); + //} + //if (NULL == rec) { + // DPRINTLN(DBG_ERROR, F("record is NULL!")); + //} else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { + // if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) + // mStat->rxSuccess++; + // rec->ts = mPayload[iv->id].ts; + // for (uint8_t i = 0; i < rec->length; i++) { + // iv->addValue(i, payload, rec); + // yield(); + // } + // iv->doCalculations(); + // notify(mPayload[iv->id].txCmd); + // if(AlarmData == mPayload[iv->id].txCmd) { + // uint8_t i = 0; + // uint16_t code; + // uint32_t start, end; + // while(1) { + // code = iv->parseAlarmLog(i++, payload, payloadLen, &start, &end); + // if(0 == code) + // break; + // if (NULL != mCbAlarm) + // (mCbAlarm)(code, start, end); + // yield(); + // } + // } + //} else { + // DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); + // mStat->rxFail++; + //} + //iv->setQueuedCmdFinished(); //}*/ } yield(); @@ -588,9 +588,9 @@ const byteAssign_t InfoAssignment[] = { if ( mPayload[iv->id].complete || //4ch device - iv->type != INV_TYPE_4CH //other devices + (iv->type != INV_TYPE_4CH //other devices && mPayload[iv->id].dataAB[CH0] - && mPayload[iv->id].stsAB[CH0] ) { + && mPayload[iv->id].stsAB[CH0])) { miComplete(iv); /*mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short... DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); @@ -657,7 +657,7 @@ const byteAssign_t InfoAssignment[] = { //uint8_t cmd = getQueuedCmd(); if(!*complete) { DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX)); - if (txCmd == 0x09 || txCmd == 0x11 || txCmd >= 0x36 && txCmd <= 0x39 ) + if (txCmd == 0x09 || txCmd == 0x11 || (txCmd >= 0x36 && txCmd <= 0x39)) return false; }