URL: https://linuxfr.org/users/foue/journaux/collectd-et-mqtt
Title: collectd et MQTT
Authors: foué
Date: 2025年11月29日T14:43:52+01:00
License: CC By-SA
Tags:
Score: 14
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](https://mqtt.org/) 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](https://openwrt.org/) et mon contrôleur domotique par [Home Assistant](https://www.home-assistant.io/).
Et ça semble bien tomber, OpenWrt et Home-Assistant supportent tous les deux MQTT :
* openwrt avec `collectd` et son extension mqtt,
* homeassistant avec [mosquitto](https://mosquitto.org/).
# Installation
Côté openwrt il faut installer les paquets `collectd`, `collectd-mod-mqtt` et `collectd-mod-exec`. Soit en clic-clic depuis [Luci](https://openwrt.org/docs/guide-user/luci/luci.essentials) 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` :
```conf
[...]
LoadPlugin exec
Exec "nobody" "/usr/bin/presence.sh"
[...]
```
Il faut aussi configurer collectd pour charger le plugin et envoyer les statistiques sur mqtt :
```conf
LoadPlugin mqtt
Host "homeassistant.chez_moi.org"
Port 1883
User "mon_utilisateur"
Password "mon_mot_de_passe"
Qos 0
[...]
```
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 :
```bash
#!/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//\" 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` :
```conf
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.