Journal collectd et MQTT

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
9
29
nov.
2025

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 collectd et 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.