Mes passions, le boulots, mes coups de gueule...




Connaitre l’état d’un élément domotique WiFi piloté par Tuya / Smart Life

Catégories : Domotique, Geek, Informatique, Linux, Raspberry Pi · par 21 Juin 2020

Introduction

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

Scripts

Token

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

Lire le statut

À 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

(5) comments

Adrien
4 ans ago · Répondre

Je n’arrive pas à obtenir le retour de status, votre script fonctionne t’il toujour ?
Je tombe sur une erreur 404

    fanjoe
    4 ans ago · Répondre

    Bonjour,

    Oui, le script fonctionne toujours avec POST dans une commande curl.
    Si la requête est mal formulée, le serveur renvoie une erreur 404.

    Didier.

karlytau
2 ans ago · Répondre

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

fanjoe
2 ans ago · Répondre

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.

karlytau
2 ans ago · Répondre

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?

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.