Aller au contenu principal

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éthodeCheminDescription
GET/Instantané complet du node (JSON).
GET/statusÉtat courant (relais, vannes, compteurs).
GET/syncInstantané de synchronisation desired/reported des entités locales.
GET/sqliteDump SQLite local enrichi avec topology.boards (chaque device expose device_type).
GET/domotics/microcontrollersListe 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/configRegistre 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éthodeCheminDescription
GET/healthVérifie que le daemon documents est actif.
POST/documents/scanReç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.