/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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 ZIGBEECLUSTERIASZONE_H #define ZIGBEECLUSTERIASZONE_H #include #include "zcl/zigbeecluster.h" #include "zcl/zigbeeclusterreply.h" class ZigbeeNode; class ZigbeeNetwork; class ZigbeeNodeEndpoint; class ZigbeeNetworkReply; class ZigbeeClusterIasZone : public ZigbeeCluster { Q_OBJECT friend class ZigbeeNode; friend class ZigbeeNetwork; public: enum Attribute { // Zone information attribute set AttributeZoneState = 0x0000, AttributeZoneType = 0x0001, AttributeZoneStatus = 0x0002, // Zone settings attribute set AttributeCieAddress = 0x0010, AttributeZoneId = 0x0011, AttributeNumberOfZoneSensitivityLevelsSupported = 0x0012, AttributeCurrentZoneSensitivityLevel = 0x0013 }; Q_ENUM(Attribute) enum ZoneState { ZoneStateNotEnrolled = 0x00, ZoneStateEnrolled = 0x01 }; Q_ENUM(ZoneState) enum ZoneType { ZoneTypeStandardCIE = 0x0000, ZoneTypeMotionSensor = 0x000d, ZoneTypeContactSwitch = 0x0015, ZoneTypeFireSensor = 0x0028, ZoneTypeWaterSensor = 0x002a, ZoneTypeCarbonMonoxideSensor = 0x002b, ZoneTypePersonalEmergencyDevice = 0x002c, ZoneTypeVibrationMovementSensor = 0x002d, ZoneTypeRemoteControl = 0x010f, ZoneTypeKeyFob = 0x0115, ZoneTypeKeypad = 0x021d, ZoneTypeStandardWarningDevice = 0x0225, ZoneTypeGlassBreakSensor = 0x0226, ZoneTypeSecurityRepater = 0x0229, ZoneTypeInvalidZone = 0xffff }; Q_ENUM(ZoneType) enum ZoneStatus { ZoneStatusAlarm1 = 0x0001, ZoneStatusAlarm2 = 0x0002, ZoneStatusTamper = 0x0004, ZoneStatusBattery = 0x0008, ZoneStatusSupervisionReports = 0x0010, ZoneStatusRestoreReports = 0x0020, ZoneStatusTrouble = 0x0040, ZoneStatusAcMains = 0x0080, ZoneStatusTest = 0x0100, ZoneStatusBatteryDefect = 0x0200 }; Q_FLAG(ZoneStatus) Q_DECLARE_FLAGS(ZoneStatusFlags, ZoneStatus) enum EnrollResponseCode { EnrollResponseCodeSuccess = 0x00, EnrollResponseCodeNotSupported = 0x01, EnrollResponseCodeNoEnrollPermit = 0x02, EnrollResponseCodeToManyZones = 0x03 }; Q_ENUM(EnrollResponseCode) enum ServerCommand { ServerCommandStatusChangedNotification = 0x00, // M ServerCommandZoneEnrollRequest = 0x01 // M }; Q_ENUM(ServerCommand) enum ClientCommand { ClientCommandEnrollResponse = 0x00, // M ClientCommandInitNormalOperationMode = 0x01, // O ClientCommandInitTestMode = 0x02 // O }; Q_ENUM(ClientCommand) explicit ZigbeeClusterIasZone(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr); ZoneState zoneState() const; ZoneType zoneType() const; ZoneStatusFlags zoneStatus() const; // Request a Zone enrollment from the client (Server to client) ZigbeeClusterReply *sendZoneEnrollRequest(ZigbeeClusterIasZone::ZoneType zoneType, quint16 manufacturerCode); // Enroll a Zone on the server (Client to server) ZigbeeClusterReply *sendZoneEnrollResponse(quint8 zoneId, ZigbeeClusterIasZone::EnrollResponseCode code = EnrollResponseCodeSuccess); // Inform the client of Zone status changes (Server to client) ZigbeeClusterReply *sendZoneStatusChangeNotification(ZoneStatus status, quint8 zoneId, quint16 delay = 0); private: ZoneState m_zoneState = ZoneStateNotEnrolled; ZoneType m_zoneType = ZoneTypeInvalidZone; ZoneStatusFlags m_zoneStatus; void setAttribute(const ZigbeeClusterAttribute &attribute) override; protected: void processDataIndication(ZigbeeClusterLibrary::Frame frame) override; signals: void zoneStatusChanged(ZoneStatusFlags zoneStatus, quint8 extendedStatus, quint8 zoneId, quint16 delay); void zoneEnrollRequest(ZoneType zoneType, quint16 manufacturerCode, quint8 transactionSequenceNumber); }; #endif // ZIGBEECLUSTERIASZONE_H