From 8ea2b96ee816ea6bf9b6cce467db4b9b17d040bb Mon Sep 17 00:00:00 2001 From: Boernsman Date: Wed, 16 Dec 2020 17:03:56 +0100 Subject: [PATCH] fixed netatmo setup and added wirelessconnected interface --- netatmo/integrationpluginnetatmo.cpp | 39 ++++++++++++++++----------- netatmo/integrationpluginnetatmo.json | 32 ++++++++++++++++++---- netatmo/netatmobasestation.cpp | 10 +++++++ netatmo/netatmobasestation.h | 2 ++ netatmo/netatmooutdoormodule.cpp | 10 +++++++ netatmo/netatmooutdoormodule.h | 2 ++ 6 files changed, 74 insertions(+), 21 deletions(-) diff --git a/netatmo/integrationpluginnetatmo.cpp b/netatmo/integrationpluginnetatmo.cpp index d6d698d6..c3d84d7b 100644 --- a/netatmo/integrationpluginnetatmo.cpp +++ b/netatmo/integrationpluginnetatmo.cpp @@ -154,31 +154,28 @@ void IntegrationPluginNetatmo::setupThing(ThingSetupInfo *info) } } + OAuth2 *authentication; if (m_pairingAuthentications.values().contains(thing->id())) { - OAuth2 *authentication = m_pairingAuthentications.key(thing->id()); + authentication = m_pairingAuthentications.key(thing->id()); m_pairingAuthentications.remove(authentication); qCDebug(dcNetatmo()) << "Authenticated from pairing process, not creating a new authentication"; - thing->setStateValue(netatmoConnectionConnectedStateTypeId, true); - thing->setStateValue(netatmoConnectionLoggedInStateTypeId, true); - thing->setStateValue(netatmoConnectionUserDisplayNameStateTypeId, authentication->username()); - m_authentications.insert(authentication, thing->id()); - info->finish(Thing::ThingErrorNoError); } else { - OAuth2 *authentication = new OAuth2(m_clientId, m_clientSecret, this); + authentication = new OAuth2(m_clientId, m_clientSecret, this); authentication->setUrl(QUrl("https://api.netatmo.net/oauth2/token")); authentication->setUsername(username); authentication->setPassword(password); authentication->setScope("read_station read_thermostat write_thermostat"); + } - // Update thing connected state based on OAuth connected state - connect(authentication, &OAuth2::authenticationChanged, thing, [this, thing, authentication](){ - thing->setStateValue(netatmoConnectionLoggedInStateTypeId, authentication->authenticated()); - if (authentication->authenticated()) { - refreshData(thing, authentication->token()); - } - }); + if (authentication->authenticated()) { + thing->setStateValue(netatmoConnectionConnectedStateTypeId, true); + thing->setStateValue(netatmoConnectionLoggedInStateTypeId, true); + thing->setStateValue(netatmoConnectionUserDisplayNameStateTypeId, authentication->username()); + m_authentications.insert(authentication, thing->id()); + refreshData(thing, authentication->token()); + info->finish(Thing::ThingErrorNoError); + } else { authentication->startAuthentication(); - // Report thing setup finished when authentication reports success connect(authentication, &OAuth2::authenticationChanged, info, [this, info, thing, authentication](){ if (!authentication->authenticated()) { @@ -193,6 +190,14 @@ void IntegrationPluginNetatmo::setupThing(ThingSetupInfo *info) info->finish(Thing::ThingErrorNoError); }); } + + // Update thing connected state based on OAuth connected state + connect(authentication, &OAuth2::authenticationChanged, thing, [this, thing, authentication](){ + thing->setStateValue(netatmoConnectionLoggedInStateTypeId, authentication->authenticated()); + if (authentication->authenticated()) { + refreshData(thing, authentication->token()); + } + }); return; } else if (thing->thingClassId() == indoorThingClassId) { @@ -457,7 +462,8 @@ void IntegrationPluginNetatmo::onIndoorStatesChanged() thing->setStateValue(indoorHumidityStateTypeId, indoor->humidity()); thing->setStateValue(indoorCo2StateTypeId, indoor->co2()); thing->setStateValue(indoorNoiseStateTypeId, indoor->noise()); - thing->setStateValue(indoorWifiStrengthStateTypeId, indoor->wifiStrength()); + thing->setStateValue(indoorSignalStrengthStateTypeId, indoor->wifiStrength()); + thing->setStateValue(indoorConnectedStateTypeId, indoor->reachable()); } void IntegrationPluginNetatmo::onOutdoorStatesChanged() @@ -473,6 +479,7 @@ void IntegrationPluginNetatmo::onOutdoorStatesChanged() thing->setStateValue(outdoorSignalStrengthStateTypeId, outdoor->signalStrength()); thing->setStateValue(outdoorBatteryLevelStateTypeId, outdoor->battery()); thing->setStateValue(outdoorBatteryCriticalStateTypeId, outdoor->battery() < 10); + thing->setStateValue(outdoorConnectedStateTypeId, outdoor->reachable()); } void IntegrationPluginNetatmo::updateClientCredentials() diff --git a/netatmo/integrationpluginnetatmo.json b/netatmo/integrationpluginnetatmo.json index c427b818..160a4b42 100644 --- a/netatmo/integrationpluginnetatmo.json +++ b/netatmo/integrationpluginnetatmo.json @@ -63,7 +63,7 @@ "id": "1c809049-04f2-4710-99f5-6ed379a2934f", "name": "indoor", "displayName": "Indoor Station", - "interfaces": ["temperaturesensor", "humiditysensor", "pressuresensor", "noisesensor", "co2sensor"], + "interfaces": ["temperaturesensor", "humiditysensor", "pressuresensor", "noisesensor", "co2sensor", "wirelessconnectable"], "createMethods": ["auto"], "paramTypes": [ { @@ -159,12 +159,23 @@ }, { "id": "6ea906d4-5740-454d-a730-6fdb9fa0d624", - "name": "wifiStrength", + "name": "signalStrength", "displayName": "WiFi signal strength", "displayNameEvent": "WiFi signal strength changed", "unit": "Percentage", - "type": "int", + "type": "uint", + "minValue": 0, + "maxValue": 100, "defaultValue": 0 + }, + { + "id": "d84ba5d7-5202-4786-b983-958b594c341f", + "name": "connected", + "displayName": "Connected", + "displayNameEvent": "Connected changed", + "type": "bool", + "cached": false, + "defaultValue": false } ] }, @@ -172,7 +183,7 @@ "id": "6cc01d62-7317-4ec4-8ac4-a4cab762c179", "name": "outdoor", "displayName": "Outdoor Station", - "interfaces": ["temperaturesensor", "humiditysensor", "batterylevel"], + "interfaces": ["temperaturesensor", "humiditysensor", "batterylevel", "wirelessconnectable"], "createMethods": ["auto"], "paramTypes": [ { @@ -253,9 +264,20 @@ "displayName": "Signal strength", "displayNameEvent": "Signal strength changed", "unit": "Percentage", - "type": "int", + "type": "uint", + "minValue": 0, + "maxValue": 100, "defaultValue": 0 }, + { + "id": "21d7f2b7-e45b-4986-b3da-d6e8c0421bfc", + "name": "connected", + "displayName": "Connected", + "displayNameEvent": "Connected changed", + "type": "bool", + "cached": false, + "defaultValue": false + }, { "id": "15d8fae1-ba47-42e1-994d-530e8017c965", "name": "batteryLevel", diff --git a/netatmo/netatmobasestation.cpp b/netatmo/netatmobasestation.cpp index eedb5c85..6eeabad8 100644 --- a/netatmo/netatmobasestation.cpp +++ b/netatmo/netatmobasestation.cpp @@ -94,6 +94,11 @@ int NetatmoBaseStation::wifiStrength() const return m_wifiStrength; } +bool NetatmoBaseStation::reachable() const +{ + return m_reachable; +} + void NetatmoBaseStation::updateStates(const QVariantMap &data) { // check data timestamp @@ -124,5 +129,10 @@ void NetatmoBaseStation::updateStates(const QVariantMap &data) m_wifiStrength = qRound(100.0 * delta / 30.0); } } + + // update reachable state + if (data.contains("reachable")) { + m_reachable = data.value("reachable").toBool(); + } emit statesChanged(); } diff --git a/netatmo/netatmobasestation.h b/netatmo/netatmobasestation.h index 4acf213a..87fa3721 100644 --- a/netatmo/netatmobasestation.h +++ b/netatmo/netatmobasestation.h @@ -55,6 +55,7 @@ public: int noise() const; int co2() const; int wifiStrength() const; + bool reachable() const; void updateStates(const QVariantMap &data); @@ -73,6 +74,7 @@ private: int m_noise; int m_co2; int m_wifiStrength; + bool m_reachable; signals: void statesChanged(); diff --git a/netatmo/netatmooutdoormodule.cpp b/netatmo/netatmooutdoormodule.cpp index 05de27b5..39594c20 100644 --- a/netatmo/netatmooutdoormodule.cpp +++ b/netatmo/netatmooutdoormodule.cpp @@ -90,6 +90,11 @@ int NetatmoOutdoorModule::battery() const return m_battery; } +bool NetatmoOutdoorModule::reachable() const +{ + return m_reachable; +} + void NetatmoOutdoorModule::updateStates(const QVariantMap &data) { // check data timestamp @@ -130,6 +135,11 @@ void NetatmoOutdoorModule::updateStates(const QVariantMap &data) m_signalStrength = qRound(100.0 * delta / 30.0); } } + + // update reachable state + if (data.contains("reachable")) { + m_reachable = data.value("reachable").toBool(); + } emit statesChanged(); } diff --git a/netatmo/netatmooutdoormodule.h b/netatmo/netatmooutdoormodule.h index 776a3c2c..d803a9ea 100644 --- a/netatmo/netatmooutdoormodule.h +++ b/netatmo/netatmooutdoormodule.h @@ -52,6 +52,7 @@ public: double maxTemperature() const; int signalStrength() const; int battery() const; + bool reachable() const; void updateStates(const QVariantMap &data); @@ -69,6 +70,7 @@ private: double m_maxTemperature; int m_signalStrength; int m_battery; + bool m_reachable; signals: void statesChanged();