Bonjour,
Je vais ici vous faire mon retour d’expérience sur l’intégration dans jeedom des appareils connectés RING.
En particulier la Ring-Doorbell (pro dans mon cas) et surtout l’Alarme et ses différents devices (base, détecteurs etc).
L’idée est de faire cette intégration par le protocole mqtt (mosquitto) par l’intermédiaire du plugin-jmqtt et l’api RING grâce au pont (bridge) développé par tsightler.
Pré-requis: Connaitre déjà un peu le protocole mqtt, je ne serais pas le mieux placé pour expliquer le mqtt en détail il y a pleins de plus grosses pointures que moi et de bons tutos que je vous invite à lire tranquillement.
Nous avons donc besoin:
- Devices Ring
- Un compte utilisateur Ring
- Un serveur MQTT (ici mosquitto)
- Jeddom ( bah oui sinon … )
- Le (tip-top ) plugin-jmqtt (j’adore votre boulot les dev )
- Le bridge ring-mqtt qui utilisera l’API de Ring et nécessitera un Token (j’y reviendrai)
Schématiquement cela donnera ceci:
- MQTT serveur et JMQTT
Dans un premier temps, si vous n’avez pas le plugin jmqtt dans jeedom, installez-le et si vous n’avez pas non plus de serveur mosquitto, cochez bien la case ‹ installer Mosquitto localement › dans la page configuration de jmqtt. (NB: mais il peut être installé manuellement localement ou ailleurs c’est au choix).
Par défaut mosquitto n’est pas sécurisé, donc j’ai ajouté un utilisateur et son mdp avec cette commande:
sudo mosquitto_passwd -c /etc/mosquitto/credentials 'user-mqtt'
et modifié la conf de mosquitto en ajoutant/modifiant ces 2 lignes dans /etc/mosquitto/mosquitto.conf
:
allow_anonymous false
password_file /etc/mosquitto/credentials
Et redémarré le service
sudo systemctl restart mosquitto
Pour plus de détail c’est ici par exemple:
Je vous recommande l’outil MQTTexplorer car il permet de voir les échanges mqtt entre les brokers et permet de découvrir les topics des différents devices. Nous en aurons besoin un peu plus tard mais permettra déjà ici de vérifier que jeedom communique bien avec mosquitto.
Revenons dans Jedom et le plug-in jmqtt. Il faut ajouter un broker:
Lui donner un nom et l’activer:
Et le paramétrer dans l’onglet Broker:
Renseignez:
-
l’IP de mosquitto (localhost ou ip interne de jeedom si vous l’avez installé sur la même machine)
-
le port d’écoute de mosquitto par défaut est 1883 si vous ne l’avez pas changé
-
l’identifiant de votre equipement jmqtt broker sur mosquitto, moi j’ai mis jeedom
-
le nom et mdp si vous avez suivi ma recommandation un peu plus haut (donc user-mqtt dans mon ex) mais à laisser vide sinon pour une communication en anonymous.
-
ET le Topic de souscription automatique. Par défaut c’est #. Ici j’ai mis ring/# ce qui veut dire que si j’active l’inclusion et qu’un device publie sous ce topic ring/…/…/etc sur notre serveur mosquitto alors notre broker jmqtt y souscrira et donc l’équipement apparaitra avec tout ces sous-topics. Mais cela n’est pas obligatoire et vu le nombre de topics qui remonteront avec pleins de devices comme avec l’alarme et que tout sera rassemblé dans un seul équipement dans jmqtt celà va vite être fastidieux, je vous conseille de faire l’inclusion device par device comme je l’expliquerai plus bas.
MQTTexplorer
Depuis un PC j’ouvre je lance mqttexplorer et je rentre les paramètres de mon mosquitto
On sauvegarde puis on devrait déjà voir apparaitre des communications entre mosquitto et jeedom (l’équipement broker de jmqtt) au bout de qq secondes
.
L’équipement broker de jmqtt publie bien sur le topic avec l’identifiant que nous avons mis plus haut et qui était ‹ jeedom ›.
On voit donc le payload status{value=online} çà papotte donc bien.
2. Bridge Ring-mqtt
Il y a deux façons de faire pour le bridge, sous docker et par la version ‹ classique › dite standard. Perso je n’ai pas encore tenté l’aventure des dockers, encore très abstrait pour moi et n’ayant qu’une machine (Pi 4) de prod je n’ai pas risqué de tout planter ou surcharger la bécane.
Donc je suis passé par la version classique. Mosquitto tourne sur la machine Jeedom et le bridge aussi. Mais il est tout a fait possible d’utiliser les brokers / des vm pour séparer les fonctions.
Pour la partie bridge faisant le lien entre les devices Ring et Mosquitto, je ne vais pas tout réécrire car c’est détaillé dans la doc de tslighter sur son git. Je le rappelle j’ai utilisé la méthode standard et pas la version moderne sous docker.
Les pré-requis sont :
- NodeJS version au moins en 14.17.0 (latest LTS is recommended)
- rtsp-simple-server v0.17.4 ou supérieur si vous avez des caméras Ring.
- Mosquitto mais cà on l’a déja fait
Un article (un peu ancien) permet de visualiser plus clairement les étapes donc à lire pour la compréhension mais bien utiliser les commandes à jour sur le git du développeur notamment pour les avoir bonnes versions de NodeJS et des packages ring-mqtt.
L’article est destiné à Home-Assistant mais est applicable dans notre cas pour jeedom. Et plus détaillé que sur le git du développeur.
Les étapes pour installer ring-mqtt:
- cloner le git (installer git avant si vous ne l’avez pas), moi je l’ai fait depuis mon dossier /home/jeedom
- modifier les droits du fichier ring-mqtt.js qui se trouvera dans le dossier ring-mqtt fraichement créé
- lancer l’install
sudo apt-get install -y git
cd /home/jeedom
git clone https://github.com/tsightler/ring-mqtt.git
cd ring-mqtt
chmod +x ring-mqtt.js
npm install
Le token
Pour communiquer avec l’API de Ring il va bien falloir s’authentifier car évidement il y a un peu de sécurité chez Ring. Vous avez leurs équipements donc vous avez au moins un compte utilisateur admin, le votre en principe (tous les droits sur les devices) et éventuellement des comptes utilisateurs pour les autres occupants du foyer.
Depuis 2 ans l’authentification chez Ring a été améliorée à la mode 2FA (ce qui n’est pas un mal) mais complique l’accessibilité pour notre ring-mqtt. Avant un couple user + mdp et cela fonctionnait. Maintenant avec la couche 2FA (double authentification par sms ou mail) cela complique la donne. Cette 2FA génère un token qui permet un accès temporaire à vos devices. Ring-mqtt va permettre de le récupérer et d’effectuer le renouvellement du token avant qu’il ne soit invalidé.
Pour ce faire on lance la commande suivante et comme la config de notre ring-mqtt est vierge de tout token il va lancer un mini serveur web qui permet la génération d’un token.
On se place bien dans le dossier ring-mqtt. (chez moi /home/jeedom/ring-mqtt/)
cd /home/jeedom/ring-mqtt
DEBUG=ring-mqtt ./ring-mqtt.js
comme le montre l’image ci-dessus il faut vous rendre depuis un navigateur web (depuis votre PC par ex) sur http://<ip de la machine où est ring-mqtt>:55123
Après avoir rempli le petit formulaire user / mdp correspondant au compte utilisateur RING que vous souhaitez utiliser (le votre ou selon la reco de tslighter un autre utilisateur dédié), vous devez rentrer le code 2FA que vous devez avoir reçu soit par sms soit par mail. Et cela vous génère une longue (très longue) série de caractères: c’est votre token. Copiez le dans un bloc note par exemple.
NB: l’enchainement entre la génération du token et la finalisation de la config ne doit pas dépasser la durée de validité du token sinon çà échouera et il faudra en régénérer un autre. Je vous en reparle après la finalisation de cette config. Lisez d’abord ce qui suis.
Le serveur web n’étant plus nécessaire on reprend la main sur la fenêtre terminale avec CTRL+C.
Ensuite il faut modifier le fichier config.json (avec nano, vim etc)
nano config.json
et on renseigne les infos (mosquitto et token) minimales suivantes:
{
"host": "ip de mosquitto",
"port": 1883,#par défaut
"ring_topic": "ring",#par défaut
"hass_topic": "hass/status",#par défaut
"mqtt_user": "user-mqtt",
"mqtt_pass": "********",
"ring_token": "454354354359435ltjrlkgrenjglkjdfdgjglrkjg;lkfdjgdlkfjdlk;jg;lkdjg;lkfjlkfdhjfdlkgjdslkgjdflkgjfd;lkgjfdslkgjfdgfrdklgjdflkgjfdlkgjfdlkgjkjgdflkgjsdlkgjfdslkgjfdslkgjdflkgdjfg;lkfdjg;lkfdjg;lkfdjfd;lkjfdlkgjflkgjdfslkg9t8509w49tlkeds94tslkfsk",
"enable_cameras": false,#par défaut
"location_ids": [""]#par défaut
}
et sauvegarder.
Pour toutes les options disponibles vous pouvez regarder ici, notamment si vous vous voulez utiliser les caméras grâce au serveur rtsp.
Pour tester si tout est ok il suffit de relancer la commande
DEBUG=ring-mqtt ./ring-mqtt.js
Si tout est bon alors vous devriez cette fois avoir un retour positif concernant le token et les devices devraient apparaitre (çà déroule en continu tant que vous ne faites pas CTRL+C)
(image pas de chez moi, juste pour illustrer)
Retour sur le NB précédent:
Comme la modification du config.json va prendre 2-3 minutes voir plus comme moi si vous vous battez avec vim pour insérer le token , ce dernier sera peut-être déjà invalidé.
Donc je vous conseille de commencer le remplissage du config.json depuis une première fenêtre terminale ou ssh et de lancer la commande DEBUG sur une deuxième fenêtre et pouvoir dès réception du token, le coller dans la première fenêtre, puis sauvegarder le config.json.
Vous libérez le mode DEBUG (CTRL+C) de la fenêtre 2 puis le relancez aussitôt et normalement cela devrait être bon. La communication devrait dérouler les devices trouvés.
Alors pour l’instant laissez le DEBUG tourner en boucle sur la 2ème fenêtre et passez sur la première pour terminer par ce qui suit.
Installation du service ring-mqtt
Pour que la communication entre Ring et ring-mqtt continue toute seule et même au redémarrage de votre machine, on installe un service.
Toujours dans le dossier ring-mqtt on édite le fichier ring-mqtt.service et il devrait ressembler à ceci
#!/bin/sh -
[Unit]
Description=ring-mqtt
# je préconise de le démarrer si le réseau est OK
After=network.target
[Service]
#a adapter selon le path vers le fichier ring-mqtt/ring-mqtt.js
ExecStart=/home/jeedom/ring-mqtt/ring-mqtt.js
Restart=always
#User=root
#Group=root
Environment=PATH=/usr/bin/
Environment=NODE_ENV=production
Environment=DEBUG=ring-mqtt
#quelques logs c'est toujours utile
StandardOutput=file:/var/log/ring-mqtt.log
StandardError=file:/var/log/ring-mqtt.log
WorkingDirectory=/usr/bin
[Install]
WantedBy=multi-user.target
Alias=ring-mqtt.service
Puis on ajoute notre daemon
copie du service dans /lib/systemd/system/
sudo cp ring-mqtt.service /lib/systemd/system/ring-mqtt.service
on recharge la liste des daemon
sudo systemctl daemon-reload
on active et on lance le service ring-mqtt
sudo systemctl enable ring-mqtt
sudo systemctl start ring-mqtt
Si tout va bien la commande suivante devrait être au vert:
sudo systemctl status ring-mqtt
Voilà pour la première partie de mon TUTO installation, dans la deuxième je passerai au coeur du sujet, jmqtt et l’intégration de nos devices dans jeedom, car après tout c’est le but