Contrôles
Interrupteurs, curseurs et boutons sur vos surfaces, exécutés par un flow
PNeX suit une règle pour tout ce qu'on presse à l'écran : une surface lit, un flow agit. Un tableau de bord, une carte mobile ou une annotation sur un panorama ne pilote jamais une pin d'appareil. Presser un interrupteur écrit la valeur d'un contrôle ; un flow déployé qui écoute ce contrôle décide de la suite : écrire une pin sur un ou plusieurs appareils, envoyer une notification, mémoriser une valeur, ou tout ce qu'un flow sait faire.
Le comportement vit donc à un seul endroit, visible et versionné — le flow — et le même interrupteur peut piloter un relais aujourd'hui et une scène de dix appareils demain sans toucher au tableau.
Les contrôles naissent à l'enregistrement
On ne choisit jamais de contrôle avant d'enregistrer. Ajoutez un interrupteur, un
curseur ou une carte maison à un tableau et enregistrez : chaque widget de commande, et
chaque commande d'une carte maison, reçoit son propre contrôle dans la même transaction.
L'inspecteur affiche la référence qu'il obtiendra, par exemple #w-0001 ou
#w-0001.power pour le rôle Marche / arrêt d'une carte Lumière.
Supprimez la carte et son contrôle est libéré : supprimé si rien ne l'utilise, gardé en contrôle indépendant si un flow l'écoute encore. Pour partager un contrôle entre deux surfaces (un tableau et un panorama, par exemple), utilisez Lier à un contrôle existant… dans l'inspecteur.

Types
| Type | Envoie | Notes |
|---|---|---|
| Interrupteur | 1 / 0 | Valeurs modifiables |
| Curseur | Un nombre, 0–100 par défaut | Envoyé au relâcher ; se branche directement sur un rapport cyclique PWM |
| Bouton | Une valeur fixe | |
| Saisie numérique | Le nombre saisi | |
| Liste de choix | La valeur numérique de l'option choisie | Segments jusqu'à 4 options, liste au-delà |
| Pas à pas (− / +) | La nouvelle valeur | Min, max et pas |
| Commandes | La valeur numérique du bouton pressé | Ouvrir / Stop / Fermer = 1 / 0 / −1 par défaut |
| Couleur | 0xRRGGBB en entier, ou une température de blanc en K | 2200–6500 K par défaut |
Cochez Demander une confirmation avant d'envoyer (actionneur sensible) pour les portails, serrures et alarmes. Deux appuis à moins de 250 ms sur un même contrôle sont refusés (Trop rapide). Les lecteurs voient les contrôles désactivés, et les partages publics sont en lecture seule.
Ce que reçoit le flow
Le nœud Source contrôle (palette Déclencheurs) n'a pas d'entrée et une sortie par contrôle coché. Chaque message porte :
| Champ | Contenu |
|---|---|
msg.payload | Toujours un nombre, prêt pour Appareil (écriture) |
msg.topic | La clé du contrôle, par ex. dash-1a2b3c4d.w-0001.power |
msg.control.option | La clé de l'option d'un choix ou d'une commande (heat, open…), ou #rrggbb pour une couleur |
msg.control.by / via / ts_ms | Qui a pressé, depuis quelle surface, quand |
Les sources sont groupées par surface (Tableau de bord · Salon…), puis Contrôles indépendants ; un champ de recherche les filtre. Renvoyer la dernière valeur au démarrage rejoue la valeur courante après un redémarrage ou un redéploiement. Un nœud sans aucune case cochée s'enregistre en brouillon, mais le déploiement le refuse.

Créer le flow depuis le tableau
Un widget de commande, et chaque commande d'une carte maison, a une section Créer le flow… dans l'inspecteur : choisir un Device cible… et une Pin de sortie… (sorties numériques ou PWM uniquement), puis Créer et ouvrir le flow. PNeX crée un brouillon Contrôle — <libellé> câblé Source contrôle → Appareil (écriture) et l'ouvre dans l'éditeur de flows. Il n'est jamais déployé à votre place : relisez-le, puis déployez.

La page Contrôles
Données → Contrôles liste tous les contrôles de l'organisation : qui l'a déclaré (un tableau, des annotations, ou indépendant), son type, sa dernière valeur, et les flows qui l'écoutent. Un contrôle qu'aucun flow déployé n'écoute porte le badge Sans effet. Nouveau contrôle crée un contrôle indépendant, utile pour une valeur partagée par plusieurs surfaces. Un contrôle utilisé par un flow déployé ne peut pas être supprimé.

La garantie est inscrite dans le code : des gardes d'intégration continue font échouer le build si un composant de tableau ou d'annotation référence un jour un chemin de commande d'appareil, d'OTA ou de flash.

