diff --git a/homeconnect/homeconnect.cpp b/homeconnect/homeconnect.cpp index d13c9004..9834c44f 100644 --- a/homeconnect/homeconnect.cpp +++ b/homeconnect/homeconnect.cpp @@ -113,7 +113,8 @@ bool HomeConnect::checkStatusCode(int status, const QByteArray &payload) QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(payload, &error); if (error.error != QJsonParseError::NoError) { - qCWarning(dcHomeConnect()) << "Received invalide JSON object"; + qCWarning(dcHomeConnect()) << "Received invalide JSON object" << payload; + qCWarning(dcHomeConnect()) << "Status" << status; return false; } @@ -290,6 +291,38 @@ void HomeConnect::getHomeAppliances() }); } +void HomeConnect::getPrograms(const QString &haId) +{ + QUrl url = QUrl(m_baseControlUrl+"/api/homeappliances/"+haId+"/programs"); + + QNetworkRequest request(url); + request.setRawHeader("Authorization", "Bearer "+m_accessToken); + request.setRawHeader("Accept-Language", "en-US"); + request.setRawHeader("accept", "application/vnd.bsh.sdk.v1+json"); + + QNetworkReply *reply = m_networkManager->get(request); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); + connect(reply, &QNetworkReply::finished, this, [this, haId, reply]{ + + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + QByteArray rawData = reply->readAll(); + checkStatusCode(status, rawData); + + QVariantMap dataMap = QJsonDocument::fromJson(rawData).toVariant().toMap().value("data").toMap(); + + qCDebug(dcHomeConnect()) << "Get programs available" << rawData; + QVariantList programList = dataMap.value("programs").toList(); + QStringList programs; + Q_FOREACH(QVariant var, programList) { + if (var.toMap().contains("key")) { + programs.append(var.toMap().value("key").toString()); + } + } + if (!programs.isEmpty()) + emit receivedPrograms(haId, programs); + }); +} + void HomeConnect::getProgramsAvailable(const QString &haId) { QUrl url = QUrl(m_baseControlUrl+"/api/homeappliances/"+haId+"/programs/available"); @@ -308,7 +341,8 @@ void HomeConnect::getProgramsAvailable(const QString &haId) checkStatusCode(status, rawData); QVariantMap dataMap = QJsonDocument::fromJson(rawData).toVariant().toMap().value("data").toMap(); - qCDebug(dcHomeConnect()) << "Get programs available" << dataMap; + + qCDebug(dcHomeConnect()) << "Get programs available" << rawData; QVariantList programList = dataMap.value("programs").toList(); QStringList programs; Q_FOREACH(QVariant var, programList) { @@ -340,7 +374,7 @@ void HomeConnect::getProgramsActive(const QString &haId) QVariantMap dataMap = QJsonDocument::fromJson(rawData).toVariant().toMap().value("data").toMap(); - qCDebug(dcHomeConnect()) << "Get programs active" << dataMap; + qCDebug(dcHomeConnect()) << "Get programs active" << rawData; QString key = dataMap.value("key").toString(); QHash options; Q_FOREACH(QVariant var, dataMap.value("options").toList()) { @@ -368,7 +402,7 @@ void HomeConnect::getProgramsSelected(const QString &haId) checkStatusCode(status, rawData); QVariantMap dataMap = QJsonDocument::fromJson(rawData).toVariant().toMap().value("data").toMap(); - qCDebug(dcHomeConnect()) << "Get program selected" << dataMap; + qCDebug(dcHomeConnect()) << "Get program selected" << rawData; QString key = dataMap.value("key").toString(); QHash options; Q_FOREACH(QVariant var, dataMap.value("options").toList()) { diff --git a/homeconnect/homeconnect.h b/homeconnect/homeconnect.h index d0cee99e..ee934ec7 100644 --- a/homeconnect/homeconnect.h +++ b/homeconnect/homeconnect.h @@ -113,6 +113,7 @@ public: void getHomeAppliance(const QString &haid); //Get a specfic home appliances which are paired with the logged-in user account. // PROGRAMS + void getPrograms(const QString &haId); //Get all programs of a given home appliance void getProgramsAvailable(const QString &haId); //Get all programs which are currently available on the given home appliance void getProgramsActive(const QString &haId); //Get program which is currently executed void getProgramsSelected(const QString &haId); //Get the program which is currently selected @@ -156,6 +157,7 @@ signals: void receivedHomeAppliances(const QList &appliances); void receivedStatusList(const QString &haId, const QHash &statusList); + void receivedPrograms(const QString &haId, const QStringList &programs); void receivedAvailablePrograms(const QString &haId, const QStringList &programs); void receivedSettings(const QString &haId, const QHash &settings); void receivedActiveProgram(const QString &haId, const QString &key, const QHash &options); diff --git a/homeconnect/integrationpluginhomeconnect.cpp b/homeconnect/integrationpluginhomeconnect.cpp index 5e141a06..cd6e9301 100644 --- a/homeconnect/integrationpluginhomeconnect.cpp +++ b/homeconnect/integrationpluginhomeconnect.cpp @@ -43,7 +43,7 @@ IntegrationPluginHomeConnect::IntegrationPluginHomeConnect() m_idParamTypeIds.insert(ovenThingClassId, ovenThingIdParamTypeId); m_idParamTypeIds.insert(fridgeThingClassId, fridgeThingIdParamTypeId); m_idParamTypeIds.insert(dryerThingClassId, dryerThingIdParamTypeId); - m_idParamTypeIds.insert(coffeMakerThingClassId, coffeMakerThingIdParamTypeId); + m_idParamTypeIds.insert(coffeeMakerThingClassId, coffeeMakerThingIdParamTypeId); m_idParamTypeIds.insert(dishwasherThingClassId, dishwasherThingIdParamTypeId); m_idParamTypeIds.insert(washerThingClassId, washerThingIdParamTypeId); m_idParamTypeIds.insert(cookTopThingClassId, cookTopThingIdParamTypeId); @@ -53,7 +53,7 @@ IntegrationPluginHomeConnect::IntegrationPluginHomeConnect() m_connectedStateTypeIds.insert(ovenThingClassId, ovenConnectedStateTypeId); m_connectedStateTypeIds.insert(fridgeThingClassId, fridgeConnectedStateTypeId); m_connectedStateTypeIds.insert(dryerThingClassId, dryerConnectedStateTypeId); - m_connectedStateTypeIds.insert(coffeMakerThingClassId, coffeMakerConnectedStateTypeId); + m_connectedStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerConnectedStateTypeId); m_connectedStateTypeIds.insert(dishwasherThingClassId, dishwasherConnectedStateTypeId); m_connectedStateTypeIds.insert(washerThingClassId, washerConnectedStateTypeId); m_connectedStateTypeIds.insert(cookTopThingClassId, cookTopConnectedStateTypeId); @@ -63,7 +63,7 @@ IntegrationPluginHomeConnect::IntegrationPluginHomeConnect() m_localControlStateTypeIds.insert(ovenThingClassId, ovenLocalControlStateStateTypeId); //m_localControlStateTypeIds.insert(fridgeThingClassId, fridgeLocalControlStateStateTypeId); //m_localControlStateTypeIds.insert(dryerThingClassId, dryerLocalControlStateTypeId); - m_localControlStateTypeIds.insert(coffeMakerThingClassId, coffeMakerLocalControlStateStateTypeId); + m_localControlStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerLocalControlStateStateTypeId); //m_localControlStateTypeIds.insert(dishwasherThingClassId, dishwasherLocalControlStateStateTypeId); m_localControlStateTypeIds.insert(washerThingClassId, washerLocalControlStateStateTypeId); //m_localControlStateTypeIds.insert(cookTopThingClassId, cookTopLocalControlStateStateTypeId); @@ -73,7 +73,7 @@ IntegrationPluginHomeConnect::IntegrationPluginHomeConnect() m_remoteStartAllowanceStateTypeIds.insert(ovenThingClassId, ovenRemoteStartAllowanceStateStateTypeId); //m_remoteStartAllowanceStateTypeIds.insert(fridgeThingClassId, fridgeRemoteStartAllowanceStateStateTypeId); m_remoteStartAllowanceStateTypeIds.insert(dryerThingClassId, dryerRemoteStartAllowanceStateStateTypeId); - m_remoteStartAllowanceStateTypeIds.insert(coffeMakerThingClassId, coffeMakerRemoteStartAllowanceStateStateTypeId); + m_remoteStartAllowanceStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerRemoteStartAllowanceStateStateTypeId); m_remoteStartAllowanceStateTypeIds.insert(dishwasherThingClassId, dishwasherRemoteStartAllowanceStateStateTypeId); m_remoteStartAllowanceStateTypeIds.insert(washerThingClassId, washerRemoteStartAllowanceStateStateTypeId); //m_remoteStartAllowanceStateTypeIds.insert(cookTopThingClassId, cookTopRemoteStartAllowanceStateStateTypeId); @@ -83,27 +83,47 @@ IntegrationPluginHomeConnect::IntegrationPluginHomeConnect() m_remoteControlActivationStateTypeIds.insert(ovenThingClassId, ovenRemoteControlActivationStateStateTypeId); //m_remoteControlActivationStateTypeIds.insert(fridgeThingClassId, fridgeRemoteControlActivationStateStateTypeId); m_remoteControlActivationStateTypeIds.insert(dryerThingClassId, dryerRemoteControlActivationStateStateTypeId); - //m_remoteControlActivationStateTypeIds.insert(coffeMakerThingClassId, coffeMakerRemoteControlActivationStateStateTypeId); + //m_remoteControlActivationStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerRemoteControlActivationStateStateTypeId); m_remoteControlActivationStateTypeIds.insert(dishwasherThingClassId, dishwasherRemoteControlActivationStateStateTypeId); m_remoteControlActivationStateTypeIds.insert(washerThingClassId, washerRemoteControlActivationStateStateTypeId); //m_remoteControlActivationStateTypeIds.insert(cookTopThingClassId, cookTopRemoteControlActivationStateStateTypeId); //m_remoteControlActivationStateTypeIds.insert(cleaningRobotThingClassId, cleaningRobotRemoteControlActivationStateStateTypeId); //m_remoteControlActivationStateTypeIds.insert(hoodThingClassId, hoodRemoteControlActivationStateStateTypeId); - m_doorStateTypeIds.insert(dishwasherThingClassId, dishwasherDoorStateEventTypeId); - m_doorStateTypeIds.insert(washerThingClassId, washerDoorStateEventTypeId); - m_doorStateTypeIds.insert(dryerThingClassId, dryerDoorStateEventTypeId); - m_doorStateTypeIds.insert(ovenThingClassId, ovenDoorStateEventTypeId); + m_doorStateTypeIds.insert(dishwasherThingClassId, dishwasherDoorStateStateTypeId); + m_doorStateTypeIds.insert(washerThingClassId, washerDoorStateStateTypeId); + m_doorStateTypeIds.insert(dryerThingClassId, dryerDoorStateStateTypeId); + m_doorStateTypeIds.insert(ovenThingClassId, ovenDoorStateStateTypeId); - m_operationStateTypeIds.insert(ovenThingClassId, ovenOperationStateEventTypeId); - //m_operationStateTypeIds.insert(fridgeThingClassId, fridgeOperationStateEventTypeId); - m_operationStateTypeIds.insert(dryerThingClassId, dryerOperationStateEventTypeId); - m_operationStateTypeIds.insert(coffeMakerThingClassId, coffeMakerOperationStateEventTypeId); - m_operationStateTypeIds.insert(dishwasherThingClassId, dishwasherOperationStateEventTypeId); - m_operationStateTypeIds.insert(washerThingClassId, washerOperationStateEventTypeId); - //m_operationStateTypeIds.insert(cookTopThingClassId, cookTopOperationStateEventTypeId); - //m_operationStateTypeIds.insert(cleaningRobotThingClassId, cleaningRobotOperationStateEventTypeId); - //m_operationStateTypeIds.insert(hoodThingClassId, hoodOperationStateEventTypeId); + m_operationStateTypeIds.insert(ovenThingClassId, ovenOperationStateStateTypeId); + //m_operationStateTypeIds.insert(fridgeThingClassId, fridgeOperationStateStateTypeId); + m_operationStateTypeIds.insert(dryerThingClassId, dryerOperationStateStateTypeId); + m_operationStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerOperationStateStateTypeId); + m_operationStateTypeIds.insert(dishwasherThingClassId, dishwasherOperationStateStateTypeId); + m_operationStateTypeIds.insert(washerThingClassId, washerOperationStateStateTypeId); + //m_operationStateTypeIds.insert(cookTopThingClassId, cookTopOperationStateStateTypeId); + //m_operationStateTypeIds.insert(cleaningRobotThingClassId, cleaningRobotOperationStateStateTypeId); + //m_operationStateTypeIds.insert(hoodThingClassId, hoodOperationStateStateTypeId); + + m_selectedProgramStateTypeIds.insert(ovenThingClassId, ovenSelectedProgramStateTypeId); + //m_selectedProgramStateTypeIds.insert(fridgeThingClassId, fridgeSelectedProgramStateTypeId); + m_selectedProgramStateTypeIds.insert(dryerThingClassId, dryerSelectedProgramStateTypeId); + m_selectedProgramStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerSelectedProgramStateTypeId); + m_selectedProgramStateTypeIds.insert(dishwasherThingClassId, dishwasherSelectedProgramStateTypeId); + m_selectedProgramStateTypeIds.insert(washerThingClassId, washerSelectedProgramStateTypeId); + //m_selectedProgramStateTypeIds.insert(cookTopThingClassId, cookTopSelectedProgramStateTypeId); + //m_selectedProgramStateTypeIds.insert(cleaningRobotThingClassId, cleaningRobotSelectedProgramStateTypeId); + //m_selectedProgramStateTypeIds.insert(hoodThingClassId, hoodSelectedProgramStateTypeId); + + m_activeProgramStateTypeIds.insert(ovenThingClassId, ovenActiveProgramStateTypeId); + //m_activeProgramStateTypeIds.insert(fridgeThingClassId, fridgeActiveProgramStateTypeId); + m_activeProgramStateTypeIds.insert(dryerThingClassId, dryerActiveProgramStateTypeId); + m_activeProgramStateTypeIds.insert(coffeeMakerThingClassId, coffeeMakerActiveProgramStateTypeId); + m_activeProgramStateTypeIds.insert(dishwasherThingClassId, dishwasherActiveProgramStateTypeId); + m_activeProgramStateTypeIds.insert(washerThingClassId, washerActiveProgramStateTypeId); + //m_activeProgramStateTypeIds.insert(cookTopThingClassId, cookTopActiveProgramStateTypeId); + //m_activeProgramStateTypeIds.insert(cleaningRobotThingClassId, cleaningRobotActiveProgramStateTypeId); + //m_activeProgramStateTypeIds.insert(hoodThingClassId, hoodActiveProgramStateTypeId); } void IntegrationPluginHomeConnect::startPairing(ThingPairingInfo *info) @@ -207,7 +227,7 @@ void IntegrationPluginHomeConnect::setupThing(ThingSetupInfo *info) (thing->thingClassId() == fridgeThingClassId) || (thing->thingClassId() == washerThingClassId) || (thing->thingClassId() == dishwasherThingClassId) || - (thing->thingClassId() == coffeMakerThingClassId) || + (thing->thingClassId() == coffeeMakerThingClassId) || (thing->thingClassId() == ovenThingClassId) || (thing->thingClassId() == hoodThingClassId) || (thing->thingClassId() == cleaningRobotThingClassId) || @@ -278,7 +298,7 @@ void IntegrationPluginHomeConnect::postSetupThing(Thing *thing) (thing->thingClassId() == fridgeThingClassId) || (thing->thingClassId() == washerThingClassId) || (thing->thingClassId() == dishwasherThingClassId) || - (thing->thingClassId() == coffeMakerThingClassId) || + (thing->thingClassId() == coffeeMakerThingClassId) || (thing->thingClassId() == ovenThingClassId) || (thing->thingClassId() == hoodThingClassId) || (thing->thingClassId() == cleaningRobotThingClassId) || @@ -355,14 +375,15 @@ void IntegrationPluginHomeConnect::browseThing(BrowseResult *result) HomeConnect *homeConnect = m_homeConnectConnections.value(myThings().findById(thing->parentId())); if (!homeConnect) return; - QString haid = thing->stateValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); + QString haid = thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); homeConnect->getProgramsAvailable(haid); connect(homeConnect, &HomeConnect::receivedAvailablePrograms, result, [result, this] (const QString &haId, const QStringList programs) { - if(result->thing()->paramValue(m_idParamTypeIds.value(result->thing()->id())).toString() == haId) { + if(result->thing()->paramValue(m_idParamTypeIds.value(result->thing()->thingClassId())).toString() == haId) { Q_FOREACH(QString program, programs) { BrowserItem item; item.setExecutable(true); - item.setDisplayName(program); + item.setDisplayName(program.split('.').last()); + item.setId(program); result->addItem(item); } result->finish(Thing::ThingErrorNoError); @@ -378,7 +399,7 @@ void IntegrationPluginHomeConnect::browserItem(BrowserItemResult *result) HomeConnect *homeConnect = m_homeConnectConnections.value(myThings().findById(thing->parentId())); if (!homeConnect) return; - QString haid = thing->stateValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); + QString haid = thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); homeConnect->getProgramsAvailable(haid); connect(homeConnect, &HomeConnect::receivedAvailablePrograms, result, [result, this] (const QString &haid, const QStringList &programs) { if (result->thing()->paramValue(m_idParamTypeIds.value(result->thing()->thingClassId())).toString() == haid) { @@ -397,7 +418,7 @@ void IntegrationPluginHomeConnect::executeBrowserItem(BrowserActionInfo *info) HomeConnect *homeConnect = m_homeConnectConnections.value(myThings().findById(thing->parentId())); if (!homeConnect) return; - QString haid = thing->stateValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); + QString haid = thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); QList options; //TODO add options like set temperature or start time homeConnect->startProgram(haid, info->browserAction().itemId(), options); @@ -483,7 +504,7 @@ void IntegrationPluginHomeConnect::onReceivedHomeAppliances(const QListsetStateValue(ovenTargetTemperatureStateTypeId, options.value("Cooking.Oven.Option.SetpointTemperature").toInt()); thing->setStateValue(ovenTargetTemperatureStateTypeId, options.value("BSH.Common.Option.Duration").toInt()); } + } else if (thing->thingClassId() == washerThingClassId) { + if (key.contains("LaundryCare.Washer.Program")) { + thing->setStateValue(washerSelectedProgramStateTypeId, key.split('.').last()); + thing->setStateValue(washerTemperatureStateTypeId, options.value("LaundryCare.Washer.Option.Temperature").toInt()); + thing->setStateValue(washerSpinSpeedStateTypeId, options.value("LaundryCare.Washer.Option.SpinSpeed").toInt()); + } + } else if (thing->thingClassId() == dishwasherThingClassId) { + if (key.contains("Dishcare.Dishwasher.Program")) { + thing->setStateValue(dishwasherSelectedProgramStateTypeId, key.split('.').last()); + //BSH.Common.Option.StartInRelative + } + } else if (thing->thingClassId() == dryerThingClassId) { + if (key.contains("LaundryCare.Dryer.Program")) { + thing->setStateValue(dryerSelectedProgramStateTypeId, key.split('.').last()); + /* + LaundryCare.Dryer.Option.DryingTarget + BSH.Common.Option.Duration + */ + } + } else if (thing->thingClassId() == coffeeMakerThingClassId) { + if (key.contains("ConsumerProducts.CoffeeMaker.Program")) { + thing->setStateValue(coffeeMakerSelectedProgramStateTypeId, key.split('.').last()); + /* //TODO + * ConsumerProducts.CoffeeMaker.Option.BeanAmount + * ConsumerProducts.CoffeeMaker.Option.FillQuantity + * ConsumerProducts.CoffeeMaker.Option.CoffeeTemperature + */ + } } } break; diff --git a/homeconnect/integrationpluginhomeconnect.h b/homeconnect/integrationpluginhomeconnect.h index 32838867..7cab4a70 100644 --- a/homeconnect/integrationpluginhomeconnect.h +++ b/homeconnect/integrationpluginhomeconnect.h @@ -78,6 +78,8 @@ private: QHash m_remoteStartAllowanceStateTypeIds; QHash m_operationStateTypeIds; QHash m_doorStateTypeIds; + QHash m_activeProgramStateTypeIds; + QHash m_selectedProgramStateTypeIds; HomeConnect *createHomeConnection(); diff --git a/homeconnect/integrationpluginhomeconnect.json b/homeconnect/integrationpluginhomeconnect.json index 57bc80e6..c811003f 100644 --- a/homeconnect/integrationpluginhomeconnect.json +++ b/homeconnect/integrationpluginhomeconnect.json @@ -275,13 +275,38 @@ "displayNameEvent": "Remote start allowance changed", "defaultValue": false, "type": "bool" + }, + { + "id": "f0484744-a180-4a14-9c84-f49a489e3510", + "name": "progress", + "displayName": "Progress", + "displayNameEvent": "Progress changed", + "defaultValue": 0, + "unit": "Percentage", + "type": "int" + }, + { + "id": "692ea106-557c-4870-b569-ab82a4909b2c", + "name": "selectedProgram", + "displayName": "Selected program", + "displayNameEvent": "Selected program changed", + "defaultValue": "None", + "type": "QString" + }, + { + "id": "5f4cc1a2-a9d9-4358-9fcd-d09078a38638", + "name": "activeProgram", + "displayName": "Active program", + "displayNameEvent": "Active program changed", + "defaultValue": "None", + "type": "QString" } ] }, { "id": "f6b39ce2-8276-4db7-b2a3-4a04cafacbb9", - "name": "coffeMaker", - "displayName": "Coffe Maker", + "name": "coffeeMaker", + "displayName": "Coffee Maker", "interfaces": ["connectable"], "createMethods": ["auto"], "browsable": true, @@ -348,6 +373,31 @@ "displayNameEvent": "Remote start allowance changed", "defaultValue": false, "type": "bool" + }, + { + "id": "a121f86a-ab69-4be9-bbe2-631e2210fee7", + "name": "progress", + "displayName": "Progress", + "displayNameEvent": "Progress changed", + "defaultValue": 0, + "unit": "Percentage", + "type": "int" + }, + { + "id": "648e3a8e-74c4-41e8-bcbb-dd8b5757d375", + "name": "selectedProgram", + "displayName": "Selected program", + "displayNameEvent": "Selected program changed", + "defaultValue": "None", + "type": "QString" + }, + { + "id": "52ce0862-aa9d-41fa-8d14-6fdb11b82d89", + "name": "activeProgram", + "displayName": "Active program", + "displayNameEvent": "Active program changed", + "defaultValue": "None", + "type": "QString" } ] }, @@ -432,6 +482,31 @@ "displayNameEvent": "Remote start allowance changed", "defaultValue": false, "type": "bool" + }, + { + "id": "eaf84b93-bacd-42b1-afaf-a890c8b2a099", + "name": "progress", + "displayName": "Progress", + "displayNameEvent": "Progress changed", + "defaultValue": 0, + "unit": "Percentage", + "type": "int" + }, + { + "id": "4ad5424c-6ccd-4e29-9aba-41f960618401", + "name": "selectedProgram", + "displayName": "Selected program", + "displayNameEvent": "Selected program changed", + "defaultValue": "None", + "type": "QString" + }, + { + "id": "cde9357e-5e6c-49ff-82d5-a69150b64978", + "name": "activeProgram", + "displayName": "Active program", + "displayNameEvent": "Active program changed", + "defaultValue": "None", + "type": "QString" } ], "actionTypes": [ @@ -615,6 +690,47 @@ "displayNameEvent": "Remote start allowance changed", "defaultValue": false, "type": "bool" + }, + { + "id": "312d817d-3384-41fb-a8ba-15c137844ee0", + "name": "progress", + "displayName": "Progress", + "displayNameEvent": "Progress changed", + "defaultValue": 0, + "unit": "Percentage", + "type": "int" + }, + { + "id": "d10066ad-0ad3-49d2-a3c3-ee6002c1a18d", + "name": "selectedProgram", + "displayName": "Selected program", + "displayNameEvent": "Selected program changed", + "defaultValue": "None", + "type": "QString" + }, + { + "id": "d4abaabe-933f-4b55-8065-ba1f612dce90", + "name": "activeProgram", + "displayName": "Active program", + "displayNameEvent": "Active program changed", + "defaultValue": "None", + "type": "QString" + }, + { + "id": "29ed9597-2ace-48f5-91bc-171ac2601bfc", + "name": "temperature", + "displayName": "Temperature", + "displayNameEvent": "Temperature changed", + "defaultValue": "Unknown", + "type": "QString" + }, + { + "id": "ab65bfa0-37d8-4df6-80f0-80377a43a520", + "name": "spinSpeed", + "displayName": "Spin speed", + "displayNameEvent": "Spin speed changed", + "defaultValue": "Unknown", + "type": "QString" } ], "actionTypes": [