diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 1740bfdbc..d65571213 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -32,6 +32,7 @@ - min/max in web value setting - Extend customization to select if an entity is to be shown in the WebUI or forced as read-only [#317](https://github.com/emsesp/EMS-ESP32/issues/317) - Added Moduline 400 installation parameters [PR #449 by @kwertie01](https://github.com/emsesp/EMS-ESP32/pull/449) +- Read time from IVT-controller [#439](https://github.com/emsesp/EMS-ESP32/issues/439) ### Fixed @@ -66,7 +67,7 @@ - removed system/pin command, new commands in analogsensors - system/info device-info split to name/version/brand - exclude list uses short-names, possible flags for web/api/mqtt excludes, readonly and favorite (selection not yet implemented) -- thermostat clock formate date-time: dd.mm.yyyy hh:mm:ss +- thermostat clock formate date-time: dd.mm.yyyy hh:mm - RC300 summermode as other thermostats `winter/summer` instead of `off/on` ## **BREAKING CHANGES:** diff --git a/src/devices/controller.cpp b/src/devices/controller.cpp index b30116d8e..f7b0b952f 100644 --- a/src/devices/controller.cpp +++ b/src/devices/controller.cpp @@ -24,6 +24,28 @@ REGISTER_FACTORY(Controller, EMSdevice::DeviceType::CONTROLLER); Controller::Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { + // IVT broadcasts Thermostat time from controller (0x09) if display is off. + register_telegram_type(0x06, F("RCTime"), false, MAKE_PF_CB(process_dateTime)); + register_device_value(DeviceValueTAG::TAG_NONE, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); } +// process_dateTime - type 0x06 - date and time from a thermostat - 14 bytes long, IVT only +void Controller::process_dateTime(std::shared_ptr telegram) { + if (telegram->offset > 0 || telegram->message_length < 5) { + return; + } + char newdatetime[sizeof(dateTime_)]; + // publich as dd.mm.yyyy hh:mmF + snprintf(newdatetime, + sizeof(dateTime_), + "%02d.%02d.%04d %02d:%02d", + telegram->message_data[3], + telegram->message_data[1] - 1, + (telegram->message_data[0] & 0x7F) + 2000, + telegram->message_data[2], + telegram->message_data[4]); + has_update(dateTime_, newdatetime, sizeof(dateTime_)); +} + + } // namespace emsesp \ No newline at end of file diff --git a/src/devices/controller.h b/src/devices/controller.h index 76e11e59a..e9efb73af 100644 --- a/src/devices/controller.h +++ b/src/devices/controller.h @@ -26,6 +26,10 @@ namespace emsesp { class Controller : public EMSdevice { public: Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); + + void process_dateTime(std::shared_ptr telegram); + + char dateTime_[25]; }; } // namespace emsesp diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 7f331c9c5..b4d61dc65 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -77,7 +77,7 @@ void WebDataService::core_data(AsyncWebServerRequest * request) { // Ignore Contoller JsonArray devices = root.createNestedArray("devices"); for (const auto & emsdevice : EMSESP::emsdevices) { - if (emsdevice && emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER) { + if (emsdevice && (emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER || emsdevice->count_entities() > 0)) { JsonObject obj = devices.createNestedObject(); obj["i"] = emsdevice->unique_id(); // a unique id obj["t"] = emsdevice->device_type_name(); // type