Add invalid measurment filtering for measurement clusters
This commit is contained in:
parent
5072ad7c1e
commit
2f8af57d4e
@ -51,6 +51,11 @@ void ZigbeeClusterIlluminanceMeasurment::setAttribute(const ZigbeeClusterAttribu
|
|||||||
bool valueOk = false;
|
bool valueOk = false;
|
||||||
quint16 value = attribute.dataType().toUInt16(&valueOk);
|
quint16 value = attribute.dataType().toUInt16(&valueOk);
|
||||||
if (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;
|
m_illuminance = value;
|
||||||
qCDebug(dcZigbeeCluster()) << "Illuminance changed on" << m_node << m_endpoint << this << m_illuminance << "lux";
|
qCDebug(dcZigbeeCluster()) << "Illuminance changed on" << m_node << m_endpoint << this << m_illuminance << "lux";
|
||||||
emit illuminanceChanged(m_illuminance);
|
emit illuminanceChanged(m_illuminance);
|
||||||
|
|||||||
@ -56,6 +56,11 @@ void ZigbeeClusterPressureMeasurement::setAttribute(const ZigbeeClusterAttribute
|
|||||||
bool valueOk = false;
|
bool valueOk = false;
|
||||||
qint16 value = attribute.dataType().toInt16(&valueOk);
|
qint16 value = attribute.dataType().toInt16(&valueOk);
|
||||||
if (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;
|
m_pressure = value / 10.0;
|
||||||
qCDebug(dcZigbeeCluster()) << "Pressure changed on" << m_node << m_endpoint << this << m_pressure << "kPa";
|
qCDebug(dcZigbeeCluster()) << "Pressure changed on" << m_node << m_endpoint << this << m_pressure << "kPa";
|
||||||
emit pressureChanged(m_pressure);
|
emit pressureChanged(m_pressure);
|
||||||
@ -64,6 +69,11 @@ void ZigbeeClusterPressureMeasurement::setAttribute(const ZigbeeClusterAttribute
|
|||||||
bool valueOk = false;
|
bool valueOk = false;
|
||||||
qint16 value = attribute.dataType().toInt16(&valueOk);
|
qint16 value = attribute.dataType().toInt16(&valueOk);
|
||||||
if (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;
|
m_pressureScaled = value / 10.0;
|
||||||
qCDebug(dcZigbeeCluster()) << "Pressure scaled changed on" << m_node << m_endpoint << this << m_pressureScaled << "Pa";
|
qCDebug(dcZigbeeCluster()) << "Pressure scaled changed on" << m_node << m_endpoint << this << m_pressureScaled << "Pa";
|
||||||
emit pressureScaledChanged(m_pressureScaled);
|
emit pressureScaledChanged(m_pressureScaled);
|
||||||
|
|||||||
@ -51,6 +51,11 @@ void ZigbeeClusterRelativeHumidityMeasurement::setAttribute(const ZigbeeClusterA
|
|||||||
bool valueOk = false;
|
bool valueOk = false;
|
||||||
quint16 value = attribute.dataType().toUInt16(&valueOk);
|
quint16 value = attribute.dataType().toUInt16(&valueOk);
|
||||||
if (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;
|
m_humidity = value / 100.0;
|
||||||
qCDebug(dcZigbeeCluster()) << "Humidity changed on" << m_node << m_endpoint << this << m_humidity << "%";
|
qCDebug(dcZigbeeCluster()) << "Humidity changed on" << m_node << m_endpoint << this << m_humidity << "%";
|
||||||
emit humidityChanged(m_humidity);
|
emit humidityChanged(m_humidity);
|
||||||
|
|||||||
@ -51,6 +51,11 @@ void ZigbeeClusterTemperatureMeasurement::setAttribute(const ZigbeeClusterAttrib
|
|||||||
bool valueOk = false;
|
bool valueOk = false;
|
||||||
qint16 value = attribute.dataType().toInt16(&valueOk);
|
qint16 value = attribute.dataType().toInt16(&valueOk);
|
||||||
if (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;
|
m_temperature = value / 100.0;
|
||||||
qCDebug(dcZigbeeCluster()) << "Temperature changed on" << m_node << m_endpoint << this << m_temperature << "°C";
|
qCDebug(dcZigbeeCluster()) << "Temperature changed on" << m_node << m_endpoint << this << m_temperature << "°C";
|
||||||
emit temperatureChanged(m_temperature);
|
emit temperatureChanged(m_temperature);
|
||||||
|
|||||||
@ -401,7 +401,7 @@ void ZigbeeCluster::finishZclReply(ZigbeeClusterReply *zclReply)
|
|||||||
m_pendingReplies.remove(zclReply->transactionSequenceNumber());
|
m_pendingReplies.remove(zclReply->transactionSequenceNumber());
|
||||||
qCDebug(dcZigbeeCluster()) << "ZigbeeClusterReply finished" << zclReply->request() << zclReply->requestFrame() << zclReply->responseFrame();
|
qCDebug(dcZigbeeCluster()) << "ZigbeeClusterReply finished" << zclReply->request() << zclReply->requestFrame() << zclReply->responseFrame();
|
||||||
// FIXME: Set the status
|
// FIXME: Set the status
|
||||||
zclReply->finished();
|
emit zclReply->finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZigbeeCluster::processDataIndication(ZigbeeClusterLibrary::Frame frame)
|
void ZigbeeCluster::processDataIndication(ZigbeeClusterLibrary::Frame frame)
|
||||||
|
|||||||
Reference in New Issue
Block a user