Bonjour,
hier j'ai voulu faire en sorte que mon routeur envoie des infos à mon contrôleur domotique.
Vu que j'ai méchamment galéré, je vous partage ça.
Protocole
D'après ce que j'ai pu lire à gauche et à droite, le protocole MQTT est le plus adapté à mon besoin, qui est d'envoyer très peu de données, et à une fréquence basse.
Là, par exemple, il s'agit de dire si les téléphones des hôtes de la maison sont connectés au wifi. Ça permet de détecter la présence des gens.
Mon routeur est motorisé par OpenWrt et mon contrôleur domotique par Home Assistant.
Et ça semble bien tomber, OpenWrt et Home-Assistant supportent tous les deux MQTT :
- openwrt avec
collectdet son extension mqtt, - homeassistant avec mosquitto.
Installation
Côté openwrt il faut installer les paquets collectd, collectd-mod-mqtt et collectd-mod-exec. Soit en clic-clic depuis Luci ou en se connectant en ssh sur la bécane.
Sur HA, il faut installer Mosquitto broker sur la page des modules complémentaires. C'est assez trivial.
Config côté collectd
C'est dans le fichier /etc/collectd.conf que ça se passe.
Il faut charger et exécuter un petit script sur le routeur. Ici /usr/bin/presence.sh :
[...]
LoadPlugin exec
<Plugin exec>
Exec "nobody" "/usr/bin/presence.sh"
</Plugin>
[...]
Il faut aussi configurer collectd pour charger le plugin et envoyer les statistiques sur mqtt :
LoadPlugin mqtt
<Plugin mqtt>
<Publish "service">
Host "homeassistant.chez_moi.org"
Port 1883
User "mon_utilisateur"
Password "mon_mot_de_passe"
Qos 0
</Publish>
</Plugin>
[...]
Vous aurez bien entendu préalablement configuré votre broker MQTT sur home-assistant. De ce côté, je ne vais pas m'épancher, ça marche tout droit.
Le script
Pour que les données soient envoyées par openwrt en mqtt sur le contrôleur domotique, il faut que le script sorte sur sa sortie standard quelque chose du style :
#!/bin/sh
HOSTNAME="router"
INTERVAL="${COLLECTD_INTERVAL:-15}"
# Convert INTERVAL to integer (strip decimals)
INTERVAL_INT="${INTERVAL%%.*}"
[...]
while sleep "$INTERVAL_INT"; do
[...]
echo "PUTVAL \"$HOSTNAME/<categorie>/<valeur>\" interval=$INTERVAL_INT N:$presence"
done
Pour adapter la sortie, il va vous falloir choisir categorie et valeur.
La catégorie peut être ce que vous voulez. Par contre, le champ valeur doit être listé dans la base de donnée des types ! C'est ce que j'ai peiné à trouver.
Par défaut, la bibliothèque de types se trouve dans /usr/share/collectd/types.db. Il vous suffit de choisir parmi tous les types listés dedans, ou alors d'en d'en rajouter un à vous.
Par exemple dans la ligne suivante, extraite de types.db :
gauge value:GAUGE:U:U
Le champ du script d'au dessus doit être remplacé par le mot gauge.
Voilà, j'espère que ça dépannera quelqu'un.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.