From e6d41f66976da847ebaa69587bb1cf619e5231a2 Mon Sep 17 00:00:00 2001 From: Proddy Date: Thu, 23 Feb 2023 19:26:25 +0100 Subject: [PATCH] added Michael's changes --- src/analogsensor.cpp | 101 +++++++++++++++++++++++++-------- src/analogsensor.h | 2 +- src/dallassensor.cpp | 4 +- src/devices/boiler.cpp | 1 + src/devices/heatpump.cpp | 29 +++++++++- src/devices/heatpump.h | 33 ++++++----- src/devices/solar.cpp | 2 + src/devices/solar.h | 1 + src/devices/thermostat.cpp | 10 ++-- src/web/WebSettingsService.cpp | 12 +--- 10 files changed, 136 insertions(+), 59 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 2a36ffce2..1a77c3272 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2023 Paul Derbyshire + * Copyright 2020 Paul Derbyshire * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -68,7 +68,7 @@ void AnalogSensor::reload() { analog_enabled_ = true; // for local offline testing #endif for (auto sensor : sensors_) { - remove_ha_topic(sensor.gpio()); + remove_ha_topic(sensor.type(), sensor.gpio()); sensor.ha_registered = false; } if (!analog_enabled_) { @@ -236,15 +236,13 @@ void AnalogSensor::measure() { for (auto & sensor : sensors_) { if (sensor.type() == AnalogType::ADC) { uint16_t a = analogReadMilliVolts(sensor.gpio()); // e.g. ADC1_CHANNEL_0_GPIO_NUM - - if (!sensor.analog_) { // init first time + if (!sensor.analog_) { // init first time sensor.analog_ = a; sensor.sum_ = a * 512; } else { // simple moving average filter sensor.sum_ = (sensor.sum_ * 511) / 512 + a; sensor.analog_ = sensor.sum_ / 512; } - // detect change with little hysteresis on raw mV value if (sensor.last_reading_ + 1 < sensor.analog_ || sensor.last_reading_ > sensor.analog_ + 1) { sensor.set_value(((int32_t)sensor.analog_ - sensor.offset()) * sensor.factor()); @@ -256,7 +254,6 @@ void AnalogSensor::measure() { } } } - // poll digital io every time with debounce // go through the list of digital sensors for (auto & sensor : sensors_) { @@ -264,12 +261,10 @@ void AnalogSensor::measure() { || sensor.type() == AnalogType::RATE) { auto old_value = sensor.value(); // remember current value before reading auto current_reading = digitalRead(sensor.gpio()); - if (sensor.poll_ != current_reading) { // check for pinchange sensor.polltime_ = uuid::get_uptime(); // remember time of pinchange sensor.poll_ = current_reading; } - // debounce and check for real pinchange if (uuid::get_uptime() - sensor.polltime_ >= 15 && sensor.poll_ != sensor.last_reading_) { sensor.last_reading_ = sensor.poll_; @@ -286,7 +281,6 @@ void AnalogSensor::measure() { sensor.last_polltime_ = sensor.polltime_; } } - // see if there is a change and increment # reads if (old_value != sensor.value()) { sensorreads_++; @@ -339,7 +333,7 @@ bool AnalogSensor::update(uint8_t gpio, const std::string & name, double offset, // if the sensor exists and we're using HA, delete the old HA record if (found_sensor && Mqtt::ha_enabled()) { - remove_ha_topic(gpio); // the GPIO + remove_ha_topic(type, gpio); // the GPIO } // we didn't find it, it's new, so create and store it @@ -377,7 +371,7 @@ bool AnalogSensor::updated_values() { // publish a single sensor to MQTT void AnalogSensor::publish_sensor(const Sensor & sensor) const { - if (Mqtt::enabled() && Mqtt::publish_single()) { + if (Mqtt::publish_single()) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; if (Mqtt::publish_single2cmd()) { snprintf(topic, sizeof(topic), "%s/%s", F_(analogsensor), sensor.name().c_str()); @@ -390,23 +384,34 @@ void AnalogSensor::publish_sensor(const Sensor & sensor) const { } // send empty config topic to remove the entry from HA -void AnalogSensor::remove_ha_topic(const uint8_t gpio) const { +void AnalogSensor::remove_ha_topic(const int8_t type, const uint8_t gpio) const { if (!Mqtt::ha_enabled()) { return; } LOG_DEBUG("Removing HA config for analog sensor GPIO %02d", gpio); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), gpio); + +#if CONFIG_IDF_TARGET_ESP32 + if (type == AnalogType::DIGITAL_OUT && gpio != 25 && gpio != 26) { +#else + if (type == AnalogType::DIGITAL_OUT) { +#endif + snprintf(topic, sizeof(topic), "switch/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), gpio); + } else if (type == AnalogType::DIGITAL_OUT) { // DAC + snprintf(topic, sizeof(topic), "number/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), gpio); + } else if (type >= AnalogType::PWM_0) { + snprintf(topic, sizeof(topic), "number/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), gpio); + } else if (type == AnalogType::DIGITAL_IN) { + snprintf(topic, sizeof(topic), "binary-sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), gpio); + } else { + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), gpio); + } Mqtt::queue_remove_topic(topic); } // send all sensor values as a JSON package to MQTT void AnalogSensor::publish_values(const bool force) { - if (!Mqtt::enabled()) { - return; - } - uint8_t num_sensors = sensors_.size(); if (num_sensors == 0) { @@ -474,8 +479,8 @@ void AnalogSensor::publish_values(const bool force) { snprintf(uniq_s, sizeof(uniq_s), "analogsensor_%02d", sensor.gpio()); } - config["object_id"] = uniq_s; - config["uniq_id"] = uniq_s; // same as object_id + config["obj_id"] = uniq_s; + config["uniq_id"] = uniq_s; // same as object_id char name[50]; snprintf(name, sizeof(name), "%s", sensor.name().c_str()); @@ -485,6 +490,59 @@ void AnalogSensor::publish_values(const bool force) { config["unit_of_meas"] = EMSdevice::uom_to_string(sensor.uom()); } + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + + // Set commands for some analog types + char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; +#if CONFIG_IDF_TARGET_ESP32 + if (sensor.type() == AnalogType::DIGITAL_OUT && sensor.gpio() != 25 && sensor.gpio() != 26) { +#else + if (sensor.type() == AnalogType::DIGITAL_OUT) { +#endif + snprintf(topic, sizeof(topic), "switch/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); + snprintf(command_topic, sizeof(command_topic), "%s/analogsensor/%s", Mqtt::basename().c_str(), sensor.name().c_str()); + config["cmd_t"] = command_topic; + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + config["pl_on"] = true; + config["pl_off"] = false; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + config["pl_on"] = 1; + config["pl_off"] = 0; + } else { + char result[12]; + config["pl_on"] = Helpers::render_boolean(result, true); + config["pl_off"] = Helpers::render_boolean(result, false); + } + } else if (sensor.type() == AnalogType::DIGITAL_OUT) { // DAC + snprintf(topic, sizeof(topic), "number/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); + snprintf(command_topic, sizeof(command_topic), "%s/analogsensor/%s", Mqtt::basename().c_str(), sensor.name().c_str()); + config["cmd_t"] = command_topic; + config["min"] = 0; + config["max"] = 255; + config["mode"] = "box"; // auto, slider or box + config["step"] = 1; + } else if (sensor.type() >= AnalogType::PWM_0) { + snprintf(topic, sizeof(topic), "number/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); + snprintf(command_topic, sizeof(command_topic), "%s/analogsensor/%s", Mqtt::basename().c_str(), sensor.name().c_str()); + config["cmd_t"] = command_topic; + config["min"] = 0; + config["max"] = 100; + config["mode"] = "box"; // auto, slider or box + config["step"] = 0.1; + } else if (sensor.type() == AnalogType::COUNTER) { + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); + snprintf(command_topic, sizeof(command_topic), "%s/analogsensor/%s", Mqtt::basename().c_str(), sensor.name().c_str()); + config["cmd_t"] = command_topic; + config["stat_cla"] = "total_increasing"; + // config["mode"] = "box"; // auto, slider or box + // config["step"] = sensor.factor(); + } else if (sensor.type() == AnalogType::DIGITAL_IN) { + snprintf(topic, sizeof(topic), "binary-sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); + } else { + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); + config["stat_cla"] = "measurement"; + } + JsonObject dev = config.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); ids.add("ems-esp"); @@ -492,9 +550,6 @@ void AnalogSensor::publish_values(const bool force) { // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio()); - Mqtt::queue_ha(topic, config.as()); sensor.ha_registered = true; @@ -705,7 +760,7 @@ bool AnalogSensor::command_commands(const char * value, const int8_t id, JsonObj } // hard coded tests -#if defined(EMSESP_TEST) +#ifdef EMSESP_TEST void AnalogSensor::test() { sensors_.emplace_back(36, "test12", 0, 0.1, 17, AnalogType::ADC); sensors_.back().set_value(12.4); diff --git a/src/analogsensor.h b/src/analogsensor.h index cf391c394..b6c20dc42 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -170,7 +170,7 @@ class AnalogSensor { static uuid::log::Logger logger_; - void remove_ha_topic(const uint8_t id) const; + void remove_ha_topic(const int8_t type, const uint8_t id) const; bool command_setvalue(const char * value, const int8_t gpio); void measure(); bool command_info(const char * value, const int8_t id, JsonObject & output) const; diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 278315940..48114a80f 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -534,8 +534,8 @@ void DallasSensor::publish_values(const bool force) { snprintf(uniq_s, sizeof(uniq_s), "dallassensor_%s", sensor.id().c_str()); } - config["object_id"] = uniq_s; - config["uniq_id"] = uniq_s; // same as object_id + config["obj_id"] = uniq_s; + config["uniq_id"] = uniq_s; // same as object_id/obj_id char name[50]; snprintf(name, sizeof(name), "%s", sensor.name().c_str()); diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 1b56edb70..488a7fcbf 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -1712,6 +1712,7 @@ bool Boiler::set_flow_temp(const char * value, const int8_t id) { // no write/verify if there is no change, see https://github.com/emsesp/EMS-ESP32/issues/654 if (v == selFlowTemp_) { + EMSESP::txservice_.add(Telegram::Operation::TX_WRITE, device_id(), EMS_TYPE_UBASetPoints, 0, (uint8_t *)&v, 1, 0, false); return true; } diff --git a/src/devices/heatpump.cpp b/src/devices/heatpump.cpp index ecc38b3c7..265488e63 100644 --- a/src/devices/heatpump.cpp +++ b/src/devices/heatpump.cpp @@ -32,14 +32,25 @@ Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, c register_telegram_type(0x999, "HPFunctionTest", true, MAKE_PF_CB(process_HPFunctionTest)); register_telegram_type(0x9A0, "HPTemperature", false, MAKE_PF_CB(process_HPTemperature)); register_telegram_type(0x99B, "HPFlowTemp", false, MAKE_PF_CB(process_HPFlowTemp)); + register_telegram_type(0x99C, "HPComp", false, MAKE_PF_CB(process_HPComp)); // device values register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &airHumidity_, DeviceValueType::UINT, FL_(airHumidity), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dewTemperature_, DeviceValueType::UINT, FL_(dewTemperature), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &flowTemp_, DeviceValueType::UINT, FL_(curFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retTemp_, DeviceValueType::UINT, FL_(retTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &sysRetTemp_, DeviceValueType::UINT, FL_(sysRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &flowTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(curFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(retTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &sysRetTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(sysRetTemp), + DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTa4_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTa4), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr1_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTr1), DeviceValueUOM::DEGREES); @@ -51,6 +62,9 @@ Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, c register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpJr0_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpPl1), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpJr1_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpPh1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPumpMod_, DeviceValueType::UINT, FL_(heatingPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCompSpd_, DeviceValueType::UINT, FL_(hpCompSpd), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &controlStrategy_, DeviceValueType::ENUM, @@ -177,6 +191,7 @@ void Heatpump::process_HPFlowTemp(std::shared_ptr telegram) { has_update(telegram, flowTemp_, 4); has_update(telegram, retTemp_, 6); has_update(telegram, sysRetTemp_, 14); + has_update(telegram, heatingPumpMod_, 19); } // 0x0998 HPSettings @@ -193,6 +208,14 @@ void Heatpump::process_HPSettings(std::shared_ptr telegram) { has_update(telegram, switchOverTemp_, 14); } +// 0x099C HPComp +// Broadcast (0x099C), data: 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 76 00 00 +// data: 00 2B 00 03 04 13 00 00 00 00 00 02 02 02 (offset 24) +void Heatpump::process_HPComp(std::shared_ptr telegram) { + has_update(telegram, hpCompSpd_, 51); +} + +// 0x999 HPFunctionTest void Heatpump::process_HPFunctionTest(std::shared_ptr telegram) { has_update(telegram, airPurgeMode_, 0); has_update(telegram, heatPumpOutput_, 2); diff --git a/src/devices/heatpump.h b/src/devices/heatpump.h index 5e6420423..e13aad81f 100644 --- a/src/devices/heatpump.h +++ b/src/devices/heatpump.h @@ -41,6 +41,8 @@ class Heatpump : public EMSdevice { uint8_t energyPriceEl_; uint8_t energyPricePV_; int8_t switchOverTemp_; + uint8_t heatingPumpMod_; + uint8_t hpCompSpd_; // Function test uint8_t airPurgeMode_; @@ -50,20 +52,20 @@ class Heatpump : public EMSdevice { uint8_t heatDrainPan_; uint8_t heatCable_; - // HM200 temperature - int16_t flowTemp_; - int16_t retTemp_; - int16_t sysRetTemp_; - int16_t hpTc3_; // condenser temp. - int16_t hpTr1_; // compressor temp. - int16_t hpTr3_; // cond. temp. heating - int16_t hpTr4_; // cond. temp. clg - int16_t hpTr5_; // suction line temp. - int16_t hpTr6_; // hot gas temp. - int16_t hpTl2_; // inlet air temperature - int16_t hpTa4_; // drain pan temp. - int16_t hpJr0_; // low pressure sensor - int16_t hpJr1_; // high pressure sensor + // HM200 temperatures + int16_t flowTemp_; // TH1 + int16_t retTemp_; // TH2 + int16_t sysRetTemp_; // TH3 + int16_t hpTc3_; // condenser temp. + int16_t hpTr1_; // compressor temp. + int16_t hpTr3_; // cond. temp. heating + int16_t hpTr4_; // cond. temp. clg + int16_t hpTr5_; // suction line temp. + int16_t hpTr6_; // hot gas temp. + int16_t hpTl2_; // inlet air temperature + int16_t hpTa4_; // drain pan temp. + int16_t hpJr0_; // low pressure sensor + int16_t hpJr1_; // high pressure sensor void process_HPMonitor1(std::shared_ptr telegram); void process_HPMonitor2(std::shared_ptr telegram); @@ -71,6 +73,8 @@ class Heatpump : public EMSdevice { void process_HPFunctionTest(std::shared_ptr telegram); void process_HPTemperature(std::shared_ptr telegram); void process_HPFlowTemp(std::shared_ptr telegram); + void process_HPComp(std::shared_ptr telegram); + bool set_controlStrategy(const char * value, const int8_t id); bool set_lowNoiseMode(const char * value, const int8_t id); bool set_lowNoiseStart(const char * value, const int8_t id); @@ -80,7 +84,6 @@ class Heatpump : public EMSdevice { bool set_energyPriceEl(const char * value, const int8_t id); bool set_energyPricePV(const char * value, const int8_t id); bool set_switchOverTemp(const char * value, const int8_t id); - bool set_airPurgeMode(const char * value, const int8_t id); bool set_heatPumpOutput(const char * value, const int8_t id); bool set_coolingCircuit(const char * value, const int8_t id); diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 9809045b0..53e1547fc 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -317,6 +317,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylPumpMod_, DeviceValueType::UINT, FL_(cylPumpMod), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveStatus_, DeviceValueType::BOOL, FL_(valveStatus), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &vs1Status_, DeviceValueType::BOOL, FL_(vs1Status), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylHeated_, DeviceValueType::BOOL, FL_(cylHeated), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorShutdown_, DeviceValueType::BOOL, FL_(collectorShutdown), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, @@ -820,6 +821,7 @@ void Solar::process_SM100Status(std::shared_ptr telegram) { * byte 10 = PS1 Solar circuit pump for collector array 1: test=b0001(1), on=b0100(4) and off=b0011(3) */ void Solar::process_SM100Status2(std::shared_ptr telegram) { + has_bitupdate(telegram, vs1Status_, 0, 2); // on if bit 2 set has_bitupdate(telegram, valveStatus_, 4, 2); // on if bit 2 set has_bitupdate(telegram, solarPump_, 10, 2); // on if bit 2 set has_bitupdate(telegram, solarPump2_, 1, 2); // on if bit 2 set diff --git a/src/devices/solar.h b/src/devices/solar.h index 63481c469..16bb379bf 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -45,6 +45,7 @@ class Solar : public EMSdevice { uint8_t solarPump2Mod_; // PS4: modulation solar pump uint8_t m1Valve_; // M1: heat assistance valve uint8_t m1Power_; // M1: heat assistance valve + uint8_t vs1Status_; // VS1: status // 0x363 heat counter uint16_t heatCntFlowTemp_; diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index f1f2ff018..866ddb7f6 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1190,10 +1190,9 @@ void Thermostat::process_RC30Temp(std::shared_ptr telegram) { // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { - // exit if the 15th byte (second from last) is 0x00, which I think is calculated flow setpoint temperature - // with weather controlled RC35s this value is >=5, otherwise can be zero and our setpoint temps will be incorrect - // see https://github.com/emsesp/EMS-ESP/issues/373#issuecomment-627907301 - if (telegram->offset > 0 || telegram->message_length < 15) { + // Check if heatingciruit is active, see https://github.com/emsesp/EMS-ESP32/issues/786 + // some RC30_N have only 13 byte, use byte 0 for active detection. + if (telegram->offset > 0 || telegram->message_data[0] == 0x00) { return; } @@ -3340,7 +3339,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &errorCode_, DeviceValueType::STRING, FL_(errorCode), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &lastCode_, DeviceValueType::STRING, FL_(lastCode), DeviceValueUOM::NONE); - switch (this->model()) { case EMS_DEVICE_FLAG_RC100: case EMS_DEVICE_FLAG_RC300: @@ -3996,7 +3994,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrselTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_temp), 0, 30); } register_device_value(tag, &hc->roomTemp, DeviceValueType::SHORT, roomtemp_divider, FL_(roomTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &hc->climate, DeviceValueType::ENUM, FL_(enum_climate), FL_(climate), DeviceValueUOM::NONE, nullptr, 5, 30); + register_device_value(tag, &hc->climate, DeviceValueType::ENUM, FL_(enum_climate), FL_(haclimate), DeviceValueUOM::NONE, nullptr, 5, 30); switch (model) { case EMS_DEVICE_FLAG_RC10: diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 0a0abc74f..d35c9af64 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -240,15 +240,6 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.low_clock = root["low_clock"] | false; check_flag(prev, settings.low_clock, ChangeFlags::RESTART); - String old_local = settings.locale; - settings.locale = root["locale"] | EMSESP_DEFAULT_LOCALE; - EMSESP::system_.locale(settings.locale); -#ifndef EMSESP_STANDALONE - if (!old_local.equals(settings.locale)) { - add_flags(ChangeFlags::RESTART); // force restart - } -#endif - // // these may need mqtt restart to rebuild HA discovery topics // @@ -269,6 +260,9 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) // // without checks or necessary restarts... // + settings.locale = root["locale"] | EMSESP_DEFAULT_LOCALE; + EMSESP::system_.locale(settings.locale); + settings.trace_raw = root["trace_raw"] | EMSESP_DEFAULT_TRACELOG_RAW; EMSESP::trace_raw(settings.trace_raw);