From 6173e94cc07a31fcb119c0aaa24cf1b7eb0bb444 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 2 Sep 2023 12:29:26 +0200 Subject: [PATCH 01/39] add back process dest, fixes #1275, v3.6.1-dev0a --- src/emsesp.cpp | 2 ++ src/version.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 314a94599..67a591d11 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -939,6 +939,8 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { emsdevice->add_handlers_ignored(telegram->type_id); } break; + } else if (emsdevice->is_device_id(telegram->dest)) { + emsdevice->handle_telegram(telegram); } } diff --git a/src/version.h b/src/version.h index 35cf2c9b9..cd0f33b89 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0" +#define EMSESP_APP_VERSION "3.6.1-dev.0a" From b165e1c20c5dc5b8db82dfd2ad157a3304047cf4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Sep 2023 16:07:21 +0200 Subject: [PATCH 02/39] fix read int from webpage --- src/web/WebDataService.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 287d8e649..301cda5ac 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -251,7 +251,7 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar return_code = Command::call(device_type, cmd, data.as(), true, id, output); } else if (data.is()) { char s[10]; - return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); + return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); } else if (data.is()) { char s[10]; return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 1), true, id, output); @@ -288,7 +288,7 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar return_code = Command::call(device_type, cmd, data.as(), true, id, output); } else if (data.is()) { char s[10]; - return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); + return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); } else if (data.is()) { char s[10]; return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 1), true, id, output); From fcf16eec4fc5a07da036585f9d645ebe0773da11 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Sep 2023 17:25:14 +0200 Subject: [PATCH 03/39] HA register all entities for Custom and Scheduler --- src/web/WebEntityService.cpp | 9 +++++---- src/web/WebEntityService.h | 3 +++ src/web/WebSchedulerService.cpp | 7 +++++-- src/web/WebSchedulerService.h | 4 ++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/web/WebEntityService.cpp b/src/web/WebEntityService.cpp index 15708c8a1..1919c5eb3 100644 --- a/src/web/WebEntityService.cpp +++ b/src/web/WebEntityService.cpp @@ -61,6 +61,7 @@ StateUpdateResult WebEntity::update(JsonObject & root, WebEntity & webEntity) { Command::erase_command(EMSdevice::DeviceType::CUSTOM, entityItem.name.c_str()); } webEntity.entityItems.clear(); + EMSESP::webEntityService.ha_reset(); if (root["entities"].is()) { for (const JsonObject ei : root["entities"].as()) { @@ -319,7 +320,8 @@ void WebEntityService::publish(const bool force) { } DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE); - JsonObject output = doc.to(); + JsonObject output = doc.to(); + bool ha_created = ha_registered_; for (const EntityItem & entityItem : *entityItems) { render_value(output, entityItem); // create HA config @@ -383,11 +385,10 @@ void WebEntityService::publish(const bool force) { // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); - if (Mqtt::queue_ha(topic, config.as())) { - ha_registered_ = true; - } + ha_created |= Mqtt::queue_ha(topic, config.as()); } } + ha_registered_ = ha_created; if (output.size() > 0) { Mqtt::queue_publish("custom_data", output); } diff --git a/src/web/WebEntityService.h b/src/web/WebEntityService.h index e58a7cb39..7df9c4243 100644 --- a/src/web/WebEntityService.h +++ b/src/web/WebEntityService.h @@ -63,6 +63,9 @@ class WebEntityService : public StatefulService { uint8_t count_entities(); uint8_t has_commands(); void generate_value_web(JsonObject & output); + void ha_reset() { + ha_registered_ = false; + } private: diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 2402281b1..c25afa065 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -71,6 +71,7 @@ StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webSche Command::erase_command(EMSdevice::DeviceType::SCHEDULER, scheduleItem.name.c_str()); } webScheduler.scheduleItems.clear(); + EMSESP::webSchedulerService.ha_reset(); if (root["schedule"].is()) { for (const JsonObject schedule : root["schedule"].as()) { @@ -230,6 +231,7 @@ void WebSchedulerService::publish(const bool force) { } DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE); + bool ha_created = ha_registered_; for (const ScheduleItem & scheduleItem : *scheduleItems) { if (!scheduleItem.name.empty() && !doc.containsKey(scheduleItem.name)) { if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { @@ -242,7 +244,7 @@ void WebSchedulerService::publish(const bool force) { } // create HA config - if (Mqtt::ha_enabled() && force) { + if (Mqtt::ha_enabled() && !ha_registered_) { StaticJsonDocument config; char stat_t[50]; snprintf(stat_t, sizeof(stat_t), "%s/scheduler_data", Mqtt::basename().c_str()); @@ -284,10 +286,11 @@ void WebSchedulerService::publish(const bool force) { // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); - Mqtt::queue_ha(topic, config.as()); + ha_created |= Mqtt::queue_ha(topic, config.as()); } } } + ha_registered_ = ha_created; if (doc.size() > 0) { Mqtt::queue_publish("scheduler_data", doc.as()); } diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index 43501d66b..ef012fc5a 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -58,6 +58,9 @@ class WebSchedulerService : public StatefulService { bool has_commands(); bool command_setvalue(const char * value, const std::string name); bool get_value_info(JsonObject & output, const char * cmd); + void ha_reset() { + ha_registered_ = false; + } // make all functions public so we can test in the debug and standalone mode #ifndef EMSESP_STANDALONE @@ -69,6 +72,7 @@ class WebSchedulerService : public StatefulService { FSPersistence _fsPersistence; std::list * scheduleItems; // pointer to the list of schedule events + bool ha_registered_ = false; }; } // namespace emsesp From 4c1b66279dab799cc5de82d3abc27a19ee26e6b1 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Sep 2023 17:25:30 +0200 Subject: [PATCH 04/39] update packages --- interface/package.json | 2 +- interface/yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/interface/package.json b/interface/package.json index 1756ffb68..4a7a06173 100644 --- a/interface/package.json +++ b/interface/package.json @@ -28,7 +28,7 @@ "@prefresh/vite": "^2.4.1", "@table-library/react-table-library": "4.1.7", "@types/lodash-es": "^4.17.9", - "@types/node": "^20.5.8", + "@types/node": "^20.5.9", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@types/react-router-dom": "^5.3.3", diff --git a/interface/yarn.lock b/interface/yarn.lock index f5d3d136d..91c0c0eb7 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -1355,10 +1355,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.5.8": - version: 20.5.8 - resolution: "@types/node@npm:20.5.8" - checksum: 5d4af299b4499c4658d5fed3475ad1039828c5a8a44cd15494d45d8d1097965b59246f140af43a9e94277007082e8d04bc4f7771a4b97a8292ffd7442240cffd +"@types/node@npm:^20.5.9": + version: 20.5.9 + resolution: "@types/node@npm:20.5.9" + checksum: a071a19019b4045ba65cbacb3a24fcdf1ef41474fd15fb160a082a4c7aba7643b69c5d681637d2b0ce081f2127ce4332ea4d8bf007595efe8e82ba795872c7d0 languageName: node linkType: hard @@ -1587,7 +1587,7 @@ __metadata: "@table-library/react-table-library": 4.1.7 "@types/babel__core": ^7 "@types/lodash-es": ^4.17.9 - "@types/node": ^20.5.8 + "@types/node": ^20.5.9 "@types/react": ^18.2.21 "@types/react-dom": ^18.2.7 "@types/react-router-dom": ^5.3.3 From bd9234579392e5ba106243b3e4a2968e7f7420e3 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Sep 2023 17:53:48 +0200 Subject: [PATCH 05/39] boiler energy counter, stored in nvs --- lib/framework/RestartService.cpp | 5 ++ lib/framework/UploadFileService.cpp | 4 + src/devices/boiler.cpp | 114 +++++++++++++++++++++++++++- src/devices/boiler.h | 14 ++++ src/emsdevice.cpp | 9 ++- src/emsdevice.h | 16 ++++ src/emsesp.cpp | 2 + src/emsesp.h | 2 + src/locale_translations.h | 4 + src/system.cpp | 5 ++ src/system.h | 1 + 11 files changed, 173 insertions(+), 3 deletions(-) diff --git a/lib/framework/RestartService.cpp b/lib/framework/RestartService.cpp index afa42ef16..157f26dfb 100644 --- a/lib/framework/RestartService.cpp +++ b/lib/framework/RestartService.cpp @@ -1,6 +1,8 @@ #include #include +#include "../../src/emsesp_stub.hpp" + using namespace std::placeholders; // for `_1` etc RestartService::RestartService(AsyncWebServer * server, SecurityManager * securityManager) { @@ -11,6 +13,7 @@ RestartService::RestartService(AsyncWebServer * server, SecurityManager * securi } void RestartService::restart(AsyncWebServerRequest * request) { + emsesp::EMSESP::system_.store_boiler_energy(); request->onDisconnect(RestartService::restartNow); request->send(200); } @@ -19,6 +22,7 @@ void RestartService::partition(AsyncWebServerRequest * request) { const esp_partition_t * factory_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL); if (factory_partition) { esp_ota_set_boot_partition(factory_partition); + emsesp::EMSESP::system_.store_boiler_energy(); request->onDisconnect(RestartService::restartNow); request->send(200); return; @@ -35,6 +39,7 @@ void RestartService::partition(AsyncWebServerRequest * request) { return; } esp_ota_set_boot_partition(ota_partition); + emsesp::EMSESP::system_.store_boiler_energy(); request->onDisconnect(RestartService::restartNow); request->send(200); } diff --git a/lib/framework/UploadFileService.cpp b/lib/framework/UploadFileService.cpp index a96f67142..d6840d211 100644 --- a/lib/framework/UploadFileService.cpp +++ b/lib/framework/UploadFileService.cpp @@ -1,6 +1,8 @@ #include #include +#include "../../src/emsesp_stub.hpp" + using namespace std::placeholders; // for `_1` etc static bool is_firmware = false; @@ -112,6 +114,7 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) { // did we complete uploading a json file? if (request->_tempFile) { request->_tempFile.close(); // close the file handle as the upload is now done + emsesp::EMSESP::system_.store_boiler_energy(); request->onDisconnect(RestartService::restartNow); AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); @@ -121,6 +124,7 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) { // check if it was a firmware upgrade // if no error, send the success response as a JSON if (is_firmware && !request->_tempObject) { + emsesp::EMSESP::system_.store_boiler_energy(); request->onDisconnect(RestartService::restartNow); AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 62a3f5be6..48263d012 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -750,7 +750,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value( DeviceValueTAG::TAG_BOILER_DATA_WW, &wwMaxPower_, DeviceValueType::UINT, FL_(wwMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_ww_maxpower), 0, 254); register_device_value( - DeviceValueTAG::TAG_BOILER_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_maxtemp), 0, 70); + DeviceValueTAG::TAG_BOILER_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_maxtemp), 0, 80); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, @@ -849,6 +849,31 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const EMSESP::send_read_request(0x15, device_id); // read maintenance data on start (only published on change) EMSESP::send_read_request(0x1C, device_id); // read maintenance status on start (only published on change) EMSESP::send_read_request(0xC2, device_id); // read last errorcode on start (only published on errors) + + register_telegram_type(0x04, "UBAFactory", true, MAKE_PF_CB(process_UBAFactory)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nomPower_, DeviceValueType::UINT, FL_(nomPower), DeviceValueUOM::KW, MAKE_CF_CB(set_nomPower)); + + if (model() != EMS_DEVICE_FLAG_HEATPUMP) { + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgHeat_, DeviceValueType::ULONG, FL_(nrgHeat), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgHeat)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgWw_, DeviceValueType::ULONG, FL_(nrgWw), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgWw)); + + nrgHeatF_ = EMSESP::nvs_.getDouble(FL_(nrgHeat)[0], 0); + nrgWwF_ = EMSESP::nvs_.getDouble(FL_(nrgWw)[0], 0); + // update/publish the values + has_update(nrgHeat_, (uint32_t)nrgHeatF_); + has_update(nrgWw_, (uint32_t)nrgWwF_); + } +} + +void Boiler::store_energy() { + // only write if something is changed + if (nrgHeatF_ != EMSESP::nvs_.getDouble(FL_(nrgHeat)[0]) || nrgWwF_ != EMSESP::nvs_.getDouble(FL_(nrgWw)[0]) + || nomPower_ != EMSESP::nvs_.getUChar(FL_(nomPower)[0])) { + EMSESP::nvs_.putDouble(FL_(nrgHeat)[0], nrgHeatF_); + EMSESP::nvs_.putDouble(FL_(nrgWw)[0], nrgWwF_); + EMSESP::nvs_.putUChar(FL_(nomPower)[0], nomPower_); + LOG_DEBUG("energy values stored"); + } } // Check if hot tap water or heating is active @@ -894,6 +919,62 @@ void Boiler::check_active() { Mqtt::queue_publish(F_(tapwater_active), Helpers::render_boolean(s, b)); EMSESP::tap_water_active(b); // let EMS-ESP know, used in the Shower class } + + // calculate energy for boiler 0x08 from stored modulation an time in units of 0.01 Wh + if (model() != EMS_DEVICE_FLAG_HEATPUMP) { + // remember values from last call + static uint32_t powLastReadTime_ = uuid::get_uptime(); + static uint8_t heatBurnPow = 0; + static uint8_t wwBurnPow = 0; + static uint8_t lastSaveHour = 0; + if (nrgHeat_ > (uint32_t)nrgHeatF_) { + nrgHeatF_ = nrgHeat_; + } + if (nrgWw_ > (uint32_t)nrgWwF_) { + nrgWwF_ = nrgWw_; + } + // 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 + nrgHeatF_ += (double_t)(((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; + nrgWwF_ += (double_t)(((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; + has_update(nrgHeat_, (uint32_t)(nrgHeatF_)); + has_update(nrgWw_, (uint32_t)(nrgWwF_)); + // check for store values + time_t now = time(nullptr); + tm * tm_ = localtime(&now); + if (tm_->tm_hour != lastSaveHour) { + lastSaveHour = tm_->tm_hour; + store_energy(); + } else if (curBurnPow_ == 0 && (heatBurnPow + wwBurnPow) > 0) { // on burner switch off + store_energy(); + } + // store new modulation and time + heatBurnPow = heatingActive_ ? curBurnPow_ : 0; + wwBurnPow = tapwaterActive_ ? curBurnPow_ : 0; + powLastReadTime_ = uuid::get_uptime(); + } +} + +// 0x04 +// boiler(0x08) -W-> Me(0x0B), ?(0x04), data: 13 96 09 81 00 64 64 35 05 64 5A 22 00 00 00 00 00 00 00 00 B7 +// offset 4 - nominal Power kW, could be zero, 5 - min. Burner, 6 - max. Burner +void Boiler::process_UBAFactory(std::shared_ptr telegram) { + uint8_t nomPower = nomPower_; + if (!telegram->read_value(nomPower, 4)) { + return; + } + if (nomPower == 0 || nomPower == 255) { + nomPower = EMSESP::nvs_.getUChar(FL_(nomPower)[0], 0); + } + if (nomPower != nomPower_ || nomPower == 255) { + if (nomPower == 255) { + nomPower_ = nomPower = 0; + store_energy(); + has_update(&nomPower_); + } + has_update(nomPower_, nomPower); + toggle_fetch(telegram->type_id, false); // only read once + // LOG_DEBUG("nominal power set to %d", nomPower_); + } } // 0x18 @@ -2642,4 +2723,35 @@ bool Boiler::set_wwAltOpPrio(const char * value, const int8_t id) { return false; } +bool Boiler::set_nrgHeat(const char * value, const int8_t id) { + int v; + if (Helpers::value2number(value, v)) { + nrgHeatF_ = nrgHeat_ = v; + store_energy(); + return true; + } + return false; +} + +bool Boiler::set_nrgWw(const char * value, const int8_t id) { + int v; + if (Helpers::value2number(value, v)) { + nrgWwF_ = nrgWw_ = v; + store_energy(); + return true; + } + return false; +} + +bool Boiler::set_nomPower(const char * value, const int8_t id) { + int v; + if (Helpers::value2number(value, v)) { + nomPower_ = v > 0 ? v : nomPower_; + store_energy(); + has_update(&nomPower_); + return true; + } + return false; +} + } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 78b175cc4..c22d1896e 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -36,6 +36,7 @@ class Boiler : public EMSdevice { } void check_active(); + void store_energy(); uint8_t boilerState_ = EMS_VALUE_UINT_NOTSET; // Boiler state flag - FOR INTERNAL USE @@ -258,6 +259,13 @@ class Boiler : public EMSdevice { uint8_t keepWarmTemp_; uint8_t setReturnTemp_; + // special + double_t nrgHeatF_; + double_t nrgWwF_; + uint32_t nrgHeat_; + uint32_t nrgWw_; + uint8_t nomPower_; + /* // Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat // thermostat always overwrites settings in boiler @@ -272,6 +280,7 @@ class Boiler : public EMSdevice { uint8_t tempDiffBoiler_; // relative temperature degrees */ + void process_UBAFactory(std::shared_ptr telegram); void process_UBAParameterWW(std::shared_ptr telegram); void process_UBAMonitorFast(std::shared_ptr telegram); void process_UBATotalUptime(std::shared_ptr telegram); @@ -468,6 +477,11 @@ class Boiler : public EMSdevice { bool set_delayBoiler(const char * value, const int8_t id); bool set_tempDiffBoiler(const char * value, const int8_t id); */ + + bool set_nrgHeat(const char * value, const int8_t id); + bool set_nrgWw(const char * value, const int8_t id); + bool set_nomPower(const char * value, const int8_t id); + }; } // namespace emsesp diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 9520499fc..5c8c7f0cd 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -931,7 +931,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { } // handle INTs // add min and max values and steps, as integer values - else { + else if (dv.type != DeviceValueType::ULONG) { if (dv.numeric_operator > 0) { obj["s"] = (float)1 / dv.numeric_operator; } else if (dv.numeric_operator < 0) { @@ -1030,7 +1030,7 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble obj["w"] = dv.has_cmd; // if writable - if (dv.has_cmd && (obj["v"].is() || obj["v"].is())) { + if (dv.has_cmd && dv.type != DeviceValueType::ULONG && (obj["v"].is() || obj["v"].is())) { // set the min and max values if there are any and if entity has a value int16_t dv_set_min; uint16_t dv_set_max; @@ -1767,6 +1767,11 @@ const char * EMSdevice::telegram_type_name(std::shared_ptr teleg bool EMSdevice::handle_telegram(std::shared_ptr telegram) { for (auto & tf : telegram_functions_) { if (tf.telegram_type_id_ == telegram->type_id) { + // for telegram desitnation only read telegram + if (telegram->dest == device_id_ && telegram->message_length > 0) { + tf.process_function_(telegram); + return true; + } // if the data block is empty and we have not received data before, assume that this telegram // is not recognized by the bus master. So remove it from the automatic fetch list if (telegram->message_length == 0 && telegram->offset == 0 && !tf.received_) { diff --git a/src/emsdevice.h b/src/emsdevice.h index 00ab27f1c..2ccfcdfdb 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -155,6 +155,22 @@ class EMSdevice { } } + inline void has_update(uint16_t & value, uint16_t newvalue) { + if (value != newvalue) { + value = newvalue; + has_update_ = true; + publish_value((void *)&value); + } + } + + inline void has_update(uint32_t & value, uint32_t newvalue) { + if (value != newvalue) { + value = newvalue; + has_update_ = true; + publish_value((void *)&value); + } + } + inline void has_enumupdate(std::shared_ptr telegram, uint8_t & value, const uint8_t index, int8_t s = 0) { if (telegram->read_enumvalue(value, index, s)) { has_update_ = true; diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 67a591d11..354eebc5b 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -69,6 +69,7 @@ System EMSESP::system_; // core system services TemperatureSensor EMSESP::temperaturesensor_; // Temperature sensors AnalogSensor EMSESP::analogsensor_; // Analog sensors Shower EMSESP::shower_; // Shower logic +Preferences EMSESP::nvs_; // NV Storage // static/common variables uint16_t EMSESP::watch_id_ = WATCH_ID_NONE; // for when log is TRACE. 0 means no trace set @@ -1485,6 +1486,7 @@ void EMSESP::start() { system_.system_restart(); }; + nvs_.begin("ems-esp"); webSettingsService.begin(); // load EMS-ESP Application settings... // do any system upgrades diff --git a/src/emsesp.h b/src/emsesp.h index e83287fde..1ce1e6261 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -36,6 +36,7 @@ #ifndef EMSESP_STANDALONE #include #endif +#include #include @@ -225,6 +226,7 @@ class EMSESP { static Shower shower_; static RxService rxservice_; static TxService txservice_; + static Preferences nvs_; // web controllers static ESP8266React esp8266React; diff --git a/src/locale_translations.h b/src/locale_translations.h index 4a9f2e314..a785b3827 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -500,6 +500,10 @@ MAKE_TRANSLATION(blockTerm, "blockterm", "config of block terminal", "Konfig. Sp MAKE_TRANSLATION(blockHyst, "blockhyst", "hyst. for boiler block", "Hysterese Sperrmodus", "Hysterese blokeerterminal", "Hysteres Blockeringsmodul", "tryb blokowania histerezy", "hystrese blokkeringsmodus", "hyst. Blocage chaudière", "kazan blok geçikmesi", "modalità blocco isteresi") MAKE_TRANSLATION(releaseWait, "releasewait", "boiler release wait time", "Wartezeit Kessel-Freigabe", "Wachttijd ketel vrijgave", "Väntetid Frisläppning", "czas oczekiwania na zwolnienie kotła", "kjele frigjøringsventetid", "temps attente libération chaudière", "kazan tahliyesi bekleme süresi", "tempo di attesa sblocco caldaia") +// energy +MAKE_TRANSLATION(nrgHeat, "nrgheat", "energy heating", "Energie Heizen", "", "", "", "", "", "", "") +MAKE_TRANSLATION(nrgWw, "nrgww", "energy dhw", "Energie Warmwasser", "", "", "", "", "", "", "") +MAKE_TRANSLATION(nomPower, "nompower", "nominal Power", "Brennerleistung", "", "", "", "", "", "", "") // HIU MAKE_TRANSLATION(netFlowTemp, "netflowtemp", "heat network flow temp", "System Vorlauftemperatur", "Netto aanvoertemperatuur", "", "", "", "", "", "temperatura di mandata della rete di riscaldamento") MAKE_TRANSLATION(cwFlowRate, "cwflowrate", "cold water flow rate", "Kaltwasser Durchfluss", "Stroomsnelheid koud water ", "", "", "", "", "", "portata acqua fredda") diff --git a/src/system.cpp b/src/system.cpp index a00c7e660..a0130aa70 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -231,9 +231,14 @@ bool System::command_watch(const char * value, const int8_t id) { return false; } +void System::store_boiler_energy() { + Command::call(EMSdevice::DeviceType::BOILER, "nompower", "-1"); // trigger a write +} + // restart EMS-ESP void System::system_restart() { LOG_INFO("Restarting EMS-ESP..."); + store_boiler_energy(); Shell::loop_all(); delay(1000); // wait a second #ifndef EMSESP_STANDALONE diff --git a/src/system.h b/src/system.h index 8d20cfb09..ce59895c8 100644 --- a/src/system.h +++ b/src/system.h @@ -66,6 +66,7 @@ class System { std::string reset_reason(uint8_t cpu) const; + void store_boiler_energy(); void system_restart(); void format(uuid::console::Shell & shell); void upload_status(bool in_progress); From a5f5d36871587dafad2d8f8bcd33d044128c6fc2 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Sep 2023 17:54:08 +0200 Subject: [PATCH 06/39] analogsensor counter store to nvs --- src/analogsensor.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index cc0f19ffb..c071b1ffe 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -160,6 +160,9 @@ void AnalogSensor::reload() { #endif sensor.polltime_ = 0; sensor.poll_ = digitalRead(sensor.gpio()); + if (double_t val = EMSESP::nvs_.getDouble(sensor.name().c_str(), 0)) { + sensor.set_value(val); + } publish_sensor(sensor); } else if (sensor.type() == AnalogType::TIMER || sensor.type() == AnalogType::RATE) { LOG_DEBUG("Adding analog Timer/Rate sensor on GPIO %02d", sensor.gpio()); @@ -274,6 +277,7 @@ void AnalogSensor::measure() { } else if (!sensor.poll_) { // falling edge if (sensor.type() == AnalogType::COUNTER) { sensor.set_value(old_value + sensor.factor()); + EMSESP::nvs_.putDouble(sensor.name().c_str(), sensor.value()); } else if (sensor.type() == AnalogType::RATE) { // dafault uom: Hz (1/sec) with factor 1 sensor.set_value(sensor.factor() * 1000 / (sensor.polltime_ - sensor.last_polltime_)); } else if (sensor.type() == AnalogType::TIMER) { // default seconds with factor 1 @@ -315,10 +319,14 @@ bool AnalogSensor::update(uint8_t gpio, const std::string & name, double offset, found_sensor = true; // found the record // see if it's marked for deletion if (deleted) { + EMSESP::nvs_.remove(AnalogCustomization.name.c_str()); LOG_DEBUG("Removing analog sensor GPIO %02d", gpio); settings.analogCustomizations.remove(AnalogCustomization); } else { // update existing record + if (name != AnalogCustomization.name) { + EMSESP::nvs_.remove(AnalogCustomization.name.c_str()); + } AnalogCustomization.name = name; AnalogCustomization.offset = offset; AnalogCustomization.factor = factor; From ced63a6eb08c2c62afb1f3f53fbe3848696cd348 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Sep 2023 17:54:39 +0200 Subject: [PATCH 07/39] v3.6.1-dev0b, changelog --- CHANGELOG_LATEST.md | 5 +++++ src/version.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 93542cc15..1c7e653ec 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -9,10 +9,15 @@ ## Added - rssi in Network Status Page +- boiler nominal power from telegram 0x04 +- boiler energy for heating and dhw stored in nvs +- analogsensor counter value stored in nvs ## Fixed - issue in espMqttClient on low mem +- mqtt subscription to scheduler and custom +- HA configuration for scheduler and custom ## Changed diff --git a/src/version.h b/src/version.h index cd0f33b89..def7251fc 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0a" +#define EMSESP_APP_VERSION "3.6.1-dev.0b" From b912779ef90e197142578e65300779f57544f345 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Sep 2023 12:21:53 +0200 Subject: [PATCH 08/39] fix max for ULONG values, save counters every hour, 3.6.1-dev0c --- lib/framework/RestartService.cpp | 6 +-- lib/framework/UploadFileService.cpp | 4 +- src/analogsensor.cpp | 23 ++++++++- src/analogsensor.h | 1 + src/devices/boiler.cpp | 77 +++++++++++++++-------------- src/emsdevice.cpp | 24 ++++----- src/emsdevice.h | 12 ++--- src/emsdevicevalue.cpp | 6 +-- src/emsdevicevalue.h | 8 +-- src/mqtt.cpp | 6 +-- src/mqtt.h | 4 +- src/system.cpp | 5 +- src/system.h | 2 +- src/version.h | 2 +- 14 files changed, 103 insertions(+), 77 deletions(-) diff --git a/lib/framework/RestartService.cpp b/lib/framework/RestartService.cpp index 157f26dfb..b767b9cf0 100644 --- a/lib/framework/RestartService.cpp +++ b/lib/framework/RestartService.cpp @@ -13,7 +13,7 @@ RestartService::RestartService(AsyncWebServer * server, SecurityManager * securi } void RestartService::restart(AsyncWebServerRequest * request) { - emsesp::EMSESP::system_.store_boiler_energy(); + emsesp::EMSESP::system_.store_nvs_values(); request->onDisconnect(RestartService::restartNow); request->send(200); } @@ -22,7 +22,7 @@ void RestartService::partition(AsyncWebServerRequest * request) { const esp_partition_t * factory_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL); if (factory_partition) { esp_ota_set_boot_partition(factory_partition); - emsesp::EMSESP::system_.store_boiler_energy(); + emsesp::EMSESP::system_.store_nvs_values(); request->onDisconnect(RestartService::restartNow); request->send(200); return; @@ -39,7 +39,7 @@ void RestartService::partition(AsyncWebServerRequest * request) { return; } esp_ota_set_boot_partition(ota_partition); - emsesp::EMSESP::system_.store_boiler_energy(); + emsesp::EMSESP::system_.store_nvs_values(); request->onDisconnect(RestartService::restartNow); request->send(200); } diff --git a/lib/framework/UploadFileService.cpp b/lib/framework/UploadFileService.cpp index d6840d211..91428b8eb 100644 --- a/lib/framework/UploadFileService.cpp +++ b/lib/framework/UploadFileService.cpp @@ -114,7 +114,7 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) { // did we complete uploading a json file? if (request->_tempFile) { request->_tempFile.close(); // close the file handle as the upload is now done - emsesp::EMSESP::system_.store_boiler_energy(); + emsesp::EMSESP::system_.store_nvs_values(); request->onDisconnect(RestartService::restartNow); AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); @@ -124,7 +124,7 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) { // check if it was a firmware upgrade // if no error, send the success response as a JSON if (is_firmware && !request->_tempObject) { - emsesp::EMSESP::system_.store_boiler_energy(); + emsesp::EMSESP::system_.store_nvs_values(); request->onDisconnect(RestartService::restartNow); AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index c071b1ffe..b8e3bdbd7 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -277,8 +277,8 @@ void AnalogSensor::measure() { } else if (!sensor.poll_) { // falling edge if (sensor.type() == AnalogType::COUNTER) { sensor.set_value(old_value + sensor.factor()); - EMSESP::nvs_.putDouble(sensor.name().c_str(), sensor.value()); - } else if (sensor.type() == AnalogType::RATE) { // dafault uom: Hz (1/sec) with factor 1 + // EMSESP::nvs_.putDouble(sensor.name().c_str(), sensor.value()); + } else if (sensor.type() == AnalogType::RATE) { // default uom: Hz (1/sec) with factor 1 sensor.set_value(sensor.factor() * 1000 / (sensor.polltime_ - sensor.last_polltime_)); } else if (sensor.type() == AnalogType::TIMER) { // default seconds with factor 1 sensor.set_value(sensor.factor() * (sensor.polltime_ - sensor.last_polltime_) / 1000); @@ -294,6 +294,25 @@ void AnalogSensor::measure() { } } } + // store counter-values only every hour to reduce flash wear + static uint8_t lastSaveHour = 0; + time_t now = time(nullptr); + tm * tm_ = localtime(&now); + if (tm_->tm_hour != lastSaveHour) { + lastSaveHour = tm_->tm_hour; + store_counters(); + } +} + +// store counters to NVS, called every hour, on restart and update +void AnalogSensor::store_counters() { + for (auto & sensor : sensors_) { + if (sensor.type() == AnalogType::COUNTER) { + if (sensor.value() != EMSESP::nvs_.getDouble(sensor.name().c_str())) { + EMSESP::nvs_.putDouble(sensor.name().c_str(), sensor.value()); + } + } + } } void AnalogSensor::loop() { diff --git a/src/analogsensor.h b/src/analogsensor.h index e1ecb67cf..cc931539b 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -158,6 +158,7 @@ class AnalogSensor { bool update(uint8_t gpio, const std::string & name, double offset, double factor, uint8_t uom, int8_t type, bool deleted = false); bool get_value_info(JsonObject & output, const char * cmd, const int8_t id) const; + void store_counters(); #if defined(EMSESP_TEST) void test(); diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 48263d012..3264f3002 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -850,18 +850,30 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const EMSESP::send_read_request(0x1C, device_id); // read maintenance status on start (only published on change) EMSESP::send_read_request(0xC2, device_id); // read last errorcode on start (only published on errors) - register_telegram_type(0x04, "UBAFactory", true, MAKE_PF_CB(process_UBAFactory)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nomPower_, DeviceValueType::UINT, FL_(nomPower), DeviceValueUOM::KW, MAKE_CF_CB(set_nomPower)); if (model() != EMS_DEVICE_FLAG_HEATPUMP) { + register_telegram_type(0x04, "UBAFactory", true, MAKE_PF_CB(process_UBAFactory)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nomPower_, DeviceValueType::UINT, FL_(nomPower), DeviceValueUOM::KW, MAKE_CF_CB(set_nomPower)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgHeat_, DeviceValueType::ULONG, FL_(nrgHeat), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgHeat)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgWw_, DeviceValueType::ULONG, FL_(nrgWw), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgWw)); nrgHeatF_ = EMSESP::nvs_.getDouble(FL_(nrgHeat)[0], 0); nrgWwF_ = EMSESP::nvs_.getDouble(FL_(nrgWw)[0], 0); + nomPower_ = EMSESP::nvs_.getUChar(FL_(nomPower)[0], 0); + if (nrgHeatF_ < 0 || nrgHeatF_ >= EMS_VALUE_ULONG_NOTSET) { + nrgHeatF_ = 0; + } + if (nrgWwF_ < 0 || nrgWwF_ >= EMS_VALUE_ULONG_NOTSET) { + nrgWwF_ = 0; + } + if (nomPower_ == EMS_VALUE_UINT_NOTSET) { + nomPower_ = 0; + } + store_energy(); // update/publish the values has_update(nrgHeat_, (uint32_t)nrgHeatF_); has_update(nrgWw_, (uint32_t)nrgWwF_); + has_update(&nomPower_); } } @@ -927,13 +939,7 @@ void Boiler::check_active() { static uint8_t heatBurnPow = 0; static uint8_t wwBurnPow = 0; static uint8_t lastSaveHour = 0; - if (nrgHeat_ > (uint32_t)nrgHeatF_) { - nrgHeatF_ = nrgHeat_; - } - if (nrgWw_ > (uint32_t)nrgWwF_) { - nrgWwF_ = nrgWw_; - } - // 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 + // resolution needed: 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 nrgHeatF_ += (double_t)(((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; nrgWwF_ += (double_t)(((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; has_update(nrgHeat_, (uint32_t)(nrgHeatF_)); @@ -962,19 +968,10 @@ void Boiler::process_UBAFactory(std::shared_ptr telegram) { if (!telegram->read_value(nomPower, 4)) { return; } - if (nomPower == 0 || nomPower == 255) { - nomPower = EMSESP::nvs_.getUChar(FL_(nomPower)[0], 0); - } - if (nomPower != nomPower_ || nomPower == 255) { - if (nomPower == 255) { - nomPower_ = nomPower = 0; - store_energy(); - has_update(&nomPower_); - } + if (nomPower > 0) { has_update(nomPower_, nomPower); - toggle_fetch(telegram->type_id, false); // only read once - // LOG_DEBUG("nominal power set to %d", nomPower_); } + toggle_fetch(telegram->type_id, false); // only read once } // 0x18 @@ -2723,35 +2720,43 @@ bool Boiler::set_wwAltOpPrio(const char * value, const int8_t id) { return false; } +// energy counters. Setting an invalid value does not update, but trigger a store. bool Boiler::set_nrgHeat(const char * value, const int8_t id) { int v; - if (Helpers::value2number(value, v)) { - nrgHeatF_ = nrgHeat_ = v; - store_energy(); - return true; + if (!Helpers::value2number(value, v)) { + return false; } - return false; + if (v >= 0 && v < EMS_VALUE_ULONG_NOTSET) { + nrgHeatF_ = v; + has_update(nrgHeat_, (uint32_t)nrgHeatF_); + } + store_energy(); + return true; } bool Boiler::set_nrgWw(const char * value, const int8_t id) { int v; - if (Helpers::value2number(value, v)) { - nrgWwF_ = nrgWw_ = v; - store_energy(); - return true; + if (!Helpers::value2number(value, v)) { + return false; } - return false; + if (v >= 0 && v < EMS_VALUE_ULONG_NOTSET) { + nrgWwF_ = v; + has_update(nrgWw_, (uint32_t)nrgWwF_); + } + store_energy(); + return true; } bool Boiler::set_nomPower(const char * value, const int8_t id) { int v; - if (Helpers::value2number(value, v)) { - nomPower_ = v > 0 ? v : nomPower_; - store_energy(); - has_update(&nomPower_); - return true; + if (!Helpers::value2number(value, v)) { + return false; } - return false; + if (v > 0 && v < EMS_VALUE_UINT_NOTSET) { + has_update(nomPower_, (uint8_t)v); + } + store_energy(); + return true; } } // namespace emsesp diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 5c8c7f0cd..41355e66e 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -488,7 +488,7 @@ void EMSdevice::add_device_value(uint8_t tag, // to b uint8_t uom, // unit of measure from DeviceValueUOM const cmd_function_p f, // command function pointer int16_t min, // min allowed value - uint16_t max // max allowed value + uint32_t max // max allowed value ) { // initialize the device value depending on it's type // ignoring DeviceValueType::CMD and DeviceValueType::TIME @@ -605,7 +605,7 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max) { + uint32_t max) { // create a multi-list from the options add_device_value(tag, value_p, type, nullptr, options_single, 0, name, uom, f, min, max); }; @@ -628,7 +628,7 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max) { + uint32_t max) { add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, min, max); } @@ -645,7 +645,7 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max) { + uint32_t max) { add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, min, max); }; @@ -660,7 +660,7 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max) { + uint32_t max) { add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, min, max); } @@ -931,7 +931,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { } // handle INTs // add min and max values and steps, as integer values - else if (dv.type != DeviceValueType::ULONG) { + else { if (dv.numeric_operator > 0) { obj["s"] = (float)1 / dv.numeric_operator; } else if (dv.numeric_operator < 0) { @@ -939,7 +939,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { } int16_t dv_set_min; - uint16_t dv_set_max; + uint32_t dv_set_max; if (dv.get_min_max(dv_set_min, dv_set_max)) { obj["m"] = dv_set_min; obj["x"] = dv_set_max; @@ -1030,10 +1030,10 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble obj["w"] = dv.has_cmd; // if writable - if (dv.has_cmd && dv.type != DeviceValueType::ULONG && (obj["v"].is() || obj["v"].is())) { + if (dv.has_cmd && (obj["v"].is() || obj["v"].is())) { // set the min and max values if there are any and if entity has a value int16_t dv_set_min; - uint16_t dv_set_max; + uint32_t dv_set_max; if (dv.get_min_max(dv_set_min, dv_set_max)) { obj["mi"] = dv_set_min; obj["ma"] = dv_set_max; @@ -1059,7 +1059,7 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { }); } -void EMSdevice::set_climate_minmax(uint8_t tag, int16_t min, uint16_t max) { +void EMSdevice::set_climate_minmax(uint8_t tag, int16_t min, uint32_t max) { for (auto & dv : devicevalues_) { if (dv.tag == tag && (strcmp(dv.short_name, FL_(haclimate[0])) == 0)) { if (dv.min != min || dv.max != max) { @@ -1236,7 +1236,7 @@ void EMSdevice::dump_value_info() { // min/max range int16_t dv_set_min; - uint16_t dv_set_max; + uint32_t dv_set_max; if (dv.get_min_max(dv_set_min, dv_set_max)) { Serial.print(" (>="); Serial.print(dv_set_min); @@ -1473,7 +1473,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 // set the min and max only for commands if (dv.has_cmd) { int16_t dv_set_min; - uint16_t dv_set_max; + uint32_t dv_set_max; if (dv.get_min_max(dv_set_min, dv_set_max)) { json["min"] = dv_set_min; json["max"] = dv_set_max; diff --git a/src/emsdevice.h b/src/emsdevice.h index 2ccfcdfdb..38ada1b7a 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -206,7 +206,7 @@ class EMSdevice { void list_device_entries(JsonObject & output) const; void add_handlers_ignored(const uint16_t handler); - void set_climate_minmax(uint8_t tag, int16_t min, uint16_t max); + void set_climate_minmax(uint8_t tag, int16_t min, uint32_t max); void setCustomEntity(const std::string & entity_id); void getCustomEntities(std::vector & entity_ids); @@ -232,7 +232,7 @@ class EMSdevice { uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max); + uint32_t max); void register_device_value(uint8_t tag, void * value_p, @@ -242,7 +242,7 @@ class EMSdevice { uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max); + uint32_t max); void register_device_value(uint8_t tag, void * value_p, uint8_t type, const char * const ** options, const char * const * name, uint8_t uom, const cmd_function_p f); @@ -265,7 +265,7 @@ class EMSdevice { uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max); + uint32_t max); // single list of options void register_device_value(uint8_t tag, @@ -285,14 +285,14 @@ class EMSdevice { uint8_t uom, const cmd_function_p f, int16_t min, - uint16_t max); + uint32_t max); // no options, optional function f void register_device_value(uint8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p f = nullptr); // no options, with min/max void - register_device_value(uint8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p f, int16_t min, uint16_t max); + register_device_value(uint8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p f, int16_t min, uint32_t max); void write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) const; void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) const; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index 30e742f1b..0d0561f5c 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -36,7 +36,7 @@ DeviceValue::DeviceValue(uint8_t device_type, uint8_t uom, bool has_cmd, int16_t min, - uint16_t max, + uint32_t max, uint8_t state) : device_type(device_type) , tag(tag) @@ -261,7 +261,7 @@ bool DeviceValue::has_tag() const { // converts to signed int, which means rounding to an whole integer // returns false if there is no min/max needed // Types BOOL, ENUM, STRING and CMD are not used -bool DeviceValue::get_min_max(int16_t & dv_set_min, uint16_t & dv_set_max) { +bool DeviceValue::get_min_max(int16_t & dv_set_min, uint32_t & dv_set_max) { uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; // if we have individual limits set already, just do the conversion @@ -340,7 +340,7 @@ bool DeviceValue::get_custom_min(int16_t & val) { } // extract custom max from custom_fullname -bool DeviceValue::get_custom_max(uint16_t & val) { +bool DeviceValue::get_custom_max(uint32_t & val) { auto max_pos = custom_fullname.find('<'); bool has_max = (max_pos != std::string::npos); uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 5ea551004..13bacba41 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -159,7 +159,7 @@ class DeviceValue { uint8_t uom; // DeviceValueUOM::* bool has_cmd; // true if there is a Console/MQTT command which matches the short_name int16_t min; // min range - uint16_t max; // max range + uint32_t max; // max range uint8_t state; // DeviceValueState::* DeviceValue(uint8_t device_type, @@ -175,16 +175,16 @@ class DeviceValue { uint8_t uom, bool has_cmd, int16_t min, - uint16_t max, + uint32_t max, uint8_t state); bool hasValue() const; bool has_tag() const; - bool get_min_max(int16_t & dv_set_min, uint16_t & dv_set_max); + bool get_min_max(int16_t & dv_set_min, uint32_t & dv_set_max); void set_custom_minmax(); bool get_custom_min(int16_t & val); - bool get_custom_max(uint16_t & val); + bool get_custom_max(uint32_t & val); std::string get_custom_fullname() const; std::string get_fullname() const; static std::string get_name(std::string & entity); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 7fc766964..f86a067f1 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -737,7 +737,7 @@ bool Mqtt::publish_ha_sensor_config(DeviceValue & dv, const char * model, const // calculate the min and max int16_t dv_set_min; - uint16_t dv_set_max; + uint32_t dv_set_max; (void)dv.get_min_max(dv_set_min, dv_set_max); // determine if we're creating the command topics which we use special HA configs @@ -788,7 +788,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev const char * const ** options, uint8_t options_size, const int16_t dv_set_min, - const int16_t dv_set_max, + const uint32_t dv_set_max, const int8_t num_op, const JsonObject & dev_json) { // ignore if name (fullname) is empty @@ -1117,7 +1117,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev return queue_ha(topic, doc.as()); } -bool Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, const bool remove, const int16_t min, const uint16_t max) { +bool Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, const bool remove, const int16_t min, const uint32_t max) { uint8_t hc_num = tag - DeviceValueTAG::TAG_HC1 + 1; char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; diff --git a/src/mqtt.h b/src/mqtt.h index 8a02c0903..0048da7fb 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -87,12 +87,12 @@ class Mqtt { const char * const ** options, uint8_t options_size, const int16_t dv_set_min, - const int16_t dv_set_max, + const uint32_t dv_set_max, const int8_t num_op, const JsonObject & dev_json); static bool publish_system_ha_sensor_config(uint8_t type, const char * name, const char * entity, const uint8_t uom); - static bool publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, const bool remove = false, const int16_t min = 5, const uint16_t max = 30); + static bool publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, const bool remove = false, const int16_t min = 5, const uint32_t max = 30); static void show_topic_handlers(uuid::console::Shell & shell, const uint8_t device_type); static void show_mqtt(uuid::console::Shell & shell); diff --git a/src/system.cpp b/src/system.cpp index a0130aa70..53a448b6e 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -231,14 +231,15 @@ bool System::command_watch(const char * value, const int8_t id) { return false; } -void System::store_boiler_energy() { +void System::store_nvs_values() { Command::call(EMSdevice::DeviceType::BOILER, "nompower", "-1"); // trigger a write + EMSESP::analogsensor_.store_counters(); } // restart EMS-ESP void System::system_restart() { LOG_INFO("Restarting EMS-ESP..."); - store_boiler_energy(); + store_nvs_values(); Shell::loop_all(); delay(1000); // wait a second #ifndef EMSESP_STANDALONE diff --git a/src/system.h b/src/system.h index ce59895c8..a4cb6d5f6 100644 --- a/src/system.h +++ b/src/system.h @@ -66,7 +66,7 @@ class System { std::string reset_reason(uint8_t cpu) const; - void store_boiler_energy(); + void store_nvs_values(); void system_restart(); void format(uuid::console::Shell & shell); void upload_status(bool in_progress); diff --git a/src/version.h b/src/version.h index def7251fc..713c08869 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0b" +#define EMSESP_APP_VERSION "3.6.1-dev.0c" From 06e9b8d303da691166be78aa1c91a8ce73278d15 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Sep 2023 13:11:23 +0200 Subject: [PATCH 09/39] round energy values to full kWh --- src/devices/boiler.cpp | 8 ++++---- src/version.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 3264f3002..18803a585 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -871,8 +871,8 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const } store_energy(); // update/publish the values - has_update(nrgHeat_, (uint32_t)nrgHeatF_); - has_update(nrgWw_, (uint32_t)nrgWwF_); + has_update(nrgHeat_, (uint32_t)(nrgHeatF_ + 0.5)); + has_update(nrgWw_, (uint32_t)(nrgWwF_ + 0.5)); has_update(&nomPower_); } } @@ -942,8 +942,8 @@ void Boiler::check_active() { // resolution needed: 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 nrgHeatF_ += (double_t)(((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; nrgWwF_ += (double_t)(((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; - has_update(nrgHeat_, (uint32_t)(nrgHeatF_)); - has_update(nrgWw_, (uint32_t)(nrgWwF_)); + has_update(nrgHeat_, (uint32_t)(nrgHeatF_ + 0.5)); + has_update(nrgWw_, (uint32_t)(nrgWwF_ + 0.5)); // check for store values time_t now = time(nullptr); tm * tm_ = localtime(&now); diff --git a/src/version.h b/src/version.h index 713c08869..4865f5bec 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0c" +#define EMSESP_APP_VERSION "3.6.1-dev.0d" From f1034f42308fbedfc9a59c06077792623e71811a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Sep 2023 16:37:58 +0200 Subject: [PATCH 10/39] energy values as HA sensors with classes, v3.6.1-dev0e --- src/mqtt.cpp | 6 +++++- src/version.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index f86a067f1..b257add25 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -847,7 +847,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev case DeviceValueType::UINT: case DeviceValueType::SHORT: case DeviceValueType::USHORT: - case DeviceValueType::ULONG: + // case DeviceValueType::ULONG: if (discovery_type() == discoveryType::HOMEASSISTANT) { // Home Assistant // number - https://www.home-assistant.io/integrations/number.mqtt @@ -866,6 +866,10 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // select - https://www.home-assistant.io/integrations/select.mqtt snprintf(topic, sizeof(topic), "select/%s", config_topic); break; + case DeviceValueType::ULONG: + snprintf(topic, sizeof(topic), "sensor/%s", config_topic); + set_ha_classes = true; + break; default: // plain old sensor snprintf(topic, sizeof(topic), "sensor/%s", config_topic); diff --git a/src/version.h b/src/version.h index 4865f5bec..af0cc804a 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0d" +#define EMSESP_APP_VERSION "3.6.1-dev.0e" From 09a15727c70960ceb953e18f87e60328bae1796e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Sep 2023 19:01:52 +0200 Subject: [PATCH 11/39] change ha-mqtt `t`to `topic` --- src/mqtt.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index b257add25..929cb0d1a 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1261,19 +1261,19 @@ void Mqtt::add_avty_to_doc(const char * state_t, const JsonObject & doc, const c StaticJsonDocument<512> avty_json; snprintf(tpl, sizeof(tpl), "%s/status", mqtt_base_.c_str()); - avty_json["t"] = tpl; + avty_json["topic"] = tpl; snprintf(tpl, sizeof(tpl), tpl_draft, "value == 'online'"); avty_json["val_tpl"] = tpl; avty.add(avty_json); avty_json.clear(); - avty_json["t"] = state_t; + avty_json["topic"] = state_t; snprintf(tpl, sizeof(tpl), tpl_draft, cond1 == nullptr ? "value is defined" : cond1); avty_json["val_tpl"] = tpl; avty.add(avty_json); if (cond2 != nullptr) { avty_json.clear(); - avty_json["t"] = state_t; + avty_json["topic"] = state_t; snprintf(tpl, sizeof(tpl), tpl_draft, cond2); avty_json["val_tpl"] = tpl; avty.add(avty_json); @@ -1281,7 +1281,7 @@ void Mqtt::add_avty_to_doc(const char * state_t, const JsonObject & doc, const c if (negcond != nullptr) { avty_json.clear(); - avty_json["t"] = state_t; + avty_json["topic"] = state_t; snprintf(tpl, sizeof(tpl), "{{'offline' if %s else 'online'}}", negcond); avty_json["val_tpl"] = tpl; avty.add(avty_json); From 1c4da53e7535d3ca172f32d6a8a8786748a2db71 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 5 Sep 2023 11:37:26 +0200 Subject: [PATCH 12/39] publish energy in api/mqtt with 2 digits --- src/devices/boiler.cpp | 42 +++++++++++++++++++++++------------------- src/devices/boiler.h | 4 ++-- src/helpers.cpp | 5 ++++- src/version.h | 2 +- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 18803a585..b96ea8971 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -854,16 +854,16 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const if (model() != EMS_DEVICE_FLAG_HEATPUMP) { register_telegram_type(0x04, "UBAFactory", true, MAKE_PF_CB(process_UBAFactory)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nomPower_, DeviceValueType::UINT, FL_(nomPower), DeviceValueUOM::KW, MAKE_CF_CB(set_nomPower)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgHeat_, DeviceValueType::ULONG, FL_(nrgHeat), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgHeat)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgWw_, DeviceValueType::ULONG, FL_(nrgWw), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgWw)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgHeat_, DeviceValueType::ULONG, DeviceValueNumOp::DV_NUMOP_DIV100, FL_(nrgHeat), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgHeat), 0, 10000000UL); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgWw_, DeviceValueType::ULONG, DeviceValueNumOp::DV_NUMOP_DIV100, FL_(nrgWw), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgWw), 0, 10000000UL); nrgHeatF_ = EMSESP::nvs_.getDouble(FL_(nrgHeat)[0], 0); nrgWwF_ = EMSESP::nvs_.getDouble(FL_(nrgWw)[0], 0); nomPower_ = EMSESP::nvs_.getUChar(FL_(nomPower)[0], 0); - if (nrgHeatF_ < 0 || nrgHeatF_ >= EMS_VALUE_ULONG_NOTSET) { + if (nrgHeatF_ < 0 || nrgHeatF_ >= EMS_VALUE_ULLONG_NOTSET) { nrgHeatF_ = 0; } - if (nrgWwF_ < 0 || nrgWwF_ >= EMS_VALUE_ULONG_NOTSET) { + if (nrgWwF_ < 0 || nrgWwF_ >= EMS_VALUE_ULLONG_NOTSET) { nrgWwF_ = 0; } if (nomPower_ == EMS_VALUE_UINT_NOTSET) { @@ -939,9 +939,9 @@ void Boiler::check_active() { static uint8_t heatBurnPow = 0; static uint8_t wwBurnPow = 0; static uint8_t lastSaveHour = 0; - // resolution needed: 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 - nrgHeatF_ += (double_t)(((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; - nrgWwF_ += (double_t)(((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; + // store in units of 0.01 kWh, resolution needed: 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 + nrgHeatF_ += ((double)((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 1000UL; + nrgWwF_ += ((double)((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 1000UL; has_update(nrgHeat_, (uint32_t)(nrgHeatF_ + 0.5)); has_update(nrgWw_, (uint32_t)(nrgWwF_ + 0.5)); // check for store values @@ -1014,7 +1014,9 @@ void Boiler::process_UBAMonitorFast(std::shared_ptr telegram) { has_update(telegram, serviceCodeNumber_, 20); - check_active(); // do a quick check to see if the hot water or heating is active + if (telegram->offset <= 4 && telegram->offset + telegram->message_length > 5) { + check_active(); // do a quick check to see if the hot water or heating is active + } } /* @@ -1153,7 +1155,9 @@ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram boilerState_ |= state & 0x04 ? 0x02 : 0; } - check_active(); // do a quick check to see if the hot water or heating is active + if (telegram->offset <= 10 && telegram->offset + telegram->message_length > 11) { + check_active(); // do a quick check to see if the hot water or heating is active + } } /* @@ -2722,26 +2726,26 @@ bool Boiler::set_wwAltOpPrio(const char * value, const int8_t id) { // energy counters. Setting an invalid value does not update, but trigger a store. bool Boiler::set_nrgHeat(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { + float v; + if (!Helpers::value2float(value, v)) { return false; } - if (v >= 0 && v < EMS_VALUE_ULONG_NOTSET) { - nrgHeatF_ = v; - has_update(nrgHeat_, (uint32_t)nrgHeatF_); + if (v >= 0) { + nrgHeatF_ = v * 100; + has_update(nrgHeat_, (uint32_t)(nrgHeatF_ + 0.5)); } store_energy(); return true; } bool Boiler::set_nrgWw(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { + float v; + if (!Helpers::value2float(value, v)) { return false; } - if (v >= 0 && v < EMS_VALUE_ULONG_NOTSET) { - nrgWwF_ = v; - has_update(nrgWw_, (uint32_t)nrgWwF_); + if (v >= 0) { + nrgWwF_ = v * 100; + has_update(nrgWw_, (uint32_t)(nrgWwF_ + 0.5)); } store_energy(); return true; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index c22d1896e..8de95bb61 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -260,8 +260,8 @@ class Boiler : public EMSdevice { uint8_t setReturnTemp_; // special - double_t nrgHeatF_; - double_t nrgWwF_; + double nrgHeatF_; + double nrgWwF_; uint32_t nrgHeat_; uint32_t nrgWw_; uint8_t nomPower_; diff --git a/src/helpers.cpp b/src/helpers.cpp index 35de71b8a..c9c5eb9b5 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -345,7 +345,7 @@ char * Helpers::render_value(char * result, const uint32_t value, const int8_t f } result[0] = '\0'; uint32_t new_value = fahrenheit ? format ? value * 1.8 + 32 * format * (fahrenheit - 1) : value * 1.8 + 32 * (fahrenheit - 1) : value; - char s[10] = {0}; + char s[14] = {0}; #ifndef EMSESP_STANDALONE if (!format) { @@ -354,6 +354,9 @@ char * Helpers::render_value(char * result, const uint32_t value, const int8_t f strlcpy(result, ltoa(new_value / format, s, 10), sizeof(s)); strlcat(result, ".", sizeof(s)); strlcat(result, itoa(((new_value % format) * 10) / format, s, 10), sizeof(s)); + if (format == 100) { + strlcat(result, itoa(new_value % 10, s, 10), sizeof(s)); + } } else { strlcpy(result, ltoa(new_value * format * -1, s, 10), sizeof(s)); } diff --git a/src/version.h b/src/version.h index af0cc804a..bed473405 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0e" +#define EMSESP_APP_VERSION "3.6.1-dev.0f" From 95b8e79624c4661e2a7ffd8f8beb634ae20c6e7c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 6 Sep 2023 12:05:26 +0200 Subject: [PATCH 13/39] use tasmota modified platform, v3.6.1-dev.1a --- platformio.ini | 3 ++- src/version.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 18027e66a..872e651b8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -39,7 +39,8 @@ unbuild_flags = ${common.core_unbuild_flags} [espressi32_base] -platform = espressif32@6.3.2 +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip +; platform = espressif32 framework = arduino build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} diff --git a/src/version.h b/src/version.h index bed473405..36cf5a32a 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0f" +#define EMSESP_APP_VERSION "3.6.1-dev.1a" From 0ba5d8e2bd4c28845d0d4dceedbed6d2424afea4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 6 Sep 2023 12:25:31 +0200 Subject: [PATCH 14/39] update packages --- interface/package.json | 12 +- interface/yarn.lock | 371 ++++++++++++++++++++++++++++++----------- 2 files changed, 275 insertions(+), 108 deletions(-) diff --git a/interface/package.json b/interface/package.json index 4a7a06173..776cf140e 100644 --- a/interface/package.json +++ b/interface/package.json @@ -22,8 +22,8 @@ "@alova/adapter-xhr": "^1.0.1", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.14.7", - "@mui/material": "^5.14.7", + "@mui/icons-material": "^5.14.8", + "@mui/material": "^5.14.8", "@preact/compat": "^17.1.2", "@prefresh/vite": "^2.4.1", "@table-library/react-table-library": "4.1.7", @@ -50,11 +50,11 @@ "typescript": "^5.2.2" }, "devDependencies": { - "@babel/core": "^7.22.11", + "@babel/core": "^7.22.15", "@preact/preset-vite": "^2.5.0", "@types/babel__core": "^7", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "@typescript-eslint/parser": "^6.5.0", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.6.0", "eslint": "^8.48.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.1.0", @@ -69,7 +69,7 @@ "npm-run-all": "^4.1.5", "prettier": "^3.0.3", "rollup-plugin-visualizer": "^5.9.2", - "terser": "^5.19.3", + "terser": "^5.19.4", "vite": "^4.4.9", "vite-plugin-svgr": "^3.2.0", "vite-tsconfig-paths": "^4.2.0" diff --git a/interface/yarn.lock b/interface/yarn.lock index 91c0c0eb7..09e72a0b2 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -39,6 +39,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.22.13": + version: 7.22.13 + resolution: "@babel/code-frame@npm:7.22.13" + dependencies: + "@babel/highlight": ^7.22.13 + chalk: ^2.4.2 + checksum: f4cc8ae1000265677daf4845083b72f88d00d311adb1a93c94eb4b07bf0ed6828a81ae4ac43ee7d476775000b93a28a9cddec18fbdc5796212d8dcccd5de72bd + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.9": version: 7.22.9 resolution: "@babel/compat-data@npm:7.22.9" @@ -46,7 +56,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.21.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.22.11": +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.22.1": version: 7.22.11 resolution: "@babel/core@npm:7.22.11" dependencies: @@ -69,6 +79,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/core@npm:7.22.15" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.22.15 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-module-transforms": ^7.22.15 + "@babel/helpers": ^7.22.15 + "@babel/parser": ^7.22.15 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.22.15 + "@babel/types": ^7.22.15 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: fe7457d3b08c478c04003c8b35f23d1718c36152a4524b61b94cd4830d7a5c50c36d3d1155ce258a9fafc37790953b6c7e35a51ddb1079c47890750f1d3db46b + languageName: node + linkType: hard + "@babel/generator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/generator@npm:7.22.10" @@ -81,6 +114,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/generator@npm:7.22.15" + dependencies: + "@babel/types": ^7.22.15 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: d5e559584fa43490555eb3aef3480d5bb75069aa045ace638fc86111ff2a53df50d303eeaa5ef4c96e8241896807a77699ec2ff8874ed99f7d31b711660658e7 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -103,6 +148,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-compilation-targets@npm:7.22.15" + dependencies: + "@babel/compat-data": ^7.22.9 + "@babel/helper-validator-option": ^7.22.15 + browserslist: ^4.21.9 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: 45b9286861296e890f674a3abb199efea14a962a27d9b8adeb44970a9fd5c54e73a9e342e8414d2851cf4f98d5994537352fbce7b05ade32e9849bbd327f9ff1 + languageName: node + linkType: hard + "@babel/helper-environment-visitor@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-environment-visitor@npm:7.22.5" @@ -138,6 +196,30 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" + dependencies: + "@babel/types": ^7.22.15 + checksum: 4e0d7fc36d02c1b8c8b3006dfbfeedf7a367d3334a04934255de5128115ea0bafdeb3e5736a2559917f0653e4e437400d54542da0468e08d3cbc86d3bbfa8f30 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-module-transforms@npm:7.22.15" + dependencies: + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-validator-identifier": ^7.22.15 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: a72c7faca63ce6dc21328f4c05857df142aef4dfe47890d9c83baeca464b2aba01a21ac5473cfd3ebe361dc95fde72e56f6a3d838a566376b962f28bd6707ac2 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.22.9": version: 7.22.9 resolution: "@babel/helper-module-transforms@npm:7.22.9" @@ -185,6 +267,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-validator-identifier@npm:7.22.15" + checksum: 0473ccfd123cf872206eb916ec506f8963f75db50413560d4d1674aed4cd5d9354826c2514474d6cd40637d3bdc515ba87e8035b4bed683ba62cb607e0081aaf + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-identifier@npm:7.22.5" @@ -192,6 +281,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-validator-option@npm:7.22.15" + checksum: e9661bf80ba18e2dd978217b350fb07298e57ac417f4f1ab9fa011505e20e4857f2c3b4b538473516a9dc03af5ce3a831e5ed973311c28326f4c330b6be981c2 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-option@npm:7.22.5" @@ -210,6 +306,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helpers@npm:7.22.15" + dependencies: + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.22.15 + "@babel/types": ^7.22.15 + checksum: 2f4c270b53cdca4999976ddd4f20b1b8c8be04722f35745d4a0a43d35c6496e1a23d8cbecb21e6bf22502c5e4828de2bea1c1f58bed81c84bfecc8fa96b69483 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.22.10": version: 7.22.10 resolution: "@babel/highlight@npm:7.22.10" @@ -221,6 +328,17 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.22.13": + version: 7.22.13 + resolution: "@babel/highlight@npm:7.22.13" + dependencies: + "@babel/helper-validator-identifier": ^7.22.5 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 65f20132c7ada5d82d343dc23ca61bcd040980f7bd59e480532bcd7f7895aa7abe58470ae8a4f851fd244b71b42a7ad915f7c515fef8f1c2e003777721ebdbe6 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.11, @babel/parser@npm:^7.22.5": version: 7.22.11 resolution: "@babel/parser@npm:7.22.11" @@ -230,6 +348,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/parser@npm:7.22.15" + bin: + parser: ./bin/babel-parser.js + checksum: 60e0ca5ba9ba1312587367cd155fd074408dd6a6101ceb0f7e23640a5ebcab35e5fad13c0122881ab95746f06ecca6bf273dbbeeeea1e9dcc0d14062458ec72f + languageName: node + linkType: hard + "@babel/plugin-syntax-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" @@ -276,6 +403,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/template@npm:7.22.15" + dependencies: + "@babel/code-frame": ^7.22.13 + "@babel/parser": ^7.22.15 + "@babel/types": ^7.22.15 + checksum: 9312edd37cf1311d738907003f2aa321a88a42ba223c69209abe4d7111db019d321805504f606c7fd75f21c6cf9d24d0a8223104cd21ebd207e241b6c551f454 + languageName: node + linkType: hard + "@babel/template@npm:^7.22.5": version: 7.22.5 resolution: "@babel/template@npm:7.22.5" @@ -305,6 +443,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/traverse@npm:7.22.15" + dependencies: + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.22.15 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.22.15 + "@babel/types": ^7.22.15 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 427e52e7393628c447a4a7bd5ede45c47c7cfa0ef8bc4c861fee8957fb98e2ab2b86299919056377e49a511d85672798f186b18520ee74d4a79a6ba772984e4f + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.8.3": version: 7.22.11 resolution: "@babel/types@npm:7.22.11" @@ -316,6 +472,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/types@npm:7.22.15" + dependencies: + "@babel/helper-string-parser": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.15 + to-fast-properties: ^2.0.0 + checksum: 9324743c1586c59737b7590bbc44acc0b46317b66971fd98867ef4cfa1252ecdab2237a1a62437f579af8a2b41d998aa3efb9e8f0939d7de5f0781e91c7ac1ae + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:^11.11.0": version: 11.11.0 resolution: "@emotion/babel-plugin@npm:11.11.0" @@ -787,15 +954,15 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.13": - version: 5.0.0-beta.13 - resolution: "@mui/base@npm:5.0.0-beta.13" +"@mui/base@npm:5.0.0-beta.14": + version: 5.0.0-beta.14 + resolution: "@mui/base@npm:5.0.0-beta.14" dependencies: "@babel/runtime": ^7.22.10 "@emotion/is-prop-valid": ^1.2.1 "@floating-ui/react-dom": ^2.0.1 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.7 + "@mui/utils": ^5.14.8 "@popperjs/core": ^2.11.8 clsx: ^2.0.0 prop-types: ^15.8.1 @@ -807,20 +974,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: c73ac225417ae8f0eab7b57939e6d728148c4dc4a648450801c90aeadba93c1422ce07052dc3ca584f5d8f98bb3602d2fdb0b581df34a7bee5400afa07bad0b8 + checksum: 9e1bfb7a45b0fd2e39f6175fc3a792bee3344b75903e0de965f12f8f3703efdeb9a06f8712a10de1cea1fe9c438820b98d21f9c32968cfcbe09d720a148b1d19 languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/core-downloads-tracker@npm:5.14.7" - checksum: 8e1e91dc546ed5060524097ec72f288358c65d0da6245b3220f9fed885a519a7c04ed461de78c7bba8245a6cdb353ab8ee991838a9015a99e947c5a98ea2a5c7 +"@mui/core-downloads-tracker@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/core-downloads-tracker@npm:5.14.8" + checksum: 93d22affbc826e8e60c190548bb178bf1f616c21e1d3cbc8bef097fdefc0fd4f4788e7327063205816536886d0131064f94ff3d42eaf957a46f2234be6e1d040 languageName: node linkType: hard -"@mui/icons-material@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/icons-material@npm:5.14.7" +"@mui/icons-material@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/icons-material@npm:5.14.8" dependencies: "@babel/runtime": ^7.22.10 peerDependencies: @@ -830,20 +997,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 4426d57300d3c0e971b529b895b5a07ccda4cc7a48c07c7244e834f1b3e6198398d9c02b7928d7d49e15ea7e141f8ccd9fc913275251a9f49d4ce01e3fb5ba3e + checksum: 212e5563d3aa1918ec27dd4d5e4134e043bd002b078e2802e39841c1cce31e1eb2f5fbf13529b86995f402edbfc5f9cd9cb62625a43f8565928860eac537919f languageName: node linkType: hard -"@mui/material@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/material@npm:5.14.7" +"@mui/material@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/material@npm:5.14.8" dependencies: "@babel/runtime": ^7.22.10 - "@mui/base": 5.0.0-beta.13 - "@mui/core-downloads-tracker": ^5.14.7 - "@mui/system": ^5.14.7 + "@mui/base": 5.0.0-beta.14 + "@mui/core-downloads-tracker": ^5.14.8 + "@mui/system": ^5.14.8 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.7 + "@mui/utils": ^5.14.8 "@types/react-transition-group": ^4.4.6 clsx: ^2.0.0 csstype: ^3.1.2 @@ -863,16 +1030,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 662bd13ceed725a31f3fab6e67530d8e0e64b145c007c07492e8a370452c613685f0a22ce205ed53e75271a2088ca0d98292b85cf7e45d688c41a10251fb0fad + checksum: b26fb4966c005cb6bbc6195d0b22f254bf8f34d81e47ea10f459c06b893122958b16f438102ce56f105abc89f21b5705cad0b13d8d4401f2c8f672ed61519861 languageName: node linkType: hard -"@mui/private-theming@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/private-theming@npm:5.14.7" +"@mui/private-theming@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/private-theming@npm:5.14.8" dependencies: "@babel/runtime": ^7.22.10 - "@mui/utils": ^5.14.7 + "@mui/utils": ^5.14.8 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -880,13 +1047,13 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: a918328930cd4f6f18eb7e6d9e7254c046895e7b129bd5e8807ecf05206859a5aef662a83d0c457319fd17c2475a6e084e44c7d833037b976b60b2a89cfa180d + checksum: 5d92f9afaf31ff2610cc455277f3ff1be5ce5de5b40d0747a60de7fef7ec82127d167cade843054318885dec634a1fe070757f269045c5fd9ac3610be9ede31a languageName: node linkType: hard -"@mui/styled-engine@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/styled-engine@npm:5.14.7" +"@mui/styled-engine@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/styled-engine@npm:5.14.8" dependencies: "@babel/runtime": ^7.22.10 "@emotion/cache": ^11.11.0 @@ -901,19 +1068,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: a0f0abacd77dca4330471c6a30bc4f9e14248ea7b92b82ffd303733562e5dcea82c7c65cee95605389a039f80761b06c95c0f547eb977ee17f4453c306eb7978 + checksum: d1848e34239a2fa4c833d27816845f730cf57481f815212094bcb5fd9f2040efd1e790de7f7b867bfdd6de3d7a5f9406607f853db399129d2789e6a408cb7f87 languageName: node linkType: hard -"@mui/system@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/system@npm:5.14.7" +"@mui/system@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/system@npm:5.14.8" dependencies: "@babel/runtime": ^7.22.10 - "@mui/private-theming": ^5.14.7 - "@mui/styled-engine": ^5.14.7 + "@mui/private-theming": ^5.14.8 + "@mui/styled-engine": ^5.14.8 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.7 + "@mui/utils": ^5.14.8 clsx: ^2.0.0 csstype: ^3.1.2 prop-types: ^15.8.1 @@ -929,7 +1096,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: f1cbcb54ed9c91abbcb8f01bc2443552adf76e154404116b7bef7b6199da3123cd4f0013318680d86490172b68381184eed97a96863a461a7c25523855bbfbfb + checksum: 3333b2a8af50c3b9cbf8a4955af911635a49151a2ff75f32cd677becaa69d6a3a9814ae798e3aeb4c439ea5f1e24c66747f2434ddab70f7ff690700e69417bdb languageName: node linkType: hard @@ -945,9 +1112,9 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.14.7": - version: 5.14.7 - resolution: "@mui/utils@npm:5.14.7" +"@mui/utils@npm:^5.14.8": + version: 5.14.8 + resolution: "@mui/utils@npm:5.14.8" dependencies: "@babel/runtime": ^7.22.10 "@types/prop-types": ^15.7.5 @@ -956,7 +1123,7 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^17.0.0 || ^18.0.0 - checksum: ec929f6e6e52953f5ae414dab185bca82c70804a7b4243f2825903f89752fbf979f19ca04ed3daf0047df6813b2d3c4acbe2dda1432b9f992ec1e4dd47fd6dda + checksum: 1949563a793a36eb31df0bc2f7cad3cffd5537cd18a130d4245e00e9f83deb9e8dccb99c530aec661a9e62262b219a4b19f0cfdaaf09ab31f3df2f28fb7f1201 languageName: node linkType: hard @@ -1449,15 +1616,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.5.0" +"@typescript-eslint/eslint-plugin@npm:^6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.6.0" dependencies: "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/type-utils": 6.5.0 - "@typescript-eslint/utils": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/type-utils": 6.6.0 + "@typescript-eslint/utils": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.4 @@ -1470,44 +1637,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1569ce7c6a1f578523349daaa8646435f7ea290912ece987030c9b38de96f804b3fbe293b2c87b342f42fc8f4233bd2ec837565da196748048bb097b30322052 + checksum: be6d0b4e79cb5890c3786cd87870db394914cf980cb60b756b5a2395c62743cf4c19cf81c57548ff19d141f1c967b6ab1a2c73eb7ddee261154b81d9041da923 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/parser@npm:6.5.0" +"@typescript-eslint/parser@npm:^6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/parser@npm:6.6.0" dependencies: - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/typescript-estree": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 0b725eed37303028dc92db18d1ce2310111b606c0a9ed84b4fdf13480d580b2e05e9faed7dc1784752f609080ce1463fd3a8858b8412cce2eddb017bee907f59 + checksum: 869601abdd8a70d4cb823bda7ba838fe6ce28f908e25b8028c07cf2cc56bfe5b79f5a4b2421d5f7027bcdb2ad56df6d4eddf7903182caa384ea8b0353ca3a64e languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/scope-manager@npm:6.5.0" +"@typescript-eslint/scope-manager@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/scope-manager@npm:6.6.0" dependencies: - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 - checksum: aaec7d7260eef0f36e09ab54050184223b24d5c10a915ef857af49658ec910c004dfe8c799866c0f49542b36d6218610d5dff97e642e8b3b0fb0de3c53ca1b8b + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + checksum: 881dc83a6cc0770bff5dd1f709883c829801241486f96e4fc38ca3e817cc33b4e09238c724974004ab2e3ffd31f1423d20e309d1c34e9bdb07e008a6f8fdee21 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/type-utils@npm:6.5.0" +"@typescript-eslint/type-utils@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/type-utils@npm:6.6.0" dependencies: - "@typescript-eslint/typescript-estree": 6.5.0 - "@typescript-eslint/utils": 6.5.0 + "@typescript-eslint/typescript-estree": 6.6.0 + "@typescript-eslint/utils": 6.6.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -1515,23 +1682,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a17143e4e202a5d9e735577593285062dfc0899f91584dbd281d759f5808a39e69b3eac93ed8cd32cf14aaafac2fddbeeea0d89bb47d2e3d6960e94077dff824 + checksum: 9365b4b6f7200a86c7f78c462845e1cf252b0ce46a358de850f9d7d37afd9e34d40ac144760dcff6b3d6fe536310fa76cfc21acb680e2d98c7c6222ea8612892 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/types@npm:6.5.0" - checksum: df34f04fb22a6daf182d245c6943aa01c1696ca891edcd5e039bfa3ce5d0f917ed78f677fb006df5c9fbb1dabeb6ff4f0b80573debdfeacdd0dde1d52cacacc0 +"@typescript-eslint/types@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/types@npm:6.6.0" + checksum: b48fa3574e0c6498cffb0fda0836a1e7cc10d19dca4e0fd0718feb233da1b428f49645324dc65173385c2b7f81bb42348aa376fe47fbb15664315b7429cc7223 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.5.0" +"@typescript-eslint/typescript-estree@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.6.0" dependencies: - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -1540,34 +1707,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 6b5cff285a61ce1163efb257d2ba62c0c8cadff9ac3fde4cf5b4ac62ac14c76d33bf4e5b7ee920ebbfe92acaf79ed14fd9288585eedbc699083fa3a0dccd2e44 + checksum: bacdc5ea194c0bf3defa61f5be1e2367bcbf3457277e4e17d3fb1bfefa191431df6bb456d3625670cd80dd2184184bea61fa9afbba056ea590f9abcbdd665fec languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/utils@npm:6.5.0" +"@typescript-eslint/utils@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/utils@npm:6.6.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 "@types/json-schema": ^7.0.12 "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/typescript-estree": 6.5.0 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0 semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 10ed3832b71262b99d5b103ed232771abf2680e1110cd0a4b97899488462e86a76a0e2dbc2419b7ef945b1f1c22a91607b05074a04fc811ad33ef6f03fb5a3cd + checksum: b24db4396a2a796f57565f3dd9fd60c38fb2b64d62c9df5e145b246d2ddab53503cd96f77d0005155160fa8b94699b4c458ea7b41bbe12c4ea2f5c92487abf1b languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.5.0": - version: 6.5.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.5.0" +"@typescript-eslint/visitor-keys@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.6.0" dependencies: - "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/types": 6.6.0 eslint-visitor-keys: ^3.4.1 - checksum: 1b7d06b933aa36a89957e89c38d8ec437df63df2ce1a76d5f5b0e293b62a758f30b44799458f189aa01c426e822a3c7ee884545e20af3a61716c94c782f84307 + checksum: 916331900aa39f91eb509954169b1230ba979577343ab6d4e380862c29408053c3325c852501241ff17c4e46ffb80ca28217f9781f627db2d20b3c4d9691ab69 languageName: node linkType: hard @@ -1576,11 +1743,11 @@ __metadata: resolution: "EMS-ESP@workspace:." dependencies: "@alova/adapter-xhr": ^1.0.1 - "@babel/core": ^7.22.11 + "@babel/core": ^7.22.15 "@emotion/react": ^11.11.1 "@emotion/styled": ^11.11.0 - "@mui/icons-material": ^5.14.7 - "@mui/material": ^5.14.7 + "@mui/icons-material": ^5.14.8 + "@mui/material": ^5.14.8 "@preact/compat": ^17.1.2 "@preact/preset-vite": ^2.5.0 "@prefresh/vite": ^2.4.1 @@ -1591,8 +1758,8 @@ __metadata: "@types/react": ^18.2.21 "@types/react-dom": ^18.2.7 "@types/react-router-dom": ^5.3.3 - "@typescript-eslint/eslint-plugin": ^6.5.0 - "@typescript-eslint/parser": ^6.5.0 + "@typescript-eslint/eslint-plugin": ^6.6.0 + "@typescript-eslint/parser": ^6.6.0 alova: ^2.11.1 async-validator: ^4.2.5 eslint: ^8.48.0 @@ -1621,7 +1788,7 @@ __metadata: react-toastify: ^9.1.3 rollup-plugin-visualizer: ^5.9.2 sockette: ^2.0.6 - terser: ^5.19.3 + terser: ^5.19.4 typesafe-i18n: ^5.26.2 typescript: ^5.2.2 vite: ^4.4.9 @@ -5769,9 +5936,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.19.3": - version: 5.19.3 - resolution: "terser@npm:5.19.3" +"terser@npm:^5.19.4": + version: 5.19.4 + resolution: "terser@npm:5.19.4" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -5779,7 +5946,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 959d0c96552e2bcfcb2ff092295453b5163769184bbbc6ecf0e0f1c59d472a45601f1a10f9820396ac4a3facfa1a101443324d2576f75756b4c5966cef6d6408 + checksum: 39c6687609f5b9061f2fb82bee02d2f9d7756fcb5bd50c67da1482f52cf5977e03e0c5df5cb4ce17e549428024c8859075137c461ec4a9ae8cf91a505759255a languageName: node linkType: hard From 04e43d5d41c42cf2d55354000e7e26027deb6ea0 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 6 Sep 2023 12:46:38 +0200 Subject: [PATCH 15/39] nomPower is always editable --- src/devices/boiler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index b96ea8971..acd94fc05 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -968,7 +968,8 @@ void Boiler::process_UBAFactory(std::shared_ptr telegram) { if (!telegram->read_value(nomPower, 4)) { return; } - if (nomPower > 0) { + // Update nominal Power only if not already set in nvs and we have a valid value + if (nomPower > 0 && nomPower_ == 0) { has_update(nomPower_, nomPower); } toggle_fetch(telegram->type_id, false); // only read once From 6376ed2361f87d5fdf8fc0440c678df9e1e01710 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 6 Sep 2023 13:18:49 +0200 Subject: [PATCH 16/39] platform: esp32 use tasmota w/o tsl, S3 use development --- platformio.ini | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 872e651b8..e92ac9f95 100644 --- a/platformio.ini +++ b/platformio.ini @@ -39,8 +39,7 @@ unbuild_flags = ${common.core_unbuild_flags} [espressi32_base] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip -; platform = espressif32 +platform = espressif32 framework = arduino build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} @@ -66,6 +65,8 @@ check_flags = ; the Web interface is built seperately [env:ci] extends = espressi32_base +; use platform without TSL to save memory +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip extra_scripts = scripts/rename_fw.py board = esp32dev board_build.partitions = esp32_partition_4M.csv @@ -73,9 +74,10 @@ board_build.filesystem = littlefs build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} -; for github Actions actually standard platform is buggy, use dev-platform [env:ci_s3] extends = espressi32_base +; test with development platform +platform = https://github.com/platformio/platform-espressif32.git extra_scripts = scripts/rename_fw.py board = lolin_s3 board_build.f_cpu = 240000000L From c19345c345c26cc5aec8508ac26492be91f08275 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 8 Sep 2023 10:29:24 +0200 Subject: [PATCH 17/39] color wifiicon in selector --- .../framework/network/WiFiNetworkSelector.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/interface/src/framework/network/WiFiNetworkSelector.tsx b/interface/src/framework/network/WiFiNetworkSelector.tsx index 9b3593ac4..865db65ab 100644 --- a/interface/src/framework/network/WiFiNetworkSelector.tsx +++ b/interface/src/framework/network/WiFiNetworkSelector.tsx @@ -1,10 +1,11 @@ import LockIcon from '@mui/icons-material/Lock'; import LockOpenIcon from '@mui/icons-material/LockOpen'; import WifiIcon from '@mui/icons-material/Wifi'; -import { Avatar, Badge, List, ListItem, ListItemAvatar, ListItemIcon, ListItemText } from '@mui/material'; +import { Avatar, Badge, List, ListItem, ListItemAvatar, ListItemIcon, ListItemText, useTheme } from '@mui/material'; import { useContext } from 'react'; import { WiFiConnectionContext } from './WiFiConnectionContext'; +import type { Theme } from '@mui/material'; import type { FC } from 'react'; import type { WiFiNetwork, WiFiNetworkList } from 'types'; import { MessageBox } from 'components'; @@ -42,8 +43,18 @@ export const networkSecurityMode = ({ encryption_type }: WiFiNetwork) => { } }; +const networkQualityHighlight = ({ rssi }: WiFiNetwork, theme: Theme) => { + if (rssi <= -85) { + return theme.palette.error.main; + } else if (rssi <= -75) { + return theme.palette.warning.main; + } + return theme.palette.success.main; +}; + const WiFiNetworkSelector: FC = ({ networkList }) => { const { LL } = useI18nContext(); + const theme = useTheme(); const wifiConnectionContext = useContext(WiFiConnectionContext); @@ -57,8 +68,8 @@ const WiFiNetworkSelector: FC = ({ networkList }) => { secondary={'Security: ' + networkSecurityMode(network) + ', Ch: ' + network.channel} /> - - + + From 6a7a9636ac4fd686c1110e261ec3be3632d8f2ee Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 9 Sep 2023 16:49:42 +0200 Subject: [PATCH 18/39] set esp32s2, esp32c3 to tasmota platform --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 7dcdc3c7e..e254cc9e3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -114,7 +114,7 @@ board_build.partitions = esp32_partition_16M.csv build_flags = ${common.build_flags} [env:lolin_c3_mini] -extends = espressi32_base +extends = espressi32_base_tasmota board = lolin_c3_mini board_upload.flash_size = 4MB board_build.partitions = esp32_asym_partition_4M.csv @@ -123,14 +123,14 @@ build_flags = ${common.build_flags} ; lolin C3 mini v1 needs special wifi init. ; https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi [env:lolin_c3_mini_v1] -extends = espressi32_base +extends = espressi32_base_tasmota board = lolin_c3_mini board_upload.flash_size = 4MB board_build.partitions = esp32_asym_partition_4M.csv build_flags = ${common.build_flags} -DBOARD_C3_MINI_V1 [env:lolin_s2_mini] -extends = espressi32_base +extends = espressi32_base_tasmota board = lolin_s2_mini board_upload.flash_size = 4MB board_build.partitions = esp32_asym_partition_4M.csv From 9c16e2008e02db83d7a7a69b64cf109b792156f5 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 9 Sep 2023 18:11:58 +0200 Subject: [PATCH 19/39] revert 'topic' to 't' --- src/mqtt.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index b1509112b..f3e2901ef 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1271,19 +1271,19 @@ void Mqtt::add_avty_to_doc(const char * state_t, const JsonObject & doc, const c StaticJsonDocument<512> avty_json; snprintf(tpl, sizeof(tpl), "%s/status", mqtt_base_.c_str()); - avty_json["topic"] = tpl; + avty_json["t"] = tpl; snprintf(tpl, sizeof(tpl), tpl_draft, "value == 'online'"); avty_json["val_tpl"] = tpl; avty.add(avty_json); avty_json.clear(); - avty_json["topic"] = state_t; + avty_json["t"] = state_t; snprintf(tpl, sizeof(tpl), tpl_draft, cond1 == nullptr ? "value is defined" : cond1); avty_json["val_tpl"] = tpl; avty.add(avty_json); if (cond2 != nullptr) { avty_json.clear(); - avty_json["topic"] = state_t; + avty_json["t"] = state_t; snprintf(tpl, sizeof(tpl), tpl_draft, cond2); avty_json["val_tpl"] = tpl; avty.add(avty_json); @@ -1291,7 +1291,7 @@ void Mqtt::add_avty_to_doc(const char * state_t, const JsonObject & doc, const c if (negcond != nullptr) { avty_json.clear(); - avty_json["topic"] = state_t; + avty_json["t"] = state_t; snprintf(tpl, sizeof(tpl), "{{'offline' if %s else 'online'}}", negcond); avty_json["val_tpl"] = tpl; avty.add(avty_json); From 7310db64263f13a9144388067cf8d1aae58361a4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 17 Sep 2023 09:21:47 +0200 Subject: [PATCH 20/39] update packages --- interface/package.json | 16 +- interface/yarn.lock | 403 ++++++++++++++++++++++------------------- 2 files changed, 221 insertions(+), 198 deletions(-) diff --git a/interface/package.json b/interface/package.json index 334fd10f1..4c2c842ba 100644 --- a/interface/package.json +++ b/interface/package.json @@ -22,13 +22,13 @@ "@alova/adapter-xhr": "^1.0.1", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.14.8", - "@mui/material": "^5.14.8", + "@mui/icons-material": "^5.14.9", + "@mui/material": "^5.14.9", "@preact/compat": "^17.1.2", "@prefresh/vite": "^2.4.1", "@table-library/react-table-library": "4.1.7", "@types/lodash-es": "^4.17.9", - "@types/node": "^20.6.0", + "@types/node": "^20.6.2", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@types/react-router-dom": "^5.3.3", @@ -43,18 +43,18 @@ "react-dom": "latest", "react-dropzone": "^14.2.3", "react-icons": "^4.11.0", - "react-router-dom": "^6.15.0", + "react-router-dom": "^6.16.0", "react-toastify": "^9.1.3", "sockette": "^2.0.6", "typesafe-i18n": "^5.26.2", "typescript": "^5.2.2" }, "devDependencies": { - "@babel/core": "^7.22.17", + "@babel/core": "^7.22.20", "@preact/preset-vite": "^2.5.0", "@types/babel__core": "^7", - "@typescript-eslint/eslint-plugin": "^6.6.0", - "@typescript-eslint/parser": "^6.6.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", "eslint": "^8.49.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.1.0", @@ -72,7 +72,7 @@ "terser": "^5.19.4", "vite": "^4.4.9", "vite-plugin-svgr": "^3.2.0", - "vite-tsconfig-paths": "^4.2.0" + "vite-tsconfig-paths": "^4.2.1" }, "packageManager": "yarn@3.4.1" } diff --git a/interface/yarn.lock b/interface/yarn.lock index 1d71c4e79..eac08ee04 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -79,26 +79,26 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.22.17": - version: 7.22.17 - resolution: "@babel/core@npm:7.22.17" +"@babel/core@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/core@npm:7.22.20" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.13 "@babel/generator": ^7.22.15 "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-module-transforms": ^7.22.17 + "@babel/helper-module-transforms": ^7.22.20 "@babel/helpers": ^7.22.15 "@babel/parser": ^7.22.16 "@babel/template": ^7.22.15 - "@babel/traverse": ^7.22.17 - "@babel/types": ^7.22.17 + "@babel/traverse": ^7.22.20 + "@babel/types": ^7.22.19 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 9ffd2cb1b860a0651f01927d9e84246860cef2e794bc7181e53770ebf80305e6b5ba5050786d8b44be0dc9832106b4e9c7749c4c05c7f711d7508a5fef9034ce + checksum: cf3fa046a6ec61022ce1dff54c32ecc86031a210e257189617b93872b438fe0793353d3f792ffcaf0a57903f1146f96cb88c3527453054cdb1d48d196413139f languageName: node linkType: hard @@ -161,6 +161,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 + languageName: node + linkType: hard + "@babel/helper-environment-visitor@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-environment-visitor@npm:7.22.5" @@ -205,18 +212,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.22.17": - version: 7.22.17 - resolution: "@babel/helper-module-transforms@npm:7.22.17" +"@babel/helper-module-transforms@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-module-transforms@npm:7.22.20" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-module-imports": ^7.22.15 "@babel/helper-simple-access": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.15 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 54d14e092bb15e0e95155890e4c2352e5cb97370e9669aa1066a6a066194f6da01d801516f219a66455add7d10c1b6345d7c2ecfce1b8e69213eb2cc4ba94e75 + checksum: 5d927ac0a6b69b5bb13a51d9be659471e6b97bc55897f5738a425f9f6c2bb6b440a50e319848407d9543e1747bc951da807cd4e0a6b1b933e790302780ad33eb languageName: node linkType: hard @@ -274,6 +281,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.22.19": + version: 7.22.19 + resolution: "@babel/helper-validator-identifier@npm:7.22.19" + checksum: 3588e9e5b810118da795fbde3189d79603e0ea7cc8783dcad1c5fa0a361c711e062c918fecd114d86bcae556371e5da2cf58ff980f2010259189139093a006aa + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-identifier@npm:7.22.5" @@ -403,7 +424,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.22.10, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7": version: 7.22.11 resolution: "@babel/runtime@npm:7.22.11" dependencies: @@ -412,6 +433,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/runtime@npm:7.22.15" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 96b74adfd1db812d06ed56d9db12acecfc844d252b93994ce4901433957bd28affba725622a4dc9e7f76384c4cb6cadc3d620d07817c8be9156eaedba5eea059 + languageName: node + linkType: hard + "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -470,21 +500,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.22.17": - version: 7.22.17 - resolution: "@babel/traverse@npm:7.22.17" +"@babel/traverse@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/traverse@npm:7.22.20" dependencies: "@babel/code-frame": ^7.22.13 "@babel/generator": ^7.22.15 - "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-function-name": ^7.22.5 "@babel/helper-hoist-variables": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 "@babel/parser": ^7.22.16 - "@babel/types": ^7.22.17 + "@babel/types": ^7.22.19 debug: ^4.1.0 globals: ^11.1.0 - checksum: c9bfa6d20caf50e529ac9359db4cd4a5c23f28536bf17e2d493135631ab68be456efda94ba71bf568be34c6d8e762b23cfd9f43fd52b09756cb0397446643d17 + checksum: ad79e056c970def0441a63832518c5dcfac3db749f0b8b7da0ece7742c4ac9555c1d2ced6a42557e79b5ede4f8f1fbb4bd4633cd44b47bd030ea454fd081cc70 languageName: node linkType: hard @@ -510,14 +540,14 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.22.17": - version: 7.22.17 - resolution: "@babel/types@npm:7.22.17" +"@babel/types@npm:^7.22.19": + version: 7.22.19 + resolution: "@babel/types@npm:7.22.19" dependencies: "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.15 + "@babel/helper-validator-identifier": ^7.22.19 to-fast-properties: ^2.0.0 - checksum: ca26bd1df1aa2707af058f70fb52898d31b209a8a5372330013870150182697e5ab45d6d661d433259e52b4e25396ad41d0b428158d5b856a030dc111d000359 + checksum: 42e12fcfd4be1732342c38cd131b000d612d1e93513396cb9e09f092c9d2d89a39ef8fe8ec2d4312ca380e28e42f24bfb27fdc2314efa716f434516a5ac976fe languageName: node linkType: hard @@ -863,41 +893,41 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.1": - version: 1.4.1 - resolution: "@floating-ui/core@npm:1.4.1" +"@floating-ui/core@npm:^1.4.2": + version: 1.5.0 + resolution: "@floating-ui/core@npm:1.5.0" dependencies: - "@floating-ui/utils": ^0.1.1 - checksum: 6a738ff3b5bcca2470904a2462a2700e32081f6e681e077fd63c8d0b389439511a2a16187589df156fac6e8f47d56bdc0afea64303b9341fb5886cff82d87758 + "@floating-ui/utils": ^0.1.3 + checksum: bca811cefd09c3f56c4cf58c3e94826c1ce4a0b40124e9030ddca2ef1cc68b4ddc5ba5b4d7cc94c9555aea6876d2428a77a2ae261fe5b39c79df247a9518b053 languageName: node linkType: hard -"@floating-ui/dom@npm:^1.3.0": - version: 1.5.1 - resolution: "@floating-ui/dom@npm:1.5.1" +"@floating-ui/dom@npm:^1.5.1": + version: 1.5.3 + resolution: "@floating-ui/dom@npm:1.5.3" dependencies: - "@floating-ui/core": ^1.4.1 - "@floating-ui/utils": ^0.1.1 - checksum: cda044e72b6e015af70ef482ff19cae34b085c69a04e3d5d48613a58f6e88b71dbd7cc2f2ae02fc1f5f29ad8ba13c1c3074e2a4416b8c73ede47139177b5749c + "@floating-ui/core": ^1.4.2 + "@floating-ui/utils": ^0.1.3 + checksum: e5f30b911f939e40003851077bba441f269ae689bdc43c674bee43aa98fc6b7a5f59be432d27b7be599b1e4ab7b15c752875ea777a89cff01d157e593b78b25b languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.1": - version: 2.0.1 - resolution: "@floating-ui/react-dom@npm:2.0.1" +"@floating-ui/react-dom@npm:^2.0.2": + version: 2.0.2 + resolution: "@floating-ui/react-dom@npm:2.0.2" dependencies: - "@floating-ui/dom": ^1.3.0 + "@floating-ui/dom": ^1.5.1 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 856c0c9de0a9117bcc69b1363fd9fa188133b9714394609db937903ab4330e9851becfd2a83453f40834de1a18377caf329b6b71afc1c69d7c5687f87da80ed4 + checksum: bfd07cfc9047a31e92e223dbbe48f2cdb75460126217b35cfbf8555eaf1718ce7c11f4ee4d39bdee89eaf9ad0a5c4dd9af443a552116fc3478a19a9f6283bdf6 languageName: node linkType: hard -"@floating-ui/utils@npm:^0.1.1": - version: 0.1.1 - resolution: "@floating-ui/utils@npm:0.1.1" - checksum: 3fca5a8bce10de87f78c9b9377db7d5a4c992f98adc3722e46725d9bd2a3a1051bb1c512caf5fe293752c660455df5f7b6a2153802f9299572fac3b565f4c407 +"@floating-ui/utils@npm:^0.1.3": + version: 0.1.3 + resolution: "@floating-ui/utils@npm:0.1.3" + checksum: 82df69ee3770d2c7c12124874215ac59d5e37680399fa948f2e355a800d18f305443754371083a7e546f879c7142e5e257e3595a5a852dbbfdcd3ec81d923fa3 languageName: node linkType: hard @@ -992,19 +1022,17 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.14": - version: 5.0.0-beta.14 - resolution: "@mui/base@npm:5.0.0-beta.14" +"@mui/base@npm:5.0.0-beta.15": + version: 5.0.0-beta.15 + resolution: "@mui/base@npm:5.0.0-beta.15" dependencies: - "@babel/runtime": ^7.22.10 - "@emotion/is-prop-valid": ^1.2.1 - "@floating-ui/react-dom": ^2.0.1 + "@babel/runtime": ^7.22.15 + "@floating-ui/react-dom": ^2.0.2 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.8 + "@mui/utils": ^5.14.9 "@popperjs/core": ^2.11.8 clsx: ^2.0.0 prop-types: ^15.8.1 - react-is: ^18.2.0 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -1012,22 +1040,22 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 9e1bfb7a45b0fd2e39f6175fc3a792bee3344b75903e0de965f12f8f3703efdeb9a06f8712a10de1cea1fe9c438820b98d21f9c32968cfcbe09d720a148b1d19 + checksum: 95f6bc53333635cba0046d74ef73cef1103dfa845d8c6ba461443ea5408739d5c9f300aa5bf0c1e63fc7ad4f6170e7854588557b7491a60c53b29a88710c12ad languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/core-downloads-tracker@npm:5.14.8" - checksum: 93d22affbc826e8e60c190548bb178bf1f616c21e1d3cbc8bef097fdefc0fd4f4788e7327063205816536886d0131064f94ff3d42eaf957a46f2234be6e1d040 +"@mui/core-downloads-tracker@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/core-downloads-tracker@npm:5.14.9" + checksum: aaf8575c65d34bae8c97cb7fe612c7d26b2fff6c09a71241008f92883173c6a9ac5b2beb5003b565594e0ce618c1d81083ef4da18c62c50ab909984e17526a33 languageName: node linkType: hard -"@mui/icons-material@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/icons-material@npm:5.14.8" +"@mui/icons-material@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/icons-material@npm:5.14.9" dependencies: - "@babel/runtime": ^7.22.10 + "@babel/runtime": ^7.22.15 peerDependencies: "@mui/material": ^5.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -1035,20 +1063,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 212e5563d3aa1918ec27dd4d5e4134e043bd002b078e2802e39841c1cce31e1eb2f5fbf13529b86995f402edbfc5f9cd9cb62625a43f8565928860eac537919f + checksum: 99f3c59b90d21edc5dc8fcb5c15d6dc01bd8ee8b48533e5b839d6cccdfec67fa18be2d4e6611913652d75d4b71691f1ecf250f984e4e81166ba7145274c5be82 languageName: node linkType: hard -"@mui/material@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/material@npm:5.14.8" +"@mui/material@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/material@npm:5.14.9" dependencies: - "@babel/runtime": ^7.22.10 - "@mui/base": 5.0.0-beta.14 - "@mui/core-downloads-tracker": ^5.14.8 - "@mui/system": ^5.14.8 + "@babel/runtime": ^7.22.15 + "@mui/base": 5.0.0-beta.15 + "@mui/core-downloads-tracker": ^5.14.9 + "@mui/system": ^5.14.9 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.8 + "@mui/utils": ^5.14.9 "@types/react-transition-group": ^4.4.6 clsx: ^2.0.0 csstype: ^3.1.2 @@ -1068,16 +1096,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: b26fb4966c005cb6bbc6195d0b22f254bf8f34d81e47ea10f459c06b893122958b16f438102ce56f105abc89f21b5705cad0b13d8d4401f2c8f672ed61519861 + checksum: 92366b60600986e5fdbc6f788e7c3f9855da1ab92635a93f81e217126f057fbe095a34b956e56dded3bdaf98fddc2bfad0a32ccd8292a287d8dde80bd604876c languageName: node linkType: hard -"@mui/private-theming@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/private-theming@npm:5.14.8" +"@mui/private-theming@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/private-theming@npm:5.14.9" dependencies: - "@babel/runtime": ^7.22.10 - "@mui/utils": ^5.14.8 + "@babel/runtime": ^7.22.15 + "@mui/utils": ^5.14.9 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -1085,18 +1113,19 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 5d92f9afaf31ff2610cc455277f3ff1be5ce5de5b40d0747a60de7fef7ec82127d167cade843054318885dec634a1fe070757f269045c5fd9ac3610be9ede31a + checksum: 30eec37e14d46d763c5c307e8b51b89d93222fda4cf6a82500dce28c65932155cade59e47aaa0c1c6e407ab7acdf1956e438be6a36c4343d36af4c62270f1295 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/styled-engine@npm:5.14.8" +"@mui/styled-engine@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/styled-engine@npm:5.14.9" dependencies: - "@babel/runtime": ^7.22.10 + "@babel/runtime": ^7.22.15 "@emotion/cache": ^11.11.0 csstype: ^3.1.2 prop-types: ^15.8.1 + react: ^18.2.0 peerDependencies: "@emotion/react": ^11.4.1 "@emotion/styled": ^11.3.0 @@ -1106,19 +1135,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: d1848e34239a2fa4c833d27816845f730cf57481f815212094bcb5fd9f2040efd1e790de7f7b867bfdd6de3d7a5f9406607f853db399129d2789e6a408cb7f87 + checksum: 6ca263d1fcbc604898113f5e3d7b7f0a5592a30a0ca4e40d60ddcf8cf300bed6a042aff9140264da99f71a6661a412810a60fe8f28221e33d69fe34b9914e4b4 languageName: node linkType: hard -"@mui/system@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/system@npm:5.14.8" +"@mui/system@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/system@npm:5.14.9" dependencies: - "@babel/runtime": ^7.22.10 - "@mui/private-theming": ^5.14.8 - "@mui/styled-engine": ^5.14.8 + "@babel/runtime": ^7.22.15 + "@mui/private-theming": ^5.14.9 + "@mui/styled-engine": ^5.14.9 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.8 + "@mui/utils": ^5.14.9 clsx: ^2.0.0 csstype: ^3.1.2 prop-types: ^15.8.1 @@ -1134,7 +1163,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 3333b2a8af50c3b9cbf8a4955af911635a49151a2ff75f32cd677becaa69d6a3a9814ae798e3aeb4c439ea5f1e24c66747f2434ddab70f7ff690700e69417bdb + checksum: cd74cfcb8f5e3f3344d1791a18aad22df03d966ee1ae1dd590ed291eeb0d474622d48a272695b9570e4eac399e6004291ef83313d4084212e60409361a0913bd languageName: node linkType: hard @@ -1150,18 +1179,21 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/utils@npm:5.14.8" +"@mui/utils@npm:^5.14.9": + version: 5.14.9 + resolution: "@mui/utils@npm:5.14.9" dependencies: - "@babel/runtime": ^7.22.10 - "@types/prop-types": ^15.7.5 - "@types/react-is": ^18.2.1 + "@babel/runtime": ^7.22.15 prop-types: ^15.8.1 react-is: ^18.2.0 peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 - checksum: 1949563a793a36eb31df0bc2f7cad3cffd5537cd18a130d4245e00e9f83deb9e8dccb99c530aec661a9e62262b219a4b19f0cfdaaf09ab31f3df2f28fb7f1201 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: b78fd9aaf49967a117fcb398198ef7a18eff23a92b6529982bb0fe913a3dd6545371c995bd4b8376eed425e9de36157091c5211a7e6d141429d8651d6e9184af languageName: node linkType: hard @@ -1296,10 +1328,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.8.0": - version: 1.8.0 - resolution: "@remix-run/router@npm:1.8.0" - checksum: 19412054e6d5e2e77e57735b2d937372f9ac164187180fe211c79bee04f1f5db91b859ef72f92055bffee3eb3eaa1aebe5033e366415cc386b4f345b08607eee +"@remix-run/router@npm:1.9.0": + version: 1.9.0 + resolution: "@remix-run/router@npm:1.9.0" + checksum: 560ee341719634d273b8502e00e15b3dc4a0d245cb0a3d9663981a70967cba8675d0ac3ddd94e8f572ae66f6fd2618304130a077faec49bf30347c3241e64b28 languageName: node linkType: hard @@ -1560,10 +1592,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.6.0": - version: 20.6.0 - resolution: "@types/node@npm:20.6.0" - checksum: 0979a218f1862a80ddb7a8ba70498798a72e4861394244657c47bd64ed0c87baa4e0c8ce693bab23e58ec272913438b341de98768dc737491c58e6faff19d955 +"@types/node@npm:^20.6.2": + version: 20.6.2 + resolution: "@types/node@npm:20.6.2" + checksum: e490a743f97779797e1cccb2cba9eb7b753c376a401e88fd3ba9b999e0e8f9851417f250639663e42e5d068f885b650972f8edbd9a3175c2f7b14e4ef206479c languageName: node linkType: hard @@ -1574,7 +1606,7 @@ __metadata: languageName: node linkType: hard -"@types/prop-types@npm:*, @types/prop-types@npm:^15.7.5": +"@types/prop-types@npm:*": version: 15.7.5 resolution: "@types/prop-types@npm:15.7.5" checksum: 648aae41423821c61c83823ae36116c8d0f68258f8b609bdbc257752dcd616438d6343d554262aa9a7edaee5a19aca2e028a74fa2d0f40fffaf2816bc7056857 @@ -1590,15 +1622,6 @@ __metadata: languageName: node linkType: hard -"@types/react-is@npm:^18.2.1": - version: 18.2.1 - resolution: "@types/react-is@npm:18.2.1" - dependencies: - "@types/react": "*" - checksum: 0d426ef34c23383760c718b9902a8262099ff81466685034594bf3b7a183356627806ba19610b16da51358f6389f1d83e6f843b7781c39218cfc7f4da5536e8b - languageName: node - linkType: hard - "@types/react-router-dom@npm:^5.3.3": version: 5.3.3 resolution: "@types/react-router-dom@npm:5.3.3" @@ -1654,15 +1677,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.6.0" +"@typescript-eslint/eslint-plugin@npm:^6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.7.0" dependencies: "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.6.0 - "@typescript-eslint/type-utils": 6.6.0 - "@typescript-eslint/utils": 6.6.0 - "@typescript-eslint/visitor-keys": 6.6.0 + "@typescript-eslint/scope-manager": 6.7.0 + "@typescript-eslint/type-utils": 6.7.0 + "@typescript-eslint/utils": 6.7.0 + "@typescript-eslint/visitor-keys": 6.7.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.4 @@ -1675,44 +1698,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: be6d0b4e79cb5890c3786cd87870db394914cf980cb60b756b5a2395c62743cf4c19cf81c57548ff19d141f1c967b6ab1a2c73eb7ddee261154b81d9041da923 + checksum: f78a8de1311776bb3dd614f4a7d9cb098601ea0ccc1bec2317518794c473a813ccc58262304b999170720c16c280b56b928ba98aaa1c6a2ff9e73b7a7f9a831a languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/parser@npm:6.6.0" +"@typescript-eslint/parser@npm:^6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/parser@npm:6.7.0" dependencies: - "@typescript-eslint/scope-manager": 6.6.0 - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/typescript-estree": 6.6.0 - "@typescript-eslint/visitor-keys": 6.6.0 + "@typescript-eslint/scope-manager": 6.7.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/typescript-estree": 6.7.0 + "@typescript-eslint/visitor-keys": 6.7.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 869601abdd8a70d4cb823bda7ba838fe6ce28f908e25b8028c07cf2cc56bfe5b79f5a4b2421d5f7027bcdb2ad56df6d4eddf7903182caa384ea8b0353ca3a64e + checksum: 2b15d9b1624b68ea0e17f401809d1a6e5f212ff922c45a0e63bf9bc584c1a5608a461f1c5f3d781f2060556ec512b7d957d5162848c957b96f54f485e128a93b languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/scope-manager@npm:6.6.0" +"@typescript-eslint/scope-manager@npm:6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/scope-manager@npm:6.7.0" dependencies: - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/visitor-keys": 6.6.0 - checksum: 881dc83a6cc0770bff5dd1f709883c829801241486f96e4fc38ca3e817cc33b4e09238c724974004ab2e3ffd31f1423d20e309d1c34e9bdb07e008a6f8fdee21 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/visitor-keys": 6.7.0 + checksum: c4cfb790c61eec7e1b6309eb6cc7d863b4d3dfc84e844dfee9fe21ddc86e68b4fde1f70ef5f26ce7c0f66b73f410d51c2f80b97dc697b77aef1f54b9fbbd23c4 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/type-utils@npm:6.6.0" +"@typescript-eslint/type-utils@npm:6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/type-utils@npm:6.7.0" dependencies: - "@typescript-eslint/typescript-estree": 6.6.0 - "@typescript-eslint/utils": 6.6.0 + "@typescript-eslint/typescript-estree": 6.7.0 + "@typescript-eslint/utils": 6.7.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -1720,23 +1743,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9365b4b6f7200a86c7f78c462845e1cf252b0ce46a358de850f9d7d37afd9e34d40ac144760dcff6b3d6fe536310fa76cfc21acb680e2d98c7c6222ea8612892 + checksum: 40eff7625ae7a9d32cf3e413891196ab32ef6472eef563e191fa388b3f717515e43395de34e80c763a9e4e36e71494df19a04ad3d0bb4db1df5e8833c5c6b337 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/types@npm:6.6.0" - checksum: b48fa3574e0c6498cffb0fda0836a1e7cc10d19dca4e0fd0718feb233da1b428f49645324dc65173385c2b7f81bb42348aa376fe47fbb15664315b7429cc7223 +"@typescript-eslint/types@npm:6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/types@npm:6.7.0" + checksum: 7d79d5dafa8003de00721e0c6983dc24bfee249b9d2e072044f3a4ec5d85aa90c7d095531dc081f4da607e2ad8aa67a6f401fa840b5a3b3eea05d8ac6bb6a006 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.6.0" +"@typescript-eslint/typescript-estree@npm:6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.7.0" dependencies: - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/visitor-keys": 6.6.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/visitor-keys": 6.7.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -1745,34 +1768,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: bacdc5ea194c0bf3defa61f5be1e2367bcbf3457277e4e17d3fb1bfefa191431df6bb456d3625670cd80dd2184184bea61fa9afbba056ea590f9abcbdd665fec + checksum: 61a9a6988e706c23796bb2a3dce063c216c78cdca62a54268c54a8ebe784794791fde52cf07204f1c026e4d06dee3efd732138a93bd5e6f6d87bc51c0c9c13ca languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/utils@npm:6.6.0" +"@typescript-eslint/utils@npm:6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/utils@npm:6.7.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 "@types/json-schema": ^7.0.12 "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.6.0 - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/typescript-estree": 6.6.0 + "@typescript-eslint/scope-manager": 6.7.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/typescript-estree": 6.7.0 semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: b24db4396a2a796f57565f3dd9fd60c38fb2b64d62c9df5e145b246d2ddab53503cd96f77d0005155160fa8b94699b4c458ea7b41bbe12c4ea2f5c92487abf1b + checksum: c8ca9c3c078d7adc2da241046821627c6283a23aece46ee9f6c2464217190efb7838e6a669ca8b194693a6975c2dcbbda45e1376959c30a6be6953ab19d1268d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.6.0": - version: 6.6.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.6.0" +"@typescript-eslint/visitor-keys@npm:6.7.0": + version: 6.7.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.7.0" dependencies: - "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/types": 6.7.0 eslint-visitor-keys: ^3.4.1 - checksum: 916331900aa39f91eb509954169b1230ba979577343ab6d4e380862c29408053c3325c852501241ff17c4e46ffb80ca28217f9781f627db2d20b3c4d9691ab69 + checksum: 44405ba105d91f47387346c025bfbbefec111b3d7effcb97e47ac179bbc8717ccb3f129d9fa0545c3f56916706362f1b6f0c2ff2bad73b58cfdf2c71ed8cf982 languageName: node linkType: hard @@ -1781,23 +1804,23 @@ __metadata: resolution: "EMS-ESP@workspace:." dependencies: "@alova/adapter-xhr": ^1.0.1 - "@babel/core": ^7.22.17 + "@babel/core": ^7.22.20 "@emotion/react": ^11.11.1 "@emotion/styled": ^11.11.0 - "@mui/icons-material": ^5.14.8 - "@mui/material": ^5.14.8 + "@mui/icons-material": ^5.14.9 + "@mui/material": ^5.14.9 "@preact/compat": ^17.1.2 "@preact/preset-vite": ^2.5.0 "@prefresh/vite": ^2.4.1 "@table-library/react-table-library": 4.1.7 "@types/babel__core": ^7 "@types/lodash-es": ^4.17.9 - "@types/node": ^20.6.0 + "@types/node": ^20.6.2 "@types/react": ^18.2.21 "@types/react-dom": ^18.2.7 "@types/react-router-dom": ^5.3.3 - "@typescript-eslint/eslint-plugin": ^6.6.0 - "@typescript-eslint/parser": ^6.6.0 + "@typescript-eslint/eslint-plugin": ^6.7.0 + "@typescript-eslint/parser": ^6.7.0 alova: ^2.11.1 async-validator: ^4.2.5 eslint: ^8.49.0 @@ -1822,7 +1845,7 @@ __metadata: react-dom: latest react-dropzone: ^14.2.3 react-icons: ^4.11.0 - react-router-dom: ^6.15.0 + react-router-dom: ^6.16.0 react-toastify: ^9.1.3 rollup-plugin-visualizer: ^5.9.2 sockette: ^2.0.6 @@ -1831,7 +1854,7 @@ __metadata: typescript: ^5.2.2 vite: ^4.4.9 vite-plugin-svgr: ^3.2.0 - vite-tsconfig-paths: ^4.2.0 + vite-tsconfig-paths: ^4.2.1 languageName: unknown linkType: soft @@ -5205,27 +5228,27 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:^6.15.0": - version: 6.15.0 - resolution: "react-router-dom@npm:6.15.0" +"react-router-dom@npm:^6.16.0": + version: 6.16.0 + resolution: "react-router-dom@npm:6.16.0" dependencies: - "@remix-run/router": 1.8.0 - react-router: 6.15.0 + "@remix-run/router": 1.9.0 + react-router: 6.16.0 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 2555468ab38468c7449d617ed2f60f07a310078b71a1a8db907bc354064f6d34e03f5d9d273d3d8528c04dbb51c27bfa40eb2167cff9df4a19438003c4b04280 + checksum: f1d898115b395038bc44d295412f0ab480ee3057fb2306048bf64c9c4b3a6e4eba756b058a0557e71e86bddb1090d298849fa22c0d8aa5abcecfa3a61204f7a3 languageName: node linkType: hard -"react-router@npm:6.15.0": - version: 6.15.0 - resolution: "react-router@npm:6.15.0" +"react-router@npm:6.16.0": + version: 6.16.0 + resolution: "react-router@npm:6.16.0" dependencies: - "@remix-run/router": 1.8.0 + "@remix-run/router": 1.9.0 peerDependencies: react: ">=16.8" - checksum: 19be638294926e2d6b1ca6de753d3b69ac9cd3e295158f933a2c5d9befe2d6dd84f2b15d45d904ac5009f813901183b0a92d50f9d4c2f496c974192b0b8fb2ec + checksum: 914e3352f26d9d9e3f859483507d459f2bb01ca65fcd1a3f9c5dba91dd005b45e7aae32dbd0f777ea00ecf453dc0e20463d3bcbbdec6ce13f8235be377f66752 languageName: node linkType: hard @@ -5279,7 +5302,7 @@ __metadata: languageName: node linkType: hard -"react@npm:latest": +"react@npm:^18.2.0, react@npm:latest": version: 18.2.0 resolution: "react@npm:18.2.0" dependencies: @@ -6244,9 +6267,9 @@ __metadata: languageName: node linkType: hard -"vite-tsconfig-paths@npm:^4.2.0": - version: 4.2.0 - resolution: "vite-tsconfig-paths@npm:4.2.0" +"vite-tsconfig-paths@npm:^4.2.1": + version: 4.2.1 + resolution: "vite-tsconfig-paths@npm:4.2.1" dependencies: debug: ^4.1.1 globrex: ^0.1.2 @@ -6256,7 +6279,7 @@ __metadata: peerDependenciesMeta: vite: optional: true - checksum: 04bd792bb4f6b4fb57ec8368cff076abffba8d6923af032affb14be43b6e2dfd8b25085947a3204d702a8c8e9d79d3c361373cf98566df682420728857906289 + checksum: 982fb89b9e970fa69536688cecef020a7d0df3651364b88dba66297800b81cfbe397dec41b11f9afbd3a0559bf15964ee2b4caf9a308ebd3efc158fffdc401bf languageName: node linkType: hard From 9d3456cb3ab1d9a70593cbd648d518bdbba32b22 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 17 Sep 2023 09:22:25 +0200 Subject: [PATCH 21/39] show scheduler/custom always --- src/analogsensor.h | 4 ---- src/command.cpp | 36 ++++++++++++++++++--------------- src/web/WebEntityService.cpp | 15 +++++++------- src/web/WebSchedulerService.cpp | 15 +++++++------- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/analogsensor.h b/src/analogsensor.h index cc931539b..132b20e50 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -23,10 +23,6 @@ #include "mqtt.h" #include "console.h" -#ifndef EMSESP_STANDALONE -#include "driver/adc.h" -#endif - #include namespace emsesp { diff --git a/src/command.cpp b/src/command.cpp index 0ef48306e..b3633db8b 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -541,19 +541,23 @@ bool Command::device_has_commands(const uint8_t device_type) { } if (device_type == EMSdevice::DeviceType::SCHEDULER) { - return EMSESP::webSchedulerService.has_commands(); + return true; // we always have info + // return EMSESP::webSchedulerService.has_commands(); } if (device_type == EMSdevice::DeviceType::CUSTOM) { - return (EMSESP::webEntityService.count_entities() != 0); + return true; // we always have info + // return (EMSESP::webEntityService.count_entities() != 0); } if (device_type == EMSdevice::DeviceType::TEMPERATURESENSOR) { - return (EMSESP::temperaturesensor_.have_sensors()); + return true; // we always have info + // return (EMSESP::temperaturesensor_.have_sensors()); } if (device_type == EMSdevice::DeviceType::ANALOGSENSOR) { - return (EMSESP::analogsensor_.have_sensors()); + return EMSESP::system_.analog_enabled(); + // return (EMSESP::analogsensor_.have_sensors()); } for (const auto & emsdevice : EMSESP::emsdevices) { @@ -574,13 +578,13 @@ bool Command::device_has_commands(const uint8_t device_type) { void Command::show_devices(uuid::console::Shell & shell) { shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::SYSTEM)); - if (EMSESP::webSchedulerService.has_commands()) { + // if (EMSESP::webSchedulerService.has_commands()) { shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::SCHEDULER)); - } - if (EMSESP::temperaturesensor_.have_sensors()) { + // } + // if (EMSESP::temperaturesensor_.have_sensors()) { shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::TEMPERATURESENSOR)); - } - if (EMSESP::analogsensor_.have_sensors()) { + // } + if (EMSESP::analogsensor_.analog_enabled()) { shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::ANALOGSENSOR)); } @@ -608,7 +612,7 @@ void Command::show_all(uuid::console::Shell & shell) { show(shell, EMSdevice::DeviceType::SYSTEM, true); // show Custom - if (EMSESP::webEntityService.has_commands()) { + // if (EMSESP::webEntityService.has_commands()) { shell.print(COLOR_BOLD_ON); shell.print(COLOR_YELLOW); shell.printf(" %s: ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::CUSTOM)); @@ -618,10 +622,10 @@ void Command::show_all(uuid::console::Shell & shell) { shell.printf(" commands: %slists all commands %s*", COLOR_BRIGHT_CYAN, COLOR_BRIGHT_RED); shell.print(COLOR_RESET); show(shell, EMSdevice::DeviceType::CUSTOM, true); - } + // } // show scheduler - if (EMSESP::webSchedulerService.has_commands()) { + // if (EMSESP::webSchedulerService.has_commands()) { shell.print(COLOR_BOLD_ON); shell.print(COLOR_YELLOW); shell.printf(" %s: ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::SCHEDULER)); @@ -631,17 +635,17 @@ void Command::show_all(uuid::console::Shell & shell) { shell.printf(" commands: %slists all commands %s*", COLOR_BRIGHT_CYAN, COLOR_BRIGHT_RED); shell.print(COLOR_RESET); show(shell, EMSdevice::DeviceType::SCHEDULER, true); - } + // } // show sensors - if (EMSESP::temperaturesensor_.have_sensors()) { + // if (EMSESP::temperaturesensor_.have_sensors()) { shell.print(COLOR_BOLD_ON); shell.print(COLOR_YELLOW); shell.printf(" %s: ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::TEMPERATURESENSOR)); shell.print(COLOR_RESET); show(shell, EMSdevice::DeviceType::TEMPERATURESENSOR, true); - } - if (EMSESP::analogsensor_.have_sensors()) { + // } + if (EMSESP::analogsensor_.analog_enabled()) { shell.print(COLOR_BOLD_ON); shell.print(COLOR_YELLOW); shell.printf(" %s: ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::ANALOGSENSOR)); diff --git a/src/web/WebEntityService.cpp b/src/web/WebEntityService.cpp index 1919c5eb3..a183ed0ac 100644 --- a/src/web/WebEntityService.cpp +++ b/src/web/WebEntityService.cpp @@ -217,24 +217,25 @@ void WebEntityService::render_value(JsonObject & output, EntityItem entity, cons // process json output for info/commands and value_info bool WebEntityService::get_value_info(JsonObject & output, const char * cmd) { EMSESP::webEntityService.read([&](WebEntity & webEntity) { entityItems = &webEntity.entityItems; }); - if (entityItems->size() == 0) { - return false; - } - if (Helpers::toLower(cmd) == "commands") { - output["info"] = "list all values"; - output["commands"] = "list all commands"; + if (Helpers::toLower(cmd) == F_(commands)) { + output[F_(info)] = Helpers::translated_word(FL_(info_cmd)); + output[F_(commands)] = Helpers::translated_word(FL_(commands_cmd)); for (const auto & entity : *entityItems) { output[entity.name] = "custom entitiy"; } return true; } - if (strlen(cmd) == 0 || Helpers::toLower(cmd) == "values" || Helpers::toLower(cmd) == "info") { + if (strlen(cmd) == 0 || Helpers::toLower(cmd) == F_(values) || Helpers::toLower(cmd) == F_(info)) { // list all names for (const EntityItem & entity : *entityItems) { render_value(output, entity); } return (output.size() != 0); } + if (entityItems->size() == 0) { + output["message"] = "no custom entities"; + return false; + } char command_s[30]; strlcpy(command_s, cmd, sizeof(command_s)); char * attribute_s = nullptr; diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index b7b166a26..4e84f9c31 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -132,12 +132,9 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string // process json output for info/commands and value_info bool WebSchedulerService::get_value_info(JsonObject & output, const char * cmd) { EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); - if (scheduleItems->size() == 0) { - return false; - } - if (Helpers::toLower(cmd) == "commands") { - output["info"] = "lists all values"; - output["commands"] = "lists all commands"; + if (Helpers::toLower(cmd) == F_(commands)) { + output[F_(info)] = Helpers::translated_word(FL_(info_cmd)); + output[F_(commands)] = Helpers::translated_word(FL_(commands_cmd)); for (const ScheduleItem & scheduleItem : *scheduleItems) { if (!scheduleItem.name.empty()) { output[scheduleItem.name] = "activate schedule"; @@ -145,7 +142,7 @@ bool WebSchedulerService::get_value_info(JsonObject & output, const char * cmd) } return true; } - if (strlen(cmd) == 0 || Helpers::toLower(cmd) == "values" || Helpers::toLower(cmd) == "info") { + if (strlen(cmd) == 0 || Helpers::toLower(cmd) == F_(values) || Helpers::toLower(cmd) == F_(info)) { // list all names for (const ScheduleItem & scheduleItem : *scheduleItems) { if (!scheduleItem.name.empty()) { @@ -161,6 +158,10 @@ bool WebSchedulerService::get_value_info(JsonObject & output, const char * cmd) } return (output.size() > 0); } + if (scheduleItems->size() == 0) { + output["message"] = "no schedules"; + return false; + } char command_s[30]; strlcpy(command_s, cmd, sizeof(command_s)); char * attribute_s = nullptr; From 8a16566f533c47e78066b4d572f6c254f166769c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 17 Sep 2023 09:22:57 +0200 Subject: [PATCH 22/39] translations --- src/locale_translations.h | 150 +++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 74 deletions(-) diff --git a/src/locale_translations.h b/src/locale_translations.h index a785b3827..552777754 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -68,9 +68,9 @@ MAKE_WORD_TRANSLATION(watch_cmd, "watch incoming telegrams", "Watch auf eingehen MAKE_WORD_TRANSLATION(publish_cmd, "publish all to MQTT", "Publiziere MQTT", "publiceer alles naar MQTT", "", "opublikuj wszystko na MQTT", "Publiser alt til MQTT", "", "Hepsini MQTTye gönder", "pubblica tutto su MQTT") // TODO translate MAKE_WORD_TRANSLATION(system_info_cmd, "show system status", "Zeige System-Status", "toon systeemstatus", "", "pokaż status systemu", "vis system status", "", "Sistem Durumunu Göster", "visualizza stati di sistema") // TODO translate MAKE_WORD_TRANSLATION(schedule_cmd, "enable schedule item", "Aktiviere Zeitplan", "activeer tijdschema item", "", "aktywuj wybrany harmonogram", "", "", "program öğesini etkinleştir", "abilitare l'elemento programmato") // TODO translate -MAKE_WORD_TRANSLATION(entity_cmd, "set custom value on ems", "Sende eigene Entitäten zu EMS", "verstuur custom waarde naar EMS", "", "wyślij własną wartość na EMS", "", "", "", "imposta valori personalizzati su EMS") // TODO translate -MAKE_WORD_TRANSLATION(commands_response, "get response", "Hole Antwort", "Verzoek om antwoord", "", "", "", "", "") // TODO translate -MAKE_WORD_TRANSLATION(coldshot_cmd, "send a cold shot of water", "", "", "", "", "", "", "", "") // TODO translate +MAKE_WORD_TRANSLATION(entity_cmd, "set custom value on ems", "Sende eigene Entitäten zu EMS", "verstuur custom waarde naar EMS", "", "wyślij własną wartość na EMS", "", "", "emp üzerinde özel değer ayarla", "imposta valori personalizzati su EMS") // TODO translate +MAKE_WORD_TRANSLATION(commands_response, "get response","Hole Antwort","Verzoek om antwoord", "", "", "", "gelen cevap", "") // TODO translate +MAKE_WORD_TRANSLATION(coldshot_cmd, "send a cold shot of water", "", "", "", "", "", "", "soğuk su gönder", "") // TODO translate // tags MAKE_WORD_TRANSLATION(tag_boiler_data_ww, "dhw", "WW", "dhw", "VV", "CWU", "dhw", "ecs", "SKS", "dhw") @@ -197,13 +197,13 @@ MAKE_WORD_TRANSLATION(deltaP4, "deltaP-4", "deltaP-4", "deltaP-4", "", "", "delt MAKE_WORD_TRANSLATION(none, "none", "keine", "geen", "ingen", "brak", "ingen", "aucun", "hiçbiri", "nessuno") MAKE_WORD_TRANSLATION(hot_water, "hot water", "Warmwasser", "warm water", "varmvatten", "c.w.u.", "varmtvann", "eau chaude", "sıcak su", "acqua calda") MAKE_WORD_TRANSLATION(pool, "pool", "Pool", "zwembad", "pool", "basen", "basseng", "piscine", "havuz", "piscina") -MAKE_WORD_TRANSLATION(outside_temp_alt, "outside temperature alt.", "Außentemp. alternativ", "alternatieve buitentemperatuur", "Alternativ utomhustemp.", "temp. zewn. alternat.", "alternativ utendørstemp.", "température extérieure alternative", "alternatif dış sıcaklık", "temperatura esterna alternativa") // TODO translate -MAKE_WORD_TRANSLATION(outside_temp_par, "outside temperature parallel", "Außentemp. parallel", "buitentemperatuur parallel", "Parallell utomhustemp.", "temp. zewn. równoległa", "parallell utendørstemp.", "température extérieure parallèle", "paralel dış sıcaklık", "temperatura esterna parallela") // TODO translate -MAKE_WORD_TRANSLATION(hp_prefered, "heatpump prefered", "Wärmepumpe bevorzugt", "voorkeur warmtepomp", "Värmepump föredraget", "preferowana pompa ciepła", "varmepumpe prioritert", "pompe à chaleur préférée", "tercih edilen pompa", "pompa di calore preferita") // TODO translate -MAKE_WORD_TRANSLATION(boiler_only, "boiler only", "nur Kessel", "uitsluitend cv ketel", "Värmepanna enbart", "tylko kocioł", "kun kjele", "chaudière uniquement", "sadece kazan", "solo caldaia") // TODO translate -MAKE_WORD_TRANSLATION(reduced_output, "reduced output", "Reduzierte Leistung", "gereduceerde output", "Reducerad produktion", "zmniejszona wydajność", "redusert ytelse", "sortie réduite", "düşürülmüş çıkış", "riduzione uscita") // TODO translate -MAKE_WORD_TRANSLATION(switchoff, "switch off hp", "WP ausschalten", "WP uitschakelen", "Värmepump avstängd", "wyłącz pompę ciepła", "slå av varmepumpe", "éteindre la PAC", "ısı pompasını kapat", "spegnimento pompa calore") // TODO translate -MAKE_WORD_TRANSLATION(perm, "perm. reduced", "perm. reduziert", "permanent gereduceerd", "Permanent reducerad", "stale zmniejszona wydajność", "permanent redusert", "réduction permanente", "sürekli azaltılmış", "riduzione permanente") // TODO translate +MAKE_WORD_TRANSLATION(outside_temp_alt, "outside temperature alt.", "Außentemp. alternativ", "alternatieve buitentemperatuur", "Alternativ utomhustemp.", "temp. zewn. alternat.", "alternativ utendørstemp.", "température extérieure alternative", "alternatif dış sıcaklık", "temperatura esterna alternativa") +MAKE_WORD_TRANSLATION(outside_temp_par, "outside temperature parallel", "Außentemp. parallel", "buitentemperatuur parallel", "Parallell utomhustemp.", "temp. zewn. równoległa", "parallell utendørstemp.", "température extérieure parallèle", "paralel dış sıcaklık", "temperatura esterna parallela") +MAKE_WORD_TRANSLATION(hp_prefered, "heatpump prefered", "Wärmepumpe bevorzugt", "voorkeur warmtepomp", "Värmepump föredraget", "preferowana pompa ciepła", "varmepumpe prioritert", "pompe à chaleur préférée", "tercih edilen pompa", "pompa di calore preferita") +MAKE_WORD_TRANSLATION(boiler_only, "boiler only", "nur Kessel", "uitsluitend cv ketel", "Värmepanna enbart", "tylko kocioł", "kun kjele", "chaudière uniquement", "sadece kazan", "solo caldaia") +MAKE_WORD_TRANSLATION(reduced_output, "reduced output", "Reduzierte Leistung", "gereduceerde output", "Reducerad produktion", "zmniejszona wydajność", "redusert ytelse", "sortie réduite", "düşürülmüş çıkış", "riduzione uscita") +MAKE_WORD_TRANSLATION(switchoff, "switch off hp", "WP ausschalten", "WP uitschakelen", "Värmepump avstängd", "wyłącz pompę ciepła", "slå av varmepumpe", "éteindre la PAC", "ısı pompasını kapat", "spegnimento pompa calore") +MAKE_WORD_TRANSLATION(perm, "perm. reduced", "perm. reduziert", "permanent gereduceerd", "Permanent reducerad", "stale zmniejszona wydajność", "permanent redusert", "réduction permanente", "sürekli azaltılmış", "riduzione permanente") // thermostat MAKE_WORD_TRANSLATION(seltemp, "selTemp", "Solltemperatur", "doeltemperatuur", "Börtemperatur", "temperatura zadana", "innstilt temperatur", "consigne température", "ayarlanmış sıcaklık", "temperatura di consegna") @@ -450,19 +450,19 @@ MAKE_TRANSLATION(fossileFactor, "fossilefactor", "fossile energy factor", "Energ MAKE_TRANSLATION(electricFactor, "electricfactor", "electric energy factor", "Energiefaktor elektrisch", "Energiefactor electrisch", "Elektrisk energifaktor", "udział energii elektrycznej", "elektrisk energifaktor", "facteur énergie électrique", "elektrik enerjisi faktörü", "fattore energia elettrica") MAKE_TRANSLATION(delayBoiler, "delayboiler", "delay boiler support", "Verzögerungs-Option", "Vertragingsoptie", "Fördröjningsoption", "opcja opóźnienia", "Fördörjningsoption", "option retardement chaudière", "kazan desteğini ötele", "opzione ritardo caldaia") MAKE_TRANSLATION(tempDiffBoiler, "tempdiffboiler", "temp diff boiler support", "Temperaturdifferenz-Option", "Verschiltemperatuuroptie", "Temperaturskillnadsoption", "opcja różnicy temperatur", "temperatursforskjell kjele", "option différence température", "sıcaklık farkı kazan desteği", "opzione differenza temperatura") -MAKE_TRANSLATION(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer Betrieb", "Stil bedrijf", "Tyst läge", "tryb cichy", "stillemodus", "mode faible bruit", "düşük ses modu", "modalità a basso rumore") // TODO translate -MAKE_TRANSLATION(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "Start stil bedrijf", "Tyst läge starttid", "początek trybu cichego", "stille modu starttid", "heure démarrage faible bruit", "düşük ses başlangıç", "ora di avvio a basso rumore") // TODO translate -MAKE_TRANSLATION(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "Stop stil bedrijf", "Tyst läge stopptid", "koniec trybu cichego", "stille modus stopptid", "heure arrêt faible bruit", "düşük ses bitiş", "ora di arresto funzionamento silenzioso") // TODO translate -MAKE_TRANSLATION(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "Energieprijs gas", "Gaspris", "cena energii z gazu", "energipris gass", "prix énergie gaz", "gaz enerjisi fiyatı", "prezzo energia gas") // TODO translate -MAKE_TRANSLATION(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "energieprijs electriciteit", "Elpris", "cena energii elektrycznej", "strømpris", "prix énergie électrique", "elektrik enerjisi fiyatı", "prezzo energia elettrica") // TODO translate -MAKE_TRANSLATION(energyPricePV, "energyfeedpv", "feed in PV", "PV Einspeisevergütung", "PV teruglevertarief", "PV Energi", "zasilanie energią PV", "strømpris PV", "alimentation PV", "giren güneş enerjisi", "energia fotovoltaico") // TODO translate -MAKE_TRANSLATION(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid Warmwasser", "Hybride ww", "Hybridläge varmvatten", "hybrydowa c.w.u.", "hybridmodus varmtvann", "ecs hybride", "hibrit SKS", "ACS ibrida") // TODO translate -MAKE_TRANSLATION(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "Luchtzuivering", "Luftreningsläge", "tryb oczyszczania powietrza", "luftsrensningsmodus", "mode purge air", "hava temizleme modu", "modalita spurgo aria") // TODO translate -MAKE_TRANSLATION(heatPumpOutput, "heatpumpoutput", "heatpump output", "WP Leistung", "WP output", "Värmepumpseffekt", "moc wyjściowa pompy ciepła", "varmepumpeeffekt", "sortie pompe à chaleur", "ısı pompası çıkışı", "prestazione pompa calore") // TODO translate -MAKE_TRANSLATION(coolingCircuit, "coolingcircuit", "cooling circuit", "Kühlkreislauf", "Koelcircuit", "Kylkrets", "obwód chłodzący", "kjølekrets", "circuit refroidissement", "soğutma devresi", "circuito raffreddante") // TODO translate -MAKE_TRANSLATION(compStartMod, "compstartmod", "compressor start modulation", "Kompressor Startleistung", "Beginvermogen compressor", "Kompressor startmodulering", "początkowa modulacja sprężarki", "kompressor startmodulering", "modulation démarrage compresseur", "kazan başlangıç modülasyonu", "avvio modulazione compressore") // TODO translate -MAKE_TRANSLATION(heatDrainPan, "heatdrainpan", "heat drain pan", "Wärmeausgleichsgefäß", "Vereffeningsvat", "Uppvärm. dränering", "zbiornik wyrównawczy ciepła", "oppvarming drenering", "bac récupération chaleur", "ısı tahliye tablası", "serbatoio scarico condensa") // TODO translate -MAKE_TRANSLATION(heatCable, "heatcable", "heating cable", "Heizband", "heating cable", "värmekabel", "przewód grzejny", "varmekabel", "câble chauffant", "ısıtma kablosu", "cavo riscaldante") // TODO translate +MAKE_TRANSLATION(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer Betrieb", "Stil bedrijf", "Tyst läge", "tryb cichy", "stillemodus", "mode faible bruit", "düşük ses modu", "modalità a basso rumore") +MAKE_TRANSLATION(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "Start stil bedrijf", "Tyst läge starttid", "początek trybu cichego", "stille modu starttid", "heure démarrage faible bruit", "düşük ses başlangıç", "ora di avvio a basso rumore") +MAKE_TRANSLATION(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "Stop stil bedrijf", "Tyst läge stopptid", "koniec trybu cichego", "stille modus stopptid", "heure arrêt faible bruit", "düşük ses bitiş", "ora di arresto funzionamento silenzioso") +MAKE_TRANSLATION(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "Energieprijs gas", "Gaspris", "cena energii z gazu", "energipris gass", "prix énergie gaz", "gaz enerjisi fiyatı", "prezzo energia gas") +MAKE_TRANSLATION(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "energieprijs electriciteit", "Elpris", "cena energii elektrycznej", "strømpris", "prix énergie électrique", "elektrik enerjisi fiyatı", "prezzo energia elettrica") +MAKE_TRANSLATION(energyPricePV, "energyfeedpv", "feed in PV", "PV Einspeisevergütung", "PV teruglevertarief", "PV Energi", "zasilanie energią PV", "strømpris PV", "alimentation PV", "giren güneş enerjisi", "energia fotovoltaico") +MAKE_TRANSLATION(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid Warmwasser", "Hybride ww", "Hybridläge varmvatten", "hybrydowa c.w.u.", "hybridmodus varmtvann", "ecs hybride", "hibrit SKS", "ACS ibrida") +MAKE_TRANSLATION(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "Luchtzuivering", "Luftreningsläge", "tryb oczyszczania powietrza", "luftsrensningsmodus", "mode purge air", "hava temizleme modu", "modalita spurgo aria") +MAKE_TRANSLATION(heatPumpOutput, "heatpumpoutput", "heatpump output", "WP Leistung", "WP output", "Värmepumpseffekt", "moc wyjściowa pompy ciepła", "varmepumpeeffekt", "sortie pompe à chaleur", "ısı pompası çıkışı", "prestazione pompa calore") +MAKE_TRANSLATION(coolingCircuit, "coolingcircuit", "cooling circuit", "Kühlkreislauf", "Koelcircuit", "Kylkrets", "obwód chłodzący", "kjølekrets", "circuit refroidissement", "soğutma devresi", "circuito raffreddante") +MAKE_TRANSLATION(compStartMod, "compstartmod", "compressor start modulation", "Kompressor Startleistung", "Beginvermogen compressor", "Kompressor startmodulering", "początkowa modulacja sprężarki", "kompressor startmodulering", "modulation démarrage compresseur", "kazan başlangıç modülasyonu", "avvio modulazione compressore") +MAKE_TRANSLATION(heatDrainPan, "heatdrainpan", "heat drain pan", "Wärmeausgleichsgefäß", "Vereffeningsvat", "Uppvärm. dränering", "zbiornik wyrównawczy ciepła", "oppvarming drenering", "bac récupération chaleur", "ısı tahliye tablası", "serbatoio scarico condensa") +MAKE_TRANSLATION(heatCable, "heatcable", "heating cable", "Heizband", "heating cable", "värmekabel", "przewód grzejny", "varmekabel", "câble chauffant", "ısıtma kablosu", "cavo riscaldante") // alternative heatsource AM200 MAKE_TRANSLATION(aCylTopTemp, "cyltoptemp", "cylinder top temperature", "Speichertemperatur Oben", "Buffer temperatuur boven", "Cylindertemperatur Toppen", "temperatura na górze cylindra", "beredertemperatur topp", "température haut cylindre", "silindir üst yüzey sıcaklığı", "temperatura superiore accumulo") @@ -501,13 +501,14 @@ MAKE_TRANSLATION(blockHyst, "blockhyst", "hyst. for boiler block", "Hysterese Sp MAKE_TRANSLATION(releaseWait, "releasewait", "boiler release wait time", "Wartezeit Kessel-Freigabe", "Wachttijd ketel vrijgave", "Väntetid Frisläppning", "czas oczekiwania na zwolnienie kotła", "kjele frigjøringsventetid", "temps attente libération chaudière", "kazan tahliyesi bekleme süresi", "tempo di attesa sblocco caldaia") // energy -MAKE_TRANSLATION(nrgHeat, "nrgheat", "energy heating", "Energie Heizen", "", "", "", "", "", "", "") -MAKE_TRANSLATION(nrgWw, "nrgww", "energy dhw", "Energie Warmwasser", "", "", "", "", "", "", "") -MAKE_TRANSLATION(nomPower, "nompower", "nominal Power", "Brennerleistung", "", "", "", "", "", "", "") +MAKE_TRANSLATION(nrgHeat, "nrgheat", "energy heating", "Energie Heizen", "", "", "", "", "", "ısıtma enerjisi", "") // TODO translate +MAKE_TRANSLATION(nrgWw, "nrgww", "energy dhw", "Energie Warmwasser", "", "", "", "", "", "sıcak kullanım suyu enerjisi", "") // TODO translate +MAKE_TRANSLATION(nomPower, "nompower", "nominal Power", "Brennerleistung", "", "", "", "", "", "nominal güç", "") // TODO translate + // HIU -MAKE_TRANSLATION(netFlowTemp, "netflowtemp", "heat network flow temp", "System Vorlauftemperatur", "Netto aanvoertemperatuur", "", "", "", "", "", "temperatura di mandata della rete di riscaldamento") -MAKE_TRANSLATION(cwFlowRate, "cwflowrate", "cold water flow rate", "Kaltwasser Durchfluss", "Stroomsnelheid koud water ", "", "", "", "", "", "portata acqua fredda") -MAKE_TRANSLATION(keepWarmTemp, "keepwarmtemp", "keep warm temperature", "Warmhaltetemperatur", "Warmhoudtemperatuur", "", "", "", "", "", "mantenere la temperatura calda") +MAKE_TRANSLATION(netFlowTemp, "netflowtemp", "heat network flow temp", "System Vorlauftemperatur", "Netto aanvoertemperatuur", "", "", "", "", "ısıtma şebekesi akış derecesi", "temperatura di mandata della rete di riscaldamento") // TODO translate +MAKE_TRANSLATION(cwFlowRate, "cwflowrate", "cold water flow rate", "Kaltwasser Durchfluss", "Stroomsnelheid koud water ", "", "", "", "", "soğuk su akış hızı", "portata acqua fredda") // TODO translate +MAKE_TRANSLATION(keepWarmTemp, "keepwarmtemp", "keep warm temperature","Warmhaltetemperatur", "Warmhoudtemperatuur", "", "", "", "", "sıcaklığı koruma derecesi", "mantenere la temperatura calda") // TODO translate // the following are dhw for the boiler and automatically tagged with 'dhw' MAKE_TRANSLATION(wwSelTemp, "wwseltemp", "selected temperature", "gewählte Temperatur", "Geselecteerd temperatuur", "Vald Temperatur", "temperatura wyższa/komfort", "valgt temperatur", "température sélectionnée", "seçili sıcaklık", "temperatura selezionata") @@ -554,20 +555,20 @@ MAKE_TRANSLATION(wwOneTimeKey, "wwonetimekey", "one time key function", "Einmall MAKE_TRANSLATION(wwSolarTemp, "wwsolartemp", "solar boiler temperature", "Solarboiler Temperatur", "Zonneboiler temperatuur", "Solpanel Temp", "temperatura zasobnika solarnego", "solpaneltemp", "température chaudière solaire", "güneş enerjisi kazan sıcaklığı", "temperatura pannello solare") // mqtt values / commands -MAKE_TRANSLATION(switchtime, "switchtime", "program switchtime", "Programm Schaltzeit", "Programma schakeltijd", "Program Bytestid", "program czasowy", "programbyttetid", "heure commutation programme", "", "ora commutazione programmata") // TODO translate -MAKE_TRANSLATION(switchtime1, "switchtime1", "own1 program switchtime", "Programm 1 Schaltzeit", "Schakeltijd programma 1", "Program 1 Bytestid", "program przełączania 1", "byttetidprogram 1", "heure de commutation programme 1", "", "ora commutazione programma 1") // TODO translate -MAKE_TRANSLATION(switchtime2, "switchtime2", "own2 program switchtime", "Programm 2 Schaltzeit", "Schakeltijd programma 2", "Program 2 Bytestid", "program przełączania 2", "byttetid program 2", "heure de changement programme 2", "", "ora commutazione programma 2") // TODO translate -MAKE_TRANSLATION(wwswitchtime, "wwswitchtime", "program switchtime", "Programm Schaltzeit", "Warm water programma schakeltijd", "Varmvattenprogram Bytestid", "program czasowy", "byttetid varmtvannsprogram", "heure commutation programme", "", "Tempo di commutazione del programma") // TODO translate -MAKE_TRANSLATION(wwcircswitchtime, "wwcircswitchtime", "circulation program switchtime", "Zirculationsprogramm Schaltzeit", "Schakeltijd circulatieprogramma", "Cirkulationsprogram Bytestid", "program cyrkulacji", "byttetid sirkulasjonsprogram", "heure commutation programme circulation", "", "ora commutazione programma circolazione") // TODO translate +MAKE_TRANSLATION(switchtime, "switchtime", "program switchtime", "Programm Schaltzeit", "Programma schakeltijd", "Program Bytestid", "program czasowy", "programbyttetid", "heure commutation programme", "program değiştirme süresi", "ora commutazione programmata") +MAKE_TRANSLATION(switchtime1, "switchtime1", "own1 program switchtime", "Programm 1 Schaltzeit", "Schakeltijd programma 1", "Program 1 Bytestid", "program przełączania 1", "byttetidprogram 1", "heure de commutation programme 1", "program1 değiştirme süresi", "ora commutazione programma 1") +MAKE_TRANSLATION(switchtime2, "switchtime2", "own2 program switchtime", "Programm 2 Schaltzeit", "Schakeltijd programma 2", "Program 2 Bytestid", "program przełączania 2", "byttetid program 2", "heure de changement programme 2", "program1 değiştirme süresi", "ora commutazione programma 2") +MAKE_TRANSLATION(wwswitchtime, "wwswitchtime", "program switchtime", "Programm Schaltzeit", "Warm water programma schakeltijd", "Varmvattenprogram Bytestid", "program czasowy", "byttetid varmtvannsprogram", "heure commutation programme", "sıcak kullanıom suyu program değiştirme süresi", "Tempo di commutazione del programma") +MAKE_TRANSLATION(wwcircswitchtime, "wwcircswitchtime", "circulation program switchtime", "Zirculationsprogramm Schaltzeit", "Schakeltijd circulatieprogramma", "Cirkulationsprogram Bytestid", "program cyrkulacji", "byttetid sirkulasjonsprogram", "heure commutation programme circulation", "sirkülasyon program değiştirme süresi", "ora commutazione programma circolazione") MAKE_TRANSLATION(dateTime, "datetime", "date/time", "Datum/Zeit", "Datum/Tijd", "Datum/Tid", "data i godzina", "dato/tid", "date/heure", "zaman/saat", "Data/Ora") MAKE_TRANSLATION(errorCode, "errorcode", "error code", "Fehlernummer", "Foutmeldingscode", "Felkod", "kod błędu", "feikode", "code erreur", "hata kodu", "codice errore") MAKE_TRANSLATION(ibaMainDisplay, "display", "display", "Anzeige", "Display", "Display", "wyświetlacz", "skjerm", "affichage", "ekran", "Display") MAKE_TRANSLATION(ibaLanguage, "language", "language", "Sprache", "Taal", "Sprak", "język", "språk", "langue", "dil", "Lingua") MAKE_TRANSLATION(ibaClockOffset, "clockoffset", "clock offset", "Uhrkorrektur", "Klokcorrectie", "Tidskorrigering", "korekta zegara", "tidskorrigering", "offset horloge", "saat farkı", "correzione orario") -MAKE_TRANSLATION(ibaBuildingType, "building", "building type", "Gebäudetyp", "Type gebouw", "Byggnadstyp", "typ budynku", "bygningstype", "type bâtiment", "bina tipi", "tipo di edificio") // TODO translate -MAKE_TRANSLATION(heatingPID, "heatingpid", "heating PID", "Heizungs-PID", "PID verwarming", "Uppvärmning PID", "PID ogrzewania", "oppvarmings PID", "PID chauffage", "PID ısınıyor", "PID-riscaldamento") // TODO translate -MAKE_TRANSLATION(ibaCalIntTemperature, "intoffset", "internal temperature offset", "Korrektur interner Temperatur", "Offset interne temperatuur", "Korrigering interntemperatur", "korekta temperatury w pomieszczeniu", "Korrigering interntemperatur", "offset température interne", "iç sıcaklık artışı", "scostamento della temperatura interna") // TODO translate -MAKE_TRANSLATION(ibaMinExtTemperature, "minexttemp", "minimal external temperature", "min. Aussentemperatur", "Min. buitentemperatuur", "Min Extern Temperatur", "minimalna miejscowa temperatura zewnętrzna", "minimal eksterntemperatur", "température extérieure minimale", "en düşük sış sıcaklık", "temperatura esterna minima") // TODO translate +MAKE_TRANSLATION(ibaBuildingType, "building", "building type", "Gebäudetyp", "Type gebouw", "Byggnadstyp", "typ budynku", "bygningstype", "type bâtiment", "bina tipi", "tipo di edificio") +MAKE_TRANSLATION(heatingPID, "heatingpid", "heating PID", "Heizungs-PID", "PID verwarming", "Uppvärmning PID", "PID ogrzewania", "oppvarmings PID", "PID chauffage", "PID ısınıyor", "PID-riscaldamento") +MAKE_TRANSLATION(ibaCalIntTemperature, "intoffset", "internal temperature offset", "Korrektur interner Temperatur", "Offset interne temperatuur", "Korrigering interntemperatur", "korekta temperatury w pomieszczeniu", "Korrigering interntemperatur", "offset température interne", "iç sıcaklık artışı", "scostamento della temperatura interna") +MAKE_TRANSLATION(ibaMinExtTemperature, "minexttemp", "minimal external temperature", "min. Aussentemperatur", "Min. buitentemperatuur", "Min Extern Temperatur", "minimalna miejscowa temperatura zewnętrzna", "minimal eksterntemperatur", "température extérieure minimale", "en düşük sış sıcaklık", "temperatura esterna minima") MAKE_TRANSLATION(backlight, "backlight", "key backlight", "Gegenlicht", "Toetsverlichting", "Bakgrundsbelysning", "podświetlenie klawiatury", "bakgrunnsbelysning", "rétroéclairage touches", "tuş takımı aydınlatması", "retroilluminazione dei tasti") MAKE_TRANSLATION(damping, "damping", "damping outdoor temperature", "Dämpfung der Außentemperatur", "Demping buitentemperatuur", "Utomhustemperatur dämpning", "tłumienie temperatury zewnętrznej", "demping av utetemperatur", "température extérieure minimale", "dış sıcaklığın sönümlenmesi", "smorzamento della temperatura esterna") MAKE_TRANSLATION(tempsensor1, "inttemp1", "temperature sensor 1", "Temperatursensor 1", "Temperatuursensor 1", "Temperatursensor 1", "czujnik temperatury 1", "temperatursensor 1", "sonde température 1", "sıcaklık sensörü 1", "sensore temperatura 1") @@ -580,13 +581,13 @@ MAKE_TRANSLATION(autodst, "autodst", "automatic change daylight saving time", "a MAKE_TRANSLATION(preheating, "preheating", "preheating in the clock program", "Vorheizen im Zeitprogramm", "Voorverwarming in het klokprogramma", "Förvärmning i tidsprogram", "podgrzewanie w programie czasowym", "forvarming i tidsprogram", "préchauffage dans programme horloge", "saat programında ön ısıtma", "preriscaldamento nel programma orologio") MAKE_TRANSLATION(offtemp, "offtemp", "temperature when mode is off", "Temperatur bei AUS", "Temperatuur bij UIT", "Temperatur Avslagen", "temperatura w trybie \"wył.\"", "temperatur avslått", "température lorsque mode désactivé", "mod kapalı iken sıcaklık", "temperatura quando la modalità è disattivata") MAKE_TRANSLATION(mixingvalves, "mixingvalves", "mixing valves", "Mischventile", "Mengkleppen", "Blandningsventiler", "zawory mieszające", "blandeventiler", "vannes mélange", "karışım vanaları", "valvole miscela") -MAKE_TRANSLATION(pvEnableWw, "pvenableww", "enable raise dhw", "aktiviere Anhebung WW", "Verhoging WW activeren", "", "podwyższenie c.w.u. z PV", "aktivere hevet temperatur bereder", "", "", "abilitare aumento ACS") // TODO translate -MAKE_TRANSLATION(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Anhebung Heizen mit PV", "Verwarmen met PV activeren", "", "podwyższenie grzania z PV", "heve varmen med solpanel", "", "", "Aumentare il riscaldamento con il solare") // TODO translate -MAKE_TRANSLATION(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "Verlagen koeling met PV activeren", "", "obniżenie chłodzenia z PV", "nedre kjøling solpanel", "", "", "Riduzione del raffreddamento con il solare") // TODO translate +MAKE_TRANSLATION(pvEnableWw, "pvenableww", "enable raise dhw", "aktiviere Anhebung WW", "Verhoging WW activeren", "", "podwyższenie c.w.u. z PV", "aktivere hevet temperatur bereder", "", "sıcak kullanım suyu yükseltmeyi etkinleştir", "abilitare aumento ACS") // TODO translate +MAKE_TRANSLATION(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Anhebung Heizen mit PV", "Verwarmen met PV activeren", "", "podwyższenie grzania z PV", "heve varmen med solpanel", "", "ısıtmayı G.E. İle yükselt", "Aumentare il riscaldamento con il solare") // TODO translate +MAKE_TRANSLATION(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "Verlagen koeling met PV activeren", "", "obniżenie chłodzenia z PV", "nedre kjøling solpanel", "", "soğutmayı G.E. İle düşür", "Riduzione del raffreddamento con il solare") // TODO translate // thermostat ww MAKE_TRANSLATION(wwMode, "wwmode", "mode", "Modus", "Modus", "Läge", "tryb pracy", "modus", "mode", "mod", "modalità") MAKE_TRANSLATION(wwSetTempLow, "wwsettemplow", "set low temperature", "untere Solltemperatur", "Onderste streeftemperatuur", "Nedre Börvärde", "zadana temperatura obniżona", "nedre settverdi", "réglage température basse", "hedef düşük sıcaklık", "imposta bassa temperatura") -MAKE_TRANSLATION(wwWhenModeOff, "wwwhenmodeoff", "when thermostat mode off", "bei Thermostatmodus AUS", "Als Thermostaat op UIT", "när Termostatläge är AV", "gdy wyłączono na termostacie", "når modus er av", "lorsque mode thermostat off", "", "quando termostato modalita OFF") +MAKE_TRANSLATION(wwWhenModeOff, "wwwhenmodeoff", "when thermostat mode off", "bei Thermostatmodus AUS", "Als Thermostaat op UIT", "när Termostatläge är AV", "gdy wyłączono na termostacie", "når modus er av", "lorsque mode thermostat off", "termostat modu kapalı olduğunda", "quando termostato modalita OFF") MAKE_TRANSLATION(wwExtra1, "wwextra1", "circuit 1 extra", "Kreis 1 Extra", "Circuit 1 extra", "Krets 1 Extra", "obieg dodatkowy 1", "ekstra krets 1", "circuit 1 extra", "devre 1 ekstra", "Circuito 1 extra") MAKE_TRANSLATION(wwExtra2, "wwextra2", "circuit 2 extra", "Kreis 2 Extra", "Circuit 2 extra", "Kets 2 Extra", "obieg dodatkowy 2", "ekstra krets 2", "circuit 2 extra", "devre 2 ekstra", "Circuito 2 extra") MAKE_TRANSLATION(wwCharge, "wwcharge", "charge", "Laden", "Laden", "Ladda", "grzanie", "lade", "charge", "doldurma", "carica") @@ -613,14 +614,14 @@ MAKE_TRANSLATION(nighttemp, "nighttemp", "night temperature", "Nachttemperatur", MAKE_TRANSLATION(nighttemp2, "nighttemp", "night temperature T1", "Nachttemperatur T1", "Nachttemperatuur T1", "Nattemperatur T1", "temperatura w nocy T1", "nattemperatur T1", "température nuit T1", "gece sıcaklığı T1", "temperatura notturna T1") MAKE_TRANSLATION(ecotemp, "ecotemp", "eco temperature", "eco Temperatur", "Temperatuur eco", "Eko-temperatur", "temperatura w trybie eko", "øko temperatur", "température éco", "eko sıcaklık", "Temperatura eco") MAKE_TRANSLATION(manualtemp, "manualtemp", "manual temperature", "manuelle Temperatur", "Temperatuur handmatig", "Temperatur Manuell", "temperatura ustawiona ręcznie", "manuell temperatur", "température manuelle", "manuel sıcaklık", "temperatura manuale") -MAKE_TRANSLATION(tempautotemp, "tempautotemp", "temporary set temperature automode", "temporäre Solltemperatur", "Streeftemperatuur automodus tijdelijk", "Temporär Aktivering av Auto-läge", "zadana temperatura w pomieszczenia w trybie \"auto\" (tymczasowa)", "temporær valgt temp i automodus", "température temporaire mode automatique", "", "impostare temporaneamente temperatura automatica") -MAKE_TRANSLATION(remoteseltemp, "remoteseltemp", "temporary set temperature from remote", "temporäre Solltemperatur Remote", "Temperatuur van afstandsbedieding", "Temperatur från fjärruppkoppling", "zadana zdalnie temperatura a pomieszczeniu (tymczasowa)", "temporær valgt temp fra fjernbetjening", "température temporaire depuis télécommande", "", "Temperatura temporanea da remoto") +MAKE_TRANSLATION(tempautotemp, "tempautotemp", "temporary set temperature automode", "temporäre Solltemperatur", "Streeftemperatuur automodus tijdelijk", "Temporär Aktivering av Auto-läge", "zadana temperatura w pomieszczenia w trybie \"auto\" (tymczasowa)", "temporær valgt temp i automodus", "température temporaire mode automatique", "geçici ayarlı sıcaklık otomatik mod", "impostare temporaneamente temperatura automatica") +MAKE_TRANSLATION(remoteseltemp, "remoteseltemp", "temporary set temperature from remote", "temporäre Solltemperatur Remote", "Temperatuur van afstandsbedieding", "Temperatur från fjärruppkoppling", "zadana zdalnie temperatura a pomieszczeniu (tymczasowa)", "temporær valgt temp fra fjernbetjening", "température temporaire depuis télécommande", "geçici ayarlı sıcaklık uzaktan", "Temperatura temporanea da remoto") MAKE_TRANSLATION(comforttemp, "comforttemp", "comfort temperature", "Komforttemperatur", "Comforttemperatuur", "Komforttemperatur", "temperatura w trybie komfort", "komforttemperatur", "température confort", "konfor sıcaklığı", "temperatura comfort") MAKE_TRANSLATION(summertemp, "summertemp", "summer temperature", "Sommertemperatur", "Zomertemperatuur", "Sommartemperatur", "temperatura przełączania lato/zima", "Sommertemperatur", "température été", "yaz sıcaklığı", "temperatura estiva") -MAKE_TRANSLATION(designtemp, "designtemp", "design temperature", "Auslegungstemperatur", "Ontwerptemperatuur", "Design-temperatur", "temperatura projektowa", "designtemperatur", "température conception", "", "temperatura predefinita") +MAKE_TRANSLATION(designtemp, "designtemp", "design temperature", "Auslegungstemperatur", "Ontwerptemperatuur", "Design-temperatur", "temperatura projektowa", "designtemperatur", "température conception", "özel sıcaklık", "temperatura predefinita") MAKE_TRANSLATION(offsettemp, "offsettemp", "offset temperature", "Temperaturanhebung", "Temperatuur offset", "Temperaturkorrigering", "korekta temperatury", "temperaturkorrigering", "température offset", "artış sıcaklığı", "aumento della temperatura") -MAKE_TRANSLATION(minflowtemp, "minflowtemp", "min flow temperature", "min Vorlauftemperatur", "Minimale aanvoertemperatuur", "Min Flödestemperatur", "minimalna temperatura zasilania", "min turtemperatur", "température min flux", "minimun akış sıcaklığı", "temperatura minima di mandata") // TODO translate -MAKE_TRANSLATION(maxflowtemp, "maxflowtemp", "max flow temperature", "max Vorlauftemperatur", "Maximale aanvoertemperatuur", "Max Flödestemperatur", "maksymalna temperatura zasilania", "maks turtemperatur", "température max flux", "maksimum akış sıcaklığı", "temperatura massima di mandata") // TODO translate +MAKE_TRANSLATION(minflowtemp, "minflowtemp", "min flow temperature", "min Vorlauftemperatur", "Minimale aanvoertemperatuur", "Min Flödestemperatur", "minimalna temperatura zasilania", "min turtemperatur", "température min flux", "minimun akış sıcaklığı", "temperatura minima di mandata") +MAKE_TRANSLATION(maxflowtemp, "maxflowtemp", "max flow temperature", "max Vorlauftemperatur", "Maximale aanvoertemperatuur", "Max Flödestemperatur", "maksymalna temperatura zasilania", "maks turtemperatur", "température max flux", "maksimum akış sıcaklığı", "temperatura massima di mandata") MAKE_TRANSLATION(roominfluence, "roominfluence", "room influence", "Raumeinfluss", "Ruimteinvloed", "Rumspåverkan", "wpływ pomieszczenia", "rominnflytelse", "influence pièce", "oda etkisi", "influenza della camera") MAKE_TRANSLATION(roominfl_factor, "roominflfactor", "room influence factor", "Raumeinflussfaktor", "Factor ruimteinvloed", "Rumspåverkansfaktor", "współczynnik wpływu pomieszczenia", "rominnflytelsesfaktor", "facteur d'influence pièce", "oda etkisi faktörü", "fattore influenza camera") MAKE_TRANSLATION(curroominfl, "curroominfl", "current room influence", "aktueller Raumeinfluss", "Huidige ruimteinvloed", "Aktuell Rumspåverkan", "aktualny wpływ pomieszczenia", "gjeldende rominnflytelse", "influence actuelle pièce", "güncel oda etkisi", "fattore corrente influenza camera") @@ -639,28 +640,29 @@ MAKE_TRANSLATION(party, "party", "party time", "Partyzeit", "Partytijd", "Partyt MAKE_TRANSLATION(holidaytemp, "holidaytemp", "holiday temperature", "Urlaubstemperatur", "Vakantietemperatuur", "Helgtemperatur", "temperatura w trybie urlopowym", "ferietemperatur", "température vacances", "tatil sıcaklığı", "temperatura festiva") MAKE_TRANSLATION(summermode, "summermode", "summer mode", "Sommerbetrieb", "Zomerbedrijf", "Sommarläge", "aktualny tryb lato/zima", "sommermodus", "mode été", "yaz modu", "funzionamento estivo") MAKE_TRANSLATION(holidaymode, "holidaymode", "holiday mode", "Urlaubsbetrieb", "Vakantiebedrijf", "Helgläge", "tryb urlopowy", "feriemodus", "mode vacances", "tatil modu", "modalita vacanze") -MAKE_TRANSLATION(flowtempoffset, "flowtempoffset", "flow temperature offset for mixer", "Vorlauftemperaturanhebung", "Mixer aanvoertemperatuur offset", "Temperaturkorrigering Flödestemp. Blandningsventil", "korekta temperatury przepływu dla miksera", "temperaturkorrigering av blandingsventil", "décalage température de bascule pour mélangeur", "", "aumento della temperatura di ritorno") -MAKE_TRANSLATION(reducemode, "reducemode", "reduce mode", "Absenkmodus", "Gereduceerde modus", "Reducerat Läge", "tryb zredukowany/obniżony", "redusert modus", "mode réduction", "", "modalità assente") -MAKE_TRANSLATION(noreducetemp, "noreducetemp", "no reduce below temperature", "Durchheizen unter", "Reduceermodus onderbreken onder", "Inaktivera reducering under", "bez redukcji poniżej temperatury", "inaktiver redusert nedre temp", "pas de réduction en dessous température", "", "non ridurre temperatura sotto") -MAKE_TRANSLATION(reducetemp, "reducetemp", "off/reduce switch temperature", "Absenkmodus unter", "Onderste afschakeltemperatuur", "Avslag/Reducera under", "tryb zredukowany poniżej temperatury", "nedre avstengningstemperatur", "arrêt/réduction température bascule", "", "interruttore riduzione temperatura") -MAKE_TRANSLATION(vacreducetemp, "vacreducetemp", "vacations off/reduce switch temperature", "Urlaub Absenkmodus unter", "Vakantiemodus onderste afschakeltemperatuur", "Helg Avslag/Reducering under", "tryb urlopowy poniżej temperatury", "feriemodus nedre utkoblingstemperatur", "vacances – arrêt/réduction température bascule", "", "interruttore riduzione temperatura vacanze") -MAKE_TRANSLATION(vacreducemode, "vacreducemode", "vacations reduce mode", "Urlaub Absenkmodus", "Vakantie afschakelmodus", "Helg reduceringsläge", "redukcja w trakcie urlopu", "ferieavstengningsmodus", "mode réduction vacances", "", "modalita riduzione vacanze") +MAKE_TRANSLATION(flowtempoffset, "flowtempoffset", "flow temperature offset for mixer", "Vorlauftemperaturanhebung", "Mixer aanvoertemperatuur offset", "Temperaturkorrigering Flödestemp. Blandningsventil", "korekta temperatury przepływu dla miksera", "temperaturkorrigering av blandingsventil", "décalage température de bascule pour mélangeur", "karıştırıcı için akış sıcaklığı farkı", "aumento della temperatura di ritorno") +MAKE_TRANSLATION(reducemode, "reducemode", "reduce mode", "Absenkmodus", "Gereduceerde modus", "Reducerat Läge", "tryb zredukowany/obniżony", "redusert modus", "mode réduction", "düşürme modu", "modalità assente") +MAKE_TRANSLATION(noreducetemp, "noreducetemp", "no reduce below temperature", "Durchheizen unter", "Reduceermodus onderbreken onder", "Inaktivera reducering under", "bez redukcji poniżej temperatury", "inaktiver redusert nedre temp", "pas de réduction en dessous température", "bu sıcaklığın altına düşürme", "non ridurre temperatura sotto") +MAKE_TRANSLATION(reducetemp, "reducetemp", "off/reduce switch temperature", "Absenkmodus unter", "Onderste afschakeltemperatuur", "Avslag/Reducera under", "tryb zredukowany poniżej temperatury", "nedre avstengningstemperatur", "arrêt/réduction température bascule", "sıcaklık kapama/düşürme modu", "interruttore riduzione temperatura") +MAKE_TRANSLATION(vacreducetemp, "vacreducetemp", "vacations off/reduce switch temperature", "Urlaub Absenkmodus unter", "Vakantiemodus onderste afschakeltemperatuur", "Helg Avslag/Reducering under", "tryb urlopowy poniżej temperatury", "feriemodus nedre utkoblingstemperatur", "vacances – arrêt/réduction température bascule", "tatil sıcaklık kapama/düşürme modu", "interruttore riduzione temperatura vacanze") +MAKE_TRANSLATION(vacreducemode, "vacreducemode", "vacations reduce mode", "Urlaub Absenkmodus", "Vakantie afschakelmodus", "Helg reduceringsläge", "redukcja w trakcie urlopu", "ferieavstengningsmodus", "mode réduction vacances", "tail düşürme modu", "modalita riduzione vacanze") MAKE_TRANSLATION(nofrostmode, "nofrostmode", "nofrost mode", "Frostschutz Modus", "Vorstbeveiligingsmodus", "Frostskyddsläge", "temperatura wiodąca dla ochrony przed zamarzaniem", "frostbeskyttelsesmodus", "mode protection gel", "donma koruması modu", "Modalità protezione antigelo") -MAKE_TRANSLATION(remotetemp, "remotetemp", "room temperature from remote", "Raumtemperatur Remote", "Ruimtetemperatuur van afstandsbediening", "Rumstemperatur från fjärr", "temperatura w pomieszczeniu (z termostatu)", "romstemperatur fra fjernbetjening", "température pièce depuis télécommande", "", "temperatura ambiente da remoto") +MAKE_TRANSLATION(remotetemp, "remotetemp", "room temperature from remote", "Raumtemperatur Remote", "Ruimtetemperatuur van afstandsbediening", "Rumstemperatur från fjärr", "temperatura w pomieszczeniu (z termostatu)", "romstemperatur fra fjernbetjening", "température pièce depuis télécommande", "uzaktan oda sıcaklığı", "temperatura ambiente da remoto") +MAKE_TRANSLATION(remotehum, "remotehum", "room humidity from remote", "Raumfeuchte Remote", "", "", "", "", "", "uzaktan kumandadan oda nemi", "") // TODO translate MAKE_TRANSLATION(wwHolidays, "wwholidays", "holiday dates", "Feiertage", "Feestdagen", "Helgdagar", "dni świąteczne", "feriedager varmtvann", "dates vacances", "tatil günleri", "feste pubbliche") MAKE_TRANSLATION(wwVacations, "wwvacations", "vacation dates", "Urlaubstage", "Vakantiedagen", "Semesterdatum Varmvatten", "dni urlopowe", "ferie dato varmtvann", "dates vacances", "izin günleri", "date vacanze") MAKE_TRANSLATION(holidays, "holidays", "holiday dates", "Feiertage", "Feestdagen", "Helgdatum", "święta", "helligdager", "dates vacances", "tatil günleri", "date feste pubbliche") MAKE_TRANSLATION(vacations, "vacations", "vacation dates", "Urlaubstage", "Vakantiedagen", "Semesterdatum", "urlop", "feriedager", "dates vacances", "izin günleri", "date vacanze") -MAKE_TRANSLATION(wwprio, "wwprio", "dhw priority", "WW-Vorrang", "Prioriteit warm water", "Prioritera Varmvatten", "priorytet dla c.w.u.", "prioroter varmtvann", "priorité ecs", "", "priorita acqua calda ") +MAKE_TRANSLATION(wwprio, "wwprio", "dhw priority", "WW-Vorrang", "Prioriteit warm water", "Prioritera Varmvatten", "priorytet dla c.w.u.", "prioroter varmtvann", "priorité ecs", "sıcak kullanım suyu önceliği", "priorita acqua calda ") MAKE_TRANSLATION(nofrostmode1, "nofrostmode1", "nofrost mode", "Frostschutz", "Vorstbeveiligingsmodus", "Frostskyddsläge", "ochrona przed zamarzaniem", "frostbeskyttelse", "mode protection gel", "donma koruması modu 1", "modalita protezione antigelo") MAKE_TRANSLATION(reducehours, "reducehours", "duration for nighttemp", "Dauer Nachttemp.", "Duur nachtverlaging", "Timmar Nattsänkning", "czas trwania trybu nocnego", "timer nattsenkning", "durée température nuit", "gece sıcaklığı süresi", "durata temperatura notturna") MAKE_TRANSLATION(reduceminutes, "reduceminutes", "remaining time for nightmode", "Restzeit Nachttemp.", "Resterende tijd nachtverlaging", "Återstående Tid Nattläge", "czas do końca trybu nocnego", "gjenværende tid i nattstilling", "temps restant mode nuit", "gece modu için kalan süre", "temperatura notturna residua") -MAKE_TRANSLATION(switchonoptimization, "switchonoptimization", "switch-on optimization", "Einschaltoptimierung", "Inschakeloptimalisering", "Växlingsoptimering", "optymalizacja załączania", "slå på optimalisering", "optimisation mise en marche", "", "ottimizzazione all'accensione") +MAKE_TRANSLATION(switchonoptimization, "switchonoptimization", "switch-on optimization", "Einschaltoptimierung", "Inschakeloptimalisering", "Växlingsoptimering", "optymalizacja załączania", "slå på optimalisering", "optimisation mise en marche", "optimizasyonu aç", "ottimizzazione all'accensione") -MAKE_TRANSLATION(hpmode, "hpmode", "HP Mode", "WP Modus", "Modus warmtepomp", "", "", "", "", "", "Modalità Termopompa") -MAKE_TRANSLATION(dewoffset, "dewoffset", "dew point offset", "Taupunkt Differenz", "Offset dauwpunt", "", "", "", "", "", "differenza del punto di rugiada") -MAKE_TRANSLATION(roomtempdiff, "roomtempdiff", "room temp difference", "Raumtemperatur Differenz", "Verschiltemperatuur kamertemp", "", "", "", "", "", "differenza temperatura ambiente") -MAKE_TRANSLATION(hpminflowtemp, "hpminflowtemp", "HP min. flow temp.", "WP minimale Vorlauftemperatur", "Minimale aanvoertemperatuur WP", "", "", "", "", "", "temperatura minima di mandata") +MAKE_TRANSLATION(hpmode, "hpmode", "HP Mode", "WP Modus", "Modus warmtepomp", "", "", "", "", "yüksek güç modu", "Modalità Termopompa") // TODO translate +MAKE_TRANSLATION(dewoffset, "dewoffset", "dew point offset", "Taupunkt Differenz", "Offset dauwpunt", "", "", "", "", "çiğ noktası göreli", "differenza del punto di rugiada") // TODO translate +MAKE_TRANSLATION(roomtempdiff, "roomtempdiff", "room temp difference", "Raumtemperatur Differenz", "Verschiltemperatuur kamertemp", "", "", "", "", "oda sıcaklığı farkı", "differenza temperatura ambiente") // TODO translate +MAKE_TRANSLATION(hpminflowtemp, "hpminflowtemp", "HP min. flow temp.", "WP minimale Vorlauftemperatur", "Minimale aanvoertemperatuur WP", "", "", "", "", "yüksek güç minimum akış sıcaklığı", "temperatura minima di mandata") // TODO translate MAKE_TRANSLATION(hpcooling, "cooling", "cooling", "Kühlen", "Koelen", "Kyler", "chłodzenie", "kjøling", "refroidissement", "soğuma", "raffreddamento") // heatpump @@ -686,22 +688,22 @@ MAKE_TRANSLATION(poolShunt, "poolshunt", "pool shunt open/close (0% = pool / 100 MAKE_TRANSLATION(hydrTemp, "hydrTemp", "hydraulic header temperature", "Verteilertemperatur", "Temperatuur open verdeler", "Fördelartemperatur", "temperatura kolektora hydraulicznego", "Fordelertemperatur", "température collecteur hydraulique", "hidrolik başlık sıcaklığı ", "temperatura del collettore") // solar -MAKE_TRANSLATION(cylMiddleTemp, "cylmiddletemp", "cylinder middle temperature (TS3)", "Speichertemperatur Mitte (TS3)", "Zonneboilertemperatuur midden (TS3)", "Cylindertemperatur Mitten (TS3)", "temperatura w środku zasobnika (TS3)", "beredertemperatur i midten (TS3)", "température moyenne cylindre (TS3)", "", "temperatura di conservazione media accumulo (TS3)") -MAKE_TRANSLATION(retHeatAssist, "retheatassist", "return temperature heat assistance (TS4)", "Rücklaufanhebungs-Temp. (TS4)", "Retourtemperatuur verwarmingsassistentie (TS4)", "Returtemperatur värmestöd (TS4)", "temperatura powrotu wspomagania grzania (TS4)", "returtemperatur varmestøtte (TS4)", "température retour de assistance thermique (TS4)", "", "temperatura ritorno scambiatore (TS4)") -MAKE_TRANSLATION(m1Valve, "heatassistvalve", "heat assistance valve (M1)", "Ventil Heizungsunterstützung (M1)", "Klep verwarmingsassistentie (M1)", "Uppvärmningsstöd Ventil (M1)", "zawór wspomagania grzania (M1)", "varmehjelpsventil (M1)", "vanne assistance thermique (M1)", "", "valvola scambiatore (M1)") -MAKE_TRANSLATION(m1Power, "heatassistpower", "heat assistance valve power (M1)", "Ventilleistung Heizungsunterstützung (M1)", "Vermogen klep verwarmingsassistentie (M1)", "Uppvärmningsstöd Ventil Effekt (M1)", "moc zaworu wspomagania grzania (M1)", "varmehjelpsventileffekt (M1)", "puissance vanne assistance thermique (M1)", "", "potenza valvola scambiatore (M1)") +MAKE_TRANSLATION(cylMiddleTemp, "cylmiddletemp", "cylinder middle temperature (TS3)", "Speichertemperatur Mitte (TS3)", "Zonneboilertemperatuur midden (TS3)", "Cylindertemperatur Mitten (TS3)", "temperatura w środku zasobnika (TS3)", "beredertemperatur i midten (TS3)", "température moyenne cylindre (TS3)", "orta depolama sıcaklığı (TS3)", "temperatura di conservazione media accumulo (TS3)") +MAKE_TRANSLATION(retHeatAssist, "retheatassist", "return temperature heat assistance (TS4)", "Rücklaufanhebungs-Temp. (TS4)", "Retourtemperatuur verwarmingsassistentie (TS4)", "Returtemperatur värmestöd (TS4)", "temperatura powrotu wspomagania grzania (TS4)", "returtemperatur varmestøtte (TS4)", "température retour de assistance thermique (TS4)", "geri dönüş sıcaklığı artışı", "temperatura ritorno scambiatore (TS4)") +MAKE_TRANSLATION(m1Valve, "heatassistvalve", "heat assistance valve (M1)", "Ventil Heizungsunterstützung (M1)", "Klep verwarmingsassistentie (M1)", "Uppvärmningsstöd Ventil (M1)", "zawór wspomagania grzania (M1)", "varmehjelpsventil (M1)", "vanne assistance thermique (M1)", "ısıtma yardım vanası (M1)", "valvola scambiatore (M1)") +MAKE_TRANSLATION(m1Power, "heatassistpower", "heat assistance valve power (M1)", "Ventilleistung Heizungsunterstützung (M1)", "Vermogen klep verwarmingsassistentie (M1)", "Uppvärmningsstöd Ventil Effekt (M1)", "moc zaworu wspomagania grzania (M1)", "varmehjelpsventileffekt (M1)", "puissance vanne assistance thermique (M1)", "ısıtma yardım vanası gücü (M1)", "potenza valvola scambiatore (M1)") MAKE_TRANSLATION(pumpMinMod, "pumpminmod", "minimum pump modulation", "minimale Pumpenmodulation", "Minimale pompmodulatie", "Min Pumpmodulering", "minimalna modulacja pompy", "minimum pumpmodulering", "modulation minimale pompe", "minimum pompa modülasyonu", "modulazione minima pompa") -MAKE_TRANSLATION(maxFlow, "maxflow", "maximum solar flow", "maximaler Durchfluss", "Maximale doorstroom solar", "Max Flöde Solpanel", "maksymalny przepływ solarów", "maks strømming solpanel ", "débit solaire maximum", "minimum güneş akışı", "portata massima solare") -MAKE_TRANSLATION(solarPower, "solarpower", "actual solar power", "aktuelle Solarleistung", "Huidig solar vermogen", "Aktuellt Sol-effekt", "aktualna moc solarów", "aktuell soleffekt", "puissance solaire réelle", "gerçek güneş gücü", "potenza attuale solare") -MAKE_TRANSLATION(solarPumpTurnonDiff, "turnondiff", "pump turn on difference", "Einschalthysterese Pumpe", "Inschakelhysterese pomp", "Aktiveringshysteres Pump", "histereza załączenia pompy", "slå på hysteresepumpe", "différence activation pompe", "", "isteresi di accensione pompa") -MAKE_TRANSLATION(solarPumpTurnoffDiff, "turnoffdiff", "pump turn off difference", "Ausschalthysterese Pumpe", "Uitschakelhysterese pomp", "Avslagshysteres Pump", "histereza włączenia pompy", "slå av hysteresepumpe", "différence arrêt pompe", "", "isteresi di spegnimento pompa") +MAKE_TRANSLATION(maxFlow, "maxflow", "maximum solar flow", "maximaler Durchfluss", "Maximale doorstroom solar", "Max Flöde Solpanel", "maksymalny przepływ solarów", "maks strømming solpanel ", "débit solaire maximum", "minimum G.E. akışı", "portata massima solare") +MAKE_TRANSLATION(solarPower, "solarpower", "actual solar power", "aktuelle Solarleistung", "Huidig solar vermogen", "Aktuellt Sol-effekt", "aktualna moc solarów", "aktuell soleffekt", "puissance solaire réelle", "gerçek G.E. gücü", "potenza attuale solare") +MAKE_TRANSLATION(solarPumpTurnonDiff, "turnondiff", "pump turn on difference", "Einschalthysterese Pumpe", "Inschakelhysterese pomp", "Aktiveringshysteres Pump", "histereza załączenia pompy", "slå på hysteresepumpe", "différence activation pompe", "pompa devreye alma farkı", "isteresi di accensione pompa") +MAKE_TRANSLATION(solarPumpTurnoffDiff, "turnoffdiff", "pump turn off difference", "Ausschalthysterese Pumpe", "Uitschakelhysterese pomp", "Avslagshysteres Pump", "histereza włączenia pompy", "slå av hysteresepumpe", "différence arrêt pompe", "pompa kapama farkı", "isteresi di spegnimento pompa") MAKE_TRANSLATION(pump2MinMod, "pump2minmod", "minimum pump 2 modulation", "minimale Modulation Pumpe 2", "Minimale modulatie pomp 2", "Min Modulering Pump 2", "minimalna modulacja pompy 2", "minimum pumpmodulering 2", "modulation minimale pompe 2", "minimum pompa 2 modülasyonu", "modulazione minima pompa 2") -MAKE_TRANSLATION(solarPump2TurnonDiff, "turnondiff2", "pump 2 turn on difference", "Einschalthysterese Pumpe 2", "Inschakelhysterese pomp 2", "Aktiveringshysteres Pump 2", "histereza załączenia pompy 2", "slå på hysteresepumpe 2", "différence activation pompe 2", "", "isteresi di accensione pompa 2") -MAKE_TRANSLATION(solarPump2TurnoffDiff, "turnoffdiff2", "pump 2 turn off difference", "Ausschalthysterese Pumpe 2", "Uitschakelhysterese pomp 2", "Avslagshysteres Pump 2", "histereza wyłączenia pompy 2", "slå av hysteresepumpe 2", "différence arrêt pompe 2", "", "isteresi di spegnimento pompa") +MAKE_TRANSLATION(solarPump2TurnonDiff, "turnondiff2", "pump 2 turn on difference", "Einschalthysterese Pumpe 2", "Inschakelhysterese pomp 2", "Aktiveringshysteres Pump 2", "histereza załączenia pompy 2", "slå på hysteresepumpe 2", "différence activation pompe 2", "pompa 2 devreye alma farkı", "isteresi di accensione pompa 2") +MAKE_TRANSLATION(solarPump2TurnoffDiff, "turnoffdiff2", "pump 2 turn off difference", "Ausschalthysterese Pumpe 2", "Uitschakelhysterese pomp 2", "Avslagshysteres Pump 2", "histereza wyłączenia pompy 2", "slå av hysteresepumpe 2", "différence arrêt pompe 2", "pompa 2 kapama farkı", "isteresi di spegnimento pompa") MAKE_TRANSLATION(collectorTemp, "collectortemp", "collector temperature (TS1)", "Kollektortemperatur (TS1)", "Collectortemperatuur (TS1)", "Kollektor Temperatur (TS1)", "temperatura kolektora (TS1)", "kollektor temperatur (TS1)", "température collecteur (TS1)", "kollektör sıcaklığı (TS1)", "temperatura collettore (TS1)") MAKE_TRANSLATION(collector2Temp, "collector2temp", "collector 2 temperature (TS7)", "Kollector 2 Temperatur (TS7)", "Collector 2 temperatuur (TS7)", "Kollektor 2 Temperatur (TS7)", "temperatura kolektora 2 (TS7)", "kollektor 2 temperatur (TS7)", "température collecteur 2 (TS7)", "kollektör 2 sıcaklığı (TS2)", "temperatura collettore 2 (TS7)") -MAKE_TRANSLATION(cylBottomTemp, "cylbottomtemp", "cylinder bottom temperature (TS2)", "Speicher Bodentemperatur (TS2)", "Bodemtemperatuur zonneboiler (TS2)", "Cylindertemperatur Botten (TS2)", "temperatura na spodzie zasobnika (TS2)", "beredertemp i bunn (TS2)", "température fond de cylindre (TS2)", "", "temperatura inferiore accumulo (TS2)") -MAKE_TRANSLATION(cyl2BottomTemp, "cyl2bottomtemp", "second cylinder bottom temperature (TS5)", "2. Speicher Bodentemperatur (TS5)", "Bodemtemperatuur 2e boiler", "Sekundär Cylindertemperatur Botten (TS5)", "temperatura na spodzie drugiego zasobnika (TS5)", "skundær beredertemp i bunn (TS5)", "température fond de cylindre (TS5)", "", "temperatura inferiore 2° accumulo (TS5)") +MAKE_TRANSLATION(cylBottomTemp, "cylbottomtemp", "cylinder bottom temperature (TS2)", "Speicher Bodentemperatur (TS2)", "Bodemtemperatuur zonneboiler (TS2)", "Cylindertemperatur Botten (TS2)", "temperatura na spodzie zasobnika (TS2)", "beredertemp i bunn (TS2)", "température fond de cylindre (TS2)", "alt depolama sıcaklığıc(TS2)", "temperatura inferiore accumulo (TS2)") +MAKE_TRANSLATION(cyl2BottomTemp, "cyl2bottomtemp", "second cylinder bottom temperature (TS5)", "2. Speicher Bodentemperatur (TS5)", "Bodemtemperatuur 2e boiler", "Sekundär Cylindertemperatur Botten (TS5)", "temperatura na spodzie drugiego zasobnika (TS5)", "skundær beredertemp i bunn (TS5)", "température fond de cylindre (TS5)", "ikinci alt depolama sıcaklığıc(TS5)", "temperatura inferiore 2° accumulo (TS5)") MAKE_TRANSLATION(heatExchangerTemp, "heatexchangertemp", "heat exchanger temperature (TS6)", "wärmetauscher Temperatur (TS6)", "Temperatuur warmtewisselaar (TS6)", "Värmeväxlare Temperatur (TS6)", "temperatura wymiennika ciepła (TS6)", "Varmeveksler temperatur (TS6)", "température échangeur de chaleur (TS6)", "eşanjör sıcaklığı (TS6)", "temperatura scambiatore calore (TS6)") MAKE_TRANSLATION(collectorMaxTemp, "collectormaxtemp", "maximum collector temperature", "maximale Kollektortemperatur", "Maximale collectortemperatuur", "Max Kollektortemperatur", "maksymalna temperatura kolektora", "maks kollektortemperatur", "température max. collecteur", "maksimum kollektör sıcaklığı", " temperatura massima scambiatore calore") MAKE_TRANSLATION(collectorMinTemp, "collectormintemp", "minimum collector temperature", "minimale Kollektortemperatur", "Minimale collectortemperatuur", "Min Kollektortemperatur", "minimalna temperatura kolektora", "min kollektortemperatur", "température min. collecteur", "minimum kollektör sıcaklığı", "temperatura minima scambiatore calore") @@ -713,11 +715,11 @@ MAKE_TRANSLATION(solarPump2, "solarpump2", "pump 2 (PS4)", "Pumpe 2 (PS4)", "Pom MAKE_TRANSLATION(solarPump2Mod, "solarpump2mod", "pump 2 modulation (PS4)", "Pumpe 2 Modulation (PS4)", "Modulatie pomp 2 (PS4)", "Pump 2 Modulering (PS4)", "modulacja pompy solarnej 2 (PS4)", "solpumpe2modulering (PS4)", "modulation pompe solaire 2 (PS4)", "pompa2 modülasyonu(PS1)", "pompa modulazione 2 (PS4)") MAKE_TRANSLATION(valveStatus, "valvestatus", "valve status", "Ventilstatus", "Klepstatus", "Ventilstatus", "stan zaworu", "ventilstatus", "statut valve", "vana durumu", "stato valvola") MAKE_TRANSLATION(vs1Status, "vs1status", "valve status VS1", "Ventilstatus VS1", "Klepstatus VS1", "Ventilstatus VS1", "stan zaworu VS1", "ventilstatus VS1", "statut valve VS1", "vana durumu VS1", "stato valvola VS1") -MAKE_TRANSLATION(cylHeated, "cylheated", "cyl heated", "Speichertemperatur erreicht", "Boilertemperatuur behaald", "Värmepanna Uppvärmd", "zasobnik został nagrzany", "bereder oppvarmt", "cylindre chauffé", "", "temperatura richiesta vaso accumulo raggiunta") +MAKE_TRANSLATION(cylHeated, "cylheated", "cyl heated", "Speichertemperatur erreicht", "Boilertemperatuur behaald", "Värmepanna Uppvärmd", "zasobnik został nagrzany", "bereder oppvarmt", "cylindre chauffé", "depolama sıcakllığına ulaşıldı", "temperatura richiesta vaso accumulo raggiunta") MAKE_TRANSLATION(collectorShutdown, "collectorshutdown", "collector shutdown", "Kollektorabschaltung", "Collector afschakeling", "Kollektor Avstängning", "wyłączenie kolektora", "kollektor stengt", "arrêt collecteur", "kollektör kapalı", "spegnimento del collettore") MAKE_TRANSLATION(pumpWorkTime, "pumpworktime", "pump working time", "Pumpenlaufzeit", "Pomplooptijd", "Pump Drifttid", "czas pracy pompy", "driftstid pumpe", "durée fonctionnement pompe", "pompa çalışma süresi", "tempo funzionamento pompa") MAKE_TRANSLATION(pump2WorkTime, "pump2worktime", "pump 2 working time", "Pumpe 2 Laufzeit", "Looptijd pomp 2", "Pump 2 Drifttid", "czas pracy pompy 2", "driftstid pumpe2", "durée fonctionnement pompe 2", "pompa 2 çalışma süresi", "tempo funzionamento pompa 2") -MAKE_TRANSLATION(m1WorkTime, "m1worktime", "differential control working time", "Differenzregelung Arbeitszeit", "Verschilregeling arbeidstijd", "Differentialreglering Drifttid", "czas pracy regulacji różnicowej", "differentialreguleringssrifttid", "durée fonctionnement contrôle différentiel", "", "controllo differenziale durata funzionamento") +MAKE_TRANSLATION(m1WorkTime, "m1worktime", "differential control working time", "Differenzregelung Arbeitszeit", "Verschilregeling arbeidstijd", "Differentialreglering Drifttid", "czas pracy regulacji różnicowej", "differentialreguleringssrifttid", "durée fonctionnement contrôle différentiel", "çalışma saatlerinin farklı düzenlenmesi", "controllo differenziale durata funzionamento") MAKE_TRANSLATION(energyLastHour, "energylasthour", "energy last hour", "Energie letzte Std", "Energie laatste uur", "Energi Senaste Timmen", "energia w ciągu ostatniej godziny", "energi siste time", "énergie dernière heure", "son saat enerji", "Eenergia ultima ora") MAKE_TRANSLATION(energyTotal, "energytotal", "total energy", "Gesamtenergie", "Totale energie", "Total Energi", "energia całkowita", "total energi", "énergie totale", "toplam enerji", "energia totale") MAKE_TRANSLATION(energyToday, "energytoday", "total energy today", "Energie heute", "Energie vandaag", "Total Energi Idag", "energia całkowita dzisiaj", "total energi i dag", "énergie totale aujourd'hui", "bugün toplam enerji", "totale energia giornaliera") From d8c298f6fe8ec08039d96a29dcbe5d20a1b5fb69 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 17 Sep 2023 09:27:08 +0200 Subject: [PATCH 23/39] network init --- lib/framework/NetworkSettingsService.cpp | 51 ++++++++++++++---------- platformio.ini | 4 +- src/version.h | 2 +- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/lib/framework/NetworkSettingsService.cpp b/lib/framework/NetworkSettingsService.cpp index 8dcee3bd8..a9c831686 100644 --- a/lib/framework/NetworkSettingsService.cpp +++ b/lib/framework/NetworkSettingsService.cpp @@ -54,31 +54,36 @@ void NetworkSettingsService::manageSTA() { } // Connect or reconnect as required - if ((WiFi.getMode() & WIFI_STA) == 0) { - if (_state.staticIPConfig) { - WiFi.config(_state.localIP, _state.gatewayIP, _state.subnetMask, _state.dnsIP1, _state.dnsIP2); // configure for static IP - } + WiFi.disconnect(true); // turn radio off + WiFiMode_t currentWiFiMode = WiFi.getMode(); + if (currentWiFiMode == WIFI_MODE_APSTA || currentWiFiMode == WIFI_MODE_AP) { + WiFi.mode(WIFI_MODE_AP); + } else { + WiFi.mode(WIFI_MODE_NULL); + } + if (_state.staticIPConfig) { + WiFi.config(_state.localIP, _state.gatewayIP, _state.subnetMask, _state.dnsIP1, _state.dnsIP2); // configure for static IP + } + WiFi.setHostname(_state.hostname.c_str()); // set hostname - WiFi.setHostname(_state.hostname.c_str()); // set hostname + // www.esp32.com/viewtopic.php?t=12055 + if (_state.bandwidth20) { + esp_wifi_set_bandwidth((wifi_interface_t)ESP_IF_WIFI_STA, WIFI_BW_HT20); + } else { + esp_wifi_set_bandwidth((wifi_interface_t)ESP_IF_WIFI_STA, WIFI_BW_HT40); + } + if (_state.nosleep) { + WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE + } + WiFi.begin(_state.ssid.c_str(), _state.password.c_str()); // attempt to connect to the network - // www.esp32.com/viewtopic.php?t=12055 - read([&](NetworkSettings & networkSettings) { - if (networkSettings.bandwidth20) { - esp_wifi_set_bandwidth((wifi_interface_t)ESP_IF_WIFI_STA, WIFI_BW_HT20); - } else { - esp_wifi_set_bandwidth((wifi_interface_t)ESP_IF_WIFI_STA, WIFI_BW_HT40); - } - if (networkSettings.nosleep) { - WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE - } - WiFi.begin(_state.ssid.c_str(), _state.password.c_str()); // attempt to connect to the network - esp_wifi_set_max_tx_power(networkSettings.tx_power * 4); // set power after wifi is startet for C3 - }); + // set power after wifi is startet, fixed value for C3_V1 #ifdef BOARD_C3_MINI_V1 - // v1 needs this value, see https://github.com/emsesp/EMS-ESP32/pull/620#discussion_r993173979 - WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi + // v1 needs this value, see https://github.com/emsesp/EMS-ESP32/pull/620#discussion_r993173979 + WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi +#else + esp_wifi_set_max_tx_power(_state.tx_power * 4); #endif - } } // handles if wifi stopped @@ -89,4 +94,8 @@ void NetworkSettingsService::WiFiEvent(WiFiEvent_t event) { _stopping = false; } } + // wait 3 seconds before reconnecting + if (event == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) { + _lastConnectionAttempt = millis(); + } } diff --git a/platformio.ini b/platformio.ini index e254cc9e3..0a4692f41 100644 --- a/platformio.ini +++ b/platformio.ini @@ -48,8 +48,8 @@ extra_scripts = scripts/rename_fw.py [espressi32_base_tasmota] - ; use Tasmota's 2.0.11 core based libary from https://github.com/tasmota/platform-espressif32 which removes some libs (like mbedtsl) and increases available heap -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip + ; use Tasmota's 2.0.13 core based libary from https://github.com/tasmota/platform-espressif32 which removes some libs (like mbedtsl) and increases available heap +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.09.01/platform-espressif32.zip framework = arduino build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} diff --git a/src/version.h b/src/version.h index 915467bd0..3f20b9401 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.7.0-dev.0" +#define EMSESP_APP_VERSION "3.6.2-dev.0a" From 09e2945c150b4eac9981f313819540e4ab9d8409 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 18 Sep 2023 12:29:01 +0200 Subject: [PATCH 24/39] add BSSID and Channel to network settings, full_scan --- .../framework/network/NetworkSettingsForm.tsx | 44 ++++++++++++-- .../framework/network/WiFiNetworkSelector.tsx | 4 +- interface/src/types/network.ts | 2 + interface/src/validators/network.ts | 5 ++ lib/framework/NetworkSettingsService.cpp | 58 +++++++++++-------- lib/framework/NetworkSettingsService.h | 28 +++++---- 6 files changed, 100 insertions(+), 41 deletions(-) diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index a1a0af29e..bf39145b8 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -82,7 +82,9 @@ const WiFiSettingsForm: FC = () => { if (selectedNetwork) { updateState('networkSettings', (current_data) => ({ ssid: selectedNetwork.ssid, - password: '', + bssid: selectedNetwork.bssid, + channel: selectedNetwork.channel, + password: current_data ? current_data.password : '', hostname: current_data?.hostname, static_ip_config: false, enableIPv6: false, @@ -117,6 +119,12 @@ const WiFiSettingsForm: FC = () => { } catch (errors: any) { setFieldErrors(errors); } + deselectNetwork(); + }; + + const setCancel = async () => { + deselectNetwork(); + await loadData(); }; const restart = async () => { @@ -139,10 +147,17 @@ const WiFiSettingsForm: FC = () => { - + @@ -160,6 +175,27 @@ const WiFiSettingsForm: FC = () => { margin="normal" /> )} + + {(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && ( { )} - {!restartNeeded && dirtyFlags && dirtyFlags.length !== 0 && ( + {!restartNeeded && (selectedNetwork || (dirtyFlags && dirtyFlags.length !== 0)) && (