// SPDX-License-Identifier: GPL-3.0-or-later
|
|
/*
|
|
* Qt mutizone MQTT thermostat
|
|
*
|
|
* Copyright (C) 2019 Richard Genoud
|
|
*
|
|
*/
|
|
|
|
#include <QtWidgets>
|
|
#include <QPushButton>
|
|
#include <QTime>
|
|
#include <QLocale>
|
|
#include <QVector>
|
|
|
|
#include "mqttclient.h"
|
|
#include "zoneitem.h"
|
|
#include "settings.h"
|
|
#include "mainwindow.h"
|
|
|
|
MainWindow::MainWindow(QWidget *parent) :
|
|
QMainWindow(parent)
|
|
{
|
|
ZoneItem *zone;
|
|
Settings *s = Settings::getInstance();
|
|
MQTTClient *mqttclient = MQTTClient::getInstance();
|
|
|
|
for (int i = 0; i < s->nbZones(); i++) {
|
|
zone = new ZoneItem(s->m_rooms.at(i).name, this);
|
|
m_zones << zone;
|
|
}
|
|
|
|
connect(mqttclient, SIGNAL(new_temperature(int, double)),
|
|
this, SLOT(temperature_slot(int, double)));
|
|
connect(mqttclient, SIGNAL(new_hygro(int, double)),
|
|
this, SLOT(hygro_slot(int, double)));
|
|
|
|
connect(mqttclient, SIGNAL(new_availability(int, bool)),
|
|
this, SLOT(availability_slot(int, bool)));
|
|
/*
|
|
* Sensors-related layout
|
|
*/
|
|
QGridLayout *mainLayout = new QGridLayout;
|
|
|
|
m_state_btn.setText(tr("Auto"));
|
|
|
|
if (s->nbZones() < 4) {
|
|
// TODO
|
|
qDebug() << "bad configuration" ;
|
|
} else {
|
|
mainLayout->addWidget(m_zones.at(0), 0, 0);
|
|
mainLayout->addWidget(m_zones.at(1), 0, 1);
|
|
mainLayout->addWidget(new QPushButton(tr("Menu")), 0, 2);
|
|
mainLayout->addWidget(m_zones.at(2), 1, 0);
|
|
mainLayout->addWidget(m_zones.at(3), 1, 1);
|
|
mainLayout->addWidget(&m_state_btn, 1, 2);
|
|
}
|
|
m_pwr_state = OFF;
|
|
update_state_btn(m_pwr_state);
|
|
|
|
QWidget *mainWidget = new QWidget;
|
|
mainWidget->setLayout(mainLayout);
|
|
/*
|
|
* Top widget
|
|
*/
|
|
setCentralWidget(mainWidget);
|
|
|
|
setWindowTitle(tr("Sorico's thermostat"));
|
|
m_backLoop.start();
|
|
|
|
connect(&m_state_btn, SIGNAL(clicked()), this, SLOT(change_state()));
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
}
|
|
|
|
void MainWindow::update_state_btn(enum power_states st)
|
|
{
|
|
switch (st) {
|
|
case OFF:
|
|
m_state_btn.setText(tr("Force off"));
|
|
break;
|
|
case ON:
|
|
m_state_btn.setText(tr("Force on"));
|
|
break;
|
|
case AUTO:
|
|
m_state_btn.setText(tr("Auto"));
|
|
break;
|
|
default:
|
|
m_state_btn.setText(tr("Error"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
void MainWindow::change_state(void)
|
|
{
|
|
switch (m_pwr_state) {
|
|
case OFF:
|
|
m_pwr_state = ON;
|
|
break;
|
|
case ON:
|
|
m_pwr_state = AUTO;
|
|
break;
|
|
case AUTO:
|
|
/* fall through */
|
|
default:
|
|
m_pwr_state = OFF;
|
|
break;
|
|
}
|
|
update_state_btn(m_pwr_state);
|
|
}
|
|
|
|
void MainWindow::temperature_slot(int idx, double val)
|
|
{
|
|
Settings *s = Settings::getInstance();
|
|
|
|
qDebug() << "temperature idx:" << idx << " val: " << val << endl;
|
|
if (idx < s->nbZones()) {
|
|
m_zones.at(idx)->set_temperature_value(val);
|
|
}
|
|
}
|
|
|
|
void MainWindow::hygro_slot(int idx, double val)
|
|
{
|
|
Settings *s = Settings::getInstance();
|
|
|
|
qDebug() << "hygro idx:" << idx << " val: " << val << endl;
|
|
if (idx < s->nbZones()) {
|
|
m_zones.at(idx)->set_hygro_value(val);
|
|
}
|
|
}
|
|
void MainWindow::availability_slot(int idx, bool ok)
|
|
{
|
|
Settings *s = Settings::getInstance();
|
|
|
|
if ((idx < s->nbZones()) && !ok) {
|
|
m_zones.at(idx)->set_hygro_value(0);
|
|
m_zones.at(idx)->set_temperature_value(0);
|
|
}
|
|
}
|
|
|
|
/* vim: set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab: */
|