Skip to content
Snippets Groups Projects
shsensor.h 3.92 KiB
Newer Older
  • Learn to ignore specific revisions
  • Peter Altenbernd's avatar
    Peter Altenbernd committed
    #ifndef SHSENSORBASE_H
    #define SHSENSORBASE_H
    
    #include <QString>
    #include <QTime>
    #include <QDebug>
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    #undef __cplusplus
    #include "MyMessage.h"
    #include "SH-sid.h"
    
    #include "json-helper.h"
    
    
    // Unit tests TODO:
    //  -- alle Möglichkeiten Konstruktor
    //  -- setValue
    
    const QString NOVALUE = "--";
    
    class SHsensor: public QObject {
        /*
         * All classes that contain signals or slots must mention Q_OBJECT
         * at the top of their declaration.
         * They must also derive (directly or indirectly) from QObject.
         */
        Q_OBJECT
    
    public:
        enum SensorType {none, lightSensor, tempSensor, powerSensor, Switch, Switch2};
    
        enum ErrorType {noError, noValueError, stupidValueError, switchError};
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        static const int typeSize = Switch2+1;
    
        static const int CONTROL_INTERVALL = 97; // sec
    
        static const int POLLING_INTERVALL = 7; // sec
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        SHsensor(int nid, SensorType type, QString url="");
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
        virtual ~SHsensor();
    
        // void toJSON(QJsonObject & jsonObj, const QString & ParameterName) const;
        // SHsensorBase(const QJsonObject & jsonObj, const QString & ParameterName);
    
    protected:
        // nur Server:
        int m_nodeID;
        int m_sensorID;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        QString m_url;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
        // bei Verbindung:
    
        // QString m_name; raus: Namen werden automatisch vergeben: Siehe QString name(int sid);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        QString m_unit;
    
        SensorType m_type;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
        // im Betrieb:
        QString m_value;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        int m_pos; // zugleich ID
    
    
        // errors:
        ErrorType m_error;
        ErrorType m_previousError;
    
        QDateTime m_errorTime;
        QDateTime m_previousErrorTime;
    
        void setError(ErrorType newError);
        void resetError(ErrorType oldError);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    private:
        friend class TestSHserver;
        static int m_sensors;
    
        void checkTimeStamp();     // Zeitstempel-Kontrolle
    
    
        // Nervöse Werte bei Tasmota Temperatur:
        void setNervousTemp(const QString &payload);
        std::deque<float> T;
        float Tsum = 0;
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    
    public:
        virtual void setValue(const QString &payload);
    
        virtual int nodeID() const;
        virtual int sensorID() const;
        virtual QString name() const;
        virtual QString unit() const;
        virtual QString value() const;
    
        virtual QDateTime timestamp() const;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        virtual int pos() const;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        bool tasmota() const;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
        static int sensors();
    
    
        QString errorTxt() const;
        QString prevErrorTxt() const;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        void poll() const;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        // for unit testing:
    
        static bool isTesting();
        static void setTesting();
    
        static void setTestTime(const QDateTime &time);
        static QDateTime currentTime();
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    
        // mem control
        static void displayMem(QString comment);
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    private:
        static bool m_testing;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
        // statics;
    public slots:
        static void checkTimeStampALL();
    
    private:
    
        static SHsensor * S[SHNodeIdSize * SHSensorIdSize]; // 2D Hash-Tabelle
        static QMap<QString,int> NID; // Zur Suche nach Namen
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        static QString m_brutto;
        static QString m_netto;
        static QStringList m_info;
    
        static QString m_errcnt_total;
        static QString m_errcnt_current;
        static QString m_err_solar;
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    protected:
        static QNetworkAccessManager * m_tasmota; // zur Ansteuerung von Tasmota Nodes
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    public:
        static int hash(int nid, int sid);
        static void printALL();
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        static void pollTasmota();
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        static void setValue(int nid, int sid, const QString & payl);
        static QString getValue(int nid, int sid);
    
        static QString name(int nid);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        static void initStatics(QNetworkAccessManager * tasmota); // für NID Map und Tasmota Manager
        static int nid(QString name);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        static void setSolarInfo(int newBrutto, int newNetto, const QStringList & newInfo);
    
        static void setErrorInfo(int errcnt_total, int errcnt_current, bool err_solar);
        static QStringList getInfo();
    
        ErrorType error() const;
        bool isError() const;
    
        SensorType type() const;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    };
    
    #endif // SHSENSORBASE_H