Browse Source

change whole plugin

pull/1155/head
DanielR92 2 years ago
parent
commit
3d3897a2c7
  1. 18
      src/config/settings.h
  2. 4
      src/defines.h
  3. 109
      src/plugins/zeroExport/zeroExport.h
  4. 4
      src/web/RestApi.h
  5. 16
      src/web/html/setup.html
  6. 17
      src/web/web.h

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

4
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

109
src/plugins/zeroExport/zeroExport.h

@ -12,7 +12,6 @@ template <class HMSYSTEM>
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__*/

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

16
src/web/html/setup.html

@ -329,15 +329,19 @@
<div class="row mb-3">
<div class="col-12 col-sm-3 my-2">Monitor IP: </div>
<div class="col-12 col-sm-9"><input type="text" name="monitor_ipAddr" maxlength="15"></div>
<div class="col-12 col-sm-9"><input type="text" name="monitor_url" maxlength="100">A JSON-Format is required to work properly.<br>
HICHI: http://IP_Address/cm?cmnd=status%208<br>
Shelly: http://IP_Address/status</div>
<div class="col-12 col-sm-3 my-2">Prio Inverter</div>
<div class="col-12 col-sm-9"><select name="iv" id="Inv_ID"></select></div>
<div class="col-12 col-sm-9"><select name="iv" id="Inv_ID"></select>Which Inverter should be regulated.</div>
<div class="col-12 col-sm-3 my-2">JSON Path: </div>
<div class="col-12 col-sm-9"><input type="text" name="json_path" maxlength="100">Only for HICHI needed!</div>
<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>
@ -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]];

17
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

Loading…
Cancel
Save