API locale (REST)
Le daemon expose un serveur HTTP REST léger, implémenté directement sur les sockets
POSIX (LocalApi), écoutant sur 0.0.0.0:8080. C'est l'interface qu'utilise l'IHM Qt et
tout client local.
:::info Autonomie Cette API fonctionne indépendamment du réseau et du hub. Même si la connexion centrale est perdue, l'écran tactile du node continue de piloter le matériel. :::
Points d'entrée
| Méthode | Chemin | Description |
|---|---|---|
GET | / | Instantané complet du node (JSON). |
GET | /status | État courant (relais, vannes, compteurs). |
GET | /sync | Instantané de synchronisation desired/reported des entités locales. |
GET | /sqlite | Dump SQLite local enrichi avec topology.boards (chaque device expose device_type). |
POST | /relay/<id>/<action> | Commande un relais : on, off, toggle. |
POST | /valve/<id>/<action> | Commande une vanne : open, close. |
POST | /valve/<id>/<action>/<seconds> | Ouvre une vanne pour une durée donnée. |
POST | /sync/desired/<domain>/<id>/<state> | Écrit un état désiré puis applique localement (relay, valve). |
POST | /sync/reported/<domain>/<id>/<state>/<version> | Met à jour l'état reporté (ACK edge) avec version monotone. |
Exemples
# Lire l'état complet
curl http://<node>:8080/status
# Allumer le relais 1
curl -X POST http://<node>:8080/relay/1/on
# Basculer le relais 2
curl -X POST http://<node>:8080/relay/2/toggle
# Ouvrir la vanne 3 pendant 120 secondes
curl -X POST http://<node>:8080/valve/3/open/120
# Fermer la vanne 3
curl -X POST http://<node>:8080/valve/3/close
# Lire la vue de synchronisation desired/reported
curl http://<node>:8080/sync
# Définir l'état désiré d'un relais
curl -X POST http://<node>:8080/sync/desired/relay/1/on
# Reporter un état appliqué depuis une carte edge
curl -X POST http://<node>:8080/sync/reported/relay/1/on/12
Format de réponse
Les réponses GET renvoient un instantané JSON produit par Node::state_json(), reflétant
l'état de tous les relais, vannes et compteurs.
Pour /sqlite, le bloc topology.boards contient la liste des cartes/devices connectés.
Chaque device y expose désormais systématiquement device_type (ex: controller, bridge, displayer).
Implémentation
LocalApi::start(bind, port, error) crée le socket, l'attache et lance un thread d'écoute.
Chaque requête est routée vers la surface de commande de Node
(cmd_relay, cmd_valve), ce qui garantit une source de vérité unique pour l'état,
partagée avec MQTT et le scheduler.
La synchronisation desired/reported est persistée dans SQLite (sync_state) pour permettre
la reprise après reboot et la réconciliation avec les cartes embarquées.