Merge PR #87: Add min/max value support to temperaturemeasurement cluster
commit
eb2386cf27
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue