Browse Source

Redesign

pull/1551/head
Patrick Amrhein 1 year ago
parent
commit
d15a3dd2d0
  1. 3
      src/config/settings.h
  2. 466
      src/plugins/zeroExport/zeroExport.h
  3. 1
      src/web/RestApi.h

3
src/config/settings.h

@ -203,7 +203,6 @@ typedef struct {
enum class zeroExportState : uint8_t { enum class zeroExportState : uint8_t {
INIT, INIT,
WAIT,
WAITREFRESH, WAITREFRESH,
GETINVERTERACKS, GETINVERTERACKS,
GETINVERTERDATA, GETINVERTERDATA,
@ -301,7 +300,7 @@ typedef struct {
// //
zeroExportState state; zeroExportState state;
zeroExportState stateNext; // zeroExportState stateNext;
unsigned long lastRun; unsigned long lastRun;
unsigned long lastRefresh; unsigned long lastRefresh;
uint16_t sleep; uint16_t sleep;

466
src/plugins/zeroExport/zeroExport.h

@ -57,9 +57,7 @@ class ZeroExport {
* @todo emergency * @todo emergency
*/ */
void loop(void) { void loop(void) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
mPowermeter.loop(); mPowermeter.loop();
@ -67,205 +65,126 @@ class ZeroExport {
bool DoLog = false; bool DoLog = false;
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
if (!mCfg->groups[group].enabled) { zeroExportGroup_t *cfgGroup = &mCfg->groups[group];
continue;
} if (!cfgGroup->enabled) continue;
// sleep // sleep
if (Tsp <= (mCfg->groups[group].lastRun + mCfg->groups[group].sleep)) { if (Tsp <= (cfgGroup->lastRun + cfgGroup->sleep)) continue;
continue; cfgGroup->sleep = 0;
}
mCfg->groups[group].sleep = 0;
mLog["g"] = group; mLog["g"] = group;
mLog["s"] = (uint8_t)mCfg->groups[group].state; mLog["s"] = (uint8_t)cfgGroup->state;
switch (mCfg->groups[group].state) { switch (cfgGroup->state) {
case zeroExportState::INIT: case zeroExportState::INIT:
if (groupInit(group, &Tsp, &DoLog)) { if (groupInit(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::WAITREFRESH;
// OK -> Wait, WaitRefresh cfgGroup->sleep = 60000;
mCfg->groups[group].state = zeroExportState::WAIT;
mCfg->groups[group].stateNext = zeroExportState::WAITREFRESH;
} else { } else {
// Error -> Wait, Init cfgGroup->state = zeroExportState::INIT;
mCfg->groups[group].state = zeroExportState::WAIT; cfgGroup->sleep = 60000;
mCfg->groups[group].stateNext = zeroExportState::INIT; #if defined(ZEROEXPORT_DEV_POWERMETER)
} cfgGroup->state = zeroExportState::WAITREFRESH;
break; cfgGroup->sleep = 10000;
case zeroExportState::WAIT: #endif
if (groupWait(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp;
// OK
if (mCfg->groups[group].state != mCfg->groups[group].stateNext) {
// OK -> Next
mCfg->groups[group].state = mCfg->groups[group].stateNext;
} else {
// OK -> Init
mCfg->groups[group].state = zeroExportState::INIT;
mCfg->groups[group].stateNext = zeroExportState::INIT;
}
} }
break; break;
case zeroExportState::WAITREFRESH: case zeroExportState::WAITREFRESH:
if (groupWaitRefresh(group, &Tsp, &DoLog)) { if (groupWaitRefresh(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::GETINVERTERACKS;
// OK
#if defined(ZEROEXPORT_DEV_POWERMETER) #if defined(ZEROEXPORT_DEV_POWERMETER)
mCfg->groups[group].state = zeroExportState::GETPOWERMETER; cfgGroup->state = zeroExportState::GETPOWERMETER;
mCfg->groups[group].stateNext = zeroExportState::GETPOWERMETER;
#else
mCfg->groups[group].state = zeroExportState::GETINVERTERACKS;
mCfg->groups[group].stateNext = zeroExportState::GETINVERTERACKS;
#endif #endif
} }
break; break;
case zeroExportState::GETINVERTERACKS: case zeroExportState::GETINVERTERACKS:
if (groupGetInverterAcks(group, &Tsp, &DoLog)) { if (groupGetInverterAcks(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::GETINVERTERDATA;
// OK
mCfg->groups[group].state = zeroExportState::GETINVERTERDATA;
mCfg->groups[group].stateNext = zeroExportState::GETINVERTERDATA;
} else { } else {
// Error - Sleep cfgGroup->sleep = 1000;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 1000;
} }
break; break;
case zeroExportState::GETINVERTERDATA: case zeroExportState::GETINVERTERDATA:
if (groupGetInverterData(group, &Tsp, &DoLog)) { if (groupGetInverterData(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::BATTERYPROTECTION;
// OK
mCfg->groups[group].state = zeroExportState::BATTERYPROTECTION;
mCfg->groups[group].stateNext = zeroExportState::BATTERYPROTECTION;
} else { } else {
// Error - Sleep cfgGroup->sleep = 500;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 500;
} }
break; break;
case zeroExportState::BATTERYPROTECTION: case zeroExportState::BATTERYPROTECTION:
if (groupBatteryprotection(group, &Tsp, &DoLog)) { if (groupBatteryprotection(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::GETPOWERMETER;
// OK
mCfg->groups[group].state = zeroExportState::GETPOWERMETER;
mCfg->groups[group].stateNext = zeroExportState::GETPOWERMETER;
} else { } else {
// Error - Sleep cfgGroup->sleep = 1000;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 1000;
} }
break; break;
case zeroExportState::GETPOWERMETER: case zeroExportState::GETPOWERMETER:
if (groupGetPowermeter(group, &Tsp, &DoLog)) { if (groupGetPowermeter(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::CONTROLLER;
// OK
#if defined(ZEROEXPORT_DEV_POWERMETER) #if defined(ZEROEXPORT_DEV_POWERMETER)
mCfg->groups[group].lastRefresh = millis(); cfgGroup->lastRefresh = millis();
mCfg->groups[group].state = zeroExportState::PUBLISH; cfgGroup->state = zeroExportState::PUBLISH;
mCfg->groups[group].stateNext = zeroExportState::PUBLISH;
#else
mCfg->groups[group].state = zeroExportState::CONTROLLER;
mCfg->groups[group].stateNext = zeroExportState::CONTROLLER;
#endif #endif
} else { } else {
// Error - Sleep cfgGroup->sleep = 3000;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 3000;
} }
break; break;
case zeroExportState::CONTROLLER: case zeroExportState::CONTROLLER:
if (groupController(group, &Tsp, &DoLog)) { if (groupController(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->lastRefresh = Tsp;
mCfg->groups[group].lastRefresh = Tsp; cfgGroup->state = zeroExportState::PROGNOSE;
// OK
mCfg->groups[group].state = zeroExportState::PROGNOSE;
mCfg->groups[group].stateNext = zeroExportState::PROGNOSE;
} else { } else {
// Error - WaitRefresh cfgGroup->state = zeroExportState::WAITREFRESH;
mCfg->groups[group].state = zeroExportState::WAITREFRESH;
mCfg->groups[group].stateNext = zeroExportState::WAITREFRESH;
} }
break; break;
case zeroExportState::PROGNOSE: case zeroExportState::PROGNOSE:
if (groupPrognose(group, &Tsp, &DoLog)) { if (groupPrognose(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::AUFTEILEN;
// OK
mCfg->groups[group].state = zeroExportState::AUFTEILEN;
mCfg->groups[group].stateNext = zeroExportState::AUFTEILEN;
} else { } else {
// Error - Sleep cfgGroup->sleep = 500;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 500;
} }
break; break;
case zeroExportState::AUFTEILEN: case zeroExportState::AUFTEILEN:
if (groupAufteilen(group, &Tsp, &DoLog)) { if (groupAufteilen(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::SETREBOOT;
// OK
mCfg->groups[group].state = zeroExportState::SETREBOOT;
mCfg->groups[group].stateNext = zeroExportState::SETREBOOT;
} else { } else {
// Error - Sleep cfgGroup->sleep = 500;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 500;
} }
break; break;
case zeroExportState::SETREBOOT: case zeroExportState::SETREBOOT:
if (groupSetReboot(group, &Tsp, &DoLog)) { if (groupSetReboot(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::SETPOWER;
mCfg->groups[group].lastRefresh = Tsp;
// OK
mCfg->groups[group].state = zeroExportState::SETPOWER;
mCfg->groups[group].stateNext = zeroExportState::SETPOWER;
} else { } else {
// Error - Sleep cfgGroup->sleep = 1000;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 1000;
} }
break; break;
case zeroExportState::SETPOWER: case zeroExportState::SETPOWER:
if (groupSetPower(group, &Tsp, &DoLog)) { if (groupSetPower(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->lastRefresh = Tsp;
mCfg->groups[group].lastRefresh = Tsp; cfgGroup->state = zeroExportState::SETLIMIT;
// OK
mCfg->groups[group].state = zeroExportState::SETLIMIT;
mCfg->groups[group].stateNext = zeroExportState::SETLIMIT;
} else { } else {
// Error - Sleep cfgGroup->sleep = 1000;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 1000;
} }
break; break;
case zeroExportState::SETLIMIT: case zeroExportState::SETLIMIT:
if (groupSetLimit(group, &Tsp, &DoLog)) { if (groupSetLimit(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::PUBLISH;
// OK
mCfg->groups[group].state = zeroExportState::PUBLISH;
mCfg->groups[group].stateNext = zeroExportState::PUBLISH;
} else { } else {
// Error - Sleep cfgGroup->sleep = 1000;
mCfg->groups[group].lastRun = Tsp;
mCfg->groups[group].sleep = 1000;
} }
break; break;
case zeroExportState::PUBLISH: case zeroExportState::PUBLISH:
if (groupPublish(group, &Tsp, &DoLog)) { if (groupPublish(group, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->state = zeroExportState::WAITREFRESH;
// OK
mCfg->groups[group].state = zeroExportState::WAITREFRESH;
mCfg->groups[group].stateNext = zeroExportState::WAITREFRESH;
//} else { //} else {
// TODO: fehlt // TODO: fehlt
} }
break; break;
case zeroExportState::EMERGENCY: case zeroExportState::EMERGENCY:
if (groupEmergency(group, &Tsp, &DoLog)) { if (groupEmergency(cfgGroup, &Tsp, &DoLog)) {
mCfg->groups[group].lastRun = Tsp; cfgGroup->lastRefresh = Tsp;
mCfg->groups[group].lastRefresh = Tsp; cfgGroup->state = zeroExportState::INIT;
// OK
mCfg->groups[group].state = zeroExportState::INIT;
mCfg->groups[group].stateNext = zeroExportState::INIT;
//} else { //} else {
// TODO: fehlt // TODO: fehlt
} }
@ -273,11 +192,10 @@ class ZeroExport {
case zeroExportState::FINISH: case zeroExportState::FINISH:
case zeroExportState::ERROR: case zeroExportState::ERROR:
default: default:
mCfg->groups[group].lastRun = Tsp; cfgGroup->lastRun = Tsp;
mCfg->groups[group].lastRefresh = Tsp; cfgGroup->lastRefresh = Tsp;
mCfg->groups[group].sleep = 1000; cfgGroup->sleep = 1000;
mCfg->groups[group].state = zeroExportState::INIT; cfgGroup->state = zeroExportState::INIT;
mCfg->groups[group].stateNext = zeroExportState::INIT;
break; break;
} }
@ -296,12 +214,12 @@ class ZeroExport {
} }
/** tickSecond /** tickSecond
* Zeitimpuls * Time pulse every second
* @param void
* @returns void
*/ */
void tickSecond() { void tickSecond() {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
// Wait for ACK // Wait for ACK
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
@ -323,30 +241,28 @@ class ZeroExport {
} }
/** tickerMidnight /** tickerMidnight
* Zeitimpuls * Time pulse Midnicht
* @param void
* @returns void
*/ */
void tickMidnight(void) { void tickMidnight(void) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
// Reboot // Select all Inverter to reboot
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
// Reboot
mCfg->groups[group].inverters[inv].doReboot = true; mCfg->groups[group].inverters[inv].doReboot = true;
} }
} }
} }
/** resetWaitLimitAck /** resetWaitLimitAck
* * Reset waiting time limit
* @param * @param iv
* @returns void
*/ */
void resetWaitLimitAck(Inverter<> *iv) { void resetWaitLimitAck(Inverter<> *iv) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
@ -367,20 +283,20 @@ class ZeroExport {
mLog["D"] = eTsp - bTsp; mLog["D"] = eTsp - bTsp;
} }
sendLog(); sendLog();
clearLog();
return; return;
} }
} }
} }
} }
/** setPowerAck /** resetPowerAck
* * Reset waiting time power
* @param * @param iv
* @returns void
*/ */
void resetWaitPowerAck(Inverter<> *iv) { void resetWaitPowerAck(Inverter<> *iv) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
@ -409,13 +325,12 @@ class ZeroExport {
} }
/** resetWaitRebootAck /** resetWaitRebootAck
* * Reset waiting time reboot
* @param * @param iv
* @returns void
*/ */
void resetWaitRebootAck(Inverter<> *iv) { void resetWaitRebootAck(Inverter<> *iv) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
@ -445,52 +360,46 @@ class ZeroExport {
/** newDataAvailable /** newDataAvailable
* *
* @param iv
* @returns void
*/ */
void newDataAvailable(Inverter<> *iv) { void newDataAvailable(Inverter<> *iv) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
if (!iv->isAvailable()) { if (!iv->isAvailable()) return;
return;
}
if (!iv->isProducing()) { if (!iv->isProducing()) return;
return;
}
if (iv->actPowerLimit == 65535) { if (iv->actPowerLimit == 65535) return;
return;
}
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
if (iv->id == mCfg->groups[group].inverters[inv].id) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
unsigned long bTsp = millis();
if (iv->id != mCfg->groups[group].inverters[inv].id) continue;
mLog["t"] = "newDataAvailable";
mLog["g"] = group; unsigned long bTsp = millis();
mLog["i"] = inv;
mLog["id"] = iv->id; mLog["t"] = "newDataAvailable";
// mLog["a"] = iv->isAvailable(); mLog["g"] = group;
// mLog["p"] = iv->isProducing(); mLog["i"] = inv;
mLog["ivL%"] = iv->actPowerLimit; mLog["id"] = iv->id;
mLog["ivPm"] = iv->getMaxPower(); mLog["ivL%"] = iv->actPowerLimit;
uint16_t ivL = (iv->getMaxPower() * iv->actPowerLimit) / 100; mLog["ivPm"] = iv->getMaxPower();
mLog["ivL"] = ivL; uint16_t ivL = (iv->getMaxPower() * iv->actPowerLimit) / 100;
mLog["zeL"] = (uint16_t)mCfg->groups[group].inverters[inv].limit; mLog["ivL"] = ivL;
mCfg->groups[group].inverters[inv].limit = ivL; mLog["zeL"] = (uint16_t)mCfg->groups[group].inverters[inv].limit;
mCfg->groups[group].inverters[inv].limit = ivL;
if (mCfg->debug) {
unsigned long eTsp = millis(); if (mCfg->debug) {
mLog["B"] = bTsp; unsigned long eTsp = millis();
mLog["E"] = eTsp; mLog["B"] = bTsp;
mLog["D"] = eTsp - bTsp; mLog["E"] = eTsp;
} mLog["D"] = eTsp - bTsp;
sendLog();
clearLog();
return;
} }
sendLog();
clearLog();
return;
} }
} }
} }
@ -499,9 +408,8 @@ class ZeroExport {
* Subscribe section * Subscribe section
*/ */
void onMqttMessage(JsonObject obj) { void onMqttMessage(JsonObject obj) {
if ((!mIsInitialized) || (!mCfg->enabled)) { if ((!mIsInitialized) || (!mCfg->enabled)) return;
return;
}
return; return;
// MQTT":{"val":0,"path":"zero","cmd":"set","id":0} // MQTT":{"val":0,"path":"zero","cmd":"set","id":0}
if (strcmp(obj["cmd"], "set") != 0 && strcmp(obj["path"], "zero") != 0) { if (strcmp(obj["cmd"], "set") != 0 && strcmp(obj["path"], "zero") != 0) {
@ -515,7 +423,7 @@ class ZeroExport {
private: private:
/** groupInit /** groupInit
* initialisiert die Gruppe und sucht die ivPointer * Initialize the group and search the InverterPointer
* @param group * @param group
* @returns true/false * @returns true/false
* @todo getInverterById statt getInverterByPos, dann würde die Variable *iv und die Schleife nicht gebraucht. * @todo getInverterById statt getInverterByPos, dann würde die Variable *iv und die Schleife nicht gebraucht.
@ -543,14 +451,10 @@ class ZeroExport {
mIv[group][inv] = nullptr; mIv[group][inv] = nullptr;
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id < 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
// Load Config // Load Config
Inverter<> *iv; Inverter<> *iv;
@ -558,14 +462,10 @@ class ZeroExport {
iv = mSys->getInverterByPos(i); iv = mSys->getInverterByPos(i);
// Inverter not configured -> ignore // Inverter not configured -> ignore
if (iv == NULL) { if (iv == NULL) continue;
continue;
}
// Inverter not matching -> ignore // Inverter not matching -> ignore
if (iv->id != (uint8_t)mCfg->groups[group].inverters[inv].id) { if (iv->id != (uint8_t)mCfg->groups[group].inverters[inv].id) continue;
continue;
}
// Save Inverter // Save Inverter
logObj["pos"] = i; logObj["pos"] = i;
@ -588,28 +488,8 @@ class ZeroExport {
return result; return result;
} }
/** groupWait
* pausiert die Gruppe bis die Wartezeit 60s seit dem lastRun abgelaufen ist.
* @param group
* @returns true/false
*/
bool groupWait(uint8_t group, unsigned long *tsp, bool *doLog) {
if (mCfg->debug) mLog["t"] = "groupWait";
// Wait 60s
if (*tsp <= (mCfg->groups[group].lastRun + 60000UL)) {
return false;
}
mCfg->groups[group].lastRun = *tsp;
*doLog = true;
return true;
}
/** groupWaitRefresh /** groupWaitRefresh
* pausiert die Gruppe bis die Wartezeit refresh seit dem lastRefresh abgelaufen ist. * Pauses the group until the wait time since the lastRefresh has expired.
* @param group * @param group
* @returns true/false * @returns true/false
*/ */
@ -617,9 +497,7 @@ class ZeroExport {
if (mCfg->debug) mLog["t"] = "groupWaitRefresh"; if (mCfg->debug) mLog["t"] = "groupWaitRefresh";
// Wait Refreshtime // Wait Refreshtime
if (*tsp <= (mCfg->groups[group].lastRefresh + (mCfg->groups[group].refresh * 1000UL))) { if (*tsp <= (mCfg->groups[group].lastRefresh + (mCfg->groups[group].refresh * 1000UL))) return false;
return false;
}
mCfg->groups[group].lastRun = *tsp; mCfg->groups[group].lastRun = *tsp;
@ -649,13 +527,11 @@ class ZeroExport {
logObj["i"] = inv; logObj["i"] = inv;
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
// Inverter is not available -> wait // Inverter is not available -> wait
if (!mIv[group][inv]->isAvailable()) { if (!mIv[group][inv]->isAvailable()) {
logObj["a"] = false; logObj["a"] = false;
@ -666,18 +542,6 @@ class ZeroExport {
logObj["wL"] = mCfg->groups[group].inverters[inv].waitLimitAck; logObj["wL"] = mCfg->groups[group].inverters[inv].waitLimitAck;
wait = true; wait = true;
} }
// TODO: Remove -> is moved to groupSetPower
// // waitPowerAck
// if (mCfg->groups[group].inverters[inv].waitPowerAck > 0) {
// logObj["wP"] = mCfg->groups[group].inverters[inv].waitPowerAck;
// wait = true;
// }
// TODO: Remove -> is moved to groupSetReboot
// // waitRebootAck
// if (mCfg->groups[group].inverters[inv].waitRebootAck > 0) {
// logObj["wR"] = mCfg->groups[group].inverters[inv].waitRebootAck;
// wait = true;
// }
} }
mLog["w"] = wait; mLog["w"] = wait;
@ -706,17 +570,12 @@ class ZeroExport {
logObj["i"] = inv; logObj["i"] = inv;
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
if (!mIv[group][inv]->isAvailable()) { if (!mIv[group][inv]->isAvailable()) continue;
continue;
}
// Get Pac // Get Pac
record_t<> *rec; record_t<> *rec;
@ -773,17 +632,12 @@ class ZeroExport {
zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv]; zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
// Ignore disabled Inverter // Ignore disabled Inverter
if (!cfgGroupInv->enabled) { if (!cfgGroupInv->enabled) continue;
continue;
} if (cfgGroupInv->id < 0) continue;
if (cfgGroupInv->id <= 0) {
continue;
}
if (!mIv[group][inv]->isAvailable()) { if (!mIv[group][inv]->isAvailable()) {
if (U > 0) { if (U > 0) continue;
continue;
}
U = 0; U = 0;
id = cfgGroupInv->id; id = cfgGroupInv->id;
continue; continue;
@ -815,13 +669,10 @@ class ZeroExport {
// zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv]; // zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
// Abbruch weil Inverter nicht verfügbar // Abbruch weil Inverter nicht verfügbar
if (!mIv[group][inv]->isAvailable()) { if (!mIv[group][inv]->isAvailable()) {
@ -836,7 +687,6 @@ class ZeroExport {
} }
mCfg->groups[group].state = zeroExportState::SETPOWER; mCfg->groups[group].state = zeroExportState::SETPOWER;
mCfg->groups[group].stateNext = zeroExportState::SETPOWER;
} }
} }
@ -849,13 +699,10 @@ class ZeroExport {
// zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv]; // zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
// Abbruch weil Inverter nicht verfügbar // Abbruch weil Inverter nicht verfügbar
if (!mIv[group][inv]->isAvailable()) { if (!mIv[group][inv]->isAvailable()) {
@ -870,7 +717,6 @@ class ZeroExport {
} }
mCfg->groups[group].state = zeroExportState::SETPOWER; mCfg->groups[group].state = zeroExportState::SETPOWER;
mCfg->groups[group].stateNext = zeroExportState::SETPOWER;
} }
} }
} else { } else {
@ -901,9 +747,9 @@ class ZeroExport {
result = mPowermeter.getData(mLog, group); result = mPowermeter.getData(mLog, group);
if ( if (
(mCfg->groups[group].pmPower == 0) && (mCfg->groups[group].pmPower == 0) &&
(mCfg->groups[group].pmPower == 0) && (mCfg->groups[group].pmPowerL1 == 0) &&
(mCfg->groups[group].pmPower == 0) && (mCfg->groups[group].pmPowerL2 == 0) &&
(mCfg->groups[group].pmPower == 0)) { (mCfg->groups[group].pmPowerL3 == 0)) {
return false; return false;
} }
@ -924,7 +770,6 @@ class ZeroExport {
// Führungsgröße w in Watt // Führungsgröße w in Watt
float w = mCfg->groups[group].setPoint; float w = mCfg->groups[group].setPoint;
mLog["w"] = w; mLog["w"] = w;
// Regelgröße x in Watt // Regelgröße x in Watt
@ -932,7 +777,6 @@ class ZeroExport {
float x1 = mCfg->groups[group].pmPowerL1; float x1 = mCfg->groups[group].pmPowerL1;
float x2 = mCfg->groups[group].pmPowerL2; float x2 = mCfg->groups[group].pmPowerL2;
float x3 = mCfg->groups[group].pmPowerL3; float x3 = mCfg->groups[group].pmPowerL3;
mLog["x"] = x; mLog["x"] = x;
mLog["x1"] = x1; mLog["x1"] = x1;
mLog["x2"] = x2; mLog["x2"] = x2;
@ -943,12 +787,10 @@ class ZeroExport {
float e1 = w - x1; float e1 = w - x1;
float e2 = w - x2; float e2 = w - x2;
float e3 = w - x3; float e3 = w - x3;
mLog["e"] = e; mLog["e"] = e;
mLog["e1"] = e1; mLog["e1"] = e1;
mLog["e2"] = e2; mLog["e2"] = e2;
mLog["e3"] = e3; mLog["e3"] = e3;
if ( if (
(e < mCfg->groups[group].powerTolerance) && (e > -mCfg->groups[group].powerTolerance) && (e < mCfg->groups[group].powerTolerance) && (e > -mCfg->groups[group].powerTolerance) &&
(e1 < mCfg->groups[group].powerTolerance) && (e1 > -mCfg->groups[group].powerTolerance) && (e1 < mCfg->groups[group].powerTolerance) && (e1 > -mCfg->groups[group].powerTolerance) &&
@ -1023,7 +865,6 @@ class ZeroExport {
mLog["y1"] = y1; mLog["y1"] = y1;
mLog["y2"] = y2; mLog["y2"] = y2;
mLog["y3"] = y3; mLog["y3"] = y3;
mCfg->groups[group].grpPower = y; mCfg->groups[group].grpPower = y;
mCfg->groups[group].grpPowerL1 = y1; mCfg->groups[group].grpPowerL1 = y1;
mCfg->groups[group].grpPowerL2 = y2; mCfg->groups[group].grpPowerL2 = y2;
@ -1226,7 +1067,7 @@ class ZeroExport {
continue; continue;
} }
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) {
continue; continue;
} }
*doLog = true; *doLog = true;
@ -1296,13 +1137,10 @@ class ZeroExport {
logObj["i"] = inv; logObj["i"] = inv;
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
if (mCfg->debug) *doLog = true; if (mCfg->debug) *doLog = true;
@ -1336,7 +1174,7 @@ class ZeroExport {
if ( if (
( (
(mCfg->groups[group].battSwitch == false) || (mCfg->groups[group].battSwitch == false) ||
(mCfg->groups[group].inverters[inv].limitNew < mCfg->groups[group].inverters[inv].powerMin)) && (mCfg->groups[group].inverters[inv].limitNew < (mCfg->groups[group].inverters[inv].powerMin - 50))) &&
(mIv[group][inv]->isProducing() == true)) { (mIv[group][inv]->isProducing() == true)) {
// Off // Off
mCfg->groups[group].inverters[inv].doPower = false; mCfg->groups[group].inverters[inv].doPower = false;
@ -1397,14 +1235,10 @@ class ZeroExport {
logObj["i"] = inv; logObj["i"] = inv;
// Inverter not enabled -> ignore // Inverter not enabled -> ignore
if (!mCfg->groups[group].inverters[inv].enabled) { if (!mCfg->groups[group].inverters[inv].enabled) continue;
continue;
}
// Inverter not selected -> ignore // Inverter not selected -> ignore
if (mCfg->groups[group].inverters[inv].id <= 0) { if (mCfg->groups[group].inverters[inv].id < 0) continue;
continue;
}
// if isOff -> Limit Pmin // if isOff -> Limit Pmin
if (!mIv[group][inv]->isProducing()) { if (!mIv[group][inv]->isProducing()) {
@ -1412,14 +1246,10 @@ class ZeroExport {
} }
// Nothing todo // Nothing todo
if (mCfg->groups[group].inverters[inv].limit == mCfg->groups[group].inverters[inv].limitNew) { if (mCfg->groups[group].inverters[inv].limit == mCfg->groups[group].inverters[inv].limitNew) continue;
continue;
}
// Abbruch weil Inverter nicht verfügbar // Abbruch weil Inverter nicht verfügbar
if (!mIv[group][inv]->isAvailable()) { if (!mIv[group][inv]->isAvailable()) continue;
continue;
}
// Abbruch weil Inverter produziert nicht // Abbruch weil Inverter produziert nicht
/// if (!mIv[group][inv]->isProducing()) { /// if (!mIv[group][inv]->isProducing()) {
@ -1453,9 +1283,7 @@ class ZeroExport {
} }
// Nothing todo // Nothing todo
if (mCfg->groups[group].inverters[inv].limit == mCfg->groups[group].inverters[inv].limitNew) { if (mCfg->groups[group].inverters[inv].limit == mCfg->groups[group].inverters[inv].limitNew) continue;
continue;
}
*doLog = true; *doLog = true;
@ -1538,10 +1366,10 @@ class ZeroExport {
* @returns true/false * @returns true/false
* @todo Hier ist noch keine Funktion * @todo Hier ist noch keine Funktion
*/ */
bool groupEmergency(uint8_t group, unsigned long *tsp, bool *doLog) { bool groupEmergency(zeroExportGroup_t *cfgGroup, unsigned long *tsp, bool *doLog) {
if (mCfg->debug) mLog["t"] = "groupEmergency"; if (mCfg->debug) mLog["t"] = "groupEmergency";
mCfg->groups[group].lastRun = *tsp; cfgGroup->lastRun = *tsp;
*doLog = true; *doLog = true;
@ -1558,7 +1386,7 @@ class ZeroExport {
*/ */
void sendLog(void) { void sendLog(void) {
if (mCfg->log_over_webserial) { if (mCfg->log_over_webserial) {
// DBGPRINTLN(String("ze: ") + mDocLog.as<String>()); // DBGPRINTLN(String("ze: ") + mDocLog.as<String>());
DPRINTLN(DBG_INFO, String("ze: ") + mDocLog.as<String>()); DPRINTLN(DBG_INFO, String("ze: ") + mDocLog.as<String>());
} }

1
src/web/RestApi.h

@ -1159,7 +1159,6 @@ class RestApi {
mConfig->plugin.zeroExport.groups[group].Kd = jsonIn[F("Kd")]; mConfig->plugin.zeroExport.groups[group].Kd = jsonIn[F("Kd")];
// Global // Global
mConfig->plugin.zeroExport.groups[group].state = zeroExportState::INIT; mConfig->plugin.zeroExport.groups[group].state = zeroExportState::INIT;
mConfig->plugin.zeroExport.groups[group].stateNext = zeroExportState::INIT;
mApp->saveSettings(false); // without reboot mApp->saveSettings(false); // without reboot
} }
#endif #endif

Loading…
Cancel
Save