Add invalid measurment filtering for measurement clusters

This commit is contained in:
Simon Stürz 2021-05-21 08:54:49 +02:00
parent 5072ad7c1e
commit 2f8af57d4e
5 changed files with 26 additions and 1 deletions

View File

@ -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);

View File

@ -56,6 +56,11 @@ void ZigbeeClusterPressureMeasurement::setAttribute(const ZigbeeClusterAttribute
bool valueOk = false;
qint16 value = attribute.dataType().toInt16(&valueOk);
if (valueOk) {
if (value == static_cast<qint16>(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<qint16>(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);

View File

@ -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);

View File

@ -51,6 +51,11 @@ void ZigbeeClusterTemperatureMeasurement::setAttribute(const ZigbeeClusterAttrib
bool valueOk = false;
qint16 value = attribute.dataType().toInt16(&valueOk);
if (valueOk) {
if (value == static_cast<qint16>(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);

View File

@ -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)