📖 Chapitre 25/27 — La domotique chez soi Voir le sommaire →
← Retour
domotique

Installer le programme raspjson

Cédrix · 02/01/2021
Modifié le 23 mai 2026 à 05h13

1/ 7 j  ·  1/ 14 j  ·  1/ 30 j  lecteurs

Contexte

À ce stade, le matériel est en place : le démodulateur ASK est câblé à l’UART du Raspberry Pi (article précédent sur la préparation du Pi), et /dev/ttyAMA0 reçoit un signal série TTL conforme au protocole TIC. Reste à installer un programme qui lit ce flux, vérifie les checksums, et produit des trames JSON exploitables.

C’est le rôle de raspjson, un exemple fourni avec la bibliothèque LibTeleinfo de Charles Hallard. À chaque trame reçue sur /dev/ttyAMA0, raspjson écrit une ligne JSON sur sa sortie standard. C’est cette sortie que l’article suivant transportera vers le broker MQTT.

Choix de la bibliothèque : LibTeleinfo reste la référence pour la téléinformation française sous C++ embarqué, supportée sur Arduino, ESP8266, ESP32 et Raspberry Pi. Plusieurs forks existent pour adapter le mode standard Linky (par exemple LngWork/LibTeleinfo2Std), mais ce dossier traite uniquement le mode historique (1200 bauds), parfaitement géré par la version originale. Pour quelqu’un qui débute, l’alternative hallard/teleinfo-test en Python est plus simple à mettre en service ; on choisit ici le C++ pour la légèreté de l’exécutable et l’usage minimal de ressources, important pour un démon qui tourne en permanence.


Installation

Prérequis

Compilateur C++ et outils Git, à installer si ce n’est pas déjà fait :

sudo apt update
sudo apt install build-essential git

Récupération du code

On clone le dépôt dans /opt pour qu’il soit accessible à tout le monde et qu’il ne se mélange pas aux fichiers personnels :

sudo git clone https://github.com/hallard/LibTeleinfo.git /opt/LibTeleinfo
cd /opt/LibTeleinfo/examples/Raspberry_JSON

Compilation

Le Makefile fourni dans examples/Raspberry_JSON/ gère lui-même les chemins d’include. Aucune modification de raspjson.cpp ou LibTeleinfo.h n’est nécessaire — un simple make suffit :

sudo make

Le binaire raspjson est produit dans le dossier courant. On l’installe dans /usr/local/bin pour qu’il soit dans le $PATH :

sudo install -m 755 raspjson /usr/local/bin/raspjson

Test manuel

Premier lancement, en plein écran, pour vérifier que tout fonctionne :

raspjson -d /dev/ttyAMA0

Note sur le périphérique : selon la version de Raspberry Pi OS, le port série exposé sur le GPIO s’appelle /dev/ttyAMA0, /dev/serial0 (alias) ou /dev/ttyS0. serial0 est un lien symbolique stable qui pointe vers le bon device quel que soit le modèle — c’est généralement le choix le plus sûr.

Si le câblage est bon et qu’une trame TIC valide est reçue toutes les secondes, on voit défiler des lignes JSON :

{"_UPTIME":310146,"ADCO":"123456789012","ISOUSC":60,"PTEC":"HC..","IINST":24,"IMAX":90,"PAPP":5260,"MOTDETAT":"000000","HHPHC":"A","HCHC":15205491,"HCHP":4851788,"OPTARIF":"HC.."}

Lecture : compteur 123456789012, abonnement HC à 60 A, période en cours « heures creuses », intensité 24 A, puissance apparente 5260 VA, index heures creuses 15 205 491 Wh, index heures pleines 4 851 788 Wh.

Si on ne voit rien défiler après quelques secondes, c’est un problème côté matériel ou port série :

Symptôme Piste
Rien du tout Câblage I1–I2 sur le compteur, alimentation du démodulateur, port série activé dans raspi-config
Caractères incohérents Mode standard activé sur le Linky (le compteur émet à 9600 bauds, mais raspjson lit à 1200)
Trames partielles Problème de qualité du signal — soigner le MOSFET, raccourcir le câble

Ctrl+C pour arrêter.


Démarrage automatique avec systemd

Lancer manuellement à chaque démarrage du Pi n’est pas tenable. On encapsule raspjson dans une unité systemd qui :

  • redirige la sortie standard vers un journal NDJSON persistant (une ligne JSON par trame) ;
  • redémarre le démon automatiquement en cas de plantage ;
  • démarre au boot.

Préparation du dossier de journal

sudo mkdir -p /var/log/raspjson
sudo chown pi:pi /var/log/raspjson

Unité systemd

# /etc/systemd/system/raspjson.service
[Unit]
Description=Lecteur de téléinformation TIC (raspjson)
After=multi-user.target

[Service]
Type=simple
User=pi
ExecStart=/bin/sh -c '/usr/local/bin/raspjson -d /dev/ttyAMA0 >> /var/log/raspjson/tic.ndjson 2>> /var/log/raspjson/tic.err'
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target

Pourquoi /bin/sh -c '...' et pas ExecStart=/usr/local/bin/raspjson ... direct ? Parce que les opérateurs shell >> (redirection append) ne sont pas reconnus par systemd — il faut un shell pour les interpréter. C’est l’astuce standard pour rediriger la sortie d’un binaire qui écrit sur stdout sans option de fichier dédiée.

Activation

sudo systemctl daemon-reload
sudo systemctl enable --now raspjson
sudo systemctl status raspjson

Le démon doit afficher active (running). On vérifie que le journal se remplit :

tail -f /var/log/raspjson/tic.ndjson

Une nouvelle ligne par seconde environ.


Rotation du journal

Avec une trame par seconde, le fichier NDJSON grossit d’environ 15 Mo par jour. Sans rotation, il finit par remplir la carte SD. On configure logrotate pour une rotation quotidienne avec conservation d’une semaine :

# /etc/logrotate.d/raspjson
/var/log/raspjson/tic.ndjson {
    daily
    rotate 7
    compress
    copytruncate
    missingok
    notifempty
}

copytruncate est important : il copie le fichier puis le tronque sur place, sans casser le descripteur de fichier ouvert par raspjson. Sans cette option, le démon continuerait à écrire dans l’ancien inode et le nouveau fichier resterait vide.


Suite

raspjson produit désormais en continu un flux NDJSON dans /var/log/raspjson/tic.ndjson. Reste à transporter ces données vers l’unité de traitement de la maison.

L’article suivant met en place un relais MQTT qui lit ce journal et publie chaque trame sur le broker, où Home Assistant (et tout autre consommateur intéressé) pourra s’y abonner.

Partager : ✉ Mail X in 🐘
Commentaires

Aucun commentaire pour l'instant. Soyez le premier !

Laisser un commentaire
Un code de vérification sera envoyé à votre adresse email.