fixed browsing

This commit is contained in:
bernhard.trinnes 2020-07-22 20:26:58 +02:00 committed by Boernsman
parent ac9d3804c5
commit ad9c893144
5 changed files with 237 additions and 36 deletions

View File

@ -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<QString, QVariant> 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<QString, QVariant> options;
Q_FOREACH(QVariant var, dataMap.value("options").toList()) {

View File

@ -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<HomeAppliance> &appliances);
void receivedStatusList(const QString &haId, const QHash<QString, QVariant> &statusList);
void receivedPrograms(const QString &haId, const QStringList &programs);
void receivedAvailablePrograms(const QString &haId, const QStringList &programs);
void receivedSettings(const QString &haId, const QHash<QString, QVariant> &settings);
void receivedActiveProgram(const QString &haId, const QString &key, const QHash<QString, QVariant> &options);

View File

@ -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<HomeConnect::Option> 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 QList<HomeConn
} else if (appliance.type.contains("WineCooler", Qt::CaseInsensitive)) {
thingClassId = fridgeThingClassId;
} else if (appliance.type.contains("CoffeeMaker", Qt::CaseInsensitive)) {
thingClassId = coffeMakerThingClassId;
thingClassId = coffeeMakerThingClassId;
} else if (appliance.type.contains("Dryer", Qt::CaseInsensitive)) {
thingClassId = dryerThingClassId;
} else if (appliance.type.contains("CookTop", Qt::CaseInsensitive)) {
@ -568,15 +589,13 @@ void IntegrationPluginHomeConnect::onReceivedEvents(const QList<HomeConnect::Eve
if (event.key == "BSH.Common.Root.SelectedProgram") {
}
if (event.key == "BSH.Common.Root.SelectedProgram") {
if (event.key == "BSH.Common.Root.ActiveProgram") {
}
if (event.key == "BSH.Common.Option.ProgramProgress") {
}
/*
* BSH.Common.Root.SelectedProgram
* BSH.Common.Root.ActiveProgram
/*
* Cooking.Oven.Option.SetpointTemperature
* BSH.Common.Option.Duration
* Cooking.Oven.Option.FastPreHeat
@ -693,6 +712,34 @@ void IntegrationPluginHomeConnect::onReceivedSelectedProgram(const QString &haId
thing->setStateValue(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;

View File

@ -78,6 +78,8 @@ private:
QHash<ThingClassId, StateTypeId> m_remoteStartAllowanceStateTypeIds;
QHash<ThingClassId, StateTypeId> m_operationStateTypeIds;
QHash<ThingClassId, StateTypeId> m_doorStateTypeIds;
QHash<ThingClassId, StateTypeId> m_activeProgramStateTypeIds;
QHash<ThingClassId, StateTypeId> m_selectedProgramStateTypeIds;
HomeConnect *createHomeConnection();

View File

@ -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": [