nymea-plugins-modbus/libnymea-sunspec/models/sunspecschedulemodel.h

355 lines
9.2 KiB
C++

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2021, nymea GmbH
* Contact: contact@nymea.io
*
* This fileDescriptor is part of nymea.
* 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 SUNSPECSCHEDULEMODEL_H
#define SUNSPECSCHEDULEMODEL_H
#include <QObject>
#include "sunspecmodel.h"
#include "sunspecmodelrepeatingblock.h"
class SunSpecConnection;
class SunSpecScheduleModel;
class SunSpecScheduleModelRepeatingBlock : public SunSpecModelRepeatingBlock
{
Q_OBJECT
public:
enum Intvtyp {
IntvtypOnetime = 0,
IntvtypDaily = 1,
IntvtypWeekly = 2,
IntvtypMonthly = 3,
IntvtypWeekday = 4,
IntvtypHoliday = 5,
IntvtypWeekend = 6,
IntvtypYearly = 7
};
Q_ENUM(Intvtyp)
enum Xtyp {
XtypUnset = 0,
XtypTime = 1,
XtypTemp = 2,
XtypPrice = 3,
XtypOther = 99
};
Q_ENUM(Xtyp)
enum Ytyp {
YtypUnset = 0,
YtypWMax = 1,
YtypRsrvd2 = 2,
YtypPf = 3,
YtypRsrvd4 = 4,
YtypWattPrice = 5,
YtypVarPrice = 6,
YtypRsrvd7 = 7,
YtypVoltVarArray = 8,
YtypWChaGra = 9,
YtypWDisChaGra = 10,
YtypVArAval = 11,
YtypSchedule = 12,
YtypOther = 99
};
Q_ENUM(Ytyp)
explicit SunSpecScheduleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecScheduleModel *parent = nullptr);
~SunSpecScheduleModelRepeatingBlock() override = default;
SunSpecScheduleModel *parentModel() const;
QString name() const override;
/* Number of active entries in schedule. */
quint16 actPts() const;
QModbusReply *setActPts(quint16 actPts);
/* Schedule start in seconds since 2000 JAN 01 00:00:00 UTC. [Secs] */
quint32 strTms() const;
QModbusReply *setStrTms(quint32 strTms);
/* The repetition count for time-based schedules (0=repeat forever) */
quint16 repPer() const;
QModbusReply *setRepPer(quint16 repPer);
/* The repetition frequency for time-based schedules: no repeat=0 */
Intvtyp schdTyp() const;
QModbusReply *setSchdTyp(Intvtyp schdTyp);
/* The meaning of the X-values in the array. */
Xtyp xTyp() const;
QModbusReply *setXTyp(Xtyp xTyp);
/* Scale factor for schedule range values. */
qint16 xSf() const;
QModbusReply *setXSf(qint16 xSf);
/* The meaning of the Y-values in the array. */
Ytyp yTyp() const;
QModbusReply *setYTyp(Ytyp yTyp);
/* Scale factor for schedule target values. */
qint16 ySf() const;
QModbusReply *setYSf(qint16 ySf);
/* Entry 1 range. */
float x1() const;
QModbusReply *setX1(float x1);
/* Entry 1 target. */
float y1() const;
QModbusReply *setY1(float y1);
/* Entry 2 range. */
float x2() const;
QModbusReply *setX2(float x2);
/* Entry 2 target. */
float y2() const;
QModbusReply *setY2(float y2);
/* Entry 3 range. */
float x3() const;
QModbusReply *setX3(float x3);
/* Entry 3 target. */
float y3() const;
QModbusReply *setY3(float y3);
/* Entry 4 range. */
float x4() const;
QModbusReply *setX4(float x4);
/* Entry 4 target. */
float y4() const;
QModbusReply *setY4(float y4);
/* Entry 15range. */
float x5() const;
QModbusReply *setX5(float x5);
/* Entry 5 target. */
float y5() const;
QModbusReply *setY5(float y5);
/* Entry 6 range. */
float x6() const;
QModbusReply *setX6(float x6);
/* Entry 6 target. */
float y6() const;
QModbusReply *setY6(float y6);
/* Entry 7 range. */
float x7() const;
QModbusReply *setX7(float x7);
/* Entry 7 target. */
float y7() const;
QModbusReply *setY7(float y7);
/* Entry 8 range. */
float x8() const;
QModbusReply *setX8(float x8);
/* Entry 8 target. */
float y8() const;
QModbusReply *setY8(float y8);
/* Entry 9 range. */
float x9() const;
QModbusReply *setX9(float x9);
/* Entry 9 target. */
float y9() const;
QModbusReply *setY9(float y9);
/* Entry 10 range. */
float x10() const;
QModbusReply *setX10(float x10);
/* Entry 10 target. */
float y10() const;
QModbusReply *setY10(float y10);
/* Optional description for schedule. */
QString nam() const;
QModbusReply *setNam(const QString &nam);
/* Time window for schedule entry change. [Secs] */
quint16 winTms() const;
QModbusReply *setWinTms(quint16 winTms);
/* Ramp time for moving from current target to new target. [Secs] */
quint16 rmpTms() const;
QModbusReply *setRmpTms(quint16 rmpTms);
/* Index of active entry in the active schedule. */
quint16 actIndx() const;
void processBlockData(const QVector<quint16> blockData) override;
protected:
void initDataPoints() override;
private:
SunSpecScheduleModel *m_parentModel = nullptr;
quint16 m_actPts = 0;
quint32 m_strTms = 0;
quint16 m_repPer = 0;
Intvtyp m_schdTyp;
Xtyp m_xTyp;
qint16 m_xSf = 0;
Ytyp m_yTyp;
qint16 m_ySf = 0;
float m_x1 = 0;
float m_y1 = 0;
float m_x2 = 0;
float m_y2 = 0;
float m_x3 = 0;
float m_y3 = 0;
float m_x4 = 0;
float m_y4 = 0;
float m_x5 = 0;
float m_y5 = 0;
float m_x6 = 0;
float m_y6 = 0;
float m_x7 = 0;
float m_y7 = 0;
float m_x8 = 0;
float m_y8 = 0;
float m_x9 = 0;
float m_y9 = 0;
float m_x10 = 0;
float m_y10 = 0;
QString m_nam;
quint16 m_winTms = 0;
quint16 m_rmpTms = 0;
quint16 m_actIndx = 0;
};
class SunSpecScheduleModel : public SunSpecModel
{
Q_OBJECT
public:
enum Actschd {
ActschdSched1 = 0x1,
ActschdSched2 = 0x2,
ActschdSched3 = 0x4,
ActschdSched4 = 0x8,
ActschdSched5 = 0x10,
ActschdSched6 = 0x20,
ActschdSched7 = 0x40,
ActschdSched8 = 0x80,
ActschdSched9 = 0x100,
ActschdSched10 = 0x200,
ActschdSched12 = 0x400,
ActschdSched13 = 0x800,
ActschdSched14 = 0x1000,
ActschdSched15 = 0x2000,
ActschdSched16 = 0x4000,
ActschdSched17 = 0x8000,
ActschdSched18 = 0x10000,
ActschdSched19 = 0x20000,
ActschdSched20 = 0x40000,
ActschdSched21 = 0x80000,
ActschdSched22 = 0x200000,
ActschdSched23 = 0x400000,
ActschdSched24 = 0x800000,
ActschdSched25 = 0x1000000,
ActschdSched26 = 0x2000000,
ActschdSched27 = 0x4000000,
ActschdSched28 = 0x8000000,
ActschdSched29 = 0x10000000,
ActschdSched30 = 0x20000000,
ActschdSched31 = 0x40000000,
ActschdSched32 = 0x80000000
};
Q_DECLARE_FLAGS(ActschdFlags, Actschd)
Q_FLAG(Actschd)
enum Modena {
ModenaEnabled = 0x1
};
Q_DECLARE_FLAGS(ModenaFlags, Modena)
Q_FLAG(Modena)
explicit SunSpecScheduleModel(SunSpecConnection *connection, quint16 modbusStartRegister, quint16 modelLength, SunSpecDataPoint::ByteOrder byteOrder, QObject *parent = nullptr);
~SunSpecScheduleModel() override;
QString name() const override;
QString description() const override;
QString label() const override;
/* Bitfield of active schedules */
ActschdFlags actSchd() const;
QModbusReply *setActSchd(ActschdFlags actSchd);
/* Is basic scheduling active. */
ModenaFlags modEna() const;
QModbusReply *setModEna(ModenaFlags modEna);
/* Number of schedules supported (recommend min. 4, max 32) */
quint16 nSchd() const;
/* Number of schedule entries supported (maximum of 10). */
quint16 nPts() const;
/* Pad register. */
quint16 pad() const;
protected:
quint16 m_fixedBlockLength = 6;
quint16 m_repeatingBlockLength = 60;
void initDataPoints();
void processBlockData() override;
private:
ActschdFlags m_actSchd;
ModenaFlags m_modEna;
quint16 m_nSchd = 0;
quint16 m_nPts = 0;
quint16 m_pad = 0;
};
QDebug operator<<(QDebug debug, SunSpecScheduleModel *model);
#endif // SUNSPECSCHEDULEMODEL_H