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.
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=<votre email>
- IDIAMANT_PASSWORD=<votre mot de passe>
- IDIAMANT_CLIENT_ID=<client ID 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 :
@@ -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.

View File

@@ -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}

View File

@@ -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

View File

@@ -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 = '{'

View File

@@ -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()