Browse Source

Hichi Update

pull/1155/head
DanielR92 2 years ago
parent
commit
1aef8963cb
  1. 5
      src/config/settings.h
  2. 2
      src/defines.h
  3. 40
      src/plugins/zeroExport/zeroExport.h
  4. 1
      src/web/RestApi.h
  5. 5
      src/web/html/setup.html
  6. 7
      src/web/web.h

5
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<bool>(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<uint8_t>(obj, F("Iv"), &mCfg.plugin.zexport.Iv);
getVal<uint8_t>(obj, F("count_avg"), &mCfg.plugin.zexport.count_avg);

2
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

40
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;
}

1
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;

5
src/web/html/setup.html

@ -335,6 +335,9 @@
<div class="col-8 col-sm-3">2% protection: </div>
<div class="col-4 col-sm-9"><input type="checkbox" name="two_percent"/></div>
<br>
<div class="col-12 col-sm-3 my-2">HICHI PowerName:</div>
<div class="col-12 col-sm-9"><input type="text" name="HICHI_PowerName" maxlength="64">(E.g. [StatusSNS][Home][Power])</div>
<br>
<div class="col-12 col-sm-3 my-2">Refresh rate (sec.)<input type="number" name="count_avg" min="0" max="255"></div>
<div class="col-12 col-sm-3 my-2">Power tolerances (Watt)<input type="number" name="power_avg" min="0" max="255"></div>
</div>
@ -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]];

7
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

Loading…
Cancel
Save