diff --git a/src/config/settings.h b/src/config/settings.h index fde3dd68..f555cc99 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -244,10 +244,11 @@ typedef struct { uint16_t powerMax; - + float power; + uint16_t limit; + bool limitAck; + float dcVoltage; // uint16_t waitingTime; -// uint16_t limit; -// bool limitAck; } zeroExportGroupInverter_t; typedef struct { diff --git a/src/defines.h b/src/defines.h index 7d9725a0..05f0acb1 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 850032 +#define VERSION_PATCH 850034 //------------------------------------- typedef struct { diff --git a/src/plugins/zeroExport/zeroExport.h b/src/plugins/zeroExport/zeroExport.h index 3542011a..5818923a 100644 --- a/src/plugins/zeroExport/zeroExport.h +++ b/src/plugins/zeroExport/zeroExport.h @@ -521,10 +521,78 @@ DBGPRINTLN(String(mCfg->groups[group].pmPower)); bool ret = false; DBGPRINT(String("getInverterPowerWatts: ")); DBGPRINTLN(String(group)); -// switch (mCfg->groups[group].pm_type) { - + for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { +DBGPRINT(String("iv: ")); +DBGPRINT(String(inv)); +DBGPRINT(String(" ")); + // Wenn Inverter deaktiviert -> Eintrag ignorieren + if (!mCfg->groups[group].inverters[inv].enabled) { +DBGPRINT(String("(ze disabled).")); + continue; + } + // Daten holen + Inverter<> *iv; + record_t<> *rec; +// TODO: getInverterById + for (uint8_t i = 0; i < mSys->getNumInverters(); i++) { + iv = mSys->getInverterByPos(i); + // Wenn kein Inverter -> ignorieren + if (iv == NULL) { + continue; + } + // Wenn falscher Inverter -> ignorieren + if (iv->id != (uint8_t)mCfg->groups[group].inverters[inv].id) { + continue; + } +DBGPRINT(String("(")); +DBGPRINT(String(iv->id)); +DBGPRINT(String("( gefunden)")); + // wenn Inverter deaktiviert -> Daten ignorieren +// if (!iv->enabled()) { +//DBGPRINT(String(" aber deaktiviert ")); +// continue; +// } + // wenn Inverter nicht verfügbar -> Daten ignorieren + if (!iv->isAvailable()) { +DBGPRINT(String(" aber nicht erreichbar ")); + continue; + } + // wenn Inverter nicht produziert -> Daten ignorieren +// if (!iv->isProducing()) { +//DBGPRINT(String(" aber produziert nix ")); +// continue; +// } + // Daten abrufen + rec = iv->getRecordStruct(RealTimeRunData_Debug); + +// TODO: gibts hier nen Timestamp? Wenn die Daten nicht aktueller sind als beim letzten Durchlauf dann brauch ich nix machen + +mCfg->groups[group].inverters[inv].power = iv->getChannelFieldValue(CH0, FLD_PAC, rec); +DBGPRINT(String("(P=")); +DBGPRINT(String(mCfg->groups[group].inverters[inv].power)); +DBGPRINT(String("W ")); + +mCfg->groups[group].inverters[inv].limit = iv->actPowerLimit; +DBGPRINT(String("Li=")); +DBGPRINT(String(mCfg->groups[group].inverters[inv].limit)); +DBGPRINT(String("% ")); + +mCfg->groups[group].inverters[inv].limitAck = iv->powerLimitAck; +DBGPRINT(String("Ack= ")); +DBGPRINT(String(mCfg->groups[group].inverters[inv].limitAck)); +DBGPRINT(String(" ")); + +mCfg->groups[group].inverters[inv].dcVoltage = iv->getChannelFieldValue(CH1, FLD_UDC, rec); +DBGPRINT(String("U=")); +DBGPRINT(String(mCfg->groups[group].inverters[inv].dcVoltage)); +DBGPRINT(String("V) ")); +// TODO: Eingang muss konfigurierbar sein + ret = true; + } + } +DBGPRINTLN(String("")); return ret; } diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 756a2f02..153e9b03 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -1194,8 +1194,8 @@ ml("th", {style: "width: 10%;"}, "{#ZE_GROUP_TAB_INVERTER_ENABLED}"), ml("th", {}, "{#ZE_GROUP_TAB_INVERTER_NAME}"), ml("th", {}, "{#ZE_GROUP_TAB_INVERTER_SUM}"), - ml("th", {style: "width: 10%;"}, "2%"), - ml("th", {style: "width: 15%;"}, "Max Power"), + ml("th", {style: "width: 10%;"}, "{#ZE_GROUP_TAB_INVERTER_TWOPERCENT}"), + ml("th", {style: "width: 15%;"}, "{#ZE_GROUP_TAB_INVERTER_POWERMAX}"), ])); for(var inv = 0; inv < maxInv; inv++) { @@ -1251,6 +1251,7 @@ ), divRow("{#ZE_GROUP_TAB_POWERMETER_URL}", [ ml("input", {name: "pm_url", class: "text", type: "text", value: obj.pm_url, maxlength: "100"}, null), +// TODO: Hilfstexte -> übersetzen mit lang.json ml("p", {}, "(3em) - http://IP/status"), ml("p", {}, "(pro3em) - http://IP/rpc/Shelly.GetStatus"), ml("p", {}, "(plus1pm) - http://IP/rpc/Shelly.GetStatus"), @@ -1261,6 +1262,7 @@ ]), divRow("{#ZE_GROUP_TAB_POWERMETER_JSONPATH}", [ ml("input", {name: "pm_jsonPath", class: "text", type: "text", value: obj.pm_jsonPath}, null), +// TODO: Hilfstexte -> übersetzen mit lang.json ml("p", {}, "Only for HICHI needed!"), ]), divRow("{#ZE_GROUP_TAB_POWERMETER_USER}", @@ -1299,6 +1301,7 @@ // Inhalt für pm_type aus config laden und in eine Funktion ausgliedern var e = document.getElementById("pm_type"); selDelAllOpt(e); +// TODO: übersetzen? e.appendChild(opt("0", "---")); e.appendChild(opt("1", "Shelly")); e.appendChild(opt("2", "Tasmota")); @@ -1335,6 +1338,7 @@ for (var inv = 0; inv < maxInv; inv++) { var e = document.getElementById("invTarget"+inv); selDelAllOpt(e); +// TODO: übersetzen? e.appendChild(opt("-1", "---")); e.appendChild(opt("0", "Sum")); e.appendChild(opt("1", "L1")); @@ -1483,6 +1487,7 @@ return; } +// TODO: übersetzen? / Überflüssig? Wenn das Modul später entsprechend deaktiviert wird über das Define PLUGIN_ZEROEXPORT // enabled document.getElementsByName("ze_enabled")[0].checked = obj["enabled"]; @@ -1507,7 +1512,6 @@ ml("td", {style: "text-align: center;", }, String(obj.groups[group].id)), ml("td", {style: "text-align: left;", }, String(obj.groups[group].name)), ml("td", {style: "text-align: right;", id: "groupPowerTotal"+group}, "n/a"), -// ml("td", {style: "text-align: center;", onclick: function() {ZeroExportGroup_Modal(obj.groups[group]);}}, svg(iconGear, 25, 25, "icon icon-fg pointer")), ml("td", {style: "text-align: center;", onclick: function() { function zeroGetIvList(ivObj) { ZeroExportGroup_Modal(obj.groups[group], ivObj) diff --git a/src/web/lang.json b/src/web/lang.json index 606630ce..7e8acde6 100644 --- a/src/web/lang.json +++ b/src/web/lang.json @@ -868,9 +868,6 @@ "en": "Password:", "de": "Passwort:" }, - - - { "token": "ZE_GROUP_TAB_INVERTER", "en": "Inverter", @@ -892,28 +889,15 @@ "de": "Gesamt" }, { - "token": "ZE_GROUP_TAB_INVERTER_SUM", - "en": "Sum", - "de": "Gesamt" - }, - { - "token": "ZE_GROUP_TAB_INVERTER_SUM_PHA", - "en": "Ph A", - "de": "L1" - }, - { - "token": "ZE_GROUP_TAB_INVERTER_SUM_PHB", - "en": "Ph B", - "de": "L2" + "token": "ZE_GROUP_TAB_INVERTER_TWOPERCENT", + "en": "2%", + "de": "2%" }, { - "token": "ZE_GROUP_TAB_INVERTER_SUM_PHC", - "en": "Ph C", - "de": "L3" + "token": "ZE_GROUP_TAB_INVERTER_POWERMAX", + "en": "Power (Max)", + "de": "Leistung (Max)" }, - - - { "token": "ZE_GROUP_TAB_BATTERY", "en": "Battery",