diff --git a/libnymea/devices/deviceutils.cpp b/libnymea/devices/deviceutils.cpp index b2d81572..fdde03d3 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; 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" } ] }