From 3b1d8bc565e8c3fc55a86b2abac8c7d8d4a75499 Mon Sep 17 00:00:00 2001 From: "bernhard.trinnes" Date: Tue, 11 Aug 2020 09:45:29 +0200 Subject: [PATCH] finished dryer and washer --- homeconnect/homeconnect.cpp | 24 ++-- homeconnect/integrationpluginhomeconnect.cpp | 115 +++++++++++++----- homeconnect/integrationpluginhomeconnect.json | 15 +++ 3 files changed, 113 insertions(+), 41 deletions(-) diff --git a/homeconnect/homeconnect.cpp b/homeconnect/homeconnect.cpp index ce06e562..a75aab13 100644 --- a/homeconnect/homeconnect.cpp +++ b/homeconnect/homeconnect.cpp @@ -449,23 +449,23 @@ QUuid HomeConnect::selectProgram(const QString &haId, const QString &programKey, request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/vnd.bsh.sdk.v1+json"); QJsonDocument doc; - QJsonObject data; + QVariantMap data; data.insert("key", programKey); if (!options.isEmpty()) { - QJsonArray optionsArray; + QVariantList optionsArray; Q_FOREACH(Option option, options) { - QJsonObject optionObject; + QVariantMap optionObject; optionObject["key"] = option.key; - optionObject["value"] = option.value.toString(); + optionObject["value"] = option.value; if (!option.unit.isEmpty()) optionObject["unit"] = option.unit; optionsArray.append(optionObject); } data.insert("options", optionsArray); } - QJsonObject obj; + QVariantMap obj; obj.insert("data", data); - doc.setObject(obj); + doc.setObject(QJsonObject::fromVariantMap(obj)); QNetworkReply *reply = m_networkManager->put(request, doc.toJson()); connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [this, commandId, reply]{ @@ -561,21 +561,21 @@ QUuid HomeConnect::startProgram(const QString &haId, const QString &programKey, request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/vnd.bsh.sdk.v1+json"); QJsonDocument doc; - QJsonObject data; + QVariantMap data; data.insert("key", programKey); - QJsonArray optionsArray; + QVariantList optionsArray; Q_FOREACH(Option option, options) { - QJsonObject optionObject; + QVariantMap optionObject; optionObject["key"] = option.key; - optionObject["value"] = option.value.toString(); + optionObject["value"] = option.value; if (!option.unit.isEmpty()) optionObject["unit"] = option.unit; optionsArray.append(optionObject); } data.insert("options", optionsArray); - QJsonObject obj; + QVariantMap obj; obj.insert("data", data); - doc.setObject(obj); + doc.setObject(QJsonObject::fromVariantMap(obj)); QNetworkReply *reply = m_networkManager->put(request, doc.toJson()); connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [this, commandId, reply]{ diff --git a/homeconnect/integrationpluginhomeconnect.cpp b/homeconnect/integrationpluginhomeconnect.cpp index 3fe19c6d..b089ed5e 100644 --- a/homeconnect/integrationpluginhomeconnect.cpp +++ b/homeconnect/integrationpluginhomeconnect.cpp @@ -291,7 +291,7 @@ void IntegrationPluginHomeConnect::postSetupThing(Thing *thing) homeConnect->connectEventStream(); thing->setStateValue(homeConnectConnectionConnectedStateTypeId, true); thing->setStateValue(homeConnectConnectionLoggedInStateTypeId, true); - //TODO set login username + //TBD Set user name } else if ((thing->thingClassId() == dryerThingClassId) || (thing->thingClassId() == fridgeThingClassId) || (thing->thingClassId() == washerThingClassId) || @@ -432,12 +432,58 @@ void IntegrationPluginHomeConnect::executeAction(ThingActionInfo *info) startTime.unit = "seconds"; startTime.value = action.param(dishwasherStartActionStartTimeParamTypeId).value().toInt() * 60; requestId = homeConnect->startProgram(haid, m_selectedProgram.value(thing), QList() << startTime); + m_pendingActions.insert(requestId, info); connect(info, &ThingActionInfo::aborted, [requestId, this] { m_pendingActions.remove(requestId); }); } else { Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); } + } else if (thing->thingClassId() == washerThingClassId) { + if (action.actionTypeId() == washerStartActionTypeId) { + if (!m_selectedProgram.contains(thing)) { + homeConnect->getProgramsSelected(haid); + return info->finish(Thing::ThingErrorMissingParameter, tr("Please select a program first")); + } + QUuid requestId; + requestId = homeConnect->startProgram(haid, m_selectedProgram.value(thing), QList()); + m_pendingActions.insert(requestId, info); + connect(info, &ThingActionInfo::aborted, [requestId, this] { + m_pendingActions.remove(requestId); + }); + } + } else if (thing->thingClassId() == dryerThingClassId) { + if (action.actionTypeId() == dryerStartActionTypeId) { + if (!m_selectedProgram.contains(thing)) { + homeConnect->getProgramsSelected(haid); + return info->finish(Thing::ThingErrorMissingParameter, tr("Please select a program first")); + } + QUuid requestId; + requestId = homeConnect->startProgram(haid, m_selectedProgram.value(thing), QList()); + m_pendingActions.insert(requestId, info); + connect(info, &ThingActionInfo::aborted, [requestId, this] { + m_pendingActions.remove(requestId); + }); + } else if (action.actionTypeId() == dryerDryingTargetActionTypeId) { + QUuid requestId; + QList options; + HomeConnect::Option dryingTarget; + dryingTarget.key = "LaundryCare.Dryer.Option.DryingTarget"; + QString target = action.param(dryerDryingTargetActionDryingTargetParamTypeId).value().toString(); + if (target == "Iron dry") { + dryingTarget.value = "LaundryCare.Dryer.EnumType.DryingTarget.IronDry"; + } else if (target == "Cupboard dry") { + dryingTarget.value = "LaundryCare.Dryer.EnumType.DryingTarget.CupboardDry"; + } else if (target == "Cupboard dry plus") { + dryingTarget.value = "LaundryCare.Dryer.EnumType.DryingTarget.CupboardDryPlus"; + } + options.append(dryingTarget); + requestId = homeConnect->setSelectedProgramOptions(haid, options); + m_pendingActions.insert(requestId, info); + connect(info, &ThingActionInfo::aborted, [requestId, this] { + m_pendingActions.remove(requestId); + }); + } } else { Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); } @@ -448,6 +494,8 @@ void IntegrationPluginHomeConnect::thingRemoved(Thing *thing) qCDebug(dcHomeConnect) << "Delete " << thing->name(); if (thing->thingClassId() == homeConnectConnectionThingClassId) { m_homeConnectConnections.take(thing)->deleteLater(); + } else { + m_selectedProgram.remove(thing); } if (myThings().empty()) { @@ -546,13 +594,18 @@ void IntegrationPluginHomeConnect::parseKey(Thing *thing, const QString &key, co thing->setStateValue(ovenDurationStateTypeId, value); } else if (key == "Cooking.Oven.Option.FastPreHeat") { } else if (key == "BSH.Common.Option.StartInRelative") { - //TODO } else if (key == "LaundryCare.Washer.Option.Temperature") { - thing->setStateValue(washerTemperatureStateTypeId, value); + thing->setStateValue(washerTemperatureStateTypeId, value.toString().split('.').last()); // Cold, 20, 40, 60°C } else if (key == "LaundryCare.Washer.Option.SpinSpeed") { - thing->setStateValue(washerSpinSpeedStateTypeId, value); + thing->setStateValue(washerSpinSpeedStateTypeId, value.toString().split('.').last()); // Off, 400, 600, 800 } else if (key == "LaundryCare.Dryer.Option.DryingTarget") { - //TODO + if (value.toString() == "LaundryCare.Dryer.EnumType.DryingTarget.IronDry") { + thing->setStateValue(dryerDryingTargetStateTypeId, "Iron dry"); + } else if (value.toString() == "LaundryCare.Dryer.EnumType.DryingTarget.CupboardDry") { + thing->setStateValue(dryerDryingTargetStateTypeId, "Cupboard dry"); + } else if (value.toString() == "LaundryCare.Dryer.EnumType.DryingTarget.CupboardDryPlus") { + thing->setStateValue(dryerDryingTargetStateTypeId, "Cupboard dry plus"); + } } else if (key == "ConsumerProducts.CoffeeMaker.Option.BeanAmount") { QString beanAmount = value.toString(); if (m_coffeeStrengthTypes.contains(beanAmount)) { @@ -596,7 +649,26 @@ void IntegrationPluginHomeConnect::parseKey(Thing *thing, const QString &key, co } else if (key == "ConsumerProducts.CleaningRobot.Option.ProcessPhase") { } else if (key == "BSH.Common.Status.OperationState") { if (m_operationStateTypeIds.contains(thing->thingClassId())) { - thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), value.toString().split('.').last()); + QString operationState = value.toString(); + if (operationState == "BSH.Common.EnumType.OperationState.Inactive") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Inactive"); + } else if (operationState == "BSH.Common.EnumType.OperationState.Ready") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Ready"); + } else if (operationState == "BSH.Common.EnumType.OperationState.DelayedStart") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Delayed start"); + } else if (operationState == "BSH.Common.EnumType.OperationState.Run") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Run"); + } else if (operationState == "BSH.Common.EnumType.OperationState.Pause") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Pause"); + } else if (operationState == "BSH.Common.EnumType.OperationState.ActionRequired") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Action required"); + } else if (operationState == "BSH.Common.EnumType.OperationState.Finished") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Finished"); + } else if (operationState == "BSH.Common.EnumType.OperationState.Error") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Error"); + } else if (operationState == "BSH.Common.EnumType.OperationState.Aborting") { + thing->setStateValue(m_operationStateTypeIds.value(thing->thingClassId()), "Aborting"); + } } if (value.toString().split('.').last().contains("Finished")) { //apparently the finished event is not emitted by HomeConnect so this will hopefully do the trick @@ -797,7 +869,7 @@ void IntegrationPluginHomeConnect::onReceivedHomeAppliances(const QListid())) { if (thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString() == haId) { + qCDebug(dcHomeConnect()) << "Received status list device" << thing->name(); Q_FOREACH(QString key, statusList.keys()) { parseKey(thing, key, statusList.value(key)); } @@ -887,29 +960,13 @@ void IntegrationPluginHomeConnect::onReceivedSelectedProgram(const QString &haId Q_FOREACH(Thing *thing, myThings().filterByParentId(parentThing->id())) { if (thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString() == haId) { - if (thing->thingClassId() == ovenThingClassId) { - if (key.contains("Cooking.Oven.Program.HeatingMode")) { - thing->setStateValue(ovenSelectedProgramStateTypeId, key.split('.').last()); - } - } else if (thing->thingClassId() == washerThingClassId) { - if (key.contains("LaundryCare.Washer.Program")) { - thing->setStateValue(washerSelectedProgramStateTypeId, key.split('.').last()); - } - } else if (thing->thingClassId() == dishwasherThingClassId) { - if (key.contains("Dishcare.Dishwasher.Program")) { - thing->setStateValue(dishwasherSelectedProgramStateTypeId, key.split('.').last()); - } - } else if (thing->thingClassId() == dryerThingClassId) { - if (key.contains("LaundryCare.Dryer.Program")) { - thing->setStateValue(dryerSelectedProgramStateTypeId, key.split('.').last()); - } - } else if (thing->thingClassId() == coffeeMakerThingClassId) { - if (key.contains("ConsumerProducts.CoffeeMaker.Program")) { - thing->setStateValue(coffeeMakerSelectedProgramStateTypeId, key.split('.').last()); - } + qCDebug(dcHomeConnect()) << "Received selected program" << key << "device" << thing->name(); + if (m_selectedProgramStateTypeIds.contains(thing->thingClassId())) { + thing->setStateValue(m_selectedProgramStateTypeIds.value(thing->thingClassId()), key.split('.').last()); } + m_selectedProgram.insert(thing, key); + break; } - break; } } @@ -926,7 +983,7 @@ void IntegrationPluginHomeConnect::onReceivedSettings(const QString &haId, const Q_FOREACH(QString setting, settings.keys()) { parseSettingKey(thing, setting, settings.value(setting)); } + break; } - break; } } diff --git a/homeconnect/integrationpluginhomeconnect.json b/homeconnect/integrationpluginhomeconnect.json index 43de5605..a386fe18 100644 --- a/homeconnect/integrationpluginhomeconnect.json +++ b/homeconnect/integrationpluginhomeconnect.json @@ -635,6 +635,21 @@ "defaultValue": "None", "type": "QString" }, + { + "id": "829c1ec6-5b5a-490a-b487-52287eab91ba", + "name": "dryingTarget", + "displayName": "Drying target", + "displayNameEvent": "Drying target changed", + "displayNameAction": "Set drying target", + "defaultValue": "Iron dry", + "type": "QString", + "possibleValues": [ + "Iron dry", + "Cupboard dry", + "Cupboard dry plus" + ], + "writable": true + }, { "id": "6586f2d9-daec-43fa-8f7f-f3afc9d70046", "name": "endTime",