gridPowerDelta Relay FIX

This commit is contained in:
Patrick Haßel 2025-09-03 12:38:31 +02:00
parent 465d4e0624
commit ccc9eea312

View File

@ -27,7 +27,7 @@ class Relay final : public Output {
long gridPowerDeltaOffDelay = 0; long gridPowerDeltaOffDelay = 0;
unsigned long gridPowerDeltaMillis = 0; unsigned long gridPowerDeltaLast = 0;
public: public:
@ -139,7 +139,7 @@ public:
void set(const bool state) override { void set(const bool state) override {
Output::set(state); Output::set(state);
gridPowerDeltaMillis = 0; gridPowerDeltaLast = 0;
} }
protected: protected:
@ -159,9 +159,6 @@ private:
} }
void doGridPowerDelta() { void doGridPowerDelta() {
if (isnan(gridPowerDeltaValue) || millis() - gridPowerDeltaMillis > 10000) {
return;
}
if (get()) { if (get()) {
gridPowerDeltaOff(); gridPowerDeltaOff();
} else { } else {
@ -169,22 +166,27 @@ private:
} }
} }
bool gridPowerDeltaConfigInvalid() {
return gridPowerDeltaOffThreshold < gridPowerDeltaOnThreshold;
}
void gridPowerDeltaOff() { void gridPowerDeltaOff() {
if (!gridPowerDeltaOffEnabled) { if (!gridPowerDeltaOffEnabled) {
return; return;
} }
if (gridPowerDeltaValue > gridPowerDeltaOffThreshold) { const auto invalid = isnan(gridPowerDeltaValue) || millis() - gridPowerDeltaMillis > 10000 || gridPowerDeltaConfigInvalid();
if (gridPowerDeltaMillis == 0) { if (gridPowerDeltaValue > gridPowerDeltaOffThreshold || invalid) {
Serial.printf("[%s] CONSUMING TOO MUCH: Preparing to power OFF...\n", name.c_str()); if (gridPowerDeltaLast == 0 && gridPowerDeltaOffDelay > 0) {
gridPowerDeltaMillis = max(1UL, millis()); Serial.printf("[RELAY] \"%s\": CONSUMING TOO MUCH: Preparing to power OFF...\n", name.c_str());
gridPowerDeltaLast = max(1UL, millis());
} else { } else {
if (millis() - gridPowerDeltaMillis > gridPowerDeltaOffDelay) { if (millis() - gridPowerDeltaLast > gridPowerDeltaOffDelay) {
set(false); set(false);
} }
} }
} else if (gridPowerDeltaMillis > 0) { } else if (gridPowerDeltaLast > 0) {
Serial.printf("[%s] Powering off CANCELED!\n", name.c_str()); Serial.printf("[RELAY] \"%s\": Powering off CANCELED!\n", name.c_str());
gridPowerDeltaMillis = 0; gridPowerDeltaLast = 0;
} }
} }
@ -192,18 +194,18 @@ private:
if (!gridPowerDeltaOnEnabled) { if (!gridPowerDeltaOnEnabled) {
return; return;
} }
if (gridPowerDeltaValue < gridPowerDeltaOnThreshold) { if (gridPowerDeltaValue < gridPowerDeltaOnThreshold && !gridPowerDeltaConfigInvalid()) {
if (gridPowerDeltaMillis == 0) { if (gridPowerDeltaLast == 0 && gridPowerDeltaOnDelay > 0) {
Serial.printf("[%s] PRODUCING TOO MUCH: Preparing to power ON...\n", name.c_str()); Serial.printf("[RELAY] \"%s\": PRODUCING TOO MUCH: Preparing to power ON...\n", name.c_str());
gridPowerDeltaMillis = max(1UL, millis()); gridPowerDeltaLast = max(1UL, millis());
} else { } else {
if (millis() - gridPowerDeltaMillis > gridPowerDeltaOnDelay) { if (millis() - gridPowerDeltaLast > gridPowerDeltaOnDelay) {
set(true); set(true);
} }
} }
} else if (gridPowerDeltaMillis > 0) { } else if (gridPowerDeltaLast > 0) {
Serial.printf("[%s] Powering on CANCELED!\n", name.c_str()); Serial.printf("[RELAY] \"%s\": Powering on CANCELED!\n", name.c_str());
gridPowerDeltaMillis = 0; gridPowerDeltaLast = 0;
} }
} }