/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io
*
* This file is part of nymea.
* This project including source code and documentation is protected by
* copyright law, and remains the property of nymea GmbH. All rights, including
* reproduction, publication, editing and translation, are reserved. The use of
* this project is subject to the terms of a license agreement to be concluded
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
* under https://nymea.io/license
*
* GNU General Public License Usage
* Alternatively, this project may be redistributed and/or modified under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, GNU version 3. This project is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this project. If not, see .
*
* For any further details and any questions please contact us under
* contact@nymea.io or see our FAQ/Licensing Information on
* https://nymea.io/license/faq
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "airconditioningjsonhandler.h"
#include "airconditioningmanager.h"
Q_DECLARE_LOGGING_CATEGORY(dcAdaptiveLighting)
AirConditioningJsonHandler::AirConditioningJsonHandler(AirConditioningManager *manager, QObject *parent):
JsonHandler(parent),
m_manager(manager)
{
registerEnum();
registerFlag();
registerEnum();
registerObject();
registerObject();
registerList();
QVariantMap params, returns;
QString description;
params.clear(); returns.clear();
description = "Get all Zones.";
params.insert("o:zoneId", enumValueName(Uuid));
returns.insert("airConditioningError", enumRef());
returns.insert("zones", objectRef());
registerMethod("GetZones", description, params, returns, Types::PermissionScopeControlThings);
params.clear(); returns.clear();
description = "Create a zones.";
params.insert("name", enumValueName(String));
params.insert("o:thermostats", QVariantList() << enumValueName(Uuid));
params.insert("o:windowSensors", QVariantList() << enumValueName(Uuid));
params.insert("o:indoorSensors", QVariantList() << enumValueName(Uuid));
params.insert("o:outdoorSensors", QVariantList() << enumValueName(Uuid));
params.insert("o:notifications", QVariantList() << enumValueName(Uuid));
returns.insert("airConditioningError", enumRef());
returns.insert("o:zone", objectRef());
registerMethod("AddZone", description, params, returns);
params.clear(); returns.clear();
description = "Remove a zone.";
params.insert("zoneId", enumValueName(Uuid));
returns.insert("airConditioningError", enumRef());
registerMethod("RemoveZone", description, params, returns);
params.clear(); returns.clear();
description = "Set zone name.";
params.insert("zoneId", enumValueName(Uuid));
params.insert("name", enumValueName(String));
returns.insert("airConditioningError", enumRef());
registerMethod("SetZoneName", description, params, returns);
params.clear(); returns.clear();
description = "Set zone standby setpoint temperature.";
params.insert("zoneId", enumValueName(Uuid));
params.insert("standbySetpoint", enumValueName(Double));
returns.insert("airConditioningError", enumRef());
registerMethod("SetZoneStandbySetpoint", description, params, returns);
params.clear(); returns.clear();
description = "Set zone setpoint override temperature. Parameter minutes gives the minutes until the setpoint should return to the standby/schedule.";
params.insert("zoneId", enumValueName(Uuid));
params.insert("setpointOverride", enumValueName(Double));
params.insert("mode", enumRef());
params.insert("o:minutes", enumValueName(Int));
returns.insert("airConditioningError", enumRef());
registerMethod("SetZoneSetpointOverride", description, params, returns, Types::PermissionScopeControlThings);
params.clear(); returns.clear();
description = "Set the time schedule for a zone.";
params.insert("zoneId", enumValueName(Uuid));
params.insert("weekSchedule", objectRef());
returns.insert("airConditioningError", enumRef());
registerMethod("SetZoneWeekSchedule", description, params, returns, Types::PermissionScopeControlThings);
params.clear(); returns.clear();
description = "Set Zone things";
params.insert("zoneId", enumValueName(Uuid));
params.insert("o:thermostats", QVariantList() << enumValueName(Uuid));
params.insert("o:windowSensors", QVariantList() << enumValueName(Uuid));
params.insert("o:indoorSensors", QVariantList() << enumValueName(Uuid));
params.insert("o:outdoorSensors", QVariantList() << enumValueName(Uuid));
params.insert("o:notifications", QVariantList() << enumValueName(Uuid));
returns.insert("airConditioningError", enumRef());
registerMethod("SetZoneThings", description, params, returns);
params.clear();
description = "Emitted whenever a zone is added";
params.insert("zone", objectRef());
registerNotification("ZoneAdded", description, params);
params.clear();
description = "Emitted whenever a zone is removed";
params.insert("zoneId", enumValueName(Uuid));
registerNotification("ZoneRemoved", description, params);
params.clear();
description = "Emitted whenever a zone changes";
params.insert("zone", objectRef());
registerNotification("ZoneChanged", description, params);
connect(manager, &AirConditioningManager::zoneAdded, this, [=](const ZoneInfo &zone){
emit ZoneAdded({{"zone", pack(zone)}});
});
connect(manager, &AirConditioningManager::zoneRemoved, this, [=](const QUuid &zoneId){
emit ZoneRemoved({{"zoneId", zoneId}});
});
connect(manager, &AirConditioningManager::zoneChanged, this, [=](const ZoneInfo &zone){
emit ZoneChanged({{"zone", pack(zone)}});
});
}
QString AirConditioningJsonHandler::name() const
{
return "AirConditioning";
}
JsonReply *AirConditioningJsonHandler::GetZones(const QVariantMap ¶ms)
{
ZoneInfos zones;
if (params.contains("zoneId")) {
QUuid zoneId = ThingId(params.value("zoneId").toUuid());
zones = ZoneInfos({m_manager->zone(zoneId)});
} else {
zones = m_manager->zones();
}
return createReply({
{"airConditioningError", enumValueName(AirConditioningManager::AirConditioningErrorNoError)},
{"zones", pack(zones)}
});
}
JsonReply *AirConditioningJsonHandler::AddZone(const QVariantMap ¶ms)
{
QList thermostats, windowSensors, indoorSensors, outdoorSensors, notifications;
foreach (const QVariant &id, params.value("thermostats").toList()) {
thermostats.append(id.toUuid());
}
foreach (const QVariant &id, params.value("windowSensors").toList()) {
windowSensors.append(id.toUuid());
}
foreach (const QVariant &id, params.value("indoorSensors").toList()) {
indoorSensors.append(id.toUuid());
}
foreach (const QVariant &id, params.value("outdoorSensors").toList()) {
outdoorSensors.append(id.toUuid());
}
foreach (const QVariant &id, params.value("notificatiosn").toList()) {
notifications.append(id.toUuid());
}
QPair status = m_manager->addZone(params.value("name").toString(), thermostats, windowSensors, indoorSensors, outdoorSensors, notifications);
QVariantMap ret = {
{"airConditioningError", enumValueName(status.first)}
};
if (status.first == AirConditioningManager::AirConditioningErrorNoError) {
ret.insert("zone", pack(status.second));
}
return createReply(ret);
}
JsonReply *AirConditioningJsonHandler::RemoveZone(const QVariantMap ¶ms)
{
AirConditioningManager::AirConditioningError status = m_manager->removeZone(params.value("zoneId").toUuid());
return createReply({{"airConditioningError", enumValueName(status)}});
}
JsonReply *AirConditioningJsonHandler::SetZoneName(const QVariantMap ¶ms)
{
AirConditioningManager::AirConditioningError status = m_manager->setZoneName(params.value("zoneId").toUuid(), params.value("name").toString());
return createReply({
{"airConditioningError", enumValueName(status)}
});
}
JsonReply *AirConditioningJsonHandler::SetZoneStandbySetpoint(const QVariantMap ¶ms)
{
QUuid zoneId = params.value("zoneId").toUuid();
double standbySetpoint = params.value("standbySetpoint").toDouble();
AirConditioningManager::AirConditioningError status = m_manager->setZoneStandbySetpoint(zoneId, standbySetpoint);
return createReply({{"airConditioningError", enumValueName(status)}});
}
JsonReply *AirConditioningJsonHandler::SetZoneSetpointOverride(const QVariantMap ¶ms)
{
QUuid zoneId = params.value("zoneId").toUuid();
double standbySetpoint = params.value("setpointOverride").toDouble();
QMetaEnum modeEnum = QMetaEnum::fromType();
ZoneInfo::SetpointOverrideMode mode = static_cast(modeEnum.keyToValue(params.value("mode").toByteArray()));
uint minutes = params.value("minutes", 0).toUInt();
AirConditioningManager::AirConditioningError status = m_manager->setZoneSetpointOverride(zoneId, standbySetpoint, mode, minutes);
return createReply({{"airConditioningError", enumValueName(status)}});
}
JsonReply *AirConditioningJsonHandler::SetZoneWeekSchedule(const QVariantMap ¶ms)
{
TemperatureWeekSchedule weekSchedule = unpack(params.value("weekSchedule"));
QUuid zoneId = params.value("zoneId").toUuid();
AirConditioningManager::AirConditioningError status = m_manager->setZoneWeekSchedules(zoneId, weekSchedule);
return createReply({{"airConditioningError", enumValueName(status)}});
}
JsonReply *AirConditioningJsonHandler::SetZoneThings(const QVariantMap ¶ms)
{
QUuid zoneId = params.value("zoneId").toUuid();
ZoneInfo zone = m_manager->zone(zoneId);
QList thermostats, windowSensors, indoorSensors, outdoorSensors, notifications;
if (params.contains("thermostats")) {
foreach (const QVariant &variant, params.value("thermostats").toList()) {
thermostats.append(ThingId(variant.toUuid()));
}
} else {
thermostats = zone.thermostats();
}
if (params.contains("windowSensors")) {
foreach (const QVariant &variant, params.value("windowSensors").toList()) {
windowSensors.append(ThingId(variant.toUuid()));
}
} else {
windowSensors = zone.windowSensors();
}
if (params.contains("indoorSensors")) {
foreach (const QVariant &variant, params.value("indoorSensors").toList()) {
indoorSensors.append(ThingId(variant.toUuid()));
}
} else {
indoorSensors = zone.indoorSensors();
}
if (params.contains("outdoorSensors")) {
foreach (const QVariant &variant, params.value("outdoorSensors").toList()) {
outdoorSensors.append(ThingId(variant.toUuid()));
}
} else {
outdoorSensors = zone.outdoorSensors();
}
if (params.contains("notifications")) {
foreach (const QVariant &variant, params.value("notifications").toList()) {
notifications.append(ThingId(variant.toUuid()));
}
} else {
notifications = zone.notifications();
}
AirConditioningManager::AirConditioningError status = m_manager->setZoneThings(zoneId, thermostats, windowSensors, indoorSensors, outdoorSensors, notifications);
return createReply({{"airConditioningError", enumValueName(status)}});
}