|
|
@ -21,12 +21,12 @@ class ZeroExport { |
|
|
|
} |
|
|
|
|
|
|
|
void payloadEventListener(uint8_t cmd) { |
|
|
|
mNewPayload = true; |
|
|
|
mCfg->rdytoSend = false; |
|
|
|
} |
|
|
|
|
|
|
|
void tickerSecond() { |
|
|
|
if (mNewPayload || ((++mLoopCnt % 10) == 0)) { |
|
|
|
mNewPayload = false; |
|
|
|
if (!mCfg->rdytoSend || ((++mLoopCnt % mCfg->count_avg) == 0)) { |
|
|
|
mCfg->rdytoSend = true; |
|
|
|
mLoopCnt = 0; |
|
|
|
zero(); |
|
|
|
} |
|
|
@ -34,7 +34,7 @@ class ZeroExport { |
|
|
|
|
|
|
|
// Sums up the power values of all phases and returns them.
|
|
|
|
// If the value is negative, all power values from the inverter are taken into account
|
|
|
|
double sum() |
|
|
|
double getPowertoSetnewValue() |
|
|
|
{ |
|
|
|
float ivPower = 0; |
|
|
|
Inverter<> *iv; |
|
|
@ -47,51 +47,59 @@ class ZeroExport { |
|
|
|
ivPower += iv->getChannelFieldValue(CH0, FLD_PAC, rec); |
|
|
|
} |
|
|
|
|
|
|
|
double em3_power = mCfg->PHASE[0].power + mCfg->PHASE[1].power + mCfg->PHASE[2].power; |
|
|
|
return ((unsigned)(em3_power - mCfg->power_avg) >= mCfg->power_avg) ? ivPower + em3_power : ivPower - em3_power; |
|
|
|
return ((unsigned)(mCfg->total_power - mCfg->power_avg) >= mCfg->power_avg) ? ivPower + mCfg->total_power : ivPower - mCfg->total_power; |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
HTTPClient http; |
|
|
|
|
|
|
|
void loop() { } |
|
|
|
|
|
|
|
// TODO: Need to improve here. 2048 for a JSON Obj is to big!?
|
|
|
|
void zero() { |
|
|
|
sendReq(0); |
|
|
|
sendReq(1); |
|
|
|
sendReq(2); |
|
|
|
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
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void sendReq(int index) |
|
|
|
int Shelly() |
|
|
|
{ |
|
|
|
http.begin(String(mCfg->monitor_ip), 80, "/emeter/" + String(index)); |
|
|
|
http.begin(String(mCfg->monitor_ip), 80, "/status"); |
|
|
|
|
|
|
|
int httpResponseCode = http.GET(); |
|
|
|
if (httpResponseCode > 0) |
|
|
|
{ |
|
|
|
DynamicJsonDocument json(128); |
|
|
|
deserializeJson(json, getData()); |
|
|
|
mCfg->PHASE[index].power = (float)json[F("power")]; |
|
|
|
mCfg->PHASE[index].pf = (float)json[F("pf")]; |
|
|
|
mCfg->PHASE[index].current = (float)json[F("current")]; |
|
|
|
mCfg->PHASE[index].voltage = (float)json[F("voltage")]; |
|
|
|
DynamicJsonDocument json(2048); |
|
|
|
DeserializationError err = deserializeJson(json, http.getString()); |
|
|
|
mCfg->total_power = (double)json[F("total_power")]; |
|
|
|
|
|
|
|
// Parse succeeded?
|
|
|
|
if (err) { |
|
|
|
DPRINTLN(DBG_INFO, (F("Shelly() returned: "))); |
|
|
|
DPRINTLN(DBG_INFO, String(err.f_str())); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
return 1; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
DPRINT(DBG_INFO, "Error code: "); |
|
|
|
DPRINTLN(DBG_INFO, String(httpResponseCode)); |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
String getData() |
|
|
|
int Hichi() |
|
|
|
{ |
|
|
|
String payload = http.getString(); |
|
|
|
int x = payload.indexOf("{", 0); |
|
|
|
return payload.substring(x, payload.length()); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
// private member variables
|
|
|
|
bool mNewPayload; |
|
|
|
uint8_t mLoopCnt; |
|
|
|
const char *mVersion; |
|
|
|
cfgzeroExport_t *mCfg; |
|
|
|