From 8d19fe07ba4dcd83b779792eddb4eb7b4532ff07 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Mon, 15 Jun 2020 20:23:00 +0200 Subject: [PATCH 1/3] fixed crash during thing pairing --- tado/integrationplugintado.cpp | 45 +++++++++++++++++++++++++--------- tado/tado.cpp | 21 ++++++++++------ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/tado/integrationplugintado.cpp b/tado/integrationplugintado.cpp index bb236ff3..318d6bcb 100644 --- a/tado/integrationplugintado.cpp +++ b/tado/integrationplugintado.cpp @@ -48,6 +48,7 @@ void IntegrationPluginTado::startPairing(ThingPairingInfo *info) // Checking the internet connection NetworkAccessManager *network = hardwareManager()->networkManager(); QNetworkReply *reply = network->get(QNetworkRequest(QUrl("https://my.tado.com/api/v2"))); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, info, [reply, info] { if (reply->error() == QNetworkReply::NetworkError::HostNotFoundError) { @@ -56,11 +57,11 @@ void IntegrationPluginTado::startPairing(ThingPairingInfo *info) info->finish(Thing::ThingErrorNoError, QT_TR_NOOP("Please enter the login credentials for your Tado account.")); } }); - connect(reply, &QNetworkReply::finished, this, &QNetworkReply::deleteLater); } void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString &username, const QString &password) { + qCDebug(dcTado()) << "Confirm pairing" << username << "password" << password << "Network manager available" << hardwareManager()->networkManager()->available(); Tado *tado = new Tado(hardwareManager()->networkManager(), username, this); connect(tado, &Tado::tokenReceived, this, &IntegrationPluginTado::onTokenReceived); connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged); @@ -74,6 +75,14 @@ void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString m_unfinishedDevicePairings.insert(info->thingId(), info); tado->getToken(password); + connect(info, &ThingPairingInfo::aborted, this, [info, tado, this]() { + qCWarning(dcTado()) << "Thing pairing has been aborted, going to clean-up"; + m_unfinishedDevicePairings.remove(info->thingId()); + m_unfinishedTadoAccounts.remove(info->thingId()); + tado->deleteLater(); + //TODO clean up plugin storage + }); + pluginStorage()->beginGroup(info->thingId().toString()); pluginStorage()->setValue("username", username); pluginStorage()->setValue("password", password); @@ -87,17 +96,17 @@ void IntegrationPluginTado::setupThing(ThingSetupInfo *info) if (thing->thingClassId() == tadoConnectionThingClassId) { qCDebug(dcTado) << "Setup tado connection" << thing->name() << thing->params(); - pluginStorage()->beginGroup(thing->id().toString()); - QString username = pluginStorage()->value("username").toString(); - QString password = pluginStorage()->value("password").toString(); - pluginStorage()->endGroup(); - Tado *tado; if (m_unfinishedTadoAccounts.contains(thing->id())) { tado = m_unfinishedTadoAccounts.take(thing->id()); m_tadoAccounts.insert(thing->id(), tado); return info->finish(Thing::ThingErrorNoError); } else { + pluginStorage()->beginGroup(thing->id().toString()); + QString username = pluginStorage()->value("username").toString(); + QString password = pluginStorage()->value("password").toString(); + pluginStorage()->endGroup(); + tado = new Tado(hardwareManager()->networkManager(), username, this); connect(tado, &Tado::tokenReceived, this, &IntegrationPluginTado::onTokenReceived); connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged); @@ -226,8 +235,10 @@ void IntegrationPluginTado::onPluginTimer() { foreach (Thing *thing, myThings().filterByThingClassId(zoneThingClassId)) { Tado *tado = m_tadoAccounts.value(thing->parentId()); - if (!tado) + if (!tado){ + qCWarning(dcTado()) << "Could not find any Tado connection to Zone" << thing->name(); continue; + } QString homeId = thing->paramValue(zoneThingHomeIdParamTypeId).toString(); QString zoneId = thing->paramValue(zoneThingZoneIdParamTypeId).toString(); @@ -270,16 +281,23 @@ void IntegrationPluginTado::onAuthenticationStatusChanged(bool authenticated) Tado *tado = static_cast(sender()); if (m_unfinishedTadoAccounts.values().contains(tado) && !authenticated){ + qCWarning(dcTado()) << "Authentication Status changed: " << authenticated << "removing unfinished Tado account"; ThingId id = m_unfinishedTadoAccounts.key(tado); m_unfinishedTadoAccounts.remove(id); - ThingPairingInfo *info = m_unfinishedDevicePairings.take(id); - info->finish(Thing::ThingErrorSetupFailed); + + if (m_unfinishedDevicePairings.contains(id)) { + qCWarning(dcTado()) << "Removing unfinished device pairing"; + ThingPairingInfo *info = m_unfinishedDevicePairings.take(id); + info->finish(Thing::ThingErrorSetupFailed); + } } if (m_tadoAccounts.values().contains(tado)){ Thing *thing = myThings().findById(m_tadoAccounts.key(tado)); - if (!thing) + if (!thing){ + qCWarning(dcTado()) << "OnAuthenticationChanged no thing found by ID" << m_tadoAccounts.key(tado); return; + } thing->setStateValue(tadoConnectionLoggedInStateTypeId, authenticated); if (!authenticated) { @@ -320,9 +338,12 @@ void IntegrationPluginTado::onTokenReceived(Tado::Token token) } if (m_unfinishedTadoAccounts.values().contains(tado)) { + qCDebug(dcTado()) << "onTokenReceived: Finishing pairing process"; ThingId id = m_unfinishedTadoAccounts.key(tado); - ThingPairingInfo *info = m_unfinishedDevicePairings.take(id); - info->finish(Thing::ThingErrorNoError); + if (m_unfinishedDevicePairings.contains(id)) { + ThingPairingInfo *info = m_unfinishedDevicePairings.take(id); + info->finish(Thing::ThingErrorNoError); + } } } diff --git a/tado/tado.cpp b/tado/tado.cpp index 462a6d70..b9d20c62 100644 --- a/tado/tado.cpp +++ b/tado/tado.cpp @@ -81,10 +81,10 @@ void Tado::getToken(const QString &password) QNetworkReply *reply = m_networkManager->post(request, body); //qCDebug(dcTado()) << "Sending request" << request.url() << body; + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [reply, this] { - reply->deleteLater(); - int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { if (reply->error() == QNetworkReply::HostNotFoundError) { @@ -142,8 +142,9 @@ void Tado::getHomes() request.setRawHeader("Authorization", "Bearer " + m_accessToken.toLocal8Bit()); QNetworkReply *reply = m_networkManager->get(request); //qDebug(dcTado()) << "Sending request" << request.url() << request.rawHeaderList(); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [reply, this] { - reply->deleteLater(); + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code @@ -187,8 +188,9 @@ void Tado::getZones(const QString &homeId) request.setRawHeader("Authorization", "Bearer " + m_accessToken.toLocal8Bit()); QNetworkReply *reply = m_networkManager->get(request); //qDebug(dcTado()) << "Sending request" << request.url() << request.rawHeaderList(); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [reply, homeId, this] { - reply->deleteLater(); + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code @@ -233,8 +235,9 @@ void Tado::getZoneState(const QString &homeId, const QString &zoneId) request.setRawHeader("Authorization", "Bearer " + m_accessToken.toLocal8Bit()); QNetworkReply *reply = m_networkManager->get(request); //qDebug(dcTado()) << "Sending request" << request.url() << request.rawHeaderList(); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [reply, homeId, zoneId, this] { - reply->deleteLater(); + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code @@ -308,8 +311,8 @@ QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power, body.append("{\"setting\":{\"type\":\"HEATING\",\"power\":\""+ powerString + "\",\"temperature\":{\"celsius\":" + QVariant(targetTemperature).toByteArray() + "}},\"termination\":{\"type\":\"MANUAL\"}}"); //qCDebug(dcTado()) << "Sending request" << body; QNetworkReply *reply = m_networkManager->put(request, body); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [homeId, zoneId, requestId, reply, this] { - reply->deleteLater(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code @@ -360,8 +363,9 @@ QUuid Tado::deleteOverlay(const QString &homeId, const QString &zoneId) request.setUrl(QUrl(m_baseControlUrl+"/homes/"+homeId+"/zones/"+zoneId+"/overlay")); request.setRawHeader("Authorization", "Bearer " + m_accessToken.toLocal8Bit()); QNetworkReply *reply = m_networkManager->deleteResource(request); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [homeId, zoneId, requestId, reply, this] { - reply->deleteLater(); + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code @@ -439,8 +443,9 @@ void Tado::onRefreshTimer() body.append("&scope=home.user"); QNetworkReply *reply = m_networkManager->post(request, body); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [reply, this] { - reply->deleteLater(); + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code From cdf51d87d71a4f0a013d6776268b34fc80f1004f Mon Sep 17 00:00:00 2001 From: Boernsman Date: Mon, 15 Jun 2020 21:26:02 +0200 Subject: [PATCH 2/3] Tado: made account setup more failsafe --- tado/integrationplugintado.cpp | 115 +++++++++++++++------------------ tado/integrationplugintado.h | 3 - tado/tado.cpp | 29 +++++++++ tado/tado.h | 3 +- 4 files changed, 83 insertions(+), 67 deletions(-) diff --git a/tado/integrationplugintado.cpp b/tado/integrationplugintado.cpp index 318d6bcb..5ed34da5 100644 --- a/tado/integrationplugintado.cpp +++ b/tado/integrationplugintado.cpp @@ -63,7 +63,6 @@ void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString { qCDebug(dcTado()) << "Confirm pairing" << username << "password" << password << "Network manager available" << hardwareManager()->networkManager()->available(); Tado *tado = new Tado(hardwareManager()->networkManager(), username, this); - connect(tado, &Tado::tokenReceived, this, &IntegrationPluginTado::onTokenReceived); connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged); connect(tado, &Tado::requestExecuted, this, &IntegrationPluginTado::onRequestExecuted); connect(tado, &Tado::connectionChanged, this, &IntegrationPluginTado::onConnectionChanged); @@ -72,21 +71,31 @@ void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString connect(tado, &Tado::zoneStateReceived, this, &IntegrationPluginTado::onZoneStateReceived); connect(tado, &Tado::overlayReceived, this, &IntegrationPluginTado::onOverlayReceived); m_unfinishedTadoAccounts.insert(info->thingId(), tado); - m_unfinishedDevicePairings.insert(info->thingId(), info); - tado->getToken(password); connect(info, &ThingPairingInfo::aborted, this, [info, tado, this]() { qCWarning(dcTado()) << "Thing pairing has been aborted, going to clean-up"; - m_unfinishedDevicePairings.remove(info->thingId()); m_unfinishedTadoAccounts.remove(info->thingId()); tado->deleteLater(); - //TODO clean up plugin storage }); - pluginStorage()->beginGroup(info->thingId().toString()); - pluginStorage()->setValue("username", username); - pluginStorage()->setValue("password", password); - pluginStorage()->endGroup(); + connect(tado, &Tado::connectionError, info, [this, info] (QNetworkReply::NetworkError error){ + if (error != QNetworkReply::NetworkError::NoError){ + info->finish(Thing::ThingErrorSetupFailed); + } + // info->finish(success) will be called after the token has been received + }); + + connect(tado, &Tado::tokenReceived, info, [this, info, username, password](Tado::Token token) { + Q_UNUSED(token) + + pluginStorage()->beginGroup(info->thingId().toString()); + pluginStorage()->setValue("username", username); + pluginStorage()->setValue("password", password); + pluginStorage()->endGroup(); + + info->finish(Thing::ThingErrorNoError); + }); + tado->getToken(password); } void IntegrationPluginTado::setupThing(ThingSetupInfo *info) @@ -108,7 +117,6 @@ void IntegrationPluginTado::setupThing(ThingSetupInfo *info) pluginStorage()->endGroup(); tado = new Tado(hardwareManager()->networkManager(), username, this); - connect(tado, &Tado::tokenReceived, this, &IntegrationPluginTado::onTokenReceived); connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged); connect(tado, &Tado::requestExecuted, this, &IntegrationPluginTado::onRequestExecuted); connect(tado, &Tado::connectionChanged, this, &IntegrationPluginTado::onConnectionChanged); @@ -116,14 +124,43 @@ void IntegrationPluginTado::setupThing(ThingSetupInfo *info) connect(tado, &Tado::zonesReceived, this, &IntegrationPluginTado::onZonesReceived); connect(tado, &Tado::zoneStateReceived, this, &IntegrationPluginTado::onZoneStateReceived); connect(tado, &Tado::overlayReceived, this, &IntegrationPluginTado::onOverlayReceived); - tado->getToken(password); + m_tadoAccounts.insert(thing->id(), tado); - m_asyncDeviceSetup.insert(tado, info); connect(info, &ThingSetupInfo::aborted, [info, this] { - Tado *tado = m_tadoAccounts.take(info->thing()->id()); - m_asyncDeviceSetup.remove(tado); - tado->deleteLater(); + if (m_tadoAccounts.contains(info->thing()->id())) { + Tado *tado = m_tadoAccounts.take(info->thing()->id()); + tado->deleteLater(); + } }); + + connect(tado, &Tado::tokenReceived, info, [this, info, tado](Tado::Token token) { + Q_UNUSED(token) + + qCDebug(dcTado()) << "Token received, account setup successfull"; + info->finish(Thing::ThingErrorNoError); + }); + + connect(tado, &Tado::connectionError, info, [this, info] (QNetworkReply::NetworkError error){ + if (error == QNetworkReply::NetworkError::HostNotFoundError) { + QTimer::singleShot(2000, info, [info, this] { + + pluginStorage()->beginGroup(info->thing()->id().toString()); + QString password = pluginStorage()->value("password").toString(); + pluginStorage()->endGroup(); + if (m_tadoAccounts.contains(info->thing()->id())) { + Tado *tado = m_tadoAccounts.take(info->thing()->id()); + tado->getToken(password); + } + }); + } else if (error != QNetworkReply::NetworkError::NoError){ + if (m_tadoAccounts.contains(info->thing()->id())) { + Tado *tado = m_tadoAccounts.take(info->thing()->id()); + tado->deleteLater(); + } + info->finish(Thing::ThingErrorSetupFailed); + } + }); + tado->getToken(password); } } else if (thing->thingClassId() == zoneThingClassId) { @@ -250,20 +287,6 @@ void IntegrationPluginTado::onConnectionChanged(bool connected) { Tado *tado = static_cast(sender()); - if (m_asyncDeviceSetup.contains(tado)) { - //Thing setup failed, try as long as ThingSetupInfo is valid. - if (!connected) { - QTimer::singleShot(2000, tado, [tado, this]{ - if(m_asyncDeviceSetup.contains(tado)){ - //Check once more if the ThingSetupInfo is still valid - pluginStorage()->beginGroup(m_asyncDeviceSetup.value(tado)->thing()->id().toString()); - QString password = pluginStorage()->value("password").toString(); - pluginStorage()->endGroup(); - tado->getToken(password); - } - }); - } - } if (m_tadoAccounts.values().contains(tado)){ Thing *thing = myThings().findById(m_tadoAccounts.key(tado)); if (!thing) @@ -280,18 +303,6 @@ void IntegrationPluginTado::onAuthenticationStatusChanged(bool authenticated) { Tado *tado = static_cast(sender()); - if (m_unfinishedTadoAccounts.values().contains(tado) && !authenticated){ - qCWarning(dcTado()) << "Authentication Status changed: " << authenticated << "removing unfinished Tado account"; - ThingId id = m_unfinishedTadoAccounts.key(tado); - m_unfinishedTadoAccounts.remove(id); - - if (m_unfinishedDevicePairings.contains(id)) { - qCWarning(dcTado()) << "Removing unfinished device pairing"; - ThingPairingInfo *info = m_unfinishedDevicePairings.take(id); - info->finish(Thing::ThingErrorSetupFailed); - } - } - if (m_tadoAccounts.values().contains(tado)){ Thing *thing = myThings().findById(m_tadoAccounts.key(tado)); if (!thing){ @@ -325,28 +336,6 @@ void IntegrationPluginTado::onRequestExecuted(QUuid requestId, bool success) } } -void IntegrationPluginTado::onTokenReceived(Tado::Token token) -{ - Q_UNUSED(token) - - qCDebug(dcTado()) << "Token received"; - Tado *tado = static_cast(sender()); - - if (m_asyncDeviceSetup.contains(tado)) { - ThingSetupInfo *info = m_asyncDeviceSetup.take(tado); - info->finish(Thing::ThingErrorNoError); - } - - if (m_unfinishedTadoAccounts.values().contains(tado)) { - qCDebug(dcTado()) << "onTokenReceived: Finishing pairing process"; - ThingId id = m_unfinishedTadoAccounts.key(tado); - if (m_unfinishedDevicePairings.contains(id)) { - ThingPairingInfo *info = m_unfinishedDevicePairings.take(id); - info->finish(Thing::ThingErrorNoError); - } - } -} - void IntegrationPluginTado::onHomesReceived(QList homes) { qCDebug(dcTado()) << "Homes received"; diff --git a/tado/integrationplugintado.h b/tado/integrationplugintado.h index 23c46063..28d344bf 100644 --- a/tado/integrationplugintado.h +++ b/tado/integrationplugintado.h @@ -57,10 +57,8 @@ public: private: PluginTimer *m_pluginTimer = nullptr; QHash m_unfinishedTadoAccounts; - QHash m_unfinishedDevicePairings; QHash m_tadoAccounts; - QHash m_asyncDeviceSetup; QHash m_asyncActions; private slots: @@ -69,7 +67,6 @@ private slots: void onConnectionChanged(bool connected); void onAuthenticationStatusChanged(bool authenticated); void onRequestExecuted(QUuid requestId, bool success); - void onTokenReceived(Tado::Token token); void onHomesReceived(QList homes); void onZonesReceived(const QString &homeId, QList zones); void onZoneStateReceived(const QString &homeId,const QString &zoneId, Tado::ZoneState sate); diff --git a/tado/tado.cpp b/tado/tado.cpp index b9d20c62..71338c39 100644 --- a/tado/tado.cpp +++ b/tado/tado.cpp @@ -87,6 +87,7 @@ void Tado::getToken(const QString &password) int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { + emit connectionError(reply->error()); if (reply->error() == QNetworkReply::HostNotFoundError) { setConnectionStatus(false); } @@ -136,6 +137,10 @@ void Tado::getToken(const QString &password) void Tado::getHomes() { + if(m_accessToken.isEmpty()) { + qCWarning(dcTado()) << "Not sending request, get the access token first"; + return; + } QNetworkRequest request; request.setUrl(QUrl(m_baseControlUrl + "/me")); request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); @@ -149,6 +154,7 @@ void Tado::getHomes() // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { + emit connectionError(reply->error()); if (reply->error() == QNetworkReply::HostNotFoundError) { setConnectionStatus(false); } @@ -229,6 +235,10 @@ void Tado::getZones(const QString &homeId) void Tado::getZoneState(const QString &homeId, const QString &zoneId) { + if(m_accessToken.isEmpty()) { + qCWarning(dcTado()) << "Not sending request, get the access token first"; + return; + } QNetworkRequest request; request.setUrl(QUrl(m_baseControlUrl+"/homes/"+homeId+"/zones/"+zoneId+"/state")); request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); @@ -242,6 +252,8 @@ void Tado::getZoneState(const QString &homeId, const QString &zoneId) // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { + emit connectionError(reply->error()); + if (reply->error() == QNetworkReply::HostNotFoundError) { setConnectionStatus(false); } @@ -295,6 +307,10 @@ void Tado::getZoneState(const QString &homeId, const QString &zoneId) QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power, double targetTemperature) { + if(m_accessToken.isEmpty()) { + qCWarning(dcTado()) << "Not sending request, get the access token first"; + return ""; + } QUuid requestId = QUuid::createUuid(); QNetworkRequest request; request.setUrl(QUrl(m_baseControlUrl+"/homes/"+homeId+"/zones/"+zoneId+"/overlay")); @@ -318,6 +334,8 @@ QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power, // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { emit requestExecuted(requestId, false); + emit connectionError(reply->error()); + if (reply->error() == QNetworkReply::HostNotFoundError) { setConnectionStatus(false); } @@ -358,6 +376,10 @@ QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power, QUuid Tado::deleteOverlay(const QString &homeId, const QString &zoneId) { + if(m_accessToken.isEmpty()) { + qCWarning(dcTado()) << "Not sending request, get the access token first"; + return ""; + } QUuid requestId = QUuid::createUuid(); QNetworkRequest request; request.setUrl(QUrl(m_baseControlUrl+"/homes/"+homeId+"/zones/"+zoneId+"/overlay")); @@ -371,6 +393,7 @@ QUuid Tado::deleteOverlay(const QString &homeId, const QString &zoneId) // Check HTTP status code if (status < 200 || status > 210 || reply->error() != QNetworkReply::NoError) { emit requestExecuted(requestId ,false); + emit connectionError(reply->error()); if (reply->error() == QNetworkReply::HostNotFoundError) { setConnectionStatus(false); } @@ -432,6 +455,11 @@ void Tado::setConnectionStatus(bool status) void Tado::onRefreshTimer() { + if(m_refreshToken.isEmpty()) { + qCWarning(dcTado()) << "Not sending request, get the access token first"; + return; + } + QNetworkRequest request; request.setUrl(QUrl(m_baseAuthorizationUrl)); request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); @@ -450,6 +478,7 @@ void Tado::onRefreshTimer() // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { + emit connectionError(reply->error()); if (reply->error() == QNetworkReply::HostNotFoundError) { setConnectionStatus(false); } diff --git a/tado/tado.h b/tado/tado.h index 1efa7a76..1e813130 100644 --- a/tado/tado.h +++ b/tado/tado.h @@ -42,6 +42,7 @@ class Tado : public QObject { Q_OBJECT public: + struct Token { QString accesToken; QString tokenType; @@ -65,7 +66,6 @@ public: QString tadoMode; }; - struct ZoneState { bool connected; bool power; @@ -131,6 +131,7 @@ signals: void zonesReceived(const QString &homeId, QList zones); void zoneStateReceived(const QString &homeId,const QString &zoneId, ZoneState sate); void overlayReceived(const QString &homeId, const QString &zoneId, const Overlay &overlay); + void connectionError(QNetworkReply::NetworkError error); private slots: void onRefreshTimer(); From fd598f22d3e8aac1b750e1927bd1a0ba05b6b43e Mon Sep 17 00:00:00 2001 From: Boernsman Date: Mon, 15 Jun 2020 21:38:09 +0200 Subject: [PATCH 3/3] Tado removed password from debug output --- tado/integrationplugintado.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tado/integrationplugintado.cpp b/tado/integrationplugintado.cpp index 5ed34da5..380dc406 100644 --- a/tado/integrationplugintado.cpp +++ b/tado/integrationplugintado.cpp @@ -61,7 +61,7 @@ void IntegrationPluginTado::startPairing(ThingPairingInfo *info) void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString &username, const QString &password) { - qCDebug(dcTado()) << "Confirm pairing" << username << "password" << password << "Network manager available" << hardwareManager()->networkManager()->available(); + qCDebug(dcTado()) << "Confirm pairing" << username << "Network manager available" << hardwareManager()->networkManager()->available(); Tado *tado = new Tado(hardwareManager()->networkManager(), username, this); connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged); connect(tado, &Tado::requestExecuted, this, &IntegrationPluginTado::onRequestExecuted);