From 4141de2200a4e8601923cc110b197fcbf23aa72b Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 2 Oct 2022 23:25:30 +0200 Subject: [PATCH] Implement timeout settings for occupancy sensing cluster --- .../zigbeeclusteroccupancysensing.cpp | 72 +++++++++++++++++++ .../zigbeeclusteroccupancysensing.h | 16 +++++ 2 files changed, 88 insertions(+) diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.cpp b/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.cpp index 70edca4..4480644 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.cpp +++ b/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.cpp @@ -41,6 +41,48 @@ bool ZigbeeClusterOccupancySensing::occupied() const return m_occupied; } +quint16 ZigbeeClusterOccupancySensing::pirOccupiedToUnoccupiedDelay() const +{ + return m_pirOccupiedToUnoccupiedDelay; +} + +ZigbeeClusterReply *ZigbeeClusterOccupancySensing::setPirOccupiedToUnoccupiedDelay(quint16 pirOccupiedToUnoccupiedDelay) +{ + ZigbeeClusterLibrary::WriteAttributeRecord record; + record.attributeId = AttributePirOccupiedToUnoccupiedDelay; + record.dataType = Zigbee::Uint16; + record.data = ZigbeeDataType(pirOccupiedToUnoccupiedDelay).data(); + return writeAttributes({record}); +} + +quint16 ZigbeeClusterOccupancySensing::pirUnoccupiedToOccupiedDelay() const +{ + return m_pirUnoccupiedToOccupiedDelay; +} + +ZigbeeClusterReply *ZigbeeClusterOccupancySensing::setPirUnoccupiedToOccupiedDelay(quint16 pirUnoccupiedToOccupiedDelay) +{ + ZigbeeClusterLibrary::WriteAttributeRecord record; + record.attributeId = AttributePirUnoccupiedToOccupiedDelay; + record.dataType = Zigbee::Uint16; + record.data = ZigbeeDataType(pirUnoccupiedToOccupiedDelay).data(); + return writeAttributes({record}); +} + +quint16 ZigbeeClusterOccupancySensing::pirUnoccupiedToOccupiedThreshold() const +{ + return m_pirUnoccupiedToOccupiedThreshold; +} + +ZigbeeClusterReply *ZigbeeClusterOccupancySensing::setPirUnoccupiedToOccupiedThreshold(quint16 pirUnoccupiedToOccupiedThreshold) +{ + ZigbeeClusterLibrary::WriteAttributeRecord record; + record.attributeId = AttributePirUnoccupiedToOccupiedThreshold; + record.dataType = Zigbee::Uint16; + record.data = ZigbeeDataType(pirUnoccupiedToOccupiedThreshold).data(); + return writeAttributes({record}); +} + void ZigbeeClusterOccupancySensing::setAttribute(const ZigbeeClusterAttribute &attribute) { ZigbeeCluster::setAttribute(attribute); @@ -56,5 +98,35 @@ void ZigbeeClusterOccupancySensing::setAttribute(const ZigbeeClusterAttribute &a } else { qCWarning(dcZigbeeCluster()) << "Failed to convert value from attribute" << m_node << m_endpoint << this << attribute; } + } else if (attribute.id() == AttributePirOccupiedToUnoccupiedDelay) { + bool valueOk; + quint16 value = attribute.dataType().toUInt16(&valueOk); + if (valueOk) { + m_pirOccupiedToUnoccupiedDelay = value; + qCDebug(dcZigbeeCluster()) << "PirOccupiedToUnoccupiedDelay changed on" << m_node << m_endpoint << this << m_pirOccupiedToUnoccupiedDelay; + emit pirOccupiedToUnoccupiedDelayChanged(m_pirOccupiedToUnoccupiedDelay); + } else { + qCWarning(dcZigbeeCluster()) << "Failed to convert value from attribute" << m_node << m_endpoint << this << attribute; + } + } else if (attribute.id() == AttributePirUnoccupiedToOccupiedDelay) { + bool valueOk; + quint16 value = attribute.dataType().toUInt16(&valueOk); + if (valueOk) { + m_pirUnoccupiedToOccupiedDelay = value; + qCDebug(dcZigbeeCluster()) << "PirUnccupiedToOccupiedDelay changed on" << m_node << m_endpoint << this << m_pirOccupiedToUnoccupiedDelay; + emit pirUnoccupiedToOccupiedDelayChanged(m_pirUnoccupiedToOccupiedDelay); + } else { + qCWarning(dcZigbeeCluster()) << "Failed to convert value from attribute" << m_node << m_endpoint << this << attribute; + } + } else if (attribute.id() == AttributePirUnoccupiedToOccupiedThreshold) { + bool valueOk; + quint16 value = attribute.dataType().toUInt16(&valueOk); + if (valueOk) { + m_pirUnoccupiedToOccupiedThreshold = value; + qCDebug(dcZigbeeCluster()) << "PirUnoccupiedToOccupiedThreshold changed on" << m_node << m_endpoint << this << m_pirOccupiedToUnoccupiedDelay; + emit pirUnoccupiedToOccupiedThresholdChanged(m_pirUnoccupiedToOccupiedThreshold); + } else { + qCWarning(dcZigbeeCluster()) << "Failed to convert value from attribute" << m_node << m_endpoint << this << attribute; + } } } diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.h b/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.h index 6c06fae..eae6a50 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.h +++ b/libnymea-zigbee/zcl/measurement/zigbeeclusteroccupancysensing.h @@ -74,13 +74,29 @@ public: bool occupied() const; + quint16 pirOccupiedToUnoccupiedDelay() const; + ZigbeeClusterReply *setPirOccupiedToUnoccupiedDelay(quint16 pirOccupiedToUnoccupiedDelay); + + quint16 pirUnoccupiedToOccupiedDelay() const; + ZigbeeClusterReply *setPirUnoccupiedToOccupiedDelay(quint16 pirUnoccupiedToOccupiedDelay); + + quint16 pirUnoccupiedToOccupiedThreshold() const; + ZigbeeClusterReply *setPirUnoccupiedToOccupiedThreshold(quint16 pirUnoccupiedToOccupiedThreshold); + private: bool m_occupied = false; + quint16 m_pirOccupiedToUnoccupiedDelay = 0; + quint16 m_pirUnoccupiedToOccupiedDelay = 0; + quint16 m_pirUnoccupiedToOccupiedThreshold = 0; + void setAttribute(const ZigbeeClusterAttribute &attribute) override; signals: void occupancyChanged(bool occupied); + void pirOccupiedToUnoccupiedDelayChanged(quint16 pirOccupiedToUnoccupiedDelay); + void pirUnoccupiedToOccupiedDelayChanged(quint16 pirUnoccupiedToOccupiedDelay); + void pirUnoccupiedToOccupiedThresholdChanged(quint16 pirUnoccupiedToOccupiedThreshold); };