|
|
- // SPDX-License-Identifier: GPL-3.0-or-later
- /*
- * Qt mutizone MQTT thermostat
- *
- * Copyright (C) 2019 Richard Genoud
- *
- */
-
- #include <QTranslator>
- #include <QSettings>
- #include <QString>
- #include <QDebug>
-
- #include "settings.h"
-
- const char default_room_names[MAX_NB_ZONES][42] = {
- "Bedroom",
- "Living Room",
- "Workspace",
- "Bathroom"
- };
-
- const char default_sensors_topics[MAX_NB_ZONES][64] = {
- "sensors/bedroom/xiaomi",
- "sensors/living_room/xiaomi",
- "sensors/workspace/xiaomi",
- "sensors/bathroom/xiaomi"
- };
-
- const char default_availability_topics[MAX_NB_ZONES][64] = {
- "sensors/bedroom/availability",
- "sensors/living_room/availability",
- "sensors/workspace/availability",
- "sensors/bathroom/availability"
- };
-
- const char default_control_topics[MAX_NB_ZONES][64] = {
- "heaters/bedroom",
- "heaters/living_room",
- "heaters/workspace",
- "heaters/bathroom"
- };
-
- Settings *Settings::_singleton = NULL;
-
- Settings::Settings(QObject *parent) : QSettings(parent)
- {
- struct Room room;
- struct Heater heater;
- struct Program program;
- int nb_rooms;
-
- nb_rooms = this->beginReadArray("rooms");
- if (nb_rooms == 0) {
- this->endArray();
- set_rooms_default_config();
- nb_rooms = this->beginReadArray("rooms");
- }
-
- if (nb_rooms > MAX_NB_ZONES) {
- // TODO;
- nb_rooms = MAX_NB_ZONES;
- }
-
- // TODO: handle unset values in a better way
- for (int i = 0; i < nb_rooms; ++i) {
- this->setArrayIndex(i);
- room.name = this->value("name", default_room_names[i]).toString();
- room.sensor_topic = this->value("sensor_topic", default_sensors_topics[i]).toString();
- room.availability_topic = this->value("availability_topic",
- default_availability_topics[i]).toString();
- int size = this->beginReadArray("heaters");
- for (int j = 0; j < size; ++j) {
- this->setArrayIndex(j);
- heater.ctrl_topic = this->value("control_topic", "").toString();
- room.heaters << heater;
- }
- this->endArray();
- room.default_temperature = this->value("default_temperature", 20).toDouble();
- size = this->beginReadArray("temperature_schedule");
- for (int j = 0; j < size; ++j) {
- this->setArrayIndex(j);
- program.temperature = this->value("temperature", 20).toDouble();
- program.DoW = this->value("days_of_week", 127).toInt();
- program.start_time = QTime::fromString(this->value("start_time", "").toString(), "H:m");
- program.end_time = QTime::fromString(this->value("end_time", "").toString(), "H:m");
- if (program.start_time.isValid() && program.end_time.isValid() &&
- (program.DoW > 0) && (program.DoW < 128)) {
- room.progs << program;
- }
- }
- this->endArray();
- m_rooms << room;
- }
- this->endArray();
- m_broker.address = this->value("broker/address", "localhost").toString();
- m_broker.port = this->value("broker/port", 1883).toInt();
- }
-
- void Settings::set_rooms_default_config(void)
- {
- this->beginWriteArray("rooms");
-
- for (int i = 0; i < MAX_NB_ZONES; i++) {
- this->setArrayIndex(i);
- this->setValue("name", tr(default_room_names[i]));
- this->setValue("sensor_topic", default_sensors_topics[i]);
- this->setValue("availability_topic", default_availability_topics[i]);
- this->setValue("default_temperature", 20);
- this->beginWriteArray("heaters");
- this->setArrayIndex(0);
- this->setValue("control_topic", default_control_topics[i]);
- this->endArray();
- }
-
- this->setArrayIndex(0);
- this->beginWriteArray("temperature_schedule");
- this->setArrayIndex(0);
- this->setValue("temperature", 18);
- this->setValue("days_of_week", 127);
- this->setValue("start_time", QTime(22,0).toString("H:m"));
- this->setValue("end_time", QTime(7,0).toString("H:m"));
- this->endArray();
-
-
- this->setArrayIndex(3);
- this->beginWriteArray("temperature_schedule");
- this->setArrayIndex(0);
- this->setValue("temperature", 99); // Force On
- this->setValue("days_of_week", 31);
- this->setValue("start_time", QTime(6,30).toString("H:m"));
- this->setValue("end_time", QTime(7,0).toString("H:m"));
- this->setArrayIndex(1);
- this->setValue("temperature", 99); // Force On
- this->setValue("days_of_week", 96);
- this->setValue("start_time", QTime(7,30).toString("H:m"));
- this->setValue("end_time", QTime(8,0).toString("H:m"));
- this->endArray();
-
- this->endArray();
- this->sync();
- }
-
- int Settings::nbZones(void)
- {
- return m_rooms.size();
- }
-
- Settings::~Settings(void)
- {
- }
-
- Settings *Settings::getInstance(void)
- {
- if (!_singleton) {
- _singleton = new Settings();
- }
-
- return _singleton;
- }
-
- /* vim: set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab: */
-
-
|