added online check
parent
ae776ed2ce
commit
03069c3d76
|
|
@ -147,7 +147,7 @@ IntegrationPluginHomeConnect::IntegrationPluginHomeConnect()
|
||||||
void IntegrationPluginHomeConnect::startPairing(ThingPairingInfo *info)
|
void IntegrationPluginHomeConnect::startPairing(ThingPairingInfo *info)
|
||||||
{
|
{
|
||||||
if (info->thingClassId() == homeConnectAccountThingClassId) {
|
if (info->thingClassId() == homeConnectAccountThingClassId) {
|
||||||
|
qCDebug(dcHomeConnect()) << "Start pairing" << info->thingName();
|
||||||
bool simulationMode = configValue(homeConnectPluginSimulationModeParamTypeId).toBool();
|
bool simulationMode = configValue(homeConnectPluginSimulationModeParamTypeId).toBool();
|
||||||
bool controlEnabled = configValue(homeConnectPluginControlEnabledParamTypeId).toBool();
|
bool controlEnabled = configValue(homeConnectPluginControlEnabledParamTypeId).toBool();
|
||||||
QByteArray clientKey = configValue(homeConnectPluginCustomClientKeyParamTypeId).toByteArray();
|
QByteArray clientKey = configValue(homeConnectPluginCustomClientKeyParamTypeId).toByteArray();
|
||||||
|
|
@ -155,20 +155,39 @@ void IntegrationPluginHomeConnect::startPairing(ThingPairingInfo *info)
|
||||||
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
||||||
clientKey = apiKeyStorage()->requestKey("homeconnect").data("clientKey");
|
clientKey = apiKeyStorage()->requestKey("homeconnect").data("clientKey");
|
||||||
clientSecret = apiKeyStorage()->requestKey("homeconnect").data("clientSecret");
|
clientSecret = apiKeyStorage()->requestKey("homeconnect").data("clientSecret");
|
||||||
|
} else {
|
||||||
|
qCDebug(dcHomeConnect()) << "Using custom client secret and key";
|
||||||
}
|
}
|
||||||
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
||||||
info->finish(Thing::ThingErrorAuthenticationFailure, tr("Client key and/or seceret is not available."));
|
info->finish(Thing::ThingErrorAuthenticationFailure, tr("Client key and/or seceret is not available."));
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
qCDebug(dcHomeConnect()) << "Using API client secret and key from API key provider";
|
||||||
}
|
}
|
||||||
HomeConnect *homeConnect = new HomeConnect(hardwareManager()->networkManager(), clientKey, clientSecret, simulationMode, this);
|
HomeConnect *homeConnect = new HomeConnect(hardwareManager()->networkManager(), clientKey, clientSecret, simulationMode, this);
|
||||||
QString scope = "IdentifyAppliance Monitor Settings Dishwasher Washer Dryer WasherDryer Refrigerator Freezer WineCooler CoffeeMaker Hood CookProcessor";
|
QString scope = "IdentifyAppliance Monitor Settings Dishwasher Washer Dryer WasherDryer Refrigerator Freezer WineCooler CoffeeMaker Hood CookProcessor";
|
||||||
if (controlEnabled)
|
if (controlEnabled) {
|
||||||
scope.append(" Control");
|
scope.append(" Control");
|
||||||
|
qCDebug(dcHomeConnect()) << "Conrol scope is enabled";
|
||||||
|
}
|
||||||
|
if (simulationMode) {
|
||||||
|
qCDebug(dcHomeConnect()) << "Simulation mode is enabled";
|
||||||
|
}
|
||||||
QUrl url = homeConnect->getLoginUrl(QUrl("https://127.0.0.1:8888"), scope);
|
QUrl url = homeConnect->getLoginUrl(QUrl("https://127.0.0.1:8888"), scope);
|
||||||
qCDebug(dcHomeConnect()) << "HomeConnect url:" << url;
|
|
||||||
m_setupHomeConnectConnections.insert(info->thingId(), homeConnect);
|
|
||||||
info->setOAuthUrl(url);
|
info->setOAuthUrl(url);
|
||||||
info->finish(Thing::ThingErrorNoError);
|
QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(url)); // Check if the host is reachable
|
||||||
|
connect(reply, &QNetworkReply::finished, info, &QNetworkReply::deleteLater);
|
||||||
|
connect(reply, &QNetworkReply::finished, info, [reply, info, homeConnect, url, this] {
|
||||||
|
|
||||||
|
if (reply->error() == QNetworkReply::NetworkError::NoError) {
|
||||||
|
m_setupHomeConnectConnections.insert(info->thingId(), homeConnect);
|
||||||
|
connect(info, &ThingPairingInfo::aborted, this, [info, this] {m_setupHomeConnectConnections.take(info->thingId())->deleteLater();});
|
||||||
|
info->finish(Thing::ThingErrorNoError);
|
||||||
|
} else {
|
||||||
|
qCDebug(dcHomeConnect()) << "Got online check error" << reply->errorString();
|
||||||
|
info->finish(Thing::ThingErrorSetupFailed, tr("HomeConnect server not reachable, please check the internet connection"));
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
qCWarning(dcHomeConnect()) << "Unhandled pairing metod!";
|
qCWarning(dcHomeConnect()) << "Unhandled pairing metod!";
|
||||||
info->finish(Thing::ThingErrorCreationMethodNotSupported);
|
info->finish(Thing::ThingErrorCreationMethodNotSupported);
|
||||||
|
|
@ -180,10 +199,13 @@ void IntegrationPluginHomeConnect::confirmPairing(ThingPairingInfo *info, const
|
||||||
Q_UNUSED(username);
|
Q_UNUSED(username);
|
||||||
|
|
||||||
if (info->thingClassId() == homeConnectAccountThingClassId) {
|
if (info->thingClassId() == homeConnectAccountThingClassId) {
|
||||||
qCDebug(dcHomeConnect()) << "Redirect url is" << secret;
|
|
||||||
QUrl url(secret);
|
QUrl url(secret);
|
||||||
QUrlQuery query(url);
|
QUrlQuery query(url);
|
||||||
QByteArray authorizationCode = query.queryItemValue("code").toLocal8Bit();
|
QByteArray authorizationCode = query.queryItemValue("code").toLocal8Bit();
|
||||||
|
if (authorizationCode.isEmpty()) {
|
||||||
|
qCWarning(dcHomeConnect()) << "No authorization code received.";
|
||||||
|
info->finish(Thing::ThingErrorSetupFailed);
|
||||||
|
}
|
||||||
|
|
||||||
HomeConnect *homeConnect = m_setupHomeConnectConnections.value(info->thingId());
|
HomeConnect *homeConnect = m_setupHomeConnectConnections.value(info->thingId());
|
||||||
if (!homeConnect) {
|
if (!homeConnect) {
|
||||||
|
|
@ -192,10 +214,10 @@ void IntegrationPluginHomeConnect::confirmPairing(ThingPairingInfo *info, const
|
||||||
info->finish(Thing::ThingErrorHardwareFailure);
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qCDebug(dcHomeConnect()) << "Authorization code" << authorizationCode;
|
qCDebug(dcHomeConnect()) << "Authorization code" << authorizationCode.mid(0, 4)+QString().fill('*', authorizationCode.length()-4) ;
|
||||||
homeConnect->getAccessTokenFromAuthorizationCode(authorizationCode);
|
homeConnect->getAccessTokenFromAuthorizationCode(authorizationCode);
|
||||||
connect(homeConnect, &HomeConnect::receivedRefreshToken, info, [info, this](const QByteArray &refreshToken){
|
connect(homeConnect, &HomeConnect::receivedRefreshToken, info, [info, this](const QByteArray &refreshToken){
|
||||||
qCDebug(dcHomeConnect()) << "Token:" << refreshToken;
|
qCDebug(dcHomeConnect()) << "Token:" << refreshToken.mid(0, 4)+QString().fill('*', refreshToken.length()-4) ;
|
||||||
|
|
||||||
pluginStorage()->beginGroup(info->thingId().toString());
|
pluginStorage()->beginGroup(info->thingId().toString());
|
||||||
pluginStorage()->setValue("refresh_token", refreshToken);
|
pluginStorage()->setValue("refresh_token", refreshToken);
|
||||||
|
|
@ -236,6 +258,8 @@ void IntegrationPluginHomeConnect::setupThing(ThingSetupInfo *info)
|
||||||
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
||||||
clientKey = apiKeyStorage()->requestKey("homeconnect").data("clientKey");
|
clientKey = apiKeyStorage()->requestKey("homeconnect").data("clientKey");
|
||||||
clientSecret = apiKeyStorage()->requestKey("homeconnect").data("clientSecret");
|
clientSecret = apiKeyStorage()->requestKey("homeconnect").data("clientSecret");
|
||||||
|
} else {
|
||||||
|
qCDebug(dcHomeConnect()) << "Using custom API key and secret.";
|
||||||
}
|
}
|
||||||
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
if (clientKey.isEmpty() || clientSecret.isEmpty()) {
|
||||||
info->finish(Thing::ThingErrorAuthenticationFailure, tr("Client key and/or seceret is not available."));
|
info->finish(Thing::ThingErrorAuthenticationFailure, tr("Client key and/or seceret is not available."));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue