Gérer Tuya via MQTT sans flasher

Ce tutoriel devenait nécesaire car je vous ai montré dans un autre tutoriel comment flasher des appareils avec le protocol Tuya.
Cependant cela ne fonctionne pas pour tous les cas.
En effet, suivant le composant électronique utilisé par le fabricant cette méthode ne peut être appliquée. (notemment quand le matériel ne se base pas sur un ESP82xx)
Je vais vous décrire ici une manière stable et fiable pour ne pas passer par un logiciel propriétaire mais que cela soit bien openHAB qui gère votre matériel.

 

Tuya via MQTT sans flasher !

L'exemple avec une lampe

Je vais m'appuyer sur la mise en oeuvre d'une lampe multicouleur du magasin "Action" qui vend cette ampoule connectée sous la marque LSC Smart Connect
La référence est la suivante : White and Color ambiance Smart LED (806 lumen 9 watt / vis de type E27)
Vous pouvez la trouver ici au prix de : 8€95
https://www.action.com/fr-fr/p/ampoule-led-multicolore-connectee-lsc-smart-connect-2/

Image sans titre3

Cette ampoule fonctionne sous WIFI avec le logiciel "LSC Smart Connect" que vous pouvez trouver sur Google Play ici :
https://play.google.com/store/apps/details?id=com.lscsmartconnection.smart
J'ai essayé vainement de la flasher avec Tasmota... impossible. L'équipe Tasmota confirme qu'elle ne pourra pas permttre un flashage de ces produits avec ces composants...


Pourquoi chercher à forcer l'utilisation de MQTT ?

Avant toute chose, pourquoi chercher à faire ces... bidouilles alors que finalement les constructeurs d'ampoules s'embêtent à développer des logiciels spécifiques qui font très bien leur travail ?
2 raisons majeures :
- Actuellement vu le nombre de protocoles et de logiciels différents : soit vous êtes cantonnés à utiliser la même marque et dépendre de ce protocol et des produits liés, soit vous avez plein de logiciels propriétaires (mais alors c'est pas pratique !)
ou alors vous cherchez à avoir un matériel adapté avec des coûts moindre mais surtout un suivi centralisé. Ca c'est le rôle d'openHAB. Mais openHAB a besoin de dialoguer avec des connecteurs de protocoles standards et pas de protocoles propriétaires...
MQTT est un protocole standard pratique avec du WIFI.
- Autre raison : quand vous utilisez ces logiciels propriétaires vous remarquerez qu'en traçant leur 'route' ils passent pas des serveurs amazon (AWS j'imagine) et derrière ils collectent des statistiques. Perso j'aime pas ça. Beurk.

 

Un binding Tuya existe !

Pour être le plus complet possible, il existe un "binding" qui sait gérer le matériel Tuya. Certes vous ne le trouverez pas dans les binding dispo dans openHAB.
Il a été développé par Wim Wissers. Mais malheureusement dû à des problèmes de stabilité, et ne trouvant pas la raison, il a décidé de ne pas poursuivre.
https://github.com/wvissers/openhab2-addons-tuya

Je vous engage à le tester.
Personnellement je l'ai testé et j'ai en effet eu quelques problèmes de stabilité au bout de quelques jours.
L'auteur du developpement du connecteur m'a confirmé qu'il abandonnait le projet donc il me fallait trouver une solution plus stable.


Le process Tuya MQTT via nodejs : notre sauveur !

Petite synthèse du principe :
Par un service permanent qui tourne sur le système, le module de type nodejs va analyser et générer des trames directement avec le composant.
La difficulté majeure est d'obetnir les identifiants uniques qui permettront de communiquer avec le produit.
Ensuite ce module va générer des ordrese et communiquer avec.
L'autre astuce est de pinger régulièrement le produit pour être "à l'écoute" de celui-ci.

Comme d'habitude, j'aime citer les personnes qui ont eu l'intelligence de permettre ceci :
Voici le programme initial : https://github.com/codetheweb/tuyapi
Qui a été ensuite retouché pour mieux coller au besoin de service Linux qui tournera de ce fait très bien pour openHAB :
https://github.com/codetheweb/tuyapi

Deux prérequis
- Il est nécessaire à cette installation d'avoir MQTT déjà installé et opérationnel dans openHAB.
- L'aurte chose à faire est de paramétrer aussi l'IP de votre lampe sur votre routeur afin qu'il ait une IP fixe.
En effet, le lien MQTT via réseau se fera sur une IP fixe. (si vous ne savez pas le MAC ID + IP de votre matériel, je vous indiquerai dans le tutoriel à quel moment vous pouvez les récupérer)



ETAPE 1 : L'installation

Aller dans le répertoire où se situe les définitions des items/things etc... et ce qui nous interesse aujourd'hui, les scripts.

cd /etc/openhab2/scripts

 

A présent il faut que vous ayez le programme Git d'installé.
Si ce n'est pas le cas, passez la commande :

sudo apt-get install git

 

Une fois Git installé nous allons récupérer la dernière version 3.3 de tuya-mqtt :

sudo git clone https://github.com/tsightler/tuya-mqtt.git

 

Ensuite, allons dans le répertoire pour installer nodejs via le package manager de nodejs NPM (Node Package Manager) :

cd tuya-mqtt
sudo npm install

 

 

ETAPE 2 : La configuration

Le fichier à configurer se nomme config.json, on se base sur le fichier modèle.

sudo cp config.json.sample config.json

Voici un exemple de contenu du fichier config.json que vous pouvez éditer en faisant :

sudo vi config.json

{
"host": "192.168.0.18",                                             adresse IP de votre MQTT installé dans openHAB
"port": 1883,                                                             port de votre MQTT installé dans openHAB
"topic": "tuya/",                                                         nom du topic que vous trouverez dans MQTT installé dans openHAB
"mqtt_user": "usermqtt",                                          user de connexion à votre MQTT installé dans openHAB
"mqtt_pass": "passwordmqtt",                                 password de connexion à votre MQTT installé dans openHAB
"qos": 2                                                                    c'est le QualityOfService pour le broker
}

 
Sauvegarder ce fichier de configuration.



ETAPE 3 : Paramétrer le nodejs dans votre système

Pourquoi a-t-on besoin de faire cela ?
Il serait peu pratique de devoir lancer manuellement ce process nodejs à chaque fois que vous redémarrez votre système d'exploitation... Ce serait mieux que cela soit un process permanent et donc... un service.
Si vous avez déjà ce process nodejs qui tourne, n'oubliez pas de le killer avant :

sudo ps aux | grep node
sudo kill -9 process_id_que_vous_avez_recuperez_avant

 
Création du service :

cd /etc/systemd/system
sudo vi tuyaapi-mqtt.service

 

Voici le contenu du fichier :

#!/bin/sh -
[Unit]
Description=tuyaapi-mqtt

[Service]
ExecStart=/usr/bin/node /etc/openhab2/scripts/tuya-mqtt/tuya-mqtt.js
Restart=always
User=openhab
Group=openhab
Environment=PATH=/usr/bin/
Environment=NODE_ENV=production
WorkingDirectory=/usr/bin/

[Install]
WantedBy=multi-user.target
Alias=tuyaapi-mqtt.service

 

Positionner les droits sur ce fichier :

sudo chown root:root /etc/systemd/system/tuyaapi-mqtt.service
sudo chmod 666 /etc/systemd/system/tuyaapi-mqtt.service

 
On active le service et le symlink va être créé :

sudo systemctl daemon-reload
sudo systemctl enable tuyaapi-mqtt.service

 

 On démarre le service à présent créé :

sudo systemctl start tuyaapi-mqtt.service



Quelques autres commandes utiles...


a. Evidemment si vous souhaitez arrêter le service, la commande est :

sudo systemctl stop tuyaapi-mqtt.service



 

b. Pour savoir le status :

sudo systemctl status tuyaapi-mqtt.service



 

c. Pour le redemarrer :

sudo systemctl restart tuyaapi-mqtt.service



 

d. Pour le démarrer en mode DEBUG :

DEBUG=* /usr/bin/node /etc/openhab2/scripts/tuya-mqtt/tuya-mqtt.js

 

 



ETAPE 4 : Identifier l'ID et la clé de la lampe

Le but est d'avoir ces infos pour permettre de communiquer via MQTT.
Avec ces infos on pourra ensuite configurer le composant "Thing" dans openHAB.

1. Pour trouver ces infos, il faut tout d'abord installer sur votre smartphone le logiciel standard du produit (dans le cas de ma lampe c'est LSC Smart Connection : https://play.google.com/store/apps/details?id=com.lscsmartconnection.smart&hl=fr)
Configurer la lampe de manière standard jusqu'à ce que vous puissiez commander la lampe via ce logiciel.
Donc vérifiez bien que via le logiciel standard vous pouvez commander votre lampe.

Nous allons à présent récupérer la première info qui nous est nécessaire :
Allez sur votre lampe (toujorus dans le logiciel, sélectionnez "menu" puis allez sur "Informations appareil"
Là nous avons notre première valeur importante : l'ID virtuel (Virtual ID)
Il nous reste la clé à obtenir.

2. Maintenant, installez le logiciel sur votre smartphone pour capter les Trames de votre réseau qui s'intitule "Package Capture" via Google Play : https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture&hl=fr

3. Au premier lancement du logiciel il demandera pour installer un certificat, il est nécessaire de l'accepter pour poursuivre

4. En haut il y a 2 symbols de type "Lecture". Cellui qui a un symbol avec une flèche permet de capturer les Trames d'une application précise.

5. Sélectionner ce symbol puis choisissez l'application précédement installée "LSC Smart Connect" de votre Smartphone de la liste de vos applis.

6. La capture des trames commence.
Cela signifie que toute action sera capturée et donc en récupérant ces infos on va récupérer l'info qui nous manque : le "localkey"
Toujours sur votre smartphone, retournez (en parallele) sur le logiciel LSC et faites une action d'allumage + éteindre.

Retournez sur le logiciel de capture de trames et appuyez sur le bouton de stop de capture et reperez en dessous les quelques logs de générées.
Dans l'une d'entre elles qui sont de type SSL vous verrez une mise en forme de type fichier json : vous allez repérer notre valeur "localkey" recherchée !

Notez la bien car cela va nous être utile pour la configuration dans openHAB : on a à présent tout pour prendre la main via openHAB.

Screenshot1
ETAPE 5 : la configuration dans openHAB

Je rappelle qu'il faut que vous ayez installé et configuré MQTT dans openHAB.
La configuration est à faire pour définir tout d'abord le "Thing" puis les "Items".

Exemple de Thing à placer à l'intérieur de votre Bridge mqtt broker :

    Thing mqtt:topic:TuyaLampe2 "TUYA LAMPE 2" @ "RDC"
    {
       Channels:
       Type switch : TuyaLampe2Switch "Tuya Lampe 2" [ stateTopic="tuya/ver3.3/virtualID/localKey/adresseIPFixeLampe/state", commandTopic="tuya/ver3.3/virtualID/localKey/adresseIPFixeLampe/command",on="1",off="0" ]
       Type switch : TuyaLampe2_GET_MQTT "Reading Bulb MQTT STATUS Channel" [ stateTopic="tuya/ver3.3/virtualID/localKey/adresseIPFixeLampe/command", one="{ \"dps\": 7, \"set\": false }", off="{ \"dps\": 7, \"set\": false }" ]
       Type colorHSB : TuyaLampe2Color "Tuya Lampe 2 Color" [ stateTopic="tuya/ver3.3/virtualID/localKey/adresseIPFixeLampe/state", commandTopic="tuya/ver3.3/virtualID/localKey/adresseIPFixeLampe/color" ]
    }
Ce qui est en gras est à remplacer (voir les chapitres ci-dessus) : virtualID, localKey, adresseIPFixeLampe
Attention à bien respecter la syntaxe !

Exemple d'items

Switch TuyaLampe_2 "Tuya Lampe 2" <light> { channel="mqtt:topic:TuyaLampe2:TuyaLampe2Switch" }
Color TuyaLampe_2_Color "Tuya Lampe 2 Color" { channel="mqtt:topic:TuyaLampe2:TuyaLampe2Color" }


 

 

ETAPE 6 : Une relance openHAB et c'est fini !

Cette étape est très importante !! Toute action/modification des définitions d'items ou de thing dans openHAB nécessite un A/R de openHAB !
De plus, toute nouvelle réinitialisation de votre lampe nécessitera de rechercher son nouveau localKey et donc de reparamétrer le Thing dans openHAB.

Pour relancer openHAB tapez cette commande :

sudo systemctl restart openhab2.service

 



Une fois openHAB redémarré, vous pouvez vérifier que cela fonctionne via PaperUI ou sur votre entrée smartphone d'openHAB.

Have fun !