diff --git a/libnymea-zigbee/libnymea-zigbee.pro b/libnymea-zigbee/libnymea-zigbee.pro index 32c3258..85617e6 100644 --- a/libnymea-zigbee/libnymea-zigbee.pro +++ b/libnymea-zigbee/libnymea-zigbee.pro @@ -21,6 +21,7 @@ SOURCES += \ zcl/general/zigbeeclusterlevelcontrol.cpp \ zcl/general/zigbeeclusteronoff.cpp \ zcl/general/zigbeeclusterpowerconfiguration.cpp \ + zcl/hvac/zigbeeclusterthermostat.cpp \ zcl/lighting/zigbeeclustercolorcontrol.cpp \ zcl/measurement/zigbeeclusterilluminancemeasurment.cpp \ zcl/measurement/zigbeeclusteroccupancysensing.cpp \ @@ -74,6 +75,7 @@ HEADERS += \ zcl/general/zigbeeclusterlevelcontrol.h \ zcl/general/zigbeeclusteronoff.h \ zcl/general/zigbeeclusterpowerconfiguration.h \ + zcl/hvac/zigbeeclusterthermostat.h \ zcl/lighting/zigbeeclustercolorcontrol.h \ zcl/measurement/zigbeeclusterilluminancemeasurment.h \ zcl/measurement/zigbeeclusteroccupancysensing.h \ diff --git a/libnymea-zigbee/zcl/hvac/zigbeeclusterthermostat.cpp b/libnymea-zigbee/zcl/hvac/zigbeeclusterthermostat.cpp new file mode 100644 index 0000000..19c9531 --- /dev/null +++ b/libnymea-zigbee/zcl/hvac/zigbeeclusterthermostat.cpp @@ -0,0 +1,98 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, 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 "zigbeeclusterthermostat.h" + +#include "loggingcategory.h" +#include "zigbeeutils.h" + + +ZigbeeClusterThermostat::ZigbeeClusterThermostat(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, ZigbeeCluster::Direction direction, QObject *parent): + ZigbeeCluster(network, node, endpoint, ZigbeeClusterLibrary::ClusterIdThermostat, direction, parent) +{ + +} + +void ZigbeeClusterThermostat::processDataIndication(ZigbeeClusterLibrary::Frame frame) +{ + qCDebug(dcZigbeeCluster()) << "Processing cluster frame" << m_node << m_endpoint << this << frame; + + // Increase the tsn for continuous id increasing on both sides + m_transactionSequenceNumber = frame.header.transactionSequenceNumber; + +// switch (m_direction) { +// case Client: +// if (frame.header.frameControl.direction == ZigbeeClusterLibrary::DirectionClientToServer) { +// Command command = static_cast(frame.header.command); +// qCDebug(dcZigbeeCluster()) << "Received" << command << "from" << m_node << m_endpoint << this; +// switch (command) { +// case CommandQueryNextImageRequest: { +// // Print the image information +// quint8 fieldControl; +// quint16 manufacturerCode; +// quint16 imageType; +// quint32 currentVersion; +// quint16 hardwareVersion; + +// QDataStream requestStream(&frame.payload, QIODevice::ReadOnly); +// requestStream.setByteOrder(QDataStream::LittleEndian); +// requestStream >> fieldControl >> manufacturerCode >> imageType >> currentVersion >> hardwareVersion; +// qCDebug(dcZigbeeCluster()) << "OTA image request:" << (fieldControl == 0x0000 ? "Hardware version not present" : "Hardware version present"); +// qCDebug(dcZigbeeCluster()) << "OTA image request: Manufacturer code" << ZigbeeUtils::convertUint16ToHexString(manufacturerCode); +// qCDebug(dcZigbeeCluster()) << "OTA image request: Image type" << ZigbeeUtils::convertUint16ToHexString(imageType); +// qCDebug(dcZigbeeCluster()) << "OTA image request: Current file version" << ZigbeeUtils::convertUint32ToHexString(currentVersion) << parseFileVersion(currentVersion); +// qCDebug(dcZigbeeCluster()) << "OTA image request: Hardware version" << hardwareVersion; + +// // Respond with no image available until we implement the entire cluster for OTA updates +// qCDebug(dcZigbeeCluster()) << "OTA mechanism not implemented yet. Tell the node there is no image available."; + +// QByteArray payload; +// QDataStream stream(&payload, QIODevice::WriteOnly); +// stream.setByteOrder(QDataStream::LittleEndian); +// stream << static_cast(StatuCodeNoImageAvailable); + +// // Note: if there would be an image available, the response would be success, followed by manufacturer code, image type, file version of image and file size + +// ZigbeeClusterReply *reply = sendClusterServerResponse(CommandQueryNextImageResponse, frame.header.transactionSequenceNumber, payload); +// connect(reply, &ZigbeeClusterReply::finished, this, [](){ +// qCDebug(dcZigbeeCluster()) << "OTA image request response for image query sent successfully to requested node."; +// }); + +// break; +// } +// default: +// qCWarning(dcZigbeeCluster()) << "Received command" << command << "which is not implemented yet from" << m_node << m_endpoint << this; +// break; +// } +// } +// break; +// case Server: +// qCWarning(dcZigbeeCluster()) << "Unhandled ZCL indication in" << m_node << m_endpoint << this << frame; +// break; +// } + +} diff --git a/libnymea-zigbee/zcl/hvac/zigbeeclusterthermostat.h b/libnymea-zigbee/zcl/hvac/zigbeeclusterthermostat.h new file mode 100644 index 0000000..c3b481a --- /dev/null +++ b/libnymea-zigbee/zcl/hvac/zigbeeclusterthermostat.h @@ -0,0 +1,63 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, 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 ZIGBEECLUSTERTHERMOSTAT_H +#define ZIGBEECLUSTERTHERMOSTAT_H + +#include "zcl/zigbeecluster.h" + +class ZigbeeClusterThermostat : public ZigbeeCluster +{ + Q_OBJECT + + friend class ZigbeeNode; + friend class ZigbeeNetwork; + +public: + + enum Attribute { + AttributeLocalTemperature = 0x0000, + AttributeOutdoorTemperature = 0x0001, + AttributeOccupancy = 0x0002, + AttributeAbsMinHeatSetpointLimit = 0x0003, + AttributeAbsMaxHeatSetpointLimit = 0x0004, + AttributeAbsMinCoolSetpointLimit = 0x0005, + AttributeAbsMaxCoolSetpointLimit = 0x0006, + AttributePICoolingDemand = 0x0007, + AttributePIHeatingDemand = 0x0008, + AttributeHVACSystemTypeConfiguration = 0x0009 + }; + Q_ENUM(Attribute) + + explicit ZigbeeClusterThermostat(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr); + +protected: + void processDataIndication(ZigbeeClusterLibrary::Frame frame) override; + +}; + +#endif // ZIGBEECLUSTERTHERMOSTAT_H