Nous allons voir ci-dessous comment utiliser l’API de Tuya pour connaitre l’état d’un élément domotique WiFi piloté par Tuya / Smart Life.
Dans mon cas, il s’agit de la commande de mes volets électriques, une Zemismart Curtain Switch dont j’ai déjà parlé ici : https://www.fanjoe.be/?p=3339
On va placer les scripts dans le dossier : /home/pi/scripts/tuya/
Tout d’abord, il va falloir récupérer le token qui aura une validité de 10 jours.
Pour cela, on crée un fichier nommé renew_token.sh
et on le rend exécutable :
$ chmod +x renew_token.sh
On y place le code suivant :
#!/bin/bash
username="login@monmail.com"
password="AbC123DE"
# Récupérer les Token avec les codes de l'App Smart Life
token=$( curl -s -X POST -k -H 'Content-Type: application/x-www-form-urlencoded' -i 'https://px1.tuyaeu.com/homeassistant/auth.do' --data 'userName='$username'&password='$password'&countryCode=32&bizType=smart_life&from=tuya' | tail -n 1 | jq '.access_token' )
if [ $? -eq 0 ];
then
echo $token > /home/pi/scripts/tuya/token.txt
fi
Le token sera enregistré dans le fichier : token.txt
Les login et mot-de-passe sont ceux de l’application Tuya ou Smart Life que vous utilisez sur votre smartphone.
Il faudra ajouter une ligne dans le crontab
pour l’exécuter toutes les semaines et ainsi renouveler le token avant son expiration :
$ sudo crontab -e
Et on ajoute :
# Renouvelle le token des volets tous les lundis à 16h00 00 16 * * 1 sudo /home/pi/scripts/tuya/renew-token.sh 2>&1
À la demande, on va lire le statut de l’élément domotique à contrôler.
On crée un fichier statut_volets.sh
et on le rend exécutable :
$ chmod +x statut_volets.sh
On y place le code suivant :
#!/bin/bash
token=$(head -n 1 /home/pi/scripts/tuya/token.txt)
Statut=$(curl -s -X POST -k -H 'Content-Type: application/json' -i 'https://px1.tuyaeu.com/homeassistant/skill' --data '{"header": {"name": "Discovery","namespace": "discovery","payloadVersion": 1},"payload": {"accessToken": '$token'}}' | tail -n 1 | jq '.payload.devices[].data.state' 2> /dev/null | head -n 1 )
# State 1 : Ouverts
# State 2 : Fermés
# State 3 : Pause
case "$Statut" in
1)
echo "Ouverts"
;;
2)
echo "Fermés"
;;
3)
echo "Pause"
;;
*)
echo "Statut inconnu"
;;
esac
Le script va lire le token et interroger le serveur pour connaitre la position de mes volets.
Notes :
Je ne parviens pas à envoyer une commande via l’API avec une commande cURL pour ouvrir ou fermer mes volets.
Je suis donc, pour l’instant, obligé d’utiliser le webhook du service SEQUEmatic décrit dans cet article pour les piloter via cURL.
Si vous avez une solution ou des pistes, je suis preneur… 🙂
Mise-à-jour :
Malheureusement, depuis quelques temps, le service Tuya à imposé un délais de 10 minutes entre chaque demande, sous peine de se voir retourner un message d’erreur.
Une alternative est décrite dans cet article : https://www.fanjoe.be/?p=4228
4 ans ago ·
Je n’arrive pas à obtenir le retour de status, votre script fonctionne t’il toujour ?
Je tombe sur une erreur 404
4 ans ago ·
Bonjour,
Oui, le script fonctionne toujours avec
POST
dans une commandecurl
.Si la requête est mal formulée, le serveur renvoie une erreur 404.
Didier.
2 ans ago ·
Bonjour,
bien sur j’y connais rien mais je m’interesse.
Ou se fait le retour du Curl pour la reponse de status du volet roulant dans la console ?
n’y at il pas un moyen de l’ecrire dans une table, un fichier …. quel seraot la meilleur solution.
As tu penser un jour modifier le script du ESP8266 cdt
2 ans ago ·
Bonjour,
La sortie de la commande cURL est « pipée » (envoyée) vers tail puis vers jq pour être enfin stockée dans la variable $Statut.
Il est possible de stocker la résultat dans un fichier :
exemple : echo « Ouverts » > nomdufichier.txt
Je me suis déjà documenté sur les modules ESP mais n’ai pas encore sauté le pas.
Didier.
2 ans ago ·
Bonjour Didier, pourrais tu m’expliquer ou m’orienter un peu plus sur ce que tu m’as mis plus haut « tail, « jq », comment récupérer dans un fichier?