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). |
GET | /domotics/microcontrollers | Liste brute des microcontrôleurs du registre domotique (LEUKOS_DOMOTICS_CONFIG ou /etc/leukos/domotics.json). |
GET | /domotics/microcontrollers/filter?online_only=1&room_id=<id> | Liste filtrée côté daemon (contrôleurs en ligne et affectation de pièce compatible). |
GET | /domotics/config | Registre domotique complet utilisé par l’IHM Qt (rooms et microcontrollers). |
POST | /domotics/config/<room_id> | Valide et conserve dans SQLite le JSON canonique d’une pièce (leukos.domotics.room, version 1). |
GET | /domotics/config/<room_id> | Relit le même document JSON depuis SQLite. |
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
# Lire la liste MCU domotique
curl "http://<node>:8080/domotics/microcontrollers"
# Lire la liste MCU filtrée pour une pièce (en ligne uniquement)
curl "http://<node>:8080/domotics/microcontrollers/filter?online_only=1&room_id=room_salon"
# 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 la domotique, la découverte et la synchronisation MCU sont désormais gérées côté daemon
et non plus par l'IHM: une boucle interne met à jour le registre toutes les ~3 secondes
(détection série/réseau, état online, last_seen_at, et affectation de pièce quand applicable).
Le chemin du registre est aligné UI/daemon via LEUKOS_DOMOTICS_CONFIG (fallback: /etc/leukos/domotics.json).
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.
Daemon documents (Contrôle de pièces)
La fonctionnalité UI de contrôle de pièces utilise désormais un daemon dédié
leukos-documents exposé en local sur 127.0.0.1:8082.
| Méthode | Chemin | Description |
|---|---|---|
GET | /health | Vérifie que le daemon documents est actif. |
POST | /documents/scan | Reçoit { "qr_id", "source", "node_id" }, appelle la mutation publique Venus GraphQL scanDocumentsQr, puis retourne { ok, message, profile, documents } sans enveloppe GraphQL. |
Le daemon documents lit la même variable d'environnement que l'IHM (LEUKOS_VENUS_GRAPHQL_URL) afin de conserver un routage identique vers Venus/idmanager.