Intégration de matériel Eufy

Bonjour,

Il me semble que le sujet n’a pas encore été abordé avec cette manière de faire sur ce community.
Pour utiliser vos équipements Eufy il existe depuis quelques temps une bibliothèque utilisant websocket permettant de piloter la plupart des paramètres de vos appareils. Il s’agit du projet de Bropat/eufy-security-ws disponible ici : GitHub - bropat/eufy-security-ws: Small server wrapper around eufy-security-client library to access it via a WebSocket.

J’ai commencé me pencher dessus et je souhaitais vous montrer un exemple de ce que vous pouvez faire en attendant que quelqu’un développe un plugin un jour (peut être moi si j’arrive a acquérir les compétences nécessaire un jour :sweat_smile: )

Ces indications repose sur le travail la réponse d’une personne dans un sujet diffèrent traitant de ces caméra : Caméras de sécurité type Arlo : Eufy - #3 par Benoit_50
Cette solution est cependant moins « invasive/sale » car il n’y a qu’une seule dépendance a installer sur le serveur Jeedom.

Je vais vous présenter comment j’ai mis les choses en place chez moi pour par exemple changer de mode de sécurité sur la HomeBase ou pour activer ou désactiver une caméra.

Historique des modifications sur le poste :
15/03/2022 :

  • Ajout des flags COUNTRY et LANGUAGE dans la ligne de commande de création du docker.
  • Ajout d’une partie dépannage, lié aux remontées des utilisateurs

Installation

Prérequis :

  • Sauvegarder/Snapshoter votre environnement
  • D’apres la documentation, le plugin Docker Management n’est pas compatible avec la Jeedom Smart

Procédure de mise en place :
Il est possible d’utiliser 2 méthodes différentes pour déployer le container Docker, les utilisateurs ayant des notions de Docker ou un serveur Docker peuvent se référer a la méthode 2, pour les autres le plus simple est la méthode 1. Une fois le container déployé la procédure est la même.

Méthode 1 : Déployer le container avec le plugin « Docker Management » :

  1. Installer le plugin « Docker Management » Présent sur le Market Jeedom (Jeedom Market)
  2. Une fois le plugin installé sur Jeedom, l’activer et installer ses dépendances.
  3. Se rendre dans le plugin « Docker Management » et créer un nouvel équipement avec le nom « Eufy-WS »
  4. Relier le a un objet parent et catégoriser le (ou pas, ce n’est pas obligatoire), activer l’équipement et le rendre visible si voulu. Indiquer le nom du container « Eufy-WS », ne cocher pas « Sauvegarder les mount ». Selectionner le mode de création « jeedom docker run » et dans « commande de création » indiquer la commande suivante :
    -d --name Eufy-WS -e USERNAME=votreadresseemaileufy -e PASSWORD=votremotdepasseeufy -e COUNTRY=FR -e LANGUAGE=fr -p 3000:3000 bropat/eufy-security-ws
    Si vous êtes sur Raspbian vous devez ajouter l’argument « –privileged » a la commande de création du container :
    -d --privileged --name Eufy-WS -e USERNAME=votreadresseemaileufy -e PASSWORD=votremotdepasseeufy -e COUNTRY=FR -e LANGUAGE=fr -p 3000:3000 bropat/eufy-security-ws

Le résultat devrait être similaire a ça :


Sélectionner « Sauvegarder », normalement la création du container doit etre en train de se faire a ce moment la.
5. Revenez sur la page de création de votre équipement, vous devriez avoir le detail de votre container sur le coté droit de la page.
image
6. Si vous le désirez, vous pouvez afficher les « logs Docker » qui vous indiquerons des logs de votre container.

Méthode 2 : Déployer le container avec Docker en mode Standalone :
Déployer et démarrer le container docker du projet eufy-security-ws a l’aide de la commande suivante :
docker run -it -e USERNAME=votreadresseemaileufy -e PASSWORD=votremotdepasseeufy -e COUNTRY=FR -e LANGUAGE=fr -p 3000:3000 bropat/eufy-security-ws

Suite de la procédure commune aux 2 méthodes :

  1. Installer le plugin « Script » officiel présent sur le market Jeedom

  2. Installer le client WebSocket sur votre Jeedom a l’aide de la commande suivante :

pip3 install websocket-client
OU (en foncton de l’os de votre serveur)
pip install websocket-client

  1. Se placer dans /var/www/html/data et créer un fichier permettant de récupérer les informations de votre environnement Eufy :

get-eufyinfo.py

import json
from websocket import create_connection
ws = create_connection("ws://ADRESSEIPDOCKER:3000")
print(ws.recv())
ws.send(json.dumps({"command": "start_listening"}))
print(ws.recv())
ws.close()
  1. Exécuter le fichier créer précédemment

python3 get-eufyinfo.py

Vous devriez avoir un retour sur « 2 » lignes :


La première ligne contient quelques infos lié a la librairie en guise d’acquittement de la connexion, la seconde ligne contient les infos liés a votre environnement (Nom, numéro de série, modèle etc.)
Conserver temporairement le résultat dans un notepad et récupérez le numéro de série « serialNumber », il servira pour la suite des commandes.

  1. Créer un script par fonction que vous souhaitez exécuter.

Par exemple passer en mode « Absent » :
set-eufyaway.py

import json
from websocket import create_connection
ws = create_connection("ws://ADRESSEIPDOCKER:3000")
print(ws.recv())
ws.send(json.dumps({"command": "station.set_property", "serialNumber": "VOTRENUMERODESERIEDESTATION", "name": "guardMode", "value": "0"}))
print(ws.recv())
ws.close()

Même exemple mais pour passer en mode « A la maison » :
set-eufyhome.py

import json
from websocket import create_connection
ws = create_connection("ws://ADRESSEIPDOCKER:3000")
print(ws.recv())
ws.send(json.dumps({"command": "station.set_property", "serialNumber": "VOTRENUMERODESERIEDESTATION", "name": "guardMode", "value": "1"}))
print(ws.recv())
ws.close()

Dans la continuité de ces exemples, voici les autres modes d’alarmes :

Absent = 0
A la maison = 1
Désarmé = 63
Planifié = 2
Géolocalisé = 47
CUSTOM1 = 3
CUSTOM2 = 4
CUSTOM3 = 5

Autre exemple, changer l’état d’une caméra pour l’arrêter :
set-eufycamera1stop.py

import json
from websocket import create_connection
ws = create_connection("ws://ADRESSEIPDOCKER:3000")
print(ws.recv())
ws.send(json.dumps({"command": "device.set_property", "serialNumber": "VOTRENUMERODESERIEDELACAMERA","name": "enabled","value": "false"}))
print(ws.recv())
ws.close()

Même exemple mais pour l’activer :
set-eufycamera1start.py

import json
from websocket import create_connection
ws = create_connection("ws://ADRESSEIPDOCKER:3000")
print(ws.recv())
ws.send(json.dumps({"command": "device.set_property", "serialNumber": "VOTRENUMERODESERIEDELACAMERA","name": "enabled","value": "true"}))
print(ws.recv())
ws.close()
  1. Ajouter le chemin de chaque script dans le plugin Scripts de Jeedom afin de pouvoir les utiliser. Ca devrait ressembler a ça :
    /usr/bin/python3.7 /var/www/html/data/NOMDEVOTRESCRIPT.py &

Voila, vous n’avez plus qu’a créer des virtuel ou des scenario pour que vos scripts s’exécutent.

Je suis preneur de vos remarques pour améliorer ces explications si nécessaires.
Pour ceux qui souhaitent approfondir les possibilités, la doc de la librairie se trouve ici (support du 2FA etc.) : eufy-security-ws - Small wrapper around eufy-security-client library to access it via a WebSocket et pour ma part je réalise mes tests avec Postman.
La liste du matériel supporté est disponible ici : eufy-security-client - A shared library to control Eufy Security devices

Cette méthode a pour intérêt :

  • D’être totalement maintenu tant du coté du client WebSocket en python que du coté de la librairie eufy-security-ws
  • D’avoir des fonctions qui n’était pas accessible avec les solutions indiqués par le passé
  • Moins de dépendances dans votre Jeedom

En ce qui concerne les inconvénients :

  • Le principal est qu’il faut faire tourner un container pour que la solution soit fonctionnelle

Et j’en profite pour indiquer que si des gens sont motivés pour bosser sur un plugin, vous etes les bienvenus :stuck_out_tongue:

Bonne soirée :slight_smile:

Dépannage :

Le container ne voit pas ma Homebase

  • Vérifier que votre serveur Docker est bien sur le même réseau que votre Homebase. Si vous possédez un routeur ou un point d’accès WiFi configuré en mode routeur et que vos équipements sont sur 2 réseaux différents cela peut générer des problèmes de flux entre les 2 réseaux. De manière générale évitez d’utiliser des routeurs/point d’accès en mode routeur si vous n’avez pas de bonnes connaissance en routage/flux entre 2 réseau. N’hesitez pas a faire des ping/traceroute depuis docker vers votre HomeBase pour avancer le diagnostique.

Lors de la création du container vous obtenez « Core Dumped » et vous utilisez Raspbian :

  • La création du container nécessite des privilèges plus élevé
    Il faut ajouter l’argument –privileged lors de la création du container
-d --privileged --name Eufy-WS -e USERNAME=votreadresseemaileufy -e PASSWORD=votremotdepasseeufy -e COUNTRY=FR -e LANGUAGE=fr -p 3000:3000 bropat/eufy-security-ws

La connexion a l’environnement Eufy ne se fait pas (un captcha est demandé) (Réalisé avec Postman )

  • Exemple :
{"command": "start_listening"}
{"command": "set_api_schema", "schemaVersion": "7"}
{"command": "driver.connect"}
  • A ce moment la le serveur réponds avec une image encodée en base64 ainsi que le captcha id.
    Il faut la convertir via n’importe quel convertisseur en ligne puis renvoyer la réponse.

  • Par exemple
    {"command": "driver.set_captcha", "captchaId": "e45aa3cd-353c-4a96-8885-1595db28e2e2", "captcha": "3DQF"}

3 « J'aime »

Bonjour
Enfin une seconde personne en plus de Benoit50 qui s’intéresse à ses supers cameras Eufy.
Le sujet est très intéressant mais très complexe pour un débutant.
J’ai une jeedom smart + 4 cameras Eufy.
Je souhaite par la détection de présence des personnes les passer en mode absent ou mode « A la maison ».
Peux tu me guider stp et cela servira à d’autres.
Tu indiques
Déployer et démarrer le container docker du projet eufy-security-ws a l’aide de la commande suivante
comment fais tu cela ? Est ce que tu télécharges dans le Market de Jeedom le plugin Docker developpé par Tag ?
Peux tu expliquer ?
Merci par avance
Jluc

1 « J'aime »

Salut,
Ca m’avait traversé l’esprit d’adapter mon post a ce plugin en ce qui concerne la partie Docker mais la 4.2 n’étant pas encore en stable, j’ai préféré donné une première possibilité qui pourra s’appliquer au plus de monde. Une fois la 4.2 en stable je pourrais refaire un passage pour détailler l’utilisation du plugin docker. D’ailleurs il ne s’agit pas du plugin Docker développé par Tag mais de celui-ci dont je parle : Plugin Docker – Jeedom – Le Blog
Pour ma part j’ai une machine virtuelle sur mon serveur Proxmox avec docker installé, j’ai donc déployé mon container dans celle-ci.
Je pense que dans ton cas il vaut mieux attendre la 4.2, ou alors accepter de passer sur la béta pour pouvoir utiliser le plugin Docker puis déployer le container eufy-security-ws.

Pour ceux qui serait intéressés et souhaite en parler de manière un peu plus interactive, je suis également dispo sur le discord Jeescord.

Bonjour !

Ce sujet m’intéresse beaucoup !:slight_smile:

est-ce que vous avez réussi à lancer ce type de commande :


(présent dans la documentation).

J’ai systématique un message « unknown_command » …
Par contre le start_listening marche sans soucis.

Merci :slight_smile:

Salut,

Meme probleme chez moi avec les 3 commandes start,stop et status : unknown_command :frowning:
Je viens d’ouvrir une issue sur le gthub de bropat : https://github.com/bropat/eufy-security-ws/issues/86

Bonjour,

pardonnez mon ignorance mais qu’est ce qu’un docker?
J’ai une eufy doorbell et je sougaiterai l’integer à Jeedom qui est installé sur mon RPi3b+

Bonjour,

Pas de soucis mais plutôt que de t’expliquer, je t’invite a regarder cette courte vidéo (3 min) pour comprendre, ça sera plus simple que si je me lance dans des explications écrites. :grin:

Merci d’avoir présenté cette nouvelle approche !

J’utilisais jusqu’à présent « l’ancienne » version qui fonctionnait mais avec quelques problèmes :

  • manque de fiabilité : mon scénario lancait le meme changement de mode plusieurs fois avec des sleep entre temps pour réduire les risques d’échec.
  • possibilité de modifier l’état de la homebase mais pas celui des autres cameras (j’ai aussi 3 pan&tilt).

Bref, c’est avec joie que j’ai découvert ta thread sur cette nouvelle approche. J’ai mis en place docker que je ne connaissais pas (j’ai installé portainer sur une KVM Proxmox).
Tout a fonctionné du premier coup et maintenant je peux commander l’ensemble des caméras avec un script qui semble plus fiable (à confirmer dans quelques jours) et maintenu.

A noter pour ceux qui auraient l’erreur suivante :
Erreur exécution de la commande [Système][Eufy2][TousAbsents] : Erreur sur python /var/www/html/plugins/script/data/set-eufyallaway.py 2>&1 valeur retournée : 1. Détails : Traceback (most recent call last): File « /var/www/html/plugins/script/data/set-eufyaway.py », line 2, in from websocket import create_connection ImportError: No module named websocketsaisissez ou collez du code ici

Je pense l’avoir réglée avec ceci :

pip install websocket-client
1 « J'aime »

Merci !
J’ai vu la réponse qui nous aide pas beaucoup…

Par contre j’ai trouvé un truc intéressant.
En se connectant sur le docker où est présent le serveur, on peut exécuter une parti cliente.

sudo docker exec -it « docker_name » /bin/sh

node /usr/src/app/dist/bin/client.js

on obtient un prompt intéressant:

on peut lancer des commandes :slight_smile:
pour ma part, j’ai toujours une erreur sur ma caméra pour le livestream, mais avec ça je pense pouvoir ouvrir une issue. J’ai pas d’autre caméra pour tester.
image

je reçois également les événements (ici j’ai allumé la lumière de la caméré depuis l’application), puis essayé de faire un set_property depuis le prompt, et la lumiere s’est bien allumé.

A suivre donc, mais si on arrive à réutiliser ce client.js pour lire les événements et pousser des commandes on devrait pas être trop mal

Oui malheureusement je m’y attendais a sa réponse sans plus d’explications…
De mon coté j’ai plutôt l’impression que c’est un problème de version de schéma car la commande n’est normalement pas dispo avec la version 0.
Du coup j’ai essayé avec des versions plus élevés mais j’ai toujours la même erreur malgré le résultat m’indiquant que j’ai bien changé de version :

import json
from websocket import create_connection
ws = create_connection("ws://192.168.1.42:3000")
print(ws.recv())
ws.send(json.dumps({"command": "set_api_schema", "schemaVersion:": "4"}))
print(ws.recv())
ws.send(json.dumps({"command": "device.start_livestream", "serialNumber": "T811XXXXXXXX"}))
print(ws.recv())
ws.close()

Ce qui donne :

root@Sandbox:~# python3 start-livestream.py 
{"type":"version","driverVersion":"1.6.6","serverVersion":"0.8.4","minSchemaVersion":0,"maxSchemaVersion":9}
{"type":"result","success":true,"result":{}}
{"type":"result","success":false,"errorCode":"unknown_command"}

Bonjour
Je suis passé en 4.2.
J’ai télécharger le plugin Docker mais … que faire ensuite ?
Un de vous aurait le temps de faire un pas à pas pour tous les possesseurs d’Eufy qui ne maitrise pas la programmation. Une sorte de Tuto avec les différentes étapes.
Je sais que cela prend du temps mais ce serait tellement utile.
Merci par avance à celui qui va le proposer.

J’ai maj le tuto dans le premier post pour prendre en compte le plugin Docker de Jeedom dispo depuis la 4.2.

Bonsoir
Un grand merci pour ton complément sur le tuto.
Je bloque ou du moins j’ai besoin de précisions
Tu écris

point 3 : Installer le client Websocket" est ce qu’il faut passer par puTTy et lancer cette commande sachant que je suis en jeedom smart et pas sur un serveur ?

point 4 tu indiques de ce placer dans un repertoire. Je vais passer par JeeXplorer. Là créer un fichier get -eufyinfo.py, comment fais tu avec le notepad ?

point 6 là je suppose que tu crées un script à l’aide du plugin ou est ce que tu fais aussi avec le notepad. Si c’est avec le plugin je ne vos pas où tu rentres les commandes import json from socket …

Je te remercie par avance pour ton retour.
Jluc

Pas de réponse :disappointed:
Merci

Salut,

Il n’y a pas qu’une seule manière de faire pour réaliser les actions des points que tu cites. Je vais t’indiquer ma manière de faire :

Etape 3 : Se connecter a Jeedom en SSH (via Putty par exemple) et executer la commande pip3 install websocket-client
OU (en foncton de l’os de tonserveur)
pip install websocket-client

Etape 4: J’ai pas pour habitude d’utiliser Jeexplorer, pour ma part je le fais en SSH (sous putty par exemple) avec les commandes suivantes :
cd /var/www/html/data
nano get-eufyinfo.py
Puis coller le bout de script (import json…), sauvegarder et quitter l’editeur (ctrl + x de mémoire)

Etape 6 : Dans le plugin script il faut creer un nouvel équipement, l’activer puis dans l’onglet commandes, renseigner le chemin de python ainsi que le script voulu.
Ca doit donner quelque chose comme ça :

T’es au top. J’essaie ça ce week-end.
Merci encore

1 « J'aime »

Bonjour
Peux tu m’aider je bloque au point 5.
J’ai


As tu une idée ?
Merci par avance
Jluc

Dans le code il faut indiquer l’adresse ip de ton serveur Docker/Jeedom sur la ligne suivante :
ws = create_connection("ws://ADRESSEIPDOCKER:3000")

Par exemple :
ws = create_connection("ws://192.168.1.33:3000")

Merci pour ton message. Toujours pas réussi et pourtant cela m’intéresse fortement.
Tout début à l’origine (il y a 5-6 jours) je mettais tromper de mot de passe Eufy. Je ne sais si cela est lié ou non. Quand je repars dans le docker management pour être sûr qu’il est bien crée et que j’efface le docker Eufy-Ws. Si je fais synchronisé il réapparait … donc même en supprimant il est toujours là. Donc même si j’en refais un il y a déjà le précédent.

J’ai continué les autres étapes et j’ai quand je lance


donc il ne me donne pas le numéro de série.
Bilan je suis bloqué.

Si je repars dans le docker j’ai ça quand je regarde les logs


cela me parait pas trop normal.

Tellement dégouté j’ai refais une restauration système en 4.1 puis passage en 4.2 puis installation docker management et à nouveau création Eufy-Ws mais mes paramètres sont réapparus … donc même en restauration je pense que le docker est toujours présent.

NOTE je viens de supprimer l’authentification à double facteur pour ne pas avoir le message
Je ne sais plus quoi faire pour m’en sortir 2FA
Une idée encore ?
Merci

J’ai finalement réussir par y’arriver a force d’imposer une version de schéma (je fais mes tests dans PostMan).
set_api_schema :

{
    "command": "set_api_schema",
    "schemaVersion": 6
}

puis start_livestream :

{
    "command": "device.start_livestream",
    "serialNumber": "T8113NXXXXXXXX"
}

et la j’ai les retours suivants qui s’enchainent (un bloc par message reçu) :

{
    "type": "result",
    "success": true,
    "result": {}
}

… des messages peu intéréssant puis…

{
    "type": "event",
    "event": {
        "source": "device",
        "event": "command result",
        "serialNumber": "T8113NXXXXXXXX",
        "command": "start_livestream",
        "returnCode": 0,
        "returnCodeName": "ERROR_PPCS_SUCCESSFUL"
    }
}
{
    "type": "event",
    "event": {
        "source": "device",
        "event": "livestream started",
        "serialNumber": "T8113NXXXXXXXX"
    }
}

Puis une quantité de message avec des data au format TXT qui doivent représenter le flux audio/vidéo j’imagine :

Jusqu’à ce que je stoppe le stream :

{
    "command": "device.stop_livestream",
    "serialNumber": "T8113NXXXXXXXX"
}

Voila pour l’avancement mais je ne sais pas quoi faire de plus pour l’instant avec ces retours :laughing:

Edit : l’alternative serait d’activer le RTSP sur les cam puis de faire :

{
    "command": "device.start_rtsp_livestream",
    "serialNumber": "T8113NXXXXXXXX"
}
{
    "command": "device.stop_rtsp_livestream",
    "serialNumber": "T8113NXXXXXXXX"
}

Puis de récupérer le flux sous Jeedom en rtsp via l’adresse rtsp://192.168.1.X/live0 .
Par contre aucune idée de la gestion de la batterie si la commande stop ne passe pas ou un problème du genre…