Authentification par token suite modification API Netatmo
This commit is contained in:
19
README.md
19
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.
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = '{'
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user