diff --git a/src/config/settings.h b/src/config/settings.h index b4f450d8..7acb446a 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -146,7 +146,7 @@ typedef struct { 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% @@ -457,6 +457,7 @@ 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); mCfg.plugin.zexport.enabled = false; mCfg.plugin.zexport.count_avg = 10; mCfg.plugin.zexport.lastTime = millis(); // do not change! @@ -663,6 +664,7 @@ class settings { 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("Iv")] = mCfg.plugin.zexport.Iv; obj[F("power_avg")] = mCfg.plugin.zexport.power_avg; obj[F("count_avg")] = mCfg.plugin.zexport.count_avg; @@ -675,6 +677,7 @@ class settings { 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); 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 37b49efc..7b525810 100644 --- a/src/defines.h +++ b/src/defines.h @@ -86,6 +86,8 @@ enum {MQTT_STATUS_OFFLINE = 0, MQTT_STATUS_PARTIAL, MQTT_STATUS_ONLINE}; #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 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 75411a7b..ed3ad173 100644 --- a/src/plugins/zeroExport/zeroExport.h +++ b/src/plugins/zeroExport/zeroExport.h @@ -54,8 +54,8 @@ class ZeroExport { switch (mCfg->device) { case 0: case 1: - mCfg->device = Shelly(); - break; + //mCfg->device = Shelly(); + //break; case 2: mCfg->device = Hichi(); break; @@ -70,7 +70,7 @@ class ZeroExport { http.begin(String(mCfg->monitor_ip), 80, "/status"); int httpResponseCode = http.GET(); - if (httpResponseCode > 0) + if (httpResponseCode > 0 && httpResponseCode < 400) { DynamicJsonDocument json(2048); DeserializationError err = deserializeJson(json, http.getString()); @@ -85,28 +85,56 @@ class ZeroExport { mCfg->total_power = (double)json[F("total_power")]; return 1; } + if (httpResponseCode >= 400) + { + DPRINTLN(DBG_INFO, "Shelly(): Error " + String(httpResponseCode)); + } return 2; } int Hichi() { http.begin(String(mCfg->monitor_ip), 80, "/cm?cmnd=status%208"); + String hName = String(mCfg->HICHI_PowerName); + int httpResponseCode = http.GET(); - if (httpResponseCode > 0) + if (httpResponseCode > 0 && httpResponseCode < 400) { DynamicJsonDocument json(2048); DeserializationError err = deserializeJson(json, http.getString()); // Parse succeeded? if (err) { - DPRINTLN(DBG_INFO, (F("Hichi() returned: "))); + DPRINT(DBG_INFO, (F("Hichi() returned: "))); DPRINTLN(DBG_INFO, String(err.f_str())); return 0; } - mCfg->total_power = (double)json["StatusSNS"]["ENERGY"]["Power"]; + 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); + } + + DPRINTLN(DBG_INFO, String(json[0])); + mCfg->total_power = (double)json[0]; return 2; } + if (httpResponseCode >= 400) + { + DPRINTLN(DBG_INFO, "HICHI(): Error " + String(httpResponseCode)); + } + return 0; } diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 80a6d7c6..7cd4405e 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -486,6 +486,7 @@ class RestApi { 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("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 f41503e0..6b45da16 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -335,6 +335,9 @@
2% protection:

+
HICHI PowerName:
+
(E.g. [StatusSNS][Home][Power])
+
Refresh rate (sec.)
Power tolerances (Watt)
@@ -966,7 +969,7 @@ getAjax("/api/inverter/list", parseZeroIv); - for(var i of [["monitor_ipAddr", "monitor_ipAddr"], ["power_avg", "power_avg"], ["count_avg", "count_avg"]]) + for(var i of [["monitor_ipAddr", "monitor_ipAddr"], ["power_avg", "power_avg"], ["count_avg", "count_avg"], ["HICHI_PowerName", "HICHI_PowerName"]]) 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 713ce9e6..6f8e2e2f 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -616,6 +616,13 @@ class Web { addr.toCharArray(mConfig->plugin.zexport.monitor_ip, ZEXPORT_ADDR_LEN); } else mConfig->plugin.zexport.monitor_ip[0] = '\0'; + + if (request->arg("HICHI_PowerName") != "") { + String addr = request->arg("HICHI_PowerName"); + addr.trim(); + addr.toCharArray(mConfig->plugin.zexport.HICHI_PowerName, ZEXPORT_ADDR_LEN); + } else + mConfig->plugin.zexport.HICHI_PowerName[0] = '\0'; #endif // serial console