Skip to content

Commit

Permalink
Fix: Do not use ZCD to detect grid connectivity
Browse files Browse the repository at this point in the history
(cherry picked from commit a1ee1a5d501d22c08cd32965bf09c64da0a0ea07)
  • Loading branch information
mathieucarbou committed Jun 27, 2024
1 parent a9c5644 commit 026d048
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 49 deletions.
2 changes: 0 additions & 2 deletions lib/MycilaDimmer/MycilaDimmer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
1 change: 0 additions & 1 deletion lib/MycilaDimmer/MycilaZCD.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 5 additions & 26 deletions lib/MycilaRouter/MycilaRouterOutput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -73,9 +70,6 @@ bool Mycila::RouterOutput::tryDimmerDuty(uint16_t duty) {
}

void Mycila::RouterOutput::applyDimmerLimits() {
if (!_dimmer->isEnabled())
return;

if (_autoBypassEnabled)
return;

Expand All @@ -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);
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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;
Expand Down
32 changes: 15 additions & 17 deletions lib/MycilaRouter/MycilaRouterOutput.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<JsonObject>());
_temperatureSensor->toJson(root["ds18"].to<JsonObject>());
Expand All @@ -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<JsonObject>();
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>();
JsonObject jsonPZEM = root["metrics_pzem"].to<JsonObject>();
jsonPZEM["apparent_power"] = pzemMetrics.apparentPower;
jsonPZEM["current"] = pzemMetrics.current;
jsonPZEM["power"] = pzemMetrics.power;
Expand All @@ -124,28 +137,13 @@ 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<JsonObject>();
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<JsonObject>());
}
#endif

// 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(); }
Expand Down
6 changes: 3 additions & 3 deletions src/Website.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down

0 comments on commit 026d048

Please sign in to comment.