nymea-zigbee/libnymea-zigbee/zcl/measurement/zigbeeclusterelectricalmeas...

289 lines
14 KiB
C++

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2022, 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 ZIGBEECLUSTERELECTRICALMEASUREMENT_H
#define ZIGBEECLUSTERELECTRICALMEASUREMENT_H
#include <QObject>
#include "zcl/zigbeecluster.h"
#include "zcl/zigbeeclusterreply.h"
class ZigbeeNode;
class ZigbeeNetwork;
class ZigbeeNodeEndpoint;
class ZigbeeNetworkReply;
class ZigbeeClusterElectricalMeasurement : public ZigbeeCluster
{
Q_OBJECT
friend class ZigbeeNode;
friend class ZigbeeNetwork;
public:
enum Attribute {
AttributeBasicInformationMeasurementType = 0x0000,
AttributeDCMeasurementAttributeDCVoltage = 0x0100,
AttributeDCMeasurementAttributeDCVoltageMin = 0x0101,
AttributeDCMeasurementAttributeDCVoltageMax = 0x0102,
AttributeDCMeasurementAttributeDCCurrent = 0x0103,
AttributeDCMeasurementAttributeDCCurrentMin = 0x0104,
AttributeDCMeasurementAttributeDCCurrentMax = 0x0105,
AttributeDCMeasurementAttributeDCPower = 0x0106,
AttributeDCMeasurementAttributeDCPowerMin = 0x0107,
AttributeDCMeasurementAttributeDCPowerMax = 0x0108,
AttributeDCFormattingDCVoltageMultiplier = 0x0200,
AttributeDCFormattingDCVoltageDivisor = 0x0201,
AttributeDCFormattingDCCurrentMultiplier = 0x0202,
AttributeDCFormattingDCCurrentDivisor = 0x0203,
AttributeDCFormattingDCPowerMultiplier = 0x0204,
AttributeDCFormattingDCPowerDivisor = 0x0205,
AttributeACTotalMeasurementACFrequency = 0x0300,
AttributeACTotalMeasurementACFrequencyMin = 0x0301,
AttributeACTotalMeasurementACFrequencyMax = 0x0302,
AttributeACTotalMeasurementNeutralCurrent = 0x0303,
AttributeACTotalMeasurementTotalActivePower = 0x0304,
AttributeACTotalMeasurementTotalReactivePower = 0x0305,
AttributeACTotalMeasurementTotalApparentPower = 0x0306,
AttributeACTotalMeasurementMeasured1stHarmonicCurrent = 0x0307,
AttributeACTotalMeasurementMeasured3stHarmonicCurrent = 0x0308,
AttributeACTotalMeasurementMeasured5stHarmonicCurrent = 0x0309,
AttributeACTotalMeasurementMeasured7stHarmonicCurrent = 0x030A,
AttributeACTotalMeasurementMeasured9stHarmonicCurrent = 0x030B,
AttributeACTotalMeasurementMeasured11stHarmonicCurrent = 0x030C,
AttributeACTotalMeasurementMeasuredPhase1stHarmonicCurrent = 0x030D,
AttributeACTotalMeasurementMeasuredPhase3stHarmonicCurrent = 0x030E,
AttributeACTotalMeasurementMeasuredPhase5stHarmonicCurrent = 0x030F,
AttributeACTotalMeasurementMeasuredPhase7stHarmonicCurrent = 0x0310,
AttributeACTotalMeasurementMeasuredPhase9stHarmonicCurrent = 0x0311,
AttributeACTotalMeasurementMeasuredPhase11stHarmonicCurrent = 0x0312,
AttributeACTotalFormattingACFrequencyMultiplier = 0x0400,
AttributeACTotalFormattingACFrequencyDivisor = 0x0401,
AttributeACTotalFormattingPowerMultiplier = 0x0402,
AttributeACTotalFormattingPowerDivisor = 0x0403,
AttributeACTotalFormattingHarmonicCurrentMultiplier = 0x0404,
AttributeACTotalFormattingPhaseHarmonicCurrentMultiplier = 0x0405,
AttributeACPhaseAMeasurementReserved = 0x0500,
AttributeACPhaseAMeasurementLineCurrent = 0x0501,
AttributeACPhaseAMeasurementActiveCurrent = 0x0502,
AttributeACPhaseAMeasurementReactiveCurrent = 0x0503,
AttributeACPhaseAMeasurementRMSVoltage = 0x0505,
AttributeACPhaseAMeasurementRMSVoltageMin = 0x0506,
AttributeACPhaseAMeasurementRMSVoltageMax = 0x0507,
AttributeACPhaseAMeasurementRMSCurrent = 0x0508,
AttributeACPhaseAMeasurementRMSCurrentMin = 0x0509,
AttributeACPhaseAMeasurementRMSCurrentMax = 0x050A,
AttributeACPhaseAMeasurementActivePower = 0x050B,
AttributeACPhaseAMeasurementActivePowerMin = 0x050C,
AttributeACPhaseAMeasurementActivePowerMax = 0x050D,
AttributeACPhaseAMeasurementReactivePower = 0x050E,
AttributeACPhaseAMeasurementApparentPower = 0x050F,
AttributeACPhaseAMeasurementPowerFactor = 0x0510,
AttributeACPhaseAMeasurementAverageRMSVoltageMeasurementPeriod = 0x0511,
AttributeACPhaseAMeasurementAverageRMSOverVoltageCounter = 0x0512,
AttributeACPhaseAMeasurementAverageRMSUnderVoltageCounter = 0x0513,
AttributeACPhaseAMeasurementRMSExtremeOverVoltagePeriod = 0x0514,
AttributeACPhaseAMeasurementRMSExtremeUnderVoltagePeriod = 0x0515,
AttributeACPhaseAMeasurementRMSVoltageSagPeriod = 0x0516,
AttributeACPhaseAMeasurementRMSVoltageSwellPeriod = 0x0517,
AttributeACFormattingACVoltageMultiplier = 0x0600,
AttributeACFormattingACVoltageDivisor = 0x0601,
AttributeACFormattingCurrentMultiplier = 0x0602,
AttributeACFormattingCurrentDivisor = 0x0603,
AttributeACFormattingPowerMultiplier = 0x0604,
AttributeACFormattingPowerDivisor = 0x0605,
AttributeDCManuufacturerThresholdAlarmDCOverloadAlarmsMask = 0x0700,
AttributeDCManuufacturerThresholdAlarmDCVoltageOverload = 0x0701,
AttributeDCManuufacturerThresholdAlarmDCCurrentOverload = 0x0702,
AttributeACManufacturerThresholdAlarmACAlarmsMask = 0x0800,
AttributeACManufacturerThresholdAlarmACVoltageOverload = 0x0801,
AttributeACManufacturerThresholdAlarmACCurrentOverload = 0x0802,
AttributeACManufacturerThresholdAlarmACActivePowerOverload = 0x0803,
AttributeACManufacturerThresholdAlarmACReactivePowerOverload = 0x0804,
AttributeACManufacturerThresholdAlarmAverageRMSOverVoltage = 0x0805,
AttributeACManufacturerThresholdAlarmAverageRMSUnderVoltage = 0x0806,
AttributeACManufacturerThresholdAlarmRMSExtremeOverVoltage = 0x0807,
AttributeACManufacturerThresholdAlarmRMSExtremeUnderVoltage = 0x0808,
AttributeACManufacturerThresholdAlarmRMSVoltageSag = 0x0809,
AttributeACManufacturerThresholdAlarmRMSVoltageSwell = 0x080A,
AttributeACPhaseBMeasurementLineCurrent = 0x0901,
AttributeACPhaseBMeasurementActiveCurrent = 0x0902,
AttributeACPhaseBMeasurementReactiveCurrent = 0x0903,
AttributeACPhaseBMeasurementRMSVoltage = 0x0905,
AttributeACPhaseBMeasurementRMSVoltageMin = 0x0906,
AttributeACPhaseBMeasurementRMSVoltageMax = 0x0907,
AttributeACPhaseBMeasurementRMSCurrent = 0x0908,
AttributeACPhaseBMeasurementRMSCurrentMin = 0x0909,
AttributeACPhaseBMeasurementRMSCurrentMax = 0x090A,
AttributeACPhaseBMeasurementActivePower = 0x090B,
AttributeACPhaseBMeasurementActivePowerMin = 0x090C,
AttributeACPhaseBMeasurementActivePowerMax = 0x090D,
AttributeACPhaseBMeasurementReactivePower = 0x090E,
AttributeACPhaseBMeasurementApparentPower = 0x090F,
AttributeACPhaseBMeasurementPowerFactor = 0x0910,
AttributeACPhaseBMeasurementAverageRMSVoltageMeasurementPeriod = 0x0911,
AttributeACPhaseBMeasurementAverageRMSOverVoltageCounter = 0x0912,
AttributeACPhaseBMeasurementAverageRMSUnderVoltageCounter = 0x0913,
AttributeACPhaseBMeasurementRMSExtremeOverVoltagePeriod = 0x0914,
AttributeACPhaseBMeasurementRMSExtremeUnderVoltagePeriod = 0x0915,
AttributeACPhaseBMeasurementRMSVoltageSagPeriod = 0x0916,
AttributeACPhaseBMeasurementRMSVoltageSwellPeriod = 0x0917,
AttributeACPhaseCMeasurementLineCurrent = 0x0A01,
AttributeACPhaseCMeasurementActiveCurrent = 0x0A02,
AttributeACPhaseCMeasurementReactiveCurrent = 0x0A03,
AttributeACPhaseCMeasurementRMSVoltage = 0x0A05,
AttributeACPhaseCMeasurementRMSVoltageMin = 0x0A06,
AttributeACPhaseCMeasurementRMSVoltageMax = 0x0A07,
AttributeACPhaseCMeasurementRMSCurrent = 0x0A08,
AttributeACPhaseCMeasurementRMSCurrentMin = 0x0A09,
AttributeACPhaseCMeasurementRMSCurrentMax = 0x0A0A,
AttributeACPhaseCMeasurementActivePower = 0x0A0B,
AttributeACPhaseCMeasurementActivePowerMin = 0x0A0C,
AttributeACPhaseCMeasurementActivePowerMax = 0x0A0D,
AttributeACPhaseCMeasurementReactivePower = 0x0A0E,
AttributeACPhaseCMeasurementApparentPower = 0x0A0F,
AttributeACPhaseCMeasurementPowerFactor = 0x0A10,
AttributeACPhaseCMeasurementAverageRMSVoltageMeasurementPeriod = 0x0A11,
AttributeACPhaseCMeasurementAverageRMSOverVoltageCounter = 0x0A12,
AttributeACPhaseCMeasurementAverageRMSUnderVoltageCounter = 0x0A13,
AttributeACPhaseCMeasurementRMSExtremeOverVoltagePeriod = 0x0A14,
AttributeACPhaseCMeasurementRMSExtremeUnderVoltagePeriod = 0x0A15,
AttributeACPhaseCMeasurementRMSVoltageSagPeriod = 0x0A16,
AttributeACPhaseCMeasurementRMSVoltageSwellPeriod = 0x0A17
};
Q_ENUM(Attribute)
enum MeasurementType {
MeasurementTypeACActive = 0x0001,
MeasurementTypeACReactive = 0x0002,
MeasurementTypeACApparent = 0x0004,
MeasurementTypePhaseA = 0x0008,
MeasurementTypePhaseB = 0x0010,
MeasurementTypePhaseC = 0x0020,
MeasurementTypeDC = 0x0040,
MeasurementTypeHarmonics = 0x0080,
MeasurementTypePowerQuality = 0x0100
};
Q_DECLARE_FLAGS(MeasurementTypes, MeasurementType)
Q_FLAG(MeasurementTypes)
enum DCOverloadAlarm {
DCOverloadAlarmVoltageOverload = 0x01,
DCOverloadAlarmCurrentOverload = 0x02
};
Q_DECLARE_FLAGS(DCOverloadAlarmsMask, DCOverloadAlarm)
Q_FLAG(DCOverloadAlarmsMask)
enum ACAlarm {
ACAlarmVoltageOverload = 0x0001,
ACAlarmCurrentOverload = 0x0002,
ACAlarmActivePowerOverload = 0x0004,
ACAlarmReactivePowerOverload = 0x0008,
ACAlarmAverageRMSOverVoltage = 0x0010,
ACAlarmAverageRMSUnderVoltage = 0x0020,
ACAlarmRMSExtremeOverVoltage = 0x0040,
ACAlarmRMSExtremeUnderVoltage = 0x0080,
ACAlarmRMSVoltageSag = 0x0100,
ACAlarmRMSVoltageSwell = 0x0200
};
Q_DECLARE_FLAGS(ACAlarmsMask, ACAlarm)
Q_FLAG(ACAlarmsMask)
enum ProfileIntervalPeriod {
ProfileIntervalPeriodDaily = 0x00,
ProfileIntervalPeriod60Minutes = 0x01,
ProfileIntervalPeriod30Minutes = 0x02,
ProfileIntervalPeriod15Minutes = 0x03,
ProfileIntervalPeriod10Minutes = 0x04,
ProfileIntervalPeriod7p5Minutes = 0x05,
ProfileIntervalPeriod5Minutes = 0x06,
ProfileIntervalPeriod2p5Minutes = 0x07
};
Q_ENUM(ProfileIntervalPeriod)
enum MeasurementStatus {
MeasurementStatusSuccess = 0x00,
MeasurementTypeAttributeProfileNotSupported = 0x01,
MeasurementStatusInvalidStartTime = 0x02,
MeasurementStatusMoreIntervalsRequestedThanCanBeReturned = 0x03,
MeasurementTypeNoIntervalsAvailableForRequestedTime = 0x04
};
Q_ENUM(MeasurementStatus)
enum ClientCommand {
CommandGetProfileInfo = 0x00,
CommandGetMeasurementProfileInfo = 0x01
};
Q_ENUM(ClientCommand)
enum ServerCommand {
CommandGetProfileInfoResponse = 0x00,
CommandGetMeasurementProfileResponse = 0x01
};
Q_ENUM(ServerCommand)
explicit ZigbeeClusterElectricalMeasurement(ZigbeeNetwork *network, ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint, Direction direction, QObject *parent = nullptr);
// Used to refresh formatting attributes (multiplier/divisor)
ZigbeeClusterReply* readFormatting();
quint16 acPowerMultiplier() const;
quint16 acPowerDivisor() const;
quint16 activePowerPhaseA() const;
signals:
void activePowerPhaseAChanged(qint16 activePowerPhaseA);
void getProfileInfoResponse(quint8 profileCount, ProfileIntervalPeriod profileIntervalPeriod, quint8 maxNumberOfIntervals, const QList<quint16> &attributes);
void getMeasurementProfileInfoResponse(const QDateTime &startTime, MeasurementStatus status, ProfileIntervalPeriod profileIntervalPeriod, quint8 numberOfIntervals, quint8 attributeId, const QList<quint16> &values);
protected:
void processDataIndication(ZigbeeClusterLibrary::Frame frame) override;
private:
void setAttribute(const ZigbeeClusterAttribute &attribute) override;
qint16 m_activePowerPhaseA = 0;
quint16 m_acPowerMultiplier = 1;
quint16 m_acPowerDivisor = 1;
};
#endif // ZIGBEECLUSTERELECTRICALMEASUREMENT_H