[Tutoriel] Integration Ring Doorbell

Tags: #<Tag:0x00007f28358c28f0>

Salut, je profite de ces jours de confinement pour remettre à jour mon système et surtout terminer ce que j’avais en cours… En particulier l’intégration d’une « sonnette » Ring Doorbell.

(1) Le but :
a) dans mon dashboard, je veux afficher l’état de ma Doorbell (état de la connection au wifi, % batterie et dernier évènement)
image
b) dans le design que j’utilise comme IHM principale de mon système, je reprends les mêmes info mais je rajoute en plus le dernier enregistrement de la caméra
image
Ceci me permet de revoir la vidéo de qui à sonné dans le cas ou j’étais absent (et que je n’ai pas répondu depuis mon portable, etc.)

(2) Pré requis :

  • un Ring Doorbell (bah oui!)
  • un abonnement a un plan de protection. Ceci est nécessaire pour pouvoir récupérer l’enregistrement vidéo. La version Basic (30€/an) suffit !
  • plugin script
  • plugin virtuel
  • connexion ssh sur votre jeedom (pour installer des packages python)

Petite précision : je n’ai mis en place que ce dont j’avais besoin pour ma configuration particulière. Il faudra adapter les choses si vous avez plusieurs Doorbell par exemple, etc.
Ceci dit, ce tuto vous servira de base…

(3) Configuration Ring
Avant toute chose, depuis votre compte sur le site Ring.com, vous devez :

  • activer un plan de protection (j’ai pris le Basic).
  • activer l’authentification à deux facteurs.

(4) Installation des packages
Il s’agit de mettre en place un script en python 3 qui repose sur le package ring-doorbell.
Donc une fois connecté sur votre machine (RPI, etc.) on commence par installer le package :

sudo python3 -m pip install ring_doorbell

J’ai également créé un répertoire dans l’arborescence de Jeedom dans lequel je vais stocker la video téléchargée depuis les serveurs de Ring

sudo mkdir /var/www/html/video
sudo chown www-data:www-data /var/www/html/video

(5) Création du virtuel pour le dashboard
Voici le détail des commandes du virtuel créé :
image

(6) Installation du script


:warning: Début EDIT DU 05/06/20 :warning:

Il y a deux méthodes d’installation : la première repose sur le plugin script qui appel de façon régulière un script python. Suite à quelques problèmes liés à l’authentification, j’ai repensé la méthode en passant par un daemon linux autonome, c’est la deuxième méthode (que je vous conseille d’utiliser). J’ai quand même laissé la première méthode décrite ci-dessous pour l’historique et les personnes qui l’ont déjà implémenté et qui n’ont pas encore sauté le pas pour basculer sur la méthode 2.


**Méthode 1 (obsolète)**

Alors j’ai du créer un premier script en python qui va interroger l’API Doorbell, remonter les informations dans le virtuel créé ci-dessus et télécharger la dernière vidéo dans le répertoire créé au point (4). Je ne sais pas pourquoi mais il m’est impossible de lancer ce script via python3, jeedom le lance toujours par python2. Pour ruser, j’ai donc créé un autre script bash qui me permet juste de lancer le script python. Je n’ai pas réussi a faire plus simple avec mon sytème.
(6.1) Bref, il faut donc créer un premier script python (cf fichier attaché). Veillez à bien changer dans le script tous les points qu’il faut configurer par rapport à votre propre installation Jeedom. J’ai « encadrer » tout ça avec des commentaires « TODO » dans le code… En gros il faut configurer :

  • L’IP de votre Jeedom et sa clé API (ligne 29)
  • Le chemin ou sera stocké le fichier de cache pour l’authentification (ligne 15)
  • Le chemin ou sera stocké la vidéo téléchargée (ligne 47)
  • Les IDs des commandes du virtuel créé au point (5) (lignes 56,58,68,69,87)

Comme le ficher de cache pour l’authentification n’est pas encore créé, il faut lancer le script à la main (via votre connexion ssh). Il va alors vous demander votre login et password de votre compte Ring.com et le code de validation que vous venez de recevoir par SMS (car vous avez activé l’authentifcation a deux facteurs au point (3) !).
Par sécurité j’ai remis les bons user et groupe au ficher généré :
sudo chown www-data:www-data <chemin vers le fichier ring_token.cache>

ring.py.txt (3,1 Ko)

(6.2) Le second script bash est tout simple, il appelle le script python en utilisant la bonne version de python

#!/bin/bash
python3 /var/www/html/plugins/script/core/ressources/ring.py

Au final, via le plugin script on a ça :
image
image
Comme vous pouvez le voir, le script va s’actualiser toutes les 5mins et mettre à jour les info du virtuel associé et télécharger la dernière vidéo disponible.


**Méthode 2 (conseillée)**

Cette 2cd méthode se déroule en 3 étapes :

  1. installation des scripts
  2. génération du token d’authentification
  3. exécution du daemon

(6.1) installation des scripts
Dans le fichier zip ci-joint (à télécharger et à renommer en .zip), vous trouverez deux fichiers :
ring_daemon.zip.txt (3,2 Ko)

  • ring_daemon.py
    Il s’agit du script principal. Vous devez le modifier afin d’y reporter votre configuration :
"""
Global variables declaration
    working_path:   full path to the installation folder of this script
    cache_file:     full path to the authentication token file cache
    pid_file:       full path to the file that stores the deamon process ID
    log_file:       full path to the log file for debugging purpose
    video_repo:     full path to the repository folder where video from Ring.com are downloaded
    jeedom_api_url: URL of your Jeedom API
    jeedom_api_key: Key of your Jeedom API
    jeedom_cmd:     array of Jeedom commande Info ID used to update the associated Jeedom widget

"""
working_path = '/var/opt/ring'
cache_file = Path(working_path + "/ring_token.cache")
pid_file = '/var/run/ring_daemon.pid'
log_file = '/var/log/ring_daemon.log'
video_repo = '/var/www/html/video/'
jeedom_api_url = 'http://xxx.xxx.xxx.xxx/core/api/jeeApi.php'
jeedom_api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
jeedom_cmd = {
    'service_status' : 1353,
    'connection_status' : 4417,
    'battery_life' : 1352,
    'last_event' : 1354,
}

Je pense que tout est clair à ce niveau…
Une fois modifié, vous devrez le copier sur votre système à l’emplacement que vous avez indiqué dans la variable working_path.
Installez le package python nécessaire :

sudo python3 -m pip install python-daemon

Afin de faire une première vérification, essayez un python3 ring_daemon.py -h, vous devriez obtenir ceci :

/var/opt/ring $ python3 ring_daemon.py -h
usage: ring_daemon.py [-h] [-p PID_FILE] [-l LOG_FILE] [--auth]

Ring daemon

optional arguments:
  -h, --help            show this help message and exit
  -p PID_FILE, --pid-file PID_FILE
                        PID file, usually /var/run/ring_daemon.pid
  -l LOG_FILE, --log-file LOG_FILE
                        Log file, usually /var/log/ring_daemon.log
  --auth                Login interactively to Ring to generate authentication
                        token
  • ring_daemon.service :
    Il s’agit d’un fichier de configuration pour le daemon. Vous devez modifier la ligne suivant afin de pointer sur le script python ci-dessus :
[Service]
ExecStart=/var/opt/ring/ring_daemon.py

Une fois modifié ce script est à copier (en tant que root, via la commande sudo par exemple) dans le répertoire suivant : /etc/systemd/system

(6.2) génération du token d’authentification
Comme vous avez pu le voir dans l’aide du script, afin de générer le token d’authentification dans le fichier de cache, il suffit d’exécuter (attention aux droits de l’utilisateur que vous utilisez) la commande python3 ring_daemon.py --auth. On vous demandera de renseigner le 2FA code que vous avez reçu après avoir renseigné votre login et mot de passe Ring.

(6.3) exécution du daemon
Une fois le fichier de cache généré, vous pouvez exécuter le script en tant que daemon :

  • systemctl enable ring_daemon.service vous permet de lancer le daemon au boot de votre RPI
  • systemctl start ring_daemon.service vous permet d’exécuter le daemon
  • systemctl stop ring_daemon.service vous permet d’arrêter le daemon

:warning: Fin EDIT DU 05/06/20 :warning:


(7) Création du Design
La vidéo est visualisée à l’aide d’un élément du type texte/html et de la balise vidéo :

<video width="320" height="180" controls  poster="montheme/images/ring.png">
	<source src="http://192.168.2.140/video/last_ding.mp4" type="video/mp4">   
	Your browser does not support the video tag or the file format of this video.
</video>

J’ai juste fait référence au fichier vidéo téléchargé par le script et configuré une image « poster » qui est affichée lorsque le lecteur n’est pas en mode play.

Et voilà, j’espère avoir été clair, ne rien avoir oublié dans les étapes et si ça peut aider certains d’entre vous … ben tant mieux :wink:

Pour terminer voici les liens utiles à la réalisation de ce tuto…

4 J'aimes

Bonjour,

Tout d’abord, merci pour ce tuto.
Je viens de commander une Doorbell 2 et regarde comment l’intégrer à Jeedom.
Pour pouvoir avoir l’état de la Doorbell (état de la connexion au wifi, % batterie et dernier évènement), est-on obligé d’avoir l’abonnement, ou est-ce une info que l’on peut récupérer (et si oui, comment) ?
Merci.

Salut,
Il me semble que non, l’abonnement permet de récupérer la vidéo enregistrée mais le reste devrait rester accessible sans abonnement (j’ai un petit doute vis a vis du dernier évènement mais bon…).
Comment faire ? Ben faut suivre le tuto, tout est expliqué normalement (tout passe par les scripts…). Le tuto est a prendre comme un exemple, il répond a mon besoin perso mais qui n’est pas forcement le votre, a vous d’adapter la chose en partant de cette base…

Félicitations pour ton tuto, il m’a bcp aidé

Ha ben nickel alors, c’était le but :wink:

Hello,

Merci pour le tuto j’ai une sonnette Doorbird qui fonctionne sans cloud mais je devrais p’tre en racheter une autre si ca fonctionne sans abo (recuperer juste le flix live sans enregistrement video) ca m’irait bien car 30 euros juste pour ça (sachant que j’ai un nas qui me sert d’enregistreur pour mon Doorbird).

Heu je ne sais pas si tu peux faire avec la Doorbell la meme chose qu’avec ta Doorbird.Il y a un objet live_streaming_json dispo, mais je n’aipas encore joué avec et ne sais pas si les données sont dispo sans abonnement… a tester …

Ok, merci pour tes infos.
Je vais essayer et reviendrai indiquer ici ce que j’ai réussi à faire grace à ton tuto.

J’essaie de lancer le script, mais il y a quelques points sur lesquels je bloque :

  • lorsque je lance en ssh la commande
    python3 /var/www/html/plugins/script/core/ressources/ring.py
    j’obtiens le message suivant :
    root@jeedom:~# python3 /var/www/html/plugins/script/core/ressources/ring.py
    File « /var/www/html/plugins/script/core/ressources/ring.py », line 87
    SendToJeedom(6506, « %s - %s » % (event[‹ created_at ›], res))
    ^
    IndentationError: unexpected indent
    root@jeedom:~#

Pareil lorsque je lance le script créé dans jeedom, j’obtiens
Erreur dans l’exécution du terminal, la valeur retournée est : 1. Détails : File « /var/www/html/plugins/script/core/ressources/ring.py », line 87 SendToJeedom(6506, « %s - %s » % (event[‹ created_at ›], res)) ^ IndentationError: unexpected indent
Du coup, je n’arrive pas à l’étape de renseignement du login de mon compte Ring

  • Tu parles d’un fichier ring_token.cache : j’imagine que ce fichier est généré automatiquement après que le script ait été lancé et que je me sois identifié pour la première fois, c’est ça ?

Merci pour ton aide.

Aussi, quand je lance le script ring.sh en ssh, j’obtiens :
root@jeedom:~# /var/www/html/plugins/script/core/ressources/ring.sh
-bash: /var/www/html/plugins/script/core/ressources/ring.sh: Permission denied
root@jeedom:~#

Je ne m’en sors pas là …

@jeewawa, alors python est tres sensible a l’indentation, c’est un élément structurant de ce langage. Il suffit d’un petit espace et tu as ce genre d’erreur. Vérifie que tu as exactement le meme nbre d’espaces à la ligne 87 qu’il y en à la ligne 77 (« if not last_ding.exists(): »)

Pou le fichier ring_token.cache, effectivement il est généré lors du premier lancement. Comme il n’existe pas, le script va te demander ton login/mdp Ring et générer le fichier en question.

Pour ton dernier point, je vois pas ? Le fichier sh a bien l’attribut « executable » ? Au pire, en tant que root (puisque tu le lance avec cet utilisateur), execute la commande ’ chmod +x ring.sh’ et essaye de nouveau pour voir…

Bonjour @chiorboli,
mon installation est sous Freebox et tout comme @jeewawa j’ai eu le problème de droit d’exécution du fichier ring.sh . J’ai laissé un peu tombé et aujourd’hui sans même rien faire j’ai réussi à l’exécuter. J’ai également eu pas mal de problème d’indentation avec le fichier ring.py, mais je m’en suis sortie facilement, mais après avoir correctement saisi les données d’identification j’ai le message suivant :
"
Traceback (most recent call last):

  • File « /var/www/html/plugins/script/core/ressources/ring.py », line 40, in main*
  • auth.fetch_token(username, password)*
  • File « /usr/local/lib/python3.7/dist-packages/ring_doorbell/auth.py », line 40, in fetch_token*
  • headers=headers,*
  • File « /usr/local/lib/python3.7/dist-packages/requests_oauthlib/oauth2_session.py », line 360, in fetch_token*
  • self._client.parse_request_body_response(r.text, scope=self.scope)*
  • File « /usr/local/lib/python3.7/dist-packages/oauthlib/oauth2/rfc6749/clients/base.py », line 421, in parse_request_body_response*
  • self.token = parse_token_response(body, scope=scope)*
  • File « /usr/local/lib/python3.7/dist-packages/oauthlib/oauth2/rfc6749/parameters.py », line 431, in parse_token_response*
  • validate_token_parameters(params)*
  • File « /usr/local/lib/python3.7/dist-packages/oauthlib/oauth2/rfc6749/parameters.py », line 441, in validate_token_parameters*
  • raise MissingTokenError(description=« Missing access token parameter. »)*
    oauthlib.oauth2.rfc6749.errors.MissingTokenError: (missing_token) Missing access token parameter.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  • File « /var/www/html/plugins/script/core/ressources/ring.py », line 90, in *
  • main()*
  • File « /var/www/html/plugins/script/core/ressources/ring.py », line 42, in main*
  • auth.fetch_token(username, password, otp_callback())*
  • File « /usr/local/lib/python3.7/dist-packages/ring_doorbell/auth.py », line 44, in fetch_token*
  • self.token_updater(token)*
  • File « /var/www/html/plugins/script/core/ressources/ring.py », line 19, in token_updated*
  • cache_file.write_text(json.dumps(token))*
  • File « /usr/lib/python3.7/pathlib.py », line 1218, in write_text*
  • with self.open(mode=‹ w ›, encoding=encoding, errors=errors) as f:*
  • File « /usr/lib/python3.7/pathlib.py », line 1186, in open*
  • opener=self._opener)*
  • File « /usr/lib/python3.7/pathlib.py », line 1039, in _opener*
  • return self._accessor.open(self, flags, mode)*
    PermissionError: [Errno 13] Permission denied: ‹ /var/www/html/plugins/script/core/ressources/ring_token.cache ›
    "
    Les permissions sont en lecture et écriture sur le dossier ressources, je ne comprend pourquoi il n’arrive pas à créer le fichier ring_token.cache (l’IP est bonne et le clé API également).

As-tu une idée ?
En te remerciant pour ta patience.

Salut @gmau77,
Vu l’erreur que tu remontes c’est normal que le fichier ne soit pas créé puisqu’il n’arrive pas a récupérer les informations requises pour le générer. Ce n’est pas un problème de droit d’accès. As tu bien activé l’authentification a deux facteurs sur le site Ring.com ? Normalement, lorsque tu executes le script pour la première fois (le fichier ring_token.cache n’existant pas), il doit te demander :

  • ton login
  • ton mot de passe
  • et le code (4 chiffres) que tu as du recevoir par SMS
    Est ce bien le cas ?

Oui tout à fait sauf, que je reçois le code par mail et qu’il contient 6 chiffres. Le problème viendrait-il de là ?
J’ai passer la double authentification par SMS, mais je reçois également un code à 6 chiffres.

Merci pour ton aide.

oui tu as raison c’est a 6 chiffres, pas 4, apres que ce soit par SMS ou email je ne pense pas que ça fasse une différence. Pour en revenir a ton erreur, je ne comprends pas alors. C’est comme si l’authentification ne fonctionnait pas chez toi… ca donne quoi avec les changements que tu as fait du coup (SMS au lieu de email) ? C’est la meme chose ? L’utilisateur avec lequel tu lances le script a bien les bons droits (tu arrives a creer un fichier ?) ?

Oui ça donne la même chose que ce soit par mail ou par SMS.
En SSH j’utilise le login « freebox » je présume qu’il a les droit « root », mais sans certitude.
Si je tape la commande « su - » il ne reconnait pas le mot de passe, peut-être que le problème vient de là.
Il faut que je me documente là dessus et je te tiens au courant.
Dans tous les cas, merci pour ton écoute.

Alors si tu as un doute avec les droits root, execute tes commandes via un sudo <ma commande...>, la au moins tu n’auras pas de pb de droits root.
Ensuite c’est jeedom qui va executer ton script, donc dans tous les cas il faut que tout soit accessible a l’utilisateur interne www-data. Donc sur les fichiers .py, .sh et le ring_token.cache (une fois qu’il aura été généré), fait un :
sudo chown www-data:www-data <nom du fichier>
Et n’oublie pas le sudo chmod +x <fichier .sh>
J’éspère qu’avec ça tout rentrera dans l’ordre…

@chiorboli & @gmau77
Grace à vos interventions à tous les deux, j’ai pu avancer jusqu’au même stade que gmau77 (même long message d’erreur).
Pour arriver là, j’ai dû faire 6 ou 7 modifications d’indentation dans le fichier, mais j’ai bien réussi à atteindre l’étape de saisie du login, pass et code.
Après, … c’est le drame :wink:
De mon côté, j’exécute les commandes en ssh sur profil root donc je ne pense pas que ce soit un problème de droits.

Ah je me rends compte que la dernière ligne n’est pas la même car j’obtiens :

FileNotFoundError: [Errno 2] No such file or directory: ‹ /script/Ring/ring_token.cache ›

Donc gmau77, tu as peut-être un problème de droit, et pour ma part cela semble être un problème de chemin du fichier de cache …

Edit : en effet, je n’avais pas mis le chemin en entier, cela fonctionne maintenant, mais j’obtiens désormais l’erreur :

File « /usr/local/lib/python3.5/dist-packages/requests/adapters.py », line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host=‹ http ›, port=80): Max retries exceeded with url: //XXXXX/core/api/jeeApi.php?plugin=virtual&apikey=XXXXXXX&type=virtual&id=6507&value=1 (Caused by NewConnect ionError(’<urllib3.connection.HTTPConnection object at XXXXXXXX>: Failed to establish a new connection: [Errno -5] No address associated with hostname’,))

(j’ai remplacé les valeurs qui me paraissent sensibles par des XXXX

Edit 2 : après avoir corrigé plusieurs erreur de boulet de ma part, tout fonctionne correctement !

Un grand merci à toi chiorboli !

Bonjour @chiorboli et @jeewawa,
effectivement c’était un problème de droit et je me déçois à ne pas avoir tenter la commande « sudo » par moi même… Du coup ça fonctionne beaucoup mieux et au bout de 5 minutes le virtuel c’est bien mis à jour.
Merci encore à vous pour votre aide.