From 026d048b833175a5542b37abc8b546aea92385d1 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Thu, 27 Jun 2024 17:21:49 +0200 Subject: [PATCH] Fix: Do not use ZCD to detect grid connectivity (cherry picked from commit a1ee1a5d501d22c08cd32965bf09c64da0a0ea07) --- lib/MycilaDimmer/MycilaDimmer.h | 2 -- lib/MycilaDimmer/MycilaZCD.h | 1 - lib/MycilaRouter/MycilaRouterOutput.cpp | 31 ++++-------------------- lib/MycilaRouter/MycilaRouterOutput.h | 32 ++++++++++++------------- src/Website.cpp | 6 ++--- 5 files changed, 23 insertions(+), 49 deletions(-) diff --git a/lib/MycilaDimmer/MycilaDimmer.h b/lib/MycilaDimmer/MycilaDimmer.h index fbc6a1a..a2aa0bd 100644 --- a/lib/MycilaDimmer/MycilaDimmer.h +++ b/lib/MycilaDimmer/MycilaDimmer.h @@ -39,13 +39,11 @@ namespace Mycila { gpio_num_t getPin() const { return _pin; } bool isEnabled() const { return _enabled; } - bool isConnected() const { return _enabled && _zcd->isConnected(); } void toJson(const JsonObject& root) const { const float angle = getPhaseAngle(); root["angle"] = angle; root["angle_d"] = angle * RAD_TO_DEG; - root["connected"] = isConnected(); root["delay"] = getFiringDelay(); root["duty"] = _duty; root["duty_cycle"] = getPowerDutyCycle(); diff --git a/lib/MycilaDimmer/MycilaZCD.h b/lib/MycilaDimmer/MycilaZCD.h index 75b59fe..f242909 100644 --- a/lib/MycilaDimmer/MycilaZCD.h +++ b/lib/MycilaDimmer/MycilaZCD.h @@ -17,7 +17,6 @@ namespace Mycila { gpio_num_t getPin() const { return _pin; } bool isEnabled() const { return _enabled; } - bool isConnected() const { return _measuredGridFrequency > 0; } // in microseconds // 50Hz => 10000 diff --git a/lib/MycilaRouter/MycilaRouterOutput.cpp b/lib/MycilaRouter/MycilaRouterOutput.cpp index f8968de..600c514 100644 --- a/lib/MycilaRouter/MycilaRouterOutput.cpp +++ b/lib/MycilaRouter/MycilaRouterOutput.cpp @@ -38,8 +38,10 @@ const char* Mycila::RouterOutput::getStateName() const { return RouterOutputStat // dimmer bool Mycila::RouterOutput::tryDimmerDuty(uint16_t duty) { - if (!_dimmer->isEnabled()) + if (!_dimmer->isEnabled()) { + LOGW(TAG, "Dimmer '%s' is disabled", _name); return false; + } if (_autoBypassEnabled) { LOGW(TAG, "Auto Bypass '%s' is activated: unable to change dimmer level", _name); @@ -51,11 +53,6 @@ bool Mycila::RouterOutput::tryDimmerDuty(uint16_t duty) { return false; } - if (!_dimmer->isConnected()) { - LOGW(TAG, "Dimmer '%s' is not connected to the grid", _name); - return false; - } - if (isDimmerTemperatureLimitReached()) { LOGW(TAG, "Dimmer '%s' reached its temperature limit of %.02f °C", _name, config.dimmerTempLimit); return false; @@ -73,9 +70,6 @@ bool Mycila::RouterOutput::tryDimmerDuty(uint16_t duty) { } void Mycila::RouterOutput::applyDimmerLimits() { - if (!_dimmer->isEnabled()) - return; - if (_autoBypassEnabled) return; @@ -85,12 +79,6 @@ void Mycila::RouterOutput::applyDimmerLimits() { if (_dimmer->isOff()) return; - if (_dimmer->isOn() && !_dimmer->isConnected()) { - LOGW(TAG, "Dimmer '%s' is not connected to the grid!", _name); - _dimmer->off(); - return; - } - if (_dimmer->getPowerDuty() > config.dimmerDutyLimit) { LOGW(TAG, "Dimmer '%s' reached its duty limit at %" PRIu16, _name, config.dimmerDutyLimit); _dimmer->setPowerDuty(config.dimmerDutyLimit); @@ -136,15 +124,6 @@ void Mycila::RouterOutput::applyAutoBypass() { return; } - if (!_relay->isEnabled() && !_dimmer->isConnected()) { - if (_autoBypassEnabled) { - LOGW(TAG, "Dimmer disconnected from grid: stopping Auto Bypass '%s'...", _name); - _autoBypassEnabled = false; - _setBypass(false); - } - return; - } - // time checks if (!NTP.isSynced()) { @@ -217,7 +196,7 @@ void Mycila::RouterOutput::applyAutoBypass() { // time and temp OK, let's start if (!_autoBypassEnabled) { // auto bypass is not enabled, let's start it - if (!_relay->isEnabled() && !_dimmer->isConnected()) { + if (!_relay->isEnabled() && !_dimmer->isEnabled()) { return; } const char* wday = DaysOfWeek[timeInfo.tm_wday]; @@ -258,7 +237,7 @@ void Mycila::RouterOutput::_setBypass(bool state) { } else { // we don't have a relay: use the dimmer - if (_dimmer->isConnected()) { + if (_dimmer->isEnabled()) { LOGD(TAG, "Turning Dimmer '%s' ON...", _name); _dimmer->setPowerDuty(MYCILA_DIMMER_MAX_DUTY); _bypassEnabled = true; diff --git a/lib/MycilaRouter/MycilaRouterOutput.h b/lib/MycilaRouter/MycilaRouterOutput.h index ef2f486..c3bc2e2 100644 --- a/lib/MycilaRouter/MycilaRouterOutput.h +++ b/lib/MycilaRouter/MycilaRouterOutput.h @@ -92,7 +92,6 @@ namespace Mycila { root["enabled"] = isDimmerEnabled(); root["state"] = getStateName(); root["bypass"] = isBypassOn() ? "on" : "off"; - root["online"] = isDimmerConnected(); _dimmer->toJson(root["dimmer"].to()); _temperatureSensor->toJson(root["ds18"].to()); @@ -110,11 +109,25 @@ namespace Mycila { jsonMetrics["voltage"] = metrics.voltage; jsonMetrics["voltage_dimmed"] = metrics.dimmedVoltage; + RouterOutputMetrics dutyMetrics; + dutyMetrics.voltage = metrics.voltage; + completeMetricsFromDuty(dutyMetrics, _dimmer->getPowerDutyCycle(), config.calibratedResistance ? config.calibratedResistance : metrics.resistance); + + JsonObject jsonDuty = root["metrics_duty"].to(); + jsonDuty["apparent_power"] = dutyMetrics.apparentPower; + jsonDuty["current"] = dutyMetrics.current; + jsonDuty["power"] = dutyMetrics.power; + jsonDuty["power_factor"] = dutyMetrics.powerFactor; + jsonDuty["resistance"] = dutyMetrics.resistance; + jsonDuty["thdi"] = dutyMetrics.thdi; + jsonDuty["voltage"] = dutyMetrics.voltage; + jsonDuty["voltage_dimmed"] = dutyMetrics.dimmedVoltage; + RouterOutputMetrics pzemMetrics; pzemMetrics.voltage = metrics.voltage; completeMetricsFromPZEM(pzemMetrics, _pzem); - JsonObject jsonPZEM = root["pzem"].to(); + JsonObject jsonPZEM = root["metrics_pzem"].to(); jsonPZEM["apparent_power"] = pzemMetrics.apparentPower; jsonPZEM["current"] = pzemMetrics.current; jsonPZEM["power"] = pzemMetrics.power; @@ -124,20 +137,6 @@ namespace Mycila { jsonPZEM["voltage"] = pzemMetrics.voltage; jsonPZEM["voltage_dimmed"] = pzemMetrics.dimmedVoltage; - RouterOutputMetrics dutyMetrics; - dutyMetrics.voltage = metrics.voltage; - completeMetricsFromDuty(dutyMetrics, _dimmer->getPowerDutyCycle(), config.calibratedResistance ? config.calibratedResistance : pzemMetrics.resistance); - - JsonObject jsonDuty = root["duty"].to(); - jsonDuty["apparent_power"] = dutyMetrics.apparentPower; - jsonDuty["current"] = dutyMetrics.current; - jsonDuty["power"] = dutyMetrics.power; - jsonDuty["power_factor"] = dutyMetrics.powerFactor; - jsonDuty["resistance"] = dutyMetrics.resistance; - jsonDuty["thdi"] = dutyMetrics.thdi; - jsonDuty["voltage"] = dutyMetrics.voltage; - jsonDuty["voltage_dimmed"] = dutyMetrics.dimmedVoltage; - _relay->toJson(root["relay"].to()); } #endif @@ -145,7 +144,6 @@ namespace Mycila { // dimmer bool isDimmerEnabled() const { return _dimmer->isEnabled(); } - bool isDimmerConnected() const { return _dimmer->isConnected(); } bool isAutoDimmerEnabled() const { return _dimmer->isEnabled() && config.autoDimmer; } bool isDimmerTemperatureLimitReached() const { return config.dimmerTempLimit > 0 && _temperatureSensor->getValidTemperature() >= config.dimmerTempLimit; } uint16_t getDimmerDuty() const { return _dimmer->getPowerDuty(); } diff --git a/src/Website.cpp b/src/Website.cpp index 5748e8b..c14dc30 100644 --- a/src/Website.cpp +++ b/src/Website.cpp @@ -642,14 +642,14 @@ void YaSolR::WebsiteClass::updateCards() { // Hardware (status) _status(_jsy, KEY_ENABLE_JSY, jsy.isEnabled(), jsy.isConnected(), YASOLR_LBL_110); _status(_mqtt, KEY_ENABLE_MQTT, mqtt.isEnabled(), mqtt.isConnected(), mqtt.getLastError() ? mqtt.getLastError() : YASOLR_LBL_113); - _status(_output1Dimmer, KEY_ENABLE_OUTPUT1_DIMMER, dimmerO1.isEnabled(), dimmerO1.isConnected(), YASOLR_LBL_110); + _status(_output1Dimmer, KEY_ENABLE_OUTPUT1_DIMMER, dimmerO1.isEnabled()); _status(_output1DS18, KEY_ENABLE_OUTPUT1_DS18, ds18O1.isEnabled(), ds18O1.getLastTime() > 0, YASOLR_LBL_114); _status(_output1PZEM, KEY_ENABLE_OUTPUT1_PZEM, pzemO1.isEnabled(), pzemO1.isConnected(), YASOLR_LBL_110); - _status(_output2Dimmer, KEY_ENABLE_OUTPUT2_DIMMER, dimmerO2.isEnabled(), dimmerO2.isConnected(), YASOLR_LBL_110); + _status(_output2Dimmer, KEY_ENABLE_OUTPUT2_DIMMER, dimmerO2.isEnabled()); _status(_output2DS18, KEY_ENABLE_OUTPUT2_DS18, ds18O2.isEnabled(), ds18O2.getLastTime() > 0, YASOLR_LBL_114); _status(_output2PZEM, KEY_ENABLE_OUTPUT2_PZEM, pzemO2.isEnabled(), pzemO2.isConnected(), YASOLR_LBL_110); _status(_routerDS18, KEY_ENABLE_DS18_SYSTEM, ds18Sys.isEnabled(), ds18Sys.getLastTime() > 0, YASOLR_LBL_114); - _status(_zcd, KEY_ENABLE_ZCD, zcd.isEnabled(), zcd.isConnected(), YASOLR_LBL_110); + _status(_zcd, KEY_ENABLE_ZCD, zcd.isEnabled(), zcd.getPulseFrequency() > 0, YASOLR_LBL_110); #endif }