From 716df71180792bce8073b0653772dc7646f24c55 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 5 Jan 2020 14:51:00 +0100 Subject: [PATCH] Support units in interfaces Adds validation for units in interfaces --- libnymea/devices/deviceutils.cpp | 10 ++++++++++ libnymea/devices/pluginmetadata.cpp | 6 ++++++ libnymea/interfaces/conductivitysensor.json | 2 +- libnymea/interfaces/extendedsmartmeterconsumer.json | 3 ++- libnymea/interfaces/smartmeterconsumer.json | 3 ++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/libnymea/devices/deviceutils.cpp b/libnymea/devices/deviceutils.cpp index 07126c91..2d639009 100644 --- a/libnymea/devices/deviceutils.cpp +++ b/libnymea/devices/deviceutils.cpp @@ -26,6 +26,7 @@ #include #include #include +#include DeviceUtils::DeviceUtils() { @@ -191,6 +192,15 @@ Interface DeviceUtils::loadInterface(const QString &name) stateType.setPossibleValues(stateVariant.toMap().value("allowedValues").toList()); stateType.setMinValue(stateVariant.toMap().value("minValue")); stateType.setMaxValue(stateVariant.toMap().value("maxValue")); + if (stateVariant.toMap().contains("unit")) { + QMetaEnum unitEnum = QMetaEnum::fromType(); + int enumValue = unitEnum.keyToValue("Unit" + stateVariant.toMap().value("unit").toByteArray()); + if (enumValue == -1) { + qCWarning(dcDeviceManager) << "Invalid unit" << stateVariant.toMap().value("unit").toString() << "in interface" << name; + } else { + stateType.setUnit(static_cast(unitEnum.keyToValue("Unit" + stateVariant.toMap().value("unit").toByteArray()))); + } + } stateTypes.append(stateType); EventType stateChangeEventType(EventTypeId::fromUuid(QUuid())); diff --git a/libnymea/devices/pluginmetadata.cpp b/libnymea/devices/pluginmetadata.cpp index 75aded84..7f000464 100644 --- a/libnymea/devices/pluginmetadata.cpp +++ b/libnymea/devices/pluginmetadata.cpp @@ -594,6 +594,12 @@ void PluginMetadata::parse(const QJsonObject &jsonObject) hasError = true; continue; } + if (ifaceStateType.unit() != Types::UnitNone && ifaceStateType.unit() != stateType.unit()) { + QMetaEnum unitEnum = QMetaEnum::fromType(); + m_validationErrors.append("Device class \"" + deviceClass.name() + "\" claims to implement interface \"" + value.toString() + "\" but state \"" + stateType.name() + "\" has not matching unit: \"" + unitEnum.valueToKey(ifaceStateType.unit()) + "\" != \"" + unitEnum.valueToKey(stateType.unit())); + hasError = true; + continue; + } } foreach (const ActionType &ifaceActionType, iface.actionTypes()) { diff --git a/libnymea/interfaces/conductivitysensor.json b/libnymea/interfaces/conductivitysensor.json index 088099fa..d1d9e63c 100644 --- a/libnymea/interfaces/conductivitysensor.json +++ b/libnymea/interfaces/conductivitysensor.json @@ -4,7 +4,7 @@ { "name": "conductivity", "type": "double", - "unit": "UnitMicroSiemensPerCentimeter" + "unit": "MicroSiemensPerCentimeter" } ] } diff --git a/libnymea/interfaces/extendedsmartmeterconsumer.json b/libnymea/interfaces/extendedsmartmeterconsumer.json index bca5393a..f476bd9e 100644 --- a/libnymea/interfaces/extendedsmartmeterconsumer.json +++ b/libnymea/interfaces/extendedsmartmeterconsumer.json @@ -4,7 +4,8 @@ "states": [ { "name": "currentPower", - "type": "double" + "type": "double", + "unit": "Watt" } ] } diff --git a/libnymea/interfaces/smartmeterconsumer.json b/libnymea/interfaces/smartmeterconsumer.json index b44c85c9..8ecffc4f 100644 --- a/libnymea/interfaces/smartmeterconsumer.json +++ b/libnymea/interfaces/smartmeterconsumer.json @@ -4,7 +4,8 @@ "states": [ { "name": "totalEnergyConsumed", - "type": "double" + "type": "double", + "unit": "KiloWattHour" } ] }