From f2511a9b255e1818d6b7d7b0c33feb540dd3a093 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Wed, 5 Oct 2022 00:00:41 +0200 Subject: [PATCH] Add Fan Control cluster implementation --- libnymea-zigbee/libnymea-zigbee.pro | 2 + .../zcl/hvac/zigbeeclusterfancontrol.cpp | 83 ++++++++++++++++++ .../zcl/hvac/zigbeeclusterfancontrol.h | 84 +++++++++++++++++++ libnymea-zigbee/zigbeenodeendpoint.cpp | 3 + 4 files changed, 172 insertions(+) create mode 100644 libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.cpp create mode 100644 libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.h diff --git a/libnymea-zigbee/libnymea-zigbee.pro b/libnymea-zigbee/libnymea-zigbee.pro index 9c80ff4..5bdaf9f 100644 --- a/libnymea-zigbee/libnymea-zigbee.pro +++ b/libnymea-zigbee/libnymea-zigbee.pro @@ -45,6 +45,7 @@ SOURCES += \ zcl/general/zigbeeclusterpowerconfiguration.cpp \ zcl/general/zigbeeclusterscenes.cpp \ zcl/general/zigbeeclustertime.cpp \ + zcl/hvac/zigbeeclusterfancontrol.cpp \ zcl/hvac/zigbeeclusterthermostat.cpp \ zcl/lighting/zigbeeclustercolorcontrol.cpp \ zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.cpp \ @@ -122,6 +123,7 @@ HEADERS += \ zcl/general/zigbeeclusterpowerconfiguration.h \ zcl/general/zigbeeclusterscenes.h \ zcl/general/zigbeeclustertime.h \ + zcl/hvac/zigbeeclusterfancontrol.h \ zcl/hvac/zigbeeclusterthermostat.h \ zcl/lighting/zigbeeclustercolorcontrol.h \ zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h \ diff --git a/libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.cpp b/libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.cpp new file mode 100644 index 0000000..b260334 --- /dev/null +++ b/libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.cpp @@ -0,0 +1,83 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2022, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea-zigbee. +* This project including source code and documentation is protected by copyright law, and +* remains the property of nymea GmbH. All rights, including reproduction, publication, +* editing and translation, are reserved. The use of this project is subject to the terms of a +* license agreement to be concluded with nymea GmbH in accordance with the terms +* of use of nymea GmbH, available under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the terms of the GNU +* Lesser General Public License as published by the Free Software Foundation; version 3. +* this project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License along with this project. +* If not, see . +* +* For any further details and any questions please contact us under contact@nymea.io +* or see our FAQ/Licensing Information on https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "zigbeeclusterfancontrol.h" + +#include "loggingcategory.h" +#include "zigbeeutils.h" + + +ZigbeeClusterFanControl::ZigbeeClusterFanControl(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, ZigbeeCluster::Direction direction, QObject *parent): + ZigbeeCluster(network, node, endpoint, ZigbeeClusterLibrary::ClusterIdFanControl, direction, parent) +{ +} + +ZigbeeClusterFanControl::FanMode ZigbeeClusterFanControl::fanMode() const +{ + return static_cast(m_attributes.value(AttributeFanMode).dataType().toUInt8()); +} + +ZigbeeClusterFanControl::FanModeSequence ZigbeeClusterFanControl::fanModeSequence() const +{ + return static_cast(m_attributes.value(AttributeFanModeSequence).dataType().toInt16()); +} + +ZigbeeClusterReply *ZigbeeClusterFanControl::setFanMode(ZigbeeClusterFanControl::FanMode fanMode) +{ + ZigbeeDataType dataType(static_cast(fanMode)); + ZigbeeClusterLibrary::WriteAttributeRecord attribute; + attribute.attributeId = ZigbeeClusterFanControl::AttributeFanMode; + attribute.dataType = Zigbee::Enum8; + attribute.data = dataType.data(); + + return this->writeAttributes({attribute}); +} + +ZigbeeClusterReply *ZigbeeClusterFanControl::setFanModeSequence(ZigbeeClusterFanControl::FanModeSequence fanModeSequence) +{ + ZigbeeDataType dataType(static_cast(fanModeSequence)); + ZigbeeClusterLibrary::WriteAttributeRecord attribute; + attribute.attributeId = ZigbeeClusterFanControl::AttributeFanModeSequence; + attribute.dataType = Zigbee::Enum8; + attribute.data = dataType.data(); + + return this->writeAttributes({attribute}); +} + +void ZigbeeClusterFanControl::setAttribute(const ZigbeeClusterAttribute &attribute) +{ + ZigbeeCluster::setAttribute(attribute); + + switch (attribute.id()) { + case AttributeFanMode: + emit fanModeChanged(fanMode()); + break; + case AttributeFanModeSequence: + emit fanModeSequenceChanged(fanModeSequence()); + break; + } +} diff --git a/libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.h b/libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.h new file mode 100644 index 0000000..b753dd2 --- /dev/null +++ b/libnymea-zigbee/zcl/hvac/zigbeeclusterfancontrol.h @@ -0,0 +1,84 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2022, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea-zigbee. +* This project including source code and documentation is protected by copyright law, and +* remains the property of nymea GmbH. All rights, including reproduction, publication, +* editing and translation, are reserved. The use of this project is subject to the terms of a +* license agreement to be concluded with nymea GmbH in accordance with the terms +* of use of nymea GmbH, available under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the terms of the GNU +* Lesser General Public License as published by the Free Software Foundation; version 3. +* this project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License along with this project. +* If not, see . +* +* For any further details and any questions please contact us under contact@nymea.io +* or see our FAQ/Licensing Information on https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef ZIGBEECLUSTERFANCONTROL_H +#define ZIGBEECLUSTERFANCONTROL_H + +#include "zcl/zigbeecluster.h" + +class ZigbeeClusterFanControl : public ZigbeeCluster +{ + Q_OBJECT + + friend class ZigbeeNode; + friend class ZigbeeNetwork; + +public: + + enum Attribute { + AttributeFanMode = 0x0000, + AttributeFanModeSequence = 0x0001, + }; + Q_ENUM(Attribute) + + enum FanMode { + FanModeOff = 0x00, + FanModeLow = 0x01, + FanModeMedium = 0x02, + FanModeHigh = 0x03, + FanModeOn = 0x04, + FanModeAuto = 0x05, + FanModeSmart = 0x06 + }; + Q_ENUM(FanMode) + + enum FanModeSequence { + FanModeSequenceLowMedHigh = 0x00, + FanModeSequenceLowHigh = 0x01, + FanModeSequenceLowMedHighAuto = 0x02, + FanModeSequenceLowHighAuto = 0x03, + FanModeSequenceOnAuto = 0x04 + }; + Q_ENUM(FanModeSequence) + + explicit ZigbeeClusterFanControl(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr); + + FanMode fanMode() const; + FanModeSequence fanModeSequence() const; + + ZigbeeClusterReply *setFanMode(FanMode fanMode); + ZigbeeClusterReply *setFanModeSequence(FanModeSequence fanModeSequence); + +signals: + void fanModeChanged(FanMode fanMode); + void fanModeSequenceChanged(FanModeSequence fanModeSequence); + +private: + void setAttribute(const ZigbeeClusterAttribute &attribute) override; +}; + +#endif // ZIGBEECLUSTERFANCONTROL_H diff --git a/libnymea-zigbee/zigbeenodeendpoint.cpp b/libnymea-zigbee/zigbeenodeendpoint.cpp index 6ec23a0..ddf20ae 100644 --- a/libnymea-zigbee/zigbeenodeendpoint.cpp +++ b/libnymea-zigbee/zigbeenodeendpoint.cpp @@ -65,6 +65,7 @@ #include "zcl/ota/zigbeeclusterota.h" #include "zcl/hvac/zigbeeclusterthermostat.h" +#include "zcl/hvac/zigbeeclusterfancontrol.h" #include "zcl/smartenergy/zigbeeclustermetering.h" @@ -276,6 +277,8 @@ ZigbeeCluster *ZigbeeNodeEndpoint::createCluster(ZigbeeClusterLibrary::ClusterId // HVAC case ZigbeeClusterLibrary::ClusterIdThermostat: return new ZigbeeClusterThermostat(m_network, m_node, this, direction, this); + case ZigbeeClusterLibrary::ClusterIdFanControl: + return new ZigbeeClusterFanControl(m_network, m_node, this, direction, this); // Smart energy case ZigbeeClusterLibrary::ClusterIdMetering: