Flows
Automatisation visuelle avec un runtime Node-RED-like full-Rust
PNeX automatise les pipelines de données et les réactions avec des flows : des graphes visuels édités en glissant des nœuds sur un canvas et en les câblant — le modèle Node-RED, mais le runtime entier est Rust et supervisé par le serveur.
L'éditeur
L'éditeur est dessiné par l'app elle-même — un canvas WebAssembly pur avec drag & drop, pan/zoom, inspecteur par nœud, validation locale avant save et versionnage append-only avec rollback en un clic. Chaque save utilise la concurrence optimiste : une édition conflictuelle renvoie 409 et propose recharger ou écraser.



Le runtime
Déployer un flow compile le graphe typé au format du runtime et hot-reloade un binaire Rust headless (EdgeLink vendored) supervisé par le serveur, avec restart automatique et backoff. La version déployée est celle qui tourne ; l'état de l'éditeur n'est pas le produit déployé.

Catalogue de nœuds
| Nœud | Rôle |
|---|---|
inject | Déclencheur intervalle ou cron |
pnex-control-source | Émet quand un interrupteur, un curseur ou un bouton d'un tableau ou d'une annotation est actionné — voir Contrôles |
pnex-weather | Conditions actuelles et prévisions d'un lieu (MET Norway ou Open-Meteo) — voir Cartes maison |
pnex-memory-write / pnex-memory-read | Garder et lire des valeurs live (sans historique) affichées par les cartes des tableaux |
debug | Capture des messages dans le feed de debug |
pnex-sql | Requête SQL en lecture seule sur PostgreSQL |
pnex-device-read | Lecture des dernières valeurs de pins d'un appareil (cache live d'abord) |
pnex-device-write | Écriture des pins de sortie digital ou PWM via le downlink |
pnex-calc | Évaluation d'expressions sur les clés du payload |
pnex-value | Émission d'un payload fixe ou aléatoire |
json-split / json-merge | Split et merge structurels du JSON, ports nommés |
pnex-metric | Écrit le résultat comme métrique de télémétrie |
pnex-coolprop | Propriétés thermophysiques de fluides et mélanges, in-process |
pnex-notify | Notification multi-canaux depuis un template |
pnex-function | Exécute une fonction utilisateur versionnée (JavaScript ou Starlark) |
pnex-http-fetch | Nœud client HTTP avec options auth et proxy |
pnex-display | Sonde transparente affichée en live dans l'éditeur |
pnex-reg-* | Cartes de régulation (tout-ou-rien chaud/froid, PID à relais temporel), destinées à être castées sur les appareils autonomes — voir plus bas |
pnex-anomaly | Détection d'anomalie par série (z-score robuste, bande de prévision, changement de régime) — voir Maintenance prédictive |
pnex-forecast | Prévision d'une série et date de franchissement d'un seuil |
camera-source | Émet un message par image de caméra (une référence, jamais les octets) |
video-record | Enregistre les images en segments MJPEG-AVI — voir Caméras & vision |
vision-detect | Détection d'objets avec un modèle ONNX du registre, calque de détection optionnel |
event-log | Stocke le payload comme événement JSON cherchable (page Événements) |
Le kind red est une porte de secours pour les types de nœuds compatibles Node-RED.
Trois façons de piloter les appareils
| Mode | Fonctionnement | Si le serveur tombe | État |
|---|---|---|---|
| Connecté | Un flow lit un appareil, décide sur le serveur, écrit sur un appareil (appareil → serveur → appareil) | La logique s'arrête ; les appareils gardent leur dernière sortie | Disponible — pour les usages non critiques |
| Autonome | Les cartes de régulation (pnex-reg-tt-heat, pnex-reg-tt-cool, pnex-reg-pid) sont authorées dans un flow, puis leur config est castée sur l'appareil, qui régule seul depuis sa flash | Continue de réguler et garde ses métriques jusqu'au retour du serveur | À venir |
| Mesh (M2M) | La topologie est configurée dans PNeX ; les appareils se parlent directement | Le mesh continue de tourner entre appareils | Plus tard, en conception |
Voir la roadmap pour les dates.
Gates de déploiement : un pin déjà assigné à un autre flow est refusé (409), et le serveur ne pousse jamais une écriture de pin de sa propre initiative — seul le flow ou l'opérateur écrit.

