diff --git a/src/config/settings.h b/src/config/settings.h index ace54cfc..e54dce4d 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -313,6 +313,7 @@ typedef struct { unsigned long lastRefresh; uint16_t wait; + bool battSwitchInit; bool battSwitch; // PID controller @@ -716,6 +717,7 @@ class settings { // mCfg.plugin.zeroExport.groups[group].pm_P2 = 0; // mCfg.plugin.zeroExport.groups[group].pm_P3 = 0; + mCfg.plugin.zeroExport.groups[group].battSwitchInit = false; mCfg.plugin.zeroExport.groups[group].battSwitch = false; mCfg.plugin.zeroExport.groups[group].power = 0; } diff --git a/src/plugins/zeroExport/powermeter.h b/src/plugins/zeroExport/powermeter.h index 4cf6f5d9..d590aae1 100644 --- a/src/plugins/zeroExport/powermeter.h +++ b/src/plugins/zeroExport/powermeter.h @@ -294,7 +294,7 @@ class powermeter { /** setHeader * */ - void setHeader(HTTPClient *h, String auth = "", u8_t realm = NULL) { + void setHeader(HTTPClient *h, String auth = "", u8_t realm = 0) { h->setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); /// h->setUserAgent("Ahoy-Agent"); /// // TODO: Ahoy-0.8.850024-zero diff --git a/src/plugins/zeroExport/zeroExport.h b/src/plugins/zeroExport/zeroExport.h index c63ebad9..160da4a2 100644 --- a/src/plugins/zeroExport/zeroExport.h +++ b/src/plugins/zeroExport/zeroExport.h @@ -24,7 +24,7 @@ class ZeroExport { /** ZeroExport * constructor */ - ZeroExport() {} + ZeroExport() { } /** ~ZeroExport * destructor @@ -91,6 +91,31 @@ class ZeroExport { zeroExportGroup_t *CfgGroup = &mCfg->groups[group]; zeroExportGroupInverter_t *CfgGroupInv = &CfgGroup->inverters[inv]; Inverter<> *iv = mSys->getInverterByPos(Queue.id); + if(NULL == iv) return; + + if(!CfgGroup->battSwitch && !CfgGroup->battSwitchInit) + { + if(!iv->alarmCnt) return; + bool stb_flag = false; + + for(int16_t i = 0; i < iv->alarmCnt; i++) { + if(iv->lastAlarm[i].code == 124) { + stb_flag = true; + _log.addProperty("alarm1", stb_flag); + _log.addProperty("start", iv->lastAlarm[i].start ); + _log.addProperty("end", iv->lastAlarm[i].end ); + + if (iv->lastAlarm[i].end > iv->lastAlarm[i].start) { + stb_flag = false; + _log.addProperty("alarm2", stb_flag); + } + sendLog(); + clearLog(); + } + } + if(!stb_flag) CfgGroup->battSwitch = true; + CfgGroup->battSwitchInit = true; + } _log.addProperty("g", group); _log.addProperty("i", inv); @@ -115,7 +140,7 @@ class ZeroExport { return; } - + // Wird nur zum debuggen benötigt? uint16_t groupPower = 0; uint16_t groupLimit = 0; for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { @@ -125,6 +150,8 @@ class ZeroExport { _log.addProperty("gP", groupPower); _log.addProperty("gL", groupLimit); + // Wird nur zum debuggen benötigt? + // Batteryprotection _log.addProperty("bEn", (uint8_t)CfgGroup->battCfg); @@ -145,10 +172,10 @@ class ZeroExport { CfgGroup->battSwitch = true; _log.addProperty("bA", "turn on"); } - if ((CfgGroup->battValue > CfgGroup->battLimitOff) && (CfgGroupInv->power > 0)) { - CfgGroup->battSwitch = true; - _log.addProperty("bA", "turn on"); - } + //if ((CfgGroup->battValue > CfgGroup->battLimitOff) && (CfgGroupInv->power > 0)) { + // CfgGroup->battSwitch = true; + // _log.addProperty("bA", "turn on"); + //} } else { if (CfgGroup->battValue < CfgGroup->battLimitOff) { CfgGroup->battSwitch = false; diff --git a/src/utils/DynamicJsonHandler.h b/src/utils/DynamicJsonHandler.h index 4c7a7476..74a39e7d 100644 --- a/src/utils/DynamicJsonHandler.h +++ b/src/utils/DynamicJsonHandler.h @@ -1,6 +1,13 @@ //----------------------------------------------------------------------------- -// 2022 Ahoy, https://github.com/lumpapu/ahoy +// 2024 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ +// +// The DynamicJsonHandler class is a helper class designed to facilitate the handling of JSON documents on embedded systems such as the ESP32. +// It uses the ArduinoJson library to dynamically manage JSON data and provides functionality for adding properties, +// serializing the document, and managing storage. +// +// Written from tictrick & DanielR92 +// //----------------------------------------------------------------------------- #ifndef __DYNAMICJSONHANDLER_H__ @@ -9,6 +16,7 @@ #include #include #include +#include "config/settings.h" // needed for MAX_ALLOWED_BUF_SIZE class DynamicJsonHandler { public: @@ -24,8 +32,8 @@ public: private: DynamicJsonDocument doc; - static const size_t min_size = 256; - static const size_t max_size = 5000; // Max RAM : 2 = da es für resizeDocument eng werden könnte? + const size_t min_size = 256; + const size_t max_size = MAX_ALLOWED_BUF_SIZE / 2; // Max RAM : 2 = da es für resizeDocument eng werden könnte? void resizeDocument(size_t requiredSize); size_t min(size_t a, size_t b); diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 858e757d..37749779 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -866,7 +866,7 @@ class RestApi { // Advanced objGroup[F("setPoint")] = (int16_t)mConfig->plugin.zeroExport.groups[group].setPoint; objGroup[F("minimum")] = (bool)mConfig->plugin.zeroExport.groups[group].minimum; - objGroup[F("power")] = (int32_t)mConfig->plugin.zeroExport.groups[group].power; + objGroup[F("power")] = (float)mConfig->plugin.zeroExport.groups[group].power; objGroup[F("powerTolerance")] = (uint8_t)mConfig->plugin.zeroExport.groups[group].powerTolerance; objGroup[F("powerMax")] = (uint16_t)mConfig->plugin.zeroExport.groups[group].powerMax; objGroup[F("Kp")] = (uint8_t)mConfig->plugin.zeroExport.groups[group].Kp; @@ -1146,8 +1146,8 @@ class RestApi { // Plugin ZeroExport #if defined(PLUGIN_ZEROEXPORT) else if(F("ze_batt_onff") == jsonIn[F("cmd")]) { - uint8_t group = jsonIn[F("id")]; - mConfig->plugin.zeroExport.groups[group].battSwitch = (bool)jsonIn[F("battSwitch")]; + uint8_t group = (uint8_t)jsonIn[F("id")]; + mConfig->plugin.zeroExport.groups[group].battSwitch = (bool)jsonIn[F("val")]; } else if(F("ze_save_group") == jsonIn[F("cmd")]) { // General diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 0dc4b521..2d625d4f 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -1290,29 +1290,21 @@ /*IF_PLUGIN_ZEROEXPORT*/ function apiCbBattOnOff(obj) { -// var e = document.getElementById("battSwitch"); -// e.value = "88"; -// selDelAllOpt(e); -// if(obj["success"]) -// e.appendChild(opt("-1", "{#NETWORK_SCANNING}")) -// else -// e.appendChild(opt("-1", "{#ERROR} " + obj["error"])); + var e = document.getElementById("battSwitch"); + if(obj["success"]) { + // dann über ajax denn gesetzten wert zurück aus dem system holen + modalClose(); + getAjax("/api/setup", parse); + } + else + e.innerHTML = "{#ERROR}" + obj["error"]; + } function battOnOff() { - // TODO: zuerst wert setzen - // dann über ajax denn gesetzten wert zurück aus dem system holen - // damit man sieht das es erfolgreich gesetzt worden ist. const sw = document.getElementById("battSwitch"); - if (sw.value == 0) { - sw.value = 1; - sw.innerHTML = "{#BTN_ON}"; - } else { - sw.value = 0; - sw.innerHTML = "{#BTN_OFF}"; - } - - var obj = {cmd: "ze_batt_onff", token: "*"} + if(sw == null) return; + var obj = {cmd: "ze_batt_onff", token: "*", id: parseInt(sw.dataset.group), val: (sw.dataset.status === "true") ? false : true} getAjax("/api/setup", apiCbBattOnOff, "POST", JSON.stringify(obj)); } @@ -1442,7 +1434,7 @@ divRow("{#ZE_GROUP_TAB_BATTERY_TOPIC}", ml("input", {name: "battTopic", class: "text", type: "text", value: obj.battTopic}, null),), divRow("{#ZE_GROUP_TAB_BATTERY_LIMITON}", ml("input", {name: "battLimitOn", class: "text", type: "number", min: "0", max: "100", step: "0.1", value: obj.battLimitOn}, null),), divRow("{#ZE_GROUP_TAB_BATTERY_LIMITOFF}", ml("input", {name: "battLimitOff", class: "text", type: "number", min: "0", max: "100", step: "0.1", value: obj.battLimitOff}, null),), - divRow("{#ZE_GROUP_TAB_BATTERY_ONOFF}", ml("input", {name: "battSwitch", id: "battSwitch", class: "btn", type: "button", value: obj.battSwitch}, null)), + divRow("{#ZE_GROUP_TAB_BATTERY_ONOFF}", ml("input", {name: "battSwitch", id: "battSwitch", "data-group": String(obj.id), "data-status": String(obj.battSwitch), class: "btn", type: "button", value: (obj.battSwitch ? "{#BTN_ON}" : "{#BTN_OFF}")}, null)), // TODO: Uebersetzen mit lang.json und auf die entsprechende Dokuseite verlinken divRow("Hinweis: ", ml("a", {href: "https://docs.ahoydtu.de/de/latest/zeroExport.html"}, "Bitte beachten Sie die Ausfüllhinweise in der Dokumentation."),), // TODO: Hinweis Github/Discord - Entfernen wenn erledigt