Implement color control cluster and improve uart communication
This commit is contained in:
parent
b3f5a13548
commit
275e4c8b97
@ -224,9 +224,9 @@ ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::requestQuerySendDataCo
|
|||||||
ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::requestSendRequest(const ZigbeeNetworkRequest &request)
|
ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::requestSendRequest(const ZigbeeNetworkRequest &request)
|
||||||
{
|
{
|
||||||
// Send the request only if there are free slots on the device, otherwise enque request
|
// Send the request only if there are free slots on the device, otherwise enque request
|
||||||
// if (m_apsFreeSlotsAvailable) {
|
// if (m_apsFreeSlotsAvailable) {
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
qCDebug(dcZigbeeAps()) << "APSDE-DATA.request" << request;
|
qCDebug(dcZigbeeAps()) << "APSDE-DATA.request" << request;
|
||||||
ZigbeeInterfaceDeconzReply *interfaceReply = nullptr;
|
ZigbeeInterfaceDeconzReply *interfaceReply = nullptr;
|
||||||
@ -253,14 +253,14 @@ ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::requestSendRequest(con
|
|||||||
|
|
||||||
quint8 ZigbeeBridgeControllerDeconz::generateSequenceNumber()
|
quint8 ZigbeeBridgeControllerDeconz::generateSequenceNumber()
|
||||||
{
|
{
|
||||||
return m_sequenceNumber++;
|
m_sequenceNumber += 3;
|
||||||
|
return m_sequenceNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::createReply(Deconz::Command command, quint8 sequenceNumber, QObject *parent)
|
ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::createReply(Deconz::Command command, quint8 sequenceNumber, QObject *parent)
|
||||||
{
|
{
|
||||||
// Create the reply
|
// Create the reply
|
||||||
ZigbeeInterfaceDeconzReply *reply = new ZigbeeInterfaceDeconzReply(command, sequenceNumber, parent);
|
ZigbeeInterfaceDeconzReply *reply = new ZigbeeInterfaceDeconzReply(command, sequenceNumber, parent);
|
||||||
|
|
||||||
connect(reply, &ZigbeeInterfaceDeconzReply::timeout, this, [this, reply](){
|
connect(reply, &ZigbeeInterfaceDeconzReply::timeout, this, [this, reply](){
|
||||||
qCWarning(dcZigbeeController()) << "Reply timeout" << reply->command() << "SQN:" << reply->sequenceNumber();
|
qCWarning(dcZigbeeController()) << "Reply timeout" << reply->command() << "SQN:" << reply->sequenceNumber();
|
||||||
if (m_pendingReplies.contains(reply->sequenceNumber())) {
|
if (m_pendingReplies.contains(reply->sequenceNumber())) {
|
||||||
@ -414,7 +414,7 @@ ZigbeeInterfaceDeconzReply *ZigbeeBridgeControllerDeconz::readNetworkParameters(
|
|||||||
// If read request failes, this mehtod returns the status code of the failed request.
|
// If read request failes, this mehtod returns the status code of the failed request.
|
||||||
|
|
||||||
// Create an independent reply for finishing the entire read sequence
|
// Create an independent reply for finishing the entire read sequence
|
||||||
ZigbeeInterfaceDeconzReply *readNetworkParametersReply = new ZigbeeInterfaceDeconzReply(Deconz::CommandReadParameter, m_sequenceNumber, this);
|
ZigbeeInterfaceDeconzReply *readNetworkParametersReply = new ZigbeeInterfaceDeconzReply(Deconz::CommandReadParameter, generateSequenceNumber(), this);
|
||||||
connect(readNetworkParametersReply, &ZigbeeInterfaceDeconzReply::finished, readNetworkParametersReply, &ZigbeeInterfaceDeconzReply::deleteLater, Qt::QueuedConnection);
|
connect(readNetworkParametersReply, &ZigbeeInterfaceDeconzReply::finished, readNetworkParametersReply, &ZigbeeInterfaceDeconzReply::deleteLater, Qt::QueuedConnection);
|
||||||
|
|
||||||
// Read MAC address of the bridge
|
// Read MAC address of the bridge
|
||||||
@ -934,22 +934,28 @@ void ZigbeeBridgeControllerDeconz::onInterfacePackageReceived(const QByteArray &
|
|||||||
<< status << "Frame length:" << frameLength << ZigbeeUtils::convertByteArrayToHexString(data);
|
<< status << "Frame length:" << frameLength << ZigbeeUtils::convertByteArrayToHexString(data);
|
||||||
|
|
||||||
// Check if this is an interface response for a pending reply
|
// Check if this is an interface response for a pending reply
|
||||||
if (m_pendingReplies.contains(sequenceNumber) && m_pendingReplies.value(sequenceNumber)->command() == command) {
|
if (m_pendingReplies.contains(sequenceNumber)) {
|
||||||
ZigbeeInterfaceDeconzReply *reply = m_pendingReplies.take(sequenceNumber);
|
if (m_pendingReplies.value(sequenceNumber)->command() == command) {
|
||||||
if (!reply) {
|
// SQN and command maches
|
||||||
qCWarning(dcZigbeeController()) << "Received message but the corresponding reply does not exist any more.";
|
ZigbeeInterfaceDeconzReply *reply = m_pendingReplies.take(sequenceNumber);
|
||||||
|
if (!reply) {
|
||||||
|
qCWarning(dcZigbeeController()) << "Received message but the corresponding reply does not exist any more.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
reply->m_responseData = data;
|
||||||
|
reply->m_statusCode = status;
|
||||||
|
reply->finished();
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
qCWarning(dcZigbeeController()) << "Received message with a pending request SQN but the command does not match. SQN mismatch.";
|
||||||
|
qCWarning(dcZigbeeController()) << "The SQN matches" << m_pendingReplies.value(sequenceNumber)->command() << "but command" << command << "received for SQN" << sequenceNumber;
|
||||||
}
|
}
|
||||||
reply->m_responseData = data;
|
|
||||||
reply->m_statusCode = status;
|
|
||||||
reply->finished();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: we got a notification, lets set the current sequence number to the notification id,
|
// Note: we got a notification, lets set the current sequence number to the notification id,
|
||||||
// so the next request will be a continuouse increase
|
// so the next request will be a continuouse increase
|
||||||
|
|
||||||
m_sequenceNumber = sequenceNumber + 1;
|
//m_sequenceNumber = sequenceNumber + 10;
|
||||||
|
|
||||||
// No request for this data, lets check which notification and process the data
|
// No request for this data, lets check which notification and process the data
|
||||||
switch (command) {
|
switch (command) {
|
||||||
|
|||||||
@ -110,6 +110,8 @@ private:
|
|||||||
Deconz::NetworkState m_networkState = Deconz::NetworkStateOffline;
|
Deconz::NetworkState m_networkState = Deconz::NetworkStateOffline;
|
||||||
QTimer *m_watchdogTimer = nullptr;
|
QTimer *m_watchdogTimer = nullptr;
|
||||||
|
|
||||||
|
// Interface queue, send all requests sequentially and always wait for the interface response
|
||||||
|
|
||||||
// APS request queue
|
// APS request queue
|
||||||
bool m_apsFreeSlotsAvailable = false;
|
bool m_apsFreeSlotsAvailable = false;
|
||||||
QQueue<ZigbeeNetworkRequest> m_requestQueue;
|
QQueue<ZigbeeNetworkRequest> m_requestQueue;
|
||||||
@ -120,6 +122,7 @@ private:
|
|||||||
ZigbeeInterfaceDeconzReply *createReply(Deconz::Command command, quint8 sequenceNumber, QObject *parent);
|
ZigbeeInterfaceDeconzReply *createReply(Deconz::Command command, quint8 sequenceNumber, QObject *parent);
|
||||||
|
|
||||||
// Send data depending on the request destination address mode
|
// Send data depending on the request destination address mode
|
||||||
|
QByteArray buildRequestEnqueueSendDataGroupMessage(quint8 requestId, quint16 groupAddress, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
||||||
ZigbeeInterfaceDeconzReply *requestEnqueueSendDataGroup(quint8 requestId, quint16 groupAddress, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
ZigbeeInterfaceDeconzReply *requestEnqueueSendDataGroup(quint8 requestId, quint16 groupAddress, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
||||||
ZigbeeInterfaceDeconzReply *requestEnqueueSendDataShortAddress(quint8 requestId, quint16 shortAddress, quint8 destinationEndpoint, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
ZigbeeInterfaceDeconzReply *requestEnqueueSendDataShortAddress(quint8 requestId, quint16 shortAddress, quint8 destinationEndpoint, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
||||||
ZigbeeInterfaceDeconzReply *requestEnqueueSendDataIeeeAddress(quint8 requestId, ZigbeeAddress ieeeAddress, quint8 destinationEndpoint, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
ZigbeeInterfaceDeconzReply *requestEnqueueSendDataIeeeAddress(quint8 requestId, ZigbeeAddress ieeeAddress, quint8 destinationEndpoint, quint16 profileId, quint16 clusterId, quint8 sourceEndpoint, const QByteArray &asdu, Zigbee::ZigbeeTxOptions txOptions, quint8 radius = 0);
|
||||||
|
|||||||
@ -284,6 +284,7 @@ void ZigbeeNetworkDeconz::setCreateNetworkState(ZigbeeNetworkDeconz::CreateNetwo
|
|||||||
case CreateNetworkStateInitializeCoordinatorNode: {
|
case CreateNetworkStateInitializeCoordinatorNode: {
|
||||||
if (m_coordinatorNode) {
|
if (m_coordinatorNode) {
|
||||||
qCDebug(dcZigbeeNetwork()) << "We already have the coordinator node. Network starting done.";
|
qCDebug(dcZigbeeNetwork()) << "We already have the coordinator node. Network starting done.";
|
||||||
|
m_database->saveNode(m_coordinatorNode);
|
||||||
m_initializing = false;
|
m_initializing = false;
|
||||||
setState(StateRunning);
|
setState(StateRunning);
|
||||||
setPermitJoiningInternal(false);
|
setPermitJoiningInternal(false);
|
||||||
@ -417,7 +418,7 @@ void ZigbeeNetworkDeconz::startNetworkInternally()
|
|||||||
|
|
||||||
m_createNewNetwork = false;
|
m_createNewNetwork = false;
|
||||||
// Check if we have to create a pan ID and select the channel
|
// Check if we have to create a pan ID and select the channel
|
||||||
if (panId() == 0) {
|
if (panId() == 0 || !m_coordinatorNode) {
|
||||||
m_createNewNetwork = true;
|
m_createNewNetwork = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,8 +498,25 @@ void ZigbeeNetworkDeconz::startNetworkInternally()
|
|||||||
if (m_controller->networkState() == Deconz::NetworkStateConnected) {
|
if (m_controller->networkState() == Deconz::NetworkStateConnected) {
|
||||||
qCDebug(dcZigbeeNetwork()) << "The network is already running.";
|
qCDebug(dcZigbeeNetwork()) << "The network is already running.";
|
||||||
m_initializing = false;
|
m_initializing = false;
|
||||||
setState(StateRunning);
|
setPermitJoining(false);
|
||||||
setPermitJoiningInternal(false);
|
// Set the permit joining timeout network configuration parameter
|
||||||
|
QByteArray parameterData;
|
||||||
|
QDataStream stream(¶meterData, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(0);
|
||||||
|
|
||||||
|
ZigbeeInterfaceDeconzReply *reply = m_controller->requestWriteParameter(Deconz::ParameterPermitJoin, parameterData);
|
||||||
|
connect(reply, &ZigbeeInterfaceDeconzReply::finished, this, [this, reply](){
|
||||||
|
if (reply->statusCode() != Deconz::StatusCodeSuccess) {
|
||||||
|
qCWarning(dcZigbeeController()) << "Request" << reply->command() << "finished with error" << reply->statusCode();
|
||||||
|
// FIXME: set an appropriate error
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qCDebug(dcZigbeeNetwork()) << "Set permit join configuration request finished" << reply->statusCode();
|
||||||
|
setState(StateRunning);
|
||||||
|
});
|
||||||
|
|
||||||
} else if (m_controller->networkState() == Deconz::NetworkStateOffline) {
|
} else if (m_controller->networkState() == Deconz::NetworkStateOffline) {
|
||||||
m_initializing = true;
|
m_initializing = true;
|
||||||
qCDebug(dcZigbeeNetwork()) << "The network is offline. Lets start it";
|
qCDebug(dcZigbeeNetwork()) << "The network is offline. Lets start it";
|
||||||
|
|||||||
@ -11,6 +11,7 @@ SOURCES += \
|
|||||||
zcl/general/zigbeeclusteridentify.cpp \
|
zcl/general/zigbeeclusteridentify.cpp \
|
||||||
zcl/general/zigbeeclusterlevelcontrol.cpp \
|
zcl/general/zigbeeclusterlevelcontrol.cpp \
|
||||||
zcl/general/zigbeeclusteronoff.cpp \
|
zcl/general/zigbeeclusteronoff.cpp \
|
||||||
|
zcl/lighting/zigbeeclustercolorcontrol.cpp \
|
||||||
zcl/measurement/zigbeeclusterilluminancemeasurment.cpp \
|
zcl/measurement/zigbeeclusterilluminancemeasurment.cpp \
|
||||||
zcl/measurement/zigbeeclusteroccupancysensing.cpp \
|
zcl/measurement/zigbeeclusteroccupancysensing.cpp \
|
||||||
zcl/measurement/zigbeeclusterrelativehumiditymeasurement.cpp \
|
zcl/measurement/zigbeeclusterrelativehumiditymeasurement.cpp \
|
||||||
@ -60,6 +61,7 @@ HEADERS += \
|
|||||||
zcl/general/zigbeeclusteridentify.h \
|
zcl/general/zigbeeclusteridentify.h \
|
||||||
zcl/general/zigbeeclusterlevelcontrol.h \
|
zcl/general/zigbeeclusterlevelcontrol.h \
|
||||||
zcl/general/zigbeeclusteronoff.h \
|
zcl/general/zigbeeclusteronoff.h \
|
||||||
|
zcl/lighting/zigbeeclustercolorcontrol.h \
|
||||||
zcl/measurement/zigbeeclusterilluminancemeasurment.h \
|
zcl/measurement/zigbeeclusterilluminancemeasurment.h \
|
||||||
zcl/measurement/zigbeeclusteroccupancysensing.h \
|
zcl/measurement/zigbeeclusteroccupancysensing.h \
|
||||||
zcl/measurement/zigbeeclusterrelativehumiditymeasurement.h \
|
zcl/measurement/zigbeeclusterrelativehumiditymeasurement.h \
|
||||||
|
|||||||
@ -38,12 +38,12 @@ ZigbeeClusterLevelControl::ZigbeeClusterLevelControl(ZigbeeNetwork *network, Zig
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandMoveToLevel(quint8 level, quint16 transistionTime)
|
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandMoveToLevel(quint8 level, quint16 transitionTime)
|
||||||
{
|
{
|
||||||
QByteArray payload;
|
QByteArray payload;
|
||||||
QDataStream stream(&payload, QIODevice::WriteOnly);
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
stream << level << transistionTime;
|
stream << level << transitionTime;
|
||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMoveToLevel, payload);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMoveToLevel, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,12 +56,12 @@ ZigbeeClusterReply *ZigbeeClusterLevelControl::commandMove(ZigbeeClusterLevelCon
|
|||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMove, payload);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMove, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandStep(ZigbeeClusterLevelControl::FadeMode fadeMode, quint8 stepSize, quint16 transistionTime)
|
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandStep(ZigbeeClusterLevelControl::FadeMode fadeMode, quint8 stepSize, quint16 transitionTime)
|
||||||
{
|
{
|
||||||
QByteArray payload;
|
QByteArray payload;
|
||||||
QDataStream stream(&payload, QIODevice::WriteOnly);
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
stream << static_cast<quint8>(fadeMode) << stepSize << transistionTime;
|
stream << static_cast<quint8>(fadeMode) << stepSize << transitionTime;
|
||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandStep, payload);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandStep, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,12 +70,12 @@ ZigbeeClusterReply *ZigbeeClusterLevelControl::commandStop()
|
|||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandStop);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandStop);
|
||||||
}
|
}
|
||||||
|
|
||||||
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandMoveToLevelWithOnOff(quint8 level, quint16 transistionTime)
|
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandMoveToLevelWithOnOff(quint8 level, quint16 transitionTime)
|
||||||
{
|
{
|
||||||
QByteArray payload;
|
QByteArray payload;
|
||||||
QDataStream stream(&payload, QIODevice::WriteOnly);
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
stream << level << transistionTime;
|
stream << level << transitionTime;
|
||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMoveToLevelWithOnOff, payload);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMoveToLevelWithOnOff, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,12 +88,12 @@ ZigbeeClusterReply *ZigbeeClusterLevelControl::commandMoveWithOnOff(ZigbeeCluste
|
|||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMoveWithOnOff, payload);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandMoveWithOnOff, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandStepWithOnOff(ZigbeeClusterLevelControl::FadeMode fadeMode, quint8 stepSize, quint16 transistionTime)
|
ZigbeeClusterReply *ZigbeeClusterLevelControl::commandStepWithOnOff(ZigbeeClusterLevelControl::FadeMode fadeMode, quint8 stepSize, quint16 transitionTime)
|
||||||
{
|
{
|
||||||
QByteArray payload;
|
QByteArray payload;
|
||||||
QDataStream stream(&payload, QIODevice::WriteOnly);
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
stream << static_cast<quint8>(fadeMode) << stepSize << transistionTime;
|
stream << static_cast<quint8>(fadeMode) << stepSize << transitionTime;
|
||||||
return executeClusterCommand(ZigbeeClusterLevelControl::CommandStepWithOnOff, payload);
|
return executeClusterCommand(ZigbeeClusterLevelControl::CommandStepWithOnOff, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -83,15 +83,15 @@ public:
|
|||||||
|
|
||||||
explicit ZigbeeClusterLevelControl(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr);
|
explicit ZigbeeClusterLevelControl(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr);
|
||||||
|
|
||||||
ZigbeeClusterReply *commandMoveToLevel(quint8 level, quint16 transistionTime = 0xffff);
|
ZigbeeClusterReply *commandMoveToLevel(quint8 level, quint16 transitionTime = 0xffff);
|
||||||
ZigbeeClusterReply *commandMove(MoveMode moveMode, quint8 rate = 0xff);
|
ZigbeeClusterReply *commandMove(MoveMode moveMode, quint8 rate = 0xff);
|
||||||
ZigbeeClusterReply *commandStep(FadeMode fadeMode, quint8 stepSize = 0x01, quint16 transistionTime = 0xffff);
|
ZigbeeClusterReply *commandStep(FadeMode fadeMode, quint8 stepSize = 0x01, quint16 transitionTime = 0xffff);
|
||||||
ZigbeeClusterReply *commandStop();
|
ZigbeeClusterReply *commandStop();
|
||||||
|
|
||||||
// With on/off
|
// With on/off
|
||||||
ZigbeeClusterReply *commandMoveToLevelWithOnOff(quint8 level, quint16 transistionTime = 0xffff);
|
ZigbeeClusterReply *commandMoveToLevelWithOnOff(quint8 level, quint16 transitionTime = 0xffff);
|
||||||
ZigbeeClusterReply *commandMoveWithOnOff(MoveMode moveMode, quint8 rate = 0xff);
|
ZigbeeClusterReply *commandMoveWithOnOff(MoveMode moveMode, quint8 rate = 0xff);
|
||||||
ZigbeeClusterReply *commandStepWithOnOff(FadeMode fadeMode, quint8 stepSize = 0x01, quint16 transistionTime = 0xffff);
|
ZigbeeClusterReply *commandStepWithOnOff(FadeMode fadeMode, quint8 stepSize = 0x01, quint16 transitionTime = 0xffff);
|
||||||
ZigbeeClusterReply *commandStopWithOnOff();
|
ZigbeeClusterReply *commandStopWithOnOff();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
233
libnymea-zigbee/zcl/lighting/zigbeeclustercolorcontrol.cpp
Normal file
233
libnymea-zigbee/zcl/lighting/zigbeeclustercolorcontrol.cpp
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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 "zigbeeclustercolorcontrol.h"
|
||||||
|
#include "zigbeenetworkreply.h"
|
||||||
|
#include "loggingcategory.h"
|
||||||
|
#include "zigbeenetwork.h"
|
||||||
|
|
||||||
|
#include <QDataStream>
|
||||||
|
|
||||||
|
ZigbeeClusterColorControl::ZigbeeClusterColorControl(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, ZigbeeCluster::Direction direction, QObject *parent) :
|
||||||
|
ZigbeeCluster(network, node, endpoint, Zigbee::ClusterIdColorControl, direction, parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Send the move to \a hue command with the given \a direction and \a transitionTime. The transition time has the unit 1/10 seconds. */
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveToHue(quint8 hue, ZigbeeClusterColorControl::MoveDirection direction, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << hue << static_cast<quint8>(direction) << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveToHue, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveHue(ZigbeeClusterColorControl::MoveMode moveMode, quint8 rate)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(moveMode) << rate;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveHue, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Send the step hue command with the given \a stepMode, \a stepSize and \a transitionTime. The transition time has the unit 1/10 seconds. */
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandStepHue(ZigbeeClusterColorControl::StepMode stepMode, quint8 stepSize, quint8 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(stepMode) << stepSize << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandStepHue, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveToSaturation(quint8 saturation, ZigbeeClusterColorControl::MoveDirection direction, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << saturation << static_cast<quint8>(direction) << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveToSaturation, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveSaturation(ZigbeeClusterColorControl::MoveMode moveMode, quint8 rate)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(moveMode) << rate;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveSaturation, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandStepSaturation(ZigbeeClusterColorControl::StepMode stepMode, quint8 stepSize, quint8 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(stepMode) << stepSize << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandStepSaturation, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveToHueAndSaturation(quint8 hue, quint8 saturation, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << hue << saturation << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveToHueAndSaturation, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveToColor(quint16 colorX, quint16 colorY, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << colorX << colorY << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveToColor, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveColor(quint16 colorXRate, quint16 colorYRate)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << colorXRate << colorYRate;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveColor, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandStepColor(quint16 stepX, quint16 stepY, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << stepX << stepY << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandStepColor, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveToColorTemperature(quint16 colorTemperatureMireds, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << colorTemperatureMireds << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveToColorTemperature, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandEnhancedMoveToHue(quint16 enhancedHue, ZigbeeClusterColorControl::MoveDirection direction, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << enhancedHue << static_cast<quint8>(direction) << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandEnhancedMoveHue, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandEnhancedMoveHue(ZigbeeClusterColorControl::MoveMode moveMode, quint16 rate)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(moveMode) << rate;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandEnhancedMoveHue, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandEnhancedStepHue(ZigbeeClusterColorControl::StepMode stepMode, quint16 stepSize, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(stepMode) << stepSize << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandEnhancedStepHue, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandEnhancedMoveToHueAndSaturation(quint16 enhancedHue, quint8 saturation, quint16 transitionTime)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << enhancedHue << saturation << transitionTime;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandEnhancedMoveToHueAndSaturation, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandColorLoopSet(ColorLoopUpdateFlags updateFlag, ZigbeeClusterColorControl::ColorLoopAction action, ZigbeeClusterColorControl::ColorLoopDirection direction, quint16 time, quint16 startHue)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(updateFlag);
|
||||||
|
stream << static_cast<quint8>(action);
|
||||||
|
stream << static_cast<quint8>(direction);
|
||||||
|
stream << time << startHue;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandColorLoopSet, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandStopMoveStep()
|
||||||
|
{
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandStopMoveStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandMoveColorTemperature(ZigbeeClusterColorControl::MoveMode moveMode, quint16 rate, quint16 minColorTemperature, quint16 maxColorTemperature)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(moveMode) << rate << minColorTemperature << maxColorTemperature;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandMoveColorTemperature, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigbeeClusterReply *ZigbeeClusterColorControl::commandStepColorTemperature(ZigbeeClusterColorControl::StepMode stepMode, quint16 stepSize, quint16 transitionTime, quint16 minColorTemperature, quint16 maxColorTemperature)
|
||||||
|
{
|
||||||
|
QByteArray payload;
|
||||||
|
QDataStream stream(&payload, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint8>(stepMode) << stepSize << transitionTime << minColorTemperature << maxColorTemperature;
|
||||||
|
return executeClusterCommand(ZigbeeClusterColorControl::CommandStepColorTemperature, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZigbeeClusterColorControl::setAttribute(const ZigbeeClusterAttribute &attribute)
|
||||||
|
{
|
||||||
|
qCDebug(dcZigbeeCluster()) << "Update attribute" << m_node << m_endpoint << this << static_cast<Attribute>(attribute.id()) << attribute.dataType();
|
||||||
|
if (hasAttribute(attribute.id())) {
|
||||||
|
m_attributes[attribute.id()] = attribute;
|
||||||
|
emit attributeChanged(attribute);
|
||||||
|
} else {
|
||||||
|
m_attributes.insert(attribute.id(), attribute);
|
||||||
|
emit attributeChanged(attribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZigbeeClusterColorControl::processDataIndication(ZigbeeClusterLibrary::Frame frame)
|
||||||
|
{
|
||||||
|
qCDebug(dcZigbeeCluster()) << "Processing cluster frame" << m_node << m_endpoint << this << frame;
|
||||||
|
|
||||||
|
// Increase the tsn for continuouse id increasing on both sides
|
||||||
|
m_transactionSequenceNumber = frame.header.transactionSequenceNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
246
libnymea-zigbee/zcl/lighting/zigbeeclustercolorcontrol.h
Normal file
246
libnymea-zigbee/zcl/lighting/zigbeeclustercolorcontrol.h
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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 ZIGBEECLUSTERCOLORCONTROL_H
|
||||||
|
#define ZIGBEECLUSTERCOLORCONTROL_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "zcl/zigbeecluster.h"
|
||||||
|
#include "zcl/zigbeeclusterreply.h"
|
||||||
|
|
||||||
|
class ZigbeeNode;
|
||||||
|
class ZigbeeNetwork;
|
||||||
|
class ZigbeeNodeEndpoint;
|
||||||
|
class ZigbeeNetworkReply;
|
||||||
|
|
||||||
|
class ZigbeeClusterColorControl : public ZigbeeCluster
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
friend class ZigbeeNode;
|
||||||
|
friend class ZigbeeNetwork;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum Attribute {
|
||||||
|
// Color information
|
||||||
|
AttributeCurrentHue = 0x0000,
|
||||||
|
AttributeCurrentSaturation = 0x0001,
|
||||||
|
AttributeRemainingTime = 0x0002,
|
||||||
|
AttributeCurrentX = 0x0003,
|
||||||
|
AttributeCurrentY = 0x0004,
|
||||||
|
AttributeDriftCompensation = 0x0005,
|
||||||
|
AttributeCompensationText = 0x0006,
|
||||||
|
AttributeColorTemperatureMireds = 0x0007,
|
||||||
|
AttributeColorMode = 0x0008,
|
||||||
|
AttributeEnhancedCurrentHue = 0x4000,
|
||||||
|
AttributeEnhancedColorMode = 0x4001,
|
||||||
|
AttributeColorLoopActive = 0x4002,
|
||||||
|
AttributeColorLoopDirection = 0x4003,
|
||||||
|
AttributeColorLoopTime = 0x4004,
|
||||||
|
AttributeColorLoopStartEnhancedHue = 0x4005,
|
||||||
|
AttributeColorLoopStoredEnhancedHue = 0x4006,
|
||||||
|
AttributeColorCapabilities = 0x400a,
|
||||||
|
AttributeColorTempPhysicalMinMireds = 0x400b,
|
||||||
|
AttributeColorTempPhysicalMaxMireds = 0x400c,
|
||||||
|
// Primaries information
|
||||||
|
AttributeNumberOfPrimaries = 0x0010,
|
||||||
|
AttributePrimary1X = 0x0011,
|
||||||
|
AttributePrimary1Y = 0x0012,
|
||||||
|
AttributePrimary1Intensity = 0x0013,
|
||||||
|
AttributePrimary2X = 0x0015,
|
||||||
|
AttributePrimary2Y = 0x0016,
|
||||||
|
AttributePrimary2Intensity = 0x0017,
|
||||||
|
AttributePrimary3X = 0x0019,
|
||||||
|
AttributePrimary3Y = 0x001a,
|
||||||
|
AttributePrimary3Intensity = 0x001b,
|
||||||
|
// Additional primaries information
|
||||||
|
AttributePrimary4X = 0x0020,
|
||||||
|
AttributePrimary4Y = 0x0021,
|
||||||
|
AttributePrimary4Intensity = 0x0022,
|
||||||
|
AttributePrimary5X = 0x0024,
|
||||||
|
AttributePrimary5Y = 0x0025,
|
||||||
|
AttributePrimary5Intensity = 0x0026,
|
||||||
|
AttributePrimary6X = 0x0028,
|
||||||
|
AttributePrimary6Y = 0x0029,
|
||||||
|
AttributePrimary6Intensity = 0x002a,
|
||||||
|
// Defined color points settings
|
||||||
|
AttributeWhitePointX = 0x0030,
|
||||||
|
AttributeWhitePointY = 0x0031,
|
||||||
|
AttributeColorPointRX = 0x0032,
|
||||||
|
AttributeColorPointRY = 0x0033,
|
||||||
|
AttributeColorPointRIntensity = 0x0034,
|
||||||
|
AttributeColorPointGX = 0x0036,
|
||||||
|
AttributeColorPointGY = 0x0037,
|
||||||
|
AttributeColorPointGIntensity = 0x0038,
|
||||||
|
AttributeColorPointBX = 0x003a,
|
||||||
|
AttributeColorPointBY = 0x003b,
|
||||||
|
AttributeColorPointBIntensity = 0x003c
|
||||||
|
};
|
||||||
|
Q_ENUM(Attribute)
|
||||||
|
|
||||||
|
enum DriftCompensation {
|
||||||
|
DriftCompensationNone = 0x00,
|
||||||
|
DriftCompensationOther = 0x01,
|
||||||
|
DriftCompensationTemperatureMonitoring = 0x02,
|
||||||
|
DriftCompensationOpticalLuminanceMonitoring = 0x03,
|
||||||
|
DriftCompensationOpticalColorMonitoring = 0x04
|
||||||
|
};
|
||||||
|
Q_ENUM(DriftCompensation)
|
||||||
|
|
||||||
|
enum ColorMode {
|
||||||
|
ColorModeHueSaturation = 0x00,
|
||||||
|
ColorModeXY = 0x01,
|
||||||
|
ColorModeColorTemperatureMired = 0x02
|
||||||
|
};
|
||||||
|
Q_ENUM(ColorMode)
|
||||||
|
|
||||||
|
enum EnhancedColorMode {
|
||||||
|
EnhancedColorModeCurrentHueSaturation = 0x00,
|
||||||
|
EnhancedColorModeCurrentXY = 0x01,
|
||||||
|
EnhancedColorModeColorTemperatureMireds = 0x02,
|
||||||
|
EnhancedColorModeEnhancedCurrentHueSaturation = 0x03
|
||||||
|
};
|
||||||
|
Q_ENUM(EnhancedColorMode)
|
||||||
|
|
||||||
|
|
||||||
|
enum ColorCapability {
|
||||||
|
ColorCapabilityHueSaturation = 0x01,
|
||||||
|
ColorCapabilityEnhancedHue = 0x02,
|
||||||
|
ColorCapabilityColorLoop = 0x04,
|
||||||
|
ColorCapabilityXY = 0x08,
|
||||||
|
ColorCapabilityColorTemperature = 0x10
|
||||||
|
};
|
||||||
|
Q_ENUM(ColorCapability)
|
||||||
|
Q_DECLARE_FLAGS(ColorCapabilities, ColorCapability)
|
||||||
|
|
||||||
|
enum Command {
|
||||||
|
CommandMoveToHue = 0x00,
|
||||||
|
CommandMoveHue = 0x01,
|
||||||
|
CommandStepHue = 0x02,
|
||||||
|
CommandMoveToSaturation = 0x03,
|
||||||
|
CommandMoveSaturation = 0x04,
|
||||||
|
CommandStepSaturation = 0x05,
|
||||||
|
CommandMoveToHueAndSaturation = 0x06,
|
||||||
|
CommandMoveToColor = 0x07,
|
||||||
|
CommandMoveColor = 0x08,
|
||||||
|
CommandStepColor = 0x09,
|
||||||
|
CommandMoveToColorTemperature = 0x0a,
|
||||||
|
CommandEnhancedMoveToHue = 0x40,
|
||||||
|
CommandEnhancedMoveHue = 0x41,
|
||||||
|
CommandEnhancedStepHue = 0x42,
|
||||||
|
CommandEnhancedMoveToHueAndSaturation = 0x43,
|
||||||
|
CommandColorLoopSet = 0x44,
|
||||||
|
CommandStopMoveStep = 0x47,
|
||||||
|
CommandMoveColorTemperature = 0x4b,
|
||||||
|
CommandStepColorTemperature = 0x4c
|
||||||
|
};
|
||||||
|
Q_ENUM(Command)
|
||||||
|
|
||||||
|
enum MoveDirection {
|
||||||
|
MoveDirectionShortestDistance = 0x00,
|
||||||
|
MoveDirectionLongestDistance = 0x01,
|
||||||
|
MoveDirectionUp = 0x02,
|
||||||
|
MoveDirectionDown = 0x03
|
||||||
|
};
|
||||||
|
Q_ENUM(MoveDirection)
|
||||||
|
|
||||||
|
enum MoveMode {
|
||||||
|
MoveModeStop = 0x00,
|
||||||
|
MoveModeUp = 0x01,
|
||||||
|
MoveModeDown = 0x02
|
||||||
|
};
|
||||||
|
Q_ENUM(MoveMode)
|
||||||
|
|
||||||
|
enum StepMode {
|
||||||
|
StepModeUp = 0x01,
|
||||||
|
StepModeDown = 0x03
|
||||||
|
};
|
||||||
|
Q_ENUM(StepMode)
|
||||||
|
|
||||||
|
// For the color loop command
|
||||||
|
enum ColorLoopUpdate {
|
||||||
|
ColorLoopUpdateAction = 0x01,
|
||||||
|
ColorLoopUpdateDirection = 0x02,
|
||||||
|
ColorLoopUpdateTime = 0x04,
|
||||||
|
ColorLoopUpdateStartHue = 0x08
|
||||||
|
};
|
||||||
|
Q_ENUM(ColorLoopUpdate)
|
||||||
|
Q_DECLARE_FLAGS(ColorLoopUpdateFlags, ColorLoopUpdate)
|
||||||
|
|
||||||
|
enum ColorLoopAction {
|
||||||
|
ColorLoopActionDeactivate = 0x00,
|
||||||
|
ColorLoopActionActivateColorLoopStartEnhancedHue = 0x01,
|
||||||
|
ColorLoopActionActivateEnhancedCurrentHue = 0x02
|
||||||
|
};
|
||||||
|
Q_ENUM(ColorLoopAction)
|
||||||
|
|
||||||
|
enum ColorLoopDirection {
|
||||||
|
ColorLoopDirectionDecrementHue = 0x00,
|
||||||
|
ColorLoopDirectionIncrementHue = 0x01
|
||||||
|
};
|
||||||
|
Q_ENUM(ColorLoopDirection)
|
||||||
|
|
||||||
|
explicit ZigbeeClusterColorControl(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
ZigbeeClusterReply *commandMoveToHue(quint8 hue, MoveDirection direction, quint16 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandMoveHue(MoveMode moveMode, quint8 rate);
|
||||||
|
ZigbeeClusterReply *commandStepHue(StepMode stepMode, quint8 stepSize, quint8 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandMoveToSaturation(quint8 saturation, MoveDirection direction, quint16 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandMoveSaturation(MoveMode moveMode, quint8 rate);
|
||||||
|
ZigbeeClusterReply *commandStepSaturation(StepMode stepMode, quint8 stepSize, quint8 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandMoveToHueAndSaturation(quint8 hue, quint8 saturation, quint16 transitionTime);
|
||||||
|
|
||||||
|
ZigbeeClusterReply *commandMoveToColor(quint16 colorX, quint16 colorY, quint16 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandMoveColor(quint16 colorXRate, quint16 colorYRate);
|
||||||
|
ZigbeeClusterReply *commandStepColor(quint16 stepX, quint16 stepY, quint16 transitionTime);
|
||||||
|
|
||||||
|
ZigbeeClusterReply *commandEnhancedMoveToHue(quint16 enhancedHue, MoveDirection direction, quint16 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandEnhancedMoveHue(MoveMode moveMode, quint16 rate);
|
||||||
|
ZigbeeClusterReply *commandEnhancedStepHue(StepMode stepMode, quint16 stepSize, quint16 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandEnhancedMoveToHueAndSaturation(quint16 enhancedHue, quint8 saturation, quint16 transitionTime);
|
||||||
|
|
||||||
|
ZigbeeClusterReply *commandColorLoopSet(ColorLoopUpdateFlags updateFlag, ColorLoopAction action, ColorLoopDirection direction, quint16 time, quint16 startHue);
|
||||||
|
ZigbeeClusterReply *commandStopMoveStep();
|
||||||
|
|
||||||
|
ZigbeeClusterReply *commandMoveToColorTemperature(quint16 colorTemperatureMireds, quint16 transitionTime);
|
||||||
|
ZigbeeClusterReply *commandMoveColorTemperature(MoveMode moveMode, quint16 rate, quint16 minColorTemperature, quint16 maxColorTemperature);
|
||||||
|
ZigbeeClusterReply *commandStepColorTemperature(StepMode stepMode, quint16 stepSize, quint16 transitionTime, quint16 minColorTemperature, quint16 maxColorTemperature);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setAttribute(const ZigbeeClusterAttribute &attribute) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void processDataIndication(ZigbeeClusterLibrary::Frame frame) override;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_OPERATORS_FOR_FLAGS(ZigbeeClusterColorControl::ColorCapabilities)
|
||||||
|
Q_DECLARE_OPERATORS_FOR_FLAGS(ZigbeeClusterColorControl::ColorLoopUpdateFlags)
|
||||||
|
|
||||||
|
#endif // ZIGBEECLUSTERCOLORCONTROL_H
|
||||||
@ -90,39 +90,6 @@ public:
|
|||||||
// };
|
// };
|
||||||
// Q_ENUM(PowerConfigurationAttribute)
|
// Q_ENUM(PowerConfigurationAttribute)
|
||||||
|
|
||||||
|
|
||||||
// // Color cluster 0x0300
|
|
||||||
|
|
||||||
// enum ColorControlClusterAttribute {
|
|
||||||
// ColorControlClusterAttributeCurrentHue = 0x0000,
|
|
||||||
// ColorControlClusterAttributeCurrentSaturation = 0x0001,
|
|
||||||
// ColorControlClusterAttributeRemainingTime = 0x0002,
|
|
||||||
// ColorControlClusterAttributeCurrentX = 0x0003,
|
|
||||||
// ColorControlClusterAttributeCurrentY = 0x0004,
|
|
||||||
// ColorControlClusterAttributeDriftCompensation = 0x0005,
|
|
||||||
// ColorControlClusterAttributeCompensationText = 0x0006,
|
|
||||||
// ColorControlClusterAttributeColorTemperatureMireds = 0x0007,
|
|
||||||
// ColorControlClusterAttributeColorMode = 0x0008,
|
|
||||||
// ColorControlClusterAttributeEnhancedCurrentHue = 0x4000,
|
|
||||||
// ColorControlClusterAttributeEnhancedColorMode = 0x4001,
|
|
||||||
// ColorControlClusterAttributeColorLoopActive = 0x4002,
|
|
||||||
// ColorControlClusterAttributeColorLoopDirection = 0x4003,
|
|
||||||
// ColorControlClusterAttributeColorLoopTime = 0x4004,
|
|
||||||
// ColorControlClusterAttributeColorLoopStartEnhancedHue = 0x4005,
|
|
||||||
// ColorControlClusterAttributeColorLoopStoredEnhancedHue = 0x4006,
|
|
||||||
// ColorControlClusterAttributeColorCapabilities = 0x400a,
|
|
||||||
// ColorControlClusterAttributeColorTempPhysicalMinMireds = 0x400b,
|
|
||||||
// ColorControlClusterAttributeColorTempPhysicalMaxMireds = 0x400c
|
|
||||||
// };
|
|
||||||
// Q_ENUM(ColorControlClusterAttribute)
|
|
||||||
|
|
||||||
// enum ColorControlClusterColorMode {
|
|
||||||
// ColorControlClusterColorModeHueSaturation = 0x00,
|
|
||||||
// ColorControlClusterColorModeXY = 0x01,
|
|
||||||
// ColorControlClusterColorModeColorTemperatureMired = 0x02
|
|
||||||
// };
|
|
||||||
// Q_ENUM(ColorControlClusterColorMode)
|
|
||||||
|
|
||||||
explicit ZigbeeCluster(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Zigbee::ClusterId clusterId, Direction direction, QObject *parent = nullptr);
|
explicit ZigbeeCluster(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Zigbee::ClusterId clusterId, Direction direction, QObject *parent = nullptr);
|
||||||
|
|
||||||
ZigbeeNode *node() const;
|
ZigbeeNode *node() const;
|
||||||
|
|||||||
@ -309,10 +309,6 @@ void ZigbeeNetwork::saveNetwork()
|
|||||||
settings.setValue("networkKey", securityConfiguration().networkKey().toString());
|
settings.setValue("networkKey", securityConfiguration().networkKey().toString());
|
||||||
settings.setValue("trustCenterLinkKey", securityConfiguration().globalTrustCenterLinkKey().toString());
|
settings.setValue("trustCenterLinkKey", securityConfiguration().globalTrustCenterLinkKey().toString());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
foreach (ZigbeeNode *node, nodes()) {
|
|
||||||
m_database->saveNode(node);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZigbeeNetwork::loadNetwork()
|
void ZigbeeNetwork::loadNetwork()
|
||||||
@ -458,12 +454,12 @@ void ZigbeeNetwork::setState(ZigbeeNetwork::State state)
|
|||||||
|
|
||||||
qCDebug(dcZigbeeNetwork()) << "State changed" << state;
|
qCDebug(dcZigbeeNetwork()) << "State changed" << state;
|
||||||
m_state = state;
|
m_state = state;
|
||||||
emit stateChanged(m_state);
|
|
||||||
|
|
||||||
if (state == StateRunning) {
|
if (state == StateRunning) {
|
||||||
saveNetwork();
|
saveNetwork();
|
||||||
qCDebug(dcZigbeeNetwork()) << this;
|
qCDebug(dcZigbeeNetwork()) << this;
|
||||||
}
|
}
|
||||||
|
emit stateChanged(m_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZigbeeNetwork::setError(ZigbeeNetwork::Error error)
|
void ZigbeeNetwork::setError(ZigbeeNetwork::Error error)
|
||||||
@ -478,7 +474,7 @@ void ZigbeeNetwork::setError(ZigbeeNetwork::Error error)
|
|||||||
|
|
||||||
bool ZigbeeNetwork::networkConfigurationAvailable() const
|
bool ZigbeeNetwork::networkConfigurationAvailable() const
|
||||||
{
|
{
|
||||||
return m_extendedPanId != 0 && m_channel != 0;
|
return m_extendedPanId != 0 && m_channel != 0 && m_coordinatorNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZigbeeNetworkReply *ZigbeeNetwork::createNetworkReply(const ZigbeeNetworkRequest &request)
|
ZigbeeNetworkReply *ZigbeeNetwork::createNetworkReply(const ZigbeeNetworkRequest &request)
|
||||||
@ -545,7 +541,7 @@ void ZigbeeNetwork::onNodeClusterAttributeChanged(ZigbeeCluster *cluster, const
|
|||||||
|
|
||||||
QDebug operator<<(QDebug debug, ZigbeeNetwork *network)
|
QDebug operator<<(QDebug debug, ZigbeeNetwork *network)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "ZigbeeNetwork (" << ZigbeeUtils::convertUint64ToHexString(network->extendedPanId())
|
debug.nospace().noquote() << "ZigbeeNetwork (" << ZigbeeUtils::convertUint16ToHexString(network->panId())
|
||||||
<< ", Channel " << network->channel()
|
<< ", Channel " << network->channel()
|
||||||
<< ")" << endl;
|
<< ")" << endl;
|
||||||
foreach (ZigbeeNode *node, network->nodes()) {
|
foreach (ZigbeeNode *node, network->nodes()) {
|
||||||
|
|||||||
@ -133,7 +133,6 @@ private:
|
|||||||
ZigbeeDeviceProfile::NodeType m_nodeType = ZigbeeDeviceProfile::NodeTypeCoordinator;
|
ZigbeeDeviceProfile::NodeType m_nodeType = ZigbeeDeviceProfile::NodeTypeCoordinator;
|
||||||
|
|
||||||
// Network storage
|
// Network storage
|
||||||
ZigbeeNetworkDatabase *m_database = nullptr;
|
|
||||||
QString m_settingsFileName = "/etc/nymea/nymea-zigbee.conf";
|
QString m_settingsFileName = "/etc/nymea/nymea-zigbee.conf";
|
||||||
QList<ZigbeeNode *> m_nodes;
|
QList<ZigbeeNode *> m_nodes;
|
||||||
QList<ZigbeeNode *> m_uninitializedNodes;
|
QList<ZigbeeNode *> m_uninitializedNodes;
|
||||||
@ -147,6 +146,7 @@ protected:
|
|||||||
ZigbeeNode *m_coordinatorNode = nullptr;
|
ZigbeeNode *m_coordinatorNode = nullptr;
|
||||||
bool m_permitJoining = false;
|
bool m_permitJoining = false;
|
||||||
ZigbeeSecurityConfiguration m_securityConfiguration;
|
ZigbeeSecurityConfiguration m_securityConfiguration;
|
||||||
|
ZigbeeNetworkDatabase *m_database = nullptr;
|
||||||
|
|
||||||
ZigbeeNode *createNode(quint16 shortAddress, const ZigbeeAddress &extendedAddress, QObject *parent);
|
ZigbeeNode *createNode(quint16 shortAddress, const ZigbeeAddress &extendedAddress, QObject *parent);
|
||||||
ZigbeeNode *createNode(quint16 shortAddress, const ZigbeeAddress &extendedAddress, quint8 macCapabilities, QObject *parent);
|
ZigbeeNode *createNode(quint16 shortAddress, const ZigbeeAddress &extendedAddress, quint8 macCapabilities, QObject *parent);
|
||||||
@ -157,7 +157,6 @@ protected:
|
|||||||
void clearSettings();
|
void clearSettings();
|
||||||
void saveNode(ZigbeeNode *node);
|
void saveNode(ZigbeeNode *node);
|
||||||
|
|
||||||
|
|
||||||
void addNode(ZigbeeNode *node);
|
void addNode(ZigbeeNode *node);
|
||||||
void addUnitializedNode(ZigbeeNode *node);
|
void addUnitializedNode(ZigbeeNode *node);
|
||||||
void removeNode(ZigbeeNode *node);
|
void removeNode(ZigbeeNode *node);
|
||||||
@ -187,8 +186,8 @@ signals:
|
|||||||
void nodeRemoved(ZigbeeNode *node);
|
void nodeRemoved(ZigbeeNode *node);
|
||||||
|
|
||||||
void permitJoiningChanged(bool permitJoining);
|
void permitJoiningChanged(bool permitJoining);
|
||||||
void stateChanged(State state);
|
|
||||||
void errorOccured(Error error);
|
void errorOccured(Error error);
|
||||||
|
void stateChanged(State state);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onNodeStateChanged(ZigbeeNode::State state);
|
void onNodeStateChanged(ZigbeeNode::State state);
|
||||||
|
|||||||
@ -194,6 +194,11 @@ ZigbeeCluster *ZigbeeNodeEndpoint::createCluster(Zigbee::ClusterId clusterId, Zi
|
|||||||
return new ZigbeeClusterIlluminanceMeasurment(m_network, m_node, this, direction, this);
|
return new ZigbeeClusterIlluminanceMeasurment(m_network, m_node, this, direction, this);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Lighting
|
||||||
|
case Zigbee::ClusterIdColorControl:
|
||||||
|
return new ZigbeeClusterColorControl(m_network, m_node, this, direction, this);
|
||||||
|
break;
|
||||||
|
|
||||||
// Security
|
// Security
|
||||||
case Zigbee::ClusterIdIasZone:
|
case Zigbee::ClusterIdIasZone:
|
||||||
return new ZigbeeClusterIasZone(m_network, m_node, this, direction, this);
|
return new ZigbeeClusterIasZone(m_network, m_node, this, direction, this);
|
||||||
|
|||||||
@ -47,6 +47,8 @@
|
|||||||
#include "zcl/measurement/zigbeeclustertemperaturemeasurement.h"
|
#include "zcl/measurement/zigbeeclustertemperaturemeasurement.h"
|
||||||
#include "zcl/measurement/zigbeeclusterrelativehumiditymeasurement.h"
|
#include "zcl/measurement/zigbeeclusterrelativehumiditymeasurement.h"
|
||||||
|
|
||||||
|
#include "zcl/lighting/zigbeeclustercolorcontrol.h"
|
||||||
|
|
||||||
#include "zcl/security/zigbeeclusteriaszone.h"
|
#include "zcl/security/zigbeeclusteriaszone.h"
|
||||||
|
|
||||||
class ZigbeeNode;
|
class ZigbeeNode;
|
||||||
|
|||||||
Reference in New Issue
Block a user