[tuto] Monitorer son domicile avec jeedom et grafana

Objectif:
Installer Grafana, Influxdb, le pont jeedom-Influxdb, le tout dans un environnement sous centOS

Pré-requis:
Une installation fonctionnelle de jeedom
Une machine virtuelle tournant sous centOS
Si besoin d'avoir lu mon précédent papier

Je vous propose un bon vieux tuto de barbu pour grapher tout ce qui est doté d'un capteur chez vous, et dont les infos remontent dans Jeedom. Jeedom n'est pas trop mal foutu de ce point de vu là, mais je cherchais à aller plus loin, ou plutôt je cherchais à utiliser un outil fait pour cela, je veux parler de grafana. 

Pourquoi CentOS plutôt qu'une classique Debian? Ma précédente installation était une .deb en version 8, et à l'heure de la monté en version je me suis dit que c'était plutôt l'occasion d'essayer quelque chose de nouveau, ainsi que d'investir dans un système avec mise à jour de sécurité de juste 10 ans!

Pour ce tuto: je propose d'installer grafana avec docker qui est la manière que je trouve la plus fiable, et d'installer Infludb à partir des dépôts RHEL. À vous d'adapter à vos préférences personnelles.

Cela posé, il est temps de faire chauffer votre terminal préféré.

Ajout des dépôts et des pré-requis nécessaires

~$ yum -y update
~$ yum install epel-release
~$ yum -y groupinstall development
~$ yum -y update
~$ yum -y install python36
~$ yum -y install python-pip
~$ pip3 install --upgrade pip
~$ pip3 install influxdb

Installation de Docker

~$ yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
~$ yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
~$ yum install docker-ce
~$ systemctl enable docker
~$ systemctl start docker
~$ systemctl status docker

Installation de Grafana

~$ docker volume create grafana-storage
~$ docker run \
--restart always \
-d \
-p 3000:3000 \
--name=grafana \
-v grafana-storage:/var/lib/grafana \
-e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource" \
grafana/grafana
~$ firewall-cmd --permanent --zone=public --add-port=3000/tcp

Installation de Influxdb

~$ cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
~$ yum install influxdb
~$ firewall-cmd --permanent --zone=public --add-port=8086/tcp
~$ firewall-cmd --permanent --zone=public --add-port=8083/tcp
~$ firewall-cmd --reload
~$ systemctl enable influxdb.service
~$ service influxdb start
~$ curl -XPOST -u jeedom:jeedom 'http://localhost:8086/query' --data-urlencode 'q=CREATE DATABASE "jeedom"' 

# Ce curl permet la création d'une base de donnée jeedom avec pour nom d'utilisateur jeedom et mot de passe jeedom. Ces informations seront à renseigner dans le "data source" de grafana.

Installation du script faisant le pont jeedom-influxdb

~$ cd /PATH/ 
~$ mkdir Bridge_Jeedom_InfluxDB
~$ cd Bridge_Jeedom_InfluxDB
~$ wget https://github.com/neuhausj/JeedomTools/raw/master/Bridge_Jeedom_InfluxDB.py
~$ yum install nano
~$ nano Bridge_Jeedom_InfluxDB.py

# Je vous renvoie à mon précédent article pour conf ce script.

~$ firewall-cmd --zone=public --add-port=1234/tcp --permanent
~$ firewall-cmd --reload

Cette commande vous permettra de lancer le script afin de savoir si tout fonctionne:

~$ /usr/bin/env python36 Bridge_Jeedom_InfluxDB.py &

Si c'est le cas, voici venu le temps de systemd ce script:

~$ nano /lib/systemd/system/Bridge_Jeedom_InfluxDB.service
[Unit]
Description=Bridge_Jeedom_InfluxDB.service
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python36 /PATH/Bridge_Jeedom_InfluxDB/Bridge_Jeedom_InfluxDB.py

[Install]
WantedBy=multi-user.target
~$ systemctl enable Bridge_Jeedom_InfluxDB.service

Exemples d'utilisation et de mises en graph

Pour examiner tout ça en meilleure qualité, c'est par ici.
L'écran tourne grace à un pi en mode kiosque: une raspbian qui lance la page grafana au démarrage, et avec toutes les opérations du navigateur en RAM afin de ne pas solliciter plus que de raison la sd. L'écran se déclenche à la capture d'un mouvement dans cette pièce qui appelle alors une commande ssh sur le pi:

~$ display_power-on
~$ display_power-off

Sources

http://vmkdaily.ghost.io/influxdb-and-grafana-on-centos/
https://hub.docker.com/r/grafana/grafana/
https://www.jeedom.com/forum/viewtopic.php?f=31&t=15209
https://docs.influxdata.com/influxdb/v1.5/tools/api/#write
https://www.rosehosting.com/blog/how-to-install-pip-on-centos-7/
https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce
https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-centos-7
https://www.hivelocity.net/kb/how-to-install-pip-on-centos-7/
https://www.liquidweb.com/kb/enable-epel-repository/
https://www.liquidweb.com/kb/how-to-install-pip-on-centos-7/

À plus les barbus! 

11 commentaires

edgd

Bonjour,

Je viens de tomber sur ton tuto, et c'est exactement ce que je voulais faire. Merci :)
J'ai une question cependant, j'ai un raspberry PI2 qui heberge la bdd mysql et jeedom ( tout est dockerisé, ou va l'être ). Est ce que les containers dockers nécéssaires ne seront pas trop lourds pour ce PI ? a défaut, penses tu que cela fonctionnera correctement sur un pi3 ?

propositionjoe

Salut,
Et tout d'abord mes félicitations pour ton projet, moi j'en suis super content!

Ensuite pour tes interrogations matérielles:
J'aurais tendance à dire qu'a priori l'association jeedom + sql + infludb + grafana demande trop de ressource à un pi2.
Mais ça dépend aussi de tes exigences / de ta tolérance à la latence / du nombre de capteur dont tu disposes / de la complexité de tes scénarios.
Tu peux tester pour te faire ton avis.

Mais si jamais, puisque tu parles d'acquérir un pi3:
Je te propose de migrer jeedom sur le pi3,
Et d'utiliser le pi2 pour grafana et influxdb.
Ainsi tu ne sur-solliciteras pas ton matériel;
Mais surtout tu n'encombreras pas ton jeedom avec d'autres installations
(en cas de pépins de sd ou autre, tu n'auras pas à tout réinstaller, un backup et c'est fini).
>> dans ces moments-là la simplicité est toujours la meilleure alliée!

À+

savfab

Bonjour,

j'essaie désespéramment de faire fonctionner : jeedom + influxbd + grafana mais je bloque sur une erreur sur jeedom :

Erreur push sur : http://192.168.0.5:1234/updateData?name=Humidit%C3%A9&cmd_id=182&val=43.14&location=salon => Echec de la requête HTTP : http://192.168.0.5:1234/updateData?name=Humidit%C3%A9&cmd_id=182&val=43.14&location=salon cURL error : Failed to connect to 192.168.0.5 port 1234: Connection refused

Pourtant, dans le fichier Bridge_Jeedom_InfluxDB.py tout es correctement configuré :
le user a été créé sur influxdb et renseigné dans le fichier
la base de données a aussi été renseigné et créé sur influxdb

j'ai tout essayé. Merci d'avance pour ceux qui passe par içi et qui pourrait m'éclairer. Merci.

propositionjoe

Salut,
Tu vas y arriver, c'est surement un truc tout bête.
J'ai besoin de plusieurs infos:
- Que se passe-t-il quand tu fais la requête du push url dans ton navigateur " http://192.168.0.5:1234/updateData?name=Humidit%C3%A9&cmd_id=182&val=43.14&location=salon "
- Que te renvoie la commande " systemctl status Bridge_Jeedom_InfluxDB.service "
- Mais avant tout: tu as mis humidité OU humidite dans ton url?
Bon courage!

savfab

Bonjour,

merci pour votre retour. Je vais tenter de répondre à toutes vos questions :
J'ai effectivement changé le nom des libellés car ils avaient des accents (humidité et température).

ainsi l'url lancé :
http://192.168.0.5:1234/updateData?name=Humidite&cmd_id=209&val=55.7&location=salon2

et dans le fichier Bridge_Jeedom_InfluxDB.py, j'ai ajouté une trace et voici le retour :

[{'time': 1529917779715450112, 'measurement': 'Humidite', 'tags': {'lieu': 'salon2'}, 'fields': {'value': 55.7}}]


pour la commande "systemctl status Bridge_Jeedom_InfluxDB.service", voici ce que ca me retourne :

root@raspberrypi:~# systemctl status Bridge_Jeedom_InfluxDB.service
● Bridge_Jeedom_InfluxDB.service
Loaded: loaded (/lib/systemd/system/Bridge_Jeedom_InfluxDB.service; disabled; vendor preset: enabled)
Active: inactive (dead)

a quoi ca sert ?

merci encore pour ton aide. C'est sympa.

savfab

Bonjour,

suite de l'analyse, j'ai donc modifié les libellés (supprimé tous les accents).
Petite précision, je n'arrive pas à le lancer avec le service. Je le lance manuellement :

python3 Bridge_Jeedom_InfluxDB.py &

Je n'ai plus d'erreur sur jeedom, les traces montrent que les valeurs sont bien envoyées au script :

[{'measurement': 'Temperature', 'fields': {'value': 21.63}, 'tags': {'lieu': 'salon'}, 'time': 1529928889905808384}]
[{'measurement': 'Humidite', 'fields': {'value': 56.31}, 'tags': {'lieu': 'salon'}, 'time': 1529928891040676864}]

mais par contre, quand je me connecte sur influxdb en ligne de commande, je sélectionne la bdd mesures, je fais un select * from mesures mais je n'ai toujours pas de résultat.

là je bloque.
Merci pour votre analyse.

propositionjoe

Salut,

Si j'ai bien compris le pont à l'air de fonctionner (la page web ne t'affiche pas d'erreur?),
Dans ce cas, si aucune donnée ne remonte dans infludb ou grafana, c'est qu'il y a un soucis.
Vérifie que tu as bien renseigné les infos d'infludb dans le script.

En outre pour systemd (ça permet au script de se lancer tout seul au démarrage), teste de faire:
systemctl stop Bridge_Jeedom_InfluxDB.service
systemctl start Bridge_Jeedom_InfluxDB.service
systemctl status Bridge_Jeedom_InfluxDB.service

Si ça ne fonctionne toujours pas, vérifie le PATH (le lieu où tu dis qu'est le script):
ExecStart=/usr/bin/python36 /PATH/Bridge_Jeedom_InfluxDB/Bridge_Jeedom_InfluxDB.py

savfab

Bonjour,

en effet, je n'ai pas d'erreur quand je le fais via mon navigateur (et je vois même les traces sous linux).
Pour la config du fichier script, j'ai bien fait attention à tous renseigner :
INLUXDB_SERVER_IP = '192.168.0.5'
INLUXDB_SERVER_PORT = 8086
INFLUXDB_USERNAME = 'temp'
INFLUXDB_PASSWORD = '123456'
INFLUXDB_DB_NAME = 'mesures'

la bdd mesures a été créée sur influxdb ainsi que le user temp avec tous les droits.

partie du script [...]
client.write_points(req)
print(req)
return
[...]
j'ai ajouter la ligne "print(req)" après "client. .... " pour visualiser la commande envoyée depuis jeedom.

Sais-tu s'il est possible d'afficher le retour de la ligne " client.write-points(req) " ?

pour le service :


root@raspberrypi:~# systemctl status Bridge_Jeedom_InfluxDB.service
● Bridge_Jeedom_InfluxDB.service
Loaded: loaded (/lib/systemd/system/Bridge_Jeedom_InfluxDB.service; enabled; vendor preset: enabled)
Active: inactive (dead)

je parviens à installer le service, mais impossible de le démarrer. il reste en inactive.
quand le lance la commande : systemctl start Bridge_Jeedom_InfluxDB.service, il reste bloqué et il ne se passe rien.

voici le contenu de mon script service (j'utilise python3 et non python36) :

Unit]
Description=Bridge_Jeedom_InfluxDB.service
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python3 /root/Bridge_Jeedom_InfluxDB.py

[Install]
WantedBy=multi-user.target

Je ne sais plus quoi faire. J'ai peur de devoir abandonné après plusieurs semaine de recherche.
A moins qu'il existe une autre méthode !?

merci beaucoup.

savfab

Bonsoir,

sans réponses de votre part, j'en conclue que vous n'avez peut-être pas de solution.
Je vais tout de même persévérer.

Merci.

propositionjoe

Salut,
Effectivement je ne sais pas comment t'aider davantage.
Le tuto est basé sur centos, tu sembles être sous debian.
Parfois repartir de 0 avec une installation toute fraîche permet d'y voir plus clair.
Bon courage

savfab

Bonjour,

merci pour votre retour.
Je suis prêt à tous recommencer afin de résoudre ce problème.
Pouvez-vous me dire les différences les plus importantes entre centos et debian ?
Existe-t-il un tuto en francais pour l'installation ?

en vous remerciant.
cdlt.

Fil RSS des commentaires de cet article

Écrire un commentaire

 Se rappeler de moi sur ce site