diff --git a/libnymea-zigbee/zcl/zigbeecluster.cpp b/libnymea-zigbee/zcl/zigbeecluster.cpp index a75baea..782f591 100644 --- a/libnymea-zigbee/zcl/zigbeecluster.cpp +++ b/libnymea-zigbee/zcl/zigbeecluster.cpp @@ -116,6 +116,17 @@ ZigbeeClusterReply *ZigbeeCluster::readAttributes(QList attributes) return executeGlobalCommand(ZigbeeClusterLibrary::CommandReadAttributes, payload); } +ZigbeeClusterReply *ZigbeeCluster::writeAttributes(QList writeAttributeRecords) +{ + qCDebug(dcZigbeeCluster()) << "Write attributes on" << m_node << m_endpoint << this; + QByteArray payload; + foreach (const ZigbeeClusterLibrary::WriteAttributeRecord &writeAttributeRecord, writeAttributeRecords) { + payload += ZigbeeClusterLibrary::buildWriteAttributeRecord(writeAttributeRecord); + } + + return executeGlobalCommand(ZigbeeClusterLibrary::CommandWriteAttributes, payload); +} + ZigbeeClusterReply *ZigbeeCluster::configureReporting(QList reportingConfigurations) { qCDebug(dcZigbeeCluster()) << "Configure reporting on" << m_node << m_endpoint << this << reportingConfigurations; diff --git a/libnymea-zigbee/zcl/zigbeecluster.h b/libnymea-zigbee/zcl/zigbeecluster.h index aaa0707..22c34d3 100644 --- a/libnymea-zigbee/zcl/zigbeecluster.h +++ b/libnymea-zigbee/zcl/zigbeecluster.h @@ -91,6 +91,7 @@ public: // ZCL global commands ZigbeeClusterReply *readAttributes(QList attributes); + ZigbeeClusterReply *writeAttributes(QList writeAttributeRecords); ZigbeeClusterReply *configureReporting(QList reportingConfigurations); diff --git a/libnymea-zigbee/zcl/zigbeeclusterlibrary.cpp b/libnymea-zigbee/zcl/zigbeeclusterlibrary.cpp index 3d745a7..8255a2b 100644 --- a/libnymea-zigbee/zcl/zigbeeclusterlibrary.cpp +++ b/libnymea-zigbee/zcl/zigbeeclusterlibrary.cpp @@ -276,6 +276,20 @@ QByteArray ZigbeeClusterLibrary::buildAttributeReportingConfiguration(const Zigb return payload; } +QByteArray ZigbeeClusterLibrary::buildWriteAttributeRecord(const ZigbeeClusterLibrary::WriteAttributeRecord &writeAttributeRecord) +{ + QByteArray payload; + QDataStream stream(&payload, QIODevice::WriteOnly); + stream.setByteOrder(QDataStream::LittleEndian); + stream << writeAttributeRecord.attributeId; + stream << static_cast(writeAttributeRecord.dataType); + for (int i = 0; i < writeAttributeRecord.data.count(); i++) { + stream << static_cast(writeAttributeRecord.data.at(i)); + } + + return payload; +} + QList ZigbeeClusterLibrary::parseAttributeReportingStatusRecords(const QByteArray &payload) { QList statusRecords; diff --git a/libnymea-zigbee/zcl/zigbeeclusterlibrary.h b/libnymea-zigbee/zcl/zigbeeclusterlibrary.h index 396fc31..46efebe 100644 --- a/libnymea-zigbee/zcl/zigbeeclusterlibrary.h +++ b/libnymea-zigbee/zcl/zigbeeclusterlibrary.h @@ -251,6 +251,13 @@ public: ZigbeeDataType dataType; } ReadAttributeStatusRecord; + // Write attribute + typedef struct WriteAttributeRecord { + quint16 attributeId; + Zigbee::DataType dataType; + QByteArray data; + } WriteAttributeRecord; + // Reporting attributes typedef struct AttributeReportingConfiguration { ReportingDirection direction = ReportingDirectionReporting; @@ -286,6 +293,7 @@ public: // AttributeReportingConfiguration static QByteArray buildAttributeReportingConfiguration(const AttributeReportingConfiguration &reportingConfiguration); + static QByteArray buildWriteAttributeRecord(const WriteAttributeRecord &writeAttributeRecord); // TODO: parseAttributeReportingConfiguration static QList parseAttributeReportingStatusRecords(const QByteArray &payload);