diff --git a/src/Output.h b/src/Output.h index 9dd6737..3774039 100644 --- a/src/Output.h +++ b/src/Output.h @@ -70,8 +70,8 @@ public: } virtual void set(const bool state) { - _write(state); onCount = 0; + _write(state); } void toggle() { diff --git a/src/Relay.h b/src/Relay.h index bd1d56f..51ec492 100644 --- a/src/Relay.h +++ b/src/Relay.h @@ -27,7 +27,7 @@ class Relay final : public Output { long gridPowerDeltaOffDelay = 0; - unsigned long gridPowerDeltaLast = 0; + unsigned long gridPowerDeltaAlarmSince = 0; public: @@ -125,6 +125,8 @@ public: json["topic"] = topic; + json["gridPowerDeltaAlarmSince"] = gridPowerDeltaAlarmSince; + json["gridPowerDeltaOffEnabled"] = gridPowerDeltaOffEnabled; json["gridPowerDeltaOnThreshold"] = gridPowerDeltaOnThreshold; json["gridPowerDeltaOnDelay"] = gridPowerDeltaOnDelay; @@ -138,8 +140,8 @@ public: } void set(const bool state) override { + gridPowerDeltaAlarmSince = 0; Output::set(state); - gridPowerDeltaLast = 0; } protected: @@ -174,20 +176,19 @@ private: if (!gridPowerDeltaOffEnabled) { return; } - const auto invalid = isnan(gridPowerDeltaValue) || millis() - gridPowerDeltaMillis > 10000 || gridPowerDeltaConfigInvalid(); + const auto now = max(1UL, millis()); + const auto invalid = isnan(gridPowerDeltaValue) || now - 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() - gridPowerDeltaLast > gridPowerDeltaOffDelay) { - Serial.printf("[RELAY] \"%s\": CONSUMING TOO MUCH: Powering OFF!\n", name.c_str()); - set(false); - } + if (gridPowerDeltaAlarmSince == 0 && gridPowerDeltaOffDelay > 0) { + Serial.printf("[RELAY] \"%s\": CONSUMING TOO MUCH: Powering OFF in %ld ms...\n", name.c_str(), gridPowerDeltaOffDelay); + gridPowerDeltaAlarmSince = now; } - } else if (gridPowerDeltaLast > 0) { + if (now - gridPowerDeltaAlarmSince >= gridPowerDeltaOffDelay) { + Serial.printf("[RELAY] \"%s\": CONSUMING TOO MUCH: Powering OFF!\n", name.c_str()); + set(false); + } + } else if (gridPowerDeltaAlarmSince > 0) { Serial.printf("[RELAY] \"%s\": Powering off CANCELED!\n", name.c_str()); - gridPowerDeltaLast = 0; } } @@ -195,19 +196,18 @@ private: if (!gridPowerDeltaOnEnabled) { return; } + const auto now = 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() - gridPowerDeltaLast > gridPowerDeltaOnDelay) { - Serial.printf("[RELAY] \"%s\": PRODUCING TOO MUCH: Powering ON!\n", name.c_str()); - set(true); - } + if (gridPowerDeltaAlarmSince == 0 && gridPowerDeltaOnDelay > 0) { + Serial.printf("[RELAY] \"%s\": PRODUCING TOO MUCH: Powering ON in %ld ms...\n", name.c_str(), gridPowerDeltaOnDelay); + gridPowerDeltaAlarmSince = now; } - } else if (gridPowerDeltaLast > 0) { + if (now - gridPowerDeltaAlarmSince >= gridPowerDeltaOnDelay) { + Serial.printf("[RELAY] \"%s\": PRODUCING TOO MUCH: Powering ON!\n", name.c_str()); + set(true); + } + } else if (gridPowerDeltaAlarmSince > 0) { Serial.printf("[RELAY] \"%s\": Powering on CANCELED!\n", name.c_str()); - gridPowerDeltaLast = 0; } }