diff --git a/include/yasolr_dashboard.h b/include/yasolr_dashboard.h index 80f5b907..94c1d5cf 100644 --- a/include/yasolr_dashboard.h +++ b/include/yasolr_dashboard.h @@ -40,8 +40,8 @@ namespace YaSolR { void _outputDimmerSlider(dash::SliderCard& card, Mycila::RouterOutput& output) { card.onChange([&card, &output, this](float value) { - output.setDimmerDutyCycle(value / 100); - card.setValue(output.getDimmerDutyCycle() * 100); + output.setDimmerDutyCycle(value / 100.0f); + card.setValue(output.getDimmerDutyCycle() * 100.0f); dashboard.refresh(card); dashboardUpdateTask.requestEarlyRun(); }); diff --git a/include/yasolr_macros.h b/include/yasolr_macros.h index efcd82d4..1b9af2a5 100644 --- a/include/yasolr_macros.h +++ b/include/yasolr_macros.h @@ -52,6 +52,7 @@ #define YASOLR_DIMMER_ROBODYN "Robodyn 24A / 40A" #define YASOLR_DIMMER_TRIAC "Triac + ZCD" #define YASOLR_DIMMER_ZC_SSR "Zero-crossing Solid State Relay" +#define YASOLR_DS18_SEARCH_MAX_RETRY 30 #define YASOLR_GRAPH_POINTS 60 #define YASOLR_HIDDEN_PWD "********" #define YASOLR_MQTT_KEEPALIVE 60 diff --git a/lib/DimmableLight/src/thyristor.cpp b/lib/DimmableLight/src/thyristor.cpp index aca2d56c..b1384252 100644 --- a/lib/DimmableLight/src/thyristor.cpp +++ b/lib/DimmableLight/src/thyristor.cpp @@ -667,7 +667,7 @@ float Thyristor::getFrequency() { if (semiPeriodLength == 0) { return 0; } - return 1000000 / 2 / (float)(semiPeriodLength); + return 500000.0f / (float)(semiPeriodLength); } uint16_t Thyristor::getSemiPeriod() { @@ -685,7 +685,7 @@ void Thyristor::setFrequency(float frequency) { return; } - semiPeriodLength = 1000000 / 2 / frequency; + semiPeriodLength = 500000.0f / frequency; } void Thyristor::setSemiPeriod(uint16_t semiPeriod) { semiPeriodLength = semiPeriod; diff --git a/lib/MycilaRouter/MycilaGrid.cpp b/lib/MycilaRouter/MycilaGrid.cpp index c76a9d24..629541c8 100644 --- a/lib/MycilaRouter/MycilaGrid.cpp +++ b/lib/MycilaRouter/MycilaGrid.cpp @@ -19,12 +19,12 @@ bool Mycila::Grid::updatePower() { update = _localMetrics.get().power; } - if (isnan(update) && _power.neverUpdated()) { + if (std::isnan(update) && _power.neverUpdated()) { return false; } // all became unavailable ? - if (isnan(update)) { + if (std::isnan(update)) { _power.reset(); return true; } @@ -175,21 +175,21 @@ void Mycila::Grid::toJson(const JsonObject& root) const { } void Mycila::Grid::toJson(const JsonObject& dest, const Metrics& metrics) { - if (!isnanf(metrics.apparentPower)) + if (!std::isnan(metrics.apparentPower)) dest["apparent_power"] = metrics.apparentPower; - if (!isnanf(metrics.current)) + if (!std::isnan(metrics.current)) dest["current"] = metrics.current; - if (!isnanf(metrics.energy)) + if (!std::isnan(metrics.energy)) dest["energy"] = metrics.energy; - if (!isnanf(metrics.energyReturned)) + if (!std::isnan(metrics.energyReturned)) dest["energy_returned"] = metrics.energyReturned; - if (!isnanf(metrics.frequency)) + if (!std::isnan(metrics.frequency)) dest["frequency"] = metrics.frequency; - if (!isnanf(metrics.power)) + if (!std::isnan(metrics.power)) dest["power"] = metrics.power; - if (!isnanf(metrics.powerFactor)) + if (!std::isnan(metrics.powerFactor)) dest["power_factor"] = metrics.powerFactor; - if (!isnanf(metrics.voltage)) + if (!std::isnan(metrics.voltage)) dest["voltage"] = metrics.voltage; } #endif diff --git a/lib/MycilaRouter/MycilaRouter.cpp b/lib/MycilaRouter/MycilaRouter.cpp index 427249b3..a2ea30da 100644 --- a/lib/MycilaRouter/MycilaRouter.cpp +++ b/lib/MycilaRouter/MycilaRouter.cpp @@ -50,21 +50,21 @@ void Mycila::Router::toJson(const JsonObject& root, float voltage) const { } void Mycila::Router::toJson(const JsonObject& dest, const Metrics& metrics) { - if (!isnanf(metrics.apparentPower)) + if (!std::isnan(metrics.apparentPower)) dest["apparent_power"] = metrics.apparentPower; - if (!isnanf(metrics.current)) + if (!std::isnan(metrics.current)) dest["current"] = metrics.current; - if (!isnanf(metrics.energy)) + if (!std::isnan(metrics.energy)) dest["energy"] = metrics.energy; - if (!isnanf(metrics.power)) + if (!std::isnan(metrics.power)) dest["power"] = metrics.power; - if (!isnanf(metrics.powerFactor)) + if (!std::isnan(metrics.powerFactor)) dest["power_factor"] = metrics.powerFactor; - if (!isnanf(metrics.resistance)) + if (!std::isnan(metrics.resistance)) dest["resistance"] = metrics.resistance; - if (!isnanf(metrics.thdi)) + if (!std::isnan(metrics.thdi)) dest["thdi"] = metrics.thdi; - if (!isnanf(metrics.voltage)) + if (!std::isnan(metrics.voltage)) dest["voltage"] = metrics.voltage; } #endif @@ -84,7 +84,7 @@ void Mycila::Router::getRouterMetrics(Metrics& metrics, float voltage) const { metrics.powerFactor = metrics.apparentPower == 0 ? NAN : metrics.power / metrics.apparentPower; metrics.resistance = metrics.current == 0 ? NAN : metrics.power / (metrics.current * metrics.current); - metrics.thdi = metrics.powerFactor == 0 ? NAN : sqrt(1 / (metrics.powerFactor * metrics.powerFactor) - 1); + metrics.thdi = metrics.powerFactor == 0 ? NAN : std::sqrt(1.0f / (metrics.powerFactor * metrics.powerFactor) - 1.0f); if (_localMetrics.isPresent()) { metrics.energy = _localMetrics.get().energy; @@ -118,7 +118,7 @@ void Mycila::Router::getRouterMeasurements(Metrics& metrics) const { metrics.powerFactor = metrics.apparentPower == 0 ? NAN : metrics.power / metrics.apparentPower; metrics.resistance = metrics.current == 0 ? NAN : metrics.power / (metrics.current * metrics.current); - metrics.thdi = metrics.powerFactor == 0 ? NAN : sqrt(1 / (metrics.powerFactor * metrics.powerFactor) - 1); + metrics.thdi = metrics.powerFactor == 0 ? NAN : std::sqrt(1.0f / (metrics.powerFactor * metrics.powerFactor) - 1.0f); } } diff --git a/lib/MycilaRouter/MycilaRouterOutput.cpp b/lib/MycilaRouter/MycilaRouterOutput.cpp index 9d1c1f1c..e5b82f65 100644 --- a/lib/MycilaRouter/MycilaRouterOutput.cpp +++ b/lib/MycilaRouter/MycilaRouterOutput.cpp @@ -56,7 +56,7 @@ void Mycila::RouterOutput::toJson(const JsonObject& root, float gridVoltage) con root["enabled"] = isDimmerOnline(); root["state"] = getStateName(); float t = _temperature.orElse(NAN); - if (!isnanf(t)) { + if (!std::isnan(t)) { root["temperature"] = t; } @@ -83,23 +83,23 @@ void Mycila::RouterOutput::toJson(const JsonObject& root, float gridVoltage) con } void Mycila::RouterOutput::toJson(const JsonObject& dest, const Metrics& metrics) { - if (!isnanf(metrics.apparentPower)) + if (!std::isnan(metrics.apparentPower)) dest["apparent_power"] = metrics.apparentPower; - if (!isnanf(metrics.current)) + if (!std::isnan(metrics.current)) dest["current"] = metrics.current; - if (!isnanf(metrics.dimmedVoltage)) + if (!std::isnan(metrics.dimmedVoltage)) dest["energy"] = metrics.energy; - if (!isnanf(metrics.power)) + if (!std::isnan(metrics.power)) dest["power"] = metrics.power; - if (!isnanf(metrics.powerFactor)) + if (!std::isnan(metrics.powerFactor)) dest["power_factor"] = metrics.powerFactor; - if (!isnanf(metrics.resistance)) + if (!std::isnan(metrics.resistance)) dest["resistance"] = metrics.resistance; - if (!isnanf(metrics.thdi)) + if (!std::isnan(metrics.thdi)) dest["thdi"] = metrics.thdi; - if (!isnanf(metrics.voltage)) + if (!std::isnan(metrics.voltage)) dest["voltage"] = metrics.voltage; - if (!isnanf(metrics.dimmedVoltage)) + if (!std::isnan(metrics.dimmedVoltage)) dest["voltage_dimmed"] = metrics.dimmedVoltage; } #endif @@ -162,7 +162,7 @@ float Mycila::RouterOutput::autoDivert(float gridVoltage, float availablePowerTo return 0; } - if (isnan(config.calibratedResistance) || config.calibratedResistance <= 0) { + if (std::isnan(config.calibratedResistance) || config.calibratedResistance <= 0) { return 0; } @@ -313,11 +313,11 @@ void Mycila::RouterOutput::getOutputMetrics(Metrics& metrics, float gridVoltage) const float dutyCycle = getDimmerDutyCycleLive(); const float maxPower = metrics.resistance == 0 ? 0 : metrics.voltage * metrics.voltage / metrics.resistance; metrics.power = dutyCycle * maxPower; - metrics.powerFactor = sqrt(dutyCycle); + metrics.powerFactor = std::sqrt(dutyCycle); metrics.dimmedVoltage = metrics.powerFactor * metrics.voltage; metrics.current = metrics.resistance == 0 ? 0 : metrics.dimmedVoltage / metrics.resistance; metrics.apparentPower = metrics.current * metrics.voltage; - metrics.thdi = dutyCycle == 0 ? 0 : sqrt(1 / dutyCycle - 1); + metrics.thdi = dutyCycle == 0 ? 0 : std::sqrt(1 / dutyCycle - 1); } bool Mycila::RouterOutput::getOutputMeasurements(Metrics& metrics) const { diff --git a/lib/MycilaRouter/MycilaRouterRelay.cpp b/lib/MycilaRouter/MycilaRouterRelay.cpp index 7845f8f5..6ad5c3ce 100644 --- a/lib/MycilaRouter/MycilaRouterRelay.cpp +++ b/lib/MycilaRouter/MycilaRouterRelay.cpp @@ -22,7 +22,7 @@ extern Mycila::Logger logger; // in percentage // => 50W for a tri-phase 3000W resistance (1000W per phase) // => 35W for a tri-phase 2100W resistance (700W per phase) - #define MYCILA_RELAY_TOLERANCE 0.05 + #define MYCILA_RELAY_TOLERANCE 0.05f #endif #define TAG "RELAY" diff --git a/platformio.ini b/platformio.ini index 5efb4aaa..6cc82984 100644 --- a/platformio.ini +++ b/platformio.ini @@ -63,18 +63,18 @@ lib_deps = ESP32Async/AsyncTCP @ 3.3.2 ESP32Async/ESPAsyncWebServer @ 3.6.2 mathieucarbou/MycilaConfig @ 7.0.3 - mathieucarbou/MycilaDS18 @ 4.1.2 + mathieucarbou/MycilaDS18 @ 4.1.4 mathieucarbou/MycilaESPConnect @ 7.1.1 mathieucarbou/MycilaEasyDisplay @ 3.1.0 mathieucarbou/MycilaHADiscovery @ 6.0.1 - mathieucarbou/MycilaJSY @ 13.1.0 + mathieucarbou/MycilaJSY @ 13.1.1 mathieucarbou/MycilaLogger @ 3.2.1 mathieucarbou/MycilaMQTT @ 6.0.5 mathieucarbou/MycilaNTP @ 6.0.5 mathieucarbou/MycilaPulseAnalyzer @ 3.0.0 - mathieucarbou/MycilaPZEM004Tv3 @ 5.0.0 + mathieucarbou/MycilaPZEM004Tv3 @ 5.0.1 mathieucarbou/MycilaRelay @ 4.0.1 - mathieucarbou/MycilaSystem @ 4.0.0 + mathieucarbou/MycilaSystem @ 4.0.1 mathieucarbou/MycilaTaskManager @ 3.2.1 mathieucarbou/MycilaTaskMonitor @ 4.0.0 mathieucarbou/MycilaTrafficLight @ 2.0.2 diff --git a/src/yasolr_config.cpp b/src/yasolr_config.cpp index cf9ee188..4360c25f 100644 --- a/src/yasolr_config.cpp +++ b/src/yasolr_config.cpp @@ -151,15 +151,15 @@ void yasolr_init_config() { } else if (key == KEY_OUTPUT1_DIMMER_MIN) { if (output1) - output1->setDimmerDutyCycleMin(config.getFloat(KEY_OUTPUT1_DIMMER_MIN) / 100); + output1->setDimmerDutyCycleMin(config.getFloat(KEY_OUTPUT1_DIMMER_MIN) / 100.0f); } else if (key == KEY_OUTPUT1_DIMMER_MAX) { if (output1) - output1->setDimmerDutyCycleMax(config.getFloat(KEY_OUTPUT1_DIMMER_MAX) / 100); + output1->setDimmerDutyCycleMax(config.getFloat(KEY_OUTPUT1_DIMMER_MAX) / 100.0f); } else if (key == KEY_OUTPUT1_DIMMER_LIMIT) { if (output1) - output1->setDimmerDutyCycleLimit(config.getFloat(KEY_OUTPUT1_DIMMER_LIMIT) / 100); + output1->setDimmerDutyCycleLimit(config.getFloat(KEY_OUTPUT1_DIMMER_LIMIT) / 100.0f); } else if (key == KEY_OUTPUT1_DIMMER_TEMP_LIMITER) { if (output1) @@ -205,15 +205,15 @@ void yasolr_init_config() { } else if (key == KEY_OUTPUT2_DIMMER_MIN) { if (output2) - output2->setDimmerDutyCycleMin(config.getFloat(KEY_OUTPUT2_DIMMER_MIN) / 100); + output2->setDimmerDutyCycleMin(config.getFloat(KEY_OUTPUT2_DIMMER_MIN) / 100.0f); } else if (key == KEY_OUTPUT2_DIMMER_MAX) { if (output2) - output2->setDimmerDutyCycleMax(config.getFloat(KEY_OUTPUT2_DIMMER_MAX) / 100); + output2->setDimmerDutyCycleMax(config.getFloat(KEY_OUTPUT2_DIMMER_MAX) / 100.0f); } else if (key == KEY_OUTPUT2_DIMMER_LIMIT) { if (output2) - output2->setDimmerDutyCycleLimit(config.getFloat(KEY_OUTPUT2_DIMMER_LIMIT) / 100); + output2->setDimmerDutyCycleLimit(config.getFloat(KEY_OUTPUT2_DIMMER_LIMIT) / 100.0f); } else if (key == KEY_OUTPUT2_DIMMER_TEMP_LIMITER) { if (output2) diff --git a/src/yasolr_dashboard.cpp b/src/yasolr_dashboard.cpp index ed8a2be3..2cc411ed 100644 --- a/src/yasolr_dashboard.cpp +++ b/src/yasolr_dashboard.cpp @@ -1409,7 +1409,7 @@ void YaSolR::Website::updateCards() { _routerPower.setValue(routerMetrics.power); _routerApparentPower.setValue(routerMetrics.apparentPower); _routerPowerFactor.setValue(routerMetrics.powerFactor); - _routerTHDi.setValue(routerMetrics.thdi * 100); + _routerTHDi.setValue(routerMetrics.thdi * 100.0f); _routerVoltage.setValue(gridMetrics.voltage); _routerCurrent.setValue(routerMetrics.current); _routerResistance.setValue(routerMetrics.resistance); @@ -1438,7 +1438,7 @@ void YaSolR::Website::updateCards() { break; } _output1DS18State.setValue(output1->temperature().orElse(NAN)); - _output1DimmerSlider.setValue(output1->getDimmerDutyCycle() * 100); + _output1DimmerSlider.setValue(output1->getDimmerDutyCycle() * 100.0f); _output1Bypass.setValue(output1->isBypassOn()); } @@ -1460,7 +1460,7 @@ void YaSolR::Website::updateCards() { break; } _output2DS18State.setValue(output2->temperature().orElse(NAN)); - _output2DimmerSlider.setValue(output2->getDimmerDutyCycle() * 100); + _output2DimmerSlider.setValue(output2->getDimmerDutyCycle() * 100.0f); _output2Bypass.setValue(output2->isBypassOn()); } @@ -1476,11 +1476,11 @@ void YaSolR::Website::updateCards() { Mycila::RouterOutput::Metrics output1Measurements; output1->getOutputMeasurements(output1Measurements); - _output1DimmerSliderRO.setValue(output1->getDimmerDutyCycleLive() * 100); + _output1DimmerSliderRO.setValue(output1->getDimmerDutyCycleLive() * 100.0f); _output1Power.setValue(output1Measurements.power); _output1ApparentPower.setValue(output1Measurements.apparentPower); _output1PowerFactor.setValue(output1Measurements.powerFactor); - _output1THDi.setValue(output1Measurements.thdi * 100); + _output1THDi.setValue(output1Measurements.thdi * 100.0f); _output1Voltage.setValue(output1Measurements.dimmedVoltage); _output1Current.setValue(output1Measurements.current); _output1Resistance.setValue(output1Measurements.resistance); @@ -1494,11 +1494,11 @@ void YaSolR::Website::updateCards() { Mycila::RouterOutput::Metrics output2Measurements; output2->getOutputMeasurements(output2Measurements); - _output2DimmerSliderRO.setValue(output2->getDimmerDutyCycleLive() * 100); + _output2DimmerSliderRO.setValue(output2->getDimmerDutyCycleLive() * 100.0f); _output2Power.setValue(output2Measurements.power); _output2ApparentPower.setValue(output2Measurements.apparentPower); _output2PowerFactor.setValue(output2Measurements.powerFactor); - _output2THDi.setValue(output2Measurements.thdi * 100); + _output2THDi.setValue(output2Measurements.thdi * 100.0f); _output2Voltage.setValue(output2Measurements.dimmedVoltage); _output2Current.setValue(output2Measurements.current); _output2Resistance.setValue(output2Measurements.resistance); @@ -1541,9 +1541,9 @@ void YaSolR::Website::updateCharts() { memmove(&_routerTHDiHistoryY[0], &_routerTHDiHistoryY[1], sizeof(_routerTHDiHistoryY) - sizeof(*_routerTHDiHistoryY)); // set new value - _gridPowerHistoryY[YASOLR_GRAPH_POINTS - 1] = round(grid.getPower().orElse(0)); - _routedPowerHistoryY[YASOLR_GRAPH_POINTS - 1] = round(routerMetrics.power); - _routerTHDiHistoryY[YASOLR_GRAPH_POINTS - 1] = isnan(routerMetrics.thdi) ? 0 : round(routerMetrics.thdi * 100); + _gridPowerHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(grid.getPower().orElse(0)); + _routedPowerHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(routerMetrics.power); + _routerTHDiHistoryY[YASOLR_GRAPH_POINTS - 1] = std::isnan(routerMetrics.thdi) ? 0 : std::round(routerMetrics.thdi * 100.0f); // update charts _gridPowerHistory.setY(_gridPowerHistoryY, YASOLR_GRAPH_POINTS); @@ -1563,13 +1563,13 @@ void YaSolR::Website::updatePIDCharts() { memmove(&_pidDTermHistoryY[0], &_pidDTermHistoryY[1], sizeof(_pidDTermHistoryY) - sizeof(*_pidDTermHistoryY)); // set new values - _pidInputHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getInput()); - _pidOutputHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getOutput()); - _pidErrorHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getError()); - _pidSumHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getSum()); - _pidPTermHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getPTerm()); - _pidITermHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getITerm()); - _pidDTermHistoryY[YASOLR_GRAPH_POINTS - 1] = round(pidController.getDTerm()); + _pidInputHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getInput()); + _pidOutputHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getOutput()); + _pidErrorHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getError()); + _pidSumHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getSum()); + _pidPTermHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getPTerm()); + _pidITermHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getITerm()); + _pidDTermHistoryY[YASOLR_GRAPH_POINTS - 1] = std::round(pidController.getDTerm()); // update charts _pidInputHistory.setY(_pidInputHistoryY, YASOLR_GRAPH_POINTS); diff --git a/src/yasolr_display.cpp b/src/yasolr_display.cpp index 92741389..9e51c26a 100644 --- a/src/yasolr_display.cpp +++ b/src/yasolr_display.cpp @@ -114,14 +114,14 @@ void yasolr_init_display() { break; } case 5: { - display->home.printf("Grid P: %9d W", static_cast(round(grid.getPower().orElse(0)))); + display->home.printf("Grid P: %9d W", static_cast(std::round(grid.getPower().orElse(0)))); wrote = true; break; } case 6: { Mycila::Router::Metrics routerMetrics; router.getRouterMeasurements(routerMetrics); - display->home.printf("Router P: %9d W", static_cast(round(routerMetrics.power))); + display->home.printf("Router P: %9d W", static_cast(std::round(routerMetrics.power))); wrote = true; break; } @@ -143,7 +143,7 @@ void yasolr_init_display() { } case 9: { if (output1 && output1->isDimmerEnabled()) { - display->home.printf("Output 1 Duty: %4d %%", static_cast(round(output1->getDimmerDutyCycleLive() * 100))); + display->home.printf("Output 1 Duty: %4d %%", static_cast(std::round(output1->getDimmerDutyCycleLive() * 100.0f))); wrote = true; } break; @@ -166,7 +166,7 @@ void yasolr_init_display() { } case 12: { if (output2 && output2->isDimmerEnabled()) { - display->home.printf("Output 2 Duty: %4d %%", static_cast(round(output2->getDimmerDutyCycleLive() * 100))); + display->home.printf("Output 2 Duty: %4d %%", static_cast(std::round(output2->getDimmerDutyCycleLive() * 100.0f))); wrote = true; } break; diff --git a/src/yasolr_ds18.cpp b/src/yasolr_ds18.cpp index a894dda1..f0717edb 100644 --- a/src/yasolr_ds18.cpp +++ b/src/yasolr_ds18.cpp @@ -17,7 +17,7 @@ void yasolr_init_ds18() { assert(!ds18Sys); ds18Sys = new Mycila::DS18(); - ds18Sys->begin(config.getLong(KEY_PIN_ROUTER_DS18)); + ds18Sys->begin(config.getLong(KEY_PIN_ROUTER_DS18), YASOLR_DS18_SEARCH_MAX_RETRY); if (ds18Sys->isEnabled()) { count++; @@ -40,7 +40,7 @@ void yasolr_init_ds18() { assert(!ds18O1); ds18O1 = new Mycila::DS18(); - ds18O1->begin(config.getLong(KEY_PIN_OUTPUT1_DS18)); + ds18O1->begin(config.getLong(KEY_PIN_OUTPUT1_DS18), YASOLR_DS18_SEARCH_MAX_RETRY); if (ds18O1->isEnabled()) { count++; @@ -71,7 +71,7 @@ void yasolr_init_ds18() { assert(!ds18O2); ds18O2 = new Mycila::DS18(); - ds18O2->begin(config.getLong(KEY_PIN_OUTPUT2_DS18)); + ds18O2->begin(config.getLong(KEY_PIN_OUTPUT2_DS18), YASOLR_DS18_SEARCH_MAX_RETRY); if (ds18O2->isEnabled()) { count++; diff --git a/src/yasolr_grid.cpp b/src/yasolr_grid.cpp index 96ae4415..989a5850 100644 --- a/src/yasolr_grid.cpp +++ b/src/yasolr_grid.cpp @@ -7,18 +7,18 @@ Mycila::Grid grid; float yasolr_frequency() { - float frequency = round(grid.getFrequency().value_or(NAN)); + float frequency = std::round(grid.getFrequency().value_or(NAN)); if (frequency > 0) return frequency; if (pzemO1) { - frequency = round(pzemO1->data.frequency); + frequency = std::round(pzemO1->data.frequency); if (frequency > 0) return frequency; } if (pzemO2) { - frequency = round(pzemO2->data.frequency); + frequency = std::round(pzemO2->data.frequency); if (frequency > 0) return frequency; } diff --git a/src/yasolr_jsy.cpp b/src/yasolr_jsy.cpp index 3129963f..4b4eadec 100644 --- a/src/yasolr_jsy.cpp +++ b/src/yasolr_jsy.cpp @@ -107,7 +107,7 @@ void yasolr_init_jsy() { if (config.getBool(KEY_ENABLE_DEBUG)) jsyTask->enableProfiling(10, Mycila::TaskTimeUnit::MILLISECONDS); - assert(jsyTaskManager->asyncStart(512 * 4, 5, 0, 100, true)); + assert(jsyTaskManager->asyncStart(512 * 5, 5, 0, 100, true)); Mycila::TaskMonitor.addTask(jsyTaskManager->getName()); } diff --git a/src/yasolr_mqtt.cpp b/src/yasolr_mqtt.cpp index 8935bfa9..faf186e7 100644 --- a/src/yasolr_mqtt.cpp +++ b/src/yasolr_mqtt.cpp @@ -101,12 +101,12 @@ void subscribe() { mqtt->subscribe(baseTopic + "/router/output1/duty_cycle/set", [](const std::string& topic, const std::string_view& payload) { if (output1) - output1->setDimmerDutyCycle(std::stof(std::string(payload)) / 100); + output1->setDimmerDutyCycle(std::stof(std::string(payload)) / 100.0f); }); mqtt->subscribe(baseTopic + "/router/output2/duty_cycle/set", [](const std::string& topic, const std::string_view& payload) { if (output2) - output2->setDimmerDutyCycle(std::stof(std::string(payload)) / 100); + output2->setDimmerDutyCycle(std::stof(std::string(payload)) / 100.0f); }); mqtt->subscribe(baseTopic + "/router/output1/bypass/set", [](const std::string& topic, const std::string_view& payload) { @@ -285,7 +285,7 @@ void publishData() { mqtt->publish(baseTopic + "/router/current", std::to_string(routerMeasurements.current)); mqtt->publish(baseTopic + "/router/energy", std::to_string(routerMeasurements.energy)); mqtt->publish(baseTopic + "/router/lights", lights.toString()); - mqtt->publish(baseTopic + "/router/power_factor", isnan(routerMeasurements.powerFactor) ? "0" : std::to_string(routerMeasurements.powerFactor)); + mqtt->publish(baseTopic + "/router/power_factor", std::isnan(routerMeasurements.powerFactor) ? "0" : std::to_string(routerMeasurements.powerFactor)); mqtt->publish(baseTopic + "/router/power", std::to_string(routerMeasurements.power)); if (relay1) mqtt->publish(baseTopic + "/router/relay1", YASOLR_STATE(relay1->isOn())); @@ -293,9 +293,9 @@ void publishData() { mqtt->publish(baseTopic + "/router/relay2", YASOLR_STATE(relay2->isOn())); if (ds18Sys) mqtt->publish(baseTopic + "/router/temperature", std::to_string(ds18Sys->getTemperature().value_or(0))); - mqtt->publish(baseTopic + "/router/thdi", isnan(routerMeasurements.thdi) ? "0" : std::to_string(routerMeasurements.thdi)); + mqtt->publish(baseTopic + "/router/thdi", std::isnan(routerMeasurements.thdi) ? "0" : std::to_string(routerMeasurements.thdi)); float virtual_grid_power = gridMetrics.power - routerMeasurements.power; - mqtt->publish(baseTopic + "/router/virtual_grid_power", isnan(virtual_grid_power) ? "0" : std::to_string(virtual_grid_power)); + mqtt->publish(baseTopic + "/router/virtual_grid_power", std::isnan(virtual_grid_power) ? "0" : std::to_string(virtual_grid_power)); yield(); for (const auto& output : router.getOutputs()) { @@ -303,7 +303,7 @@ void publishData() { mqtt->publish(outputTopic + "/state", output->getStateName()); mqtt->publish(outputTopic + "/bypass", YASOLR_STATE(output->isBypassOn())); mqtt->publish(outputTopic + "/dimmer", YASOLR_STATE(output->isDimmerOn())); - mqtt->publish(outputTopic + "/duty_cycle", std::to_string(output->getDimmerDutyCycle() * 100)); + mqtt->publish(outputTopic + "/duty_cycle", std::to_string(output->getDimmerDutyCycle() * 100.0f)); mqtt->publish(outputTopic + "/temperature", std::to_string(output->temperature().orElse(0))); yield(); } diff --git a/src/yasolr_router.cpp b/src/yasolr_router.cpp index 77ae22da..e283c89b 100644 --- a/src/yasolr_router.cpp +++ b/src/yasolr_router.cpp @@ -175,9 +175,9 @@ void initOutput1(uint16_t semiPeriod) { output1 = new Mycila::RouterOutput("output1", *dimmer, bypassRelay); dimmer->setSemiPeriod(semiPeriod); - dimmer->setDutyCycleMin(config.getFloat(KEY_OUTPUT1_DIMMER_MIN) / 100); - dimmer->setDutyCycleMax(config.getFloat(KEY_OUTPUT1_DIMMER_MAX) / 100); - dimmer->setDutyCycleLimit(config.getFloat(KEY_OUTPUT1_DIMMER_LIMIT) / 100); + dimmer->setDutyCycleMin(config.getFloat(KEY_OUTPUT1_DIMMER_MIN) / 100.0f); + dimmer->setDutyCycleMax(config.getFloat(KEY_OUTPUT1_DIMMER_MAX) / 100.0f); + dimmer->setDutyCycleLimit(config.getFloat(KEY_OUTPUT1_DIMMER_LIMIT) / 100.0f); output1->config.autoBypass = config.getBool(KEY_ENABLE_OUTPUT1_AUTO_BYPASS); output1->config.autoDimmer = config.getBool(KEY_ENABLE_OUTPUT1_AUTO_DIMMER); @@ -211,9 +211,9 @@ void initOutput2(uint16_t semiPeriod) { output2 = new Mycila::RouterOutput("output2", *dimmer, bypassRelay); dimmer->setSemiPeriod(semiPeriod); - dimmer->setDutyCycleMin(config.getFloat(KEY_OUTPUT2_DIMMER_MIN) / 100); - dimmer->setDutyCycleMax(config.getFloat(KEY_OUTPUT2_DIMMER_MAX) / 100); - dimmer->setDutyCycleLimit(config.getFloat(KEY_OUTPUT2_DIMMER_LIMIT) / 100); + dimmer->setDutyCycleMin(config.getFloat(KEY_OUTPUT2_DIMMER_MIN) / 100.0f); + dimmer->setDutyCycleMax(config.getFloat(KEY_OUTPUT2_DIMMER_MAX) / 100.0f); + dimmer->setDutyCycleLimit(config.getFloat(KEY_OUTPUT2_DIMMER_LIMIT) / 100.0f); output2->config.autoBypass = config.getBool(KEY_ENABLE_OUTPUT2_AUTO_BYPASS); output2->config.autoDimmer = config.getBool(KEY_ENABLE_OUTPUT2_AUTO_DIMMER); @@ -270,7 +270,7 @@ void yasolr_init_router() { // Do we have a user defined frequency? const float frequency = config.getFloat(KEY_GRID_FREQUENCY); - const uint16_t semiPeriod = frequency ? 1000000 / 2 / frequency : 0; + const uint16_t semiPeriod = frequency ? 500000.0f / frequency : 0; initOutput1(semiPeriod); initOutput2(semiPeriod); @@ -304,7 +304,7 @@ void yasolr_init_router() { if (pulseAnalyzer->isOnline()) { if (!Thyristor::getSemiPeriod() || (zcDimmer1 && !zcDimmer1->getSemiPeriod()) || (zcDimmer2 && !zcDimmer2->getSemiPeriod())) { const float frequency = yasolr_frequency(); - const uint16_t semiPeriod = frequency ? 1000000 / 2 / frequency : 0; + const uint16_t semiPeriod = frequency ? 500000.0f / frequency : 0; if (semiPeriod) { logger.info(TAG, "Detected grid frequency: %.2f Hz with semi-period: %" PRIu16 " us", frequency, semiPeriod); diff --git a/src/yasolr_web_server.cpp b/src/yasolr_web_server.cpp index 285c037d..1da3ba44 100644 --- a/src/yasolr_web_server.cpp +++ b/src/yasolr_web_server.cpp @@ -393,7 +393,7 @@ void rest_api() { webServer .on("/api/router/output1/dimmer", HTTP_POST, [](AsyncWebServerRequest* request) { if (output1 && request->hasParam("duty_cycle", true)) { - output1->setDimmerDutyCycle(request->getParam("duty_cycle", true)->value().toFloat() / 100); + output1->setDimmerDutyCycle(request->getParam("duty_cycle", true)->value().toFloat() / 100.0f); request->send(200); } else { request->send(400); @@ -403,7 +403,7 @@ void rest_api() { webServer .on("/api/router/output2/dimmer", HTTP_POST, [](AsyncWebServerRequest* request) { if (output2 && request->hasParam("duty_cycle", true)) { - output2->setDimmerDutyCycle(request->getParam("duty_cycle", true)->value().toFloat() / 100); + output2->setDimmerDutyCycle(request->getParam("duty_cycle", true)->value().toFloat() / 100.0f); request->send(200); } else { request->send(400); @@ -455,11 +455,11 @@ void rest_api() { root["relay2"] = YASOLR_STATE(relay2->isOn()); if (ds18Sys) { float t = ds18Sys->getTemperature().value_or(NAN); - if (!isnanf(t)) + if (!std::isnan(t)) root["temperature"] = t; } float virtual_grid_power = grid.getPower().orElse(NAN) - routerMeasurements.power; - if (!isnanf(virtual_grid_power)) + if (!std::isnan(virtual_grid_power)) root["virtual_grid_power"] = virtual_grid_power; Mycila::Router::toJson(root["measurements"].to(), routerMeasurements); @@ -469,9 +469,9 @@ void rest_api() { json["state"] = output->getStateName(); json["bypass"] = YASOLR_STATE(output->isBypassOn()); json["dimmer"] = YASOLR_STATE(output->isDimmerOn()); - json["duty_cycle"] = output->getDimmerDutyCycle() * 100; + json["duty_cycle"] = output->getDimmerDutyCycle() * 100.0f; float t = output->temperature().orElse(NAN); - if (!isnanf(t)) { + if (!std::isnan(t)) { json["temperature"] = t; }