From a22fdcedde0eb15ff2b18642d3ffab55f7f96f8c Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Wed, 1 Sep 2021 01:10:00 +0200 Subject: [PATCH] Add manufacturer specific philips cluster --- libnymea-zigbee/libnymea-zigbee.pro | 2 + ...gbeeclustermanufacturerspecificphilips.cpp | 74 +++++++++++++++++++ ...zigbeeclustermanufacturerspecificphilips.h | 73 ++++++++++++++++++ libnymea-zigbee/zcl/zigbeeclusterlibrary.h | 5 +- libnymea-zigbee/zigbeenodeendpoint.cpp | 6 ++ libnymea-zigbee/zigbeenodeendpoint.h | 2 + 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.cpp create mode 100644 libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h diff --git a/libnymea-zigbee/libnymea-zigbee.pro b/libnymea-zigbee/libnymea-zigbee.pro index c40284a..5367a6d 100644 --- a/libnymea-zigbee/libnymea-zigbee.pro +++ b/libnymea-zigbee/libnymea-zigbee.pro @@ -40,6 +40,7 @@ SOURCES += \ zcl/general/zigbeeclusterscenes.cpp \ zcl/hvac/zigbeeclusterthermostat.cpp \ zcl/lighting/zigbeeclustercolorcontrol.cpp \ + zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.cpp \ zcl/measurement/zigbeeclusterilluminancemeasurment.cpp \ zcl/measurement/zigbeeclusteroccupancysensing.cpp \ zcl/measurement/zigbeeclusterpressuremeasurement.cpp \ @@ -107,6 +108,7 @@ HEADERS += \ zcl/general/zigbeeclusterscenes.h \ zcl/hvac/zigbeeclusterthermostat.h \ zcl/lighting/zigbeeclustercolorcontrol.h \ + zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h \ zcl/measurement/zigbeeclusterilluminancemeasurment.h \ zcl/measurement/zigbeeclusteroccupancysensing.h \ zcl/measurement/zigbeeclusterpressuremeasurement.h \ diff --git a/libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.cpp b/libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.cpp new file mode 100644 index 0000000..30ce58a --- /dev/null +++ b/libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.cpp @@ -0,0 +1,74 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* 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 "zigbeeclustermanufacturerspecificphilips.h" +#include "zigbeenetworkreply.h" +#include "loggingcategory.h" +#include "zigbeenetwork.h" +#include "zigbeeutils.h" + +#include + +ZigbeeClusterManufacturerSpecificPhilips::ZigbeeClusterManufacturerSpecificPhilips(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent) : + ZigbeeCluster(network, node, endpoint, ZigbeeClusterLibrary::ClusterIdManufacturerSpecificPhilips, direction, parent) +{ + +} + +void ZigbeeClusterManufacturerSpecificPhilips::processDataIndication(ZigbeeClusterLibrary::Frame frame) +{ + qCDebug(dcZigbeeCluster()) << "Processing manufacturer specific (Philips) 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: + qCWarning(dcZigbeeCluster()) << "Unhandled ZCL indication in" << m_node << m_endpoint << this << frame; + break; + case Server: + if (frame.header.frameControl.direction == ZigbeeClusterLibrary::DirectionServerToClient) { + Command command = static_cast(frame.header.command); + switch (command) { + case CommandButtonPress: { + QDataStream payloadStream(frame.payload); + payloadStream.setByteOrder(QDataStream::LittleEndian); + quint8 button; quint16 unknown1; quint8 unknown2; quint8 operation; + payloadStream >> button >> unknown1 >> unknown2 >> operation; + qCDebug(dcZigbeeCluster()) << "Received manufacturer specific (Philips) button press. Button:" << button << "Operation:" << operation; + emit buttonPressed(button, Operation(operation)); + break; + } + default: + qCWarning(dcZigbeeCluster()) << "Unhandled ZCL indication in" << m_node << m_endpoint << this << frame; + } + } else { + qCWarning(dcZigbeeCluster()) << "Unhandled ZCL indication in" << m_node << m_endpoint << this << frame; + } + break; + } +} diff --git a/libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h b/libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h new file mode 100644 index 0000000..7aa8e61 --- /dev/null +++ b/libnymea-zigbee/zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h @@ -0,0 +1,73 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* 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 ZIGBEECLUSTERMANUFACTURERSPECIFICPHILIPS_H +#define ZIGBEECLUSTERMANUFACTURERSPECIFICPHILIPS_H + +#include + +#include "zcl/zigbeecluster.h" +#include "zcl/zigbeeclusterreply.h" + +class ZigbeeNode; +class ZigbeeNetwork; +class ZigbeeNodeEndpoint; +class ZigbeeNetworkReply; + +class ZigbeeClusterManufacturerSpecificPhilips : public ZigbeeCluster +{ + Q_OBJECT + + friend class ZigbeeNode; + friend class ZigbeeNetwork; + +public: + enum Command { + CommandButtonPress = 0x00, + }; + Q_ENUM(Command) + + enum Operation { + OperationButtonPress = 0x00, + OperationButtonHold = 0x01, + OperationButtonShortRelease = 0x02, + OperationButtonLongRelease = 0x03 + }; + Q_ENUM(Operation) + + explicit ZigbeeClusterManufacturerSpecificPhilips(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr); + +signals: + // Server cluster signals + void buttonPressed(quint8 button, Operation operation); + +protected: + void processDataIndication(ZigbeeClusterLibrary::Frame frame) override; + +}; + +#endif // ZIGBEECLUSTERMANUFACTURERSPECIFICPHILIPS_H diff --git a/libnymea-zigbee/zcl/zigbeeclusterlibrary.h b/libnymea-zigbee/zcl/zigbeeclusterlibrary.h index 59a5851..5db4ae4 100644 --- a/libnymea-zigbee/zcl/zigbeeclusterlibrary.h +++ b/libnymea-zigbee/zcl/zigbeeclusterlibrary.h @@ -188,7 +188,10 @@ public: ClusterIdDiagnostics = 0x0B05, // Zigbee green power - ClusterIdGreenPower = 0x0021 + ClusterIdGreenPower = 0x0021, + + // Manufacturer specific + ClusterIdManufacturerSpecificPhilips = 0xfc00, }; Q_ENUM(ClusterId) diff --git a/libnymea-zigbee/zigbeenodeendpoint.cpp b/libnymea-zigbee/zigbeenodeendpoint.cpp index a657a89..3d46197 100644 --- a/libnymea-zigbee/zigbeenodeendpoint.cpp +++ b/libnymea-zigbee/zigbeenodeendpoint.cpp @@ -230,6 +230,12 @@ ZigbeeCluster *ZigbeeNodeEndpoint::createCluster(ZigbeeClusterLibrary::ClusterId case ZigbeeClusterLibrary::ClusterIdThermostat: return new ZigbeeClusterThermostat(m_network, m_node, this, direction, this); + // Manufacturer specific + case ZigbeeClusterLibrary::ClusterIdManufacturerSpecificPhilips: + if (m_node->nodeDescriptor().manufacturerCode == Zigbee::Manufacturer::Philips) { + return new ZigbeeClusterManufacturerSpecificPhilips(m_network, m_node, this, direction, this); + } + // Intentional fallthrough! default: // Return a default cluster since we have no special implementation for this cluster, allowing to use generic clusters operations return new ZigbeeCluster(m_network, m_node, this, clusterId, direction, this); diff --git a/libnymea-zigbee/zigbeenodeendpoint.h b/libnymea-zigbee/zigbeenodeendpoint.h index 919417b..48cd1ff 100644 --- a/libnymea-zigbee/zigbeenodeendpoint.h +++ b/libnymea-zigbee/zigbeenodeendpoint.h @@ -70,6 +70,8 @@ #include "zcl/hvac/zigbeeclusterthermostat.h" +#include "zcl/manufacturerspecific/philips/zigbeeclustermanufacturerspecificphilips.h" + class ZigbeeNode; class ZigbeeNetwork;