Radio Monitoring, anciennement FM-Monitor.
Système open source de supervision d'une radio FM. Un mini-PC, un tuner Headless TEF Lite SE et une antenne suffisent pour :
- surveiller la réception FM : ce qui sort réellement de l'antenne (signal, modulation, RDS) ;
- surveiller la chaîne de diffusion : chaque appareil, du studio à l'émetteur, par SNMP, sondes réseau, journaux syslog et traps ;
- écouter l'antenne depuis n'importe quel navigateur (retour FM) ;
- garder une pige de 30 jours, reliée aux alertes.
Une alerte mail part à chaque panne et à chaque rétablissement, et chaque alerte garde son extrait audio.
Pourquoi BL-RMO ? Le logiciel s'appelait FM-Monitor. Il surveille désormais la réception FM et DAB+ et toute la chaîne de diffusion : il devient BL-RMO, pour « Radio Monitoring ». Dossier ~/bl-rmo, services bl-rmo*, adresse bl-rmo.local : une installation existante passe aux nouveaux noms avec le script de migration (voir Passer de FM-Monitor à BL-RMO).
BL-RMO suit désormais une seule direction, et c'est la seule configuration développée et testée :
un mini-PC Linux + un tuner Headless TEF Lite SE + une antenne FM pour surveiller la réception FM, la chaîne de diffusion, offrir un retour FM et une pige.
Le Headless TEF Lite SE donne une réception de qualité professionnelle : le tuner démodule lui-même le signal et décode le RDS, et BL-RMO reçoit des mesures RF natives (dBf, rapport signal/bruit, trajets multiples).
Les fonctions suivantes ne sont plus développées. Elles restent présentes dans la version 0.8 pour les installations existantes, mais seront retirées dans une prochaine version :
| Fonction | Pourquoi |
|---|---|
| Réception FM par dongle RTL-SDR (rtl_fm, GNU Radio) | Qualité de réception inférieure au TEF ; double chaîne de traitement à maintenir |
| Analyse MPX (déviation, pilote, sous-porteuses, SNR MPX) | Intérêt réel mais limité avec un dongle RTL-SDR ; ce n'est pas la direction retenue |
| Installation Docker | Jamais validée en production ; l'accès au tuner USB et aux ports syslog/traps s'y prête mal |
Si vous utilisez l'un de ces modes, la version 0.8 continue de fonctionner. Les instructions restent en annexe.
Le dongle RTL-SDR revient dans un autre rôle : second tuner dédié au DAB+, en parallèle du TEF pour la FM. C'est la reprise de BL-DMO (dabplus-monitor), désormais intégré à BL-RMO (en cours de validation).
- Mesures RF natives : niveau en dBf, rapport signal/bruit, trajets multiples, décalage de fréquence
- Présence du signal mesurée par la cadence des trames du tuner, indépendante du son
- Absence de modulation (porteuse présente, programme muet), alertes RDS et RadioText
- Niveaux audio G/D mesurés en continu, stéréo ou mono d'après l'indicateur de pilote du tuner
- RDS décodé par le tuner : PS, RadioText, code PI ; logo de la station via rds-station-db
- Ensemble : SNR, qualité FIC, gain, identifiant ; alerte quand l'ensemble se dégrade
- Services : présence dans le multiplex, niveaux audio, DLS, débit, disponibilité sur 24 h ; alertes service absent et silence, sur tous les services ou seulement ceux cochés
- Écoute d'un service depuis la page DAB+, diaporama (slideshow) affiché pendant l'écoute
- Alertes DAB+ par mail et dans un onglet Réception DAB+ de la page Journaux, avec lien vers la pige du service s'il en a une
- Service indépendant
bl-rmo-dab: un plantage de welle-cli ou de la clé ne touche ni l'interface, ni la FM
- Écoute de l'antenne dans le navigateur, flux Icecast2 MP3 128 kbps
- Mode public
/public: tableau de bord sans authentification
- Enregistrement continu sur 30 jours de l'antenne en segments MP3 (service
bl-rmo-pige, indépendant de l'application), environ 1,4 Go par jour ; durée réglable depuis la page Pige - Piges DAB+ : un service DAB+ par pige, créée depuis la page Pige (nom, service, durée de conservation) ; MP3 128 kb/s, environ 1,4 Go par jour ; demande le décodage « Tous les services en continu »
- Écoute à l'instant choisi, déplacements de 10 s, 1 min ou 10 min, repère de 30 min autour de la position, disponibilité jour par jour ; extrait marqué pendant l'écoute, écouté puis téléchargé en MP3 sans réencodage
- Extraits des 10 dernières alertes, de 30 s avant l'alerte à 30 s après le rétablissement, conservés après la sortie de la pige
- Chaque alerte et chaque événement de la chaîne ouvre la pige au bon moment
- Synoptique du studio à l'antenne : état de chaque appareil et de chaque lien, depuis quand, détail en un clic
- SNMP v1, v2c, v3 (lecture seule), ping, TCP, page web, Icecast ; seuils et valeurs attendues
- Préréglages : BW Broadcast TX V3, Deva DB91-TX / DB91-RX, Sound4 PULSE / IMPACT
- Sondes réseau (rafales de pings : pertes, latence, gigue) rattachées aux liens
- Historique en courbes, alertes mail avec les valeurs en défaut, export ZIP
- Serveur syslog UDP 514 (service
bl-rmo-syslog) : les appareils de la radio envoient leurs journaux à BL-RMO - Traps SNMP UDP 162 traduits en français, avec relevé immédiat de l'appareil
- Lecture nettoyée et messages masqués (bruit connu), réaffichables d'une case à cocher
- Mail à la panne et au rétablissement, pour la réception comme pour la chaîne
- Historique des alertes en base SQLite, chacune reliée à la pige
- Push webhook : données temps réel en JSON vers une URL externe
- Lecteur : consulte et écoute ; Opérateur : exporte et enregistre ; Administrateur : règle tout
- Contrôle d'accès vérifié côté serveur sur chaque route
- Tableau de bord d'un seul coup d'œil : réception FM et DAB+ (lecteur, VU-mètre, indicateurs, dernière alerte), chaîne de diffusion complète avec ses sondes, état de la pige
- Configuration complète depuis le navigateur
- Responsive : smartphone et tablette
- Accès local via
https://bl-rmo.local(Nginx + mDNS)
| Élément | Référence | Notes |
|---|---|---|
| Ordinateur | Mini-PC Linux | Référence : Debian 13 (Trixie) sur mini-PC x86 |
| Tuner | Headless TEF Lite SE (FMDX.org) | TEF668X V205 (TEF6687 recommandé), entrées AM et FM séparées, audio numérique par USB, firmware FM-DX-Tuner |
| Antenne | Antenne FM extérieure | Bien dégagée : BL-RMO écoute comme un auditeur |
| Câble | USB de données | Un câble « charge seule » ne laisse pas passer le port série |
| DAB+ (option) | Clé RTL-SDR + antenne bande III | NooElec NESDR SmartEE conseillée pour un usage 24 h/24 (le RTL-SDR Blog V4 a montré des instabilités USB) |
Le tuner apparaît sous Linux comme un port série (/dev/ttyACM0, protocole XDR) et une carte son (hw:Tuner). Il est reconnu par son identifiant USB 1209:6687.
⚠️ Bonne pratique : avant d'exécuter un script distant, inspectez-le :curl -sSL https://raw.githubusercontent.com/LyonelB/BL-RMO/main/install.sh -o install.sh less install.sh bash install.sh
Le script installe les dépendances, configure Icecast2, Nginx et les certificats, puis les services de BL-RMO (application, pige, journaux).
# Brancher le tuner (câble USB de données), puis vérifier :
ls /dev/ttyACM0
aplay -l | grep Tuner
# Accès au port série pour l'utilisateur du service
sudo usermod -a -G dialout $USERPuis, dans l'interface : Configuration, bouton « Scan dongle », source TEF668X. La section correspondante de config.json :
"tef": {
"enabled": true,
"serial_port": "/dev/ttyACM0",
"alsa_device": "hw:Tuner",
"signal_threshold_dbf": 20.0,
"modulation_threshold_dbfs": -40.0
}install.sh les installe tous. Sur une installation existante, la pige et les journaux s'ajoutent ainsi :
cd ~/bl-rmo
sudo bash install/build/65-pige.sh # pige 30 jours (bl-rmo-pige)
sudo bash install/build/66-syslog.sh # journaux UDP 514 et traps UDP 162 (bl-rmo-syslog)
sudo BUILD_WELLE=1 bash install/build/67-dab.sh # réception DAB+ (bl-rmo-dab) et compilation de welle-cliLa réception DAB+ reste en veille jusqu'à son activation dans la page DAB+ (menu, administrateur) : canal, seuils et services surveillés s'y règlent.
| Service | Rôle | Ports |
|---|---|---|
bl-rmo |
Application web, réception FM, supervision de la chaîne | 5000 (derrière Nginx 80/443) |
bl-rmo-pige |
Enregistrement de la pige | lit Icecast 8000 |
bl-rmo-syslog |
Réception des journaux et des traps | UDP 514, UDP 162 |
bl-rmo-dab |
Réception DAB+ (pilote welle-cli) | welle-cli 7979, local |
icecast2 |
Flux audio de l'antenne (retour FM et pige) | 8000 |
La supervision SNMP de la chaîne utilise snmpget : sudo apt install snmp s'il n'est pas déjà présent.
Une installation faite avant la version 0.10 utilise encore le dossier ~/fm-monitor et les services fm-monitor*. Le script de migration passe tout aux nouveaux noms, sans toucher aux données (pige, extraits, bases, config.json) :
cd ~/fm-monitor
bash install/migrate-to-bl-rmo.sh # inventaire, ne modifie rien
bash install/migrate-to-bl-rmo.sh --apply # migration (environ 5 min de coupure)
bash ~/bl-rmo/install/migrate-to-bl-rmo.sh --rollback # retour arrière si besoinIl renomme le dossier et les services, met à jour Nginx, les certificats, sudoers, le nom de la machine (bl-rmo.local) et l'annonce NetBIOS. Les anciens noms restent utilisables pendant la transition : ~/fm-monitor pointe vers ~/bl-rmo, bl-fmo.local répond toujours et systemctl restart fm-monitor redémarre bl-rmo. L'adresse IP ne change pas.
cd ~/bl-rmo
bash update.shDans Configuration, renseigner l'expéditeur et les destinataires. Avec Gmail, utiliser un mot de passe d'application, puis le bouton Test Email.
bl-rmo/
├── app.py # Application Flask (routes, API, contrôle d'accès)
├── version.py # Numéro de version
├── monitor.py # Moteur de réception (tuner, RDS, alertes)
├── tef_driver.py # Pilote du tuner TEF668X (protocole XDR)
├── tef_audio_analyzer.py # Analyse audio (niveaux, spectre, S/B)
├── chain_probe.py # Supervision de la chaîne (SNMP, sondes, événements)
├── audio_defects.py # Défauts audio : micro-coupures, clics, craquements
├── pige.py # Pige 30 jours (enregistreur et export)
├── pige_archive.py # Extraits audio des dernières alertes
├── syslog_server.py # Service de réception syslog et traps
├── snmp_traps.py # Décodage et traduction des traps SNMP
├── syslog_clean.py # Lecture nettoyée et messages masqués
├── auth.py # Comptes, rôles, authentification
├── email_alert.py # Alertes mail
├── database.py # Base SQLite (historique, alertes)
├── install.sh # Installation complète
├── install/build/ # Étapes d'installation (pige, journaux...)
├── update.sh # Mise à jour
├── templates/ # Pages : tableau de bord, pige, chaîne, journaux...
└── static/ # CSS et JS
En fin de vie (voir Direction du projet) : mpx_analyzer.py, wfm_stereo.py, la partie RTL-SDR de monitor.py, Dockerfile, docker-compose.yml, docker/.
La page À propos intégrée à l'interface explique le fonctionnement de BL-RMO, le tuner Headless TEF Lite SE, la diffusion FM et le RDS, ainsi que les services et leurs ports.
lsusb | grep 1209:6687 # le tuner est-il vu en USB ?
ls -l /dev/ttyACM0 # port série présent ?
groups | grep dialout # l'utilisateur a-t-il accès au port série ?
aplay -l | grep Tuner # carte son présente ?Rien dans lsusb : changer de câble (câble de données) ou de port USB.
La carte son du tuner ne peut être ouverte que par un seul programme. Vérifier qu'aucun autre logiciel n'utilise hw:Tuner, puis : sudo systemctl restart bl-rmo.
- Vérifier la configuration dans la page Configuration
- Utiliser le bouton Test Email
- Consulter les logs :
sudo journalctl -u bl-rmo -n 50
sudo systemctl status bl-rmo-syslog
sudo journalctl -u bl-rmo-syslog -n 20Sur l'appareil, le serveur syslog doit être l'adresse IP de BL-RMO (pas bl-fmo.local), port 514, en UDP.
- v0.3 à v0.7 : Icecast2, SSL, installation automatique, alertes, accès local, mode public, webhook, interface mobile
- v0.8.0 : tuner TEF668X, pige 24 h, chaîne de diffusion, journaux et traps, comptes et rôles
- Courbes du relevé de l'émetteur et alerte sur l'écart entre alimentations
- Journaux par domaine (réception, diffusion, système) et page Bilan
- Page Incidents : regroupement des alertes de réception et de diffusion, cause probable, frise
- Retrait du mode RTL-SDR, de l'analyse MPX et de Docker
- v0.9.0 : nouveau nom BL-RMO, journaux en trois onglets
- Réception DAB+ (reprise de BL-DMO), validée sur site
- Tableau de bord FM, DAB+, chaîne et pige
- Piges multiples : FM et services DAB+, créées depuis la page Pige
- Alerte de passage en mono
- Capteurs de site (température, humidité... d'un shelter), hors du flux du signal
- Battement de cœur vers un service extérieur (healthchecks.io...) : une alerte même si BL-RMO ou le serveur tombe
- Alerte audio figé (boucle bloquée, tonalité fixe) et RadioText inchangé depuis trop longtemps
- Fermeture de BL-DMO (dabplus-monitor) : annonce, archivage, puis suppression du dépôt
- welle-monitor : reporter les changements de la prochaine version de welle.io
- Version anglaise de l'interface
- Piste : sonde AES67 (sortie console Dante)
MIT : libre d'utilisation, de modification et de distribution.
- Headless TEF Lite SE (FMDX.org) : tuner USB TEF668X, firmware FM-DX-Tuner
- welle.io (Albrecht Lohofener, Matthias P. Braendli) et son fork welle-monitor : décodage DAB+
- Icecast2 : serveur de streaming
- Net-SNMP : outils SNMP
- Radio Browser : base de données de stations
- redsea et RTL-SDR Blog : décodage RDS et pilotes du mode RTL-SDR (fin de vie)
Instructions conservées pour les installations existantes
Ces fonctions ne sont plus développées et seront retirées dans une prochaine version.
| Dongle | Puce | Notes |
|---|---|---|
| RTL-SDR Blog V3 | RTL2832U + R820T2 | Pilotes standard |
| RTL-SDR Blog V4 | RTL2832U + R828D | Nécessite le fork officiel |
| Nooelec NESDR SMArt | RTL2832U + R820T2 | Pilotes standard |
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtl.conf
sudo modprobe -r dvb_usb_rtl28xxu 2>/dev/null
sudo apt install -y git cmake libusb-1.0-0-dev build-essential pkg-config
git clone https://github.com/rtlsdrblog/rtl-sdr-blog
cd rtl-sdr-blog && mkdir build && cd build
cmake .. -DINSTALL_UDEV_RULES=ON
make -j$(nproc) && sudo make install && sudo ldconfig
sudo cp ~/rtl-sdr-blog/rtl-sdr.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
rtl_test -tMettre "enabled": false dans la section tef de config.json, puis sudo systemctl restart bl-rmo.
Déviation crête et RMS, niveaux G/D, pilote 19 kHz, sous-porteuse stéréo 38 kHz, sous-porteuse RDS 57 kHz, puissance MPX, SNR, alerte de sur-déviation.
| Fonctionnalité | RTL-SDR | Headless TEF Lite SE |
|---|---|---|
| Niveau du signal | dBFS, calculé sur l'audio | dBf, mesure RF native |
| RDS | redsea sur le MPX | Décodé par le tuner |
| Analyse MPX | Oui | Non |
| Stéréo / mono | Par le pilote | Par le bit MS du RDS |
| Niveaux G/D, S/B audio | Oui | Oui |
| Qualité de réception | Correcte | Excellente |
docker compose up -d