Skip to content
Snippets Groups Projects
shactuator.cpp 4.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "shactuator.h"
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    
    QTcpSocket * SHactuator::m_socket = nullptr;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    #ifndef SHREMOTE
    
    QSerialPort *SHactuator::m_serial = nullptr;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    #endif
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    /*
     * Konstruktor
     */
    
    SHactuator::SHactuator(/* QString name,*/ int nid, int powerDemand, SensorType sid, QString url) :
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        SHsensor(nid, sid, url),
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        m_powerDemand(powerDemand)
    {
        // Hinzufügen, d.h. überschreiben -> wieso geht das auch ohne?
        // int pos = hash(m_nodeID, m_sensorID);
    
        // S[pos] = this;
    
    
        m_ignoreF3error = true;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    }
    
    
    SHactuator::SHactuator(int nid, int powerDemand, QString url) :
    
        SHsensor(nid, SensorType::Switch, url),
        m_powerDemand(powerDemand)
    {
        m_ignoreF3error = true;
    }
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    /*
     *
     */
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    void SHactuator::setValue(const QString & payl)
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    {
        // qDebug() << "SHactuator::setValue(nid=" << m_nodeID << "sid=" << m_sensorID << "payl=" << payl << ")";
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        int intState = -1;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    
        if (payl == "ON")
                intState = 1;    
        else if (payl == "OFF")
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
                intState = 0;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
            bool ok;
            intState = payl.toInt(&ok);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
            if (not ok)
                intState = -1;
        }
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    
        // 1=on, 0=off
    
        switch (intState) {
        case 0:
            m_switchState = State::OFF;
            SHsensor::setValue("OFF");
    
            if (not m_ignoreF3error and m_switchState != m_assignedState)
    
                setError(switchError);
            else
                resetError(switchError);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
            break;
    
        case 1:
            m_switchState = State::ON;
            SHsensor::setValue("ON");
    
            if (not m_ignoreF3error and m_switchState != m_assignedState)
    
                setError(switchError);
            else
                resetError(switchError);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
            break;
    
        default:
            m_switchState = State::UNKOWN;
            SHsensor::setValue(NOVALUE);
            break;
        }
    }
    
    
    /*
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
     * true==On, false=Off
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
     */
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    void SHactuator::swtch(bool on)
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    {
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        QString cmd; // tasmota
        State switchState; // for testing
        QString value; // display
    
    
        m_ignoreF3error = false;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        if (on) {
            m_assignedState = State::ON;
            cmd = "cm?cmnd=Power%20On";
            switchState = State::ON;
            value = "1";
        } else {
            m_assignedState = State::OFF;
            cmd = "cm?cmnd=Power%20Off";
            switchState = State::OFF;
            value = "0";
        }
    
    
        if (not SHsensor::isTesting()) {
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
            if (tasmota() and m_switchState != switchState) { // nur bei Änderungen. TODO ggf. auch bei Arduino
    
                // qDebug() << "SHactuator::swtch" << on;
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
                QString urlRequest = m_url + "/" + cmd;
    
                QNetworkRequest request; // -> what type of demand? get, post, ...
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
                request.setUrl(QUrl(urlRequest));
                m_tasmota->get(request);
    
                poll(); // get ACK
            } else {
                m_socket->write(QByteArray(msg(on).toUtf8()));
    
    #ifndef SHREMOTE
                if (m_serial)
                    m_serial->write(QByteArray(msg(on).toUtf8()));
    #endif
            }
    
        } else {
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
            m_switchState = switchState; // for testing
            SHsensor::setValue( m_nodeID,  m_sensorID, value);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        }
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    void SHactuator::ON()
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    {
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
        swtch(true);
    }
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    /*
     *
     */
    void SHactuator::OFF()
    {
        swtch(false);
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    }
    
    
    
    /*
     *
     */
    void SHactuator::set(SHactuator::State state)
    {
        switch (state) {
        case State::ON:
            ON();
            break;
        case State::OFF:
            OFF();
            break;
        case State::UNKOWN:
            break;
        }
    }
    
    
    
    /*
     *
     */
    SHactuator::State SHactuator::switchState() const
    {
        return m_switchState;
    }
    
    
    
    /*
     *
     */
    
    int SHactuator::powerDemand() const
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    {
        return m_powerDemand;
    }
    
    
    
    
    /*
     *
     */
    void SHactuator::setIgnoreF3error() // beim setzen eines neuen Modes im Controller
    {
        m_ignoreF3error = true;
    }
    
    
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    /*
     *
     */
    QString SHactuator::msg(int payload)
    {
        /* command
        Type 	Value 	Comment
        presentation 	0 	Sent by a node when they present attached sensors. This is usually done in the presentation() function which runs at startup.
        set 	1 	This message is sent from or to a sensor when a sensor value should be updated
        req 	2 	Requests a variable value (usually from an actuator destined for controller).
        internal 	3 	This is a special internal message. See table below for the details
        stream 	4 	Used for OTA firmware updates
     */
    
        int command = C_SET;
        int ack = 1;
        int type = V_STATUS;
    
        QString msg =
                QString::number(m_nodeID) + ";" +
                QString::number(m_sensorID) + ";" +
                QString::number(command) + ";" +
                QString::number(ack) + ";" +
                QString::number(type) + ";" +
                QString::number(payload) + "\n";
    
        return msg;
    
    }
    
    
    
    
    
    /*
     *
     */
    void SHactuator::setSocket(QTcpSocket *newSocket)
    {
        m_socket = newSocket;
    }
    
    
    
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    #ifndef SHREMOTE
    
    /*
     *
     */
    void SHactuator::setSerial(QSerialPort *newSerial)
    {
        m_serial = newSerial;
    }
    
    Peter Altenbernd's avatar
    Peter Altenbernd committed
    #endif