From 3d3897a2c7ff56cb2c8369c31eb761db4785139b Mon Sep 17 00:00:00 2001 From: DanielR92 Date: Thu, 28 Sep 2023 20:08:06 +0200 Subject: [PATCH] change whole plugin --- src/config/settings.h | 18 ++--- src/defines.h | 4 +- src/plugins/zeroExport/zeroExport.h | 109 +++++++++------------------- src/web/RestApi.h | 4 +- src/web/html/setup.html | 16 ++-- src/web/web.h | 17 ++--- 6 files changed, 62 insertions(+), 106 deletions(-) diff --git a/src/config/settings.h b/src/config/settings.h index 7acb446a..1cf29722 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -139,14 +139,13 @@ typedef struct { /* Zero Export section */ #if defined(ESP32) typedef struct { - char monitor_ip[ZEXPORT_ADDR_LEN]; - uint8_t device; // save the monitor device (1 - Shelly; 2 - Hichi;) + char monitor_url[ZEXPORT_ADDR_LEN]; + char json_path[ZEXPORT_ADDR_LEN]; uint8_t Iv; // saves the inverter that is used for regulation bool enabled; float power_avg; uint8_t count_avg; double total_power; - char HICHI_PowerName[HICHI_NAME_ADDR_LEN]; unsigned long lastTime; // tic toc bool two_percent; // ask if not go lower then 2% @@ -456,14 +455,13 @@ class settings { // Zero-Export #if defined(ESP32) - snprintf(mCfg.plugin.zexport.monitor_ip, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT); - snprintf(mCfg.plugin.zexport.HICHI_PowerName, HICHI_NAME_ADDR_LEN, "%s", DEF_ZEXPORT); + snprintf(mCfg.plugin.zexport.monitor_url, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT); + snprintf(mCfg.plugin.zexport.json_path, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT); mCfg.plugin.zexport.enabled = false; mCfg.plugin.zexport.count_avg = 10; mCfg.plugin.zexport.lastTime = millis(); // do not change! mCfg.plugin.zexport.power_avg = 10; - mCfg.plugin.zexport.device = 0; mCfg.plugin.zexport.Iv = 0; mCfg.plugin.zexport.two_percent = true; #endif @@ -663,8 +661,8 @@ class settings { void jsonzeroExport(JsonObject obj, bool set = false) { if(set) { obj[F("en_zeroexport")] = (bool) mCfg.plugin.zexport.enabled; - obj[F("monitor_ipAddr")] = mCfg.plugin.zexport.monitor_ip; - obj[F("HICHI_PowerName")] = mCfg.plugin.zexport.HICHI_PowerName; + obj[F("monitor_url")] = mCfg.plugin.zexport.monitor_url; + obj[F("json_path")] = mCfg.plugin.zexport.json_path; obj[F("Iv")] = mCfg.plugin.zexport.Iv; obj[F("power_avg")] = mCfg.plugin.zexport.power_avg; obj[F("count_avg")] = mCfg.plugin.zexport.count_avg; @@ -676,8 +674,8 @@ class settings { getVal(obj, F("en_zeroexport"), &mCfg.plugin.zexport.enabled); getVal(obj, F("two_percent"), &mCfg.plugin.zexport.two_percent); - getChar(obj, F("monitor_ipAddr"), mCfg.plugin.zexport.monitor_ip, ZEXPORT_ADDR_LEN); - getChar(obj, F("HICHI_PowerName"), mCfg.plugin.zexport.HICHI_PowerName, HICHI_NAME_ADDR_LEN); + getChar(obj, F("monitor_url"), mCfg.plugin.zexport.monitor_url, ZEXPORT_ADDR_LEN); + getChar(obj, F("json_path"), mCfg.plugin.zexport.json_path, ZEXPORT_ADDR_LEN); getVal(obj, F("Iv"), &mCfg.plugin.zexport.Iv); getVal(obj, F("count_avg"), &mCfg.plugin.zexport.count_avg); diff --git a/src/defines.h b/src/defines.h index 7b525810..d9da5fc0 100644 --- a/src/defines.h +++ b/src/defines.h @@ -85,9 +85,7 @@ enum {MQTT_STATUS_OFFLINE = 0, MQTT_STATUS_PARTIAL, MQTT_STATUS_ONLINE}; #define DEVNAME_LEN 16 #define NTP_ADDR_LEN 32 // DNS Name -#define ZEXPORT_ADDR_LEN 64 // Zero-Export Address -#define HICHI_NAME_ADDR_LEN 64 // HICHI-Name Address - +#define ZEXPORT_ADDR_LEN 100 // Zero-Export Address #define MQTT_ADDR_LEN 64 // DNS Name #define MQTT_CLIENTID_LEN 22 // number of chars is limited to 23 up to v3.1 of MQTT diff --git a/src/plugins/zeroExport/zeroExport.h b/src/plugins/zeroExport/zeroExport.h index 9885c9df..3e9bdf50 100644 --- a/src/plugins/zeroExport/zeroExport.h +++ b/src/plugins/zeroExport/zeroExport.h @@ -12,7 +12,6 @@ template class ZeroExport { public: ZeroExport() { } - float mililine; void setup(cfgzeroExport_t *cfg, HMSYSTEM *sys, settings_t *config) { mCfg = cfg; @@ -24,7 +23,6 @@ class ZeroExport { //DPRINTLN(DBG_INFO, (F("tickerSecond()"))); if (millis() - mCfg->lastTime < mCfg->count_avg * 1000UL) { zero(); // just refresh when it is needed. To get cpu load low. - //DPRINTLN(DBG_INFO, (F("zero()"))); } } @@ -47,104 +45,63 @@ class ZeroExport { } private: - HTTPClient http; + HTTPClient httpClient; // TODO: Need to improve here. 2048 for a JSON Obj is to big!? - void zero() { - switch (mCfg->device) { - case 0: - case 1: - mCfg->device = Shelly(); - break; - case 2: - mCfg->device = Hichi(); - break; - default: - // Statement(s) - break; // Wird nicht benötigt, wenn Statement(s) vorhanden sind - } - } - - int Shelly() + bool zero() { - http.begin(String(mCfg->monitor_ip), 80, "/status"); - - int httpResponseCode = http.GET(); - if (httpResponseCode > 0 && httpResponseCode < 400) - { - DynamicJsonDocument json(2048); - DeserializationError err = deserializeJson(json, http.getString()); - - // Parse succeeded? - if (err) { - DPRINTLN(DBG_INFO, (F("Shelly() returned: "))); - DPRINTLN(DBG_INFO, String(err.f_str())); - return 2; - } - - mCfg->total_power = (double)json[F("total_power")]; - return 1; - } - if (httpResponseCode >= 400) - { - DPRINTLN(DBG_INFO, "Shelly(): Error " + String(httpResponseCode)); + if (!httpClient.begin(mCfg->monitor_url)) { + DPRINTLN(DBG_INFO, "httpClient.begin failed"); + httpClient.end(); + return false; } - return 2; - } - int Hichi() - { - http.begin(String(mCfg->monitor_ip), 80, "/cm?cmnd=status%208"); - String hName = String(mCfg->HICHI_PowerName); + httpClient.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); + httpClient.setUserAgent("Ahoy-Agent"); + httpClient.setConnectTimeout(1000); + httpClient.setTimeout(1000); + httpClient.addHeader("Content-Type", "application/json"); + httpClient.addHeader("Accept", "application/json"); - int httpResponseCode = http.GET(); - if (httpResponseCode > 0 && httpResponseCode < 400) + int httpCode = httpClient.GET(); + if (httpCode == HTTP_CODE_OK) { + String responseBody = httpClient.getString(); DynamicJsonDocument json(2048); - DeserializationError err = deserializeJson(json, http.getString()); + DeserializationError err = deserializeJson(json, responseBody); // Parse succeeded? if (err) { - DPRINT(DBG_INFO, (F("Hichi() returned: "))); + DPRINTLN(DBG_INFO, (F("ZeroExport() JSON error returned: "))); DPRINTLN(DBG_INFO, String(err.f_str())); - return 0; } - int count = 0; - for (uint8_t i = 0; i < strlen(hName.c_str()); i++) - if (hName[i] == ']') count++; - - for (uint8_t i = 0; i < count; i++) - { - uint8_t l_index = hName.indexOf(']') - 1; - json = json[hName.substring(1, l_index)]; - - - String output; - serializeJson(json, output); - DPRINTLN(DBG_INFO, output); - hName = hName.substring(l_index); + // check if it HICHI + if(json.containsKey(F("StatusSNS")) ) { + int index = responseBody.indexOf(String(mCfg->json_path)); // find first match position + responseBody = responseBody.substring(index); // cut it and store it in value + index = responseBody.indexOf(","); // find the first seperation - Bingo!? + + mCfg->total_power = responseBody.substring(0, index - 1).toDouble(); + } else if(json.containsKey(F("emeters"))) { + mCfg->total_power = (double)json[F("total_power")]; + } else { + DPRINTLN(DBG_INFO, (F("ZeroExport() json error: cant find value in this query: ") + responseBody)); + return false; } - - DPRINTLN(DBG_INFO, String(json[0])); - mCfg->total_power = (double)json[0]; - return 2; } - if (httpResponseCode >= 400) + else { - DPRINTLN(DBG_INFO, "HICHI(): Error " + String(httpResponseCode)); + DPRINTLN(DBG_INFO, F("ZeroExport(): Error ") + String(httpCode)); + return false; } - - return 0; + return true; } // private member variables - const char *mVersion; cfgzeroExport_t *mCfg; - settings_t *mConfig; HMSYSTEM *mSys; - uint16_t mRefreshCycle; }; #endif /*__ZEROEXPORT__*/ diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 7cd4405e..976762f7 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -485,8 +485,8 @@ class RestApi { void getzeroExport(JsonObject obj) { obj[F("en_zeroexport")] = (bool) mConfig->plugin.zexport.enabled; obj[F("two_percent")] = (bool) mConfig->plugin.zexport.two_percent; - obj[F("monitor_ipAddr")] = String(mConfig->plugin.zexport.monitor_ip); - obj[F("HICHI_PowerName")] = String(mConfig->plugin.zexport.HICHI_PowerName); + obj[F("monitor_url")] = String(mConfig->plugin.zexport.monitor_url); + obj[F("json_path")] = String(mConfig->plugin.zexport.json_path); obj[F("count_avg")] = (uint8_t)mConfig->plugin.zexport.count_avg; obj[F("Iv")] = (uint8_t)mConfig->plugin.zexport.Iv; obj[F("power_avg")] = (float)mConfig->plugin.zexport.power_avg; diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 6b45da16..398a4bfa 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -329,15 +329,19 @@
Monitor IP:
-
+
A JSON-Format is required to work properly.
+ HICHI: http://IP_Address/cm?cmnd=status%208
+ Shelly: http://IP_Address/status
+
Prio Inverter
-
+
Which Inverter should be regulated.
+ +
JSON Path:
+
Only for HICHI needed!
+
2% protection:

-
HICHI PowerName:
-
(E.g. [StatusSNS][Home][Power])
-
Refresh rate (sec.)
Power tolerances (Watt)
@@ -969,7 +973,7 @@ getAjax("/api/inverter/list", parseZeroIv); - for(var i of [["monitor_ipAddr", "monitor_ipAddr"], ["power_avg", "power_avg"], ["count_avg", "count_avg"], ["HICHI_PowerName", "HICHI_PowerName"]]) + for(var i of [["monitor_url", "monitor_url"], ["power_avg", "power_avg"], ["count_avg", "count_avg"], ["json_path", "json_path"]]) if(null != obj[i[1]]) document.getElementsByName(i[0])[0].value = obj[i[1]]; diff --git a/src/web/web.h b/src/web/web.h index 6f8e2e2f..05a14024 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -610,19 +610,18 @@ class Web { mConfig->plugin.zexport.power_avg = request->arg("power_avg").toFloat(); mConfig->plugin.zexport.total_power = request->arg("total_power").toDouble(); - if (request->arg("monitor_ipAddr") != "") { - String addr = request->arg("monitor_ipAddr"); + if (request->arg("monitor_url") != "") { + String addr = request->arg("monitor_url"); addr.trim(); - addr.toCharArray(mConfig->plugin.zexport.monitor_ip, ZEXPORT_ADDR_LEN); + addr.toCharArray(mConfig->plugin.zexport.monitor_url, ZEXPORT_ADDR_LEN); } else - mConfig->plugin.zexport.monitor_ip[0] = '\0'; - - if (request->arg("HICHI_PowerName") != "") { - String addr = request->arg("HICHI_PowerName"); + mConfig->plugin.zexport.monitor_url[0] = '\0'; + if (request->arg("json_path") != "") { + String addr = request->arg("json_path"); addr.trim(); - addr.toCharArray(mConfig->plugin.zexport.HICHI_PowerName, ZEXPORT_ADDR_LEN); + addr.toCharArray(mConfig->plugin.zexport.json_path, ZEXPORT_ADDR_LEN); } else - mConfig->plugin.zexport.HICHI_PowerName[0] = '\0'; + mConfig->plugin.zexport.json_path[0] = '\0'; #endif // serial console