diff --git a/homeconnect/homeconnect.cpp b/homeconnect/homeconnect.cpp index 0dbb9cc0..9b4b93ca 100644 --- a/homeconnect/homeconnect.cpp +++ b/homeconnect/homeconnect.cpp @@ -294,3 +294,94 @@ void HomeConnect::getHomeAppliances() } }); } + +void HomeConnect::getProgramsAvailable(const QString &haId) +{ + QUrl url = QUrl(m_baseControlUrl+"/api/homeappliances/"+haId+"/programs/available"); + + 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, reply]{ + + QJsonParseError error; + QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error); + if (error.error != QJsonParseError::NoError) { + qCWarning(dcHomeConnect()) << "Get programs available: Recieved invalide JSON object"; + return; + } + qCDebug(dcHomeConnect()) << "Get programs available" << data.toJson(); + + }); +} + +void HomeConnect::getProgramsActiveOption(const QString &haId, const QString &optionKey) +{ + QUrl url = QUrl(m_baseControlUrl+"/api/homeappliances/"+haId+"/programs/active/options/"+optionKey); + + 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, reply]{ + + QJsonParseError error; + QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error); + if (error.error != QJsonParseError::NoError) { + qCDebug(dcHomeConnect()) << "Get home appliances: Recieved invalide JSON object"; + return; + } + qCDebug(dcHomeConnect()) << "Get home appliances" << data.toJson(); + if (data.toVariant().toMap().contains("data")) { + QVariantMap dataMap = data.toVariant().toMap().value("data").toMap(); + qCDebug(dcHomeConnect()) << "key" << dataMap.value("key").toString() << "value" << dataMap.value("value").toString() << dataMap.value("unit").toString(); + } else if (data.toVariant().toMap().contains("error")) { + qCWarning(dcHomeConnect()) << "Get home appliences" << data.toVariant().toMap().value("error").toMap().value("description").toString(); + } + }); +} + +/* Get a list of available setting of the home appliance. + * Possible Settings: + * Power state + * Fridge temperature + * Fridge super mode + * Freezer temperature + * Freezer super mode + */ + +void HomeConnect::getSettings(const QString &haid) +{ + QUrl url = QUrl(m_baseControlUrl+"/api/homeappliances/"+haid+"/settings"); + + 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, reply]{ + + QJsonParseError error; + QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error); + if (error.error != QJsonParseError::NoError) { + qCDebug(dcHomeConnect()) << "Get settings: Recieved invalide JSON object"; + return; + } + qCDebug(dcHomeConnect()) << "Get settings" << data.toJson(); + if (data.toVariant().toMap().contains("data")) { + QVariantMap dataMap = data.toVariant().toMap().value("data").toMap(); + qCDebug(dcHomeConnect()) << "key" << dataMap.value("key").toString() << "value" << dataMap.value("value").toString() << dataMap.value("unit").toString(); + } else if (data.toVariant().toMap().contains("error")) { + qCWarning(dcHomeConnect()) << "Get settings" << data.toVariant().toMap().value("error").toMap().value("description").toString(); + } + }); +} diff --git a/homeconnect/homeconnect.h b/homeconnect/homeconnect.h index 9325a7cb..360b113d 100644 --- a/homeconnect/homeconnect.h +++ b/homeconnect/homeconnect.h @@ -65,6 +65,13 @@ public: QString type; QString homeApplianceId; }; + + struct OptionData { + QString key; + QVariant value; + QString unit; + }; + HomeConnect(NetworkAccessManager *networkmanager, const QByteArray &clientKey, const QByteArray &clientSecret, bool simulationMode = false, QObject *parent = nullptr); QByteArray accessToken(); QByteArray refreshToken(); @@ -78,6 +85,11 @@ public: void getHomeAppliances(); void getHomeAppliance(const QString &haid); + void getProgramsAvailable(const QString &haId); + void getProgramsActiveOption(const QString &haId, const QString &optionKey); + + void getSettings(const QString &haid); + private: bool m_simulationMode = false; QByteArray m_baseAuthorizationUrl; diff --git a/homeconnect/integrationpluginhomeconnect.cpp b/homeconnect/integrationpluginhomeconnect.cpp index 7dca3352..0a23e115 100644 --- a/homeconnect/integrationpluginhomeconnect.cpp +++ b/homeconnect/integrationpluginhomeconnect.cpp @@ -136,7 +136,6 @@ void IntegrationPluginHomeConnect::setupThing(ThingSetupInfo *info) connect(homeConnect, &HomeConnect::authenticationStatusChanged, this, &IntegrationPluginHomeConnect::onAuthenticationStatusChanged); connect(homeConnect, &HomeConnect::receivedHomeAppliances, this, &IntegrationPluginHomeConnect::onReceivedHomeAppliances); m_homeConnectConnections.insert(thing, homeConnect); - m_homeConnectConnections.insert(thing, homeConnect); info->finish(Thing::ThingErrorNoError); } else { //device loaded from the device database, needs a new access token; @@ -152,18 +151,22 @@ void IntegrationPluginHomeConnect::setupThing(ThingSetupInfo *info) homeConnect->getAccessTokenFromRefreshToken(refreshToken); m_asyncSetup.insert(homeConnect, info); } - } else if (thing->thingClassId() == dryerThingClassId) { - info->finish(Thing::ThingErrorNoError); - } else if (thing->thingClassId() == fridgeThingClassId) { - info->finish(Thing::ThingErrorNoError); - } else if (thing->thingClassId() == washerThingClassId) { - info->finish(Thing::ThingErrorNoError); - } else if (thing->thingClassId() == dishwasherThingClassId) { - info->finish(Thing::ThingErrorNoError); - } else if (thing->thingClassId() == coffeMakerThingClassId) { - info->finish(Thing::ThingErrorNoError); - } else if (thing->thingClassId() == ovenThingClassId) { - info->finish(Thing::ThingErrorNoError); + } else if ((thing->thingClassId() == dryerThingClassId) || + (thing->thingClassId() == fridgeThingClassId) || + (thing->thingClassId() == washerThingClassId) || + (thing->thingClassId() == dishwasherThingClassId) || + (thing->thingClassId() == coffeMakerThingClassId) || + (thing->thingClassId() == ovenThingClassId)) { + Thing *parentThing = myThings().findById(thing->parentId()); + if (parentThing->setupComplete()) { + info->finish(Thing::ThingErrorNoError); + } else { + connect(parentThing, &Thing::setupStatusChanged, info, [parentThing, info]{ + if (parentThing->setupComplete()) { + info->finish(Thing::ThingErrorNoError); + } + }); + } } else { Q_ASSERT_X(false, "setupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); } @@ -212,9 +215,15 @@ void IntegrationPluginHomeConnect::postSetupThing(Thing *thing) (thing->thingClassId() == coffeMakerThingClassId) || (thing->thingClassId() == ovenThingClassId)) { Thing *parentThing = myThings().findById(thing->parentId()); + if (!parentThing) + qCWarning(dcHomeConnect()) << "Could not find parent with Id" << thing->parentId().toString(); HomeConnect *homeConnect = m_homeConnectConnections.value(parentThing); - if (homeConnect) - homeConnect->getHomeAppliances(); + QString haId = thing->paramValue(m_idParamTypeIds.value(thing->thingClassId())).toString(); + if (!homeConnect) { + qCWarning(dcHomeConnect()) << "Could not find HomeConnect connection for thing" << thing->name(); + } else { + homeConnect->getProgramsAvailable(haId); + } } else { Q_ASSERT_X(false, "postSetupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); }