diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclusterilluminancemeasurment.cpp b/libnymea-zigbee/zcl/measurement/zigbeeclusterilluminancemeasurment.cpp index c4bd5df..489e88c 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclusterilluminancemeasurment.cpp +++ b/libnymea-zigbee/zcl/measurement/zigbeeclusterilluminancemeasurment.cpp @@ -51,6 +51,11 @@ void ZigbeeClusterIlluminanceMeasurment::setAttribute(const ZigbeeClusterAttribu bool valueOk = false; quint16 value = attribute.dataType().toUInt16(&valueOk); if (valueOk) { + if (value == 0xffff) { + qCDebug(dcZigbeeCluster()) << m_node << m_endpoint << this << "received invalid measurement value. Not updating the attribute."; + return; + } + m_illuminance = value; qCDebug(dcZigbeeCluster()) << "Illuminance changed on" << m_node << m_endpoint << this << m_illuminance << "lux"; emit illuminanceChanged(m_illuminance); diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclusterpressuremeasurement.cpp b/libnymea-zigbee/zcl/measurement/zigbeeclusterpressuremeasurement.cpp index c052d54..b62f5a0 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclusterpressuremeasurement.cpp +++ b/libnymea-zigbee/zcl/measurement/zigbeeclusterpressuremeasurement.cpp @@ -56,6 +56,11 @@ void ZigbeeClusterPressureMeasurement::setAttribute(const ZigbeeClusterAttribute 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 measurement value. Not updating the attribute."; + return; + } + m_pressure = value / 10.0; qCDebug(dcZigbeeCluster()) << "Pressure changed on" << m_node << m_endpoint << this << m_pressure << "kPa"; emit pressureChanged(m_pressure); @@ -64,6 +69,11 @@ void ZigbeeClusterPressureMeasurement::setAttribute(const ZigbeeClusterAttribute 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 measurement value. Not updating the attribute."; + return; + } + m_pressureScaled = value / 10.0; qCDebug(dcZigbeeCluster()) << "Pressure scaled changed on" << m_node << m_endpoint << this << m_pressureScaled << "Pa"; emit pressureScaledChanged(m_pressureScaled); diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclusterrelativehumiditymeasurement.cpp b/libnymea-zigbee/zcl/measurement/zigbeeclusterrelativehumiditymeasurement.cpp index 5b3701c..0bdf4eb 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclusterrelativehumiditymeasurement.cpp +++ b/libnymea-zigbee/zcl/measurement/zigbeeclusterrelativehumiditymeasurement.cpp @@ -51,6 +51,11 @@ void ZigbeeClusterRelativeHumidityMeasurement::setAttribute(const ZigbeeClusterA bool valueOk = false; quint16 value = attribute.dataType().toUInt16(&valueOk); if (valueOk) { + if (value == 0xffff) { + qCDebug(dcZigbeeCluster()) << m_node << m_endpoint << this << "received invalid measurement value. Not updating the attribute."; + return; + } + m_humidity = value / 100.0; qCDebug(dcZigbeeCluster()) << "Humidity changed on" << m_node << m_endpoint << this << m_humidity << "%"; emit humidityChanged(m_humidity); diff --git a/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp b/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp index 75e8d78..1694a03 100644 --- a/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp +++ b/libnymea-zigbee/zcl/measurement/zigbeeclustertemperaturemeasurement.cpp @@ -51,6 +51,11 @@ void ZigbeeClusterTemperatureMeasurement::setAttribute(const ZigbeeClusterAttrib 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 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/zigbeecluster.cpp b/libnymea-zigbee/zcl/zigbeecluster.cpp index 692377a..54c4431 100644 --- a/libnymea-zigbee/zcl/zigbeecluster.cpp +++ b/libnymea-zigbee/zcl/zigbeecluster.cpp @@ -401,7 +401,7 @@ void ZigbeeCluster::finishZclReply(ZigbeeClusterReply *zclReply) m_pendingReplies.remove(zclReply->transactionSequenceNumber()); qCDebug(dcZigbeeCluster()) << "ZigbeeClusterReply finished" << zclReply->request() << zclReply->requestFrame() << zclReply->responseFrame(); // FIXME: Set the status - zclReply->finished(); + emit zclReply->finished(); } void ZigbeeCluster::processDataIndication(ZigbeeClusterLibrary::Frame frame)