From 21de630f8ef58ebe8860f9a8e22aaf8f9efbd202 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 22 Jan 2024 16:13:23 +0100 Subject: [PATCH 1/6] check telegrams for dest==thermostat --- src/emsesp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 5d79f1790..8c015180d 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -922,7 +922,7 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { bool found = false; bool knowndevice = false; for (const auto & emsdevice : emsdevices) { - if (emsdevice->is_device_id(telegram->src) && (telegram->dest == 0 || telegram->dest == EMSbus::ems_bus_id())) { + if (emsdevice->is_device_id(telegram->src) && (telegram->dest == 0 || telegram->dest == EMSbus::ems_bus_id()|| telegram->dest == 0x10)) { knowndevice = true; found = emsdevice->handle_telegram(telegram); // if we correctly processed the telegram then follow up with sending it via MQTT (if enabled) From 541615d405a652684d8a1229fde12838663dcb56 Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 24 Jan 2024 20:02:02 +0100 Subject: [PATCH 2/6] Add Buderus MX300 Internet Gateway --- src/device_library.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/device_library.h b/src/device_library.h index 0bbb79ad1..58d6e97cc 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -179,8 +179,9 @@ // Gateways - 0x48 {189, DeviceType::GATEWAY, "KM200/MB LAN 2", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{252, DeviceType::GATEWAY, "MX300", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Generic - 0x40 or other with no product-id and no version {0, DeviceType::GENERIC, "unknown", DeviceFlags::EMS_DEVICE_FLAG_NONE} -// clang-format on \ No newline at end of file +// clang-format on From 24b8e004ecba4a670b005356fa8f4f46f463d971 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 28 Jan 2024 09:07:05 +0100 Subject: [PATCH 3/6] fix jsonvariant in command --- src/command.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/command.cpp b/src/command.cpp index 2724ff75e..b80fd0ee4 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -173,8 +173,10 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec if (!output.containsKey("api_data")) { return CommandRet::INVALID; } - data = output["api_data"]; + String dat = output["api_data"]; output.clear(); + input["data"] = dat.c_str(); + data = input["data"]; } } } From fbd3ebbd4e8e5d8fc503a42c9f2e12f4b3e26e84 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 28 Jan 2024 09:07:28 +0100 Subject: [PATCH 4/6] fetch mixer 0x2CC --- src/devices/mixer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index 7c3d3377a..1543e5338 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -43,9 +43,9 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c // EMS+ if (flags == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { if (device_id >= 0x20 && device_id <= 0x27) { - register_telegram_type(device_id - 0x20 + 0x02D7, "MMPLUSStatusMessage_HC", false, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); - // register_telegram_type(device_id - 0x20 + 0x02E1, "MMPLUSSetMessage_HC", true, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); - register_telegram_type(2 * (device_id - 0x20) + 0x02CC, "MMPLUSSetMessage_HC", false, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); + register_telegram_type(device_id - 0x20 + 0x02D7, "MMPLUSStatusMessage", false, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); + // register_telegram_type(device_id - 0x20 + 0x02E1, "MMPLUSSetMessage", true, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); + register_telegram_type(2 * (device_id - 0x20) + 0x02CC, "MMPLUSSetMessage", true, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); type_ = Type::HC; hc_ = device_id - 0x20 + 1; uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; From 0760e6e021ed9419caada3e4c2551a50a293cc4c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 28 Jan 2024 09:07:49 +0100 Subject: [PATCH 5/6] hpPressure telegram --- src/devices/boiler.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 74195e884..8a2e5333f 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -86,6 +86,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x49D, "HPSettings3", true, MAKE_PF_CB(process_HpSettings3)); register_telegram_type(0x4AE, "HPEnergy", true, MAKE_PF_CB(process_HpEnergy)); register_telegram_type(0x4AF, "HPMeters", true, MAKE_PF_CB(process_HpMeters)); + register_telegram_type(0x2CC, "HPPressure", true, MAKE_PF_CB(process_HpPressure)); } if (model() == EMSdevice::EMS_DEVICE_FLAG_HIU) { From 6155645436c641ee85de52e68451852facaac0c4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 28 Jan 2024 11:31:17 +0100 Subject: [PATCH 6/6] process telegram selection of device --- src/emsesp.cpp | 117 ++++++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 45 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 8c015180d..8b6d8e3f5 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -685,7 +685,7 @@ bool EMSESP::get_device_value_info(JsonObject root, const char * cmd, const int8 return EMSESP::webSchedulerService.get_value_info(root, cmd); } - // own entities + // custom entities if (devicetype == DeviceType::CUSTOM) { return EMSESP::webCustomEntityService.get_value_info(root, cmd); } @@ -721,20 +721,26 @@ std::string EMSESP::pretty_telegram(std::shared_ptr telegram) { std::string dest_name(""); std::string type_name(""); for (const auto & emsdevice : emsdevices) { - if (emsdevice) { - // get src & dest - if (emsdevice->is_device_id(src)) { - src_name = emsdevice->device_type_name(); - } else if (emsdevice->is_device_id(dest)) { - dest_name = emsdevice->device_type_name(); + // get src & dest + if (emsdevice->is_device_id(src)) { + src_name = emsdevice->device_type_name(); + } else if (emsdevice->is_device_id(dest)) { + dest_name = emsdevice->device_type_name(); + } + // get the type name + if (type_name.empty()) { + if ((telegram->operation == Telegram::Operation::RX_READ && emsdevice->is_device_id(dest)) + || (telegram->operation != Telegram::Operation::RX_READ && dest == 0 && emsdevice->is_device_id(src)) + || (telegram->operation != Telegram::Operation::RX_READ && src == EMSbus::ems_bus_id() && emsdevice->is_device_id(dest))) { + type_name = emsdevice->telegram_type_name(telegram); } - // get the type name - if (type_name.empty()) { - if ((telegram->operation == Telegram::Operation::RX_READ && emsdevice->is_device_id(dest)) - || (telegram->operation != Telegram::Operation::RX_READ && dest == 0 && emsdevice->is_device_id(src)) - || (telegram->operation != Telegram::Operation::RX_READ && src == EMSbus::ems_bus_id() && emsdevice->is_device_id(dest))) { - type_name = emsdevice->telegram_type_name(telegram); - } + } + } + if (type_name.empty()) { + // fallback, get the type name from src + for (const auto & emsdevice : emsdevices) { + if (telegram->operation != Telegram::Operation::RX_READ && emsdevice->is_device_id(src)) { + type_name = emsdevice->telegram_type_name(telegram); } } } @@ -919,49 +925,70 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { // calls the associated process function for that EMS device // returns false if the device_id doesn't recognize it // after the telegram has been processed, see if there have been values changed and we need to do a MQTT publish - bool found = false; - bool knowndevice = false; + bool telegram_found = false; + uint8_t device_found = 0; + // broadcast or send to us for (const auto & emsdevice : emsdevices) { - if (emsdevice->is_device_id(telegram->src) && (telegram->dest == 0 || telegram->dest == EMSbus::ems_bus_id()|| telegram->dest == 0x10)) { - knowndevice = true; - found = emsdevice->handle_telegram(telegram); - // if we correctly processed the telegram then follow up with sending it via MQTT (if enabled) - if (found && Mqtt::connected()) { - if ((mqtt_.get_publish_onchange(emsdevice->device_type()) && emsdevice->has_update()) - || (telegram->type_id == publish_id_ && telegram->dest == EMSbus::ems_bus_id())) { - if (telegram->type_id == publish_id_) { - publish_id_ = 0; - } - emsdevice->has_update(false); // reset flag - if (!Mqtt::publish_single()) { - publish_device_values(emsdevice->device_type()); // publish to MQTT if we explicitly have too - } - } - } - if (wait_validate_ == telegram->type_id) { - wait_validate_ = 0; - } - if (!found && telegram->message_length > 0) { - emsdevice->add_handlers_ignored(telegram->type_id); - } + if (emsdevice->is_device_id(telegram->src) && (telegram->dest == 0 || telegram->dest == EMSbus::ems_bus_id())) { + telegram_found = emsdevice->handle_telegram(telegram); + device_found = emsdevice->unique_id(); break; - } else if (emsdevice->is_device_id(telegram->dest) && telegram->src != EMSbus::ems_bus_id()) { - emsdevice->handle_telegram(telegram); } } - - // handle unknown broadcasted telegrams - if (!found && telegram->dest == 0) { + if (!telegram_found) { + // check for command to the device + for (const auto & emsdevice : emsdevices) { + if (emsdevice->is_device_id(telegram->dest) && telegram->src != EMSbus::ems_bus_id()) { + telegram_found = emsdevice->handle_telegram(telegram); + device_found = emsdevice->unique_id(); + break; + } + } + } + if (!telegram_found) { + // check for sends to master thermostat + for (const auto & emsdevice : emsdevices) { + if (emsdevice->is_device_id(telegram->src) && telegram->dest == 0x10) { + telegram_found = emsdevice->handle_telegram(telegram); + device_found = emsdevice->unique_id(); + break; + } + } + } + for (const auto & emsdevice : emsdevices) { + if (emsdevice->unique_id() == device_found) { + if (telegram->message_length > 0) { + emsdevice->add_handlers_ignored(telegram->type_id); + } + if (telegram->dest == 0 && telegram->offset == 0 && telegram->message_length > 0) { + emsdevice->add_handlers_broadcasted(telegram->type_id); + } + if (Mqtt::connected() && telegram_found + && ((mqtt_.get_publish_onchange(emsdevice->device_type()) && emsdevice->has_update()) + || (telegram->type_id == publish_id_ && telegram->dest == EMSbus::ems_bus_id()))) { + if (telegram->type_id == publish_id_) { + publish_id_ = 0; + } + emsdevice->has_update(false); // reset flag + if (!Mqtt::publish_single()) { + publish_device_values(emsdevice->device_type()); // publish to MQTT if we explicitly have too + } + } + break; + } + } + // handle unknown broadcasted telegrams (or send to us) + if (!telegram_found && (telegram->dest == 0 || telegram->dest == EMSbus::ems_bus_id())) { LOG_DEBUG("No telegram type handler found for ID 0x%02X (src 0x%02X)", telegram->type_id, telegram->src); if (watch() == WATCH_UNKNOWN) { LOG_NOTICE("%s", pretty_telegram(telegram).c_str()); } - if (!wait_km_ && !knowndevice && (telegram->src != EMSbus::ems_bus_id()) && (telegram->message_length > 0)) { + if (!wait_km_ && !device_found && (telegram->src != EMSbus::ems_bus_id()) && (telegram->message_length > 0)) { send_read_request(EMSdevice::EMS_TYPE_VERSION, telegram->src); } } - return found; + return telegram_found; } // return true if we have this device already registered