Thermostat pour piloter jusqu'à 4 radiateurs avec fil pilote
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

126 lines
3.0 KiB

// SPDX-License-Identifier: GPL-3.0-or-later
/*
* Qt mutizone MQTT thermostat
*
* Copyright (C) 2019 Richard Genoud
*
*/
#include <QEventLoop>
#include <QDateTime>
#include <QElapsedTimer>
#include <QHostInfo>
#include <QHostAddress>
#include <QLoggingCategory>
#include "qmqtt.h"
#include "backgroundloop.h"
#define MQTT_SERVER "nas"
#define MQTT_PORT 1883
#define MQTT_USERNAME ""
#define MQTT_PASSWORD ""
#define MQTT_CLIENT_ID ""
#define LOOP_SLEEP_TIME_S 5
BackgroundLoop::BackgroundLoop() {
m_mqtt_client = NULL;
qsrand((uint)QDateTime::currentMSecsSinceEpoch());
}
BackgroundLoop::~BackgroundLoop() {
}
bool BackgroundLoop::connectMQTT()
{
QHostInfo info;
QHostAddress address;
bool result = false, ok;
if (m_mqtt_client) {
delete m_mqtt_client;
m_mqtt_client = NULL;
}
ok = address.setAddress(MQTT_SERVER);
if (!ok) {
/* This must be a domain name, not an IP */
info = QHostInfo::fromName(MQTT_SERVER);
if (info.error() != QHostInfo::NoError) {
qWarning() << QString("Error looking for address %1").arg(MQTT_SERVER)
<< info.errorString();
goto out;
}
if (info.addresses().isEmpty()) {
qWarning() << QString("No address returned for %1").arg(MQTT_SERVER);
goto out;
}
address = info.addresses().first();
}
m_mqtt_client = new QMQTT::Client(address, MQTT_PORT);
if (!m_mqtt_client) {
qWarning() << QString("Error allocating memory for MQTT client");
goto out;
}
if (QString(MQTT_CLIENT_ID).isEmpty()) {
m_mqtt_client->setClientId(QString("thermostat%1").arg(qrand()));
} else {
m_mqtt_client->setClientId(MQTT_CLIENT_ID);
}
connect(m_mqtt_client, SIGNAL(connected()), this, SLOT(mqtt_connected()));
connect(m_mqtt_client, SIGNAL(disconnected()), this, SLOT(mqtt_disconnected()));
connect(m_mqtt_client, SIGNAL(error(const QMQTT::ClientError)),
this, SLOT(mqtt_error(const QMQTT::ClientError)));
connect(m_mqtt_client, SIGNAL(subscribed(const QString&, const quint8)),
this, SLOT(mqtt_subscribed(const QString&, const quint8)));
connect(m_mqtt_client, SIGNAL(received(const QMQTT::Message&)),
this, SLOT(mqtt_received(const QMQTT::Message&)));
m_mqtt_client->setUsername(MQTT_USERNAME);
m_mqtt_client->setPassword(MQTT_PASSWORD);
m_mqtt_client->connectToHost();
result = true;
out:
return result;
}
void BackgroundLoop::mqtt_connected(void)
{
qDebug() << "MQTT connected !";
}
void BackgroundLoop::mqtt_disconnected(void)
{
qDebug() << "MQTT disconnected !";
}
void BackgroundLoop::mqtt_error(const QMQTT::ClientError error)
{
qDebug() << "MQTT error ! code: " << error;
}
void BackgroundLoop::mqtt_subscribed(const QString& topic, const quint8 qos)
{
qDebug() << "MQTT subscribed! topic: " << topic << " QoS: " << qos;
}
void BackgroundLoop::mqtt_received(const QMQTT::Message& message)
{
qDebug() << "MQTT recieved: " << QString::fromUtf8(message.payload());
}
void BackgroundLoop::run()
{
connectMQTT();
while(!isInterruptionRequested()) {
this->sleep(LOOP_SLEEP_TIME_S);
}
}
/* vim: set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab: */