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 */ /* Zero Export section */
#if defined(ESP32) #if defined(ESP32)
typedef struct { typedef struct {
char monitor_ip[ZEXPORT_ADDR_LEN]; char monitor_url[ZEXPORT_ADDR_LEN];
uint8_t device; // save the monitor device (1 - Shelly; 2 - Hichi;) char json_path[ZEXPORT_ADDR_LEN];
uint8_t Iv; // saves the inverter that is used for regulation uint8_t Iv; // saves the inverter that is used for regulation
bool enabled; bool enabled;
float power_avg; float power_avg;
uint8_t count_avg; uint8_t count_avg;
double total_power; double total_power;
char HICHI_PowerName[HICHI_NAME_ADDR_LEN];
unsigned long lastTime; // tic toc unsigned long lastTime; // tic toc
bool two_percent; // ask if not go lower then 2% bool two_percent; // ask if not go lower then 2%
@ -456,14 +455,13 @@ class settings {
// Zero-Export // Zero-Export
#if defined(ESP32) #if defined(ESP32)
snprintf(mCfg.plugin.zexport.monitor_ip, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT); snprintf(mCfg.plugin.zexport.monitor_url, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT);
snprintf(mCfg.plugin.zexport.HICHI_PowerName, HICHI_NAME_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.enabled = false;
mCfg.plugin.zexport.count_avg = 10; mCfg.plugin.zexport.count_avg = 10;
mCfg.plugin.zexport.lastTime = millis(); // do not change! mCfg.plugin.zexport.lastTime = millis(); // do not change!
mCfg.plugin.zexport.power_avg = 10; mCfg.plugin.zexport.power_avg = 10;
mCfg.plugin.zexport.device = 0;
mCfg.plugin.zexport.Iv = 0; mCfg.plugin.zexport.Iv = 0;
mCfg.plugin.zexport.two_percent = true; mCfg.plugin.zexport.two_percent = true;
#endif #endif
@ -663,8 +661,8 @@ class settings {
void jsonzeroExport(JsonObject obj, bool set = false) { void jsonzeroExport(JsonObject obj, bool set = false) {
if(set) { if(set) {
obj[F("en_zeroexport")] = (bool) mCfg.plugin.zexport.enabled; obj[F("en_zeroexport")] = (bool) mCfg.plugin.zexport.enabled;
obj[F("monitor_ipAddr")] = mCfg.plugin.zexport.monitor_ip; obj[F("monitor_url")] = mCfg.plugin.zexport.monitor_url;
obj[F("HICHI_PowerName")] = mCfg.plugin.zexport.HICHI_PowerName; obj[F("json_path")] = mCfg.plugin.zexport.json_path;
obj[F("Iv")] = mCfg.plugin.zexport.Iv; obj[F("Iv")] = mCfg.plugin.zexport.Iv;
obj[F("power_avg")] = mCfg.plugin.zexport.power_avg; obj[F("power_avg")] = mCfg.plugin.zexport.power_avg;
obj[F("count_avg")] = mCfg.plugin.zexport.count_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("en_zeroexport"), &mCfg.plugin.zexport.enabled);
getVal<bool>(obj, F("two_percent"), &mCfg.plugin.zexport.two_percent); 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("monitor_url"), mCfg.plugin.zexport.monitor_url, ZEXPORT_ADDR_LEN);
getChar(obj, F("HICHI_PowerName"), mCfg.plugin.zexport.HICHI_PowerName, HICHI_NAME_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("Iv"), &mCfg.plugin.zexport.Iv);
getVal<uint8_t>(obj, F("count_avg"), &mCfg.plugin.zexport.count_avg); 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 DEVNAME_LEN 16
#define NTP_ADDR_LEN 32 // DNS Name #define NTP_ADDR_LEN 32 // DNS Name
#define ZEXPORT_ADDR_LEN 64 // Zero-Export Address #define ZEXPORT_ADDR_LEN 100 // Zero-Export Address
#define HICHI_NAME_ADDR_LEN 64 // HICHI-Name Address
#define MQTT_ADDR_LEN 64 // DNS Name #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 #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 { class ZeroExport {
public: public:
ZeroExport() { } ZeroExport() { }
float mililine;
void setup(cfgzeroExport_t *cfg, HMSYSTEM *sys, settings_t *config) { void setup(cfgzeroExport_t *cfg, HMSYSTEM *sys, settings_t *config) {
mCfg = cfg; mCfg = cfg;
@ -24,7 +23,6 @@ class ZeroExport {
//DPRINTLN(DBG_INFO, (F("tickerSecond()"))); //DPRINTLN(DBG_INFO, (F("tickerSecond()")));
if (millis() - mCfg->lastTime < mCfg->count_avg * 1000UL) { if (millis() - mCfg->lastTime < mCfg->count_avg * 1000UL) {
zero(); // just refresh when it is needed. To get cpu load low. zero(); // just refresh when it is needed. To get cpu load low.
//DPRINTLN(DBG_INFO, (F("zero()")));
} }
} }
@ -47,104 +45,63 @@ class ZeroExport {
} }
private: private:
HTTPClient http; HTTPClient httpClient;
// TODO: Need to improve here. 2048 for a JSON Obj is to big!? // TODO: Need to improve here. 2048 for a JSON Obj is to big!?
void zero() { bool 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()
{ {
http.begin(String(mCfg->monitor_ip), 80, "/status"); if (!httpClient.begin(mCfg->monitor_url)) {
DPRINTLN(DBG_INFO, "httpClient.begin failed");
int httpResponseCode = http.GET(); httpClient.end();
if (httpResponseCode > 0 && httpResponseCode < 400) return false;
{
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));
} }
return 2;
}
int Hichi() httpClient.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
{ httpClient.setUserAgent("Ahoy-Agent");
http.begin(String(mCfg->monitor_ip), 80, "/cm?cmnd=status%208"); httpClient.setConnectTimeout(1000);
String hName = String(mCfg->HICHI_PowerName); httpClient.setTimeout(1000);
httpClient.addHeader("Content-Type", "application/json");
httpClient.addHeader("Accept", "application/json");
int httpResponseCode = http.GET(); int httpCode = httpClient.GET();
if (httpResponseCode > 0 && httpResponseCode < 400) if (httpCode == HTTP_CODE_OK)
{ {
String responseBody = httpClient.getString();
DynamicJsonDocument json(2048); DynamicJsonDocument json(2048);
DeserializationError err = deserializeJson(json, http.getString()); DeserializationError err = deserializeJson(json, responseBody);
// Parse succeeded? // Parse succeeded?
if (err) { if (err) {
DPRINT(DBG_INFO, (F("Hichi() returned: "))); DPRINTLN(DBG_INFO, (F("ZeroExport() JSON error returned: ")));
DPRINTLN(DBG_INFO, String(err.f_str())); DPRINTLN(DBG_INFO, String(err.f_str()));
return 0;
} }
int count = 0; // check if it HICHI
for (uint8_t i = 0; i < strlen(hName.c_str()); i++) if(json.containsKey(F("StatusSNS")) ) {
if (hName[i] == ']') count++; int index = responseBody.indexOf(String(mCfg->json_path)); // find first match position
responseBody = responseBody.substring(index); // cut it and store it in value
for (uint8_t i = 0; i < count; i++) index = responseBody.indexOf(","); // find the first seperation - Bingo!?
{
uint8_t l_index = hName.indexOf(']') - 1; mCfg->total_power = responseBody.substring(0, index - 1).toDouble();
json = json[hName.substring(1, l_index)]; } else if(json.containsKey(F("emeters"))) {
mCfg->total_power = (double)json[F("total_power")];
} else {
String output; DPRINTLN(DBG_INFO, (F("ZeroExport() json error: cant find value in this query: ") + responseBody));
serializeJson(json, output); return false;
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) else
{ {
DPRINTLN(DBG_INFO, "HICHI(): Error " + String(httpResponseCode)); DPRINTLN(DBG_INFO, F("ZeroExport(): Error ") + String(httpCode));
return false;
} }
return true;
return 0;
} }
// private member variables // private member variables
const char *mVersion;
cfgzeroExport_t *mCfg; cfgzeroExport_t *mCfg;
settings_t *mConfig; settings_t *mConfig;
HMSYSTEM *mSys; HMSYSTEM *mSys;
uint16_t mRefreshCycle;
}; };
#endif /*__ZEROEXPORT__*/ #endif /*__ZEROEXPORT__*/

4
src/web/RestApi.h

@ -485,8 +485,8 @@ class RestApi {
void getzeroExport(JsonObject obj) { void getzeroExport(JsonObject obj) {
obj[F("en_zeroexport")] = (bool) mConfig->plugin.zexport.enabled; obj[F("en_zeroexport")] = (bool) mConfig->plugin.zexport.enabled;
obj[F("two_percent")] = (bool) mConfig->plugin.zexport.two_percent; obj[F("two_percent")] = (bool) mConfig->plugin.zexport.two_percent;
obj[F("monitor_ipAddr")] = String(mConfig->plugin.zexport.monitor_ip); obj[F("monitor_url")] = String(mConfig->plugin.zexport.monitor_url);
obj[F("HICHI_PowerName")] = String(mConfig->plugin.zexport.HICHI_PowerName); obj[F("json_path")] = String(mConfig->plugin.zexport.json_path);
obj[F("count_avg")] = (uint8_t)mConfig->plugin.zexport.count_avg; obj[F("count_avg")] = (uint8_t)mConfig->plugin.zexport.count_avg;
obj[F("Iv")] = (uint8_t)mConfig->plugin.zexport.Iv; obj[F("Iv")] = (uint8_t)mConfig->plugin.zexport.Iv;
obj[F("power_avg")] = (float)mConfig->plugin.zexport.power_avg; 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="row mb-3">
<div class="col-12 col-sm-3 my-2">Monitor IP: </div> <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-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-8 col-sm-3">2% protection: </div>
<div class="col-4 col-sm-9"><input type="checkbox" name="two_percent"/></div> <div class="col-4 col-sm-9"><input type="checkbox" name="two_percent"/></div>
<br> <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">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 class="col-12 col-sm-3 my-2">Power tolerances (Watt)<input type="number" name="power_avg" min="0" max="255"></div>
</div> </div>
@ -969,7 +973,7 @@
getAjax("/api/inverter/list", parseZeroIv); 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]]) if(null != obj[i[1]])
document.getElementsByName(i[0])[0].value = 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.power_avg = request->arg("power_avg").toFloat();
mConfig->plugin.zexport.total_power = request->arg("total_power").toDouble(); mConfig->plugin.zexport.total_power = request->arg("total_power").toDouble();
if (request->arg("monitor_ipAddr") != "") { if (request->arg("monitor_url") != "") {
String addr = request->arg("monitor_ipAddr"); String addr = request->arg("monitor_url");
addr.trim(); addr.trim();
addr.toCharArray(mConfig->plugin.zexport.monitor_ip, ZEXPORT_ADDR_LEN); addr.toCharArray(mConfig->plugin.zexport.monitor_url, ZEXPORT_ADDR_LEN);
} else } else
mConfig->plugin.zexport.monitor_ip[0] = '\0'; mConfig->plugin.zexport.monitor_url[0] = '\0';
if (request->arg("json_path") != "") {
if (request->arg("HICHI_PowerName") != "") { String addr = request->arg("json_path");
String addr = request->arg("HICHI_PowerName");
addr.trim(); addr.trim();
addr.toCharArray(mConfig->plugin.zexport.HICHI_PowerName, ZEXPORT_ADDR_LEN); addr.toCharArray(mConfig->plugin.zexport.json_path, ZEXPORT_ADDR_LEN);
} else } else
mConfig->plugin.zexport.HICHI_PowerName[0] = '\0'; mConfig->plugin.zexport.json_path[0] = '\0';
#endif #endif
// serial console // serial console

Loading…
Cancel
Save