diff --git a/README.md b/README.md index 20676ae..585aaf0 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,13 @@ Cliquer ensuite sur "Create" et renseiger les champs suivants : Cliquer sur "I agree to the terms and conditions" et sur Save. Dans la partie "App Technical Parameters", conserver les identifiants "client ID" et "client secret" pour le déploiement. +Il faut ensuite générer un token en allant dans la dernière partie "Token generator" : +- Dans "Choose scopes" sélectionner : + - read_bubendorff + - write_bubendorff +- Cliquer sur "Generate Token" +- Noter les champs "Access Token" et "Refresh Token" pour le déploiement + ## Déploiement @@ -36,10 +43,10 @@ Le service peut être démarré grâce à la commande suivante : ``` sh docker run -d --name idiamant \ - -e IDIAMANT_USER=test@test.com \ - -e IDIAMANT_PASSWORD=password \ -e IDIAMANT_CLIENT_ID=abcde \ -e IDIAMANT_CLIENT_SECRET=abcdefgh \ + -e IDIAMANT_ACCESS_TOKEN=accesstokennetatmo \ + -e IDIAMANT_REFRESH_TOKEN=refreshtokennetatmo \ leclubber/idiamant2mqtt ``` @@ -57,10 +64,10 @@ services: - MQTT_PORT=1883 - MQTT_HOST=mqtt - MQTT_TOPIC=homeassistant - - IDIAMANT_USER= - - IDIAMANT_PASSWORD= - IDIAMANT_CLIENT_ID= - IDIAMANT_CLIENT_SECRET= + - IDIAMANT_ACCESS_TOKEN= + - IDIAMANT_REFRESH_TOKEN= ``` Certaines variables d'environnement sont optionnelles, elles possèdent une valeur par défaut. Toutes les variables d'environnement sont les suivantes : @@ -70,10 +77,10 @@ Certaines variables d'environnement sont optionnelles, elles possèdent une vale - MQTT_TOPIC (homeassistant par défaut) - MQTT_USER (vide par défaut) - MQTT_PASSWORD (vide par défaut) -- IDIAMANT_USER (aucun par défaut) -- IDIAMANT_PASSWORD (aucun par défaut) - IDIAMANT_CLIENT_ID (aucun par défaut) - IDIAMANT_CLIENT_SECRET (aucun par défaut) +- IDIAMANT_ACCESS_TOKEN (aucun par défaut) +- IDIAMANT_REFRESH_TOKEN (aucun par défaut) Un fichier [docker-compose.yml](docker-compose.yml) est disponible pour exemple, avec toutes les variables d'environnement ainsi que les services homeassistant et mqtt. diff --git a/docker-compose.yml b/docker-compose.yml index af9904c..c4a0e15 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,8 +33,8 @@ services: - MQTT_PORT=1883 - MQTT_HOST=mqtt - MQTT_TOPIC=homeassistant - - IDIAMANT_USER=${USER} - - IDIAMANT_PASSWORD=${PASSWORD} - IDIAMANT_CLIENT_ID=${CLIENT_ID} - IDIAMANT_CLIENT_SECRET=${CLIENT_SECRET} + - IDIAMANT_ACCESS_TOKEN=${ACCESS_TOKEN} + - IDIAMANT_REFRESH_TOKEN=${REFRESH_TOKEN} diff --git a/idiamant/const.py b/idiamant/const.py index 651f589..99c1bcc 100644 --- a/idiamant/const.py +++ b/idiamant/const.py @@ -12,7 +12,8 @@ class Constantes(): mqttTopic = os.getenv('MQTT_TOPIC', "homeassistant") mqttUser = os.getenv('MQTT_USER') mqttPassword = os.getenv('MQTT_PASSWORD') - idiamantUser = os.getenv("IDIAMANT_USER") - idiamantPassword = os.getenv("IDIAMANT_PASSWORD") idiamantClientId = os.getenv("IDIAMANT_CLIENT_ID") idiamantClientSecret = os.getenv("IDIAMANT_CLIENT_SECRET") + idiamantAccessToken = os.getenv("IDIAMANT_ACCESS_TOKEN") + idiamantRefreshToken = os.getenv("IDIAMANT_REFRESH_TOKEN") + idiamantExpireToken = 60 diff --git a/idiamant/idiamant.py b/idiamant/idiamant.py index b5d58be..b8c74c1 100644 --- a/idiamant/idiamant.py +++ b/idiamant/idiamant.py @@ -10,34 +10,14 @@ from time import sleep class iDiamant(): - access_token = "" - refresh_token = "" - expire_token = 0 + access_token = Constantes.idiamantAccessToken + refresh_token = Constantes.idiamantRefreshToken + expire_token = 120 volets = {} @staticmethod - def getToken(): - """ Récupération du token sepuis Netatmo """ - url = "https://api.netatmo.com/oauth2/token" - data = {'grant_type': 'password', - 'username': Constantes.idiamantUser, - 'password': Constantes.idiamantPassword, - 'client_id': Constantes.idiamantClientId, - 'client_secret': Constantes.idiamantClientSecret, - 'scope': 'read_bubendorff write_bubendorff' - } - response = requests.post(url, data) - while 200 != response.status_code: - attente = 20 - print("Problème d'accès au token : attente de " + attente + " secondes") - sleep(attente) - response = requests.post(url, data) - - jsonStatus = json.loads(response.text) - iDiamant.access_token = jsonStatus['access_token'] - iDiamant.refresh_token = jsonStatus['refresh_token'] - iDiamant.expire_token = int(jsonStatus['expires_in']) - + def initDiscovery(): + """ Récupération de tous les volets depuis l'API Netatmo """ url = "https://api.netatmo.com/api/homesdata" headers = {"Authorization": "Bearer " + iDiamant.access_token} response = requests.get(url, headers=headers) @@ -55,7 +35,6 @@ class iDiamant(): 'id_home':home_id } - @staticmethod def updateToken(): """ Update d'un token en fin de vie """ @@ -72,6 +51,11 @@ class iDiamant(): sleep(attente) response = requests.post(url, data) + jsonStatus = json.loads(response.text) + iDiamant.access_token = jsonStatus['access_token'] + iDiamant.refresh_token = jsonStatus['refresh_token'] + iDiamant.expire_token = int(jsonStatus['expires_in']) + @staticmethod def publish(topic, playload, retain=True): """ Publication des messages MQTT """ @@ -83,8 +67,8 @@ class iDiamant(): client.disconnect() @staticmethod - def initDiscovery(): - """ Publication des config pour discovery """ + def initMqtt(): + """ Publication des config sur Mqtt """ for volet in iDiamant.volets: topic = Constantes.mqttTopic + "/cover/" + volet + "/config" payload = '{' diff --git a/idiamant/server.py b/idiamant/server.py index d1eca96..11844bd 100644 --- a/idiamant/server.py +++ b/idiamant/server.py @@ -7,8 +7,8 @@ from idiamant import iDiamant from mqtt2idiamant import Mqtt2iDiamant from time import sleep -iDiamant.getToken() iDiamant.initDiscovery() +iDiamant.initMqtt() # Envoie des ordres à iDiamant mqtt2idiamant = Mqtt2iDiamant()