diff --git a/src/app.cpp b/src/app.cpp index d9f0a568..8088d483 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -490,6 +490,7 @@ void app::tickSend(void) { yield(); updateLed(); + zeroexport(); } //----------------------------------------------------------------------------- @@ -609,3 +610,21 @@ void app::updateLed(void) { } } } +//----------------------------------------------------------------------------- +void app::zeroexport() { + if (!mConfig->plugin.zexport.enabled) return; + + DynamicJsonDocument doc(512); + JsonObject object = doc.to(); + + object["path"] = "ctrl"; + object["id"] = 0; + object["val"] = round(mzExport.sum()); + object["cmd"] = "limit_nonpersistent_absolute"; + + /*String data; + serializeJsonPretty(object, data); + DPRINTLN(DBG_INFO, data);*/ + + mApi.ctrlRequest(object); +} \ No newline at end of file diff --git a/src/app.h b/src/app.h index 78a3df57..5712a72b 100644 --- a/src/app.h +++ b/src/app.h @@ -282,6 +282,7 @@ class app : public IApp, public ah::Scheduler { void setupLed(); void updateLed(); + void zeroexport(); void tickReboot(void) { DPRINTLN(DBG_INFO, F("Rebooting...")); diff --git a/src/plugins/zeroExport/zeroExport.h b/src/plugins/zeroExport/zeroExport.h index aab4e60b..8cc38949 100644 --- a/src/plugins/zeroExport/zeroExport.h +++ b/src/plugins/zeroExport/zeroExport.h @@ -30,9 +30,25 @@ class ZeroExport { } } - uint8_t sum(int a, int b, int c) + double sum() { - return a + b + c; + double val = mCfg->PHASE[0].power + mCfg->PHASE[1].power + mCfg->PHASE[2].power; + if (val > 0) { + return val; + } else { + float totalPower = 0; + Inverter<> *iv; + record_t<> *rec; + for (uint8_t i = 0; i < mSys->getNumInverters(); i++) { + iv = mSys->getInverterByPos(i); + rec = iv->getRecordStruct(RealTimeRunData_Debug); + if (iv == NULL) + continue; + totalPower += iv->getChannelFieldValue(CH0, FLD_PAC, rec); + } + + return totalPower - val; + } } private: @@ -43,12 +59,15 @@ class ZeroExport { char msgBuffer[256] = {'\0'}; const String serverIp = "192.168.5.30"; + static char msg[50]; void loop() { } void zero() { sendReq(0); sendReq(1); sendReq(2); + + } // TODO: change int to u_short @@ -72,7 +91,7 @@ class ZeroExport { String raw = getData(); deserializeJson(json, raw); - DPRINTLN(DBG_INFO, raw); + //DPRINTLN(DBG_INFO, raw); mCfg->PHASE[index].power = json[F("power")]; mCfg->PHASE[index].pf = json[F("pf")]; diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 042e6327..eb313c3c 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -60,9 +60,9 @@ class RestApi { } void ctrlRequest(JsonObject obj) { - /*char out[128]; + char out[128]; serializeJson(obj, out, 128); - DPRINTLN(DBG_INFO, "RestApi: " + String(out));*/ + DPRINTLN(DBG_INFO, "RestApi: " + String(out)); DynamicJsonDocument json(128); JsonObject dummy = json.as(); if(obj[F("path")] == "ctrl") diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 3b72e011..e33f4710 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -331,6 +331,9 @@
Shelly EM3 IP:
+

L1: n/a

+

L2: n/a

+

L3: n/a

@@ -925,11 +928,14 @@ } function parsezeroExport(obj) { - for(var i of [["monitor_ipAddr", "monitor_ipAddr"],["phase_1", "phase_1"],["phase_2", "phase_2"],["phase_3", "phase_3"],["sum", "sum"]]) + for(var i of [["monitor_ipAddr", "monitor_ipAddr"]]) if(null != obj[i[1]]) document.getElementsByName(i[0])[0].value = obj[i[1]]; document.getElementsByName("en_zeroexport")[0].checked = obj["en_zeroexport"]; + document.getElementsByName("phase_0")[0].innerHTML = "L1: " + obj["phase_0"]["power"].toFixed(2) + "W"; + document.getElementsByName("phase_1")[0].innerHTML = "L2: " + obj["phase_1"]["power"].toFixed(2) + "W"; + document.getElementsByName("phase_2")[0].innerHTML = "L3: " + obj["phase_2"]["power"].toFixed(2) + "W"; } function parse(root) {