From 58044c34aa16d1ffa08e935d0c5fe3c1261e104b Mon Sep 17 00:00:00 2001 From: Wusaweki Date: Sun, 3 Dec 2023 15:51:33 +0100 Subject: [PATCH 01/10] remove redundant check for nullpointer (cherry picked from commit a1de637793bdc14627c68fc1b03d61d5189758cd) (cherry picked from commit 7ba88180c50d7d0b6c971a477987bb5ded5aa9d8) (cherry picked from commit 6888d571834ad5cf4b32a00536501e88112f7049) (cherry picked from commit 8a8b8a61f354992823a77feca3a5193f8c53880e) --- src/hm/hmInverter.h | 50 ++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 1890d142..4252800d 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -288,32 +288,30 @@ class Inverter { uint8_t end = ptr + rec->assign[pos].num; uint16_t div = rec->assign[pos].div; - if(NULL != rec) { - if(CMD_CALC != div) { - uint32_t val = 0; - do { - val <<= 8; - val |= buf[ptr]; - } while(++ptr != end); - - if ((FLD_T == rec->assign[pos].fieldId) || (FLD_Q == rec->assign[pos].fieldId) || (FLD_PF == rec->assign[pos].fieldId)) { - // temperature, Qvar, and power factor are a signed values - rec->record[pos] = ((REC_TYP)((int16_t)val)) / (REC_TYP)(div); - } else if (FLD_YT == rec->assign[pos].fieldId) { - rec->record[pos] = ((REC_TYP)(val) / (REC_TYP)(div)) + ((REC_TYP)config->yieldCor[rec->assign[pos].ch-1]); - } else if (FLD_YD == rec->assign[pos].fieldId) { - float actYD = (REC_TYP)(val) / (REC_TYP)(div); - uint8_t idx = rec->assign[pos].ch - 1; - if (mLastYD[idx] > actYD) - mOffYD[idx] += mLastYD[idx]; - mLastYD[idx] = actYD; - rec->record[pos] = mOffYD[idx] + actYD; - } else { - if ((REC_TYP)(div) > 1) - rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div); - else - rec->record[pos] = (REC_TYP)(val); - } + if(CMD_CALC != div) { + uint32_t val = 0; + do { + val <<= 8; + val |= buf[ptr]; + } while(++ptr != end); + + if ((FLD_T == rec->assign[pos].fieldId) || (FLD_Q == rec->assign[pos].fieldId) || (FLD_PF == rec->assign[pos].fieldId)) { + // temperature, Qvar, and power factor are a signed values + rec->record[pos] = ((REC_TYP)((int16_t)val)) / (REC_TYP)(div); + } else if (FLD_YT == rec->assign[pos].fieldId) { + rec->record[pos] = ((REC_TYP)(val) / (REC_TYP)(div)) + ((REC_TYP)config->yieldCor[rec->assign[pos].ch-1]); + } else if (FLD_YD == rec->assign[pos].fieldId) { + float actYD = (REC_TYP)(val) / (REC_TYP)(div); + uint8_t idx = rec->assign[pos].ch - 1; + if (mLastYD[idx] > actYD) + mOffYD[idx] += mLastYD[idx]; + mLastYD[idx] = actYD; + rec->record[pos] = mOffYD[idx] + actYD; + } else { + if ((REC_TYP)(div) > 1) + rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div); + else + rec->record[pos] = (REC_TYP)(val); } } From 199d4b38732d00380e40f8d2065a279b526398f5 Mon Sep 17 00:00:00 2001 From: you69man Date: Fri, 8 Dec 2023 15:49:12 +0100 Subject: [PATCH 02/10] use mChList[] instead of switch-case (cherry picked from commit fdaf80e964a6ecb2423b0c1d8d03bb0184904ab8) (cherry picked from commit 48c832be5eb05a96204fa1ec70fdf198e06ac94d) (cherry picked from commit effe05a616615d709455d32c46c2254c8cfe399e) --- src/hm/Heuristic.h | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h index cc42df4f..59c35aec 100644 --- a/src/hm/Heuristic.h +++ b/src/hm/Heuristic.h @@ -217,15 +217,12 @@ class Heuristic { } inline uint8_t id2Ch(uint8_t id) { - switch(id) { - case 0: return 3; - case 1: return 23; - case 2: return 40; - case 3: return 61; - case 4: return 75; - } - return 3; // standard + if (id < RF_MAX_CHANNEL_ID) + return mChList[id]; + else + return 3; // standard } + uint8_t mChList[RF_MAX_CHANNEL_ID] = {03, 23, 40, 61, 75}; }; From 363aac5d0227a8c70d5a4d09c2cf37d83e43f140 Mon Sep 17 00:00:00 2001 From: you69man Date: Sun, 17 Dec 2023 12:11:49 +0100 Subject: [PATCH 03/10] used INVERTERTYPE:: instead of mInverter[0] for global setup --- src/hm/hmSystem.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hm/hmSystem.h b/src/hm/hmSystem.h index e9b839be..c4219435 100644 --- a/src/hm/hmSystem.h +++ b/src/hm/hmSystem.h @@ -16,8 +16,8 @@ class HmSystem { HmSystem() {} void setup(uint32_t *timestamp, cfgInst_t *config, IApp *app) { - mInverter[0].timestamp = timestamp; - mInverter[0].generalConfig = config; + INVERTERTYPE::timestamp = timestamp; + INVERTERTYPE::generalConfig = config; //mInverter[0].app = app; } From c9a9d6b7733a18d4efb1aeaa190cae091ceaad07 Mon Sep 17 00:00:00 2001 From: you69man Date: Sat, 23 Dec 2023 12:31:47 +0100 Subject: [PATCH 04/10] remove unnecessary config entry 'enabled' for cfgInst_t --- src/config/settings.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config/settings.h b/src/config/settings.h index 9c9b48c2..fe0053a9 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -152,7 +152,7 @@ typedef struct { } cfgIv_t; typedef struct { - bool enabled; +// bool enabled; cfgIv_t iv[MAX_NUM_INVERTERS]; uint16_t sendInterval; @@ -755,7 +755,7 @@ class settings { void jsonInst(JsonObject obj, bool set = false) { if(set) { obj[F("intvl")] = mCfg.inst.sendInterval; - obj[F("en")] = (bool)mCfg.inst.enabled; +// obj[F("en")] = (bool)mCfg.inst.enabled; obj[F("rstMidNight")] = (bool)mCfg.inst.rstYieldMidNight; obj[F("rstNotAvail")] = (bool)mCfg.inst.rstValsNotAvail; obj[F("rstComStop")] = (bool)mCfg.inst.rstValsCommStop; @@ -765,7 +765,7 @@ class settings { } else { getVal(obj, F("intvl"), &mCfg.inst.sendInterval); - getVal(obj, F("en"), &mCfg.inst.enabled); +// getVal(obj, F("en"), &mCfg.inst.enabled); getVal(obj, F("rstMidNight"), &mCfg.inst.rstYieldMidNight); getVal(obj, F("rstNotAvail"), &mCfg.inst.rstValsNotAvail); getVal(obj, F("rstComStop"), &mCfg.inst.rstValsCommStop); From b143eb371b2d88333704c626108fd4d5651092af Mon Sep 17 00:00:00 2001 From: you69man Date: Sat, 23 Dec 2023 16:16:36 +0100 Subject: [PATCH 05/10] remove strncpy warning in scheduler.h Warning was: output truncated before terminating nul copying 5 bytes from a string of the same length --- src/utils/scheduler.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/scheduler.h b/src/utils/scheduler.h index 16009778..0f7cea7b 100644 --- a/src/utils/scheduler.h +++ b/src/utils/scheduler.h @@ -125,8 +125,8 @@ namespace ah { mTicker[i].timeout = timeout; mTicker[i].reload = reload; mTicker[i].isTimestamp = isTimestamp; - memset(mTicker[i].name, 0, 6); - strncpy(mTicker[i].name, name, (strlen(name) < 6) ? strlen(name) : 5); + strncpy(mTicker[i].name, name, 5); + mTicker[i].name[5]=0; if(mMax == i) mMax = i + 1; return i; From dd8f8c138b72aecb796992637052237edc8c0138 Mon Sep 17 00:00:00 2001 From: Wusaweki Date: Sun, 3 Dec 2023 16:37:18 +0100 Subject: [PATCH 06/10] fix typos --- src/CHANGES.md | 4 ++-- src/defines.h | 2 +- src/hm/Communication.h | 2 +- src/hm/Heuristic.h | 2 +- src/publisher/pubMqttIvData.h | 2 +- src/web/RestApi.h | 2 +- src/web/html/includes/nav.html | 6 +++--- src/web/html/style.css | 2 +- src/web/web.h | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 2cd2300f..09ba13f2 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -265,7 +265,7 @@ ## 0.8.39 - 2024-01-01 * fix MqTT dis_night_comm in the morning #1309 #1286 -* seperated offset for sunrise and sunset #1308 +* separated offset for sunrise and sunset #1308 * powerlimit (active power control) now has one decimal place (MqTT / API) #1199 * merge Prometheus metrics fix #1310 * merge MI grid profile request #1306 @@ -478,7 +478,7 @@ ## 0.7.61 - 2023-10-01 * merged `hmPayload` and `hmsPayload` into single class * merged generic radio functions into new parent class `radio.h` -* moved radio statistics into the inverter - each inverter has now seperate statistics which can be accessed by click on the footer in `/live` +* moved radio statistics into the inverter - each inverter has now separate statistics which can be accessed by click on the footer in `/live` * fix compiler warnings #1191 * fix ePaper logo during night time #1151 diff --git a/src/defines.h b/src/defines.h index 8dcfe988..67e902bd 100644 --- a/src/defines.h +++ b/src/defines.h @@ -109,7 +109,7 @@ enum { typedef struct { uint32_t rxFail; - uint32_t rxFailNoAnser; + uint32_t rxFailNoAnswer; uint32_t rxSuccess; uint32_t frmCnt; uint32_t txCnt; diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 8c7fbe6d..b616f317 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -622,7 +622,7 @@ class Communication : public CommQueue<> { else if(q->iv->mGotFragment || mCompleteRetry) q->iv->radioStatistics.rxFail++; // got no complete payload else - q->iv->radioStatistics.rxFailNoAnser++; // got nothing + q->iv->radioStatistics.rxFailNoAnswer++; // got nothing mWaitTime.startTimeMonitor(1); // maybe remove, side effects unknown bool keep = false; diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h index 59c35aec..1220692e 100644 --- a/src/hm/Heuristic.h +++ b/src/hm/Heuristic.h @@ -153,7 +153,7 @@ class Heuristic { DBGPRINT(F(", f: ")); DBGPRINT(String(iv->radioStatistics.rxFail)); DBGPRINT(F(", n: ")); - DBGPRINT(String(iv->radioStatistics.rxFailNoAnser)); + DBGPRINT(String(iv->radioStatistics.rxFailNoAnswer)); DBGPRINT(F(" | p: ")); // better debugging for helpers... if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) DBGPRINTLN(String(iv->config->powerLevel-10)); diff --git a/src/publisher/pubMqttIvData.h b/src/publisher/pubMqttIvData.h index ac8b3bf0..6ddd63a9 100644 --- a/src/publisher/pubMqttIvData.h +++ b/src/publisher/pubMqttIvData.h @@ -222,7 +222,7 @@ class PubMqttIvData { mIv->radioStatistics.txCnt, mIv->radioStatistics.rxSuccess, mIv->radioStatistics.rxFail, - mIv->radioStatistics.rxFailNoAnser, + mIv->radioStatistics.rxFailNoAnswer, mIv->radioStatistics.retransmits, mIv->radioStatistics.ivLoss, mIv->radioStatistics.ivSent, diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 0120375a..f6917077 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -426,7 +426,7 @@ class RestApi { obj[F("name")] = String(iv->config->name); obj[F("rx_success")] = iv->radioStatistics.rxSuccess; obj[F("rx_fail")] = iv->radioStatistics.rxFail; - obj[F("rx_fail_answer")] = iv->radioStatistics.rxFailNoAnser; + obj[F("rx_fail_answer")] = iv->radioStatistics.rxFailNoAnswer; obj[F("frame_cnt")] = iv->radioStatistics.frmCnt; obj[F("tx_cnt")] = iv->radioStatistics.txCnt; obj[F("retransmits")] = iv->radioStatistics.retransmits; diff --git a/src/web/html/includes/nav.html b/src/web/html/includes/nav.html index 447bf411..bab64829 100644 --- a/src/web/html/includes/nav.html +++ b/src/web/html/includes/nav.html @@ -10,15 +10,15 @@ {#NAV_HISTORY} {#NAV_WEBSERIAL} {#NAV_SETTINGS} - + Update System - + REST API {#NAV_DOCUMENTATION} {#NAV_ABOUT} Custom Link - + Login Logout diff --git a/src/web/html/style.css b/src/web/html/style.css index 2d6a03c7..74cf4e8e 100644 --- a/src/web/html/style.css +++ b/src/web/html/style.css @@ -139,7 +139,7 @@ svg.icon { background-color: var(--nav-active); } -span.seperator { +span.separator { width: 100%; height: 1px; margin: 5px 0 5px; diff --git a/src/web/web.h b/src/web/web.h index de4938f1..0a4f0ed5 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -661,7 +661,7 @@ class Web { { "max_power", "gauge", metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->getMaxPower();} }, { "radio_rx_success", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.rxSuccess;} }, { "radio_rx_fail", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.rxFail;} }, - { "radio_rx_fail_answer", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.rxFailNoAnser;} }, + { "radio_rx_fail_answer", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.rxFailNoAnswer;} }, { "radio_frame_cnt", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.frmCnt;} }, { "radio_tx_cnt", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.txCnt;} }, { "radio_retransmits", "counter" ,metricConstInverterFormat, [](Inverter<> *iv)-> uint64_t {return iv->radioStatistics.retransmits;} }, From 49508ba78e694476883d3bf96207ec4305ee93ed Mon Sep 17 00:00:00 2001 From: you69man Date: Sat, 24 Feb 2024 14:20:07 +0100 Subject: [PATCH 07/10] fix two warnings 1) C++ forbids converting a string constant to 'char*' 2) suggest paranthesis around '&&' within '||' --- src/hm/Communication.h | 2 +- src/publisher/pubMqtt.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index b616f317..5fd3b487 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -117,7 +117,7 @@ class Communication : public CommQueue<> { //q->iv->radioStatistics.txCnt++; q->iv->radio->mRadioWaitTime.startTimeMonitor(mTimeout); - if(!mIsRetransmit && (q->cmd == AlarmData) || (q->cmd == GridOnProFilePara)) + if((!mIsRetransmit && (q->cmd == AlarmData)) || (q->cmd == GridOnProFilePara)) incrAttempt((q->cmd == AlarmData)? MORE_ATTEMPS_ALARMDATA : MORE_ATTEMPS_GRIDONPROFILEPARA); mIsRetransmit = false; diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index ea6f331e..4b09b649 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -423,7 +423,7 @@ class PubMqtt { } DynamicJsonDocument doc2(512); - constexpr static char* unitTotal[] = {"W", "kWh", "Wh", "W"}; + constexpr static const char* unitTotal[] = {"W", "kWh", "Wh", "W"}; doc2[F("name")] = String(name.data()); doc2[F("stat_t")] = String(mCfgMqtt->topic) + "/" + ((!total) ? String(iv->config->name) : "total" ) + String(topic.data()); doc2[F("unit_of_meas")] = ((!total) ? (iv->getUnit(mDiscovery.sub, rec)) : (unitTotal[mDiscovery.sub])); From 0d7c67dbcecaee200ccee505a5a2a8a4b3153c62 Mon Sep 17 00:00:00 2001 From: lumapu Date: Sat, 2 Mar 2024 01:25:59 +0100 Subject: [PATCH 08/10] 0.8.89 * merge PR: Collection of small fixes #1465 * fix: show esp type on `/history` #1463 * improved HMS-400-1T support (serial number 1125...) #1460 --- src/CHANGES.md | 5 +++++ src/defines.h | 2 +- src/hm/hmSystem.h | 3 ++- src/web/html/history.html | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 09ba13f2..f5aa9cd9 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,10 @@ # Development Changes +## 0.8.89 - 2024-03-02 +* merge PR: Collection of small fixes #1465 +* fix: show esp type on `/history` #1463 +* improved HMS-400-1T support (serial number 1125...) #1460 + ## 0.8.88 - 2024-02-28 * fix MqTT statistic data overflow #1458 * add HMS-400-1T support (serial number 1125...) #1460 diff --git a/src/defines.h b/src/defines.h index 67e902bd..b7ee4406 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 88 +#define VERSION_PATCH 89 //------------------------------------- typedef struct { diff --git a/src/hm/hmSystem.h b/src/hm/hmSystem.h index c4219435..3b43b9f0 100644 --- a/src/hm/hmSystem.h +++ b/src/hm/hmSystem.h @@ -31,11 +31,12 @@ class HmSystem { if((iv->config->serial.b[5] == 0x11) || (iv->config->serial.b[5] == 0x10)) { switch(iv->config->serial.b[4]) { case 0x24: // HMS-500 - case 0x25: // HMS-400 case 0x22: case 0x21: iv->type = INV_TYPE_1CH; break; + case 0x25: // HMS-400 - 1 channel but payload like 2ch + case 0x44: // HMS-1000 case 0x42: case 0x41: iv->type = INV_TYPE_2CH; diff --git a/src/web/html/history.html b/src/web/html/history.html index 7e317b59..6372ab82 100644 --- a/src/web/html/history.html +++ b/src/web/html/history.html @@ -80,6 +80,7 @@ function parsePowerHistory(obj){ if (null != obj) { parseNav(obj.generic); + parseESP(obj.generic); parseHistory(obj,"pwr", pwrExeOnce) document.getElementById("pwrLast").innerHTML = mLastValue document.getElementById("pwrMaxDay").innerHTML = obj.maxDay From e5c0e8e9964dbd91c197d27ae4bf3b90860afaaa Mon Sep 17 00:00:00 2001 From: lumapu Date: Tue, 5 Mar 2024 00:15:12 +0100 Subject: [PATCH 09/10] 0.8.90 * added preprocessor defines to HTML (from platform.ini) to reduce the HTML in size if modules aren't enabled * auto build minimal English versions of ESP8266 and ESP32 --- .github/workflows/compile_development.yml | 2 + scripts/convertHtml.py | 149 ++++++++++++---------- scripts/htmlPreprocessorDefines.py | 39 ++++++ src/CHANGES.md | 4 + src/defines.h | 2 +- src/platformio.ini | 4 +- src/web/html/includes/nav.html | 2 + src/web/html/setup.html | 113 ++++++++++++++-- 8 files changed, 237 insertions(+), 78 deletions(-) create mode 100644 scripts/htmlPreprocessorDefines.py diff --git a/.github/workflows/compile_development.yml b/.github/workflows/compile_development.yml index 7f539871..48a3f42a 100644 --- a/.github/workflows/compile_development.yml +++ b/.github/workflows/compile_development.yml @@ -24,9 +24,11 @@ jobs: matrix: variant: - esp8266 + - esp8266-minimal - esp8266-prometheus - esp8285 - esp32-wroom32 + - esp32-wroom32-minimal - esp32-wroom32-prometheus - esp32-wroom32-ethernet - esp32-s2-mini diff --git a/scripts/convertHtml.py b/scripts/convertHtml.py index c39e95ac..ec16b5f3 100644 --- a/scripts/convertHtml.py +++ b/scripts/convertHtml.py @@ -7,8 +7,37 @@ import json from datetime import date from pathlib import Path import subprocess +import configparser Import("env") +import htmlPreprocessorDefines as prepro + + + +def get_build_flags(): + config = configparser.ConfigParser() + config.read('platformio.ini') + global build_flags + build_flags = config["env:" + env['PIOENV']]['build_flags'].split('\n') + + for i in range(len(build_flags)): + build_flags[i] = build_flags[i][2:] + + # translate board + board = config["env:" + env['PIOENV']]['board'] + if board == "esp12e" or board == "esp8285": + build_flags.append("ESP8266") + elif board == "lolin_d32": + build_flags.append("ESP32") + elif board == "lolin_s2_mini": + build_flags.append("ESP32") + build_flags.append("ESP32-S2") + elif board == "lolin_c3_mini": + build_flags.append("ESP32") + build_flags.append("ESP32-C3") + elif board == "esp32-s3-devkitc-1": + build_flags.append("ESP32") + build_flags.append("ESP32-S3") def get_git_sha(): try: @@ -50,38 +79,46 @@ def readVersionFull(path): return version def htmlParts(file, header, nav, footer, versionPath, lang): - p = ""; f = open(file, "r") lines = f.readlines() f.close(); f = open(header, "r") - h = f.read().strip() + h = f.readlines() f.close() f = open(nav, "r") - n = f.read().strip() + n = f.readlines() f.close() f = open(footer, "r") - fo = f.read().strip() + fo = f.readlines() f.close() + linesExt = [] for line in lines: - line = line.replace("{#HTML_HEADER}", h) - line = line.replace("{#HTML_NAV}", n) - line = line.replace("{#HTML_FOOTER}", fo) - p += line + if line.find("{#HTML_HEADER}") != -1: + linesExt.extend(h) + elif line.find("{#HTML_NAV}") != -1: + linesExt.extend(n) + elif line.find("{#HTML_FOOTER}") != -1: + linesExt.extend(fo) + else: + linesExt.append(line) + + linesMod = prepro.conv(linesExt, build_flags) #placeholders version = readVersion(versionPath); link = 'GIT SHA: ' + get_git_sha() + ' :: ' + version + '' + p = "" + for line in linesMod: + p += line + p = p.replace("{#VERSION}", version) p = p.replace("{#VERSION_FULL}", readVersionFull(versionPath)) p = p.replace("{#VERSION_GIT}", link) - # remove if - endif ESP32 - p = checkIf(p) p = translate(file, p, lang) p = translate("general", p, lang) # menu / header / footer @@ -90,30 +127,6 @@ def htmlParts(file, header, nav, footer, versionPath, lang): f.close(); return p -def checkIf(data): - if (env['PIOENV'][0:5] == "esp32") or env['PIOENV'][0:4] == "open": - data = data.replace("", "") - data = data.replace("", "") - data = data.replace("/*IF_ESP32*/", "") - data = data.replace("/*ENDIF_ESP32*/", "") - else: - while 1: - start = data.find("") - end = data.find("")+18 - if -1 == start: - break - else: - data = data[0:start] + data[end:] - while 1: - start = data.find("/*IF_ESP32*/") - end = data.find("/*ENDIF_ESP32*/")+15 - if -1 == start: - break - else: - data = data[0:start] + data[end:] - - return data - def findLang(file): with open('../lang.json') as j: lang = json.load(j) @@ -189,33 +202,41 @@ def convert2Header(inFile, versionPath, lang): f.write("#endif /*__{}_{}_H__*/\n".format(define, define2)) f.close() -# delete all files in the 'h' dir -wd = 'web/html/h' - -if os.path.exists(wd): - for f in os.listdir(wd): - os.remove(os.path.join(wd, f)) -wd += "/tmp" -if os.path.exists(wd): - for f in os.listdir(wd): - os.remove(os.path.join(wd, f)) - -# grab all files with following extensions -os.chdir('./web/html') -types = ('*.html', '*.css', '*.js', '*.ico', '*.json') # the tuple of file types -files_grabbed = [] -for files in types: - files_grabbed.extend(glob.glob(files)) - -Path("h").mkdir(exist_ok=True) -Path("tmp").mkdir(exist_ok=True) # created to check if webpages are valid with all replacements -shutil.copyfile("style.css", "tmp/style.css") - -# get language from environment -lang = "en" -if env['PIOENV'][-3:] == "-de": - lang = "de" - -# go throw the array -for val in files_grabbed: - convert2Header(val, "../../defines.h", lang) + +def main(): + get_build_flags() + + # delete all files in the 'h' dir + wd = 'web/html/h' + + if os.path.exists(wd): + for f in os.listdir(wd): + os.remove(os.path.join(wd, f)) + wd += "/tmp" + if os.path.exists(wd): + for f in os.listdir(wd): + os.remove(os.path.join(wd, f)) + + # grab all files with following extensions + os.chdir('./web/html') + types = ('*.html', '*.css', '*.js', '*.ico', '*.json') # the tuple of file types + files_grabbed = [] + for files in types: + files_grabbed.extend(glob.glob(files)) + + Path("h").mkdir(exist_ok=True) + Path("tmp").mkdir(exist_ok=True) # created to check if webpages are valid with all replacements + shutil.copyfile("style.css", "tmp/style.css") + + # get language from environment + lang = "en" + if env['PIOENV'][-3:] == "-de": + lang = "de" + + + # go throw the array + for val in files_grabbed: + convert2Header(val, "../../defines.h", lang) + + +main() diff --git a/scripts/htmlPreprocessorDefines.py b/scripts/htmlPreprocessorDefines.py new file mode 100644 index 00000000..8fa54fa4 --- /dev/null +++ b/scripts/htmlPreprocessorDefines.py @@ -0,0 +1,39 @@ +import re +import os +import queue + +def error(msg): + print("ERROR: " + msg) + exit() + +def check(inp, lst, pattern): + q = queue.LifoQueue() + out = [] + keep = True + for line in inp: + x = re.findall(pattern, line) + if len(x) > 0: + if line.find("ENDIF_") != -1: + if q.empty(): + error("missing open statement!") + if q.get() != x[0]: + error("wrong close statement!") + keep = True + elif line.find("IF_") != -1: + q.put(x[0]) + if keep is True: + keep = x[0] in lst + elif line.find("E") != -1: + if q.empty(): + error("missing open statement!") + keep = not keep + else: + if keep is True: + out.append(line) + + return out + +def conv(inp, lst): + print(lst) + out = check(inp, lst, r'\/\*(?:IF_|ELS|ENDIF_)([A-Z0-9\-_]+)?\*\/') + return check(out, lst, r'\<\!\-\-(?:IF_|ELS|ENDIF_)([A-Z0-9\-_]+)?\-\-\>') diff --git a/src/CHANGES.md b/src/CHANGES.md index f5aa9cd9..71a8fa16 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,9 @@ # Development Changes +## 0.8.90 - 2024-03-05 +* added preprocessor defines to HTML (from platform.ini) to reduce the HTML in size if modules aren't enabled +* auto build minimal English versions of ESP8266 and ESP32 + ## 0.8.89 - 2024-03-02 * merge PR: Collection of small fixes #1465 * fix: show esp type on `/history` #1463 diff --git a/src/defines.h b/src/defines.h index b7ee4406..5f156cbb 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 89 +#define VERSION_PATCH 90 //------------------------------------- typedef struct { diff --git a/src/platformio.ini b/src/platformio.ini index f949aa37..e9e63465 100644 --- a/src/platformio.ini +++ b/src/platformio.ini @@ -191,7 +191,7 @@ monitor_filters = [env:esp32-wroom32-ethernet] platform = espressif32 -board = esp32dev +board = lolin_d32 lib_deps = khoih-prog/AsyncWebServer_ESP32_W5500 khoih-prog/AsyncUDP_ESP32_W5500 @@ -214,7 +214,7 @@ monitor_filters = [env:esp32-wroom32-ethernet-de] platform = espressif32 -board = esp32dev +board = lolin_d32 lib_deps = khoih-prog/AsyncWebServer_ESP32_W5500 khoih-prog/AsyncUDP_ESP32_W5500 diff --git a/src/web/html/includes/nav.html b/src/web/html/includes/nav.html index bab64829..c0d6c470 100644 --- a/src/web/html/includes/nav.html +++ b/src/web/html/includes/nav.html @@ -7,7 +7,9 @@
{#NAV_LIVE} + {#NAV_HISTORY} + {#NAV_WEBSERIAL} {#NAV_SETTINGS} diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 57dc6a8c..3536fee3 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -272,7 +272,7 @@
- +
@@ -301,6 +301,7 @@
+
{#BTN_REBOOT_SUCCESSFUL_SAVE}
@@ -341,6 +342,7 @@ var maxInv = 0; var ts = 0; + /*IF_ESP8266*/ var esp8266pins = [ [255, "{#PIN_OFF}"], [0, "D3 (GPIO0)"], @@ -361,6 +363,7 @@ [15, "D8 (GPIO15)"], [16, "D0 (GPIO16 - {#PIN_NO_IRQ})"] ]; + /*ENDIF_ESP8266*/ /*IF_ESP32*/ var esp32pins = [ @@ -392,6 +395,7 @@ [36, "VP (GPIO36, {#PIN_INPUT_ONLY})"], [39, "VN (GPIO39, {#PIN_INPUT_ONLY})"] ]; + /*IF_ESP32-S2*/ var esp32sXpins = [ [255, "off / default"], [0, "GPIO0 ({#PIN_DONT_USE} - BOOT)"], @@ -440,6 +444,58 @@ [47, "GPIO47"], [48, "GPIO48"], ]; + /*ENDIF_ESP32-S2*/ + /*IF_ESP32-S3*/ + var esp32sXpins = [ + [255, "off / default"], + [0, "GPIO0 ({#PIN_DONT_USE} - BOOT)"], + [1, "GPIO1"], + [2, "GPIO2"], + [3, "GPIO3"], + [4, "GPIO4"], + [5, "GPIO5"], + [6, "GPIO6"], + [7, "GPIO7"], + [8, "GPIO8"], + [9, "GPIO9"], + [10, "GPIO10"], + [11, "GPIO11"], + [12, "GPIO12"], + [13, "GPIO13"], + [14, "GPIO14"], + [15, "GPIO15"], + [16, "GPIO16"], + [17, "GPIO17"], + [18, "GPIO18"], + [19, "GPIO19 ({#PIN_DONT_USE} - USB-)"], + [20, "GPIO20 ({#PIN_DONT_USE} - USB+)"], + [21, "GPIO21"], + [26, "GPIO26 (PSRAM - {#PIN_NOT_AVAIL})"], + [27, "GPIO27 (FLASH - {#PIN_NOT_AVAIL})"], + [28, "GPIO28 (FLASH - {#PIN_NOT_AVAIL})"], + [29, "GPIO29 (FLASH - {#PIN_NOT_AVAIL})"], + [30, "GPIO30 (FLASH - {#PIN_NOT_AVAIL})"], + [31, "GPIO31 (FLASH - {#PIN_NOT_AVAIL})"], + [32, "GPIO32 (FLASH - {#PIN_NOT_AVAIL})"], + [33, "GPIO33 (not exposed on S3-WROOM modules)"], + [34, "GPIO34 (not exposed on S3-WROOM modules)"], + [35, "GPIO35"], + [36, "GPIO36"], + [37, "GPIO37"], + [38, "GPIO38"], + [39, "GPIO39"], + [40, "GPIO40"], + [41, "GPIO41"], + [42, "GPIO42"], + [43, "GPIO43"], + [44, "GPIO44"], + [45, "GPIO45 ({#PIN_DONT_USE} - STRAPPING PIN)"], + [46, "GPIO46 ({#PIN_DONT_USE} - STRAPPING PIN)"], + [47, "GPIO47"], + [48, "GPIO48"], + ]; + /*ENDIF_ESP32-S3*/ + /*IF_ESP32-C3*/ var esp32c3pins = [ [255, "off / default"], [0, "GPIO0"], @@ -465,6 +521,7 @@ [20, "GPIO20 (RX)"], [21, "GPIO21 (TX)"], ]; + /*ENDIF_ESP32-C3*/ /*ENDIF_ESP32*/ var nrfPa = [ [0, "MIN ({#PIN_RECOMMENDED})"], @@ -890,11 +947,19 @@ function parsePinout(obj, type, system) { var e = document.getElementById("pinout"); - var pinList = esp8266pins; /*IF_ESP32*/ var pinList = esp32pins; - if ("ESP32-S3" == system.chip_model || "ESP32-S2" == system.chip_model) pinList = esp32sXpins; - else if("ESP32-C3" == system["chip_model"]) pinList = esp32c3pins; + /*IF_ESP32-S2*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S2*/ + /*IF_ESP32-S3*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S3*/ + /*IF_ESP32-C3*/ + pinList = esp32c3pins; + /*ENDIF_ESP32-C3*/ + /*ELSE*/ + var pinList = esp8266pins; /*ENDIF_ESP32*/ pins = [['led0', 'pinLed0', '{#LED_AT_LEAST_ONE_PRODUCING}'], ['led1', 'pinLed1', '{#LED_MQTT_CONNECTED}'], ['led2', 'pinLed2', '{#LED_NIGHT_TIME}']]; for(p of pins) { @@ -926,11 +991,19 @@ var en = inp("nrfEnable", null, null, ["cb"], "nrfEnable", "checkbox"); en.checked = obj["en"]; - var pinList = esp8266pins; /*IF_ESP32*/ var pinList = esp32pins; - if ("ESP32-S3" == system.chip_model || "ESP32-S2" == system.chip_model) pinList = esp32sXpins; - else if("ESP32-C3" == system["chip_model"]) pinList = esp32c3pins; + /*IF_ESP32-S2*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S2*/ + /*IF_ESP32-S3*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S3*/ + /*IF_ESP32-C3*/ + pinList = esp32c3pins; + /*ENDIF_ESP32-C3*/ + /*ELSE*/ + var pinList = esp8266pins; /*ENDIF_ESP32*/ e.replaceChildren ( @@ -962,8 +1035,15 @@ var e = document.getElementById("cmt"); var en = inp("cmtEnable", null, null, ["cb"], "cmtEnable", "checkbox"); var pinList = esp32pins; - if ("ESP32-S3" == system.chip_model || "ESP32-S2" == system.chip_model) pinList = esp32sXpins; - else if("ESP32-C3" == system["chip_model"]) pinList = esp32c3pins; + /*IF_ESP32-S2*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S2*/ + /*IF_ESP32-S3*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S3*/ + /*IF_ESP32-C3*/ + pinList = esp32c3pins; + /*ENDIF_ESP32-C3*/ en.checked = obj["en"]; @@ -1008,12 +1088,20 @@ } } + /*IF_PLUGIN_DISPLAY*/ function parseDisplay(obj, type, system) { var pinList = esp8266pins; /*IF_ESP32*/ var pinList = esp32pins; - if ("ESP32-S3" == system.chip_model || "ESP32-S2" == system.chip_model) pinList = esp32sXpins; - else if("ESP32-C3" == system["chip_model"]) pinList = esp32c3pins; + /*IF_ESP32-S2*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S2*/ + /*IF_ESP32-S3*/ + pinList = esp32sXpins; + /*ENDIF_ESP32-S3*/ + /*IF_ESP32-C3*/ + pinList = esp32c3pins; + /*ENDIF_ESP32-C3*/ /*ENDIF_ESP32*/ for(var i of ["disp_pwr"]) @@ -1149,6 +1237,7 @@ setHide("screenSaver", !optionsMap.get(dispType)[2]); setHide("pirPin", !(optionsMap.get(dispType)[2] && (screenSaver==2))); // show pir pin only for motion screensaver } + /*ENDIF_PLUGIN_DISPLAY*/ function tick() { document.getElementById("date").innerHTML = toIsoDateStr((new Date((++ts) * 1000))); @@ -1168,7 +1257,9 @@ parseCmtRadio(root["radioCmt"], root["system"]["esp_type"], root["system"]); /*ENDIF_ESP32*/ parseSerial(root["serial"]); + /*IF_PLUGIN_DISPLAY*/ parseDisplay(root["display"], root["system"]["esp_type"], root["system"]); + /*ENDIF_PLUGIN_DISPLAY*/ getAjax("/api/inverter/list", parseIv); } } From 7b030a39d50c190d2b70c9a6533c96b93fbaa242 Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 6 Mar 2024 00:02:11 +0100 Subject: [PATCH 10/10] 0.8.91 * fix javascript issues #1480 --- scripts/htmlPreprocessorDefines.py | 19 ++++++++++--------- src/CHANGES.md | 3 +++ src/defines.h | 2 +- src/web/html/api.js | 4 +++- src/web/html/includes/nav.html | 3 ++- src/web/html/setup.html | 3 ++- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/scripts/htmlPreprocessorDefines.py b/scripts/htmlPreprocessorDefines.py index 8fa54fa4..f8230a90 100644 --- a/scripts/htmlPreprocessorDefines.py +++ b/scripts/htmlPreprocessorDefines.py @@ -14,23 +14,24 @@ def check(inp, lst, pattern): x = re.findall(pattern, line) if len(x) > 0: if line.find("ENDIF_") != -1: - if q.empty(): - error("missing open statement!") - if q.get() != x[0]: - error("wrong close statement!") - keep = True + if not q.empty(): + e = q.get() + if e[0] == x[0]: + keep = e[1] elif line.find("IF_") != -1: - q.put(x[0]) + q.put((x[0], keep)) if keep is True: keep = x[0] in lst elif line.find("E") != -1: if q.empty(): - error("missing open statement!") - keep = not keep + error("(ELSE) missing open statement!") + e = q.get() + q.put(e) + if e[1] is True: + keep = not keep else: if keep is True: out.append(line) - return out def conv(inp, lst): diff --git a/src/CHANGES.md b/src/CHANGES.md index 71a8fa16..876e7f93 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,8 @@ # Development Changes +## 0.8.91 - 2024-03-05 +* fix javascript issues #1480 + ## 0.8.90 - 2024-03-05 * added preprocessor defines to HTML (from platform.ini) to reduce the HTML in size if modules aren't enabled * auto build minimal English versions of ESP8266 and ESP32 diff --git a/src/defines.h b/src/defines.h index 5f156cbb..0d1509cc 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 90 +#define VERSION_PATCH 91 //------------------------------------- typedef struct { diff --git a/src/web/html/api.js b/src/web/html/api.js index 5cce4206..1b51699c 100644 --- a/src/web/html/api.js +++ b/src/web/html/api.js @@ -84,10 +84,12 @@ function topnav() { } function parseNav(obj) { - for(i = 0; i < 13; i++) { + for(i = 0; i < 14; i++) { if(i == 2) continue; var l = document.getElementById("nav"+i); + if(null == l) + continue if(12 == i) { if(obj.cst_lnk.length > 0) { l.href = obj.cst_lnk diff --git a/src/web/html/includes/nav.html b/src/web/html/includes/nav.html index c0d6c470..4718e257 100644 --- a/src/web/html/includes/nav.html +++ b/src/web/html/includes/nav.html @@ -17,7 +17,8 @@ System REST API - {#NAV_DOCUMENTATION} + {#NAV_DOCUMENTATION} + Website {#NAV_ABOUT} Custom Link diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 3536fee3..b6b8929e 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -1090,7 +1090,6 @@ /*IF_PLUGIN_DISPLAY*/ function parseDisplay(obj, type, system) { - var pinList = esp8266pins; /*IF_ESP32*/ var pinList = esp32pins; /*IF_ESP32-S2*/ @@ -1102,6 +1101,8 @@ /*IF_ESP32-C3*/ pinList = esp32c3pins; /*ENDIF_ESP32-C3*/ + /*ELSE*/ + var pinList = esp8266pins; /*ENDIF_ESP32*/ for(var i of ["disp_pwr"])