snmp2mqtt
Passerelle SNMP vers MQTT pour l'intégration Home Assistant. Ce script Python surveille les équipements réseau via SNMP et publie les données vers un broker MQTT pour une découverte automatique dans Home Assistant.
Fonctionnalités
- 🔧 Configuration YAML flexible : Tous les paramètres dans un fichier de configuration
- 📡 Support multi-équipements : Surveillez plusieurs périphériques réseau
- 🏠 Intégration Home Assistant : Découverte automatique des capteurs
- ⚡ SNMP asynchrone : Requêtes SNMP non-bloquantes pour de meilleures performances
- 🔄 Surveillance en temps réel : Mise à jour continue des métriques réseau
- 📊 Métriques réseau : Trafic entrant/sortant et statut des interfaces
Architecture
Composants principaux
- Client SNMP : Utilise
pysnmp.hlapi.asyncio
(version 7.x) pour la récupération asynchrone des données SNMP avecget_cmd
,SnmpEngine
etUdpTransportTarget
- Publisher MQTT : Utilise
paho.mqtt.client
pour publier les données vers un broker MQTT - Intégration Home Assistant : Génère la configuration de découverte automatique compatible avec Home Assistant MQTT Discovery
- Traitement des données : Convertit les valeurs des OID SNMP vers les types appropriés (int, bool) pour les capteurs Home Assistant
Installation
Prérequis
- Python 3.7 ou supérieur
- Accès réseau aux équipements SNMP à surveiller
- Broker MQTT accessible
Dépendances principales
- pysnmp >= 7.0.0 : Bibliothèque SNMP avec nouvelle API asynchrone
- paho-mqtt >= 2.0.0 : Client MQTT pour la communication avec le broker
- PyYAML >= 6.0.0 : Parsing des fichiers de configuration YAML
⚠️ Notes importantes sur les versions :
- pysnmp 7.x : Changements d'API incompatibles avec les versions 6.x et antérieures. L'ancienne classe
Slim
a été supprimée au profit deget_cmd()
avec des objetsSnmpEngine
,UdpTransportTarget
, etc. - paho-mqtt 2.x : Nouvelle API de callbacks (VERSION2) qui remplace l'ancienne API deprecated (VERSION1). Les signatures des callbacks ont changé.
Configuration de l'environnement
# Cloner le repository
git clone <url-du-repo>
cd snmp2mqtt
# Créer un environnement virtuel
python -m venv venv
source venv/bin/activate # Sur Linux/Mac
# ou
venv\Scripts\activate # Sur Windows
# Installer les dépendances
pip install -r requirements.txt
Configuration
Structure du fichier config.yaml
Le script utilise un fichier de configuration YAML avec la structure suivante :
# Configuration du broker MQTT
mqtt:
broker: "192.168.10.202" # Adresse IP du broker MQTT
port: 1883 # Port du broker MQTT
user: "snmp2mqtt" # Nom d'utilisateur MQTT
password: "votre_mot_de_passe" # Mot de passe MQTT
# Intervalle entre les requêtes SNMP (optionnel, défaut: 2 secondes)
sleep_interval: 2
# Configuration des équipements
devices:
nom_equipement:
ip: "192.168.1.1" # Adresse IP de l'équipement
snmp_community: "public" # Communauté SNMP
oids: # Liste des OID à surveiller
- name: "interface_in" # Nom unique du capteur
oid: ".1.3.6.1.2.1.2.2.1.10.1" # OID SNMP
type: "int" # Type de données (int, bool, str)
HA_device_class: "data_size" # Classe d'équipement HA
HA_platform: "sensor" # Plateforme HA
HA_unit: "bit" # Unité (optionnel)
Paramètres de configuration détaillés
Section mqtt
Paramètre | Type | Obligatoire | Description |
---|---|---|---|
broker |
string | ✅ | Adresse IP ou nom d'hôte du broker MQTT |
port |
integer | ✅ | Port du broker MQTT (généralement 1883) |
user |
string | ✅ | Nom d'utilisateur pour l'authentification MQTT |
password |
string | ✅ | Mot de passe pour l'authentification MQTT |
Section devices
Chaque équipement est défini par une clé (nom de l'équipement) et les paramètres suivants :
Paramètre | Type | Obligatoire | Description |
---|---|---|---|
ip |
string | ✅ | Adresse IP de l'équipement SNMP |
snmp_community |
string | ✅ | Communauté SNMP (généralement "public") |
oids |
liste | ✅ | Liste des OID SNMP à surveiller |
Configuration des OID
Chaque OID dans la liste oids
doit contenir :
Paramètre | Type | Obligatoire | Description |
---|---|---|---|
name |
string | ✅ | Identifiant unique pour ce capteur |
oid |
string | ✅ | Identifiant d'objet SNMP |
type |
string | ✅ | Type de conversion Python ("int", "bool", "str") |
HA_device_class |
string | ✅ | Classe d'équipement Home Assistant |
HA_platform |
string | ✅ | Plateforme Home Assistant ("sensor", "binary_sensor") |
HA_unit |
string | ❌ | Unité de mesure pour le capteur |
Classes d'équipements Home Assistant courantes
data_size
: Pour les données de trafic réseauconnectivity
: Pour le statut des interfacespower_factor
: Pour les pourcentages (CPU, utilisation)temperature
: Pour les températuressignal_strength
: Pour la qualité du signal
OID SNMP couramment utilisés
# Interfaces réseau (remplacez X par l'index de l'interface)
- ".1.3.6.1.2.1.2.2.1.10.X" # Octets entrants sur l'interface X
- ".1.3.6.1.2.1.2.2.1.16.X" # Octets sortants sur l'interface X
- ".1.3.6.1.2.1.2.2.1.8.X" # Statut opérationnel (1=actif, 2=inactif)
- ".1.3.6.1.2.1.2.2.1.2.X" # Description de l'interface
# MikroTik spécifique
- ".1.3.6.1.4.1.14988.1.1.3.14.0" # Utilisation CPU
- ".1.3.6.1.4.1.14988.1.1.6.1.0" # Température
Utilisation
Lancement du script
# Activer l'environnement virtuel
source venv/bin/activate
# Lancer avec le fichier de configuration
python snmp2mqtt.py --config config.yaml
# Ou avec la forme courte
python snmp2mqtt.py -c config.yaml
Options en ligne de commande
Option | Description |
---|---|
--config , -c |
Chemin vers le fichier de configuration YAML (obligatoire) |
--help , -h |
Affiche l'aide |
Intégration Home Assistant
MQTT Discovery (Découverte automatique)
Le script implémente le protocole MQTT Discovery de Home Assistant pour une intégration transparente et automatique. Aucune configuration manuelle n'est nécessaire dans Home Assistant.
Fonctionnement de l'autodécouverte
- Au démarrage : Publication des configurations de découverte
- Pendant l'exécution : Mise à jour continue des états des capteurs
- Surveillance : Gestion des statuts de disponibilité (online/offline)
Topics MQTT générés
Topics de découverte (Discovery)
Chaque capteur génère un topic de configuration individuel :
homeassistant/{platform}/{node_id}/{object_id}/config
Exemples :
# Capteur de trafic réseau
homeassistant/sensor/mikrotik_hex/mikrotik_hex_starlink_in/config
# Statut de connectivité
homeassistant/binary_sensor/mikrotik_hex/mikrotik_hex_starlink_status/config
Topics de données
- État :
SNMP/{device_name}/state
- Données JSON des capteurs - Disponibilité :
SNMP/{device_name}/availability
- Statut online/offline
Configuration automatique des capteurs
Chaque capteur est configuré avec :
{
"name": "mikrotik_hex starlink_in",
"unique_id": "mikrotik_hex_192_168_10_2_starlink_in",
"state_topic": "SNMP/mikrotik_hex/state",
"value_template": "{{ value_json.starlink_in }}",
"device_class": "data_size",
"unit_of_measurement": "bit",
"icon": "mdi:network",
"device": {
"identifiers": ["snmp2mqtt_mikrotik_hex_192_168_10_2"],
"name": "mikrotik_hex",
"model": "SNMP Device",
"manufacturer": "Network Equipment"
},
"availability": {
"topic": "SNMP/mikrotik_hex/availability",
"payload_available": "online",
"payload_not_available": "offline"
}
}
Découverte automatique dans Home Assistant
Regroupement par équipement
Tous les capteurs d'un même équipement sont automatiquement regroupés sous une seule carte d'équipement :
- Identifiant unique basé sur
device_name
+ip
- Nom d'affichage basé sur le nom de l'équipement
- Métadonnées : modèle, fabricant, version du logiciel
Types de capteurs supportés
Type HA | Platform | Description | Icône |
---|---|---|---|
sensor |
sensor |
Valeurs numériques (trafic, CPU, etc.) | Selon device_class |
binary_sensor |
binary_sensor |
États binaires (online/offline, actif/inactif) | mdi:network-outline |
Classes d'équipements et icônes
Device Class | Utilisation | Icône Auto | Unité Suggérée |
---|---|---|---|
data_size |
Trafic réseau, volumes de données | mdi:network | bit, byte, MB, GB |
connectivity |
Statut des interfaces, connexions | mdi:network-outline | - |
power_factor |
Pourcentages (CPU, mémoire) | mdi:gauge | % |
temperature |
Températures d'équipements | mdi:thermometer | °C, °F |
signal_strength |
Qualité des signaux | mdi:signal | dBm, % |
Surveillance de disponibilité
Statuts de disponibilité
- Online : Équipement accessible et données mises à jour
- Offline : Équipement inaccessible ou erreurs SNMP
Mécanisme de heartbeat
- Mise à jour du statut à chaque cycle de surveillance
- Marquage offline automatique en cas d'erreur
- Statut offline lors de l'arrêt du script
Persistance et redémarrages
Configuration Discovery retenue
- Flag retain=true sur les topics de configuration
- Redécouverte automatique après redémarrage de Home Assistant
- Pas de perte de configuration lors des redémarrages
Données d'état temps réel
- Flag retain=false sur les données d'état
- Données fraîches uniquement après redémarrage
- Historique préservé par Home Assistant
Intégration dans l'interface Home Assistant
Après démarrage du script, vous verrez automatiquement :
- Page Équipements : Nouveaux équipements SNMP avec leurs capteurs
- États et Historiques : Données temps réel et graphiques
- Cartes automatiques : Ajout facile aux tableaux de bord
- Notifications : Alertes sur les changements d'état
- Automations : Utilisation des capteurs dans les règles
Exemple d'équipement découvert
📱 mikrotik_hex (SNMP Device)
├── 📊 mikrotik_hex starlink_in (123.45 MB)
├── 📊 mikrotik_hex starlink_out (67.89 MB)
├── 🔌 mikrotik_hex starlink_status (Online)
├── 📊 mikrotik_hex lan_bridge_in (234.56 MB)
├── 📊 mikrotik_hex lan_bridge_out (78.90 MB)
└── 🔌 mikrotik_hex lan_bridge_status (Online)
Statut: Online | Dernière mise à jour: il y a 2 secondes
Exemple de configuration complète
# Configuration MQTT
mqtt:
broker: "192.168.10.202"
port: 1883
user: "snmp2mqtt"
password: "mon_mot_de_passe"
# Intervalle de surveillance
sleep_interval: 5
# Équipements à surveiller
devices:
# Routeur MikroTik Hex
mikrotik_hex:
ip: "192.168.10.2"
snmp_community: "public"
oids:
# Interface Starlink
- name: "starlink_in"
oid: ".1.3.6.1.2.1.2.2.1.10.1"
type: "int"
HA_device_class: "data_size"
HA_platform: "sensor"
HA_unit: "bit"
- name: "starlink_out"
oid: ".1.3.6.1.2.1.2.2.1.16.1"
type: "int"
HA_device_class: "data_size"
HA_platform: "sensor"
HA_unit: "bit"
- name: "starlink_status"
oid: ".1.3.6.1.2.1.2.2.1.8.1"
type: "bool"
HA_device_class: "connectivity"
HA_platform: "binary_sensor"
# Switch réseau
switch_bureau:
ip: "192.168.10.5"
snmp_community: "public"
oids:
- name: "port1_status"
oid: ".1.3.6.1.2.1.2.2.1.8.1"
type: "bool"
HA_device_class: "connectivity"
HA_platform: "binary_sensor"
Dépannage
Problèmes courants
-
Erreur "Configuration file not found"
- Vérifiez le chemin vers le fichier config.yaml
- Assurez-vous que le fichier existe et est lisible
-
Erreur de connexion MQTT
- Vérifiez les paramètres du broker (IP, port, credentials)
- Testez la connectivité réseau vers le broker
-
Pas de données SNMP
- Vérifiez que l'équipement supporte SNMP
- Testez avec
snmpwalk
:snmpwalk -v2c -c public IP_EQUIPEMENT
- Vérifiez les OID utilisés
-
Capteurs non découverts dans Home Assistant
- Vérifiez que MQTT Discovery est activé dans Home Assistant
- Surveillez les logs MQTT avec
mosquitto_sub
-
Erreurs liées à PySNMP
- "ModuleNotFoundError: No module named 'pysnmp.hlapi.asyncio.slim'" : Vous utilisez une version pysnmp 6.x. Mettez à jour vers >= 7.0.0
- "Please call .create() to construct UdpTransportTarget object" : Erreur corrigée dans cette version, utilisez
pip install -r requirements.txt
- Erreurs d'importation SNMP : Assurez-vous d'avoir pysnmp 7.x avec
pip show pysnmp
-
Erreurs liées à Paho MQTT
- "DeprecationWarning: Callback API version 1 is deprecated" : Vous utilisez une version paho-mqtt < 2.0. Mettez à jour vers >= 2.0.0
- Erreurs de callback MQTT : La nouvelle API VERSION2 change la signature des callbacks (ex:
on_connect
reçoit maintenant 5 paramètres) - Vérification version :
pip show paho-mqtt
pour confirmer la version installée
Commandes de test utiles
# Test SNMP manuel
snmpwalk -v2c -c public 192.168.10.2 1.3.6.1.2.1.2.2.1.10
# Surveillance des messages MQTT
mosquitto_sub -h 192.168.10.202 -u snmp2mqtt -P 'mot_de_passe' -t 'homeassistant/device/+/config'
mosquitto_sub -h 192.168.10.202 -u snmp2mqtt -P 'mot_de_passe' -t 'SNMP/+/state'
# Test de connectivité
ping 192.168.10.2
ping 192.168.10.202
Support multi-équipements
Le script supporte nativement la surveillance simultanée de plusieurs équipements grâce à une architecture multi-threading :
Fonctionnement
- Thread indépendant pour chaque équipement configuré
- Surveillance parallèle : tous les équipements sont surveillés simultanément
- Isolation des erreurs : la défaillance d'un équipement n'affecte pas les autres
- Clients MQTT séparés : chaque thread utilise son propre client MQTT
- Arrêt gracieux : tous les threads s'arrêtent proprement sur signal
Avantages
- ⚡ Performance optimale : pas de blocage entre équipements
- 🔄 Traitement parallèle : requêtes SNMP simultanées
- 🛡️ Robustesse : isolation des défaillances
- 📊 Scalabilité : facilement extensible à des dizaines d'équipements
- 🔧 Maintenance : logs clairement identifiés par équipement
Configuration multi-équipements
devices:
routeur_principal:
ip: "192.168.10.1"
snmp_community: "public"
oids:
# ... configuration OID ...
switch_bureau:
ip: "192.168.10.5"
snmp_community: "public"
oids:
# ... configuration OID ...
point_acces_wifi:
ip: "192.168.10.10"
snmp_community: "private"
oids:
# ... configuration OID ...
Logs multi-threading
Chaque thread est clairement identifié dans les logs :
(INFO) [Device-routeur_principal] Starting monitoring thread
(INFO) [Device-switch_bureau] MQTT client connected
(DEBUG) [Device-point_acces_wifi] Published state to SNMP/point_acces_wifi/state
Gestion des ressources
- Clients MQTT uniques : ID client basé sur le nom de l'équipement
- Topics séparés : chaque équipement a ses propres topics MQTT
- Discovery HA indépendante : configuration Home Assistant par équipement
- Disponibilité individuelle : statut online/offline par équipement
Logs et debugging
Le script utilise le module logging
de Python avec le niveau DEBUG par défaut. Les logs incluent :
- Chargement de la configuration
- Connexions MQTT
- Requêtes SNMP et leurs résultats
- Publication des messages MQTT
- Erreurs et avertissements
Licence
Ce projet est distribué sous licence libre. Consultez le fichier LICENSE pour plus de détails.