From 3628e7a80e651279af23642ebb3fa0d1bd26a387 Mon Sep 17 00:00:00 2001 From: Awawa <69086569+awawa-dev@users.noreply.github.com> Date: Thu, 2 Jan 2025 14:04:38 +0100 Subject: [PATCH] HomeAssistant: remove dynamic brightness to reduce communication load --- .../led-drivers/net/DriverNetHomeAssistant.h | 4 ++- .../led-drivers/net/DriverNetZigbee2mqtt.h | 5 ++-- .../net/DriverNetHomeAssistant.cpp | 26 ++++++++++++++----- .../led-drivers/net/DriverNetZigbee2mqtt.cpp | 19 ++++++++------ .../schemas/schema-home_assistant.json | 4 +-- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/include/led-drivers/net/DriverNetHomeAssistant.h b/include/led-drivers/net/DriverNetHomeAssistant.h index e95f7b16e..bfbd7b699 100644 --- a/include/led-drivers/net/DriverNetHomeAssistant.h +++ b/include/led-drivers/net/DriverNetHomeAssistant.h @@ -22,7 +22,7 @@ class DriverNetHomeAssistant : public LedDevice QString homeAssistantHost; QString longLivedAccessToken; int transition; - int constantBrightness; + int constantBrightness = 255; bool restoreOriginalState; std::list lamps; @@ -34,6 +34,7 @@ class DriverNetHomeAssistant : public LedDevice QString name; Mode colorModel; + int currentBrightness = 255; struct { @@ -63,6 +64,7 @@ class DriverNetHomeAssistant : public LedDevice HomeAssistantInstance _haInstance; std::unique_ptr _restApi; + long long _lastUpdate; static bool isRegistered; }; diff --git a/include/led-drivers/net/DriverNetZigbee2mqtt.h b/include/led-drivers/net/DriverNetZigbee2mqtt.h index 49af9700d..94b55cc30 100644 --- a/include/led-drivers/net/DriverNetZigbee2mqtt.h +++ b/include/led-drivers/net/DriverNetZigbee2mqtt.h @@ -21,7 +21,7 @@ class DriverNetZigbee2mqtt : public LedDevice struct Zigbee2mqttInstance { int transition; - int constantBrightness = -1; + int constantBrightness = 255; std::list lamps; }; @@ -32,7 +32,7 @@ class DriverNetZigbee2mqtt : public LedDevice QString name; Mode colorModel; - int currentBrightness; + int currentBrightness = 255; }; public: @@ -60,6 +60,7 @@ public slots: int _timeLogger; QString _discoveryMessage; int _mqttId; + long long _lastUpdate; static int mqttId; static bool isRegistered; diff --git a/sources/led-drivers/net/DriverNetHomeAssistant.cpp b/sources/led-drivers/net/DriverNetHomeAssistant.cpp index 01e22c658..c8731cb79 100644 --- a/sources/led-drivers/net/DriverNetHomeAssistant.cpp +++ b/sources/led-drivers/net/DriverNetHomeAssistant.cpp @@ -1,4 +1,5 @@ #include +#include #include #ifdef ENABLE_BONJOUR @@ -6,7 +7,8 @@ #endif DriverNetHomeAssistant::DriverNetHomeAssistant(const QJsonObject& deviceConfig) - : LedDevice(deviceConfig) + : LedDevice(deviceConfig), + _lastUpdate(0) { } @@ -25,7 +27,7 @@ bool DriverNetHomeAssistant::init(const QJsonObject& deviceConfig) _haInstance.homeAssistantHost = deviceConfig["homeAssistantHost"].toString(); _haInstance.longLivedAccessToken = deviceConfig["longLivedAccessToken"].toString(); _haInstance.transition = deviceConfig["transition"].toInt(0); - _haInstance.constantBrightness = deviceConfig["constantBrightness"].toInt(0); + _haInstance.constantBrightness = deviceConfig["constantBrightness"].toInt(255); _haInstance.restoreOriginalState = deviceConfig["restoreOriginalState"].toBool(false); _maxRetry = deviceConfig["maxRetry"].toInt(60); @@ -96,6 +98,7 @@ bool DriverNetHomeAssistant::powerOn() if (!saveStates()) return false; } + _lastUpdate = InternalClock::now() - 9000; return powerOnOff(true); } @@ -112,9 +115,11 @@ bool DriverNetHomeAssistant::powerOff() int DriverNetHomeAssistant::write(const std::vector& ledValues) { QJsonDocument doc; + auto start = InternalClock::now(); + auto lastUpdate = _lastUpdate; auto rgb = ledValues.begin(); - for (const auto& lamp : _haInstance.lamps) + for (auto& lamp : _haInstance.lamps) if (rgb != ledValues.end()) { QJsonObject row; @@ -142,12 +147,19 @@ int DriverNetHomeAssistant::write(const std::vector& ledValues) brightness = std::min(std::max(static_cast(std::roundl(v * 255.0)), 0), 255); } - if (brightness > 0 && _haInstance.constantBrightness > 0) + if (lamp.currentBrightness <= 0 && brightness > 0) { - brightness = _haInstance.constantBrightness; + row["brightness"] = lamp.currentBrightness = _haInstance.constantBrightness; + } + else if (lamp.currentBrightness > 0 && brightness == 0) + { + row["brightness"] = lamp.currentBrightness = 0; + } + else if (start - lastUpdate >= 10000) + { + _lastUpdate = start; + row["brightness"] = lamp.currentBrightness; } - - row["brightness"] = brightness; doc.setObject(row); QString message(doc.toJson(QJsonDocument::Compact)); diff --git a/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp b/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp index d870bbe55..be555a935 100644 --- a/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp +++ b/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp @@ -12,7 +12,8 @@ DriverNetZigbee2mqtt::DriverNetZigbee2mqtt(const QJsonObject& deviceConfig) : LedDevice(deviceConfig), _discoveryFinished(false), _timeLogger(0), - _mqttId(mqttId++) + _mqttId(mqttId++), + _lastUpdate(0) { } @@ -27,13 +28,8 @@ bool DriverNetZigbee2mqtt::init(const QJsonObject& deviceConfig) if (LedDevice::init(deviceConfig)) { - if (_zigInstance.constantBrightness < 0) - { - QThread::msleep(750); - } - _zigInstance.transition = deviceConfig["transition"].toInt(0); - _zigInstance.constantBrightness = deviceConfig["constantBrightness"].toInt(1); + _zigInstance.constantBrightness = deviceConfig["constantBrightness"].toInt(255); Debug(_log, "Transition (ms) : %s", (_zigInstance.transition > 0) ? QSTRING_CSTR(QString::number(_zigInstance.transition)) : "disabled" ); Debug(_log, "ConstantBrightness : %s", (_zigInstance.constantBrightness > 0) ? QSTRING_CSTR(QString::number(_zigInstance.constantBrightness)) : "disabled"); @@ -101,6 +97,7 @@ bool DriverNetZigbee2mqtt::powerOnOff(bool isOn) } _timeLogger = 0; + _lastUpdate = InternalClock::now() - 9000; return true; } @@ -118,7 +115,8 @@ bool DriverNetZigbee2mqtt::powerOff() int DriverNetZigbee2mqtt::write(const std::vector& ledValues) { QJsonDocument doc; - auto start = InternalClock::nowPrecise(); + auto start = InternalClock::now(); + auto lastUpdate = _lastUpdate; auto rgb = ledValues.begin(); for (auto& lamp : _zigInstance.lamps) @@ -160,6 +158,11 @@ int DriverNetZigbee2mqtt::write(const std::vector& ledValues) { row["brightness"] = lamp.currentBrightness = 0; } + else if (start - lastUpdate >= 10000) + { + _lastUpdate = start; + row["brightness"] = lamp.currentBrightness; + } doc.setObject(row); emit GlobalSignals::getInstance()->SignalMqttPublish(topic, doc.toJson(QJsonDocument::Compact)); diff --git a/sources/led-drivers/schemas/schema-home_assistant.json b/sources/led-drivers/schemas/schema-home_assistant.json index 3db278127..32ae88c6e 100644 --- a/sources/led-drivers/schemas/schema-home_assistant.json +++ b/sources/led-drivers/schemas/schema-home_assistant.json @@ -27,8 +27,8 @@ "constantBrightness": { "type": "integer", "title": "edt_dev_spec_constantBrightness_title", - "default": 0, - "minimum": 0, + "default": 255, + "minimum": 1, "maximum": 255, "required": true, "propertyOrder": 4