Node — Vue d'ensemble
Un node est un Raspberry Pi transformé en automate autonome. Il exécute un daemon
C++17 (nodes/agent) et, en option, une IHM tactile Qt6 (nodes/ui).
Anatomie logicielle
L'orchestrateur Node
La classe Node est le cœur : elle câble tous les gestionnaires entre eux et exécute la
boucle de contrôle déterministe. C'est l'unique objet auquel s'adressent l'API, le client
MQTT et le scheduler.
Elle expose une surface de commande partagée :
bool cmd_relay(const std::string& id, const std::string& action);
bool cmd_valve(const std::string& id, const std::string& action, int seconds);
std::string state_json() const; // instantané complet du node
Les gestionnaires
| Gestionnaire | Rôle |
|---|---|
| GpioManager | Accès bas niveau aux lignes GPIO via libgpiod (/dev/gpiochip0). |
| RelayManager | Pilotage des relais (actifs à l'état bas), persistance de l'état. |
| ValveManager | Vannes avec fermeture de sécurité automatique (300 s par défaut). |
| MeterManager | Comptage d'impulsions (débit, énergie…), valeur cumulée persistée. |
| Scheduler | Déclenchements planifiés (cron journalier : minute + heure). |
| Watchdog | Watchdog matériel (/dev/watchdog, rearmé toutes les ~15 s). |
| LocalDb | Persistance SQLite (/var/lib/leukos/node.db). |
| MqttClient | Publication d'état et réception de commandes via MQTT. |
| LocalApi | Serveur HTTP REST local (0.0.0.0:8080). |
La boucle de contrôle
Le daemon tourne en boucle à intervalle fixe (poll_interval_ms, 250 ms par défaut) :
- Lecture des entrées (compteurs, contacts).
- Application de la logique (fermeture auto des vannes, déclenchements du scheduler).
- Mise à jour de l'état et persistance des changements.
- Publication périodique de l'état sur MQTT (~2 s).
Le watchdog matériel garantit le redémarrage si la boucle se bloque.
Configuration
Le node se configure via /etc/leukos/node.json : identifiant, relais, vannes, compteurs,
plannings, paramètres MQTT et intervalle de boucle.
Pour aller plus loin
- Daemon C++ — détail des gestionnaires et de la boucle.
- API locale — les points d'entrée REST du port 8080.
- MQTT — topics et intégration avec le hub.
- IHM Qt — l'interface tactile locale.