Support units in interfaces

Adds validation for units in interfaces
This commit is contained in:
Michael Zanetti 2020-01-05 14:51:00 +01:00
parent 6cdcd47f9b
commit 716df71180
5 changed files with 21 additions and 3 deletions

View File

@ -26,6 +26,7 @@
#include <QDir>
#include <QFileInfo>
#include <QJsonParseError>
#include <QMetaEnum>
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<Types::Unit>();
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<Types::Unit>(unitEnum.keyToValue("Unit" + stateVariant.toMap().value("unit").toByteArray())));
}
}
stateTypes.append(stateType);
EventType stateChangeEventType(EventTypeId::fromUuid(QUuid()));

View File

@ -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<Types::Unit>();
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()) {

View File

@ -4,7 +4,7 @@
{
"name": "conductivity",
"type": "double",
"unit": "UnitMicroSiemensPerCentimeter"
"unit": "MicroSiemensPerCentimeter"
}
]
}

View File

@ -4,7 +4,8 @@
"states": [
{
"name": "currentPower",
"type": "double"
"type": "double",
"unit": "Watt"
}
]
}

View File

@ -4,7 +4,8 @@
"states": [
{
"name": "totalEnergyConsumed",
"type": "double"
"type": "double",
"unit": "KiloWattHour"
}
]
}