From 53c1857c2928c8929060a7a4c45c0fbcf7ae06c7 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 5 Nov 2023 21:01:55 +0100 Subject: [PATCH] Add min/max value support to temperaturemeasurement cluster --- .../zigbeeclustertemperaturemeasurement.cpp | 48 +++++++++++++++++++ .../zigbeeclustertemperaturemeasurement.h | 9 ++++ 2 files changed, 57 insertions(+) diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp b/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp index 9b638a9..2372501 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp +++ b/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp @@ -36,11 +36,45 @@ ZigbeeClusterTemperatureMeasurement::ZigbeeClusterTemperatureMeasurement(ZigbeeN } +ZigbeeClusterReply *ZigbeeClusterTemperatureMeasurement::readTemperature() +{ + ZigbeeClusterReply *readTempReply = readAttributes({ZigbeeClusterTemperatureMeasurement::AttributeMeasuredValue}); + connect(readTempReply, &ZigbeeClusterReply::finished, this, [=](){ + if (readTempReply->error() != ZigbeeClusterReply::ErrorNoError) { + qCWarning(dcZigbeeCluster()) << "Failed to read min/max/temp values." << readTempReply->error(); + return; + } + }); + return readTempReply; +} + +ZigbeeClusterReply *ZigbeeClusterTemperatureMeasurement::readMinMaxTemperature() +{ + ZigbeeClusterReply *readMinMaxTempReply = readAttributes({ZigbeeClusterTemperatureMeasurement::AttributeMeasuredValue, ZigbeeClusterTemperatureMeasurement::AttributeMinMeasuredValue, ZigbeeClusterTemperatureMeasurement::AttributeMaxMeasuredValue}); + connect(readMinMaxTempReply, &ZigbeeClusterReply::finished, this, [=](){ + if (readMinMaxTempReply->error() != ZigbeeClusterReply::ErrorNoError) { + qCWarning(dcZigbeeCluster()) << "Failed to read min/max/temp values." << readMinMaxTempReply->error(); + return; + } + }); + return readMinMaxTempReply; +} + double ZigbeeClusterTemperatureMeasurement::temperature() const { return m_temperature; } +double ZigbeeClusterTemperatureMeasurement::minTemperature() const +{ + return m_minTemperature; +} + +double ZigbeeClusterTemperatureMeasurement::maxTemperature() const +{ + return m_maxTemperature; +} + void ZigbeeClusterTemperatureMeasurement::setAttribute(const ZigbeeClusterAttribute &attribute) { ZigbeeCluster::setAttribute(attribute); @@ -55,6 +89,20 @@ void ZigbeeClusterTemperatureMeasurement::setAttribute(const ZigbeeClusterAttrib return; } + m_temperature = value / 100.0; + qCDebug(dcZigbeeCluster()) << "Temperature changed on" << m_node << m_endpoint << this << m_temperature << "°C"; + emit temperatureChanged(m_temperature); + } + } + if (attribute.id() == AttributeMinMeasuredValue) { + bool valueOk = false; + qint16 value = attribute.dataType().toInt16(&valueOk); + if (valueOk) { + if (value == static_cast(0x8000)) { + qCDebug(dcZigbeeCluster()) << m_node << m_endpoint << this << "received invalid min measurement value. Not updating the attribute."; + return; + } + m_temperature = value / 100.0; qCDebug(dcZigbeeCluster()) << "Temperature changed on" << m_node << m_endpoint << this << m_temperature << "°C"; emit temperatureChanged(m_temperature); diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.h b/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.h index 803b59f..5ae409e 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.h +++ b/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.h @@ -56,15 +56,24 @@ public: explicit ZigbeeClusterTemperatureMeasurement(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr); + ZigbeeClusterReply* readTemperature(); + ZigbeeClusterReply* readMinMaxTemperature(); + double temperature() const; + double minTemperature() const; + double maxTemperature() const; private: double m_temperature = 0; + double m_minTemperature = -55.54; // Absolute min/max as per Zigbee spec + double m_maxTemperature = 327.67; void setAttribute(const ZigbeeClusterAttribute &attribute) override; signals: void temperatureChanged(double temperature); + void minTemperatureChanged(double minTemperature); + void maxTemperatureChanged(double maxTemperature); };