Merge PR #87: Add min/max value support to temperaturemeasurement cluster

build-noble
jenkins 2023-11-23 09:52:08 +01:00
commit eb2386cf27
2 changed files with 57 additions and 0 deletions

View File

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

View File

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