fixed setup order

This commit is contained in:
bernhard.trinnes 2020-07-13 08:40:23 +02:00 committed by Boernsman
parent 214b1052a2
commit d2870f4a71
3 changed files with 127 additions and 15 deletions

View File

@ -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();
}
});
}

View File

@ -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;

View File

@ -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());
}