Merge PR #332: Tado: Added dynamic API credential optaining

This commit is contained in:
Jenkins nymea 2020-12-21 18:01:31 +01:00
commit 56d9e4a105
6 changed files with 381 additions and 207 deletions

View File

@ -45,15 +45,17 @@ IntegrationPluginTado::IntegrationPluginTado()
void IntegrationPluginTado::startPairing(ThingPairingInfo *info)
{
// Checking the internet connection
qCDebug(dcTado()) << "Start pairing process, 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) {
qCWarning(dcTado()) << "Tado server is not reachable, likely because of a missing internet connection.";
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Tado server is not reachable."));
} else {
qCDebug(dcTado()) << "Internet connection available";
info->finish(Thing::ThingErrorNoError, QT_TR_NOOP("Please enter the login credentials for your Tado account."));
}
});
@ -63,13 +65,6 @@ void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString
{
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);
connect(tado, &Tado::connectionChanged, this, &IntegrationPluginTado::onConnectionChanged);
connect(tado, &Tado::homesReceived, this, &IntegrationPluginTado::onHomesReceived);
connect(tado, &Tado::zonesReceived, this, &IntegrationPluginTado::onZonesReceived);
connect(tado, &Tado::zoneStateReceived, this, &IntegrationPluginTado::onZoneStateReceived);
connect(tado, &Tado::overlayReceived, this, &IntegrationPluginTado::onOverlayReceived);
m_unfinishedTadoAccounts.insert(info->thingId(), tado);
connect(info, &ThingPairingInfo::aborted, this, [info, tado, this]() {
@ -78,13 +73,26 @@ void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString
tado->deleteLater();
});
connect(tado, &Tado::connectionError, info, [this, info] (QNetworkReply::NetworkError error){
if (error != QNetworkReply::NetworkError::NoError){
info->finish(Thing::ThingErrorSetupFailed);
connect(tado, &Tado::connectionError, info, [info] (QNetworkReply::NetworkError error){
if (error == QNetworkReply::NetworkError::ProtocolInvalidOperationError) {
qCWarning(dcTado()) << "Confirm pairing failed, wrong username or password";
info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("Wrong username or password."));
} else if (error != QNetworkReply::NetworkError::NoError){
qCWarning(dcTado()) << "Confirm pairing failed" << error;
info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("Connection error"));
}
// info->finish(success) will be called after the token has been received
});
connect(tado, &Tado::apiCredentialsReceived, info, [info, password, tado] (bool success) {
if (success) {
tado->getToken(password);
} else {
info->finish(Thing::ThingErrorAuthenticationFailure, QT_TR_NOOP("Client credentials not found, the plug-in version might be outdated."));
}
});
connect(tado, &Tado::tokenReceived, info, [this, info, username, password](Tado::Token token) {
Q_UNUSED(token)
@ -95,21 +103,28 @@ void IntegrationPluginTado::confirmPairing(ThingPairingInfo *info, const QString
info->finish(Thing::ThingErrorNoError);
});
tado->getToken(password);
tado->getApiCredentials();
}
void IntegrationPluginTado::setupThing(ThingSetupInfo *info)
{
Thing *thing = info->thing();
if (thing->thingClassId() == tadoConnectionThingClassId) {
if (thing->thingClassId() == tadoAccountThingClassId) {
qCDebug(dcTado) << "Setup tado connection" << thing->name() << thing->params();
qCDebug(dcTado) << "Setup Tado account" << thing->name() << thing->params();
Tado *tado;
if (m_tadoAccounts.contains(thing->id())) {
qCDebug(dcTado()) << "Setup after reconfigure, cleaning up";
m_tadoAccounts.take(thing->id())->deleteLater();
}
if (m_unfinishedTadoAccounts.contains(thing->id())) {
qCDebug(dcTado()) << "Using Tado connection from pairing process";
tado = m_unfinishedTadoAccounts.take(thing->id());
m_tadoAccounts.insert(thing->id(), tado);
return info->finish(Thing::ThingErrorNoError);
info->finish(Thing::ThingErrorNoError);
} else {
pluginStorage()->beginGroup(thing->id().toString());
QString username = pluginStorage()->value("username").toString();
@ -117,14 +132,6 @@ void IntegrationPluginTado::setupThing(ThingSetupInfo *info)
pluginStorage()->endGroup();
tado = new Tado(hardwareManager()->networkManager(), username, this);
connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged);
connect(tado, &Tado::requestExecuted, this, &IntegrationPluginTado::onRequestExecuted);
connect(tado, &Tado::connectionChanged, this, &IntegrationPluginTado::onConnectionChanged);
connect(tado, &Tado::homesReceived, this, &IntegrationPluginTado::onHomesReceived);
connect(tado, &Tado::zonesReceived, this, &IntegrationPluginTado::onZonesReceived);
connect(tado, &Tado::zoneStateReceived, this, &IntegrationPluginTado::onZoneStateReceived);
connect(tado, &Tado::overlayReceived, this, &IntegrationPluginTado::onOverlayReceived);
m_tadoAccounts.insert(thing->id(), tado);
connect(info, &ThingSetupInfo::aborted, [info, this] {
if (m_tadoAccounts.contains(info->thing()->id())) {
@ -133,48 +140,67 @@ void IntegrationPluginTado::setupThing(ThingSetupInfo *info)
}
});
connect(tado, &Tado::tokenReceived, info, [this, info, tado](Tado::Token token) {
connect(tado, &Tado::apiCredentialsReceived, info, [password, tado] {
tado->getToken(password);
});
connect(tado, &Tado::tokenReceived, info, [ info](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] {
connect(tado, &Tado::connectionError, info, [this, info] (QNetworkReply::NetworkError error) {
if (error != QNetworkReply::NetworkError::NoError){
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);
if (error == QNetworkReply::NetworkError::ProtocolInvalidOperationError) {
qCWarning(dcTado()) << "Confirm pairing failed, wrong username or password";
info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("Wrong username or password."));
} else {
qCWarning(dcTado()) << "Confirm pairing failed" << error;
info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("Connection error"));
}
}
});
tado->getToken(password);
tado->getApiCredentials();
}
connect(tado, &Tado::authenticationStatusChanged, this, &IntegrationPluginTado::onAuthenticationStatusChanged);
connect(tado, &Tado::requestExecuted, this, &IntegrationPluginTado::onRequestExecuted);
connect(tado, &Tado::connectionChanged, this, &IntegrationPluginTado::onConnectionChanged);
connect(tado, &Tado::homesReceived, this, &IntegrationPluginTado::onHomesReceived);
connect(tado, &Tado::zonesReceived, this, &IntegrationPluginTado::onZonesReceived);
connect(tado, &Tado::zoneStateReceived, this, &IntegrationPluginTado::onZoneStateReceived);
connect(tado, &Tado::overlayReceived, this, &IntegrationPluginTado::onOverlayReceived);
return;
} else if (thing->thingClassId() == zoneThingClassId) {
qCDebug(dcTado) << "Setup tado thermostat" << thing->params();
return info->finish(Thing::ThingErrorNoError);
qCDebug(dcTado) << "Setup Tado zone" << thing->params();
Thing *parentThing = myThings().findById(thing->parentId());
if(parentThing->setupComplete()) {
return info->finish(Thing::ThingErrorNoError);
} else {
connect(parentThing, &Thing::setupStatusChanged, info, [parentThing, info]{
if (parentThing->setupComplete()) {
info->finish(Thing::ThingErrorNoError);
}
});
}
} else {
return info->finish(Thing::ThingErrorThingClassNotFound);
qCWarning(dcTado()) << "Unhandled thing class in setupDevice";
return info->finish(Thing::ThingErrorThingClassNotFound);
}
}
void IntegrationPluginTado::thingRemoved(Thing *thing)
{
if (thing->thingClassId() == tadoConnectionThingClassId) {
if (thing->thingClassId() == tadoAccountThingClassId) {
Tado *tado = m_tadoAccounts.take(thing->id());
tado->deleteLater();
}
@ -192,11 +218,11 @@ void IntegrationPluginTado::postSetupThing(Thing *thing)
connect(m_pluginTimer, &PluginTimer::timeout, this, &IntegrationPluginTado::onPluginTimer);
}
if (thing->thingClassId() == tadoConnectionThingClassId) {
if (thing->thingClassId() == tadoAccountThingClassId) {
Tado *tado = m_tadoAccounts.value(thing->id());
thing->setStateValue(tadoConnectionUserDisplayNameStateTypeId, tado->username());
thing->setStateValue(tadoConnectionLoggedInStateTypeId, true);
thing->setStateValue(tadoConnectionConnectedStateTypeId, true);
thing->setStateValue(tadoAccountUserDisplayNameStateTypeId, tado->username());
thing->setStateValue(tadoAccountLoggedInStateTypeId, true);
thing->setStateValue(tadoAccountConnectedStateTypeId, true);
tado->getHomes();
} else if (thing->thingClassId() == zoneThingClassId) {
@ -270,16 +296,22 @@ void IntegrationPluginTado::executeAction(ThingActionInfo *info)
void IntegrationPluginTado::onPluginTimer()
{
foreach (Thing *thing, myThings().filterByThingClassId(zoneThingClassId)) {
Tado *tado = m_tadoAccounts.value(thing->parentId());
if (!tado){
qCWarning(dcTado()) << "Could not find any Tado connection to Zone" << thing->name();
continue;
Q_FOREACH(Tado *tado, m_tadoAccounts){
ThingId accountThingId = m_tadoAccounts.key(tado);
if (!tado->authenticated()) {
pluginStorage()->beginGroup(accountThingId.toString());
QString password = pluginStorage()->value("password").toString();
pluginStorage()->endGroup();
tado->getToken(password);
} else {
Q_FOREACH(Thing *thing, myThings().filterByParentId(accountThingId)) {
if (thing->thingClassId() == zoneThingClassId) {
QString homeId = thing->paramValue(zoneThingHomeIdParamTypeId).toString();
QString zoneId = thing->paramValue(zoneThingZoneIdParamTypeId).toString();
tado->getZoneState(homeId, zoneId);
}
}
}
QString homeId = thing->paramValue(zoneThingHomeIdParamTypeId).toString();
QString zoneId = thing->paramValue(zoneThingZoneIdParamTypeId).toString();
tado->getZoneState(homeId, zoneId);
}
}
@ -291,10 +323,14 @@ void IntegrationPluginTado::onConnectionChanged(bool connected)
Thing *thing = myThings().findById(m_tadoAccounts.key(tado));
if (!thing)
return;
thing->setStateValue(tadoConnectionConnectedStateTypeId, connected);
thing->setStateValue(tadoAccountConnectedStateTypeId, connected);
foreach(Thing *zoneThing, myThings().filterByParentId(thing->id())) {
zoneThing->setStateValue(zoneConnectedStateTypeId, connected);
if (!connected) {
Q_FOREACH(Thing *child, myThings().filterByParentId(thing->id())) {
if (child->thingClassId() == zoneThingClassId) {
child->setStateValue(zoneConnectedStateTypeId, connected);
}
}
}
}
}
@ -309,17 +345,13 @@ void IntegrationPluginTado::onAuthenticationStatusChanged(bool authenticated)
qCWarning(dcTado()) << "OnAuthenticationChanged no thing found by ID" << m_tadoAccounts.key(tado);
return;
}
thing->setStateValue(tadoConnectionLoggedInStateTypeId, authenticated);
thing->setStateValue(tadoAccountLoggedInStateTypeId, authenticated);
if (!authenticated) {
QTimer::singleShot(5000, tado, [this, tado, thing] {
if (!tado->connected()) {
pluginStorage()->beginGroup(thing->id().toString());
QString password = pluginStorage()->value("password").toString();
pluginStorage()->endGroup();
tado->getToken(password);
Q_FOREACH(Thing *child, myThings().filterByParentId(thing->id())) {
if (child->thingClassId() == zoneThingClassId) {
child->setStateValue(zoneConnectedStateTypeId, authenticated);
}
});
}
}
}
}

View File

@ -10,8 +10,8 @@
"thingClasses": [
{
"id": "69be7d15-5658-4442-872e-42abbd8bff81",
"name": "tadoConnection",
"displayName": "Tado Connection",
"name": "tadoAccount",
"displayName": "Tado account",
"interfaces": ["account"],
"createMethods": ["user"],
"setupMethod": "userandpassword",
@ -19,8 +19,8 @@
{
"id": "2f79bc1d-27ed-480a-b583-728363c83ea6",
"name": "connected",
"displayName": "Available",
"displayNameEvent": "Available changed",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"defaultValue": false
},
@ -77,8 +77,8 @@
{
"id": "9f45a703-6a15-447c-a77a-0df731cda48e",
"name": "connected",
"displayName": "Available",
"displayNameEvent": "Available changed",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"defaultValue": false
},

View File

@ -56,6 +56,11 @@ QString Tado::username()
return m_username;
}
bool Tado::apiAvailable()
{
return m_apiAvailable;
}
bool Tado::authenticated()
{
return m_authenticationStatus;
@ -66,8 +71,74 @@ bool Tado::connected()
return m_connectionStatus;
}
void Tado::getApiCredentials(const QString &url)
{
QNetworkRequest request;
request.setUrl(url);
QNetworkReply *reply = m_networkManager->get(request);
qCDebug(dcTado()) << "Sending request" << request.url();
connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
connect(reply, &QNetworkReply::finished, this, [reply, this] {
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
// Check HTTP status code
if (status != 200 || reply->error() != QNetworkReply::NoError) {
qCWarning(dcTado()) << "Request error:" << status << reply->errorString();
emit apiCredentialsReceived(false);
return;
}
QRegExp filter;
filter.setPatternSyntax(QRegExp::Wildcard);
filter.setPattern("*tgaRestApiV2Endpoint:*");
QStringList list = QString(reply->readAll()).split('\n');
int index = list.indexOf(filter);
if (index == -1) {
qCWarning(dcTado()) << "GetApiCredenitals: Could not find the API url";
emit apiCredentialsReceived(false);
return;
}
m_baseControlUrl = list.value(index).split(": ").last().remove(QRegExp("[,']"));;
qCDebug(dcTado()) << "Received control url" << m_baseControlUrl;
filter.setPattern("*apiEndpoint*");
index = list.indexOf(filter);
if (index == -1) {
qCWarning(dcTado()) << "GetApiCredenitals: Could not find the authorization url";
emit apiCredentialsReceived(false);
return;
}
m_baseAuthorizationUrl = list.value(index).split(": ").last().remove(QRegExp("[,']"))+"/token";
qCDebug(dcTado()) << "Received auth url" << m_baseAuthorizationUrl;
filter.setPattern("*clientId*");
index = list.indexOf(filter);
if (index == -1) {
emit apiCredentialsReceived(false);
qCWarning(dcTado()) << "GetApiCredenitals: Could not find the client Id";
return;
}
m_clientId = list.value(index).split(": ").last().remove(QRegExp("[,']"));
qCDebug(dcTado()) << "Received client id" << m_clientId.mid(0, 4)+"*****";
filter.setPattern("*clientSecret*");
index = list.indexOf(filter);
if (index == -1) {
qCWarning(dcTado()) << "GetApiCredenitals: Could not find the client secret";
emit apiCredentialsReceived(false);
return;
}
m_clientSecret = list.value(index).split(": ").last().remove(QRegExp("[,']"));
qCDebug(dcTado()) << "Received client secret" << m_clientSecret.mid(0, 4)+"*****";
m_apiAvailable = true;
emit apiCredentialsReceived(true);
});
}
void Tado::getToken(const QString &password)
{
if (!m_apiAvailable) {
qCWarning(dcTado()) << "Not sending request, get API credentials first";
return;
}
QNetworkRequest request;
request.setUrl(QUrl(m_baseAuthorizationUrl));
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded");
@ -102,7 +173,7 @@ void Tado::getToken(const QString &password)
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Received invalide JSON object";
qDebug(dcTado()) << "Get Token: Received invalid JSON object:" << data;
return;
}
if (data.isObject()) {
@ -137,6 +208,11 @@ void Tado::getToken(const QString &password)
void Tado::getHomes()
{
if (!m_apiAvailable) {
qCWarning(dcTado()) << "Not sending request, get API credentials first";
return;
}
if(m_accessToken.isEmpty()) {
qCWarning(dcTado()) << "Not sending request, get the access token first";
return;
@ -170,7 +246,7 @@ void Tado::getHomes()
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Recieved invalide JSON object";
qDebug(dcTado()) << "Get Token: Recieved invalid JSON object";
return;
}
QList<Home> homes;
@ -188,6 +264,16 @@ void Tado::getHomes()
void Tado::getZones(const QString &homeId)
{
if (!m_apiAvailable) {
qCWarning(dcTado()) << "Not sending request, get API credentials first";
return;
}
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"));
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded");
@ -216,7 +302,7 @@ void Tado::getZones(const QString &homeId)
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Recieved invalide JSON object";
qDebug(dcTado()) << "Get Token: Recieved invalid JSON object";
return;
}
QList<Zone> zones;
@ -235,10 +321,16 @@ void Tado::getZones(const QString &homeId)
void Tado::getZoneState(const QString &homeId, const QString &zoneId)
{
if (!m_apiAvailable) {
qCWarning(dcTado()) << "Not sending request, get API credentials first";
return;
}
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");
@ -270,7 +362,7 @@ void Tado::getZoneState(const QString &homeId, const QString &zoneId)
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Recieved invalide JSON object";
qDebug(dcTado()) << "Get Token: Recieved invalid JSON object";
return;
}
ZoneState state;
@ -307,10 +399,16 @@ void Tado::getZoneState(const QString &homeId, const QString &zoneId)
QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power, double targetTemperature)
{
if (!m_apiAvailable) {
qCWarning(dcTado()) << "Not sending request, get API credentials first";
return "";
}
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"));
@ -355,7 +453,7 @@ QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power,
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Recieved invalide JSON object";
qDebug(dcTado()) << "Get Token: Recieved invalid JSON object";
return;
}
QVariantMap map = data.toVariant().toMap();
@ -376,10 +474,16 @@ QUuid Tado::setOverlay(const QString &homeId, const QString &zoneId, bool power,
QUuid Tado::deleteOverlay(const QString &homeId, const QString &zoneId)
{
if (!m_apiAvailable) {
qCWarning(dcTado()) << "Not sending request, get API credentials first";
return "";
}
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"));
@ -414,7 +518,7 @@ QUuid Tado::deleteOverlay(const QString &homeId, const QString &zoneId)
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Recieved invalide JSON object";
qDebug(dcTado()) << "Get Token: Recieved invalid JSON object";
return;
}
QVariantMap map = data.toVariant().toMap();
@ -494,7 +598,7 @@ void Tado::onRefreshTimer()
QJsonParseError error;
QJsonDocument data = QJsonDocument::fromJson(reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug(dcTado()) << "Get Token: Recieved invalide JSON object";
qDebug(dcTado()) << "Get Token: Recieved invalid JSON object";
return;
}
Token token;

View File

@ -93,9 +93,11 @@ public:
void setUsername(const QString &username);
QString username();
bool apiAvailable();
bool authenticated();
bool connected();
void getApiCredentials(const QString &url = "https://my.tado.com/webapp/env.js");
void getToken(const QString &password);
void getHomes();
void getZones(const QString &homeId);
@ -105,10 +107,11 @@ public:
QUuid deleteOverlay(const QString &homeId, const QString &zoneId);
private:
QByteArray m_baseAuthorizationUrl = "https://auth.tado.com/oauth/token";
QByteArray m_baseControlUrl = "https://my.tado.com/api/v2";
QByteArray m_clientSecret = "4HJGRffVR8xb3XdEUQpjgZ1VplJi6Xgw";
QByteArray m_clientId = "public-api-preview";
bool m_apiAvailable = false;
QString m_baseAuthorizationUrl;
QString m_baseControlUrl;
QString m_clientSecret;
QString m_clientId;
NetworkAccessManager *m_networkManager = nullptr;
QString m_username;
@ -123,6 +126,7 @@ private:
signals:
void connectionChanged(bool connected);
void apiCredentialsReceived(bool success);
void authenticationStatusChanged(bool authenticated);
void requestExecuted(QUuid requestId, bool success);

View File

@ -4,51 +4,68 @@
<context>
<name>IntegrationPluginTado</name>
<message>
<location filename="../integrationplugintado.cpp" line="55"/>
<location filename="../integrationplugintado.cpp" line="56"/>
<source>Tado server is not reachable.</source>
<translation>Tado-Server ist nicht erreichbar.</translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="57"/>
<location filename="../integrationplugintado.cpp" line="59"/>
<source>Please enter the login credentials for your Tado account.</source>
<translation>Bitte geben Sie die Anmeldeinformationen für Ihr Tado-Konto ein.</translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="80"/>
<location filename="../integrationplugintado.cpp" line="157"/>
<source>Wrong username or password.</source>
<translation>Fascher Benutzername oder Passwort.</translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="83"/>
<location filename="../integrationplugintado.cpp" line="160"/>
<source>Connection error</source>
<translation>Verbindungsfehler</translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="92"/>
<source>Client credentials not found, the plug-in version might be outdated.</source>
<translation>Client-Anmeldeinformationen nicht gefunden, die Plug-In-Version ist möglicherweise veraltet.</translation>
</message>
</context>
<context>
<name>Tado</name>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="66"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="69"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="72"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="75"/>
<source>Available</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="71"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="77"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="80"/>
<source>Connected</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: connected, ID: {9f45a703-6a15-447c-a77a-0df731cda48e})
----------
The name of the StateType ({9f45a703-6a15-447c-a77a-0df731cda48e}) of ThingClass zone
----------
The name of the ParamType (ThingClass: tadoConnection, EventType: connected, ID: {2f79bc1d-27ed-480a-b583-728363c83ea6})
The name of the ParamType (ThingClass: tadoAccount, EventType: connected, ID: {2f79bc1d-27ed-480a-b583-728363c83ea6})
----------
The name of the StateType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoConnection</extracomment>
<translation>Verfügbar</translation>
The name of the StateType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoAccount</extracomment>
<translation>Verbunden</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="78"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="81"/>
<source>Available changed</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="83"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="86"/>
<source>Connected changed</source>
<extracomment>The name of the EventType ({9f45a703-6a15-447c-a77a-0df731cda48e}) of ThingClass zone
----------
The name of the EventType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoConnection</extracomment>
<translation>Verfügbar geändert</translation>
The name of the EventType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoAccount</extracomment>
<translation>Verbunden geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="84"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="89"/>
<source>Home id</source>
<extracomment>The name of the ParamType (ThingClass: zone, Type: thing, ID: {330cad74-6f07-42ad-b226-299927c3c4f0})</extracomment>
<translation>Home id</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="87"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="90"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="92"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="95"/>
<source>Humidity</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: humidity, ID: {0faaaff1-2a33-44ec-b68d-d8855f584b02})
----------
@ -56,30 +73,30 @@ The name of the StateType ({0faaaff1-2a33-44ec-b68d-d8855f584b02}) of ThingClass
<translation>Luftfeuchte</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="93"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="98"/>
<source>Humidity changed</source>
<extracomment>The name of the EventType ({0faaaff1-2a33-44ec-b68d-d8855f584b02}) of ThingClass zone</extracomment>
<translation>Luftfeuchte geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="96"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="99"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="101"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="104"/>
<source>Logged in</source>
<extracomment>The name of the ParamType (ThingClass: tadoConnection, EventType: loggedIn, ID: {2aed240b-8c5c-418b-a9d1-0d75412c1c27})
<extracomment>The name of the ParamType (ThingClass: tadoAccount, EventType: loggedIn, ID: {2aed240b-8c5c-418b-a9d1-0d75412c1c27})
----------
The name of the StateType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoConnection</extracomment>
The name of the StateType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoAccount</extracomment>
<translation>Eingelogged</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="102"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="107"/>
<source>Logged in changed</source>
<extracomment>The name of the EventType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoConnection</extracomment>
<extracomment>The name of the EventType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoAccount</extracomment>
<translation>Eingelogged geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="105"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="108"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="111"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="110"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="113"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="116"/>
<source>Mode</source>
<extracomment>The name of the ParamType (ThingClass: zone, ActionType: mode, ID: {4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b})
----------
@ -89,15 +106,15 @@ The name of the StateType ({4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b}) of ThingClass
<translation>Modus</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="114"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="119"/>
<source>Mode changed</source>
<extracomment>The name of the EventType ({4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b}) of ThingClass zone</extracomment>
<translation>Modus geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="117"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="120"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="123"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="122"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="125"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="128"/>
<source>Power</source>
<extracomment>The name of the ParamType (ThingClass: zone, ActionType: power, ID: {e886377d-34b7-4908-ad0d-ed463fc6181d})
----------
@ -107,32 +124,32 @@ The name of the StateType ({e886377d-34b7-4908-ad0d-ed463fc6181d}) of ThingClass
<translation>Eingeschalten</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="126"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="131"/>
<source>Power changed</source>
<extracomment>The name of the EventType ({e886377d-34b7-4908-ad0d-ed463fc6181d}) of ThingClass zone</extracomment>
<translation>Eingeschalten geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="129"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="134"/>
<source>Set mode</source>
<extracomment>The name of the ActionType ({4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b}) of ThingClass zone</extracomment>
<translation>Setze Modus</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="132"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="137"/>
<source>Set power</source>
<extracomment>The name of the ActionType ({e886377d-34b7-4908-ad0d-ed463fc6181d}) of ThingClass zone</extracomment>
<translation>Setze Eingeschalten</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="135"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="140"/>
<source>Set target temperature</source>
<extracomment>The name of the ActionType ({684fcc62-f12b-4669-988e-4b79f153b0f2}) of ThingClass zone</extracomment>
<translation>Setze Zieltemperatur</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="138"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="141"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="143"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="146"/>
<source>Tado</source>
<extracomment>The name of the vendor ({23c8a19f-bd6a-4c90-bcc9-2f0c0d9292c5})
----------
@ -140,14 +157,14 @@ The name of the plugin Tado ({b4f2d2ee-50bb-4786-b7f5-261fed204fa5})</extracomme
<translation>Tado</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="144"/>
<source>Tado Connection</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="149"/>
<source>Tado account</source>
<extracomment>The name of the ThingClass ({69be7d15-5658-4442-872e-42abbd8bff81})</extracomment>
<translation>Tado Verbindung</translation>
<translation>Tado-Benutzerkonto</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="147"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="150"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="152"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="155"/>
<source>Tado mode</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: tadoMode, ID: {8b800998-5c2d-4940-9d0e-036979cf49ca})
----------
@ -155,15 +172,15 @@ The name of the StateType ({8b800998-5c2d-4940-9d0e-036979cf49ca}) of ThingClass
<translation>Tado Modus</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="153"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="158"/>
<source>Tado mode changed</source>
<extracomment>The name of the EventType ({8b800998-5c2d-4940-9d0e-036979cf49ca}) of ThingClass zone</extracomment>
<translation>Tado Modus geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="156"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="159"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="162"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="161"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="164"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="167"/>
<source>Target temperature</source>
<extracomment>The name of the ParamType (ThingClass: zone, ActionType: targetTemperature, ID: {684fcc62-f12b-4669-988e-4b79f153b0f2})
----------
@ -173,14 +190,14 @@ The name of the StateType ({684fcc62-f12b-4669-988e-4b79f153b0f2}) of ThingClass
<translation>Zieltemperatur</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="165"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="170"/>
<source>Target temperature changed</source>
<extracomment>The name of the EventType ({684fcc62-f12b-4669-988e-4b79f153b0f2}) of ThingClass zone</extracomment>
<translation>Zieltemperatur geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="168"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="171"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="173"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="176"/>
<source>Temperature</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: temperature, ID: {80098178-7d92-43dd-a216-23704cc0eaa2})
----------
@ -188,35 +205,35 @@ The name of the StateType ({80098178-7d92-43dd-a216-23704cc0eaa2}) of ThingClass
<translation>Temperatur</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="174"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="179"/>
<source>Temperature changed</source>
<extracomment>The name of the EventType ({80098178-7d92-43dd-a216-23704cc0eaa2}) of ThingClass zone</extracomment>
<translation>Temperatur geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="177"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="182"/>
<source>Type</source>
<extracomment>The name of the ParamType (ThingClass: zone, Type: thing, ID: {8e86797e-5333-4428-9dba-9ed5ac243b44})</extracomment>
<translation>Typ</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="180"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="183"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="185"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="188"/>
<source>Username</source>
<extracomment>The name of the ParamType (ThingClass: tadoConnection, EventType: userDisplayName, ID: {33f55afc-a673-47a4-9fb0-75fdac6a66f4})
<extracomment>The name of the ParamType (ThingClass: tadoAccount, EventType: userDisplayName, ID: {33f55afc-a673-47a4-9fb0-75fdac6a66f4})
----------
The name of the StateType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoConnection</extracomment>
The name of the StateType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoAccount</extracomment>
<translation>Benutzername</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="186"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="191"/>
<source>Username changed</source>
<extracomment>The name of the EventType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoConnection</extracomment>
<extracomment>The name of the EventType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoAccount</extracomment>
<translation>Passwort</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="189"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="192"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="194"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="197"/>
<source>Window open</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: windowOpen, ID: {c7a04e26-bb22-406e-b117-262bdb8b9c0e})
----------
@ -224,19 +241,19 @@ The name of the StateType ({c7a04e26-bb22-406e-b117-262bdb8b9c0e}) of ThingClass
<translation>Fenster offen</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="195"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="200"/>
<source>Window open changed</source>
<extracomment>The name of the EventType ({c7a04e26-bb22-406e-b117-262bdb8b9c0e}) of ThingClass zone</extracomment>
<translation>Fenster offen geändert</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="198"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="203"/>
<source>Zone</source>
<extracomment>The name of the ThingClass ({1a7bb944-fb9c-490a-8a4c-794b27282292})</extracomment>
<translation>Zone</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="201"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="206"/>
<source>Zone id</source>
<extracomment>The name of the ParamType (ThingClass: zone, Type: thing, ID: {cd67476b-978d-4a22-a40e-50cbc941e09e})</extracomment>
<translation>Zonen-ID</translation>

View File

@ -4,51 +4,68 @@
<context>
<name>IntegrationPluginTado</name>
<message>
<location filename="../integrationplugintado.cpp" line="55"/>
<location filename="../integrationplugintado.cpp" line="56"/>
<source>Tado server is not reachable.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="57"/>
<location filename="../integrationplugintado.cpp" line="59"/>
<source>Please enter the login credentials for your Tado account.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="80"/>
<location filename="../integrationplugintado.cpp" line="157"/>
<source>Wrong username or password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="83"/>
<location filename="../integrationplugintado.cpp" line="160"/>
<source>Connection error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintado.cpp" line="92"/>
<source>Client credentials not found, the plug-in version might be outdated.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Tado</name>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="66"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="69"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="72"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="75"/>
<source>Available</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="71"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="77"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="80"/>
<source>Connected</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: connected, ID: {9f45a703-6a15-447c-a77a-0df731cda48e})
----------
The name of the StateType ({9f45a703-6a15-447c-a77a-0df731cda48e}) of ThingClass zone
----------
The name of the ParamType (ThingClass: tadoConnection, EventType: connected, ID: {2f79bc1d-27ed-480a-b583-728363c83ea6})
The name of the ParamType (ThingClass: tadoAccount, EventType: connected, ID: {2f79bc1d-27ed-480a-b583-728363c83ea6})
----------
The name of the StateType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoConnection</extracomment>
The name of the StateType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoAccount</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="78"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="81"/>
<source>Available changed</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="83"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="86"/>
<source>Connected changed</source>
<extracomment>The name of the EventType ({9f45a703-6a15-447c-a77a-0df731cda48e}) of ThingClass zone
----------
The name of the EventType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoConnection</extracomment>
The name of the EventType ({2f79bc1d-27ed-480a-b583-728363c83ea6}) of ThingClass tadoAccount</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="84"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="89"/>
<source>Home id</source>
<extracomment>The name of the ParamType (ThingClass: zone, Type: thing, ID: {330cad74-6f07-42ad-b226-299927c3c4f0})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="87"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="90"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="92"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="95"/>
<source>Humidity</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: humidity, ID: {0faaaff1-2a33-44ec-b68d-d8855f584b02})
----------
@ -56,30 +73,30 @@ The name of the StateType ({0faaaff1-2a33-44ec-b68d-d8855f584b02}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="93"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="98"/>
<source>Humidity changed</source>
<extracomment>The name of the EventType ({0faaaff1-2a33-44ec-b68d-d8855f584b02}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="96"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="99"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="101"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="104"/>
<source>Logged in</source>
<extracomment>The name of the ParamType (ThingClass: tadoConnection, EventType: loggedIn, ID: {2aed240b-8c5c-418b-a9d1-0d75412c1c27})
<extracomment>The name of the ParamType (ThingClass: tadoAccount, EventType: loggedIn, ID: {2aed240b-8c5c-418b-a9d1-0d75412c1c27})
----------
The name of the StateType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoConnection</extracomment>
The name of the StateType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoAccount</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="102"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="107"/>
<source>Logged in changed</source>
<extracomment>The name of the EventType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoConnection</extracomment>
<extracomment>The name of the EventType ({2aed240b-8c5c-418b-a9d1-0d75412c1c27}) of ThingClass tadoAccount</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="105"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="108"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="111"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="110"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="113"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="116"/>
<source>Mode</source>
<extracomment>The name of the ParamType (ThingClass: zone, ActionType: mode, ID: {4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b})
----------
@ -89,15 +106,15 @@ The name of the StateType ({4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="114"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="119"/>
<source>Mode changed</source>
<extracomment>The name of the EventType ({4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="117"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="120"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="123"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="122"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="125"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="128"/>
<source>Power</source>
<extracomment>The name of the ParamType (ThingClass: zone, ActionType: power, ID: {e886377d-34b7-4908-ad0d-ed463fc6181d})
----------
@ -107,32 +124,32 @@ The name of the StateType ({e886377d-34b7-4908-ad0d-ed463fc6181d}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="126"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="131"/>
<source>Power changed</source>
<extracomment>The name of the EventType ({e886377d-34b7-4908-ad0d-ed463fc6181d}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="129"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="134"/>
<source>Set mode</source>
<extracomment>The name of the ActionType ({4cecf87c-8a5d-4bc4-a4ba-d2ee6103714b}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="132"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="137"/>
<source>Set power</source>
<extracomment>The name of the ActionType ({e886377d-34b7-4908-ad0d-ed463fc6181d}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="135"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="140"/>
<source>Set target temperature</source>
<extracomment>The name of the ActionType ({684fcc62-f12b-4669-988e-4b79f153b0f2}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="138"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="141"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="143"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="146"/>
<source>Tado</source>
<extracomment>The name of the vendor ({23c8a19f-bd6a-4c90-bcc9-2f0c0d9292c5})
----------
@ -140,14 +157,14 @@ The name of the plugin Tado ({b4f2d2ee-50bb-4786-b7f5-261fed204fa5})</extracomme
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="144"/>
<source>Tado Connection</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="149"/>
<source>Tado account</source>
<extracomment>The name of the ThingClass ({69be7d15-5658-4442-872e-42abbd8bff81})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="147"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="150"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="152"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="155"/>
<source>Tado mode</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: tadoMode, ID: {8b800998-5c2d-4940-9d0e-036979cf49ca})
----------
@ -155,15 +172,15 @@ The name of the StateType ({8b800998-5c2d-4940-9d0e-036979cf49ca}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="153"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="158"/>
<source>Tado mode changed</source>
<extracomment>The name of the EventType ({8b800998-5c2d-4940-9d0e-036979cf49ca}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="156"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="159"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="162"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="161"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="164"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="167"/>
<source>Target temperature</source>
<extracomment>The name of the ParamType (ThingClass: zone, ActionType: targetTemperature, ID: {684fcc62-f12b-4669-988e-4b79f153b0f2})
----------
@ -173,14 +190,14 @@ The name of the StateType ({684fcc62-f12b-4669-988e-4b79f153b0f2}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="165"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="170"/>
<source>Target temperature changed</source>
<extracomment>The name of the EventType ({684fcc62-f12b-4669-988e-4b79f153b0f2}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="168"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="171"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="173"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="176"/>
<source>Temperature</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: temperature, ID: {80098178-7d92-43dd-a216-23704cc0eaa2})
----------
@ -188,35 +205,35 @@ The name of the StateType ({80098178-7d92-43dd-a216-23704cc0eaa2}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="174"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="179"/>
<source>Temperature changed</source>
<extracomment>The name of the EventType ({80098178-7d92-43dd-a216-23704cc0eaa2}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="177"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="182"/>
<source>Type</source>
<extracomment>The name of the ParamType (ThingClass: zone, Type: thing, ID: {8e86797e-5333-4428-9dba-9ed5ac243b44})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="180"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="183"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="185"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="188"/>
<source>Username</source>
<extracomment>The name of the ParamType (ThingClass: tadoConnection, EventType: userDisplayName, ID: {33f55afc-a673-47a4-9fb0-75fdac6a66f4})
<extracomment>The name of the ParamType (ThingClass: tadoAccount, EventType: userDisplayName, ID: {33f55afc-a673-47a4-9fb0-75fdac6a66f4})
----------
The name of the StateType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoConnection</extracomment>
The name of the StateType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoAccount</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="186"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="191"/>
<source>Username changed</source>
<extracomment>The name of the EventType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoConnection</extracomment>
<extracomment>The name of the EventType ({33f55afc-a673-47a4-9fb0-75fdac6a66f4}) of ThingClass tadoAccount</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="189"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="192"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="194"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="197"/>
<source>Window open</source>
<extracomment>The name of the ParamType (ThingClass: zone, EventType: windowOpen, ID: {c7a04e26-bb22-406e-b117-262bdb8b9c0e})
----------
@ -224,19 +241,19 @@ The name of the StateType ({c7a04e26-bb22-406e-b117-262bdb8b9c0e}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="195"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="200"/>
<source>Window open changed</source>
<extracomment>The name of the EventType ({c7a04e26-bb22-406e-b117-262bdb8b9c0e}) of ThingClass zone</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="198"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="203"/>
<source>Zone</source>
<extracomment>The name of the ThingClass ({1a7bb944-fb9c-490a-8a4c-794b27282292})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="201"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tado/plugininfo.h" line="206"/>
<source>Zone id</source>
<extracomment>The name of the ParamType (ThingClass: zone, Type: thing, ID: {cd67476b-978d-4a22-a40e-50cbc941e09e})</extracomment>
<translation type="unfinished"></translation>