Avant toute chose merci de (re)prendre connaissance de la charte et de la respecter.
Pour résumer :
- Avant de poser une question, je cherche si la réponse existe
- Je suis poli, courtois et je respecte tout un chacun sur le forum
- Si un post m'agace : je m'en éloigne plutôt que de répondre d'une façon qui pourrait être mal interprétée


Il n'est jamais du luxe que de rappeler des choses simples :
Courtoisie, amabilité, politesse et bonne humeur sont les maîtres mots pour un forum sympathique, bienveillant et accueillant :)

Toute la communauté vous remercie

[DEPRECATED] Intégration basique du portier GrandStream GDS3710 dans Jeedom

Cette partie est dédiée à la programmation sur le logiciel JEEDOM
ripleyxlr8
Timide
Messages : 111
Inscription : 27 sept. 2016, 17:50
Localisation : 95

[DEPRECATED] Intégration basique du portier GrandStream GDS3710 dans Jeedom

Message par ripleyxlr8 » 08 nov. 2018, 18:36

EDIT : Un plugin a été publié sur le market et un nouveau topic a été créée. Bon test à tous.

viewtopic.php?f=134&t=40780



Bonjour à tous,

J'ai installé récemment un portier GDS3710 de chez GrandStream. Je n'ai rien à redire sur ce portier, la qualité vidéo est très bonne, la fiabilité est excellente, et il dispose de plein de fonction utiles. Un seul point noir, son intégration à Jeedom.....

http://www.grandstream.com/products/phy ... ct/gds3710

Pour info, ma version du firmware est la : 1.0.4.5

Il existe une API pour gérer le portier et qui est très bien documentée mais celle ci ne permet que de configurer le portier et de récupérer les flux vidéo mais pas de récupérer les évènement en push. Ma priorité était plutôt de récupérer les différents évènements (sonnerie, ouverture de porte, swipe d'une carte, entrée d'un code, etc....) pour pouvoir les traiter dans Jeedom.

Pour faire cela j'utilise une fonction intégrée (Event Notification) au GDS3710 qui permet d'envoyer une requête http ou https vers un serveur de notre choix. (on peut même intégrer une authentification si on le souhaite). Le corps de la requête contient alors une chaine que l'on peut personnaliser et qui peut contenir les champs suivant :

${MAC} : MAC Address
${TYPE} : Event Type
${WARNING_MSG} : Event Message
${DATE} : Date & Time
${CARDID} : Card Number*
${SIPNUM} : Sip Number

Tout d'abord il faut activer le "Event Notification", en cochant la case 'Enable'. Ensuite on sélectionne le type HTTP et on rentre l'adresse IP et le port du serveur qui va recevoir les notification (vraisemblablement l'IP de votre Jeedom).

Avec les champs j'ai crée un bel objet JSON (on aurait pu faire du XML ou en n'importe quoi d'autre) avec lequel on va renseigner le champs URL TEMPLATE :

Code : Tout sélectionner

{"mac":"${MAC}","content":"${WARNING_MSG}","type":"${TYPE}","date":"${DATE}","card":"${CARDID}","sipnum": "${SIPNUM}"}
Voila, c'est tout pour la config du GDS3710, on sauvegarde et on passe maintenant à la config du serveur.

Image

A l'origine, Je voulais utiliser le plugin Script pour récupérer le corps de la requête en PHP et ensuite de déclencher des évènements mais hélas je n'arrive pas a récupérer le corps de la requête. (voir ce post viewtopic.php?t=40595). J'ai donc écris un petit service en python qui lance un serveur web qui récupère le corps de la requête envoyée par le GDS3710 et qui l'envoie en JSON à Jeedom en utilisant le protocole MQTT. Une fois que vous l'avez récupéré dans MQTT et parsé, à vous d'en faire ce que vous voulez....

Voici le code Python du serveur à placer dans /usr/bin/gds3710tomqtt.py (je vous laisse personnaliser les 5 variables du début du script en fonction de votre installation) :

IMPORTANT : Installez les dependance : python3 (pour le HTTPServer) et paho.mqtt pour le client MQTT.

Code : Tout sélectionner

#!/usr/bin/python3

from http.server import HTTPServer, BaseHTTPRequestHandler
import urllib.request
import os, ssl
import paho.mqtt.client as mqtt
import logging
from io import BytesIO

ipServerMqttJeedom='192.168.100.18'
ipHttpServer='192.168.100.18'
portHttpServer=8000
mqttClientName='GDS3710'
mqttTopicName='GDS3710'

version='0.1'

logging.basicConfig(filename='/var/log/gds3710tomqtt.log',level=logging.DEBUG, format='%(asctime)s : %(message)s', datefmt='%d/%m/%Y %I:%M:%S %p')
logging.debug('Starting the GDS3710 to MQTT Service')

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self): # Les requêtes transmises par le GDS3710 sont de type POST
        content_length = int(self.headers['Content-Length']) # On récupère la longueur du BODY
        body = self.rfile.read(content_length) #On récupère la BODY de la requête
        self.send_response(200)
        self.end_headers() # On répond au GDS3710 que tout s'est bien passé
        data = body.decode("utf-8").replace(" ", "")
        print(data) # On affiche les requête dans la sortie standard
        logging.debug(data) # On log les requêtes du GDS3710
        client = mqtt.Client(mqttClientName)
        client.connect(ipServerMqttJeedom)
        client.publish(mqttTopicName, data) # On se connecte au serveur MQTT en on envoie les données dans le topic demandé

if (not os.environ.get('PYTHONHTTPSVERIFY', '') and getattr(ssl, '_create_unverified_context', None)):
	ssl._create_default_https_context = ssl._create_unverified_context # Dirty workaround pour le SSL

httpd = HTTPServer((ipHttpServer, portHttpServer), SimpleHTTPRequestHandler)
print('Version '+ version  +' - GDS3710 to MQTT server is listening on : ' + ipHttpServer + ':' + str(portHttpServer))
httpd.serve_forever()
Pour vérifier que tout va bien faite un petit :

Code : Tout sélectionner

sudo python3 /usr/bin/gds3710tomqtt.py
vous devriez voir apparaître la ligne suivante :

Code : Tout sélectionner

Version 0.1 - GDS3710 to MQTT server is listening on : 192.168.100.18:8000
Si tout est bien configuré, quand vous cliquez sur le bouton test dans l'interface du GDS3710, vous devriez voir apparaitre la ligne :

Code : Tout sélectionner

 {"mac":"000B82BA82A2","content":"test"}
et en passant un appel depuis le GDS3710 vers votre telephone SIP vous devriez obtenir qqch du genre :

Code : Tout sélectionner

{"mac":"000b82ba82a2","content":"CallOutLog","type":"500","date":"2018-11-0817:55:51","card":"","sipnum":"6400"}
On va maintenant utiliser le plugin jMQTT dans Jeedom pour recevoir les messages renvoyés par notre serveur. Une fois le plugin installé passez le en mode inclusion et passez un appel depuis le GDS3710 vers votre téléphone SIP. L'objet GDS3710 devrait être automatique crée.

Image

Allez maintenant configurer les commandes de l'objet qui a été crée et activer la case parseJSON sur la commande qui a été crée automatiquement. Jeedom devrait alors vous créer 6 nouvelles commandes pour chaque valeur du JSON.

Image

Et voila, vous pouvez maintenant récupérer les évènements de votre GDS3710 sur votre Jeedom. Voici la liste des code type des évènements pour vous aider :

http://www.grandstream.com/sites/defaul ... _guide.pdf

On finalise l'installation on fournissant un fichier de description de service à Debian pour pouvoir gérer notre script comme un service.

Code : Tout sélectionner

sudo nano /lib/systemd/system/gds3710tomqtt.service
Puis on rempli le fichier avec le contenu suivant :

Code : Tout sélectionner

[Unit]
Description=GDS3710 to MQTT
After=multi-user.target
Conflicts=getty@tty1.service

[Service]
Type=simple
ExecStart=/usr/bin/python3 /usr/bin/gds3710tomqtt.py
StandardInput=tty-force

[Install]
WantedBy=multi-user.target
On recharge la liste des services :

Code : Tout sélectionner

sudo systemctl daemon-reload
On lance notre service GDS3710toMQTT:

Code : Tout sélectionner

sudo systemctl start gds3710tomqtt.service
Et on peut vérifier son status avec :

Code : Tout sélectionner

sudo systemctl status gds3710tomqtt.service

● gds3710tomqtt.service - GDS3710 to MQTT
   Loaded: loaded (/lib/systemd/system/gds3710tomqtt.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-11-08 18:28:03 CET; 3s ago
 Main PID: 28235 (python3)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/gds3710tomqtt.service
           └─28235 /usr/bin/python3 /usr/bin/gds3710tomqtt.py

nov. 08 18:28:03 jeedom.local systemd[1]: Started GDS3710 to MQTT.
et pour finir on lance notre service au démarrage avec :

Code : Tout sélectionner

sudo systemctl enable gds3710tomqtt.service
Et voila pour ce début d'intégration du GDS3710 dans Jeedom. N'hésitez pas a me donner vos commentaires / idées pour la suite.
Dernière édition par ripleyxlr8 le 14 nov. 2018, 10:49, édité 3 fois.

Avatar de l’utilisateur
sheep300
Actif
Messages : 1075
Inscription : 27 mai 2015, 23:27
Localisation : la rochelle

Re: Intégration (Basic) du GrandStream GDS3710 dans Jeedom

Message par sheep300 » 08 nov. 2018, 21:30

Je n'ai pas ce portier mais bravo pour ce travail bien documenté je pense que ça va en aider certains.

Envoyé de mon Mi MIX 2S en utilisant Tapatalk

Damien

Avatar de l’utilisateur
fwehrle
Actif
Messages : 2525
Inscription : 01 juil. 2015, 11:03
Localisation : Strasbourg

Re: Intégration basique du portier GrandStream GDS3710 dans Jeedom

Message par fwehrle » 09 nov. 2018, 11:44

Merci pour le boulot..
Ca va surtout donner envie a certain d'acheter le portier! :)
Ca vaudrait presque le coup de développer un plugin qui intègre le serveur.
Jeedom 3 sur Debian 9 en VM Proxmox 5 sur NUC Intel.
(Anciennement sur Docker sur Syno DS-415+ / MariaDB / DSM 6)
Teleinfo / RFXCom / Stick ZWave / IPX / Serveur Traccar / Blea

ripleyxlr8
Timide
Messages : 111
Inscription : 27 sept. 2016, 17:50
Localisation : 95

Re: Intégration basique du portier GrandStream GDS3710 dans Jeedom

Message par ripleyxlr8 » 09 nov. 2018, 12:11

Pour le plugin c'est en cours.... livraison prévue rapidement je l'espère.

ripleyxlr8
Timide
Messages : 111
Inscription : 27 sept. 2016, 17:50
Localisation : 95

Re: [DEPRECATED] Intégration basique du portier GrandStream GDS3710 dans Jeedom

Message par ripleyxlr8 » 14 nov. 2018, 10:49

Un plugin a été publié sur le market et un nouveau topic a été créée. Bon test à tous.

viewtopic.php?f=134&t=40780

Répondre

Revenir vers « Développements sur Jeedom »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité