[TUTO] Ring avec Ring-mqtt et jmqtt

Merci, j’ai continué à chercher et en faisant apparaitre l’ensemble des log ring-mqtt en mode DEBUG j’ai ça lorsque j’essaye d’afficher le flux rtsp directement dans l’interface de Jeedom.

ring-rtsp INF [RTSP] [conn 192.168.1.175:37944] opened +3m
ring-rtsp INF [path 1234_live] runOnDemand command started +2ms
ring-rtsp INF [path 1234_live] runOnDemand command exited with code 0 +1ms
ring-rtsp INF [path 1234_live] runOnDemand command stopped +10s
ring-rtsp INF [RTSP] [conn 192.168.1.175:37944] closed (source of path '1234_live' has timed out) +1ms

Peut etre faut il modifier le fichier /ring-mqtt/config/rtsp-simple-server.yml par défaut ?

readTimeout: 5s
readBufferCount: 1024
rtspDisable: no
protocols: [tcp]
rtspAddress: 0.0.0.0:8554
rtmpDisable: yes
hlsDisable: yes
api: yes
apiAddress: 127.0.0.1:8880
paths:
  all:
    fallback:
    disablePublisherOverride: no

Par ailleurs, concernant la récupération du snapshot régulier des camera, comment est-ce que cela peut fonctionner avec une url de ce type ?
https://localhost:8123{{ states.camera.devant_snapshot.attributes.entity_picture }}
N’y a-t-il pas un séparateur à ajouter entre le numéro du port et l’accolade { ?

je dirais mettre l’adresse de ton pi 127.0.0.1

concernant les snapshots bonne question, je pensais les avoir sur ma doorbell mais que ni ni

Toujours la meme erreur en mettant 127.0.0.1 :cry:
[RTSP] [conn 127.0.0.1:41308] closed (source of path '1234_live' has timed out)

zut…
tu es sûr de ton lien ??

Bonsoir,

Pour les Snapshots, avec ma doorbell wired, ring-mqtt envoie l’image (format jfif) en hexadécimal dans un sujet dédié.
Malheureusement cette commande n’est pas reconnue par jmqtt (skipped dans les logs).

En attendant mieux, j’envisage un client mqtt externe qui récupérerait la payload, la convertirait en binaire et renverrai l’URL à jeedom via un virtuel par ex.

Par contre je n’ai aucun Snapshot en cas de détection de mouvement et je n’ai pas encore testé le cas de sonnerie…

Bonjour, j’ai tenté de suivre le tuto mais je rencontre plusieurs difficulté, on va commencer par la première…

Dans le fichier conf, si je met « enable camera = false » et que je fait ensuite la commande « DEBUG=ring-mqtt ./ring-mqtt.js » ça fonctionne, mais il ne détecte pas ma sonette.

Si je met sur « true », il détecte ma sonnette, mais cherche à utiliser rtsp-simple-server et se stop :

ring-mqtt Ring location/device data updated, sleeping for 5 seconds. +0ms
ring-mqtt ERROR - Uncaught Exception +2s
Error: spawn rtsp-simple-server EACCES
at Process.ChildProcess._handle.onexit (internal/child_process.js:274:19)
at onErrorNT (internal/child_process.js:469:16)
at processTicksAndRejections (internal/process/task_queues.js:82:21) {
errno: -13,
code: ‹ EACCES ›,
syscall: ‹ spawn rtsp-simple-server ›,
path: ‹ rtsp-simple-server ›,
spawnargs: [ ‹ /home/pi/ring-mqtt/lib/…/config/rtsp-simple-server.yml › ]
}
ring-mqtt The ring-mqtt process is shutting down… +1s
ring-mqtt Setting all devices offline… +1ms
ring-mqtt Exit code: 2 +3s

Je n’arrive pas à comprendre comment installer rts-simple-server ou s’il faut effectuer des modifs dans /config/rtsp-simple-server.yml ?

Bonjour,
Quel install as-tu utilisée? Standard ou Docker?
Quelle version de ring-mqtt?

Pour ma part, c’est la version standard sans le serveur rtsp et j’ai bien l’option camera sur enable avec une doorbel et pas d’erreur avec le Debug.

A mon avis, la version que tu utilises est récente (la mienne date de cet été, donc date un peu pour la partie rtsp) et d’après ce que j’ai compris le serveur rtsp est obligatoire pour les dernières versions.

Avec un docker rien a installer de plus le serveur rtsp est inclu.

Bonjour, installation standard, et j’imagine la dernière version qui s’est installée seule avec le git-clone?

Oui j’ai vérifié, j’utilise bien l’url indiquée dans info/sate/stream_source dans MQTT Explorer (j’ai juste mis 1234 dans ce forum pour masquer la vrai chaine de caractère).
Vraiment bizare cette histoire de rtsp …
Pour les snapshot, idem que @537719 je vois bien que l’image est présente en hexa dans snapshot/image mais je suis incapable de trouver une solution pour l’afficher…

1 « J'aime »

Pour ce qui est de récupérer l’image, /usr/bin/mosquitto_sub -C 1 -t ring/..../camera/.../snapshot/image > snapshot.jfif crée le fichier image.
Avec imagemagick j’ajoute la date et l’heure dans un coin.
Reste à créer un virtuel avec un widget qui affiche l’image et la met à jour…
À moins que cela ne soit faisable avec le plugin camera ?

Pour le reste (rtsp…) est-ce qu’un abonnement ring est nécessaire ou pas ?

ça je peux te répondre qu’il n’y a pas besoin d’abo…

1 « J'aime »

En effet. Pas besoin d’abonnement. Car l’info est en ´temps reel’, c’est gratuit chez ring.

Ce qui nécessite l’abo c’est l’enregistrement et la consultation sur 30 jours des vidéos.

1 « J'aime »

Un script (ring-snapshot.sh) qui interroge mosquitto afin d’obtenir l’image du snapshot :

topic=ring/0.../camera/.../snapshot/image
cam=Nom de la caméra

while true
do
# echo /usr/bin/mosquitto_sub -C 1 -t $topic \> ~/snapshot.jfif
/usr/bin/mosquitto_sub -C 1 -t $topic > snapshots/snapshot_.jfif
dt=`date +"%Y%m%d%H%M%S"`
# echo $dt
convert -gravity NorthEast -pointsize 16 -fill yellow -annotate +5+5  "`date`" -annotate +5+24 "$cam" snapshots/snapshot_.jfif  snapshots/snapshot_$dt.jpg
cp -f snapshots/snapshot_$dt.jpg /var/www/html/data/img/snapshot.jpg
done

C’est pas forcément très propre mais simple et ça fonctionne.

Remplacer les … par les valeurs affichées dans mqtt-explorer et qui correspondent à votre équipement.
L’image est traitée par imagemagick pour rajouter l’horodatage et l’identification de la caméra, cela peut être amélioré facilement en ajoutant au texte un fond translucide qui améliore la lecture si besoin…

L’image est renommée au moment de cette transformation en y ajoutant la date et l’heure puis copiée sous le nom générique snapshot.jpg dans /var/www/html/data/img (le changement de format me sert juste à être certain que le navigateur peut afficher l’image (même si JFIF signifie JPEG file interchange format et que donc, on reste sur du jpeg qui devrait être affichable sans problème).

Pour installer imagemagick (sur raspberry/linux) :
sudo apt-get install imagemagick

Pour l’instant, je lance le script avec sudo dans un terminal :
sudo ./ring-snapshot.sh
À transformer en service ou autre afin qu’il soit lancé au démarrage et plus arrêté dès qu’on ferme le terminal qui l’a lancé.

Coté Jeedom un HtmlDisplay qui met à jour l’image toutes les secondes (changer le 1000 en autre chose pour espacer les mises à jour) :

<body>
  <center>
	<img src="data/img/snapshot.jpg"  width="640" height="360" id="ring-snapshot"/>
  </center>
  <script type="text/javascript">  

    function reloadImg()
    {
        var img = document.getElementById('ring-snapshot');
        var dt = new Date();
        img.src = "data/img/snapshot.jpg" + "?" + dt.getTime();
	myTimeOut=setTimeout(reloadImg,1000);
    }
    reloadImg();
      </script>
</body>

Ça fonctionne avec ma sonnette filaire, aucune idée de ce que ça peut donner avec d’autres appareils.

La fréquence des messages est assez irrégulière de 30 s à plus de 45 mn ! Pour voir les dates enlever le croisillon devant echo $dt dans le script.

20220430135931
20220430135959
20220430140029
20220430140059
20220430140129
20220430140159
20220430142321
20220430142621
20220430143521
20220430144122
20220430145921
20220430151721
20220430152921
20220430161721
20220430162321
20220430163821
20220430164421
20220430165622
20220430165922
20220430170221
20220430170521
20220430172621
20220430173521
20220430174121
20220430175321
20220430175621
20220430175921
20220430180821
20220430181721
20220430182621
20220430183221
20220430183821
20220430184125
20220430185021
20220430185621

Prochaine étape, regrouper toutes les images sous forme d’une vidéo avec ffmpeg

N’hésitez pas à tester et faire le retour de ce qui fonctionne ou pas chez vous.

Bonjour,

Je reviens sur le flux video, en activant le mode DEBUG sur ring-rtsp j’ai les messages suivant :

 ring-rtsp ------------------------------------------------------------------------- +0ms
  ring-rtsp Starting rtsp-simple-server process... +3ms
  ring-rtsp INF rtsp-simple-server v0.17.17 +52ms
  ring-rtsp INF [RTSP] listener opened on 127.0.0.1:8554 (TCP) +1ms
  ring-rtsp INF [API] listener opened on 127.0.0.1:8880 +1ms
  ring-rtsp Creating RTSP paths for all cameras... +970ms
  ring-rtsp INF [API] [conn 127.0.0.1:60006] POST /v1/config/paths/add/5.........f_live +22ms
  ring-rtsp Response code 400 (Bad Request) +12ms
  ring-rtsp INF [API] [conn 127.0.0.1:60008] POST /v1/config/paths/add/5.........f_event +18ms
  ring-rtsp Response code 400 (Bad Request) +5ms
  ring-rtsp ------------------------------------------------------------------------- +101ms

Manifestement rtsp-simple-server n’arrive pas à créer les points d’accès aux flux.

Une idée ?

Merci d’avance

Salut je ne suis pas du tout expert mais d’après ce que j’ai lu ici ou là, la bad request 400 c’est un pb de path dans la config rtsp

Pour info, dans la dernière beta, qui passera stable demain après quelques correctifs, jMQTT supporte les payload binaires.
Ils sont remontés en base64 dans Jeedom.

 

EDIT : Le widget « code dashboard cmd info string » permet d’afficher une image envoyée en MQTT :

<div style="padding:10px; min-width:40px; min-height:80px;" class="cmd cmd-widget container-fluid #history#" data-type="info" data-subtype="numeric" data-template="MqttImage" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
    <div class="title #hide_name#"><div  class="cmdName">#name_display#</div></div>
    <div class='DisplayInfo#uid#'><img style="width:calc(100%);" class="ValueInfo#uid#" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" alt="image from mqtt" /></div>
  <style>
  </style>
<script>
		jeedom.cmd.update['#id#'] = function(_options){
          	var InfoValue = _options.display_value;
			$('.cmd[data-cmd_id=#id#]').attr('title','Valeur du '+_options.valueDate+', collectée le '+_options.collectDate);
          	if (InfoValue == '') {
              $('.cmd[data-cmd_uid=#uid#] .ValueInfo#uid#').attr('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=');
	        } else {
      	      $('.cmd[data-cmd_uid=#uid#] .ValueInfo#uid#').attr('src', 'data:image/png;base64,'+InfoValue);
            }
		}
		jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'});
</script>   
</div>

Même si l’image est en « png;base64 » dans la source, j’ai essayé avec un gif, jpg, png et bmp, Chrome affiche bien l’image :slight_smile:

Mise en place :


image

Test :
mosquitto_pub -h 127.0.0.1 -t test/decoder -f cat.png

Resultat :
image

Enjoy

3 « J'aime »

Bonjour, j’ai eu exactement le même problème. La solution :

  • Les start-stream.sh et update2branch.sh qui se trouvent dans le sous-dossier « scripts » doivent être mis sur runable avec chmod +x.
  • la version de mosquitto DOIT être 2.0.14
  • Nodejs comme décrit dans la documentation 16.x
    En faisant beaucoup d’essais, je peux dire avec certitude que les points mentionnés ci-dessus corrigent la cause de l’erreur

Désolé pour le retard, mais le temps de trouver le temps de faire des tests…

Ça fonctionne parfaitement ! Bravo et merci.

J’ai modifié légèrement le widget pour afficher dans un coin la date et l’heure ainsi qu’un texte de son choix (par défaut le nom de la commande, je n’ai pas trouver comment récupérer le nom de l’équipement et de sa pièce), on peut modifier le texte en cliquant sur l’engrenage à droite de la commande, onglet affichage, paramètres optionnels widget :

<div style="padding:10px; min-width:40px; min-height:80px;" class="cmd cmd-widget container-fluid #history#" data-type="info" data-subtype="numeric" data-template="MqttImage" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
    <div class="title #hide_name#"><div  class="cmdName">#name_display#</div></div>


    <div class='DisplayInfo#uid#' width="100%" style="position:relative">
      <img class="ValueInfo#uid#" width="100%" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" alt="image from mqtt" />
<div id="gcValueDate" class="gcValueDate">01/01/1970 00:00:00<br/>#name_display#</div>
  </div>
  <style>
    .gcValueDate {
      display:block;
      position:absolute;
      right:0;
      bottom:0;
      margin-right:0px;
      margin-top:0px;
      padding:3px;
      z-index:2;
      background:brown;
      opacity:.5;
      color:yellow;
      text-align:right; 
    }
   </style>
   <template>
    <div>gcEqName : le nom de l'équipement ou tout autre texte qui sera jugé pertinent pour identifier la source ou le copyright de l'image ({{Par défaut retourne le nom de la commande}}).</div>
  </template>

<script>
  		var gcEqName = ('#gcEqName#' !='#'+'gcEqName#') ? "#gcEqName#":"#name_display#";
		jeedom.cmd.update['#id#'] = function(_options){
          	var InfoValue = _options.display_value;
			$('.cmd[data-cmd_id=#id#]').attr('title','Valeur du '+_options.valueDate+', collectée le '+_options.collectDate);
          	if (InfoValue == '') {
              $('.cmd[data-cmd_uid=#uid#] .ValueInfo#uid#').attr('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=');
	        } else {
      	      $('.cmd[data-cmd_uid=#uid#] .ValueInfo#uid#').attr('src', 'data:image/png;base64,'+InfoValue);
            }
          document.getElementById('gcValueDate').innerHTML=_options.valueDate+'<br/>'+gcEqName;
		}
		jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'});
</script>   
</div>

Encore merci pour tous ceux qui travaillent et nous aident.

2 « J'aime »

Bonjour,

J’ai enfin réussi à obtenir le flux rtsp sur ma doorbell wired !
Merci à tous ceux qui ont donné des pistes permettant d’aboutir.

Pour ma part je suis en 2.0.12 de Mosquitto, la 2.0.14 ne semble pas exister en package tout fait pour debian et la compilation ne se faisait que sans l’option cjson (pas certain que cela ait une incidence…). J’ai installé la dernière version de rtsp-simple-server (0.19), donné les droits d’écriture à tout le monde (chmod ugo+w) sur l’ensemble de fichiers et dossiers de ring-mqtt.
Là où j’e me suis créé moi-même un piège c’est que ring-mqtt est installé dans un dossier utilisateur mais que le fichier .service mentionnait workingDirectory = /usr/bin tout fonctionnait correctement sauf le flux rtsp.

J’avais également mis mon nom de compte ring et le mot de passe correspondant dans config.json. Cela pose visiblement problème pour rtsp-simple-server (voir la page github de ring-mqtt).

Une fois tout cela corrigé, le flux rtsp est bien accessible et peut être utilisé avec le plugin camera (au moins en réseau local, pas encore testé à distance).

Pour ceux que cela intéresse, afin d’avoir un aspect similaire à mes caméras IMOÜ, en cherchant j’ai trouvé dans cette page des commandes à passer à ffmpeg pour superposer la date à l’image de la caméra (les valeurs X, Y et les couleurs sont bien évidement à adapter à vos besoins).

-filter_complex "drawtext=fontsize=50: fontcolor=white: boxcolor=black@0.75: text='%{localtime \:%d-%m-%Y %T}': x=1350 : y=50 : box=0"

image

Encore merci à tous ceux qui œuvrent pour que tout fonctionne bien !

1 « J'aime »

Bonjour
Depuis quelques jours impossible de faire fonctionner l api, et j ai décidé de basculer sur ce module.
J ai décidé de me lancer mais si je me base sur vos messages précédents je n ai pas la même résolutions des attributs ? Y aurait il eu un mise à jour côté ring ?

Durant mes tests j ai décidé de lancer l application en ligne de commande:
DEBUG=ring-mqtt,ring-attr ring-mqtt.js /opt/ring-mqtt/ring-mqtt.js

image

est ce normal ou est raté un option de configuration ?

merci par avance

bonne soirée / vacances