Authentification par token suite modification API Netatmo

This commit is contained in:
LeClubber
2023-09-09 20:54:10 +02:00
parent 7aa8f97913
commit 09616dd208
5 changed files with 31 additions and 39 deletions

View File

@@ -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. 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. 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 ## Déploiement
@@ -36,10 +43,10 @@ Le service peut être démarré grâce à la commande suivante :
``` sh ``` sh
docker run -d --name idiamant \ docker run -d --name idiamant \
-e IDIAMANT_USER=test@test.com \
-e IDIAMANT_PASSWORD=password \
-e IDIAMANT_CLIENT_ID=abcde \ -e IDIAMANT_CLIENT_ID=abcde \
-e IDIAMANT_CLIENT_SECRET=abcdefgh \ -e IDIAMANT_CLIENT_SECRET=abcdefgh \
-e IDIAMANT_ACCESS_TOKEN=accesstokennetatmo \
-e IDIAMANT_REFRESH_TOKEN=refreshtokennetatmo \
leclubber/idiamant2mqtt leclubber/idiamant2mqtt
``` ```
@@ -57,10 +64,10 @@ services:
- MQTT_PORT=1883 - MQTT_PORT=1883
- MQTT_HOST=mqtt - MQTT_HOST=mqtt
- MQTT_TOPIC=homeassistant - MQTT_TOPIC=homeassistant
- IDIAMANT_USER=<votre email>
- IDIAMANT_PASSWORD=<votre mot de passe>
- IDIAMANT_CLIENT_ID=<client ID généré> - IDIAMANT_CLIENT_ID=<client ID généré>
- IDIAMANT_CLIENT_SECRET=<client secret généré> - IDIAMANT_CLIENT_SECRET=<client secret généré>
- IDIAMANT_ACCESS_TOKEN=<access token généré>
- IDIAMANT_REFRESH_TOKEN=<refresh token généré>
``` ```
Certaines variables d'environnement sont optionnelles, elles possèdent une valeur par défaut. Toutes les variables d'environnement sont les suivantes : 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_TOPIC (homeassistant par défaut)
- MQTT_USER (vide par défaut) - MQTT_USER (vide par défaut)
- MQTT_PASSWORD (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_ID (aucun par défaut)
- IDIAMANT_CLIENT_SECRET (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. 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.

View File

@@ -33,8 +33,8 @@ services:
- MQTT_PORT=1883 - MQTT_PORT=1883
- MQTT_HOST=mqtt - MQTT_HOST=mqtt
- MQTT_TOPIC=homeassistant - MQTT_TOPIC=homeassistant
- IDIAMANT_USER=${USER}
- IDIAMANT_PASSWORD=${PASSWORD}
- IDIAMANT_CLIENT_ID=${CLIENT_ID} - IDIAMANT_CLIENT_ID=${CLIENT_ID}
- IDIAMANT_CLIENT_SECRET=${CLIENT_SECRET} - IDIAMANT_CLIENT_SECRET=${CLIENT_SECRET}
- IDIAMANT_ACCESS_TOKEN=${ACCESS_TOKEN}
- IDIAMANT_REFRESH_TOKEN=${REFRESH_TOKEN}

View File

@@ -12,7 +12,8 @@ class Constantes():
mqttTopic = os.getenv('MQTT_TOPIC', "homeassistant") mqttTopic = os.getenv('MQTT_TOPIC', "homeassistant")
mqttUser = os.getenv('MQTT_USER') mqttUser = os.getenv('MQTT_USER')
mqttPassword = os.getenv('MQTT_PASSWORD') mqttPassword = os.getenv('MQTT_PASSWORD')
idiamantUser = os.getenv("IDIAMANT_USER")
idiamantPassword = os.getenv("IDIAMANT_PASSWORD")
idiamantClientId = os.getenv("IDIAMANT_CLIENT_ID") idiamantClientId = os.getenv("IDIAMANT_CLIENT_ID")
idiamantClientSecret = os.getenv("IDIAMANT_CLIENT_SECRET") idiamantClientSecret = os.getenv("IDIAMANT_CLIENT_SECRET")
idiamantAccessToken = os.getenv("IDIAMANT_ACCESS_TOKEN")
idiamantRefreshToken = os.getenv("IDIAMANT_REFRESH_TOKEN")
idiamantExpireToken = 60

View File

@@ -10,34 +10,14 @@ from time import sleep
class iDiamant(): class iDiamant():
access_token = "" access_token = Constantes.idiamantAccessToken
refresh_token = "" refresh_token = Constantes.idiamantRefreshToken
expire_token = 0 expire_token = 120
volets = {} volets = {}
@staticmethod @staticmethod
def getToken(): def initDiscovery():
""" Récupération du token sepuis Netatmo """ """ Récupération de tous les volets depuis l'API 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'])
url = "https://api.netatmo.com/api/homesdata" url = "https://api.netatmo.com/api/homesdata"
headers = {"Authorization": "Bearer " + iDiamant.access_token} headers = {"Authorization": "Bearer " + iDiamant.access_token}
response = requests.get(url, headers=headers) response = requests.get(url, headers=headers)
@@ -55,7 +35,6 @@ class iDiamant():
'id_home':home_id 'id_home':home_id
} }
@staticmethod @staticmethod
def updateToken(): def updateToken():
""" Update d'un token en fin de vie """ """ Update d'un token en fin de vie """
@@ -72,6 +51,11 @@ class iDiamant():
sleep(attente) sleep(attente)
response = requests.post(url, data) 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 @staticmethod
def publish(topic, playload, retain=True): def publish(topic, playload, retain=True):
""" Publication des messages MQTT """ """ Publication des messages MQTT """
@@ -83,8 +67,8 @@ class iDiamant():
client.disconnect() client.disconnect()
@staticmethod @staticmethod
def initDiscovery(): def initMqtt():
""" Publication des config pour discovery """ """ Publication des config sur Mqtt """
for volet in iDiamant.volets: for volet in iDiamant.volets:
topic = Constantes.mqttTopic + "/cover/" + volet + "/config" topic = Constantes.mqttTopic + "/cover/" + volet + "/config"
payload = '{' payload = '{'

View File

@@ -7,8 +7,8 @@ from idiamant import iDiamant
from mqtt2idiamant import Mqtt2iDiamant from mqtt2idiamant import Mqtt2iDiamant
from time import sleep from time import sleep
iDiamant.getToken()
iDiamant.initDiscovery() iDiamant.initDiscovery()
iDiamant.initMqtt()
# Envoie des ordres à iDiamant # Envoie des ordres à iDiamant
mqtt2idiamant = Mqtt2iDiamant() mqtt2idiamant = Mqtt2iDiamant()