From 29838a433a5b285596f956e29297d87cacc44e63 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 29 Dec 2022 12:01:10 +0100 Subject: [PATCH 01/24] fix #857, add class heatsource --- CHANGELOG_LATEST.md | 1 + src/command.cpp | 10 +- src/device_library.h | 6 +- src/devices/boiler.cpp | 325 --------------------------------- src/devices/boiler.h | 50 ----- src/devices/heatsource.cpp | 365 +++++++++++++++++++++++++++++++++++++ src/devices/heatsource.h | 92 ++++++++++ src/emsdevice.cpp | 5 + src/emsdevice.h | 2 +- src/emsdevicevalue.cpp | 2 - src/emsdevicevalue.h | 1 - src/emsesp.cpp | 5 +- src/locale_common.h | 1 + src/locale_translations.h | 1 - 14 files changed, 480 insertions(+), 386 deletions(-) create mode 100644 src/devices/heatsource.cpp create mode 100644 src/devices/heatsource.h diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 209036bd4..6a3e6c1a2 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -46,3 +46,4 @@ - analog/dallas HA-entities based on id - MQTT Base is a mandatory field. Removed MQTT topic length from settings - HA duration class for time entities [[#822](https://github.com/emsesp/EMS-ESP32/issues/822 +- AM200 alternative heatsource as class heatsource [[#857](https://github.com/emsesp/EMS-ESP32/issues/857 diff --git a/src/command.cpp b/src/command.cpp index 220b69006..588b9fe49 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -208,10 +208,10 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { id = command[2] - '0'; command += 3; } else if (!strncmp(lowerCmd, "wwc", 3) && command[3] == '1' && command[4] == '0') { - id = 19; + id = 18; command += 5; } else if (!strncmp(lowerCmd, "wwc", 3) && command[3] >= '1' && command[3] <= '9') { - id = command[3] - '0' + 8; + id = command[3] - '1' + 9; command += 4; } else if (!strncmp(lowerCmd, "id", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '9') { id = command[3] - '0' + 10; @@ -219,6 +219,12 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { } else if (!strncmp(lowerCmd, "id", 2) && command[2] >= '1' && command[2] <= '9') { id = command[2] - '0'; command += 3; + } else if (!strncmp(lowerCmd, "hs", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '6') { + id = command[3] - '0' + 28; + command += 4; + } else if (!strncmp(lowerCmd, "hs", 2) && command[2] >= '1' && command[2] <= '9') { + id = command[2] - '1' + 19; + command += 3; } // remove separator if (command[0] == '/' || command[0] == '.' || command[0] == '_') { diff --git a/src/device_library.h b/src/device_library.h index 6cbe3c568..3664d54b5 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -47,7 +47,6 @@ {208, DeviceType::BOILER, "Logamax Plus/GB192/Condens GC9000/Greenstar ErP", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {210, DeviceType::BOILER, "Cascade MC400", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {211, DeviceType::BOILER, "EasyControl Adapter", DeviceFlags::EMS_DEVICE_FLAG_NONE}, -{228, DeviceType::BOILER, "Alternative Heatsource", DeviceFlags::EMS_DEVICE_FLAG_AM200}, {234, DeviceType::BOILER, "Logamax Plus GB122/Condense 2300", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Controllers - 0x09 / 0x10 / 0x50 @@ -138,12 +137,15 @@ {193, DeviceType::MIXER, "MZ100", DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, {204, DeviceType::MIXER, "MP100", DeviceFlags::EMS_DEVICE_FLAG_MP}, // pool -// Heat Pumps - 0x38? +// Heat Pumps - 0x38? This is a thermostat like RC100H {252, DeviceType::HEATPUMP, "HP Module", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Heat Pumps - 0x53 {248, DeviceType::HEATPUMP, "Hybrid Manager HM200", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +// Heatsource - 0x60 +{228, DeviceType::HEATSOURCE, "Alternative Heatsource", DeviceFlags::EMS_DEVICE_FLAG_NONE}, + // Connect devices - 0x02 {171, DeviceType::CONNECT, "OpenTherm Converter", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {205, DeviceType::CONNECT, "Moduline Easy Connect", DeviceFlags::EMS_DEVICE_FLAG_NONE}, diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index b842925e9..4cfa1376d 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -26,88 +26,6 @@ uuid::log::Logger Boiler::logger_{F_(boiler), uuid::log::Facility::CONSOLE}; Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { - // alternative heatsource special messages - - if (device_id == EMSdevice::EMS_DEVICE_ID_AM200) { - register_telegram_type(0x54D, "AmTemperatures", false, MAKE_PF_CB(process_amTempMessage)); - register_telegram_type(0x54E, "AmStatus", false, MAKE_PF_CB(process_amStatusMessage)); - register_telegram_type(0x54F, "AmCommand", false, MAKE_PF_CB(process_amCommandMessage)); // not broadcasted, but actually not used - register_telegram_type(0x550, "AmExtra", false, MAKE_PF_CB(process_amExtraMessage)); - register_telegram_type(0x54C, "AmSettings", true, MAKE_PF_CB(process_amSettingMessage)); // not broadcasted - - register_device_value(DeviceValueTAG::TAG_AHS, - &curFlowTemp_, - DeviceValueType::SHORT, - DeviceValueNumOp::DV_NUMOP_DIV10, - FL_(sysFlowTemp), - DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &retTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(sysRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &aFlowTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &aRetTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, - &cylTopTemp_, - DeviceValueType::SHORT, - DeviceValueNumOp::DV_NUMOP_DIV10, - FL_(aCylTopTemp), - DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, - &cylCenterTemp_, - DeviceValueType::SHORT, - DeviceValueNumOp::DV_NUMOP_DIV10, - FL_(aCylCenterTemp), - DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, - &cylBottomTemp_, - DeviceValueType::SHORT, - DeviceValueNumOp::DV_NUMOP_DIV10, - FL_(aCylBottomTemp), - DeviceValueUOM::DEGREES); - // register_device_value(DeviceValueTAG::TAG_AHS, &valveByPass_, DeviceValueType::BOOL, nullptr, FL_(valveByPass), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_AHS, &valveBuffer_, DeviceValueType::UINT, FL_(valveBuffer), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_AHS, &valveReturn_, DeviceValueType::UINT, FL_(valveReturn), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_AHS, &aPumpMod_, DeviceValueType::UINT, FL_(aPumpMod), DeviceValueUOM::PERCENT); - // register_device_value(DeviceValueTAG::TAG_AHS, &heatSource_, DeviceValueType::BOOL, nullptr, FL_(heatSource), DeviceValueUOM::NONE); - // Settings: - register_device_value( - DeviceValueTAG::TAG_AHS, &vr2Config_, DeviceValueType::ENUM, FL_(enum_vr2Config), FL_(vr2Config), DeviceValueUOM::NONE, MAKE_CF_CB(set_vr2Config)); - register_device_value(DeviceValueTAG::TAG_AHS, &ahsActivated_, DeviceValueType::BOOL, FL_(ahsActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ahsActivated)); - register_device_value(DeviceValueTAG::TAG_AHS, &aPumpConfig_, DeviceValueType::BOOL, FL_(aPumpConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpConfig)); - register_device_value(DeviceValueTAG::TAG_AHS, - &aPumpSignal_, - DeviceValueType::ENUM, - FL_(enum_aPumpSignal), - FL_(aPumpSignal), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_aPumpSignal)); - register_device_value(DeviceValueTAG::TAG_AHS, &aPumpMin_, DeviceValueType::UINT, FL_(aPumpMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_aPumpMin), 12, 50); - register_device_value(DeviceValueTAG::TAG_AHS, &tempRise_, DeviceValueType::BOOL, FL_(tempRise), DeviceValueUOM::NONE, MAKE_CF_CB(set_tempRise)); - register_device_value( - DeviceValueTAG::TAG_AHS, &setReturnTemp_, DeviceValueType::UINT, FL_(setReturnTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setReturnTemp), 40, 75); - register_device_value( - DeviceValueTAG::TAG_AHS, &mixRuntime_, DeviceValueType::USHORT, FL_(mixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_mixRuntime), 0, 600); - register_device_value( - DeviceValueTAG::TAG_AHS, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setFlowTemp), 40, 75); - register_device_value( - DeviceValueTAG::TAG_AHS, &bufBypass_, DeviceValueType::ENUM, FL_(enum_bufBypass), FL_(bufBypass), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufBypass)); - register_device_value(DeviceValueTAG::TAG_AHS, - &bufMixRuntime_, - DeviceValueType::USHORT, - FL_(bufMixRuntime), - DeviceValueUOM::SECONDS, - MAKE_CF_CB(set_bufMixRuntime), - 0, - 600); - register_device_value( - DeviceValueTAG::TAG_AHS, &bufConfig_, DeviceValueType::ENUM, FL_(enum_bufConfig), FL_(bufConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufConfig)); - register_device_value( - DeviceValueTAG::TAG_AHS, &blockMode_, DeviceValueType::ENUM, FL_(enum_blockMode), FL_(blockMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockMode)); - register_device_value( - DeviceValueTAG::TAG_AHS, &blockTerm_, DeviceValueType::ENUM, FL_(enum_blockTerm), FL_(blockTerm), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockTerm)); - register_device_value(DeviceValueTAG::TAG_AHS, &blockHyst_, DeviceValueType::INT, FL_(blockHyst), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_blockHyst), 0, 50); - register_device_value( - DeviceValueTAG::TAG_AHS, &releaseWait_, DeviceValueType::UINT, FL_(releaseWait), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_releaseWait), 0, 240); - return; - } // cascaded heating sources, only some values per individual heatsource (hs) if (device_id >= EMSdevice::EMS_DEVICE_ID_BOILER_1) { @@ -1487,80 +1405,6 @@ void Boiler::process_UBAMaintenanceData(std::shared_ptr telegram } } -/* - * alternative heatingsource AM200 - */ -// 0x054D AM200 temperatures -// Rx: 60 00 FF 00 04 4D 0103 0108 8000 00C6 0127 0205 8000 0200 0000 8000 6C -// TB4 TR2 TA1 TR1 TB1 TB2* TB3 -void Boiler::process_amTempMessage(std::shared_ptr telegram) { - has_update(telegram, curFlowTemp_, 0); // TB4 - has_update(telegram, retTemp_, 2); // TR2 - has_update(telegram, aFlowTemp_, 6); - has_update(telegram, aRetTemp_, 8); - has_update(telegram, cylTopTemp_, 10); - has_update(telegram, cylCenterTemp_, 12); - has_update(telegram, cylBottomTemp_, 14); -} - -// 0x054E AM200 status (6 bytes long) -// Rx: 60 00 FF 00 04 4E 00 00 00 00 00 00 86 -void Boiler::process_amStatusMessage(std::shared_ptr telegram) { - has_update(telegram, aPumpMod_, 0); // PR1 - // offset 1: bitfield 01-pump on, 02-VR1 opening, 04-VR1 closing, 08-VB1 opening, 10-VB1 closing - // uint8_t stat = aPump_ | setValveBuffer_ << 3 | setValveReturn_ << 1; - // if (telegram->read_value(stat, 1)) { - // has_update(aPump_, stat & 0x01); - // has_update(valveBuffer_, (stat >> 3) & 0x03); - // has_update(valveReturn_, (stat >> 1) & 0x03); - // } - // actually we dont know the offset of VR2 - // has_update(telegram, valveByPass_, ?); // VR2 - has_update(telegram, valveReturn_, 4); // VR1, percent - has_update(telegram, valveBuffer_, 5); // VB1, percent -} - -// 0x054C AM200 not broadcasted message, 23 bytes long -// data: 00 01 01 00 01 00 41 4B 00 5A 00 5A 00 01 05 3C 00 00 5A 00 01 23 00 -void Boiler::process_amSettingMessage(std::shared_ptr telegram) { - has_update(telegram, vr2Config_, 12); // pos 12: off(00)/bypass(01) - has_update(telegram, ahsActivated_, 0); // pos 00: Alternate heat source activation: No(00),Yes(01) - has_update(telegram, aPumpConfig_, 4); // pos 04: Buffer primary pump->Config pump: No(00),Yes(01) - has_update(telegram, aPumpSignal_, 3); // pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) - has_update(telegram, aPumpMin_, 21); // pos 21: Min output pump PR1 (%) - has_update(telegram, tempRise_, 1); // pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) - has_update(telegram, setReturnTemp_, 6); // pos 06: Set temp return (°C) (VR1) - has_update(telegram, mixRuntime_, 8); // pos 8/9: Mixer run time (s) (VR1) - has_update(telegram, setFlowTemp_, 7); // pos 07: Set flow temp AHS (°C) (Buffer) - has_update(telegram, bufBypass_, 2); // pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) - has_update(telegram, bufMixRuntime_, 10); // pos 10/11: Bypass mixer run time: [time] (s) (Buffer) - has_update(telegram, bufConfig_, 20); // pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) - has_update(telegram, blockMode_, 16); // pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) - has_update(telegram, blockTerm_, 17); // pos 17: Config of block terminal: NO(00), NC(01) - has_update(telegram, blockHyst_, 14); // pos 14?: Hyst. for bolier block (K) - has_update(telegram, releaseWait_, 15); // pos 15: Boiler release wait time (min) -} - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" - -// 0x054F AM200 not broadcasted message, 7 bytes long -// Boiler(0x60) -> Me(0x0B), amCommand(0x054F), data: 00 00 00 00 00 00 00 -void Boiler::process_amCommandMessage(std::shared_ptr telegram) { - // pos 0: return pump in percent - // pos 3: setValveBuffer VB1 0-off, 1-open, 2-close - // pos 2: setValveReturn VR1 0-off, 1-open, 2-close - // pos 6: boiler blocking 0-off, 1-on -} - -// 0x0550 AM200 broadcasted message, all 27 bytes unkown -// Rx: 60 00 FF 00 04 50 00 FF 00 FF FF 00 0D 00 01 00 00 00 00 01 03 01 00 03 00 2D 19 C8 02 94 00 4A -// Rx: 60 00 FF 19 04 50 00 FF FF 39 -void Boiler::process_amExtraMessage(std::shared_ptr telegram) { -} - -#pragma GCC diagnostic pop - // Boiler(0x08) -> All(0x00), ?(0x0484), data: 00 00 14 28 0D 50 00 00 00 02 02 07 28 01 00 02 05 19 0A 0A 03 0D 07 00 0A // Boiler(0x08) -> All(0x00), ?(0x0484), data: 01 90 00 F6 28 14 64 00 00 E1 00 1E 00 1E 01 64 01 64 54 20 00 00 (offset 25) void Boiler::process_HpSilentMode(std::shared_ptr telegram) { @@ -1600,175 +1444,6 @@ void Boiler::process_HpDhwSettings(std::shared_ptr telegram) { has_update(telegram, wwEcoPlusOffTemp_, 5); } -// Settings AM200 - -// pos 12: off(00)/Keelbypass(01)/(hc1pump(02) only standalone) -bool Boiler::set_vr2Config(const char * value, const int8_t id) { - uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_vr2Config))) { - return false; - } - write_command(0x54C, 12, v, 0x54C); - return true; -} - -// pos 00: Alternate heat source activation: No(00),Yes(01) -bool Boiler::set_ahsActivated(const char * value, const int8_t id) { - bool v; - if (!Helpers::value2bool(value, v)) { - return false; - } - write_command(0x54C, 0, v, 0x54C); - return true; -} - -// pos 04: Buffer primary pump->Config pump: No(00),Yes(01) -bool Boiler::set_aPumpConfig(const char * value, const int8_t id) { - bool v; - if (!Helpers::value2bool(value, v)) { - return false; - } - write_command(0x54C, 4, v, 0x54C); - return true; -} - -// pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) -bool Boiler::set_aPumpSignal(const char * value, const int8_t id) { - uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_aPumpSignal))) { - return false; - } - write_command(0x54C, 3, v, 0x54C); - return true; -} - -// pos 21: Min output pump PR1 (%) -bool Boiler::set_aPumpMin(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { - return false; - } - write_command(0x54C, 21, v, 0x54C); - return true; -} - -// pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) -bool Boiler::set_tempRise(const char * value, const int8_t id) { - bool v; - if (!Helpers::value2bool(value, v)) { - return false; - } - write_command(0x54C, 1, v, 0x54C); - return true; -} - -// pos 06: Set temp return (°C) (VR1) -bool Boiler::set_setReturnTemp(const char * value, const int8_t id) { - int v; - if (!Helpers::value2temperature(value, v)) { - return false; - } - write_command(0x54C, 6, v, 0x54C); - return true; -} - -// pos 10/11?: Mixer run time (s) (VR1) -bool Boiler::set_mixRuntime(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { - return false; - } - uint8_t data[2] = {(uint8_t)(v >> 8), (uint8_t)v}; - write_command(0x54C, 8, data, 2, 0x54C); - return true; -} - -// pos 07: Set flow temp AHS (°C) (Buffer) -bool Boiler::set_setFlowTemp(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { - return false; - } - write_command(0x54C, 7, v, 0x54C); - return true; -} - -// pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) -bool Boiler::set_bufBypass(const char * value, const int8_t id) { - uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_bufBypass))) { - return false; - } - write_command(0x54C, 2, v, 0x54C); - return true; -} - -// pos 8/9: Bypass mixer run time: [time] (s) (Buffer) -bool Boiler::set_bufMixRuntime(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { - return false; - } - uint8_t data[2] = {(uint8_t)(v >> 8), (uint8_t)v}; - write_command(0x54C, 10, data, 2, 0x54C); - return true; -} - -// pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) -bool Boiler::set_bufConfig(const char * value, const int8_t id) { - uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_bufConfig))) { - return false; - } - write_command(0x54C, 20, v, 0x54C); - return true; -} - -// pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) -bool Boiler::set_blockMode(const char * value, const int8_t id) { - uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_blockMode))) { - return false; - } - write_command(0x54C, 16, v, 0x54C); - return true; -} - -// pos 17: Config of block terminal: NO(00), NC(01) -bool Boiler::set_blockTerm(const char * value, const int8_t id) { - uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_blockTerm))) { - return false; - } - write_command(0x54C, 17, v, 0x54C); - return true; -} - -// pos 14?: Hyst. for bolier block (K) -bool Boiler::set_blockHyst(const char * value, const int8_t id) { - int v; - if (!Helpers::value2temperature(value, v, true)) { - return false; - } - write_command(0x54C, 14, v, 0x54C); - return true; -} - -// pos 15: Boiler release wait time (min) -bool Boiler::set_releaseWait(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { - return false; - } - write_command(0x54C, 15, v, 0x54C); - return true; -} - - -// 0x0550 AM200 broadcasted message, all 27 bytes unkown -// Rx: 60 00 FF 00 04 50 00 FF 00 FF FF 00 0D 00 01 00 00 00 00 01 03 01 00 03 00 2D 19 C8 02 94 00 4A -// Rx: 60 00 FF 19 04 50 00 FF FF 39 - /* * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat * thermostat always overwrites settings in boiler diff --git a/src/devices/boiler.h b/src/devices/boiler.h index dc656619a..df2592556 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -212,35 +212,6 @@ class Boiler : public EMSdevice { uint8_t maxHeatHeat_; uint8_t maxHeatDhw_; - // Alternative Heatsource AM200 - int16_t cylTopTemp_; // TB1 - int16_t cylCenterTemp_; // TB2 - int16_t cylBottomTemp_; // TB3 - int16_t aFlowTemp_; // TA1 - int16_t aRetTemp_; // TR1 - uint8_t aPumpMod_; // PR1 - percent - // uint8_t valveByPass_; // VR2 - uint8_t valveBuffer_; // VB1 - uint8_t valveReturn_; // VR1 - // uint8_t heatSource_; // OEV - // Settings: - uint8_t vr2Config_; // pos 12: off(00)/Keelbypass(01)/(hc1pump(02) only standalone) - uint8_t ahsActivated_; // pos 00: Alternate heat source activation: No(00),Yes(01) - uint8_t aPumpConfig_; // pos 04: Buffer primary pump->Config pump: No(00),Yes(01) - uint8_t aPumpSignal_; // pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) - uint8_t aPumpMin_; // pos 21: Min output pump PR1 (%) - uint8_t tempRise_; // pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) - uint8_t setReturnTemp_; // pos 06: Set temp return (°C) (VR1) - uint16_t mixRuntime_; // pos 10/11?: Mixer run time (s) (VR1) - // uint8_t setFlowTemp_; // pos 07: Set flow temp AHS (°C) (Buffer) - uint8_t bufBypass_; // pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) - uint16_t bufMixRuntime_; // pos 8/9: Bypass mixer run time: [time] (s) (Buffer) - uint8_t bufConfig_; // pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) - uint8_t blockMode_; // pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) - uint8_t blockTerm_; // pos 17: Config of block terminal: NO(00), NC(01) - int8_t blockHyst_; // pos 14?: Hyst. for bolier block (K) - uint8_t releaseWait_; // pos 15: Boiler release wait time (min) - uint8_t auxHeaterOnly_; uint8_t auxHeaterOff_; uint8_t auxHeaterStatus_; @@ -305,11 +276,6 @@ class Boiler : public EMSdevice { void process_HpInConfig(std::shared_ptr telegram); void process_HpHeaterConfig(std::shared_ptr telegram); void process_HybridHp(std::shared_ptr telegram); - void process_amTempMessage(std::shared_ptr telegram); - void process_amStatusMessage(std::shared_ptr telegram); - void process_amSettingMessage(std::shared_ptr telegram); - void process_amCommandMessage(std::shared_ptr telegram); - void process_amExtraMessage(std::shared_ptr telegram); void process_HpSilentMode(std::shared_ptr telegram); void process_HpAdditionalHeater(std::shared_ptr telegram); void process_HpValve(std::shared_ptr telegram); @@ -361,22 +327,6 @@ class Boiler : public EMSdevice { bool set_emergency_temp(const char * value, const int8_t id); bool set_emergency_ops(const char * value, const int8_t id); - bool set_vr2Config(const char * value, const int8_t id); // pos 12: off(00)/Keelbypass(01)/(hc1pump(02) only standalone) - bool set_ahsActivated(const char * value, const int8_t id); // pos 00: Alternate heat source activation: No(00),Yes(01) - bool set_aPumpConfig(const char * value, const int8_t id); // pos 04: Buffer primary pump->Config pump: No(00),Yes(01) - bool set_aPumpSignal(const char * value, const int8_t id); // pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) - bool set_aPumpMin(const char * value, const int8_t id); // pos 21: Min output pump PR1 (%) - bool set_tempRise(const char * value, const int8_t id); // pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) - bool set_setReturnTemp(const char * value, const int8_t id); // pos 06: Set temp return (°C) (VR1) - bool set_mixRuntime(const char * value, const int8_t id); // pos 10/11?: Mixer run time (s) (VR1) - bool set_setFlowTemp(const char * value, const int8_t id); // pos 07: Set flow temp AHS (°C) (Buffer) - bool set_bufBypass(const char * value, const int8_t id); // pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) - bool set_bufMixRuntime(const char * value, const int8_t id); // pos 8/9: Bypass mixer run time: [time] (s) (Buffer) - bool set_bufConfig(const char * value, const int8_t id); // pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) - bool set_blockMode(const char * value, const int8_t id); // pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) - bool set_blockTerm(const char * value, const int8_t id); // pos 17: Config of block terminal: NO(00), NC(01) - bool set_blockHyst(const char * value, const int8_t id); // pos 14?: Hyst. for bolier block (K) - bool set_releaseWait(const char * value, const int8_t id); // pos 15: Boiler release wait time (min) bool set_HpInLogic(const char * value, const int8_t id); inline bool set_HpIn1Logic(const char * value, const int8_t id) { return set_HpInLogic(value, 1); diff --git a/src/devices/heatsource.cpp b/src/devices/heatsource.cpp new file mode 100644 index 000000000..6c88f06be --- /dev/null +++ b/src/devices/heatsource.cpp @@ -0,0 +1,365 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "heatsource.h" + +namespace emsesp { + +REGISTER_FACTORY(Heatsource, EMSdevice::DeviceType::HEATSOURCE); + +Heatsource::Heatsource(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) + : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { + + register_telegram_type(0x54D, "AmTemperatures", false, MAKE_PF_CB(process_amTempMessage)); + register_telegram_type(0x54E, "AmStatus", false, MAKE_PF_CB(process_amStatusMessage)); + register_telegram_type(0x54F, "AmCommand", false, MAKE_PF_CB(process_amCommandMessage)); // not broadcasted, but actually not used + register_telegram_type(0x550, "AmExtra", false, MAKE_PF_CB(process_amExtraMessage)); + register_telegram_type(0x54C, "AmSettings", true, MAKE_PF_CB(process_amSettingMessage)); // not broadcasted + + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &curFlowTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(sysFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(sysRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aFlowTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aRetTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylTopTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aCylTopTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylCenterTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aCylCenterTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylBottomTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aCylBottomTemp), + DeviceValueUOM::DEGREES); + // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveByPass_, DeviceValueType::BOOL, nullptr, FL_(valveByPass), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveBuffer_, DeviceValueType::UINT, FL_(valveBuffer), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveReturn_, DeviceValueType::UINT, FL_(valveReturn), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aPumpMod_, DeviceValueType::UINT, FL_(aPumpMod), DeviceValueUOM::PERCENT); + // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatSource_, DeviceValueType::BOOL, nullptr, FL_(heatSource), DeviceValueUOM::NONE); + // Settings: + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &vr2Config_, DeviceValueType::ENUM, FL_(enum_vr2Config), FL_(vr2Config), DeviceValueUOM::NONE, MAKE_CF_CB(set_vr2Config)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ahsActivated_, DeviceValueType::BOOL, FL_(ahsActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ahsActivated)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aPumpConfig_, DeviceValueType::BOOL, FL_(aPumpConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpConfig)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &aPumpSignal_, + DeviceValueType::ENUM, + FL_(enum_aPumpSignal), + FL_(aPumpSignal), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_aPumpSignal)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aPumpMin_, DeviceValueType::UINT, FL_(aPumpMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_aPumpMin), 12, 50); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tempRise_, DeviceValueType::BOOL, FL_(tempRise), DeviceValueUOM::NONE, MAKE_CF_CB(set_tempRise)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &setReturnTemp_, DeviceValueType::UINT, FL_(setReturnTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setReturnTemp), 40, 75); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &mixRuntime_, DeviceValueType::USHORT, FL_(mixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_mixRuntime), 0, 600); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setFlowTemp), 40, 75); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &bufBypass_, DeviceValueType::ENUM, FL_(enum_bufBypass), FL_(bufBypass), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufBypass)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &bufMixRuntime_, + DeviceValueType::USHORT, + FL_(bufMixRuntime), + DeviceValueUOM::SECONDS, + MAKE_CF_CB(set_bufMixRuntime), + 0, + 600); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &bufConfig_, DeviceValueType::ENUM, FL_(enum_bufConfig), FL_(bufConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufConfig)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &blockMode_, DeviceValueType::ENUM, FL_(enum_blockMode), FL_(blockMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockMode)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &blockTerm_, DeviceValueType::ENUM, FL_(enum_blockTerm), FL_(blockTerm), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockTerm)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &blockHyst_, DeviceValueType::INT, FL_(blockHyst), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_blockHyst), 0, 50); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &releaseWait_, DeviceValueType::UINT, FL_(releaseWait), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_releaseWait), 0, 240); +} + +/* + * alternative heatingsource AM200 + */ +// 0x054D AM200 temperatures +// Rx: 60 00 FF 00 04 4D 0103 0108 8000 00C6 0127 0205 8000 0200 0000 8000 6C +// TB4 TR2 TA1 TR1 TB1 TB2* TB3 +void Heatsource::process_amTempMessage(std::shared_ptr telegram) { + has_update(telegram, curFlowTemp_, 0); // TB4 + has_update(telegram, retTemp_, 2); // TR2 + has_update(telegram, aFlowTemp_, 6); + has_update(telegram, aRetTemp_, 8); + has_update(telegram, cylTopTemp_, 10); + has_update(telegram, cylCenterTemp_, 12); + has_update(telegram, cylBottomTemp_, 14); +} + +// 0x054E AM200 status (6 bytes long) +// Rx: 60 00 FF 00 04 4E 00 00 00 00 00 00 86 +void Heatsource::process_amStatusMessage(std::shared_ptr telegram) { + has_update(telegram, aPumpMod_, 0); // PR1 + // offset 1: bitfield 01-pump on, 02-VR1 opening, 04-VR1 closing, 08-VB1 opening, 10-VB1 closing + // uint8_t stat = aPump_ | setValveBuffer_ << 3 | setValveReturn_ << 1; + // if (telegram->read_value(stat, 1)) { + // has_update(aPump_, stat & 0x01); + // has_update(valveBuffer_, (stat >> 3) & 0x03); + // has_update(valveReturn_, (stat >> 1) & 0x03); + // } + // actually we dont know the offset of VR2 + // has_update(telegram, valveBypass_, ?); // VR2 + has_update(telegram, valveReturn_, 4); // VR1, percent + has_update(telegram, valveBuffer_, 5); // VB1, percent +} + +// 0x054C AM200 not broadcasted message, 23 bytes long +// data: 00 01 01 00 01 00 41 4B 00 5A 00 5A 00 01 05 3C 00 00 5A 00 01 23 00 +void Heatsource::process_amSettingMessage(std::shared_ptr telegram) { + has_update(telegram, vr2Config_, 12); // pos 12: off(00)/bypass(01) + has_update(telegram, ahsActivated_, 0); // pos 00: Alternate heat source activation: No(00),Yes(01) + has_update(telegram, aPumpConfig_, 4); // pos 04: Buffer primary pump->Config pump: No(00),Yes(01) + has_update(telegram, aPumpSignal_, 3); // pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) + has_update(telegram, aPumpMin_, 21); // pos 21: Min output pump PR1 (%) + has_update(telegram, tempRise_, 1); // pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) + has_update(telegram, setReturnTemp_, 6); // pos 06: Set temp return (°C) (VR1) + has_update(telegram, mixRuntime_, 8); // pos 8/9: Mixer run time (s) (VR1) + has_update(telegram, setFlowTemp_, 7); // pos 07: Set flow temp AHS (°C) (Buffer) + has_update(telegram, bufBypass_, 2); // pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) + has_update(telegram, bufMixRuntime_, 10); // pos 10/11: Bypass mixer run time: [time] (s) (Buffer) + has_update(telegram, bufConfig_, 20); // pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) + has_update(telegram, blockMode_, 16); // pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) + has_update(telegram, blockTerm_, 17); // pos 17: Config of block terminal: NO(00), NC(01) + has_update(telegram, blockHyst_, 14); // pos 14?: Hyst. for bolier block (K) + has_update(telegram, releaseWait_, 15); // pos 15: Boiler release wait time (min) +} + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" + +// 0x054F AM200 not broadcasted message, 7 bytes long +// Boiler(0x60) -> Me(0x0B), amCommand(0x054F), data: 00 00 00 00 00 00 00 +void Heatsource::process_amCommandMessage(std::shared_ptr telegram) { + // pos 0: return pump in percent + // pos 3: setValveBuffer VB1 0-off, 1-open, 2-close + // pos 2: setValveReturn VR1 0-off, 1-open, 2-close + // pos 6: boiler blocking 0-off, 1-on +} + +// 0x0550 AM200 broadcasted message, all 27 bytes unkown +// Rx: 60 00 FF 00 04 50 00 FF 00 FF FF 00 0D 00 01 00 00 00 00 01 03 01 00 03 00 2D 19 C8 02 94 00 4A +// Rx: 60 00 FF 19 04 50 00 FF FF 39 +void Heatsource::process_amExtraMessage(std::shared_ptr telegram) { +} + +#pragma GCC diagnostic pop + +// Settings AM200 + +// pos 12: off(00)/Keelbypass(01)/(hc1pump(02) only standalone) +bool Heatsource::set_vr2Config(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_vr2Config))) { + return false; + } + write_command(0x54C, 12, v, 0x54C); + return true; +} + +// pos 00: Alternate heat source activation: No(00),Yes(01) +bool Heatsource::set_ahsActivated(const char * value, const int8_t id) { + bool v; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x54C, 0, v, 0x54C); + return true; +} + +// pos 04: Buffer primary pump->Config pump: No(00),Yes(01) +bool Heatsource::set_aPumpConfig(const char * value, const int8_t id) { + bool v; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x54C, 4, v, 0x54C); + return true; +} + +// pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) +bool Heatsource::set_aPumpSignal(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_aPumpSignal))) { + return false; + } + write_command(0x54C, 3, v, 0x54C); + return true; +} + +// pos 21: Min output pump PR1 (%) +bool Heatsource::set_aPumpMin(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + write_command(0x54C, 21, v, 0x54C); + return true; +} + +// pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) +bool Heatsource::set_tempRise(const char * value, const int8_t id) { + bool v; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x54C, 1, v, 0x54C); + return true; +} + +// pos 06: Set temp return (°C) (VR1) +bool Heatsource::set_setReturnTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x54C, 6, v, 0x54C); + return true; +} + +// pos 10/11?: Mixer run time (s) (VR1) +bool Heatsource::set_mixRuntime(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + uint8_t data[2] = {(uint8_t)(v >> 8), (uint8_t)v}; + write_command(0x54C, 8, data, 2, 0x54C); + return true; +} + +// pos 07: Set flow temp AHS (°C) (Buffer) +bool Heatsource::set_setFlowTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + write_command(0x54C, 7, v, 0x54C); + return true; +} + +// pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) +bool Heatsource::set_bufBypass(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_bufBypass))) { + return false; + } + write_command(0x54C, 2, v, 0x54C); + return true; +} + +// pos 8/9: Bypass mixer run time: [time] (s) (Buffer) +bool Heatsource::set_bufMixRuntime(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + uint8_t data[2] = {(uint8_t)(v >> 8), (uint8_t)v}; + write_command(0x54C, 10, data, 2, 0x54C); + return true; +} + +// pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) +bool Heatsource::set_bufConfig(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_bufConfig))) { + return false; + } + write_command(0x54C, 20, v, 0x54C); + return true; +} + +// pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) +bool Heatsource::set_blockMode(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_blockMode))) { + return false; + } + write_command(0x54C, 16, v, 0x54C); + return true; +} + +// pos 17: Config of block terminal: NO(00), NC(01) +bool Heatsource::set_blockTerm(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_blockTerm))) { + return false; + } + write_command(0x54C, 17, v, 0x54C); + return true; +} + +// pos 14?: Hyst. for bolier block (K) +bool Heatsource::set_blockHyst(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v, true)) { + return false; + } + write_command(0x54C, 14, v, 0x54C); + return true; +} + +// pos 15: Boiler release wait time (min) +bool Heatsource::set_releaseWait(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + write_command(0x54C, 15, v, 0x54C); + return true; +} + +/* +bool Heatsource::set_valveBuffer(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_am200valve))) { + return false; + } + write_command(0x54F, 3, v, 0x54F); + return true; +} + +bool Heatsource::set_valveReturn(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_am200valve))) { + return false; + } + write_command(0x54F, 2, v, 0x54F); + return true; +} +*/ + +} // namespace emsesp \ No newline at end of file diff --git a/src/devices/heatsource.h b/src/devices/heatsource.h new file mode 100644 index 000000000..f365af973 --- /dev/null +++ b/src/devices/heatsource.h @@ -0,0 +1,92 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_HEATSOURCE_H +#define EMSESP_HEATSOURCE_H + +#include "emsesp.h" + +namespace emsesp { + +class Heatsource : public EMSdevice { + public: + Heatsource(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand); + + private: + uint16_t curFlowTemp_; // Current flow temperature + uint16_t retTemp_; // Return temperature + int16_t cylTopTemp_; // TB1 + int16_t cylCenterTemp_; // TB2 + int16_t cylBottomTemp_; // TB3 + int16_t aFlowTemp_; // TA1 + int16_t aRetTemp_; // TR1 + uint8_t aPumpMod_; // PR1 - percent + uint8_t valveBuffer_; // VB1 + uint8_t valveReturn_; // VR1 + // uint8_t valveBypass_; // VR2 position unknown + // uint8_t heatSource_; // OEV + + // Settings: + uint8_t vr2Config_; // pos 12: off(00)/Keelbypass(01)/(hc1pump(02) only standalone) + uint8_t ahsActivated_; // pos 00: Alternate heat source activation: No(00),Yes(01) + uint8_t aPumpConfig_; // pos 04: Buffer primary pump->Config pump: No(00),Yes(01) + uint8_t aPumpSignal_; // pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) + uint8_t aPumpMin_; // pos 21: Min output pump PR1 (%) + uint8_t tempRise_; // pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) + uint8_t setReturnTemp_; // pos 06: Set temp return (°C) (VR1) + uint16_t mixRuntime_; // pos 10/11?: Mixer run time (s) (VR1) + uint8_t setFlowTemp_; // pos 07: Set flow temp AHS (°C) (Buffer) + uint8_t bufBypass_; // pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) + uint16_t bufMixRuntime_; // pos 8/9: Bypass mixer run time: [time] (s) (Buffer) + uint8_t bufConfig_; // pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) + uint8_t blockMode_; // pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) + uint8_t blockTerm_; // pos 17: Config of block terminal: NO(00), NC(01) + int8_t blockHyst_; // pos 14?: Hyst. for bolier block (K) + uint8_t releaseWait_; // pos 15: Boiler release wait time (min) + + void process_amTempMessage(std::shared_ptr telegram); + void process_amStatusMessage(std::shared_ptr telegram); + void process_amSettingMessage(std::shared_ptr telegram); + void process_amCommandMessage(std::shared_ptr telegram); + void process_amExtraMessage(std::shared_ptr telegram); + + + bool set_vr2Config(const char * value, const int8_t id); // pos 12: off(00)/Keelbypass(01)/(hc1pump(02) only standalone) + bool set_ahsActivated(const char * value, const int8_t id); // pos 00: Alternate heat source activation: No(00),Yes(01) + bool set_aPumpConfig(const char * value, const int8_t id); // pos 04: Buffer primary pump->Config pump: No(00),Yes(01) + bool set_aPumpSignal(const char * value, const int8_t id); // pos 03: Output for PR1 pump: On/Off(00),PWM(01),PWM invers(02) + bool set_aPumpMin(const char * value, const int8_t id); // pos 21: Min output pump PR1 (%) + bool set_tempRise(const char * value, const int8_t id); // pos 01: AHS return temp rise: No(00),Yes(01) (mixer VR1) + bool set_setReturnTemp(const char * value, const int8_t id); // pos 06: Set temp return (°C) (VR1) + bool set_mixRuntime(const char * value, const int8_t id); // pos 10/11?: Mixer run time (s) (VR1) + bool set_setFlowTemp(const char * value, const int8_t id); // pos 07: Set flow temp AHS (°C) (Buffer) + bool set_bufBypass(const char * value, const int8_t id); // pos 02: Puffer bypass: No(00), Mischer(01), Ventil(02) (Buffer) + bool set_bufMixRuntime(const char * value, const int8_t id); // pos 8/9: Bypass mixer run time: [time] (s) (Buffer) + bool set_bufConfig(const char * value, const int8_t id); // pos 20: Konfig WW-Speicher Monovalent(01), Bivalent(02) (buffer) + bool set_blockMode(const char * value, const int8_t id); // pos 16: Config htg. blocking mode: No(00),Automatic(01),Always block02) (blocking) + bool set_blockTerm(const char * value, const int8_t id); // pos 17: Config of block terminal: NO(00), NC(01) + bool set_blockHyst(const char * value, const int8_t id); // pos 14?: Hyst. for bolier block (K) + bool set_releaseWait(const char * value, const int8_t id); // pos 15: Boiler release wait time (min) + + bool set_valveBuffer(const char * value, const int8_t id); + bool set_valveReturn(const char * value, const int8_t id); +}; + +} // namespace emsesp + +#endif diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 4d3cc0dd4..e394d9c1a 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -120,6 +120,8 @@ const char * EMSdevice::device_type_2_device_name(const uint8_t device_type) { return F_(alert); case DeviceType::PUMP: return F_(pump); + case DeviceType::HEATSOURCE: + return F_(heatsource); default: return Helpers::translated_word(FL_(unknown)); } @@ -174,6 +176,9 @@ uint8_t EMSdevice::device_name_2_device_type(const char * topic) { if (!strcmp(lowtopic, F_(pump))) { return DeviceType::PUMP; } + if (!strcmp(lowtopic, F_(heatsource))) { + return DeviceType::HEATSOURCE; + } return DeviceType::UNKNOWN; } diff --git a/src/emsdevice.h b/src/emsdevice.h index f5d3937c1..90efe9774 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -346,6 +346,7 @@ class EMSdevice { ALERT, PUMP, GENERIC, + HEATSOURCE, UNKNOWN }; @@ -386,7 +387,6 @@ class EMSdevice { static constexpr uint8_t EMS_DEVICE_FLAG_HT3 = 3; static constexpr uint8_t EMS_DEVICE_FLAG_HEATPUMP = 4; static constexpr uint8_t EMS_DEVICE_FLAG_HYBRID = 5; - static constexpr uint8_t EMS_DEVICE_FLAG_AM200 = 6; // Solar Module static constexpr uint8_t EMS_DEVICE_FLAG_SM10 = 1; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index efa0b7ec1..96a68bfb4 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -140,7 +140,6 @@ const char * const * DeviceValue::DeviceValueTAG_s[] = { FL_(tag_wwc8), // "wwc8" FL_(tag_wwc9), // "wwc9" FL_(tag_wwc10), // "wwc10" - FL_(tag_ahs), // "ahs" FL_(tag_hs1), // "hs1" FL_(tag_hs2), // "hs2" FL_(tag_hs3), // "hs3" @@ -186,7 +185,6 @@ const char * const DeviceValue::DeviceValueTAG_mqtt[] = { FL_(tag_wwc8)[0], // "wwc8" FL_(tag_wwc9)[0], // "wwc9" FL_(tag_wwc10)[0], // "wwc10" - FL_(tag_ahs)[0], // "ahs" FL_(tag_hs1)[0], // "hs1" FL_(tag_hs2)[0], // "hs2" FL_(tag_hs3)[0], // "hs3" diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 918570a8a..35e3ac992 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -98,7 +98,6 @@ class DeviceValue { TAG_WWC8, TAG_WWC9, TAG_WWC10, - TAG_AHS, TAG_HS1, TAG_HS2, TAG_HS3, diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 63f2a3c00..7ce98982b 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -579,6 +579,7 @@ void EMSESP::publish_device_values(uint8_t device_type) { void EMSESP::publish_other_values() { publish_device_values(EMSdevice::DeviceType::SWITCH); publish_device_values(EMSdevice::DeviceType::HEATPUMP); + publish_device_values(EMSdevice::DeviceType::HEATSOURCE); // other devices without values yet // publish_device_values(EMSdevice::DeviceType::GATEWAY); // publish_device_values(EMSdevice::DeviceType::CONNECT); @@ -986,9 +987,9 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const for (auto & device : device_library_) { if (device.product_id == product_id) { // sometimes boilers share the same productID as controllers - // so only add boilers if the device_id is 0x08 or 0x60 or 0x70.., which is fixed for EMS + // so only add boilers if the device_id is 0x08 or 0x70.., which is fixed for EMS if (device.device_type == DeviceType::BOILER) { - if (device_id == EMSdevice::EMS_DEVICE_ID_BOILER || device_id == EMSdevice::EMS_DEVICE_ID_AM200 + if (device_id == EMSdevice::EMS_DEVICE_ID_BOILER || (device_id >= EMSdevice::EMS_DEVICE_ID_BOILER_1 && device_id <= EMSdevice::EMS_DEVICE_ID_BOILER_F)) { device_p = &device; break; diff --git a/src/locale_common.h b/src/locale_common.h index 65764dc6a..e2068f04e 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -104,6 +104,7 @@ MAKE_PSTR_WORD(analogsensor) MAKE_PSTR_WORD(dallassensor) MAKE_PSTR_WORD(alert) MAKE_PSTR_WORD(pump) +MAKE_PSTR_WORD(heatsource) MAKE_PSTR(number, "number") MAKE_PSTR(enum, "enum") diff --git a/src/locale_translations.h b/src/locale_translations.h index 4a6dbda9a..baf75c359 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -75,7 +75,6 @@ MAKE_PSTR_LIST(tag_wwc7, "wwc7", "WWK7", "wwc7", "wwc7", "CWU7", "wwc7", "wwc7") MAKE_PSTR_LIST(tag_wwc8, "wwc8", "WWK8", "wwc8", "wwc8", "CWU8", "wwc8", "wwc8") MAKE_PSTR_LIST(tag_wwc9, "wwc9", "WWK9", "wwc9", "wwc9", "CWU9", "wwc9", "wwc9") MAKE_PSTR_LIST(tag_wwc10, "wwc10", "WWK10", "wwc10", "wwc10", "CWU10", "wwc10", "wwc10") -MAKE_PSTR_LIST(tag_ahs, "ahs", "AHQ", "ahs", "ahs", "AŹC", "ahs", "ahs") MAKE_PSTR_LIST(tag_hs1, "hs1", "hs1", "hs1", "hs1", "ŹC1", "hs1", "hs1") MAKE_PSTR_LIST(tag_hs2, "hs2", "hs2", "hs2", "hs2", "ŹC2", "hs2", "hs2") MAKE_PSTR_LIST(tag_hs3, "hs3", "hs3", "hs3", "hs3", "ŹC3", "hs3", "hs3") From ffa7ddebb8cfd15355f07bffd26092198deda40e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 29 Dec 2022 16:18:01 +0100 Subject: [PATCH 02/24] add icon, rename to AM200, show web log buffer filling, #857 --- interface/src/project/DeviceIcon.tsx | 3 ++- src/device_library.h | 2 +- src/system.cpp | 23 ++++++++++++----------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/interface/src/project/DeviceIcon.tsx b/interface/src/project/DeviceIcon.tsx index ec8910487..27d2cabe2 100644 --- a/interface/src/project/DeviceIcon.tsx +++ b/interface/src/project/DeviceIcon.tsx @@ -19,7 +19,8 @@ interface DeviceIconProps { const DeviceIcon: FC = ({ type }) => { switch (type) { case 'Boiler': - return ; + case 'Heatsource': + return ; case 'Sensor': return ; case 'Solar': diff --git a/src/device_library.h b/src/device_library.h index 3664d54b5..db60e9a4e 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -144,7 +144,7 @@ {248, DeviceType::HEATPUMP, "Hybrid Manager HM200", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Heatsource - 0x60 -{228, DeviceType::HEATSOURCE, "Alternative Heatsource", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{228, DeviceType::HEATSOURCE, "AM200", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // alternative heatsource // Connect devices - 0x02 {171, DeviceType::CONNECT, "OpenTherm Converter", DeviceFlags::EMS_DEVICE_FLAG_NONE}, diff --git a/src/system.cpp b/src/system.cpp index e48ca2618..24342f4af 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1330,17 +1330,18 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["pbutton gpio"] = settings.pbutton_gpio; node["led gpio"] = settings.led_gpio; } - node["hide led"] = settings.hide_led; - node["notoken api"] = settings.notoken_api; - node["readonly mode"] = settings.readonly_mode; - node["fahrenheit"] = settings.fahrenheit; - node["dallas parasite"] = settings.dallas_parasite; - node["bool format"] = settings.bool_format; - node["bool dashboard"] = settings.bool_dashboard; - node["enum format"] = settings.enum_format; - node["analog enabled"] = settings.analog_enabled; - node["telnet enabled"] = settings.telnet_enabled; - node["web log buffer"] = settings.weblog_buffer; + node["hide led"] = settings.hide_led; + node["notoken api"] = settings.notoken_api; + node["readonly mode"] = settings.readonly_mode; + node["fahrenheit"] = settings.fahrenheit; + node["dallas parasite"] = settings.dallas_parasite; + node["bool format"] = settings.bool_format; + node["bool dashboard"] = settings.bool_dashboard; + node["enum format"] = settings.enum_format; + node["analog enabled"] = settings.analog_enabled; + node["telnet enabled"] = settings.telnet_enabled; + node["max web log buffer"] = settings.weblog_buffer; + node["web log buffer"] = EMSESP::webLogService.num_log_messages(); }); // Devices - show EMS devices if we have any From bfcdf3ef987966a8679572295611edaf986fbd35 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 29 Dec 2022 18:43:35 +0100 Subject: [PATCH 03/24] fix #860, wwactivated in offset 5 --- src/devices/boiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 4cfa1376d..2f60992ae 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -1898,7 +1898,7 @@ bool Boiler::set_ww_activated(const char * value, const int8_t id) { // https://github.com/emsesp/EMS-ESP/issues/268 // 08 for HT3 seems to be wrong, see https://github.com/emsesp/EMS-ESP32/issues/89 if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { - write_command(EMS_TYPE_UBAParameterWWPlus, 1, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus); + write_command(EMS_TYPE_UBAParameterWWPlus, 5, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus); } else { write_command(EMS_TYPE_UBAParameterWW, 1, v ? 0xFF : 0, EMS_TYPE_UBAParameterWW); } From b7288273245deab8657bd7fded0928a946e9db37 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 30 Dec 2022 15:46:55 +0100 Subject: [PATCH 04/24] update packages --- interface/package-lock.json | 38 ++++++++++++++++++------------------- interface/package.json | 2 +- src/web/WebLogService.h | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index f07f3bc3f..a95807a64 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -20,7 +20,7 @@ "@types/react-dom": "^18.0.10", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.2.5", - "axios": "^1.2.1", + "axios": "^1.2.2", "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -4166,9 +4166,9 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dependencies": { "@types/node": "*" } @@ -5081,9 +5081,9 @@ } }, "node_modules/axios": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", - "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", + "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -5956,9 +5956,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.0.tgz", - "integrity": "sha512-wY6cKosevs430KRkHUIsvepDXHGjlXOZO3hYXNyqpD6JvB0X28aXyv0t1Y1vZMwE7SoKmtfa6IASHCPN52FwBQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", + "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5966,9 +5966,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.0.tgz", - "integrity": "sha512-spN2H4E/wocMML7XtbKuqttHHM+zbF3bAdl9mT4/iyFaF33bowQGjxiWNWyvUJGH9F+hTgnhWziiLtwu3oC/Qg==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", + "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", "dependencies": { "browserslist": "^4.21.4" }, @@ -5978,9 +5978,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.0.tgz", - "integrity": "sha512-fJml7FM6v1HI3Gkg5/Ifc/7Y2qXcJxaDwSROeZGAZfNykSTvUk94WT55TYzJ2lFHK0voSr/d4nOVChLuNCWNpA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz", + "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -11165,9 +11165,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "version": "17.0.18", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.18.tgz", + "integrity": "sha512-eIJR1UER6ur3EpKM3d+2Pgd+ET+k6Kn9B4ZItX0oPjjVI5PrfaRjKyLT5UYendDpLuoiJMNJvovLQbEXqhsPaw==", "dependencies": { "@types/yargs-parser": "*" } diff --git a/interface/package.json b/interface/package.json index 862eb4655..3d885ba97 100644 --- a/interface/package.json +++ b/interface/package.json @@ -16,7 +16,7 @@ "@types/react-dom": "^18.0.10", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.2.5", - "axios": "^1.2.1", + "axios": "^1.2.2", "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index b224d17b3..cc7aad115 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -71,7 +71,7 @@ class WebLogService : public uuid::log::Handler { uint64_t last_transmit_ = 0; // Last transmit time size_t maximum_log_messages_ = MAX_LOG_MESSAGES; // Maximum number of log messages to buffer before they are output - size_t limit_log_messages_ = MAX_LOG_MESSAGES; // dynamic limit + size_t limit_log_messages_ = 1; // dynamic limit unsigned long log_message_id_ = 0; // The next identifier to use for queued log messages unsigned long log_message_id_tail_ = 0; // last event shown on the screen after fetch std::deque log_messages_; // Queued log messages, in the order they were received From 55750844ea0039c62d6f5a4635612ff48a3e63dc Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 30 Dec 2022 19:00:51 +0100 Subject: [PATCH 05/24] fix #865 --- src/command.cpp | 2 +- src/emsesp.cpp | 4 ++-- src/emsesp.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 588b9fe49..2686c3b7e 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -271,7 +271,7 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * #if defined(EMSESP_DEBUG) LOG_DEBUG("[DEBUG] Calling %s command '%s' to retrieve attributes", dname, cmd); #endif - return EMSESP::get_device_value_info(output, cmd, id, device_type) ? CommandRet::OK : CommandRet::ERROR; // entity = cmd + return EMSESP::get_device_value_info(output, cmd, id, device_type, device_id) ? CommandRet::OK : CommandRet::ERROR; // entity = cmd } } diff --git a/src/emsesp.cpp b/src/emsesp.cpp index f314bbeaf..a976e80bf 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -640,9 +640,9 @@ void EMSESP::publish_response(std::shared_ptr telegram) { } // builds json with the detail of each value, for a specific EMS device type or the dallas sensor -bool EMSESP::get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype) { +bool EMSESP::get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype, const uint8_t device_id) { for (const auto & emsdevice : emsdevices) { - if (emsdevice->device_type() == devicetype) { + if (emsdevice->device_type() == devicetype && emsdevice->device_id() == device_id) { return emsdevice->get_value_info(root, cmd, id); } } diff --git a/src/emsesp.h b/src/emsesp.h index f5fcf8214..10f559d91 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -136,7 +136,7 @@ class EMSESP { static uint8_t count_devices(); static uint8_t device_index(const uint8_t device_type, const uint8_t unique_id); - static bool get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype); + static bool get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype, const uint8_t device_id); static void show_device_values(uuid::console::Shell & shell); static void show_sensor_values(uuid::console::Shell & shell); From b16a16d1007d5d5b980551f1a7383c7d7ffb586e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 31 Dec 2022 11:02:59 +0100 Subject: [PATCH 06/24] 2. fix #865 --- src/command.cpp | 13 ++++++------- src/emsdevice.cpp | 6 +----- src/emsesp.cpp | 12 +++++++++--- src/emsesp.h | 2 +- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 2686c3b7e..18ffb6a99 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -116,13 +116,9 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec command_p = parse_command_string(command_p, id_n); if (command_p == nullptr) { // handle dead endpoints like api/system or api/boiler - // default to 'info' for SYSTEM, DALLASENSOR and ANALOGSENSOR, the other devices to 'values' for shortname version + // default to 'info' for SYSTEM, the other devices to 'values' for shortname version if (num_paths < (id_n > 0 ? 4 : 3)) { - if (device_type == EMSdevice::DeviceType::SYSTEM) { - command_p = F_(info); - } else { - command_p = F_(values); - } + command_p = device_type == EMSdevice::DeviceType::SYSTEM ? F_(info) : F_(values); } else { return message(CommandRet::NOT_FOUND, "missing or bad command", output); } @@ -138,6 +134,9 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec id_n += 8; // wwc1 has id 9 } else if (input.containsKey("id")) { id_n = input["id"]; + } else if (input.containsKey("hs")) { + id_n = input["hs"]; + id_n += 18; // hs1 has id 19 } } @@ -271,7 +270,7 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * #if defined(EMSESP_DEBUG) LOG_DEBUG("[DEBUG] Calling %s command '%s' to retrieve attributes", dname, cmd); #endif - return EMSESP::get_device_value_info(output, cmd, id, device_type, device_id) ? CommandRet::OK : CommandRet::ERROR; // entity = cmd + return EMSESP::get_device_value_info(output, cmd, id, device_type) ? CommandRet::OK : CommandRet::ERROR; // entity = cmd } } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 0186fb82b..f5b1d85dd 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -278,7 +278,7 @@ bool EMSdevice::has_tag(const uint8_t tag) const { return false; } -// check if the device has a command on the with this tag. +// check if the device has a command with this tag. bool EMSdevice::has_cmd(const char * cmd, const int8_t id) const { uint8_t tag = DeviceValueTAG::TAG_HC1 + id - 1; for (const auto & dv : devicevalues_) { @@ -1421,10 +1421,6 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 } } - char error[100]; - snprintf(error, sizeof(error), "cannot find values for entity '%s'", cmd); - json["message"] = error; - return false; } diff --git a/src/emsesp.cpp b/src/emsesp.cpp index a976e80bf..d5710f42c 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -640,10 +640,12 @@ void EMSESP::publish_response(std::shared_ptr telegram) { } // builds json with the detail of each value, for a specific EMS device type or the dallas sensor -bool EMSESP::get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype, const uint8_t device_id) { +bool EMSESP::get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype) { for (const auto & emsdevice : emsdevices) { - if (emsdevice->device_type() == devicetype && emsdevice->device_id() == device_id) { - return emsdevice->get_value_info(root, cmd, id); + if (emsdevice->device_type() == devicetype) { + if (emsdevice->get_value_info(root, cmd, id)) { + return true; + } } } @@ -659,6 +661,10 @@ bool EMSESP::get_device_value_info(JsonObject & root, const char * cmd, const in return true; } + char error[100]; + snprintf(error, sizeof(error), "cannot find values for entity '%s'", cmd); + root["message"] = error; + return false; } diff --git a/src/emsesp.h b/src/emsesp.h index 10f559d91..f5fcf8214 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -136,7 +136,7 @@ class EMSESP { static uint8_t count_devices(); static uint8_t device_index(const uint8_t device_type, const uint8_t unique_id); - static bool get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype, const uint8_t device_id); + static bool get_device_value_info(JsonObject & root, const char * cmd, const int8_t id, const uint8_t devicetype); static void show_device_values(uuid::console::Shell & shell); static void show_sensor_values(uuid::console::Shell & shell); From 34f6b412f688db605cfb22bef27d218a4048ca19 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 31 Dec 2022 11:04:24 +0100 Subject: [PATCH 07/24] fix #841, `call hcx` show info --- src/console.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/console.cpp b/src/console.cpp index a9486facf..bd151d165 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -364,11 +364,15 @@ void EMSESPShell::add_console_commands() { uint8_t return_code = CommandRet::OK; JsonObject json = doc.to(); + if (cmd == nullptr) { + cmd = device_type == EMSdevice::DeviceType::SYSTEM ? F_(info) : F_(values); + } + if (arguments.size() == 2) { // no value specified, just the cmd return_code = Command::call(device_type, cmd, nullptr, true, id, json); } else if (arguments.size() == 3) { - if (strncmp(cmd, "info", 4) == 0) { + if (strncmp(cmd, F_(info), 4) == 0 || strncmp(cmd, F_(values), 6) == 0) { // info has a id but no value return_code = Command::call(device_type, cmd, nullptr, true, atoi(arguments.back().c_str()), json); } else if (arguments[2] == "?") { From 2f1ea4da67a2f2f24d72abee4eb811c1b58da136 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 31 Dec 2022 11:25:29 +0100 Subject: [PATCH 08/24] output api_data to console --- src/console.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/console.cpp b/src/console.cpp index bd151d165..101a2d1bb 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -391,6 +391,11 @@ void EMSESPShell::add_console_commands() { } if (return_code == CommandRet::OK && json.size()) { + if (json.containsKey("api_data")) { + JsonVariant data = json["api_data"]; + shell.println(data.as()); + return; + } serializeJsonPretty(doc, shell); shell.println(); return; From 4536d60e3e8794179429e4c0835d1b1d796bcfa6 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 31 Dec 2022 11:35:25 +0100 Subject: [PATCH 09/24] v3.5.0-dev.15 --- CHANGELOG_LATEST.md | 2 ++ src/version.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 6a3e6c1a2..026b327d3 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -34,6 +34,8 @@ - Factory Reset not working [#628](https://github.com/emsesp/EMS-ESP32/issues/628) - Valid 4 byte values [#820](https://github.com/emsesp/EMS-ESP32/issues/820) - Commands for multiple thermostats [#826](https://github.com/emsesp/EMS-ESP32/issues/826) +- API queries for multiple devices [#865](https://github.com/emsesp/EMS-ESP32/issues/865) +- Console crash when using call with command `hcx` only. [#841](https://github.com/emsesp/EMS-ESP32/issues/841) ## Changed diff --git a/src/version.h b/src/version.h index 68e089c4f..3cb46d0c9 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.5.0-dev.14" +#define EMSESP_APP_VERSION "3.5.0-dev.15" From c3ff60dceda21e3b2c3251f64ef9d992236efc86 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 31 Dec 2022 15:21:59 +0100 Subject: [PATCH 10/24] move hs1..hs16 to heatsource, AM200 as ahs1 --- src/command.cpp | 12 ++- src/devices/boiler.cpp | 30 ------- src/devices/heatsource.cpp | 167 +++++++++++++++++++++++++++++-------- src/devices/heatsource.h | 9 ++ src/emsdevice.h | 6 +- src/emsdevicevalue.cpp | 2 + src/emsdevicevalue.h | 1 + src/emsesp.cpp | 17 +++- src/locale_translations.h | 1 + 9 files changed, 173 insertions(+), 72 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 18ffb6a99..f5c52531a 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -134,9 +134,12 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec id_n += 8; // wwc1 has id 9 } else if (input.containsKey("id")) { id_n = input["id"]; + } else if (input.containsKey("ahs")) { + id_n = input["ahs"]; + id_n += 18; // ahs1 has id 19 } else if (input.containsKey("hs")) { id_n = input["hs"]; - id_n += 18; // hs1 has id 19 + id_n += 19; // hs1 has id 20 } } @@ -218,11 +221,14 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { } else if (!strncmp(lowerCmd, "id", 2) && command[2] >= '1' && command[2] <= '9') { id = command[2] - '0'; command += 3; + } else if (!strncmp(lowerCmd, "ahs", 3) && command[2] >= '1' && command[2] <= '1') { // only ahs1 for now + id = command[2] - '1' + 19; + command += 4; } else if (!strncmp(lowerCmd, "hs", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '6') { - id = command[3] - '0' + 28; + id = command[3] - '0' + 29; command += 4; } else if (!strncmp(lowerCmd, "hs", 2) && command[2] >= '1' && command[2] <= '9') { - id = command[2] - '1' + 19; + id = command[2] - '1' + 20; command += 3; } // remove separator diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index ecb8a57ed..7f49b5a46 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -27,28 +27,6 @@ uuid::log::Logger Boiler::logger_{F_(boiler), uuid::log::Facility::CONSOLE}; Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { - // cascaded heating sources, only some values per individual heatsource (hs) - if (device_id >= EMSdevice::EMS_DEVICE_ID_BOILER_1) { - uint8_t hs = device_id - EMSdevice::EMS_DEVICE_ID_BOILER_1; // heating source id, count from 0 - // Runtime of each heatingsource in 0x06DC, ff - register_telegram_type(0x6DC + hs, "CascadeMessage", false, MAKE_PF_CB(process_CascadeMessage)); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, FL_(burnWorkMin), DeviceValueUOM::MINUTES); - // selBurnpower in D2 and E4 - // register_telegram_type(0xD2, "CascadePowerMessage", false, MAKE_PF_CB(process_CascadePowerMessage)); - // individual Flowtemps and powervalues for each heatingsource in E4 - register_telegram_type(0xE4, "UBAMonitorFastPlus", false, MAKE_PF_CB(process_UBAMonitorFastPlus)); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selFlowTemp_, DeviceValueType::UINT, FL_(selFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selBurnPow_, DeviceValueType::UINT, FL_(selBurnPow), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, - &curFlowTemp_, - DeviceValueType::USHORT, - DeviceValueNumOp::DV_NUMOP_DIV10, - FL_(curFlowTemp), - DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curBurnPow_, DeviceValueType::UINT, FL_(curBurnPow), DeviceValueUOM::PERCENT); - return; - } - // register values for master boiler/cascade module // reserve_telegram_functions(25); // reserve some space for the telegram registries, to avoid memory fragmentation @@ -1253,14 +1231,6 @@ void Boiler::process_UBASetPoints(std::shared_ptr telegram) { has_update(telegram, wwSetPumpPower_, 2); // ww pump speed/power? } -// 0x6DC, ff for cascaded heatsources (hs) -void Boiler::process_CascadeMessage(std::shared_ptr telegram) { - // uint8_t hsActivated; - // has_update(telegram, hsActivated, 0); - telegram->read_value(burnWorkMin_, 3); // this is in seconds - burnWorkMin_ /= 60; -} - #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" diff --git a/src/devices/heatsource.cpp b/src/devices/heatsource.cpp index 6c88f06be..b9b0812a9 100644 --- a/src/devices/heatsource.cpp +++ b/src/devices/heatsource.cpp @@ -24,68 +24,111 @@ REGISTER_FACTORY(Heatsource, EMSdevice::DeviceType::HEATSOURCE); Heatsource::Heatsource(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { - + if (device_id >= EMSdevice::EMS_DEVICE_ID_AHS1 && device_id < EMSdevice::EMS_DEVICE_ID_HS1) { + uint8_t ahs = device_id - EMSdevice::EMS_DEVICE_ID_AHS1; // heating source id, count from 0 register_telegram_type(0x54D, "AmTemperatures", false, MAKE_PF_CB(process_amTempMessage)); register_telegram_type(0x54E, "AmStatus", false, MAKE_PF_CB(process_amStatusMessage)); register_telegram_type(0x54F, "AmCommand", false, MAKE_PF_CB(process_amCommandMessage)); // not broadcasted, but actually not used register_telegram_type(0x550, "AmExtra", false, MAKE_PF_CB(process_amExtraMessage)); register_telegram_type(0x54C, "AmSettings", true, MAKE_PF_CB(process_amSettingMessage)); // not broadcasted - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &curFlowTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(sysFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(sysRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aFlowTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aRetTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &retTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(sysRetTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &aFlowTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &aRetTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aRetTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &cylTopTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aCylTopTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &cylCenterTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aCylCenterTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &cylBottomTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aCylBottomTemp), DeviceValueUOM::DEGREES); - // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveByPass_, DeviceValueType::BOOL, nullptr, FL_(valveByPass), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveBuffer_, DeviceValueType::UINT, FL_(valveBuffer), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveReturn_, DeviceValueType::UINT, FL_(valveReturn), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aPumpMod_, DeviceValueType::UINT, FL_(aPumpMod), DeviceValueUOM::PERCENT); - // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatSource_, DeviceValueType::BOOL, nullptr, FL_(heatSource), DeviceValueUOM::NONE); + // register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &valveByPass_, DeviceValueType::BOOL, nullptr, FL_(valveByPass), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &valveBuffer_, DeviceValueType::UINT, FL_(valveBuffer), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &valveReturn_, DeviceValueType::UINT, FL_(valveReturn), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &aPumpMod_, DeviceValueType::UINT, FL_(aPumpMod), DeviceValueUOM::PERCENT); + // register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &heatSource_, DeviceValueType::BOOL, nullptr, FL_(heatSource), DeviceValueUOM::NONE); // Settings: - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &vr2Config_, DeviceValueType::ENUM, FL_(enum_vr2Config), FL_(vr2Config), DeviceValueUOM::NONE, MAKE_CF_CB(set_vr2Config)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ahsActivated_, DeviceValueType::BOOL, FL_(ahsActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ahsActivated)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aPumpConfig_, DeviceValueType::BOOL, FL_(aPumpConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpConfig)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &vr2Config_, + DeviceValueType::ENUM, + FL_(enum_vr2Config), + FL_(vr2Config), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_vr2Config)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &ahsActivated_, + DeviceValueType::BOOL, + FL_(ahsActivated), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ahsActivated)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &aPumpConfig_, + DeviceValueType::BOOL, + FL_(aPumpConfig), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_aPumpConfig)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &aPumpSignal_, DeviceValueType::ENUM, FL_(enum_aPumpSignal), FL_(aPumpSignal), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpSignal)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &aPumpMin_, DeviceValueType::UINT, FL_(aPumpMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_aPumpMin), 12, 50); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tempRise_, DeviceValueType::BOOL, FL_(tempRise), DeviceValueUOM::NONE, MAKE_CF_CB(set_tempRise)); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &setReturnTemp_, DeviceValueType::UINT, FL_(setReturnTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setReturnTemp), 40, 75); + DeviceValueTAG::TAG_AHS1 + ahs, &aPumpMin_, DeviceValueType::UINT, FL_(aPumpMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_aPumpMin), 12, 50); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &tempRise_, DeviceValueType::BOOL, FL_(tempRise), DeviceValueUOM::NONE, MAKE_CF_CB(set_tempRise)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &setReturnTemp_, + DeviceValueType::UINT, + FL_(setReturnTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_setReturnTemp), + 40, + 75); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &mixRuntime_, DeviceValueType::USHORT, FL_(mixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_mixRuntime), 0, 600); + DeviceValueTAG::TAG_AHS1 + ahs, &mixRuntime_, DeviceValueType::USHORT, FL_(mixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_mixRuntime), 0, 600); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setFlowTemp), 40, 75); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &bufBypass_, DeviceValueType::ENUM, FL_(enum_bufBypass), FL_(bufBypass), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufBypass)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + DeviceValueTAG::TAG_AHS1 + ahs, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setFlowTemp), 40, 75); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &bufBypass_, + DeviceValueType::ENUM, + FL_(enum_bufBypass), + FL_(bufBypass), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_bufBypass)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, &bufMixRuntime_, DeviceValueType::USHORT, FL_(bufMixRuntime), @@ -93,15 +136,73 @@ Heatsource::Heatsource(uint8_t device_type, uint8_t device_id, uint8_t product_i MAKE_CF_CB(set_bufMixRuntime), 0, 600); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &bufConfig_, + DeviceValueType::ENUM, + FL_(enum_bufConfig), + FL_(bufConfig), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_bufConfig)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &blockMode_, + DeviceValueType::ENUM, + FL_(enum_blockMode), + FL_(blockMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_blockMode)); + register_device_value(DeviceValueTAG::TAG_AHS1 + ahs, + &blockTerm_, + DeviceValueType::ENUM, + FL_(enum_blockTerm), + FL_(blockTerm), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_blockTerm)); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &bufConfig_, DeviceValueType::ENUM, FL_(enum_bufConfig), FL_(bufConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufConfig)); + DeviceValueTAG::TAG_AHS1 + ahs, &blockHyst_, DeviceValueType::INT, FL_(blockHyst), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_blockHyst), 0, 50); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &blockMode_, DeviceValueType::ENUM, FL_(enum_blockMode), FL_(blockMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockMode)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &blockTerm_, DeviceValueType::ENUM, FL_(enum_blockTerm), FL_(blockTerm), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockTerm)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &blockHyst_, DeviceValueType::INT, FL_(blockHyst), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_blockHyst), 0, 50); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &releaseWait_, DeviceValueType::UINT, FL_(releaseWait), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_releaseWait), 0, 240); + DeviceValueTAG::TAG_AHS1 + ahs, &releaseWait_, DeviceValueType::UINT, FL_(releaseWait), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_releaseWait), 0, 240); + } + + // cascaded heating sources, only some values per individual heatsource (hs) + if (device_id >= EMSdevice::EMS_DEVICE_ID_HS1) { + uint8_t hs = device_id - EMSdevice::EMS_DEVICE_ID_HS1; // heating source id, count from 0 + // Runtime of each heatingsource in 0x06DC, ff + register_telegram_type(0x6DC + hs, "CascadeMessage", false, MAKE_PF_CB(process_CascadeMessage)); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, FL_(burnWorkMin), DeviceValueUOM::MINUTES); + // selBurnpower in D2 and E4 + // register_telegram_type(0xD2, "CascadePowerMessage", false, MAKE_PF_CB(process_CascadePowerMessage)); + // individual Flowtemps and powervalues for each heatingsource in E4 + register_telegram_type(0xE4, "UBAMonitorFastPlus", false, MAKE_PF_CB(process_UBAMonitorFastPlus)); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selBurnPow_, DeviceValueType::UINT, FL_(selBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, + &curFlowTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(curFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curBurnPow_, DeviceValueType::UINT, FL_(curBurnPow), DeviceValueUOM::PERCENT); + return; + } +} + +/* + * heatingsources (boilers) + */ + +// 0x6DC, ff for cascaded heatsources (hs) +void Heatsource::process_CascadeMessage(std::shared_ptr telegram) { + telegram->read_value(burnWorkMin_, 3); // this is in seconds + burnWorkMin_ /= 60; + has_update(burnWorkMin_); +} + +// UBAMonitorFastPlus - type 0xE4 - central heating monitor EMS+ +void Heatsource::process_UBAMonitorFastPlus(std::shared_ptr telegram) { + has_update(telegram, setFlowTemp_, 6); + has_update(telegram, curBurnPow_, 10); + has_update(telegram, selBurnPow_, 9); + has_update(telegram, curFlowTemp_, 7); } /* diff --git a/src/devices/heatsource.h b/src/devices/heatsource.h index f365af973..7aa282c38 100644 --- a/src/devices/heatsource.h +++ b/src/devices/heatsource.h @@ -28,6 +28,12 @@ class Heatsource : public EMSdevice { Heatsource(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand); private: + // hs1 .. hs16 + uint32_t burnWorkMin_; + uint8_t selBurnPow_; + uint8_t curBurnPow_; + + // ahs uint16_t curFlowTemp_; // Current flow temperature uint16_t retTemp_; // Return temperature int16_t cylTopTemp_; // TB1 @@ -59,6 +65,9 @@ class Heatsource : public EMSdevice { int8_t blockHyst_; // pos 14?: Hyst. for bolier block (K) uint8_t releaseWait_; // pos 15: Boiler release wait time (min) + void process_CascadeMessage(std::shared_ptr telegram); + void process_UBAMonitorFastPlus(std::shared_ptr telegram); + void process_amTempMessage(std::shared_ptr telegram); void process_amStatusMessage(std::shared_ptr telegram); void process_amSettingMessage(std::shared_ptr telegram); diff --git a/src/emsdevice.h b/src/emsdevice.h index 90efe9774..1aa8e5db1 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -352,9 +352,9 @@ class EMSdevice { // static device IDs static constexpr uint8_t EMS_DEVICE_ID_BOILER = 0x08; // fixed device_id for Master Boiler/UBA - static constexpr uint8_t EMS_DEVICE_ID_BOILER_1 = 0x70; // fixed device_id for 1st. Cascade Boiler/UBA - static constexpr uint8_t EMS_DEVICE_ID_BOILER_F = 0x7F; // fixed device_id for last Cascade Boiler/UBA - static constexpr uint8_t EMS_DEVICE_ID_AM200 = 0x60; // fixed device_id for alternative Heating AM200 + static constexpr uint8_t EMS_DEVICE_ID_HS1 = 0x70; // fixed device_id for 1st. Cascade Boiler/UBA + static constexpr uint8_t EMS_DEVICE_ID_HS16 = 0x7F; // fixed device_id for last Cascade Boiler/UBA + static constexpr uint8_t EMS_DEVICE_ID_AHS1 = 0x60; // fixed device_id for alternative Heating AM200 static constexpr uint8_t EMS_DEVICE_ID_CONTROLLER = 0x09; static constexpr uint8_t EMS_DEVICE_ID_RS232 = 0x04; static constexpr uint8_t EMS_DEVICE_ID_TERMINAL = 0x0A; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index 1a381e36f..c6ce56bcc 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -140,6 +140,7 @@ const char * const * DeviceValue::DeviceValueTAG_s[] = { FL_(tag_wwc8), // "wwc8" FL_(tag_wwc9), // "wwc9" FL_(tag_wwc10), // "wwc10" + FL_(tag_ahs1), // "ahs1" FL_(tag_hs1), // "hs1" FL_(tag_hs2), // "hs2" FL_(tag_hs3), // "hs3" @@ -185,6 +186,7 @@ const char * const DeviceValue::DeviceValueTAG_mqtt[] = { FL_(tag_wwc8)[0], // "wwc8" FL_(tag_wwc9)[0], // "wwc9" FL_(tag_wwc10)[0], // "wwc10" + FL_(tag_ahs1)[0], // "ahs1" FL_(tag_hs1)[0], // "hs1" FL_(tag_hs2)[0], // "hs2" FL_(tag_hs3)[0], // "hs3" diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 35e3ac992..16a2f0788 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -98,6 +98,7 @@ class DeviceValue { TAG_WWC8, TAG_WWC9, TAG_WWC10, + TAG_AHS1, TAG_HS1, TAG_HS2, TAG_HS3, diff --git a/src/emsesp.cpp b/src/emsesp.cpp index d5710f42c..a72316bea 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1006,13 +1006,24 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const for (auto & device : device_library_) { if (device.product_id == product_id) { // sometimes boilers share the same productID as controllers - // so only add boilers if the device_id is 0x08 or 0x70.., which is fixed for EMS + // so only add boilers if the device_id is 0x08 + // cascaded boilers with 0x70.., map to heatsources if (device.device_type == DeviceType::BOILER) { - if (device_id == EMSdevice::EMS_DEVICE_ID_BOILER - || (device_id >= EMSdevice::EMS_DEVICE_ID_BOILER_1 && device_id <= EMSdevice::EMS_DEVICE_ID_BOILER_F)) { + if (device_id == EMSdevice::EMS_DEVICE_ID_BOILER) { device_p = &device; break; } + if ((device_id >= EMSdevice::EMS_DEVICE_ID_HS1 && device_id <= EMSdevice::EMS_DEVICE_ID_HS16)) { + device_p = &device; + device_p->device_type = DeviceType::HEATSOURCE; + break; + } + } else if (device.device_type == DeviceType::HEATSOURCE) { + device_p = &device; + if (device_id == EMSdevice::EMS_DEVICE_ID_BOILER) { // AHS as only heatsource on d 0x08 + device_p->device_type = DeviceType::BOILER; + } + break; } else { // it's not a boiler, but we have a match device_p = &device; diff --git a/src/locale_translations.h b/src/locale_translations.h index baf75c359..a6c3f0ae3 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -75,6 +75,7 @@ MAKE_PSTR_LIST(tag_wwc7, "wwc7", "WWK7", "wwc7", "wwc7", "CWU7", "wwc7", "wwc7") MAKE_PSTR_LIST(tag_wwc8, "wwc8", "WWK8", "wwc8", "wwc8", "CWU8", "wwc8", "wwc8") MAKE_PSTR_LIST(tag_wwc9, "wwc9", "WWK9", "wwc9", "wwc9", "CWU9", "wwc9", "wwc9") MAKE_PSTR_LIST(tag_wwc10, "wwc10", "WWK10", "wwc10", "wwc10", "CWU10", "wwc10", "wwc10") +MAKE_PSTR_LIST(tag_ahs1, "ahs1", "ahs1", "ahs1", "ahs1", "AŹC1", "ahs1", "ahs1") MAKE_PSTR_LIST(tag_hs1, "hs1", "hs1", "hs1", "hs1", "ŹC1", "hs1", "hs1") MAKE_PSTR_LIST(tag_hs2, "hs2", "hs2", "hs2", "hs2", "ŹC2", "hs2", "hs2") MAKE_PSTR_LIST(tag_hs3, "hs3", "hs3", "hs3", "hs3", "ŹC3", "hs3", "hs3") From 3bf2110df1108e0aadbe4d45631737ce862379a4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 31 Dec 2022 18:48:55 +0100 Subject: [PATCH 11/24] command prefix `ahs1` --- src/command.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index f5c52531a..34cf52fbf 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -221,8 +221,8 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { } else if (!strncmp(lowerCmd, "id", 2) && command[2] >= '1' && command[2] <= '9') { id = command[2] - '0'; command += 3; - } else if (!strncmp(lowerCmd, "ahs", 3) && command[2] >= '1' && command[2] <= '1') { // only ahs1 for now - id = command[2] - '1' + 19; + } else if (!strncmp(lowerCmd, "ahs", 3) && command[3] >= '1' && command[3] <= '1') { // only ahs1 for now + id = command[3] - '1' + 19; command += 4; } else if (!strncmp(lowerCmd, "hs", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '6') { id = command[3] - '0' + 29; From 5e00f07fd8e9a449e4142fb8ae4331aedb5f61a0 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 1 Jan 2023 15:20:35 +0100 Subject: [PATCH 12/24] fix #875 typo --- interface/src/i18n/de/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index cb08d4d01..f2b67ea17 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -122,7 +122,7 @@ const de: Translation = { LANGUAGE_ENTITIES: 'Sprache (für Geräteentitäten)', HIDE_LED: 'LED ausblenden', ENABLE_TELNET: 'Aktiviere Telnet Konsole', - ENABLE_ANALOG: 'Aktiviere Analogsensorsen', + ENABLE_ANALOG: 'Aktiviere Analogsensoren', CONVERT_FAHRENHEIT: 'Konvertiere Temperaturwerte in Fahrenheit', BYPASS_TOKEN: 'Zugriffstoken-Autorisierung bei API-Aufrufen umgehen', READONLY: 'Nur-Lese-Modus aktivieren (blockiert alle ausgehenden EMS Tx Write-Befehle)', From 2062703565f6833e120fa79fd10a07e445c28efe Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 1 Jan 2023 15:21:18 +0100 Subject: [PATCH 13/24] fix #874 plural of days --- interface/src/i18n/pl/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 201148f86..0cacf1b94 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -99,7 +99,7 @@ const pl: BaseTranslation = { NUM_DEVICES: '{num} urządze{{ń|nie|nia|nia|ń}} EMS', NUM_TEMP_SENSORS: '{num} czujni{{ków|k|ki|ki|ków}} temperatury', NUM_ANALOG_SENSORS: '{num} inn{{ych|e|e|e|ych}} urządze{{ń|nie|nia(two)|nia|ń}} podłączon{{ych|e|e|e|ych}} do EMS-ESP', - NUM_DAYS: '{num} {{dni|dzień|dni|dni|dni}}', + NUM_DAYS: '{num} d{{ni|zień|ni|ni|ni}}', NUM_SECONDS: '{num} sekun{{d|da|dy|dy|d}}', NUM_HOURS: '{num} godzi{{n|na|ny|ny|n}}', NUM_MINUTES: '{num} minu{{t|ta|ty|ty|t}}', From c19885d730c1838423cfed22f33491e1b1d1e6e7 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 1 Jan 2023 18:38:51 +0100 Subject: [PATCH 14/24] weblog buffer size --- src/web/WebLogService.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index e76351cfb..e955b41c2 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -206,7 +206,14 @@ void WebLogService::transmit(const QueuedLogMessage & message) { // send the complete log buffer to the API, not filtering on log level void WebLogService::fetchLog(AsyncWebServerRequest * request) { - auto * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN + 192 * log_messages_.size()); + // auto * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN + 192 * log_messages_.size()); + size_t buffer = EMSESP_JSON_SIZE_XLARGE_DYN + 192 * log_messages_.size(); + auto * response = new MsgpackAsyncJsonResponse(false, buffer); + while (!response->getSize()) { + delete response; + buffer -= 1024; + response = new MsgpackAsyncJsonResponse(false, buffer); + } JsonObject root = response->getRoot(); JsonArray log = root.createNestedArray("events"); From 718ede8439681eb2c9c041a200b3c7246a7e53a0 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 10:08:00 +0100 Subject: [PATCH 15/24] prevent writing empty settings --- lib/framework/FSPersistence.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index 0b66de2f2..c4a4463c9 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -81,7 +81,7 @@ class FSPersistence { File settingsFile = _fs->open(_filePath, "w"); // failed to open file, return false - if (!settingsFile) { + if (!settingsFile || !jsonObject.size()) { #if defined(EMSESP_DEBUG) #if defined(EMSESP_USE_SERIAL) Serial.println(); From 49113edeff0b3b9ac356f8582519cf1c694a6869 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 10:09:40 +0100 Subject: [PATCH 16/24] add values/settings for #878, #879, #880 --- src/devices/boiler.cpp | 72 ++++++++++++++++++++++++++++++++++++++ src/devices/boiler.h | 9 +++++ src/devices/thermostat.cpp | 41 ++++++++++++++++++++++ src/devices/thermostat.h | 9 +++++ src/locale_translations.h | 8 +++++ 5 files changed, 139 insertions(+) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 7f49b5a46..dd00729a0 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -443,6 +443,18 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(maxHeatHeat), DeviceValueUOM::NONE, MAKE_CF_CB(set_maxHeatHeat)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &manDefrost_, + DeviceValueType::BOOL, + FL_(manDefrost), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_manDefrost)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pvCooling_, + DeviceValueType::BOOL, + FL_(pvCooling), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_pvCooling)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &maxHeatDhw_, DeviceValueType::ENUM, @@ -472,6 +484,22 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_additionalHeaterDelay), 10, 1000); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &auxMaxTemp_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL10, + FL_(auxMaxTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_auxMaxTemp), + 0, + 10); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &auxHeatMode_, + DeviceValueType::ENUM, + FL_(enum_modetype), + FL_(auxHeatMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_auxHeatMode)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpHystHeat_, DeviceValueType::USHORT, @@ -1202,6 +1230,11 @@ void Boiler::process_HpInConfig(std::shared_ptr telegram) { has_update(hpInput[3].option, option, 12); } +// Boiler(0x08) -W-> Me(0x0B), HpHeaterConfig(0x0485) +void Boiler::process_HpCooling(std::shared_ptr telegram) { + has_update(pvCooling_, 21); +} + // Boiler(0x08) -W-> Me(0x0B), HpHeaterConfig(0x0492), data: 03 00 00 04 00 void Boiler::process_HpHeaterConfig(std::shared_ptr telegram) { has_update(maxHeatComp_, 2); @@ -1401,9 +1434,12 @@ void Boiler::process_HpPumps(std::shared_ptr telegram) { // Boiler(0x08) -> All(0x00), ?(0x0491), data: 03 01 00 00 00 02 64 00 00 14 01 2C 00 0A 00 1E 00 1E 00 00 1E 0A 1E 05 05 void Boiler::process_HpAdditionalHeater(std::shared_ptr telegram) { + has_update(telegram, manDefrost_, 0); // off/on has_update(telegram, auxHeaterOnly_, 1); has_update(telegram, auxHeaterOff_, 2); + has_update(telegram, auxHeatMode_, 4); // eco/comfort has_update(telegram, tempParMode_, 5); + has_update(telegram, auxMaxTemp_, 14); // is *10 has_update(telegram, auxHeaterDelay_, 16); // is / 10 } @@ -2243,6 +2279,42 @@ bool Boiler::set_additionalHeaterDelay(const char * value, const int8_t id) { return false; } +bool Boiler::set_auxHeatMode(const char * value, const int8_t id) { + uint8_t v; + if (Helpers::value2enum(value, v, FL_(enum_modetype))) { + write_command(0x491, 4, v, 0x491); + return true; + } + return false; +} + +bool Boiler::set_auxMaxTemp(const char * value, const int8_t id) { + float v; + if (Helpers::value2temperature(value, v)) { + write_command(0x491, 14, (uint8_t)(v * 10), 0x491); + return true; + } + return false; +} + +bool Boiler::set_manDefrost(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x491, 0, v ? 1 : 0, 0x491); + return true; + } + return false; +} + +bool Boiler::set_pvCooling(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x485, 21, v ? 1 : 0, 0x485); + return true; + } + return false; +} + bool Boiler::set_hpHyst(const char * value, const int8_t id) { int v; if (Helpers::value2number(value, v)) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index df2592556..7776afa31 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -212,6 +212,10 @@ class Boiler : public EMSdevice { uint8_t maxHeatHeat_; uint8_t maxHeatDhw_; + uint8_t pvCooling_; + uint8_t manDefrost_; + uint8_t auxHeatMode_; + uint8_t auxMaxTemp_; uint8_t auxHeaterOnly_; uint8_t auxHeaterOff_; uint8_t auxHeaterStatus_; @@ -274,6 +278,7 @@ class Boiler : public EMSdevice { void process_HpPool(std::shared_ptr telegram); void process_HpInput(std::shared_ptr telegram); void process_HpInConfig(std::shared_ptr telegram); + void process_HpCooling(std::shared_ptr telegram); void process_HpHeaterConfig(std::shared_ptr telegram); void process_HybridHp(std::shared_ptr telegram); void process_HpSilentMode(std::shared_ptr telegram); @@ -356,6 +361,10 @@ class Boiler : public EMSdevice { bool set_additionalHeater(const char * value, const int8_t id); bool set_additionalHeaterDelay(const char * value, const int8_t id); bool set_tempParMode(const char * value, const int8_t id); + bool set_auxHeatMode(const char * value, const int8_t id); + bool set_auxMaxTemp(const char * value, const int8_t id); + bool set_manDefrost(const char * value, const int8_t id); + bool set_pvCooling(const char * value, const int8_t id); bool set_hpHyst(const char * value, const int8_t id); inline bool set_hpHystHeat(const char * value, const int8_t id) { diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index f1e8474f1..70775a87e 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -154,6 +154,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(0x267, "RC300Floordry", false, MAKE_PF_CB(process_RC300Floordry)); register_telegram_type(0x240, "RC300Settings", true, MAKE_PF_CB(process_RC300Settings)); register_telegram_type(0xBB, "HybridSettings", true, MAKE_PF_CB(process_HybridSettings)); + register_telegram_type(0x23E, "PVSettings", true, MAKE_PF_CB(process_PVSettings)); // JUNKERS/HT3 } else if (model == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) { @@ -883,6 +884,12 @@ void Thermostat::process_HybridSettings(std::shared_ptr telegram has_update(telegram, tempDiffBoiler_, 19); // relative degrees } +// 0x23E PV settings +void Thermostat::process_PVSettings(std::shared_ptr telegram) { + has_update(telegram, pvRaiseHeat_, 0); + has_update(telegram, pvLowerCool_, 5); +} + void Thermostat::process_JunkersSetMixer(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { @@ -1503,6 +1510,24 @@ bool Thermostat::set_tempDiffBoiler(const char * value, const int8_t id) { return true; } +bool Thermostat::set_pvRaiseHeat(const char * value, const int8_t id) { + int v; + if (Helpers::value2temperature(value, v, true)) { + write_command(0x23E, 0, v, 0x23E); + return true; + } + return false; +} + +bool Thermostat::set_pvLowerCool(const char * value, const int8_t id) { + int v; + if (Helpers::value2temperature(value, v, true)) { + write_command(0x23E, 5, v, 0x23E); + return true; + } + return false; +} + // 0xA5 - Set minimum external temperature bool Thermostat::set_minexttemp(const char * value, const int8_t id) { int mt; @@ -3536,6 +3561,22 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_tempDiffBoiler), 1, 99); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pvRaiseHeat_, + DeviceValueType::INT, + FL_(pvRaiseHeat), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_pvRaiseHeat), + 0, + 5); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pvLowerCool_, + DeviceValueType::INT, + FL_(pvLowerCool), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_pvLowerCool), + -5, + 0); break; case EMS_DEVICE_FLAG_RC10: register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 6366cfd32..9d33c2f93 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -236,6 +236,10 @@ class Thermostat : public EMSdevice { uint8_t delayBoiler_; // minutes uint8_t tempDiffBoiler_; // relative temperature degrees + // PV + uint8_t pvRaiseHeat_; + uint8_t pvLowerCool_; + std::vector> heating_circuits_; // each thermostat can have multiple heating circuits // Generic Types @@ -379,6 +383,7 @@ class Thermostat : public EMSdevice { void process_EasyMonitor(std::shared_ptr telegram); void process_JunkersRemoteMonitor(std::shared_ptr telegram); void process_HybridSettings(std::shared_ptr telegram); + void process_PVSettings(std::shared_ptr telegram); void process_JunkersSetMixer(std::shared_ptr telegram); void process_JunkersWW(std::shared_ptr telegram); void process_RemoteTemp(std::shared_ptr telegram); @@ -491,6 +496,10 @@ class Thermostat : public EMSdevice { bool set_delayBoiler(const char * value, const int8_t id); bool set_tempDiffBoiler(const char * value, const int8_t id); bool set_roomsensor(const char * value, const int8_t id); + + bool set_pvRaiseHeat(const char * value, const int8_t id); + bool set_pvLowerCool(const char * value, const int8_t id); + }; } // namespace emsesp diff --git a/src/locale_translations.h b/src/locale_translations.h index f96c78dee..16b20a240 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -384,6 +384,12 @@ MAKE_PSTR_LIST(wwComfOffTemp, "wwcomfoff", "comfort switch off", "Komfort Aussch MAKE_PSTR_LIST(wwEcoOffTemp, "wwecooff", "eco switch off", "ECO Ausschalttemp", "Eco Uitschakeltemp.", "Ekoläge avstängningstemp.", "temperatura wyłączania w trybie eko", "", "Eco Temp. d'arrêt") MAKE_PSTR_LIST(wwEcoPlusOffTemp, "wwecoplusoff", "eco+ switch off", "ECO+ Ausschalttemp", "Eco+ Uitschakeltemp.", "Eko+ avstängningstemp.", "temperatura wyłączania w trybie eko+", "", "Eco+ Temp. d'arrêt") +MAKE_PSTR_LIST(auxHeatMode, "auxheatrmode", "aux heater mode", "Modus Zusatzheizer", "", "", "", "", "") +MAKE_PSTR_LIST(auxMaxTemp, "auxmaxtemp", "aux heater max temperature", "Zusatzheizer Maximaltemp.", "", "", "", "", "") +MAKE_PSTR_LIST(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "", "", "", "", "") +MAKE_PSTR_LIST(pvCooling, "pvcooling", "Cooling only with PV", "Kühlen nur mit PV", "", "", "", "", "") + + // hybrid heatpump MAKE_PSTR_LIST(hybridStrategy, "hybridstrategy", "hybrid control strategy", "Hybrid Strategie", "Hybride strategie", "Hybrid kontrollstrategi", "strategia sterowania hybrydowego", "hybrid kontrollstrategi", "stratégie contrôle hybride") MAKE_PSTR_LIST(switchOverTemp, "switchovertemp", "outside switchover temperature", "Außentemperatur für Umschaltung", "Schakeltemperatuur buitentemperatuur", "Utomhus Omställningstemperatur", "zewnętrzna temperatura przełączania", "utendørstemp styring", "basculement par température extérieure") @@ -509,6 +515,8 @@ MAKE_PSTR_LIST(autodst, "autodst", "automatic change daylight saving time", "aut MAKE_PSTR_LIST(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") MAKE_PSTR_LIST(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é") MAKE_PSTR_LIST(mixingvalves, "mixingvalves", "mixing valves", "Mischventile", "Mengkleppen", "Blandningsventiler", "zawory mieszające", "blandeventiler", "vannes mélange") +MAKE_PSTR_LIST(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Heizanghebung mit PV", "", "", "", "", "") +MAKE_PSTR_LIST(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "", "", "", "", "") // thermostat ww MAKE_PSTR_LIST(wwMode, "wwmode", "mode", "Modus", "Modus", "Läge", "tryb pracy", "modus", "mode") From 9163fc74d4cd5df81e50c97dcce5d7a81a37f767 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 12:16:46 +0100 Subject: [PATCH 17/24] fix reading maxHeat values --- src/devices/boiler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index dd00729a0..ba22c6b5c 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -1232,14 +1232,14 @@ void Boiler::process_HpInConfig(std::shared_ptr telegram) { // Boiler(0x08) -W-> Me(0x0B), HpHeaterConfig(0x0485) void Boiler::process_HpCooling(std::shared_ptr telegram) { - has_update(pvCooling_, 21); + has_update(telegram, pvCooling_, 21); } // Boiler(0x08) -W-> Me(0x0B), HpHeaterConfig(0x0492), data: 03 00 00 04 00 void Boiler::process_HpHeaterConfig(std::shared_ptr telegram) { - has_update(maxHeatComp_, 2); - has_update(maxHeatHeat_, 3); - has_update(maxHeatDhw_, 4); + has_update(telegram, maxHeatComp_, 2); + has_update(telegram, maxHeatHeat_, 3); + has_update(telegram, maxHeatDhw_, 4); } // 0x2A - MC110Status From bb1704ed7ab3cc7f26dcc1ecf96bd829c70b7c0f Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 15:06:56 +0100 Subject: [PATCH 18/24] auxMaxTemp, pvRaise/Lower to Kelvin --- src/devices/boiler.cpp | 4 ++-- src/devices/thermostat.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index ba22c6b5c..d5f517d09 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -489,7 +489,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_MUL10, FL_(auxMaxTemp), - DeviceValueUOM::DEGREES, + DeviceValueUOM::K, MAKE_CF_CB(set_auxMaxTemp), 0, 10); @@ -2290,7 +2290,7 @@ bool Boiler::set_auxHeatMode(const char * value, const int8_t id) { bool Boiler::set_auxMaxTemp(const char * value, const int8_t id) { float v; - if (Helpers::value2temperature(value, v)) { + if (Helpers::value2float(value, v)) { write_command(0x491, 14, (uint8_t)(v * 10), 0x491); return true; } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 70775a87e..d706f3d3e 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1512,7 +1512,7 @@ bool Thermostat::set_tempDiffBoiler(const char * value, const int8_t id) { bool Thermostat::set_pvRaiseHeat(const char * value, const int8_t id) { int v; - if (Helpers::value2temperature(value, v, true)) { + if (Helpers::value2number(value, v)) { write_command(0x23E, 0, v, 0x23E); return true; } @@ -1521,7 +1521,7 @@ bool Thermostat::set_pvRaiseHeat(const char * value, const int8_t id) { bool Thermostat::set_pvLowerCool(const char * value, const int8_t id) { int v; - if (Helpers::value2temperature(value, v, true)) { + if (Helpers::value2number(value, v)) { write_command(0x23E, 5, v, 0x23E); return true; } @@ -3565,7 +3565,7 @@ void Thermostat::register_device_values() { &pvRaiseHeat_, DeviceValueType::INT, FL_(pvRaiseHeat), - DeviceValueUOM::DEGREES_R, + DeviceValueUOM::K, MAKE_CF_CB(set_pvRaiseHeat), 0, 5); @@ -3573,7 +3573,7 @@ void Thermostat::register_device_values() { &pvLowerCool_, DeviceValueType::INT, FL_(pvLowerCool), - DeviceValueUOM::DEGREES_R, + DeviceValueUOM::K, MAKE_CF_CB(set_pvLowerCool), -5, 0); From 56b5739cfcf4af3274d9ecce2b0bb8964daad2d5 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 15:07:44 +0100 Subject: [PATCH 19/24] add EMS1.0 Cascade (MC40?) --- src/device_library.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/device_library.h b/src/device_library.h index db60e9a4e..9a0c9ba65 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -30,6 +30,7 @@ { 84, DeviceType::BOILER, "Logamax Plus GB022", DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 95, DeviceType::BOILER, "Condens 2500/Logamax/Logomatic/Cerapur Top/Greenstar/Generic HT3", DeviceFlags::EMS_DEVICE_FLAG_HT3}, {115, DeviceType::BOILER, "Topline/GB162", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{121, DeviceType::BOILER, "Cascade MC40", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {122, DeviceType::BOILER, "Proline", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {123, DeviceType::BOILER, "GBx72/Trendline/Cerapur/Greenstar Si/27i", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {131, DeviceType::BOILER, "GB212", DeviceFlags::EMS_DEVICE_FLAG_NONE}, @@ -67,6 +68,7 @@ {209, DeviceType::CONTROLLER, "ErP", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {218, DeviceType::CONTROLLER, "M200/RFM200", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x50 {220, DeviceType::CONTROLLER, "BC30", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x16 +{121, DeviceType::CONTROLLER, "MC40", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {224, DeviceType::CONTROLLER, "9000i", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {229, DeviceType::CONTROLLER, "8700i", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {230, DeviceType::CONTROLLER, "BC Base", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 From 4aa9d115742af96085a155c1974d83c1af4216a7 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 15:29:33 +0100 Subject: [PATCH 20/24] calculate command ids from tag names --- src/command.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 34cf52fbf..4f78fe537 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -131,15 +131,15 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec id_n = input["hc"]; } else if (input.containsKey("wwc")) { id_n = input["wwc"]; - id_n += 8; // wwc1 has id 9 + id_n += DeviceValueTAG::TAG_WWC1 - DeviceValueTAG::TAG_HC1; // wwc1 has id 9 } else if (input.containsKey("id")) { id_n = input["id"]; } else if (input.containsKey("ahs")) { id_n = input["ahs"]; - id_n += 18; // ahs1 has id 19 + id_n += DeviceValueTAG::TAG_AHS1 - DeviceValueTAG::TAG_HC1; // ahs1 has id 19 } else if (input.containsKey("hs")) { id_n = input["hs"]; - id_n += 19; // hs1 has id 20 + id_n += DeviceValueTAG::TAG_HS1 - DeviceValueTAG::TAG_HC1; // hs1 has id 20 } } @@ -210,10 +210,10 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { id = command[2] - '0'; command += 3; } else if (!strncmp(lowerCmd, "wwc", 3) && command[3] == '1' && command[4] == '0') { - id = 18; + id = DeviceValueTAG::TAG_WWC10 - DeviceValueTAG::TAG_HC1 + 1; //18; command += 5; } else if (!strncmp(lowerCmd, "wwc", 3) && command[3] >= '1' && command[3] <= '9') { - id = command[3] - '1' + 9; + id = command[3] - '1' + DeviceValueTAG::TAG_WWC1 - DeviceValueTAG::TAG_HC1 + 1; //9; command += 4; } else if (!strncmp(lowerCmd, "id", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '9') { id = command[3] - '0' + 10; @@ -222,13 +222,13 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { id = command[2] - '0'; command += 3; } else if (!strncmp(lowerCmd, "ahs", 3) && command[3] >= '1' && command[3] <= '1') { // only ahs1 for now - id = command[3] - '1' + 19; + id = command[3] - '1' + DeviceValueTAG::TAG_AHS1 - DeviceValueTAG::TAG_HC1 + 1; // 19; command += 4; } else if (!strncmp(lowerCmd, "hs", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '6') { - id = command[3] - '0' + 29; + id = command[3] - '0' + DeviceValueTAG::TAG_HS10 - DeviceValueTAG::TAG_HC1 + 1; //29; command += 4; } else if (!strncmp(lowerCmd, "hs", 2) && command[2] >= '1' && command[2] <= '9') { - id = command[2] - '1' + 20; + id = command[2] - '1' + DeviceValueTAG::TAG_HS1 - DeviceValueTAG::TAG_HC1 + 1; //20; command += 3; } // remove separator From 04b17a15bb00f8923e28d270de3b3a94fbc3d0b3 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 16:42:55 +0100 Subject: [PATCH 21/24] Register 0x68/0x69 as cascaded controller for testing! --- src/emsesp.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index a72316bea..d5e1247e9 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1014,7 +1014,7 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const break; } if ((device_id >= EMSdevice::EMS_DEVICE_ID_HS1 && device_id <= EMSdevice::EMS_DEVICE_ID_HS16)) { - device_p = &device; + device_p = &device; device_p->device_type = DeviceType::HEATSOURCE; break; } @@ -1084,6 +1084,10 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const device_type = DeviceType::BOILER; flags = DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP; LOG_WARNING("Unknown EMS boiler. Using generic profile. Please report on GitHub."); + } else if (device_id >= 0x68 && device_id <= 0x6F) { + // test for https://github.com/emsesp/EMS-ESP32/issues/882 + name = "cascaded controller"; + device_type = DeviceType::CONTROLLER; } else { LOG_WARNING("Unrecognized EMS device (device ID 0x%02X, no product ID). Please report on GitHub.", device_id); return false; From 71043963e7860deef2b8e6732d57460ce59215f6 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 2 Jan 2023 21:40:50 +0100 Subject: [PATCH 22/24] pvCooling, pvEnable, fix #878 --- interface/src/project/DeviceIcon.tsx | 2 +- src/devices/boiler.cpp | 1 + src/devices/thermostat.cpp | 16 ++++++++++++++++ src/devices/thermostat.h | 2 ++ src/locale_translations.h | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/interface/src/project/DeviceIcon.tsx b/interface/src/project/DeviceIcon.tsx index 27d2cabe2..8db8a5ca3 100644 --- a/interface/src/project/DeviceIcon.tsx +++ b/interface/src/project/DeviceIcon.tsx @@ -20,7 +20,7 @@ const DeviceIcon: FC = ({ type }) => { switch (type) { case 'Boiler': case 'Heatsource': - return ; + return ; case 'Sensor': return ; case 'Solar': diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index d5f517d09..174c8fbcd 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -75,6 +75,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x48F, "HpTemperatures", false, MAKE_PF_CB(process_HpTemperatures)); register_telegram_type(0x48A, "HpPool", true, MAKE_PF_CB(process_HpPool)); register_telegram_type(0x4A2, "HpInput", true, MAKE_PF_CB(process_HpInput)); + register_telegram_type(0x485, "HpCooling", true, MAKE_PF_CB(process_HpCooling)); register_telegram_type(0x486, "HpInConfig", true, MAKE_PF_CB(process_HpInConfig)); register_telegram_type(0x492, "HpHeaterConfig", true, MAKE_PF_CB(process_HpHeaterConfig)); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d706f3d3e..f1b38d10d 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -887,6 +887,7 @@ void Thermostat::process_HybridSettings(std::shared_ptr telegram // 0x23E PV settings void Thermostat::process_PVSettings(std::shared_ptr telegram) { has_update(telegram, pvRaiseHeat_, 0); + has_update(telegram, pvEnable_, 3); has_update(telegram, pvLowerCool_, 5); } @@ -1510,6 +1511,15 @@ bool Thermostat::set_tempDiffBoiler(const char * value, const int8_t id) { return true; } +bool Thermostat::set_pvEnable(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x23E, 3, v ? 0xFF : 0, 0x23E); + return true; + } + return false; +} + bool Thermostat::set_pvRaiseHeat(const char * value, const int8_t id) { int v; if (Helpers::value2number(value, v)) { @@ -3561,6 +3571,12 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_tempDiffBoiler), 1, 99); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &pvEnable_, + DeviceValueType::BOOL, + FL_(pvEnable), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_pvEnable)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pvRaiseHeat_, DeviceValueType::INT, diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 9d33c2f93..1ad4d6a1d 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -237,6 +237,7 @@ class Thermostat : public EMSdevice { uint8_t tempDiffBoiler_; // relative temperature degrees // PV + uint8_t pvEnable_; uint8_t pvRaiseHeat_; uint8_t pvLowerCool_; @@ -497,6 +498,7 @@ class Thermostat : public EMSdevice { bool set_tempDiffBoiler(const char * value, const int8_t id); bool set_roomsensor(const char * value, const int8_t id); + bool set_pvEnable(const char * value, const int8_t id); bool set_pvRaiseHeat(const char * value, const int8_t id); bool set_pvLowerCool(const char * value, const int8_t id); diff --git a/src/locale_translations.h b/src/locale_translations.h index 16b20a240..4653bd31f 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -515,6 +515,7 @@ MAKE_PSTR_LIST(autodst, "autodst", "automatic change daylight saving time", "aut MAKE_PSTR_LIST(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") MAKE_PSTR_LIST(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é") MAKE_PSTR_LIST(mixingvalves, "mixingvalves", "mixing valves", "Mischventile", "Mengkleppen", "Blandningsventiler", "zawory mieszające", "blandeventiler", "vannes mélange") +MAKE_PSTR_LIST(pvEnable, "pvenable", "enable PV", "aktiviere PV", "", "", "", "", "") MAKE_PSTR_LIST(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Heizanghebung mit PV", "", "", "", "", "") MAKE_PSTR_LIST(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "", "", "", "", "") From 78ae4d7a7dbb2ab76a12677b2257a87ac6d39467 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 3 Jan 2023 08:40:02 +0100 Subject: [PATCH 23/24] typo, rename from #787, mark missing translations, add #883 --- src/device_library.h | 4 +- src/devices/boiler.cpp | 31 +++--- src/devices/boiler.h | 2 + src/devices/thermostat.cpp | 10 +- src/devices/thermostat.h | 4 +- src/locale_common.h | 2 +- src/locale_translations.h | 152 ++++++++++++++-------------- src/web/WebCustomizationService.cpp | 4 +- 8 files changed, 108 insertions(+), 101 deletions(-) diff --git a/src/device_library.h b/src/device_library.h index 9a0c9ba65..85f493489 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -30,7 +30,7 @@ { 84, DeviceType::BOILER, "Logamax Plus GB022", DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 95, DeviceType::BOILER, "Condens 2500/Logamax/Logomatic/Cerapur Top/Greenstar/Generic HT3", DeviceFlags::EMS_DEVICE_FLAG_HT3}, {115, DeviceType::BOILER, "Topline/GB162", DeviceFlags::EMS_DEVICE_FLAG_NONE}, -{121, DeviceType::BOILER, "Cascade MC40", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{121, DeviceType::BOILER, "Cascade MCM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {122, DeviceType::BOILER, "Proline", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {123, DeviceType::BOILER, "GBx72/Trendline/Cerapur/Greenstar Si/27i", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {131, DeviceType::BOILER, "GB212", DeviceFlags::EMS_DEVICE_FLAG_NONE}, @@ -57,6 +57,7 @@ { 89, DeviceType::CONTROLLER, "BC10 GB142", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 { 95, DeviceType::CONTROLLER, "HT3", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {114, DeviceType::CONTROLLER, "BC10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 +{121, DeviceType::CONTROLLER, "MCM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {125, DeviceType::CONTROLLER, "BC25", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {152, DeviceType::CONTROLLER, "Controller", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {168, DeviceType::CONTROLLER, "Hybrid Heatpump", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 @@ -68,7 +69,6 @@ {209, DeviceType::CONTROLLER, "ErP", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {218, DeviceType::CONTROLLER, "M200/RFM200", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x50 {220, DeviceType::CONTROLLER, "BC30", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x16 -{121, DeviceType::CONTROLLER, "MC40", DeviceFlags::EMS_DEVICE_FLAG_NONE}, {224, DeviceType::CONTROLLER, "9000i", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {229, DeviceType::CONTROLLER, "8700i", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {230, DeviceType::CONTROLLER, "BC Base", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 174c8fbcd..1614b7824 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -26,7 +26,6 @@ uuid::log::Logger Boiler::logger_{F_(boiler), uuid::log::Facility::CONSOLE}; Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { - // register values for master boiler/cascade module // reserve_telegram_functions(25); // reserve some space for the telegram registries, to avoid memory fragmentation @@ -444,18 +443,8 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(maxHeatHeat), DeviceValueUOM::NONE, MAKE_CF_CB(set_maxHeatHeat)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &manDefrost_, - DeviceValueType::BOOL, - FL_(manDefrost), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_manDefrost)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &pvCooling_, - DeviceValueType::BOOL, - FL_(pvCooling), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_pvCooling)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &manDefrost_, DeviceValueType::BOOL, FL_(manDefrost), DeviceValueUOM::NONE, MAKE_CF_CB(set_manDefrost)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pvCooling_, DeviceValueType::BOOL, FL_(pvCooling), DeviceValueUOM::NONE, MAKE_CF_CB(set_pvCooling)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &maxHeatDhw_, DeviceValueType::ENUM, @@ -591,6 +580,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_wwEcoPlusOffTemp), 48, 63); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &hpCircPumpWw_, + DeviceValueType::BOOL, + FL_(hpCircPumpWw), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_hpCircPumpWw)); } // dhw - DEVICE_DATA_ww topic @@ -1418,6 +1413,7 @@ void Boiler::process_HpSilentMode(std::shared_ptr telegram) { has_update(telegram, hpHystHeat_, 37); // is / 5 has_update(telegram, hpHystCool_, 35); // is / 5, maybe offset swapped with pool has_update(telegram, hpHystPool_, 33); // is / 5 + has_update(telegram, hpCircPumpWw_, 46); } // Boiler(0x08) -B-> All(0x00), ?(0x0488), data: 8E 00 00 00 00 00 01 03 @@ -2345,4 +2341,13 @@ bool Boiler::set_wwOffTemp(const char * value, const int8_t id) { return false; } +bool Boiler::set_hpCircPumpWw(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x484, 46, v ? 1 : 0, 0x484); + return true; + } + return false; +} + } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 7776afa31..9a3451ef0 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -229,6 +229,7 @@ class Boiler : public EMSdevice { uint16_t hpHystPool_; uint8_t tempDiffHeat_; uint8_t tempDiffCool_; + uint8_t hpCircPumpWw_; uint8_t wwComfOffTemp_; uint8_t wwEcoOffTemp_; @@ -365,6 +366,7 @@ class Boiler : public EMSdevice { bool set_auxMaxTemp(const char * value, const int8_t id); bool set_manDefrost(const char * value, const int8_t id); bool set_pvCooling(const char * value, const int8_t id); + bool set_hpCircPumpWw(const char * value, const int8_t id); bool set_hpHyst(const char * value, const int8_t id); inline bool set_hpHystHeat(const char * value, const int8_t id) { diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index f1b38d10d..d929ea12e 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -887,7 +887,7 @@ void Thermostat::process_HybridSettings(std::shared_ptr telegram // 0x23E PV settings void Thermostat::process_PVSettings(std::shared_ptr telegram) { has_update(telegram, pvRaiseHeat_, 0); - has_update(telegram, pvEnable_, 3); + has_update(telegram, pvEnableWw_, 3); has_update(telegram, pvLowerCool_, 5); } @@ -1511,7 +1511,7 @@ bool Thermostat::set_tempDiffBoiler(const char * value, const int8_t id) { return true; } -bool Thermostat::set_pvEnable(const char * value, const int8_t id) { +bool Thermostat::set_pvEnableWw(const char * value, const int8_t id) { bool v; if (Helpers::value2bool(value, v)) { write_command(0x23E, 3, v ? 0xFF : 0, 0x23E); @@ -3572,11 +3572,11 @@ void Thermostat::register_device_values() { 1, 99); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &pvEnable_, + &pvEnableWw_, DeviceValueType::BOOL, - FL_(pvEnable), + FL_(pvEnableWw), DeviceValueUOM::NONE, - MAKE_CF_CB(set_pvEnable)); + MAKE_CF_CB(set_pvEnableWw)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pvRaiseHeat_, DeviceValueType::INT, diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 1ad4d6a1d..3b7217393 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -237,7 +237,7 @@ class Thermostat : public EMSdevice { uint8_t tempDiffBoiler_; // relative temperature degrees // PV - uint8_t pvEnable_; + uint8_t pvEnableWw_; uint8_t pvRaiseHeat_; uint8_t pvLowerCool_; @@ -498,7 +498,7 @@ class Thermostat : public EMSdevice { bool set_tempDiffBoiler(const char * value, const int8_t id); bool set_roomsensor(const char * value, const int8_t id); - bool set_pvEnable(const char * value, const int8_t id); + bool set_pvEnableWw(const char * value, const int8_t id); bool set_pvRaiseHeat(const char * value, const int8_t id); bool set_pvLowerCool(const char * value, const int8_t id); diff --git a/src/locale_common.h b/src/locale_common.h index e2068f04e..142f354bd 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -327,7 +327,7 @@ MAKE_PSTR_ENUM(enum_vr2Config, FL_(off), FL_(bypass)) MAKE_PSTR_ENUM(enum_aPumpSignal, FL_(off), FL_(pwm), FL_(pwm_invers)) MAKE_PSTR_ENUM(enum_bufBypass, FL_(no), FL_(mixer), FL_(valve)) MAKE_PSTR_ENUM(enum_blockMode, FL_(off), FL_(auto), FL_(blocking)) -MAKE_PSTR_ENUM(enum_bufConfig, FL_(monovalent), FL_(bivalent)) +MAKE_PSTR_ENUM(enum_bufConfig, FL_(off), FL_(monovalent), FL_(bivalent)) MAKE_PSTR_ENUM(enum_blockTerm, FL_(n_o), FL_(n_c)) #pragma GCC diagnostic pop diff --git a/src/locale_translations.h b/src/locale_translations.h index 4653bd31f..e993b4296 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -141,8 +141,8 @@ MAKE_PSTR_LIST(blocking, "blocking", "Blockierung", "Blokkering", "Blockering", MAKE_PSTR_LIST(extern, "extern", "extern", "extern", "extern", "zewnętrzny", "ekstern", "externe") MAKE_PSTR_LIST(intern, "intern", "intern", "intern", "intern", "wewnętrzny", "intern", "interne") MAKE_PSTR_LIST(lower, "lower", "niedirger", "lager", "lägre", "mniejszy", "nedre", "inférieur") -MAKE_PSTR_LIST(error, "error", "Fehler", "error", "error", "błąd", "", "erreur") -MAKE_PSTR_LIST(na, "n/a", "n/a", "n/a", "n/a", "nd.", "", "n/c") +MAKE_PSTR_LIST(error, "error", "Fehler", "error", "error", "błąd", "", "erreur") // TODO translate +MAKE_PSTR_LIST(na, "n/a", "n/a", "n/a", "n/a", "nd.", "", "n/c") // TODO translate // boiler MAKE_PSTR_LIST(time, "time", "Zeit", "Tijd", "Tid", "godzina", "tid", "heure") @@ -157,8 +157,8 @@ MAKE_PSTR_LIST(intelligent, "intelligent", "Intelligent", "Intelligent", "Intell MAKE_PSTR_LIST(flow, "flow", "Durchfluss", "Volumestroom", "Flöde", "przepływ", "strømme", "débit") MAKE_PSTR_LIST(manual, "manual", "Manuell", "Hamdmatig", "Manuell", "ręczny", "manuell", "manuel") MAKE_PSTR_LIST(buffer, "buffer", "Speicher", "Buffer", "Buffert", "bufor", "buffer", "buffer") -MAKE_PSTR_LIST(bufferedflow, "buffered flow", "Durchlaufspeicher", "Doorstroombuffer", "Buffertflöde", "przepływ buforowany", "bufret strømning", "") -MAKE_PSTR_LIST(layeredbuffer, "layered buffer", "Schichtspeicher", "Gelaagde buffer", "Lagrad buffert", "bufor warstwowy", "lagdelt buffer", "") +MAKE_PSTR_LIST(bufferedflow, "buffered flow", "Durchlaufspeicher", "Doorstroombuffer", "Buffertflöde", "przepływ buforowany", "bufret strømning", "") // TODO translate +MAKE_PSTR_LIST(layeredbuffer, "layered buffer", "Schichtspeicher", "Gelaagde buffer", "Lagrad buffert", "bufor warstwowy", "lagdelt buffer", "") // TODO translate MAKE_PSTR_LIST(maintenance, "maintenance", "Wartung", "Onderhoud", "Underhåll", "przegląd", "vedlikehold", "maintenance") MAKE_PSTR_LIST(heating, "heating", "Heizen", "Verwarmen", "Uppvärmning", "ogrzewanie", "oppvarming", "chauffage") MAKE_PSTR_LIST(cooling, "cooling", "Kühlen", "Koelen", "Kyler", "chłodzenie", "kjøling", "refroidissement") @@ -171,13 +171,13 @@ MAKE_PSTR_LIST(valve, "valve", "Ventil", "Klep", "Ventil", "zawór", "ventil", " MAKE_PSTR_LIST(none, "none", "keine", "geen", "ingen", "brak", "ingen", "aucun") MAKE_PSTR_LIST(hot_water, "hot water", "Warmwasser", "warm water", "varmvatten", "c.w.u.", "varmtvann", "eau chaude") MAKE_PSTR_LIST(pool, "pool", "Pool", "zwembad", "pool", "basen", "basseng", "piscine") -MAKE_PSTR_LIST(outside_temp_alt, "outside temperature alt.", "Außentemp. alternativ", "", "", "temp. zewn. alternat.", "", "température extérieure alternative") -MAKE_PSTR_LIST(outside_temp_par, "outside temperature parallel", "Außentemp. parallel", "", "", "temp. zewn. równoległa", "", "température extérieure parallèle") -MAKE_PSTR_LIST(hp_prefered, "heatpump prefered", "Wärmepumpe bevorzugt", "", "", "preferowana pompa ciepła", "", "pompe à chaleur préférée") -MAKE_PSTR_LIST(boiler_only, "boiler only", "nur Kessel", "", "", "tylko kocioł", "", "chaudière uniquement") -MAKE_PSTR_LIST(reduced_output, "reduced output", "Reduzierte Leistung", "", "", "zmniejszona wydajność", "", "sortie réduite") -MAKE_PSTR_LIST(switchoff, "switch off hp", "WP ausschalten", "", "", "wyłącz pompę ciepła", "", "éteindre la PAC") -MAKE_PSTR_LIST(perm, "perm. reduced", "perm. reduziert", "", "", "stale zmniejszona wydajność", "", "réduction permanente") +MAKE_PSTR_LIST(outside_temp_alt, "outside temperature alt.", "Außentemp. alternativ", "", "", "temp. zewn. alternat.", "", "température extérieure alternative") // TODO translate +MAKE_PSTR_LIST(outside_temp_par, "outside temperature parallel", "Außentemp. parallel", "", "", "temp. zewn. równoległa", "", "température extérieure parallèle") // TODO translate +MAKE_PSTR_LIST(hp_prefered, "heatpump prefered", "Wärmepumpe bevorzugt", "", "", "preferowana pompa ciepła", "", "pompe à chaleur préférée") // TODO translate +MAKE_PSTR_LIST(boiler_only, "boiler only", "nur Kessel", "", "", "tylko kocioł", "", "chaudière uniquement") // TODO translate +MAKE_PSTR_LIST(reduced_output, "reduced output", "Reduzierte Leistung", "", "", "zmniejszona wydajność", "", "sortie réduite") // TODO translate +MAKE_PSTR_LIST(switchoff, "switch off hp", "WP ausschalten", "", "", "wyłącz pompę ciepła", "", "éteindre la PAC") // TODO translate +MAKE_PSTR_LIST(perm, "perm. reduced", "perm. reduziert", "", "", "stale zmniejszona wydajność", "", "réduction permanente") // TODO translate // thermostat MAKE_PSTR_LIST(seltemp, "selTemp", "Solltemperatur", "Doeltemperatuur", "Börtemperatur", "temperatura zadana", "innstilt temperatur", "consigne température") @@ -196,7 +196,7 @@ MAKE_PSTR_LIST(german, "german", "Deutsch", "Duits", "Tyska", "niemiecki", "tysk MAKE_PSTR_LIST(dutch, "dutch", "Niederländisch", "Nederlands", "Nederländska", "niderlandzki", "nederlandsk", "néerlandais") MAKE_PSTR_LIST(french, "french", "Französisch", "Frans", "Franska", "francuski", "fransk", "français") MAKE_PSTR_LIST(italian, "italian", "Italienisch", "Italiaans", "Italienska", "włoski", "italiensk", "italien") -MAKE_PSTR_LIST(high, "high", "hoch", "hoog", "Hög", "wysoki", "", "haut") +MAKE_PSTR_LIST(high, "high", "hoch", "hoog", "Hög", "wysoki", "", "haut") // TODO translate MAKE_PSTR_LIST(low, "low", "niedrig", "laag", "Låg", "niski", "lav", "bas") MAKE_PSTR_LIST(radiator, "radiator", "Heizkörper", "Radiator", "Radiator", "grzejniki", "radiator", "radiateur") MAKE_PSTR_LIST(convector, "convector", "Konvektor", "Convector", "Konvektor", "konwektory", "konvektor", "convecteur") @@ -204,7 +204,7 @@ MAKE_PSTR_LIST(floor, "floor", "Fussboden", "Vloer", "Golv", "podłoga", "gulv", MAKE_PSTR_LIST(summer, "summer", "Sommer", "Zomer", "Sommar", "lato", "sommer", "été") MAKE_PSTR_LIST(winter, "winter", "Winter", "Winter", "Vinter", "zima", "vinter", "hiver") MAKE_PSTR_LIST(outdoor, "outdoor", "Außen", "Buiten", "Utomhus", "temp. zewnętrzna", "utendørs", "extérieur") -MAKE_PSTR_LIST(room, "room", "Raum", "Kamer", "Rum", "temp. w pomieszczeniu", "", "pièce") +MAKE_PSTR_LIST(room, "room", "Raum", "Kamer", "Rum", "temp. w pomieszczeniu", "", "pièce") // TODO translate MAKE_PSTR_LIST(room_outdoor, "room outdoor", "Raum+Außen", "Kamer+Buiten", "Rum+Ute", "temp. w pom. i zewn.", "rom utendørs", "pièce extérieure") MAKE_PSTR_LIST(power, "power", "Leistung", "Vermogen", "Effekt", "moc", "effekt", "puissance") MAKE_PSTR_LIST(constant, "constant", "konstant", "constant", "Konstant", "stały", "konstant", "constant") @@ -279,8 +279,8 @@ MAKE_PSTR_LIST(burnMinPower, "burnminpower", "burner min power", "minimale Brenn MAKE_PSTR_LIST(burnMaxPower, "burnmaxpower", "burner max power", "maximale Brennerleistung", "Maximaal brandervermogen", "Värmepanna Max Effekt", "maksymalna moc źródła ciepła", "varmekjele maks effekt", "puissance max brûleur") MAKE_PSTR_LIST(boilHystOn, "boilhyston", "hysteresis on temperature", "Einschaltdifferenz", "ketel aan hysterese verschil", "Hysteres aktiveringstemperatur", "histereza załączania", "hysterese på temperatur", "hysteresis température d'allumage") MAKE_PSTR_LIST(boilHystOff, "boilhystoff", "hysteresis off temperature", "Ausschaltdifferenz", "ketel uit hysterese verschil", "Hysteres inaktiveringstemperatur", "histereza wyłączania", "hysterese av temperatur", "hysteresis température d'extinction") -MAKE_PSTR_LIST(boil2HystOn, "boil2hyston", "hysteresis stage 2 on temperature", "Einschaltdifferenz Stufe 2", "ketel aan hysterese verschil 2", "Hysteres aktiveringstemperatur 2", "histereza załączania stopnia 2", "", "hysteresis état 2 température d'allumage") -MAKE_PSTR_LIST(boil2HystOff, "boil2hystoff", "hysteresis stage 2 off temperature", "Ausschaltdifferenz Stufe 2", "ketel uit hysterese verschil 2", "Hysteres inaktiveringstemperatur 2", "histereza wyłączania stopnia 2", "", "hysteresis état 2 température d'extinction") +MAKE_PSTR_LIST(boil2HystOn, "boil2hyston", "hysteresis stage 2 on temperature", "Einschaltdifferenz Stufe 2", "ketel aan hysterese verschil 2", "Hysteres aktiveringstemperatur 2", "histereza załączania stopnia 2", "", "hysteresis état 2 température d'allumage") // TODO translate +MAKE_PSTR_LIST(boil2HystOff, "boil2hystoff", "hysteresis stage 2 off temperature", "Ausschaltdifferenz Stufe 2", "ketel uit hysterese verschil 2", "Hysteres inaktiveringstemperatur 2", "histereza wyłączania stopnia 2", "", "hysteresis état 2 température d'extinction") // TODO translate MAKE_PSTR_LIST(setFlowTemp, "setflowtemp", "set flow temperature", "Sollwert Vorlauftemperatur", "Ingestelde aanvoertemperatuur", "Börvärde Flödestemperatur", "zadana temperatura zasilania", "innstilt strømmetemperatur", "température du flux définie") MAKE_PSTR_LIST(setBurnPow, "setburnpow", "burner set power", "Sollwert Brennerleistung", "Ingesteld brandervermogen", "Värmepanna vald Effekt", "zadana moc palnika", "varmekjele valgt effekt", "puissance du brûleur définie") MAKE_PSTR_LIST(curBurnPow, "curburnpow", "burner current power", "Brennerleistung", "Brandervermogen", "Värmepanna aktuell effekt", "aktualna moc źródła ciepła", "brennereffekt", "puissance du brûleur actuelle") @@ -288,7 +288,7 @@ MAKE_PSTR_LIST(burnStarts, "burnstarts", "burner starts", "Brenner Starts", "Aan MAKE_PSTR_LIST(burnWorkMin, "burnworkmin", "total burner operating time", "Brenner Laufzeit", "Totale branderlooptijd", "Värmepanna aktiva timmar", "łączny czas pracy palnika", "brennersteg tid i min", "durée de fonctionnement totale du brûleur") MAKE_PSTR_LIST(burn2WorkMin, "burn2workmin", "burner stage 2 operating time", "Brenner Stufe 2 Laufzeit", "Totale looptijd brander fase 2", "Värmepanna steg 2 aktiva timmar", "łączny czas pracy palnika 2 stopnia", "brennersteg2 tid i min", "durée de fonctionnement totale du brûleur état 2") MAKE_PSTR_LIST(heatWorkMin, "heatworkmin", "total heat operating time", "Heizung Laufzeit", "Totale looptijd verwarming", "Uppvärmning aktiva timmar", "łączny czas grzania", "varmetid i min", "durée de fonctionnement du chauffage") -MAKE_PSTR_LIST(heatStarts, "heatstarts", "burner starts heating", "Brenner Starts Heizung", "Aantal brander starts verwarming", "Uppvärmning antal starter", "liczba uruchomień palnika na ogrzewanie", "", "démarrages du chauffage") +MAKE_PSTR_LIST(heatStarts, "heatstarts", "burner starts heating", "Brenner Starts Heizung", "Aantal brander starts verwarming", "Uppvärmning antal starter", "liczba uruchomień palnika na ogrzewanie", "", "démarrages du chauffage") // TODO translate MAKE_PSTR_LIST(UBAuptime, "ubauptime", "total UBA operating time", "Anlagen-Gesamtlaufzeit", "totale looptijd branderautomaat (UBA)", "Total Tid", "łączny czas pracy układu sterowania", "totaltid", "durée de fonctionnement totale de l'appareil (UBA)") MAKE_PSTR_LIST(lastCode, "lastcode", "last error code", "Letzter Fehler", "Laatste foutcode", "Senaste Felkod", "ostatni błąd", "siste feilkode", "dernier code d'erreur") MAKE_PSTR_LIST(serviceCode, "servicecode", "service code", "Statusmeldung", "Statuscode", "Servicekod", "kod serwisowy", "servicekode", "code de service") @@ -301,8 +301,8 @@ MAKE_PSTR_LIST(emergencyOps, "emergencyops", "emergency operation", "Notoperatio MAKE_PSTR_LIST(emergencyTemp, "emergencytemp", "emergency temperature", "Nottemperatur", "Noodtemperatuur", "Nöddrift temperatur", "temperatura w trybie awaryjnym", "nødtemperatur", "température d'urgence") // heatpump/compress specific -MAKE_PSTR_LIST(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "", "durée totale de fonctionnement chauffage") -MAKE_PSTR_LIST(upTimeCompHeating, "uptimecompheating", "operating time compressor heating", "Betriebszeit Kompressor heizen", "Bedrijfstijd compressor verwarmingsbedrijf", "Total tid kompressor uppvärmning", "łączny czas ogrzewania (sprężarka)", "", "durée de fonctionnement compresseur chauffage") +MAKE_PSTR_LIST(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "", "durée totale de fonctionnement chauffage") // TODO translate +MAKE_PSTR_LIST(upTimeCompHeating, "uptimecompheating", "operating time compressor heating", "Betriebszeit Kompressor heizen", "Bedrijfstijd compressor verwarmingsbedrijf", "Total tid kompressor uppvärmning", "łączny czas ogrzewania (sprężarka)", "", "durée de fonctionnement compresseur chauffage") // TODO translate MAKE_PSTR_LIST(upTimeCompCooling, "uptimecompcooling", "operating time compressor cooling", "Betriebszeit Kompressor kühlen", "Bedrijfstijd compressor koelbedrijf", "Total tid kompressor kyla", "łączny czas chłodzenia (sprężarka)", "Total tid kompressor kjøling", "durée de fonctionnement compresseur refroidissement") MAKE_PSTR_LIST(upTimeCompWw, "uptimecompww", "operating time compressor dhw", "Betriebszeit Kompressor", "Bedrijfstijd compressor warmwaterbedrijf", "Total tid kompressor varmvatten", "łączny czas grzania c.w.u. (sprężarka)", "Total tid kompressor varmtvann", "durée de fonctionnement compresseur ecs") MAKE_PSTR_LIST(upTimeCompPool, "uptimecomppool", "operating time compressor pool", "Betriebszeit Kompressor Pool", "Bedrijfstijd compressor voor zwembadbedrijf", "Total tid kompressor pool", "łączny czas podgrzewania basenu (sprężarka)", "Total tid kompressor basseng", "durée de fonctionnement compresseur piscine") @@ -324,7 +324,7 @@ MAKE_PSTR_LIST(nrgSuppPool, "nrgsupppool", "total energy supplied pool", "gesamt MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, "auxelecheatnrgconstotal", "total auxiliary electrical heater energy consumption", "Energieverbrauch el. Zusatzheizung", "Totaal energieverbruik electrisch verwarmingselement", "Energiförbrukning Eltillkott", "energia pobrana przez grzałki", "energiforbruk varmekolbe", "consommation totale énergie electrique auxiliaire chauffage") MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, "auxelecheatnrgconsheating", "auxiliary electrical heater energy consumption heating", "Energieverbrauch el. Zusatzheizung Heizen", "Energieverbruik electrisch verwarmingselement voor verwarmingsbedrijf", "Energiförbrukning Eltillskott Uppvärmning", "energia pobrana przez grzałki na ogrzewanie", "energiforbruk varmekolbe oppvarming", "consommation énergie electrique auxiliaire chauffage") MAKE_PSTR_LIST(auxElecHeatNrgConsWW, "auxelecheatnrgconsww", "auxiliary electrical heater energy consumption dhw", "Energieverbrauch el. Zusatzheizung", "Energieverbruik electrisch verwarmingselement voor warmwaterbedrijf", "Energiförbrukning Eltillskott Varmvatten", "energia pobrana przez grzałki na c.w.u.", "energiförbruk varmekolbe varmvann", "consommation énergie electrique auxiliaire chauffage ecs") -MAKE_PSTR_LIST(auxElecHeatNrgConsPool, "auxelecheatnrgconspool", "auxiliary electrical heater energy consumption pool", "Energieverbrauch el. Zusatzheizung Pool", "Energieverbruik electrisch verwarmingselement voor zwembadbedrijf", "Energiförbrukning Eltillskott Pool", "energia pobrana przez grzałki na podgrzewanie basenu", "", "consommation énergie electrique auxiliaire chauffage piscine") +MAKE_PSTR_LIST(auxElecHeatNrgConsPool, "auxelecheatnrgconspool", "auxiliary electrical heater energy consumption pool", "Energieverbrauch el. Zusatzheizung Pool", "Energieverbruik electrisch verwarmingselement voor zwembadbedrijf", "Energiförbrukning Eltillskott Pool", "energia pobrana przez grzałki na podgrzewanie basenu", "", "consommation énergie electrique auxiliaire chauffage piscine") // TODO translate MAKE_PSTR_LIST(hpCompOn, "hpcompon", "hp compressor", "WP Kompressor", "WP compressor", "VP Kompressor", "sprężarka pompy ciepła", "vp kompressor", "compresseur pompe à chaleur") MAKE_PSTR_LIST(hpHeatingOn, "hpheatingon", "hp heating", "WP Heizen", "WP verwarmingsbedrijf", "VP Uppvärmning", "pompa ciepła, ogrzewanie", "vp oppvarmning", "chauffe pompe à chaleur") @@ -337,7 +337,7 @@ MAKE_PSTR_LIST(hpCircSpd, "hpcircspd", "circulation pump speed", "Zirkulationspu MAKE_PSTR_LIST(hpBrineIn, "hpbrinein", "brine in/evaporator", "Sole in/Verdampfer", "pekel in/verdamper", "Brine in (förangare)", "temperatura glikolu na wejściu kolektora (TB0)", "brine in/fordamper", "entrée saumure/évaporateur") MAKE_PSTR_LIST(hpBrineOut, "hpbrineout", "brine out/condenser", "Sole aus/Kondensator", "pekel uit/condensor", "Brine ut (kondensor)", "temperatura glikolu na wyjściu kolektora (TB1)", "Brine ut/kondensor", "sortie saumure/condenseur") MAKE_PSTR_LIST(hpSwitchValve, "hpswitchvalve", "switch valve", "Schaltventil", "schakelklep", "Växelventil", "zawór przełączający", "skifteventil", "valve de commutation") -MAKE_PSTR_LIST(hpActivity, "hpactivity", "compressor activity", "Kompressoraktivität", "Compressoractiviteit", "Kompressoraktivitet", "pompa ciepła, aktywność sprężarki", "", "activité du compresseur") +MAKE_PSTR_LIST(hpActivity, "hpactivity", "compressor activity", "Kompressoraktivität", "Compressoractiviteit", "Kompressoraktivitet", "pompa ciepła, aktywność sprężarki", "", "activité du compresseur") // TODO translate MAKE_PSTR_LIST(hpPower, "hppower", "compressor power output", "Kompressorleistung", "Compressorvermogen", "Kompressoreffekt", "moc wyjściowa sprężarki", "kompressoreffekt", "puissance de sortie compresseur") MAKE_PSTR_LIST(hpTc0, "hptc0", "heat carrier return (TC0)", "Kältemittel Rücklauf (TC0)", "Koudemiddel retour (TC0)", "Värmebärare Retur (TC0)", "temperatura nośnika ciepła na powrocie (TC0)", "kjølemiddel retur (TC0)", "retour caloporteur (TC0)") @@ -366,29 +366,29 @@ MAKE_PSTR_LIST(maxHeatComp, "maxheatcomp", "heat limit compressor", "Heizgrenze MAKE_PSTR_LIST(maxHeatHeat, "maxheatheat", "heat limit heating", "Heizgrenze Heizen", "heat limit heating", "heat limit heating", "ograniczenie mocy w trybie ogrzewania", "maks varmegrense oppvarming", "limite chaleur chauffage") MAKE_PSTR_LIST(maxHeatDhw, "maxheatdhw", "heat limit dhw", "Heizgrenze Warmwasser", "heat limit dhw", "heat limit dhw", "ograniczenie mocy w trybie c.w.u.", "varmegrense varmtvann", "limite chaleur ecs") -MAKE_PSTR_LIST(auxHeaterOff, "auxheateroff", "disable auxilliary heater", "Verbiete Zusatzheizer", "Bijverwarming uitsc", "Blockera eltillskott", "wyłącz dogrzewacz", "", "Désactiver chauff. d'app") -MAKE_PSTR_LIST(auxHeaterStatus, "auxheaterstatus", "auxilliary heater status", "Status Zusatzheizer", "Bijverwarming", "Eltillskott Status", "status dogrzewacza", "", "Chauffage auxiliaire") -MAKE_PSTR_LIST(auxHeaterOnly, "auxheateronly", "auxilliary heater only", "nur Zusatzheizer","Alleen bijverwarming", "Eltillskott Enbart", "tylko dogrzewacz", "", "Que chauffage auxiliaire") +MAKE_PSTR_LIST(auxHeaterOff, "auxheateroff", "disable auxilliary heater", "Verbiete Zusatzheizer", "Bijverwarming uitsc", "Blockera eltillskott", "wyłącz dogrzewacz", "", "Désactiver chauff. d'app") // TODO translate +MAKE_PSTR_LIST(auxHeaterStatus, "auxheaterstatus", "auxilliary heater status", "Status Zusatzheizer", "Bijverwarming", "Eltillskott Status", "status dogrzewacza", "", "Chauffage auxiliaire") // TODO translate +MAKE_PSTR_LIST(auxHeaterOnly, "auxheateronly", "auxilliary heater only", "nur Zusatzheizer","Alleen bijverwarming", "Eltillskott Enbart", "tylko dogrzewacz", "", "Que chauffage auxiliaire") // TODO translate MAKE_PSTR_LIST(auxHeaterDelay, "auxheaterdelay", "auxilliary heater on delay", "Zusatzheizer verzögert ein", "Bijverw. vertraagd aan", "Eltillskottfördröjning på", "opóźnienie włączania dogrzewacza", "Tilleggsvarmer forsinket på", "Chauff app tempo marche") -MAKE_PSTR_LIST(silentMode, "silentmode", "silent mode", "Silentmodus", " Stiller gebruik", "Tyst läge", "trybu cichego", "", "Fct silencieux") -MAKE_PSTR_LIST(minTempSilent, "mintempsilent", "min. outside temp. for silent mode", "Minimale Aussentemperatur Silentmodus", " Stiller gebruik min. buitentemp", "Tyst läge min temp", "minimalna temperatura zewnętrzna dla trybu cichego", "", "Fct silencieux: Temp. extérieure min.") -MAKE_PSTR_LIST(tempParMode, "tempparmode", "outside temp. parallel mode", "Aussentemperatur Parallelmodus", "Buitentemp. parallelbedr", "Parallelläge Utomhustemp.", "maksymalna temperatura zewnętrzna dla dogrzewacza", "", "Temp. ext. fct parallèle") -MAKE_PSTR_LIST(auxHeatMixValve, "auxheatmix", "aux. heater mixing valve", "Mischer Zusatzheizer", "Bijverwarming menger", "Eltilskott Blandarventil", "mieszacz dogrzewacza", "", "Chauffage auxiliaire mélangeur") +MAKE_PSTR_LIST(silentMode, "silentmode", "silent mode", "Silentmodus", " Stiller gebruik", "Tyst läge", "trybu cichego", "", "Fct silencieux") // TODO translate +MAKE_PSTR_LIST(minTempSilent, "mintempsilent", "min. outside temp. for silent mode", "Minimale Aussentemperatur Silentmodus", " Stiller gebruik min. buitentemp", "Tyst läge min temp", "minimalna temperatura zewnętrzna dla trybu cichego", "", "Fct silencieux: Temp. extérieure min.") // TODO translate +MAKE_PSTR_LIST(tempParMode, "tempparmode", "outside temp. parallel mode", "Aussentemperatur Parallelmodus", "Buitentemp. parallelbedr", "Parallelläge Utomhustemp.", "maksymalna temperatura zewnętrzna dla dogrzewacza", "", "Temp. ext. fct parallèle") // TODO translate +MAKE_PSTR_LIST(auxHeatMixValve, "auxheatmix", "aux. heater mixing valve", "Mischer Zusatzheizer", "Bijverwarming menger", "Eltilskott Blandarventil", "mieszacz dogrzewacza", "", "Chauffage auxiliaire mélangeur") // TODO translate MAKE_PSTR_LIST(hpHystHeat, "hphystheat", "on/off hyst heat", "Schalthysterese Heizen", "Aan/uit-hysteresis in verw. bedrijf", "Hstereses Uppvärm.", "histereza wł./wył. ogrzewania", "På/av-hysterese Oppvar.", "Hystérésis Marche en mode chauffage") -MAKE_PSTR_LIST(hpHystCool, "hphystcool", "on/off hyst cool", "Schalthysterese Kühlen", "Aan/uit-hysteresis in koelbedrijf ", "Hystereses Kyla", "histereza wł./wył. chłodzenia", "", "Hystérésis Marche en mode refroidissement") -MAKE_PSTR_LIST(hpHystPool, "hphystpool", "on/off hyst pool", "Schalthysterese Pool", "an/uit-hysteresis in zwembadbedri", "Hystereses Pool", "histereza wł./wył. podgrzewania basenu", "", "Hystérésis Marche en mode piscine") -MAKE_PSTR_LIST(tempDiffHeat, "tempdiffheat", "temp. diff. TC3/TC0 heat", "Temp.diff. TC3/TC0 Heizen", "Temp.vers. TC3/TC0 verw", "Delta(T) TC3/TC0 Uppvärm.", "różnica temperatur TC3/TC0 w trakcie ogrzewania", "", "Delta T TC3/TC0 Chauff") -MAKE_PSTR_LIST(tempDiffCool, "tempdiffcool", "temp. diff. TC3/TC0 cool", "Temp.diff. TC3/TC0 Kühlen", "Temp.vers. TC3/TC0 koel.", "Delta(T) TC3/TC0 Kyla", "różnica temperatur TC3/TC0 w trakcie chłodzenia", "", "Delta T TC3/TC0 Refroid.") +MAKE_PSTR_LIST(hpHystCool, "hphystcool", "on/off hyst cool", "Schalthysterese Kühlen", "Aan/uit-hysteresis in koelbedrijf ", "Hystereses Kyla", "histereza wł./wył. chłodzenia", "", "Hystérésis Marche en mode refroidissement") // TODO translate +MAKE_PSTR_LIST(hpHystPool, "hphystpool", "on/off hyst pool", "Schalthysterese Pool", "an/uit-hysteresis in zwembadbedri", "Hystereses Pool", "histereza wł./wył. podgrzewania basenu", "", "Hystérésis Marche en mode piscine") // TODO translate +MAKE_PSTR_LIST(tempDiffHeat, "tempdiffheat", "temp. diff. TC3/TC0 heat", "Temp.diff. TC3/TC0 Heizen", "Temp.vers. TC3/TC0 verw", "Delta(T) TC3/TC0 Uppvärm.", "różnica temperatur TC3/TC0 w trakcie ogrzewania", "", "Delta T TC3/TC0 Chauff") // TODO translate +MAKE_PSTR_LIST(tempDiffCool, "tempdiffcool", "temp. diff. TC3/TC0 cool", "Temp.diff. TC3/TC0 Kühlen", "Temp.vers. TC3/TC0 koel.", "Delta(T) TC3/TC0 Kyla", "różnica temperatur TC3/TC0 w trakcie chłodzenia", "", "Delta T TC3/TC0 Refroid.") // TODO translate -MAKE_PSTR_LIST(wwComfOffTemp, "wwcomfoff", "comfort switch off", "Komfort Ausschalttemp", "Comfort Uitschakeltemp.", "Komfortläge avstängingstemp.", "temperatura wyłączania w trybie komfort", "", "Confort Temp. d'arrêt") -MAKE_PSTR_LIST(wwEcoOffTemp, "wwecooff", "eco switch off", "ECO Ausschalttemp", "Eco Uitschakeltemp.", "Ekoläge avstängningstemp.", "temperatura wyłączania w trybie eko", "", "Eco Temp. d'arrêt") -MAKE_PSTR_LIST(wwEcoPlusOffTemp, "wwecoplusoff", "eco+ switch off", "ECO+ Ausschalttemp", "Eco+ Uitschakeltemp.", "Eko+ avstängningstemp.", "temperatura wyłączania w trybie eko+", "", "Eco+ Temp. d'arrêt") - -MAKE_PSTR_LIST(auxHeatMode, "auxheatrmode", "aux heater mode", "Modus Zusatzheizer", "", "", "", "", "") -MAKE_PSTR_LIST(auxMaxTemp, "auxmaxtemp", "aux heater max temperature", "Zusatzheizer Maximaltemp.", "", "", "", "", "") -MAKE_PSTR_LIST(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "", "", "", "", "") -MAKE_PSTR_LIST(pvCooling, "pvcooling", "Cooling only with PV", "Kühlen nur mit PV", "", "", "", "", "") +MAKE_PSTR_LIST(wwComfOffTemp, "wwcomfoff", "comfort switch off", "Komfort Ausschalttemp", "Comfort Uitschakeltemp.", "Komfortläge avstängingstemp.", "temperatura wyłączania w trybie komfort", "", "Confort Temp. d'arrêt") // TODO translate +MAKE_PSTR_LIST(wwEcoOffTemp, "wwecooff", "eco switch off", "ECO Ausschalttemp", "Eco Uitschakeltemp.", "Ekoläge avstängningstemp.", "temperatura wyłączania w trybie eko", "", "Eco Temp. d'arrêt") // TODO translate +MAKE_PSTR_LIST(wwEcoPlusOffTemp, "wwecoplusoff", "eco+ switch off", "ECO+ Ausschalttemp", "Eco+ Uitschakeltemp.", "Eko+ avstängningstemp.", "temperatura wyłączania w trybie eko+", "", "Eco+ Temp. d'arrêt") // TODO translate +MAKE_PSTR_LIST(auxHeatMode, "auxheatrmode", "aux heater mode", "Modus Zusatzheizer", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(auxMaxTemp, "auxmaxtemp", "aux heater max temperature", "Zusatzheizer Maximaltemp.", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(pvCooling, "pvcooling", "Cooling only with PV", "Kühlen nur mit PV", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(hpCircPumpWw, "hpcircpumpww", "circulation pump available during dhw", "", "", "", "", "", "") // TODO translate // hybrid heatpump MAKE_PSTR_LIST(hybridStrategy, "hybridstrategy", "hybrid control strategy", "Hybrid Strategie", "Hybride strategie", "Hybrid kontrollstrategi", "strategia sterowania hybrydowego", "hybrid kontrollstrategi", "stratégie contrôle hybride") @@ -398,31 +398,31 @@ MAKE_PSTR_LIST(fossileFactor, "fossilefactor", "fossile energy factor", "Energie MAKE_PSTR_LIST(electricFactor, "electricfactor", "electric energy factor", "Energiefaktor elektrisch", "Energiefactor electrisch", "Elektrisk energifaktor", "udział energii elektrycznej", "elektrisk energifaktor", "facteur énergie électrique") MAKE_PSTR_LIST(delayBoiler, "delayboiler", "delay boiler support", "Verzögerungs-Option", "Vertragingsoptie", "Fördröjningsoption", "opcja opóźnienia", "Fördörjningsoption", "option retardement chaudière") MAKE_PSTR_LIST(tempDiffBoiler, "tempdiffboiler", "temp diff boiler support", "Temperaturdifferenz-Option", "Verschiltemperatuuroptie", "Temperaturskillnadsoption", "opcja różnicy temperatur", "temperatursforskjell kjele", "option différence température") -MAKE_PSTR_LIST(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer Betrieb", "", "Tyst läge", "tryb cichy", "", "mode faible bruit") -MAKE_PSTR_LIST(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "", "Tyst läge starttid", "początek trybu cichego", "", "heure démarrage faible bruit") -MAKE_PSTR_LIST(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "", "Tyst läge stopptid", "koniec trybu cichego", "", "heure arrêt faible bruit") -MAKE_PSTR_LIST(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "", "Gaspris", "cena energii z gazu", "", "prix énergie gaz") -MAKE_PSTR_LIST(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "", "Elpris", "cena energii elektrycznej", "", "prix énergie électrique") -MAKE_PSTR_LIST(energyPricePV, "energyfeedpv", "feed in PV", "PV Einspeisevergütung", "", "PV Energi", "zasilanie energią fotowoltaiczną", "", "alimentation PV") -MAKE_PSTR_LIST(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid Warmwasser", "", "Hybridläge varmvatten", "hybrydowa c.w.u.", "", "ecs hybride") -MAKE_PSTR_LIST(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "", "Luftreningsläge", "tryb oczyszczania powietrza", "", "mode purge air") -MAKE_PSTR_LIST(heatPumpOutput, "heatpumpoutput", "heatpump output", "WP Leistung", "", "Värmepumpseffekt", "moc wyjściowa pompy ciepła", "", "sortie pompe à chaleur") -MAKE_PSTR_LIST(coolingCircuit, "coolingcircuit", "cooling circuit", "Kühlkreislauf", "", "Kylkrets", "obwód chłodzący", "", "circuit refroidissement") -MAKE_PSTR_LIST(compStartMod, "compstartmod", "compressor start modulation", "Kompressor Startleistung", "", "Kompressor startmodulering", "początkowa modulacja sprężarki", "", "modulation démarrage compresseur") -MAKE_PSTR_LIST(heatDrainPan, "heatdrainpan", "heat drain pan", "Wärmeausgleichsgefäß", "", "Uppvärm. dränering", "zbiornik wyrównawczy ciepła", "", "bac récupération chaleur") -MAKE_PSTR_LIST(heatCable, "heatcable", "heating cable", "Heizband", "heating cable", "värmekabel", "przewód grzejny", "", "câble chauffant") +MAKE_PSTR_LIST(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer Betrieb", "", "Tyst läge", "tryb cichy", "", "mode faible bruit") // TODO translate +MAKE_PSTR_LIST(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "", "Tyst läge starttid", "początek trybu cichego", "", "heure démarrage faible bruit") // TODO translate +MAKE_PSTR_LIST(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "", "Tyst läge stopptid", "koniec trybu cichego", "", "heure arrêt faible bruit") // TODO translate +MAKE_PSTR_LIST(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "", "Gaspris", "cena energii z gazu", "", "prix énergie gaz") // TODO translate +MAKE_PSTR_LIST(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "", "Elpris", "cena energii elektrycznej", "", "prix énergie électrique") // TODO translate +MAKE_PSTR_LIST(energyPricePV, "energyfeedpv", "feed in PV", "PV Einspeisevergütung", "", "PV Energi", "zasilanie energią fotowoltaiczną", "", "alimentation PV") // TODO translate +MAKE_PSTR_LIST(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid Warmwasser", "", "Hybridläge varmvatten", "hybrydowa c.w.u.", "", "ecs hybride") // TODO translate +MAKE_PSTR_LIST(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "", "Luftreningsläge", "tryb oczyszczania powietrza", "", "mode purge air") // TODO translate +MAKE_PSTR_LIST(heatPumpOutput, "heatpumpoutput", "heatpump output", "WP Leistung", "", "Värmepumpseffekt", "moc wyjściowa pompy ciepła", "", "sortie pompe à chaleur") // TODO translate +MAKE_PSTR_LIST(coolingCircuit, "coolingcircuit", "cooling circuit", "Kühlkreislauf", "", "Kylkrets", "obwód chłodzący", "", "circuit refroidissement") // TODO translate +MAKE_PSTR_LIST(compStartMod, "compstartmod", "compressor start modulation", "Kompressor Startleistung", "", "Kompressor startmodulering", "początkowa modulacja sprężarki", "", "modulation démarrage compresseur") // TODO translate +MAKE_PSTR_LIST(heatDrainPan, "heatdrainpan", "heat drain pan", "Wärmeausgleichsgefäß", "", "Uppvärm. dränering", "zbiornik wyrównawczy ciepła", "", "bac récupération chaleur") // TODO translate +MAKE_PSTR_LIST(heatCable, "heatcable", "heating cable", "Heizband", "heating cable", "värmekabel", "przewód grzejny", "", "câble chauffant") // TODO translate // alternative heatsource AM200 MAKE_PSTR_LIST(aCylTopTemp, "cyltoptemp", "cylinder top temperature", "Speichertemperatur Oben", "Buffer temperatuur boven", "Cylindertemperatur Toppen", "temperatura na górze cylindra", "beredertemperatur topp", "température haut cylindre") MAKE_PSTR_LIST(aCylCenterTemp, "cylcentertemp", "cylinder center temperature", "Speichertemperatur Mitte", "Buffer temperatuur midden", "Cylindertemperatur Mitten", "temperatura na środku cylindra", "beredertemperatur midten", "température centre cylindre") MAKE_PSTR_LIST(aCylBottomTemp, "cylbottomtemp", "cylinder bottom temperature", "Speichertemperatur Unten", "Buffer temperatuur onder", "Cylindertemperatur Botten", "temperatura na dole cylindra", "beredertemperatur nederst", "température fond cylindre") -MAKE_PSTR_LIST(aFlowTemp, "altflowtemp", "alternative hs flow temperature", "Alternativer WE Vorlauftemperatur", "Alternatieve warmtebron aanvoertemperatuur", "Alternativ flödestemp värmekälla", "temperatura zasilania z alternatywnego źródła", "", "température flux hs alternative") -MAKE_PSTR_LIST(aRetTemp, "altrettemp", "alternative hs return temperature", "Alternativer WE Rücklauftemperatur", "Alternatieve warmtebron retourtemperatuur", "Alternativ returtemp värmekälla", "temperatura powrotu z alternatywnego źródła", "", "température retour hs alternative") -MAKE_PSTR_LIST(sysFlowTemp, "sysflowtemp", "system flow temperature", "System Vorlauftemperatur", "Systeem aanvoertemperatuur", "Systemflödestemperatur", "temperatura zasilania systemu", "", "température flux système") -MAKE_PSTR_LIST(sysRetTemp, "sysrettemp", "system return temperature", "System Rücklauftemperatur", "Systeem retourtemperatuur", "Systemreturtemperatur", "temperatura powrotu z systemu", "", "température retour système") -MAKE_PSTR_LIST(valveByPass, "valvebypass", "bypass valve", "Bypass-Ventil", "Bypass klep", "Bypassventil", "zawór obejścia", "", "vanne dérivation") -MAKE_PSTR_LIST(valveBuffer, "valvebuffer", "buffer valve", "Puffer-Ventil", "Bufferklep", "Buffertventil", "zawór bufora", "", "vanne tampon") -MAKE_PSTR_LIST(valveReturn, "valvereturn", "return valve", "Rückfluss-Ventil", "Retourklep", "Returventil", "zawór powrotu", "", "vanne retour") +MAKE_PSTR_LIST(aFlowTemp, "altflowtemp", "alternative hs flow temperature", "Alternativer WE Vorlauftemperatur", "Alternatieve warmtebron aanvoertemperatuur", "Alternativ flödestemp värmekälla", "temperatura zasilania z alternatywnego źródła", "", "température flux hs alternative") // TODO translate +MAKE_PSTR_LIST(aRetTemp, "altrettemp", "alternative hs return temperature", "Alternativer WE Rücklauftemperatur", "Alternatieve warmtebron retourtemperatuur", "Alternativ returtemp värmekälla", "temperatura powrotu z alternatywnego źródła", "", "température retour hs alternative") // TODO translate +MAKE_PSTR_LIST(sysFlowTemp, "sysflowtemp", "system flow temperature", "System Vorlauftemperatur", "Systeem aanvoertemperatuur", "Systemflödestemperatur", "temperatura zasilania systemu", "", "température flux système") // TODO translate +MAKE_PSTR_LIST(sysRetTemp, "sysrettemp", "system return temperature", "System Rücklauftemperatur", "Systeem retourtemperatuur", "Systemreturtemperatur", "temperatura powrotu z systemu", "", "température retour système") // TODO translate +MAKE_PSTR_LIST(valveByPass, "valvebypass", "bypass valve", "Bypass-Ventil", "Bypass klep", "Bypassventil", "zawór obejścia", "", "vanne dérivation") // TODO translate +MAKE_PSTR_LIST(valveBuffer, "valvebuffer", "buffer valve", "Puffer-Ventil", "Bufferklep", "Buffertventil", "zawór bufora", "", "vanne tampon") // TODO translate +MAKE_PSTR_LIST(valveReturn, "valvereturn", "return valve", "Rückfluss-Ventil", "Retourklep", "Returventil", "zawór powrotu", "", "vanne retour") // TODO translate MAKE_PSTR_LIST(aPumpMod, "altpumpmod", "alternative hs pump modulation", "Alternativer WE Pumpenmodulation", "Alternatieve warmtebron pomp modulatie", "Alternativ Pumpmodulering Värmekälla", "modulacja pompy alternatywnego źródła ciepła", "alternativ pumpemodulering varmekilde", "modulation alternative pompe hs") MAKE_PSTR_LIST(heatSource, "heatsource", "alternative heating active", "Alternativer Wärmeerzeuger aktiv", "Alternatieve warmtebron aktief", "Alternativ Värmekälla aktiv", "aktywne alternatywne źródło ciepła", "alternativ varmekilde aktiv", "chauffage alternatif actif") @@ -457,7 +457,7 @@ MAKE_PSTR_LIST(wwFlowTempOffset, "wwflowtempoffset", "flow temperature offset", MAKE_PSTR_LIST(wwMaxPower, "wwmaxpower", "max power", "max Leistung", "Maximaal vermogen", "Max Effekt", "moc maksymalna", "maks effekt", "puissance max") MAKE_PSTR_LIST(wwCircPump, "wwcircpump", "circulation pump available", "Zirkulationspumpe vorhanden", "Circulatiepomp aanwezig", "Cirkulationspump tillgänglig", "pompa cyrkulacyjna zainstalowana", "sirkulasjonspumpe tilgjengelig", "pompe circulation disponible") MAKE_PSTR_LIST(wwChargeType, "wwchargetype", "charging type", "Speicher-Ladungstyp", "Buffer laadtype", "Laddningstyp", "sposób grzania zasobnika", "varmetype", "type chargement") -MAKE_PSTR_LIST(wwDisinfectionTemp, "wwdisinfectiontemp", "disinfection temperature", "Desinfektionstemperatur", "Desinfectietemperatuur", "Desinfektionstemperatur", "temperatura dezynfekcji termicznej", "", "température désinfection") +MAKE_PSTR_LIST(wwDisinfectionTemp, "wwdisinfectiontemp", "disinfection temperature", "Desinfektionstemperatur", "Desinfectietemperatuur", "Desinfektionstemperatur", "temperatura dezynfekcji termicznej", "", "température désinfection") // TODO translate MAKE_PSTR_LIST(wwCircMode, "wwcircmode", "circulation pump mode", "Zirkulationspumpen-Modus", "Modus circulatiepomp", "Läge Cirkulationspump", "tryb pracy cyrkulacji", "modus sikulasjonspumpe", "mode pompe circulation") MAKE_PSTR_LIST(wwCirc, "wwcirc", "circulation active", "Zirkulation aktiv", "Circulatiepomp actief", "Cirkulation aktiv", "pompa cyrkulacyjna", "sirkulasjon aktiv", "circulation active") MAKE_PSTR_LIST(wwCurTemp, "wwcurtemp", "current intern temperature", "aktuelle interne Temperatur", "Huidige interne temperatuur", "Intern Temperatur", "temperatura zasobnika", "gjeldende intern temperatur", "température interne actuelle") @@ -466,7 +466,7 @@ MAKE_PSTR_LIST(wwCurFlow, "wwcurflow", "current tap water flow", "aktueller Durc MAKE_PSTR_LIST(wwStorageTemp1, "wwstoragetemp1", "storage intern temperature", "interne Speichertemperatur", "Interne buffertemperatuur", "Beredare Intern Temperatur", "temperatura wewnątrz zasobnika", "intern temperatur bereder", "température interne stockage") MAKE_PSTR_LIST(wwStorageTemp2, "wwstoragetemp2", "storage extern temperature", "externer Speichertemperatur", "Externe buffertemperatuur", "Beredare Extern Tempereatur", "temperatura na wyjściu zasobnika", "ekstern temperatur bereder", "température externe stockage") MAKE_PSTR_LIST(wwActivated, "wwactivated", "activated", "aktiviert", "geactiveerd", "Aktiverad", "system przygotowywania c.w.u.", "aktivert", "activé") -MAKE_PSTR_LIST(wwOneTime, "wwonetime", "one time charging", "Einmalladung", "Buffer eenmalig laden", "Engångsladdning", "jednorazowa dodatkowa ciepła woda", "", "charge unique") +MAKE_PSTR_LIST(wwOneTime, "wwonetime", "one time charging", "Einmalladung", "Buffer eenmalig laden", "Engångsladdning", "jednorazowa dodatkowa ciepła woda", "", "charge unique") // TODO translate MAKE_PSTR_LIST(wwDisinfecting, "wwdisinfecting", "disinfecting", "Desinfizieren", "Desinfectie", "Desinficerar", "dezynfekcja termiczna", "desinfiserer", "désinfection") MAKE_PSTR_LIST(wwCharging, "wwcharging", "charging", "Laden", "Laden", "Värmer", "grzanie", "varmer", "chargement") MAKE_PSTR_LIST(wwChargeOptimization, "wwchargeoptimization", "charge optimization", "Ladungsoptimierung", "laadoptimalisatie", "Laddningsoptimering", "optymalizacja grzania", "oppvarmingsoptimalisering", "optimisation charge") @@ -485,7 +485,7 @@ MAKE_PSTR_LIST(wwProgMode, "wwprogmode", "program", "Programmmodus", "Programma" MAKE_PSTR_LIST(wwCircProg, "wwcircprog", "circulation program", "Zirkulationsprogramm", "Circulatieprogramma", "Cirkulationsprogram", "program cyrkulacji c.w.u.", "sirkulationsprogram", "programme circulation") MAKE_PSTR_LIST(wwMaxTemp, "wwmaxtemp", "maximum temperature", "Maximale Temperatur", "Maximale temperatuur", "Maximal Temperatur", "temperatura maksymalna", "", "température max") MAKE_PSTR_LIST(wwOneTimeKey, "wwonetimekey", "one time key function", "Einmalladungstaste", "Knop voor eenmalig laden buffer", "Engångsfunktion", "przycisk jednorazowego ogrzania", "engangsknapp varme", "fonction touche unique") -MAKE_PSTR_LIST(wwSolarTemp, "wwsolartemp", "solar boiler temperature", "Solarboiler Temperatur", "Zonneboiler temperatuur", "Solpanel Temp", "temperatura zasobnika solarnego", "", "température chaudière solaire") +MAKE_PSTR_LIST(wwSolarTemp, "wwsolartemp", "solar boiler temperature", "Solarboiler Temperatur", "Zonneboiler temperatuur", "Solpanel Temp", "temperatura zasobnika solarnego", "", "température chaudière solaire") // TODO translate // mqtt values / commands @@ -499,10 +499,10 @@ MAKE_PSTR_LIST(errorCode, "errorcode", "error code", "Fehlernummer", "Foutmeldin MAKE_PSTR_LIST(ibaMainDisplay, "display", "display", "Anzeige", "Display", "Display", "wyświetlacz", "skjerm", "affichage") MAKE_PSTR_LIST(ibaLanguage, "language", "language", "Sprache", "Taal", "Sprak", "język", "språk", "langue") MAKE_PSTR_LIST(ibaClockOffset, "clockoffset", "clock offset", "Uhrkorrektur", "Klokcorrectie", "Tidskorrigering", "korekta zegara", "tidskorrigering", "offset horloge") -MAKE_PSTR_LIST(ibaBuildingType, "building", "building type", "Gebäudetyp", "", "Byggnadstyp", "typ budynku", "bygningstype", "type bâtiment") -MAKE_PSTR_LIST(heatingPID, "heatingpid", "heating PID", "Heizungs-PID", "", "Uppvärmning PID", "PID ogrzewania", "oppvarmings PID", "PID chauffage") -MAKE_PSTR_LIST(ibaCalIntTemperature, "intoffset", "internal temperature offset", "Korrektur interner Temperatur", "", "Korrigering interntemperatur", "korekta temperatury w pomieszczeniu", "Korrigering interntemperatur", "offset température interne") -MAKE_PSTR_LIST(ibaMinExtTemperature, "minexttemp", "minimal external temperature", "min. Aussentemperatur", "", "Min Extern Temperatur", "minimalna miejscowa temperatura zewnętrzna", "minimal eksterntemperatur", "température extérieure minimale") +MAKE_PSTR_LIST(ibaBuildingType, "building", "building type", "Gebäudetyp", "", "Byggnadstyp", "typ budynku", "bygningstype", "type bâtiment") // TODO translate +MAKE_PSTR_LIST(heatingPID, "heatingpid", "heating PID", "Heizungs-PID", "", "Uppvärmning PID", "PID ogrzewania", "oppvarmings PID", "PID chauffage") // TODO translate +MAKE_PSTR_LIST(ibaCalIntTemperature, "intoffset", "internal temperature offset", "Korrektur interner Temperatur", "", "Korrigering interntemperatur", "korekta temperatury w pomieszczeniu", "Korrigering interntemperatur", "offset température interne") // TODO translate +MAKE_PSTR_LIST(ibaMinExtTemperature, "minexttemp", "minimal external temperature", "min. Aussentemperatur", "", "Min Extern Temperatur", "minimalna miejscowa temperatura zewnętrzna", "minimal eksterntemperatur", "température extérieure minimale") // TODO translate MAKE_PSTR_LIST(backlight, "backlight", "key backlight", "Gegenlicht", "Toetsverlichting", "Bakgrundsbelysning", "podświetlenie klawiatury", "bakgrunnsbelysning", "rétroéclairage touches") MAKE_PSTR_LIST(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") MAKE_PSTR_LIST(tempsensor1, "inttemp1", "temperature sensor 1", "Temperatursensor 1", "Temperatuursensor 1", "Temperatursensor 1", "czujnik temperatury 1", "temperatursensor 1", "sonde température 1") @@ -515,9 +515,9 @@ MAKE_PSTR_LIST(autodst, "autodst", "automatic change daylight saving time", "aut MAKE_PSTR_LIST(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") MAKE_PSTR_LIST(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é") MAKE_PSTR_LIST(mixingvalves, "mixingvalves", "mixing valves", "Mischventile", "Mengkleppen", "Blandningsventiler", "zawory mieszające", "blandeventiler", "vannes mélange") -MAKE_PSTR_LIST(pvEnable, "pvenable", "enable PV", "aktiviere PV", "", "", "", "", "") -MAKE_PSTR_LIST(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Heizanghebung mit PV", "", "", "", "", "") -MAKE_PSTR_LIST(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "", "", "", "", "") +MAKE_PSTR_LIST(pvEnableWw, "pvenableww", "enable raise dhw", "aktiviere Anhebung WW", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Anhebung Heizen mit PV", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "", "", "", "", "") // TODO translate // thermostat ww MAKE_PSTR_LIST(wwMode, "wwmode", "mode", "Modus", "Modus", "Läge", "tryb pracy", "modus", "mode") @@ -532,7 +532,7 @@ MAKE_PSTR_LIST(wwDisinfect, "wwdisinfect", "disinfection", "Desinfektion", "Desi MAKE_PSTR_LIST(wwDisinfectDay, "wwdisinfectday", "disinfection day", "Desinfektionstag", "Desinfectiedag", "Desinfektionsdag", "dzień dezynfekcji termicznej", "desinfeksjonsdag", "jour désinfection") MAKE_PSTR_LIST(wwDisinfectHour, "wwdisinfecthour", "disinfection hour", "Desinfektionsstunde", "Desinfectieuur", "Desinfektionstimme", "godzina dezynfekcji termicznej", "desinfeksjonstime", "heure désinfection") MAKE_PSTR_LIST(wwDisinfectTime, "wwdisinfecttime", "disinfection time", "Desinfektionsdauer", "Desinfectietijd", "Desinfektionstid", "maksymalny czas trwania dezynfekcji termicznej", "desinfeksjonstid", "durée désinfection") -MAKE_PSTR_LIST(wwDailyHeating, "wwdailyheating", "daily heating", "täglich Heizen", "Dagelijks opwarmen", "Daglig Uppvärmning", "codzienne nagrzewanie", "", "chauffage quotidien") +MAKE_PSTR_LIST(wwDailyHeating, "wwdailyheating", "daily heating", "täglich Heizen", "Dagelijks opwarmen", "Daglig Uppvärmning", "codzienne nagrzewanie", "", "chauffage quotidien") // TODO translate MAKE_PSTR_LIST(wwDailyHeatTime, "wwdailyheattime", "daily heating time", "tägliche Heizzeit", "Tijd dagelijkse opwarming", "Daglig Uppvärmningstid", "czas trwania codziennego nagrzewania", "daglig oppvarmingstid", "heure chauffage quotidien") // thermostat hc @@ -556,8 +556,8 @@ MAKE_PSTR_LIST(comforttemp, "comforttemp", "comfort temperature", "Komforttemper MAKE_PSTR_LIST(summertemp, "summertemp", "summer temperature", "Sommertemperatur", "Zomertemperatuur", "Sommartemperatur", "temperatura przełączania lato/zima", "Sommertemperatur", "température été") MAKE_PSTR_LIST(designtemp, "designtemp", "design temperature", "Auslegungstemperatur", "Ontwerptemperatuur", "Design-temperatur", "temperatura projektowa", "designtemperatur", "température conception") MAKE_PSTR_LIST(offsettemp, "offsettemp", "offset temperature", "Temperaturanhebung", "Temperatuur offset", "Temperaturkorrigering", "korekta temperatury", "temperaturkorrigering", "température offset") -MAKE_PSTR_LIST(minflowtemp, "minflowtemp", "min flow temperature", "min Vorlauftemperatur", "", "Min Flödestemperatur", "minimalna temperatura zasilania", "min turtemperatur", "température min flux") -MAKE_PSTR_LIST(maxflowtemp, "maxflowtemp", "max flow temperature", "max Vorlauftemperatur", "", "Max Flödestemperatur", "maksymalna temperatura zasilania", "maks turtemperatur", "température max flux") +MAKE_PSTR_LIST(minflowtemp, "minflowtemp", "min flow temperature", "min Vorlauftemperatur", "", "Min Flödestemperatur", "minimalna temperatura zasilania", "min turtemperatur", "température min flux") // TODO translate +MAKE_PSTR_LIST(maxflowtemp, "maxflowtemp", "max flow temperature", "max Vorlauftemperatur", "", "Max Flödestemperatur", "maksymalna temperatura zasilania", "maks turtemperatur", "température max flux") // TODO translate MAKE_PSTR_LIST(roominfluence, "roominfluence", "room influence", "Raumeinfluss", "Ruimteinvloed", "Rumspåverkan", "wpływ pomieszczenia", "rominnflytelse", "influence pièce") MAKE_PSTR_LIST(roominfl_factor, "roominflfactor", "room influence factor", "Raumeinflussfaktor", "Factor ruimteinvloed", "Rumspåverkansfaktor", "współczynnik wpływu pomieszczenia", "rominnflytelsesfaktor", "facteur d'influence pièce") MAKE_PSTR_LIST(curroominfl, "curroominfl", "current room influence", "aktueller Raumeinfluss", "Huidige ruimteinvloed", "Aktuell Rumspåverkan", "aktualny wpływ pomieszczenia", "gjeldende rominnflytelse", "influence actuelle pièce") @@ -577,7 +577,7 @@ MAKE_PSTR_LIST(holidaytemp, "holidaytemp", "holiday temperature", "Urlaubstemper MAKE_PSTR_LIST(summermode, "summermode", "summer mode", "Sommerbetrieb", "Zomerbedrijf", "Sommarläge", "aktualny tryb lato/zima", "sommermodus", "mode été") MAKE_PSTR_LIST(holidaymode, "holidaymode", "holiday mode", "Urlaubsbetrieb", "Vakantiebedrijf", "Helgläge", "tryb urlopowy", "feriemodus", "mode vacances") MAKE_PSTR_LIST(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") -MAKE_PSTR_LIST(reducemode, "reducemode", "reduce mode", "Absenkmodus", "Gereduceerde modus", "Reducerat Läge", "tryb zredukowany/obniżony", "", "mode réduction") +MAKE_PSTR_LIST(reducemode, "reducemode", "reduce mode", "Absenkmodus", "Gereduceerde modus", "Reducerat Läge", "tryb zredukowany/obniżony", "", "mode réduction") // TODO translate MAKE_PSTR_LIST(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") MAKE_PSTR_LIST(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") @@ -637,12 +637,12 @@ MAKE_PSTR_LIST(collectorTemp, "collectortemp", "collector temperature (TS1)", "K MAKE_PSTR_LIST(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)") MAKE_PSTR_LIST(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)") MAKE_PSTR_LIST(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)") -MAKE_PSTR_LIST(heatExchangerTemp, "heatexchangertemp", "heat exchanger temperature (TS6)", "wärmetauscher Temperatur (TS6)", "Temperatuur warmtewisselaar (TS6)", "Värmeväxlare Temperatur (TS6)", "temperatura wymiennika ciepła (TS6)", "", "température échangeur de chaleur (TS6)") +MAKE_PSTR_LIST(heatExchangerTemp, "heatexchangertemp", "heat exchanger temperature (TS6)", "wärmetauscher Temperatur (TS6)", "Temperatuur warmtewisselaar (TS6)", "Värmeväxlare Temperatur (TS6)", "temperatura wymiennika ciepła (TS6)", "", "température échangeur de chaleur (TS6)") // TODO translate MAKE_PSTR_LIST(collectorMaxTemp, "collectormaxtemp", "maximum collector temperature", "maximale Kollektortemperatur", "Maximale collectortemperatuur", "Max Kollektortemperatur", "maksymalna temperatura kolektora", "maks kollektortemperatur", "température max. collecteur") MAKE_PSTR_LIST(collectorMinTemp, "collectormintemp", "minimum collector temperature", "minimale Kollektortemperatur", "Minimale collectortemperatuur", "Min Kollektortemperatur", "minimalna temperatura kolektora", "min kollektortemperatur", "température min. collecteur") MAKE_PSTR_LIST(cylMaxTemp, "cylmaxtemp", "maximum cylinder temperature", "maximale Speichertemperatur", "maximale temperatuur zonneboiler", "Max Cylindertemperatur", "maksymalna temperatura zasobnika", "maks beredertemperatur", "température max. cylindre") MAKE_PSTR_LIST(solarPumpMod, "solarpumpmod", "pump modulation (PS1)", "Pumpenmodulation (PS1)", "Pompmodulatie (PS1)", "Pumpmodulering (PS1)", "modulacja pompy solarnej (PS1)", "solpumpmodulering (PS1)", "modulation pompe (PS1)") -MAKE_PSTR_LIST(cylPumpMod, "cylpumpmod", "cylinder pump modulation (PS5)", "Speicherpumpenmodulation (PS5)", "Modulatie zonneboilerpomp (PS5)", "Cylinderpumpmodulering (PS5)", "modulacja pompy zasobnika (PS5)", "", "modulation pompe cylindre (PS5)") +MAKE_PSTR_LIST(cylPumpMod, "cylpumpmod", "cylinder pump modulation (PS5)", "Speicherpumpenmodulation (PS5)", "Modulatie zonneboilerpomp (PS5)", "Cylinderpumpmodulering (PS5)", "modulacja pompy zasobnika (PS5)", "", "modulation pompe cylindre (PS5)") // TODO translate MAKE_PSTR_LIST(solarPump, "solarpump", "pump (PS1)", "Pumpe (PS1)", "Pomp (PS1)", "Pump (PS1)", "pompa solarna (PS1)", "solpumpe (PS1)", "pompe solaire (PS1)") MAKE_PSTR_LIST(solarPump2, "solarpump2", "pump 2 (PS4)", "Pumpe 2 (PS4)", "Pomp 2 (PS4)", "Pump 2 (PS4)", "pompa solarna 2 (PS4)", "solpumpe 2 (PS4)", "pompe 2 (PS4)") MAKE_PSTR_LIST(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)") @@ -662,7 +662,7 @@ MAKE_PSTR_LIST(wwTemp3, "wwtemp3", "temperature 3", "Temperatur 3", "Temperatuur MAKE_PSTR_LIST(wwTemp4, "wwtemp4", "temperature 4", "Temperatur 4", "Temperatuur 3", "Temperatur 3", "temperatura 3", "Temperatur 4", "température 4") MAKE_PSTR_LIST(wwTemp5, "wwtemp5", "temperature 5", "Temperatur 5", "Temperatuur 5", "Temperatur 4", "temperatura 4", "Temperatur 5", "température 5") MAKE_PSTR_LIST(wwTemp7, "wwtemp7", "temperature 7", "Temperatur 7", "Temperatuur 7", "Temperatur 5", "temperatura 5", "Temperatur 7", "température 7") -MAKE_PSTR_LIST(wwPump, "wwpump", "pump", "Pumpe", "Pomp", "Pump", "pompa", "", "pompe") +MAKE_PSTR_LIST(wwPump, "wwpump", "pump", "Pumpe", "Pomp", "Pump", "pompa", "", "pompe") // TODO translate // solar ww and mixer wwc MAKE_PSTR_LIST(wwMinTemp, "wwmintemp", "minimum temperature", "minimale Temperatur", "Minimale temperatuur", "Min Temperatur", "temperatura minimalna", "min temperatur", "température min") MAKE_PSTR_LIST(wwRedTemp, "wwredtemp", "reduced temperature", "reduzierte Temperatur", "Gereduceerde temperatuur", "Reducerad Temperatur", "temperatura zredukowana", "reducert temperatur", "température réduite") diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 94faa8ef7..c17298156 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -46,8 +46,8 @@ WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * f securityManager->wrapRequest(std::bind(&WebCustomizationService::reset_customization, this, _1), AuthenticationPredicates::IS_ADMIN)); _masked_entities_handler.setMethod(HTTP_POST); - _masked_entities_handler.setMaxContentLength(4096); - _masked_entities_handler.setMaxJsonBufferSize(4096); + _masked_entities_handler.setMaxContentLength(2048); + _masked_entities_handler.setMaxJsonBufferSize(2048); server->addHandler(&_masked_entities_handler); _device_entities_handler.setMethod(HTTP_POST); From c754d19015bcaa9e5403e5955ac592e420c1ef96 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 5 Jan 2023 11:37:00 +0100 Subject: [PATCH 24/24] translate sensor device in web --- interface/src/project/DashboardData.tsx | 3 ++- interface/src/project/types.ts | 1 + src/locale_translations.h | 11 ++++++----- src/web/WebDataService.cpp | 1 + 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index e4154f18b..ac3b2dbdc 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -84,6 +84,7 @@ const DashboardData: FC = () => { const [coreData, setCoreData] = useState({ connected: true, devices: [], + s_n: '', active_sensors: 0, analog_enabled: false }); @@ -721,7 +722,7 @@ const DashboardData: FC = () => { - Sensors + {coreData.s_n} {LL.ATTACHED_SENSORS()} {coreData.active_sensors} diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 02703a1f6..aa7230ed6 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -102,6 +102,7 @@ export interface SensorData { export interface CoreData { connected: boolean; devices: Device[]; + s_n: string; active_sensors: number; analog_enabled: boolean; } diff --git a/src/locale_translations.h b/src/locale_translations.h index aaa16871e..324d8f1fd 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -41,11 +41,12 @@ MAKE_PSTR_LIST(solar_device, "Solar Module", "Solarmodul", "Solar Module") MAKE_PSTR_LIST(connect_device, "Connect Module", "Verbindungsmodul", "Connect Module") MAKE_PSTR_LIST(mixer_device, "Mixer Module", "Mischermodul", "Mixer Module") MAKE_PSTR_LIST(controller_device, "Controller Module", "Kontrollmodul", "Controller Module") -MAKE_PSTR_LIST(switch_device, "Switch Module","Schaltmodul","Switch Module") -MAKE_PSTR_LIST(gateway_device, "Gateway Module","Gateway Modul","Gateway Module") -MAKE_PSTR_LIST(alert_device, "Alert Module","Alarmmodul","Alert Module") -MAKE_PSTR_LIST(pump_device, "Pump Module","Pumpenmodul","Pump Module") -MAKE_PSTR_LIST(heatsource_device, "Heatsource","Heizquelle","Heatsource") +MAKE_PSTR_LIST(switch_device, "Switch Module", "Schaltmodul", "Switch Module") +MAKE_PSTR_LIST(gateway_device, "Gateway Module", "Gateway Modul", "Gateway Module") +MAKE_PSTR_LIST(alert_device, "Alert Module", "Alarmmodul", "Alert Module") +MAKE_PSTR_LIST(pump_device, "Pump Module", "Pumpenmodul", "Pump Module") +MAKE_PSTR_LIST(heatsource_device, "Heatsource", "Heizquelle", "Heatsource") +MAKE_PSTR_LIST(sensors_device, "Sensors", "Sensoren", "Sensoren", "Sensorer", "czujniki", "Sensorer", "Capteurs") // commands MAKE_PSTR_LIST(info_cmd, "lists all values", "Liste aller Werte") diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 5331bd09f..1c6b98c3c 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -93,6 +93,7 @@ void WebDataService::core_data(AsyncWebServerRequest * request) { } // sensors stuff + root["s_n"] = Helpers::translated_word(FL_(sensors_device)); root["active_sensors"] = EMSESP::dallassensor_.no_sensors() + (EMSESP::analogsensor_.analog_enabled() ? EMSESP::analogsensor_.no_sensors() : 0); root["analog_enabled"] = EMSESP::analogsensor_.analog_enabled(); root["connected"] = EMSESP::bus_status() != 2;