From ccc9eea312d972505b753b772d3b157733f69657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Wed, 3 Sep 2025 12:38:31 +0200 Subject: [PATCH] gridPowerDelta Relay FIX --- src/Relay.h | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/Relay.h b/src/Relay.h index fe8debd..7d9499a 100644 --- a/src/Relay.h +++ b/src/Relay.h @@ -27,7 +27,7 @@ class Relay final : public Output { long gridPowerDeltaOffDelay = 0; - unsigned long gridPowerDeltaMillis = 0; + unsigned long gridPowerDeltaLast = 0; public: @@ -139,7 +139,7 @@ public: void set(const bool state) override { Output::set(state); - gridPowerDeltaMillis = 0; + gridPowerDeltaLast = 0; } protected: @@ -159,9 +159,6 @@ private: } void doGridPowerDelta() { - if (isnan(gridPowerDeltaValue) || millis() - gridPowerDeltaMillis > 10000) { - return; - } if (get()) { gridPowerDeltaOff(); } else { @@ -169,22 +166,27 @@ private: } } + bool gridPowerDeltaConfigInvalid() { + return gridPowerDeltaOffThreshold < gridPowerDeltaOnThreshold; + } + void gridPowerDeltaOff() { if (!gridPowerDeltaOffEnabled) { return; } - if (gridPowerDeltaValue > gridPowerDeltaOffThreshold) { - if (gridPowerDeltaMillis == 0) { - Serial.printf("[%s] CONSUMING TOO MUCH: Preparing to power OFF...\n", name.c_str()); - gridPowerDeltaMillis = max(1UL, millis()); + const auto invalid = isnan(gridPowerDeltaValue) || millis() - gridPowerDeltaMillis > 10000 || gridPowerDeltaConfigInvalid(); + if (gridPowerDeltaValue > gridPowerDeltaOffThreshold || invalid) { + if (gridPowerDeltaLast == 0 && gridPowerDeltaOffDelay > 0) { + Serial.printf("[RELAY] \"%s\": CONSUMING TOO MUCH: Preparing to power OFF...\n", name.c_str()); + gridPowerDeltaLast = max(1UL, millis()); } else { - if (millis() - gridPowerDeltaMillis > gridPowerDeltaOffDelay) { + if (millis() - gridPowerDeltaLast > gridPowerDeltaOffDelay) { set(false); } } - } else if (gridPowerDeltaMillis > 0) { - Serial.printf("[%s] Powering off CANCELED!\n", name.c_str()); - gridPowerDeltaMillis = 0; + } else if (gridPowerDeltaLast > 0) { + Serial.printf("[RELAY] \"%s\": Powering off CANCELED!\n", name.c_str()); + gridPowerDeltaLast = 0; } } @@ -192,18 +194,18 @@ private: if (!gridPowerDeltaOnEnabled) { return; } - if (gridPowerDeltaValue < gridPowerDeltaOnThreshold) { - if (gridPowerDeltaMillis == 0) { - Serial.printf("[%s] PRODUCING TOO MUCH: Preparing to power ON...\n", name.c_str()); - gridPowerDeltaMillis = max(1UL, millis()); + if (gridPowerDeltaValue < gridPowerDeltaOnThreshold && !gridPowerDeltaConfigInvalid()) { + if (gridPowerDeltaLast == 0 && gridPowerDeltaOnDelay > 0) { + Serial.printf("[RELAY] \"%s\": PRODUCING TOO MUCH: Preparing to power ON...\n", name.c_str()); + gridPowerDeltaLast = max(1UL, millis()); } else { - if (millis() - gridPowerDeltaMillis > gridPowerDeltaOnDelay) { + if (millis() - gridPowerDeltaLast > gridPowerDeltaOnDelay) { set(true); } } - } else if (gridPowerDeltaMillis > 0) { - Serial.printf("[%s] Powering on CANCELED!\n", name.c_str()); - gridPowerDeltaMillis = 0; + } else if (gridPowerDeltaLast > 0) { + Serial.printf("[RELAY] \"%s\": Powering on CANCELED!\n", name.c_str()); + gridPowerDeltaLast = 0; } }