[TUTO] Ring avec Ring-mqtt et jmqtt

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 ( :thinking: bah oui sinon … :sweat_smile:)
  • Le (tip-top :+1:) plugin-jmqtt (j’adore votre boulot les dev :heart_eyes:)
  • Le bridge ring-mqtt qui utilisera l’API de Ring et nécessitera un Token (j’y reviendrai)

Schématiquement cela donnera ceci:

  1. 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:
image

Lui donner un nom et l’activer:

Et le paramétrer dans l’onglet Broker:

image

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

image.

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 :+1:

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 :rofl:, 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

image

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 :laughing:

6 « J'aime »

Salut

J’ai peut-être loupé mais les templates jMQTT serait un plus, non?

Antoine

2 « J'aime »

Je n’en suis pas encore la dans le tuto mais çà pourrait en effet être un plus

2 « J'aime »

Deuxième partie du TUTO.

Notre config est normalement opérationnelle côté mqtt entre jmqtt et ring-mqtt donc ajoutons nos devices à Jeedom.

Dans le plugin, vous devriez avoir pour l’instant un broker avec un point vert donc il communique avec mosquitto.

image

Nous avons 2 possibilités pour nos devices:

  • la « rapide »: mais on aura un seul équipement qui comportera tout les topics de tout les devices ring, c’est ce que j’avais fait au début, je découvrais et mqtt et le plugin jmqtt qui n’avait pas encore toutes les fonctionnalités d’aujourd’hui. Vous noterez les guillemets autour de « rapide », car une fois dans ce super équipement vous aurez des dizaines de topics, et il sera un peu difficile de s’y retrouver entre tous les devices.
    Nous avons mis dans notre broker jmqtt l’option « topics souscrits en inclusion automatique »: ring/#
    Si je regarde dans mqttexplorer voilà notre fameux topic remonté par ring-mqtt (en jaune):

Donc si je lance l’inclusion auto alors j’aurai un équipement ring avec tout les topics. Ça fonctionne mais pas très gérable.

  • La plus propre: On va créer nos équipements un par un avec chacun leurs infos.
    Prenons dans MQTTExplorer l’exemple d’un capteur de mouvement de l’alarme:

image

Le topic pour souscrire à ce device sera:

ring/9dbxxxxxxxxxxx7e7e9/alarm/7658xxxxxxxxxxxxxx3bc11/#

Vous cliquez sur le topic du device dans la partie gauche de mqttexplorer et à droite dans Publish vous aurez votre topic prêt pour un copier/coller.

Vous ajouter alors un équipement dans jmqtt, vous lui donnez un nom puis on rempli les paramètres du device dont le topic que nous venons de récupérer:

Le broker de jmqtt est à sélectionner (si jamais vous en aviez plusieurs), cocher ajout automatique des commande ! puis insérer votre topic sans oublier de mettre /# à la fin.

Vous sauvegardez puis vous lancez l’inclusion.

Normalement vous devriez avoir des notifications de jmqtt comme quoi il a trouvé et créé des commandes info. Forcer la modification d"une info sur le device, par exemple en dansant devant le capteur devrait accélérer la récup des commandes.

TADA

NB: après la récup des infos vous pouvez décocher la case ajout automatique des commandes de votre équipement.

Regardez dans l’onglet commandes de l’équipement:

Bon on avance. Les infos sont regroupées par topic donc si on regarde par exemple le premier pour la battery on a:
{"batteryLevel":70,"batteryStatus":"ok"}
Pas exploitable en l’état.

Avec le bouton JSON en haut à droite on obtient les différentes infos bien séparées:

Vous voyez ici 2 commandes infos sans nom, qui correspondent aux 2 infos du topic battery/attibutes de notre capteur de mouvement. (batteryLevel et batteryStatus)

Pour garder ces 2 infos dans notre équipement, vous mettez un nom dans la case …nom et vous sauvegardez. On revient ensuite en vue classique:

Voilà. Ensuite la commande info battery:Attributes (2966 dans mes captures) peut être supprimée on en a plus besoin. (NB: si vous avez laissé cochée la case « ajout auto des commandes » elle reviendra).

Bon ben ensuite reste à passer aux différents devices.

Je n’ai pas abordé ici l’utilisation des templates qui permettrai de ne pas avoir à refaire la config pour chaque device identique. Je vais essayer de les créer et de les partager. Je n’ai pas encore testé. :sweat_smile:

Dès que je trouve un peu de temps je vous parlerai de la création des commandes action de l’alarme.

Et pour les templates, voici ceux de mes devices.

RING_Alarm.json.txt (10,0 Ko)
RING_Indoor_Cam.json.txt (8,8 Ko)
RING_Doorbell_Pro.json.txt (9,3 Ko)
RING_Doorbell_Chime.json.txt (4,9 Ko)
RING_Alarm_NumPad.json.txt (10,7 Ko)
RING_Alarm_Extender.json.txt (7,5 Ko)
RING_Alarm_Contact_Porte.json.txt (7,7 Ko)
RING_Alarm_Capteur_IR.json.txt (8,4 Ko)
RING_Alarm_BaseStation.json.txt (8,8 Ko)

en enlevant l’extension txt. :wink:

J’ai partagé ces derniers sur le git des dev. J’espère que cela servira :slightly_smiling_face:

Concernant les différents topics existants et gérés par ring-mqtt vous pouvez regarder la doc dédiée:

https://github.com/tsightler/ring-mqtt/blob/main/docs/TOPICS.md

Cela m’a permis de trouver les commandes action a créer pour l’activation des modes de l’alarme, et la gestion du volume de la base (et du clavier).

Si je me réfère à la doc je trouve ceci:

Le topic /alarm/state me donne l’info du mode en cours de l’alarme qui peut être soit désarmée, armée à la maison et armée à l’extérieur. (disarmed, armed_home, armed_away). Le mode à l’extérieur active tous les capteurs, le mode à la maison permet de n’activer que certains capteurs (pour protéger contre une intrusion alors que nous dormons par ex => alarme plutôt en mode périmétrique)

Et le topic /alarm/command c’est pour les action => qui auront comme value disarm, arm_home et arm_away

Voilà ce que cela donne après création des 3 commandes associées à la commande info alarm/state.

NB: La commande pour le volume ne sera disponible que si le compte RING utilisé par ring-mqtt possède tout les droits. (ne concerne pas la sirène! pas de commande volume pour elle)

J’utilise un scénario qui active l’alarme en mode « armé à la maison » le soir via un scénario, et je coupe l’alarme un peu avant que nous nous levions (les jours de travail).

« L’inconvénient » de l’alarme c’est que l’activation/désactivation est par défaut accompagnée d’une voix qui annonce l’action en cours. Pratique en journée mais le soir et au réveil :sob:

J’utilise donc une commande action qui permet de modifier le volume sonore à 0 de cette voix juste avant l’action d’activation/désactivation de mon scénario et je remet le bon volume juste après. Comme çà on est pas réveillé par la petite voix avant le réveil :sweat_smile:.

Ça passera par ce topic sur la station de l’alarme (et éventuellement aussi sur le KeyPad, le clavier numérique qui cause aussi)

Si vous avez des questions, des corrections n’hésitez pas!!

1 « J'aime »

RING_Alarm_BaseStation.json.txt (8,2 Ko)

Suppression de la commande de modification du volume, lié à un virtuel (curseur) chez moi.

Bonjour @Nicoca-ine,

Très intéressant comme sujet et tuto… je vais le mettre en place (j’ai une ring pro doorbell), je ferai un retour !

As-tu réussi à avoir le flux en direct de la doorbell ?

@chris_77 merci!

Pour le stream non j’avoue n’avoir pas encore eu le temps d’installer le serveur rtsp mais cela fonctionne, d’autres l’on testé. Par ex @hgmorse, d’après son message sur ce post lors d’une de nos conversations sur ring et ring-mqtt:

Il devrait pouvoir t’en dire plus.

Hello @Nicoca-ine,

Les templates que tu proposes sont en voie d’intégration dans jMQTT :

Elles ont été légèrement modifiées pour correspondre à la norme que nous avons choisi (nom du fichier, du template, de l’équipement et un lien Commu vers ce post).

Si tu souhaites faire une modification avant intégration (ou qu’ils ne soient pas intégrés) n’hésite pas à me le dire ici ou sur Github.

Merci encore pour ton implication,
Bad

3 « J'aime »

Merci à vous surtout !

1 « J'aime »

Pas de modif à faire en particulier. :+1:

Bonjour @Nicoca-ine

Alors comme prévu je te fais un petit retour…
Ton tuto est super, instructif et fonctionnel, juste une déviance par rapport à toi j’utilise docker.
J’ai donc suivi les instructions du site de l’auteur (ça marche sans soucis) avec ton tuto en toile de fond :slight_smile:
NOTE:

  • Pour la génération du token prendre la première méthode.
  • Pour le stream, pas besoin de serveur rtsp en plus, il semblerait que l’auteur est mis à jour sa version en l’incluant !
    → Dans l’équipement jmqtt, on récupère le lien de stream :
    rtsp://livestreamuser:livestream_password:ip-du-container:port-container/id-camera_live
    livestreamuser et livestream_password étant défini dans les variables d’environnement du docker compose

Pour le moment, je n’ai pas encore testé les commandes ou intégrer la vidéo à jeedom n’étant pas chez moi actuellement… je ferais un retour plus tard.

2 « J'aime »

@chris_77

Merci pour ton message!

Docker me tente de plus en plus, il va falloir que je me monte un petit nuc ou pi en parallèle de mon jeedom​:thinking::wink:. entre jmqtt, le prochain plugin zwave…

Pour le docker oui le rtsp est déjà intégré. Pas dans la version standard où il faut l’installer manuellement en parallèle.

Bonjour,

Merci beaucoup pour le tuto. J’ai bien réussi à tout installer et configurer à une exception. Il me manque 2 choses, l’affichage des snapshot des camera et l’affichage du stream des camera en rtsp.

Je ne sais pas si j’utilise la bonne méthode pour y arriver. Je suis allé dans le plugin camera et j’ai indiqué les informations de la capture ci-dessous, mais aucun snapshot n’apparait (l’ip indiquée est celle de mon jeedom)

L’un de vous a-t-il réussi ?

Bonjour,

On va essayer de t’aider… :grin: pour le moment je n’ai toujours pas intégrer le video dans jeedom… faute de temps et d’autre soucis !

Arrives-tu à récupérer le flux de la doorbel ou de tes caméras via vlc ?

Note : je viens de tester, c’est good j’ai bien le flux et les snapshot

Malheureusement non, lorsque je tente de me connecter au flux d’une camera avec VLC (rtsp://xxx:yyy@192.168.1.175:8554/xxxxx_live) j’obtiens une erreur et le flux ne démarre pas. Il y a peut etre des subtilités que je n’ai pas compris concernant rtsp-simple-server…
Sans titre

Et dans /var/log/daemon j’ai ça au moment de la tentative de connexion depuis VLC:

Apr 25 21:19:21 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:21 INF [RTSP] [conn 192.168.1.84:62002] opened
Apr 25 21:19:21 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:21 INF [path xxxxx_live] runOnDemand command started
Apr 25 21:19:21 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:21 INF [path xxxxx_live] runOnDemand command exited with code 0
Apr 25 21:19:26 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:26 INF [RTSP] [conn 192.168.1.84:62008] opened
Apr 25 21:19:26 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:26 INF [RTSP] [session 637488687] created by 192.168.1.84:62008
Apr 25 21:19:26 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:26 INF [RTSP] [conn 192.168.1.84:62008] closed (path of a SETUP request must end with a slash. This typically happens when VLC fails a request, and then switches to an unsupported RTSP dialect)
Apr 25 21:19:26 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:26 INF [RTSP] [conn 192.168.1.84:62009] opened
Apr 25 21:19:26 raspberrypi rtsp-simple-server[26242]: 2022/04/25 21:19:26 INF [RTSP] [conn 192.168.1.84:62009] closed (EOF)

D’après ce que je comprends tu as installé directement sur ton jeedom le service ring-mqtt et le serveur rtsp, c’est bien ça ?

C’est bien ça tout est installé sur mon raspberry sur lequel j’ai installé Jeedom

Je ne t’ai pas oublié, j’ai regardé sur le github de l’auteur il semblerait que c’est une erreur qui apparaît après j’ai pas trop poussé…

Je suis en docker pour le ring-mqtt donc le serveur rtsp est intégré.

Dès que j’ai un peu de temps dans la journée, je tente une installe « basic » du serveur rtsp.
On va peut-être trouver de cette façon.