finished dryer and washer
This commit is contained in:
parent
a32d279e56
commit
3b1d8bc565
@ -449,23 +449,23 @@ QUuid HomeConnect::selectProgram(const QString &haId, const QString &programKey,
|
|||||||
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/vnd.bsh.sdk.v1+json");
|
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/vnd.bsh.sdk.v1+json");
|
||||||
|
|
||||||
QJsonDocument doc;
|
QJsonDocument doc;
|
||||||
QJsonObject data;
|
QVariantMap data;
|
||||||
data.insert("key", programKey);
|
data.insert("key", programKey);
|
||||||
if (!options.isEmpty()) {
|
if (!options.isEmpty()) {
|
||||||
QJsonArray optionsArray;
|
QVariantList optionsArray;
|
||||||
Q_FOREACH(Option option, options) {
|
Q_FOREACH(Option option, options) {
|
||||||
QJsonObject optionObject;
|
QVariantMap optionObject;
|
||||||
optionObject["key"] = option.key;
|
optionObject["key"] = option.key;
|
||||||
optionObject["value"] = option.value.toString();
|
optionObject["value"] = option.value;
|
||||||
if (!option.unit.isEmpty())
|
if (!option.unit.isEmpty())
|
||||||
optionObject["unit"] = option.unit;
|
optionObject["unit"] = option.unit;
|
||||||
optionsArray.append(optionObject);
|
optionsArray.append(optionObject);
|
||||||
}
|
}
|
||||||
data.insert("options", optionsArray);
|
data.insert("options", optionsArray);
|
||||||
}
|
}
|
||||||
QJsonObject obj;
|
QVariantMap obj;
|
||||||
obj.insert("data", data);
|
obj.insert("data", data);
|
||||||
doc.setObject(obj);
|
doc.setObject(QJsonObject::fromVariantMap(obj));
|
||||||
QNetworkReply *reply = m_networkManager->put(request, doc.toJson());
|
QNetworkReply *reply = m_networkManager->put(request, doc.toJson());
|
||||||
connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
|
connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
|
||||||
connect(reply, &QNetworkReply::finished, this, [this, commandId, reply]{
|
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");
|
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/vnd.bsh.sdk.v1+json");
|
||||||
|
|
||||||
QJsonDocument doc;
|
QJsonDocument doc;
|
||||||
QJsonObject data;
|
QVariantMap data;
|
||||||
data.insert("key", programKey);
|
data.insert("key", programKey);
|
||||||
QJsonArray optionsArray;
|
QVariantList optionsArray;
|
||||||
Q_FOREACH(Option option, options) {
|
Q_FOREACH(Option option, options) {
|
||||||
QJsonObject optionObject;
|
QVariantMap optionObject;
|
||||||
optionObject["key"] = option.key;
|
optionObject["key"] = option.key;
|
||||||
optionObject["value"] = option.value.toString();
|
optionObject["value"] = option.value;
|
||||||
if (!option.unit.isEmpty())
|
if (!option.unit.isEmpty())
|
||||||
optionObject["unit"] = option.unit;
|
optionObject["unit"] = option.unit;
|
||||||
optionsArray.append(optionObject);
|
optionsArray.append(optionObject);
|
||||||
}
|
}
|
||||||
data.insert("options", optionsArray);
|
data.insert("options", optionsArray);
|
||||||
QJsonObject obj;
|
QVariantMap obj;
|
||||||
obj.insert("data", data);
|
obj.insert("data", data);
|
||||||
doc.setObject(obj);
|
doc.setObject(QJsonObject::fromVariantMap(obj));
|
||||||
QNetworkReply *reply = m_networkManager->put(request, doc.toJson());
|
QNetworkReply *reply = m_networkManager->put(request, doc.toJson());
|
||||||
connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
|
connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
|
||||||
connect(reply, &QNetworkReply::finished, this, [this, commandId, reply]{
|
connect(reply, &QNetworkReply::finished, this, [this, commandId, reply]{
|
||||||
|
|||||||
@ -291,7 +291,7 @@ void IntegrationPluginHomeConnect::postSetupThing(Thing *thing)
|
|||||||
homeConnect->connectEventStream();
|
homeConnect->connectEventStream();
|
||||||
thing->setStateValue(homeConnectConnectionConnectedStateTypeId, true);
|
thing->setStateValue(homeConnectConnectionConnectedStateTypeId, true);
|
||||||
thing->setStateValue(homeConnectConnectionLoggedInStateTypeId, true);
|
thing->setStateValue(homeConnectConnectionLoggedInStateTypeId, true);
|
||||||
//TODO set login username
|
//TBD Set user name
|
||||||
} else if ((thing->thingClassId() == dryerThingClassId) ||
|
} else if ((thing->thingClassId() == dryerThingClassId) ||
|
||||||
(thing->thingClassId() == fridgeThingClassId) ||
|
(thing->thingClassId() == fridgeThingClassId) ||
|
||||||
(thing->thingClassId() == washerThingClassId) ||
|
(thing->thingClassId() == washerThingClassId) ||
|
||||||
@ -432,12 +432,58 @@ void IntegrationPluginHomeConnect::executeAction(ThingActionInfo *info)
|
|||||||
startTime.unit = "seconds";
|
startTime.unit = "seconds";
|
||||||
startTime.value = action.param(dishwasherStartActionStartTimeParamTypeId).value().toInt() * 60;
|
startTime.value = action.param(dishwasherStartActionStartTimeParamTypeId).value().toInt() * 60;
|
||||||
requestId = homeConnect->startProgram(haid, m_selectedProgram.value(thing), QList<HomeConnect::Option>() << startTime);
|
requestId = homeConnect->startProgram(haid, m_selectedProgram.value(thing), QList<HomeConnect::Option>() << startTime);
|
||||||
|
m_pendingActions.insert(requestId, info);
|
||||||
connect(info, &ThingActionInfo::aborted, [requestId, this] {
|
connect(info, &ThingActionInfo::aborted, [requestId, this] {
|
||||||
m_pendingActions.remove(requestId);
|
m_pendingActions.remove(requestId);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8());
|
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<HomeConnect::Option>());
|
||||||
|
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<HomeConnect::Option>());
|
||||||
|
m_pendingActions.insert(requestId, info);
|
||||||
|
connect(info, &ThingActionInfo::aborted, [requestId, this] {
|
||||||
|
m_pendingActions.remove(requestId);
|
||||||
|
});
|
||||||
|
} else if (action.actionTypeId() == dryerDryingTargetActionTypeId) {
|
||||||
|
QUuid requestId;
|
||||||
|
QList<HomeConnect::Option> 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 {
|
} else {
|
||||||
Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
|
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();
|
qCDebug(dcHomeConnect) << "Delete " << thing->name();
|
||||||
if (thing->thingClassId() == homeConnectConnectionThingClassId) {
|
if (thing->thingClassId() == homeConnectConnectionThingClassId) {
|
||||||
m_homeConnectConnections.take(thing)->deleteLater();
|
m_homeConnectConnections.take(thing)->deleteLater();
|
||||||
|
} else {
|
||||||
|
m_selectedProgram.remove(thing);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myThings().empty()) {
|
if (myThings().empty()) {
|
||||||
@ -546,13 +594,18 @@ void IntegrationPluginHomeConnect::parseKey(Thing *thing, const QString &key, co
|
|||||||
thing->setStateValue(ovenDurationStateTypeId, value);
|
thing->setStateValue(ovenDurationStateTypeId, value);
|
||||||
} else if (key == "Cooking.Oven.Option.FastPreHeat") {
|
} else if (key == "Cooking.Oven.Option.FastPreHeat") {
|
||||||
} else if (key == "BSH.Common.Option.StartInRelative") {
|
} else if (key == "BSH.Common.Option.StartInRelative") {
|
||||||
//TODO
|
|
||||||
} else if (key == "LaundryCare.Washer.Option.Temperature") {
|
} 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") {
|
} 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") {
|
} 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") {
|
} else if (key == "ConsumerProducts.CoffeeMaker.Option.BeanAmount") {
|
||||||
QString beanAmount = value.toString();
|
QString beanAmount = value.toString();
|
||||||
if (m_coffeeStrengthTypes.contains(beanAmount)) {
|
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 == "ConsumerProducts.CleaningRobot.Option.ProcessPhase") {
|
||||||
} else if (key == "BSH.Common.Status.OperationState") {
|
} else if (key == "BSH.Common.Status.OperationState") {
|
||||||
if (m_operationStateTypeIds.contains(thing->thingClassId())) {
|
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")) {
|
if (value.toString().split('.').last().contains("Finished")) {
|
||||||
//apparently the finished event is not emitted by HomeConnect so this will hopefully do the trick
|
//apparently the finished event is not emitted by HomeConnect so this will hopefully do the trick
|
||||||
@ -797,7 +869,7 @@ void IntegrationPluginHomeConnect::onReceivedHomeAppliances(const QList<HomeConn
|
|||||||
thingClassId = cookProcessorThingClassId;
|
thingClassId = cookProcessorThingClassId;
|
||||||
} else if (appliance.type.contains("WasherDryer", Qt::CaseInsensitive)) {
|
} else if (appliance.type.contains("WasherDryer", Qt::CaseInsensitive)) {
|
||||||
thingClassId = washerThingClassId;
|
thingClassId = washerThingClassId;
|
||||||
//FIXME add washerdryer thing classid
|
//To improve add washerdryer thing classid
|
||||||
} else {
|
} else {
|
||||||
qCWarning(dcHomeConnect()) << "Unknown thing type" << appliance.type;
|
qCWarning(dcHomeConnect()) << "Unknown thing type" << appliance.type;
|
||||||
continue;
|
continue;
|
||||||
@ -829,6 +901,7 @@ void IntegrationPluginHomeConnect::onReceivedStatusList(const QString &haId, con
|
|||||||
|
|
||||||
Q_FOREACH(Thing *thing, myThings().filterByParentId(parentThing->id())) {
|
Q_FOREACH(Thing *thing, myThings().filterByParentId(parentThing->id())) {
|
||||||
if (thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString() == haId) {
|
if (thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString() == haId) {
|
||||||
|
qCDebug(dcHomeConnect()) << "Received status list device" << thing->name();
|
||||||
Q_FOREACH(QString key, statusList.keys()) {
|
Q_FOREACH(QString key, statusList.keys()) {
|
||||||
parseKey(thing, key, statusList.value(key));
|
parseKey(thing, key, statusList.value(key));
|
||||||
}
|
}
|
||||||
@ -887,29 +960,13 @@ void IntegrationPluginHomeConnect::onReceivedSelectedProgram(const QString &haId
|
|||||||
|
|
||||||
Q_FOREACH(Thing *thing, myThings().filterByParentId(parentThing->id())) {
|
Q_FOREACH(Thing *thing, myThings().filterByParentId(parentThing->id())) {
|
||||||
if (thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString() == haId) {
|
if (thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString() == haId) {
|
||||||
if (thing->thingClassId() == ovenThingClassId) {
|
qCDebug(dcHomeConnect()) << "Received selected program" << key << "device" << thing->name();
|
||||||
if (key.contains("Cooking.Oven.Program.HeatingMode")) {
|
if (m_selectedProgramStateTypeIds.contains(thing->thingClassId())) {
|
||||||
thing->setStateValue(ovenSelectedProgramStateTypeId, key.split('.').last());
|
thing->setStateValue(m_selectedProgramStateTypeIds.value(thing->thingClassId()), 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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
m_selectedProgram.insert(thing, key);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -926,7 +983,7 @@ void IntegrationPluginHomeConnect::onReceivedSettings(const QString &haId, const
|
|||||||
Q_FOREACH(QString setting, settings.keys()) {
|
Q_FOREACH(QString setting, settings.keys()) {
|
||||||
parseSettingKey(thing, setting, settings.value(setting));
|
parseSettingKey(thing, setting, settings.value(setting));
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -635,6 +635,21 @@
|
|||||||
"defaultValue": "None",
|
"defaultValue": "None",
|
||||||
"type": "QString"
|
"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",
|
"id": "6586f2d9-daec-43fa-8f7f-f3afc9d70046",
|
||||||
"name": "endTime",
|
"name": "endTime",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user