mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-09 06:01:37 +02:00
Merge branch 'zero-export' into zero-export
This commit is contained in:
commit
a9a90d38bf
3 changed files with 136 additions and 283 deletions
|
@ -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;
|
||||||
|
|
|
@ -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,206 +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;
|
||||||
mLog["s2"] = (uint8_t)mCfg->groups[group].stateNext;
|
|
||||||
|
|
||||||
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
|
||||||
}
|
}
|
||||||
|
@ -274,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,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++) {
|
||||||
|
@ -324,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++) {
|
||||||
|
@ -368,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++) {
|
||||||
|
@ -410,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++) {
|
||||||
|
@ -446,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();
|
|
||||||
|
|
||||||
mLog["t"] = "newDataAvailable";
|
if (iv->id != mCfg->groups[group].inverters[inv].id) continue;
|
||||||
mLog["g"] = group;
|
|
||||||
mLog["i"] = inv;
|
|
||||||
mLog["id"] = iv->id;
|
|
||||||
// mLog["a"] = iv->isAvailable();
|
|
||||||
// mLog["p"] = iv->isProducing();
|
|
||||||
mLog["ivL%"] = iv->actPowerLimit;
|
|
||||||
mLog["ivPm"] = iv->getMaxPower();
|
|
||||||
uint16_t ivL = (iv->getMaxPower() * iv->actPowerLimit) / 100;
|
|
||||||
mLog["ivL"] = ivL;
|
|
||||||
mLog["zeL"] = (uint16_t)mCfg->groups[group].inverters[inv].limit;
|
|
||||||
mCfg->groups[group].inverters[inv].limit = ivL;
|
|
||||||
|
|
||||||
if (mCfg->debug) {
|
unsigned long bTsp = millis();
|
||||||
unsigned long eTsp = millis();
|
|
||||||
mLog["B"] = bTsp;
|
mLog["t"] = "newDataAvailable";
|
||||||
mLog["E"] = eTsp;
|
mLog["g"] = group;
|
||||||
mLog["D"] = eTsp - bTsp;
|
mLog["i"] = inv;
|
||||||
}
|
mLog["id"] = iv->id;
|
||||||
sendLog();
|
mLog["ivL%"] = iv->actPowerLimit;
|
||||||
clearLog();
|
mLog["ivPm"] = iv->getMaxPower();
|
||||||
return;
|
uint16_t ivL = (iv->getMaxPower() * iv->actPowerLimit) / 100;
|
||||||
|
mLog["ivL"] = 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();
|
||||||
|
mLog["B"] = bTsp;
|
||||||
|
mLog["E"] = eTsp;
|
||||||
|
mLog["D"] = eTsp - bTsp;
|
||||||
}
|
}
|
||||||
|
sendLog();
|
||||||
|
clearLog();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -500,7 +408,7 @@ class ZeroExport {
|
||||||
* Subscribe section
|
* Subscribe section
|
||||||
*/
|
*/
|
||||||
void onMqttMessage(JsonObject obj) {
|
void onMqttMessage(JsonObject obj) {
|
||||||
if ((!mIsInitialized) || (!mCfg->enabled)) return;
|
if (!mIsInitialized) return;
|
||||||
|
|
||||||
String topic = String(obj["topic"]);
|
String topic = String(obj["topic"]);
|
||||||
if(!topic.indexOf("/zero/set/")) return;
|
if(!topic.indexOf("/zero/set/")) return;
|
||||||
|
@ -522,6 +430,7 @@ class ZeroExport {
|
||||||
mCfg->enabled = (bool)obj["val"];
|
mCfg->enabled = (bool)obj["val"];
|
||||||
mLog["zero_enable"] = mCfg->enabled;
|
mLog["zero_enable"] = mCfg->enabled;
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mLog["Msg"] = obj;
|
mLog["Msg"] = obj;
|
||||||
|
@ -530,20 +439,20 @@ class ZeroExport {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/** NotEnabledOrNotSelected
|
||||||
|
* Inverter not enabled -> ignore || Inverter not selected -> ignore
|
||||||
|
*/
|
||||||
|
bool NotEnabledOrNotSelected(uint8_t group, uint8_t inv) {
|
||||||
|
return ((!mCfg->groups[group].inverters[inv].enabled) || (mCfg->groups[group].inverters[inv].id < 0));
|
||||||
|
}
|
||||||
|
|
||||||
/** 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* EnabledSelected
|
|
||||||
* Inverter not enabled -> ignore || Inverter not selected -> ignore
|
|
||||||
*/
|
|
||||||
bool NotEnabledOrNotSelected(uint8_t group, uint8_t inv) {
|
|
||||||
return !mCfg->groups[group].inverters[inv].enabled || mCfg->groups[group].inverters[inv].id < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool groupInit(uint8_t group, unsigned long *tsp, bool *doLog) {
|
bool groupInit(uint8_t group, unsigned long *tsp, bool *doLog) {
|
||||||
uint8_t result = false;
|
uint8_t result = false;
|
||||||
|
|
||||||
|
@ -567,7 +476,7 @@ class ZeroExport {
|
||||||
|
|
||||||
mIv[group][inv] = nullptr;
|
mIv[group][inv] = nullptr;
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
// Load Config
|
// Load Config
|
||||||
|
@ -602,28 +511,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
|
||||||
*/
|
*/
|
||||||
|
@ -631,9 +520,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;
|
||||||
|
|
||||||
|
@ -662,7 +549,7 @@ class ZeroExport {
|
||||||
JsonObject logObj = logArr.createNestedObject();
|
JsonObject logObj = logArr.createNestedObject();
|
||||||
logObj["i"] = inv;
|
logObj["i"] = inv;
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
// Inverter is not available -> wait
|
// Inverter is not available -> wait
|
||||||
|
@ -675,18 +562,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;
|
||||||
|
@ -714,12 +589,10 @@ class ZeroExport {
|
||||||
JsonObject logObj = logArr.createNestedObject();
|
JsonObject logObj = logArr.createNestedObject();
|
||||||
logObj["i"] = inv;
|
logObj["i"] = inv;
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
if (!mIv[group][inv]->isAvailable()) {
|
if (!mIv[group][inv]->isAvailable()) continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get Pac
|
// Get Pac
|
||||||
record_t<> *rec;
|
record_t<> *rec;
|
||||||
|
@ -776,17 +649,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;
|
||||||
|
@ -817,7 +685,7 @@ class ZeroExport {
|
||||||
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
||||||
// zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
|
// zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
// Abbruch weil Inverter nicht verfügbar
|
// Abbruch weil Inverter nicht verfügbar
|
||||||
|
@ -833,7 +701,6 @@ class ZeroExport {
|
||||||
}
|
}
|
||||||
|
|
||||||
mCfg->groups[group].state = zeroExportState::SETPOWER;
|
mCfg->groups[group].state = zeroExportState::SETPOWER;
|
||||||
mCfg->groups[group].stateNext = zeroExportState::SETPOWER;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -845,7 +712,7 @@ class ZeroExport {
|
||||||
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
||||||
// zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
|
// zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
// Abbruch weil Inverter nicht verfügbar
|
// Abbruch weil Inverter nicht verfügbar
|
||||||
|
@ -861,7 +728,6 @@ class ZeroExport {
|
||||||
}
|
}
|
||||||
|
|
||||||
mCfg->groups[group].state = zeroExportState::SETPOWER;
|
mCfg->groups[group].state = zeroExportState::SETPOWER;
|
||||||
mCfg->groups[group].stateNext = zeroExportState::SETPOWER;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -922,7 +788,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
|
||||||
|
@ -930,7 +795,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;
|
||||||
|
@ -941,12 +805,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) &&
|
||||||
|
@ -1021,7 +883,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;
|
||||||
|
@ -1219,7 +1080,7 @@ class ZeroExport {
|
||||||
JsonObject logObj = logArr.createNestedObject();
|
JsonObject logObj = logArr.createNestedObject();
|
||||||
logObj["i"] = inv;
|
logObj["i"] = inv;
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
*doLog = true;
|
*doLog = true;
|
||||||
|
@ -1288,7 +1149,7 @@ class ZeroExport {
|
||||||
JsonObject logObj = logArr.createNestedObject();
|
JsonObject logObj = logArr.createNestedObject();
|
||||||
logObj["i"] = inv;
|
logObj["i"] = inv;
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
if (mCfg->debug) *doLog = true;
|
if (mCfg->debug) *doLog = true;
|
||||||
|
@ -1323,7 +1184,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;
|
||||||
|
@ -1383,7 +1244,7 @@ class ZeroExport {
|
||||||
JsonObject logObj = logArr.createNestedObject();
|
JsonObject logObj = logArr.createNestedObject();
|
||||||
logObj["i"] = inv;
|
logObj["i"] = inv;
|
||||||
|
|
||||||
// Inverter not enabled -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
// if isOff -> Limit Pmin
|
// if isOff -> Limit Pmin
|
||||||
|
@ -1392,14 +1253,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()) {
|
||||||
|
@ -1433,9 +1290,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;
|
||||||
|
|
||||||
|
@ -1526,10 +1381,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;
|
||||||
|
|
||||||
|
@ -1546,7 +1401,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>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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…
Add table
Add a link
Reference in a new issue