Skip to content

Format de profil ​

Un profil d'add-on est un fichier JSON. Il décrit entièrement un appareil : comment le nomos system Controller l'atteint, ce qu'il peut lui envoyer, quelles valeurs reviennent et ce qui en apparaît dans l'app, les automatisations et la Quick Config. Cette page décrit le format ; la façon de le modifier dans l'Éditeur de profils est décrite sur la page correspondante. Les profils avec une connexion propre via TCP, UDP, HTTP ou série sont décrits en détail sous CommandServer, des exemples complets pour HTTP, TCP (Modbus), UDP, MQTT et KNX sous Exemples de profils.

INFO

Chaque profil de la liste des profils peut être enregistré en .json avec l'icône de téléchargement. Un profil existant proche de votre appareil est le meilleur point de départ.

Aperçu de la structure ​

json
{
	"version": "1.0",
	"author": "Muster Integration GmbH",
	"description": "Wallbox XY",
	"manufacturer": "XY",
	"model": "Wallbox",
	"platform": "XY",
	"category": "Energy",
	"type": "EV Charger",
	"className": "XY_WALLBOX",
	"engineType": "",
	"structure": { "config": {}, "commands": {}, "mappings": {} },
	"polling": {},
	"properties": {},
	"propertiesMeta": {},
	"mappings": {},
	"mappingsMeta": {},
	"actionTemplates": [],
	"triggerTemplates": [],
	"hooks": {},
	"cameras": [],
	"components": {}
}
BlocContenu
Données de baseNom, fabricant, catégorie, type, type de moteur
structureUniquement CommandServer : connexion, commandes et motifs de réponse, voir CommandServer
pollingUniquement CommandServer : commandes envoyées régulièrement
properties, propertiesMetaActions : ce qui peut être envoyé à l'appareil, et leur libellé
mappings, mappingsMetaRetours : les valeurs que l'appareil signale, et leur libellé
actionTemplates, triggerTemplatesModèles pour les automatisations et la Quick Config
hooksValeurs que l'appareil peut envoyer lui-même par HTTP
camerasImages de caméra de l'appareil
componentsSous-profils : plusieurs appareils via une seule connexion

Point important pour la compréhension : structure décrit uniquement ce qui passe sur la ligne. L'app, les automatisations et les valeurs enregistrées travaillent exclusivement avec properties et mappings. Un profil CommandServer a donc besoin des deux : la commande dans structure.commands et l'action dans properties, le motif de réponse dans structure.mappings et le retour dans mappings.

Données de base ​

ChampObligatoireSignification
versionouiNuméro de version, par ex. 1.0. Les appareils existants ne reprennent les modifications qu'avec une version supérieure, voir Modifier un profil
descriptionouiNom dans la liste des profils et proposition pour le nom de l'appareil
author, manufacturer, modelouiIndications sur l'auteur et l'appareil
platformouiOrigine, le plus souvent le fabricant. Pour KNX KNX, pour MQTT MQTT
category, typeouiVoir Catégorie et type
engineTypeouiVoir Type de moteur
classNameCommandServer, KNXPour CommandServer, le nom de la connexion (uniquement A–Z, 0–9, _, -, 28 caractères au maximum), pour KNX toujours KNX, pour MQTT et BUS vide
supportUrlnonPage d'aide sur l'appareil, apparaît sous forme de bouton d'information
compatibilitynonCouverture de l'appareil en pourcentage
nomosCertifiednontrue uniquement pour les profils vérifiés par nomos system
minVersionnonVersion minimale du contrôleur ; les contrôleurs plus anciens refusent la création d'un appareil
tagsnonMarqueurs, voir plus bas
hideProperties, hideMappingsnonDéfinis par l'Éditeur de profils lui-même, voir Modèles

Tags avec effet : uihidden (appareil absent de l'app), voicehidden (non transmis aux assistants vocaux ni au pont Matter). Un champ name n'a pas sa place dans le profil principal : il remplacerait le nom que l'utilisateur attribue à la création.

Un point dans le nom du profil devient _ à l'import, car au chargement, un point sépare le profil et le sous-profil.

Catégorie et type ​

La catégorie et le type déterminent l'icône et l'élément de commande dans l'app, ainsi que l'apparition de l'appareil via le pont Matter et sous quelle forme. Utilisez les valeurs que propose l'Éditeur de profils, par ex. :

CatégorieTypes
LightingLightbulb
SwitchesSwitch, Trigger
ThermostatsThermostat, Thermostat Variation TA
Window CoveringsWindow Covering, Window Covering Up/Down
SunblindsSunblind
SensorsTemperature Sensor, Humidity Sensor, Contact Sensor, Motion Sensor, CO2 Sensor, Smoke Sensor, Light Sensor, Rain Sensor, Wind Sensor, Weather Station, Binary Sensor, …
EnergyInverter, Smart Meter, EV Charger, Heat Pump, Heating Controller, Pellet Boiler, Power Sensor
Fans, Doors, Garage Door, ValvesFan, Door, Garage Door Opener, Valve
Security SystemsLock, Alarm, Camera, Security System

Choisissez le type selon la valeur la plus importante de l'appareil.

Type de moteur ​

engineTypeConnexionParticularités
"" (CommandServer)Connexion propre via TCP, UDP, HTTP, HTTPS ou sériestructure et polling, voir CommandServer
MQTTVia le broker du skill MQTTTopics par action et par retour, voir MQTT
KNXVia l'interface KNXProfil sans adresses, adresses de groupe à la création, voir KNX
BUSLes valeurs arrivent uniquement via des webhooksPour les appareils qui signalent d'eux-mêmes par HTTP
ZWAVEVia le skill Z-WaveCréé via la page Z-Wave

Chaque appareil issu d'un profil CommandServer, MQTT ou BUS compte dans le nombre d'add-ons autorisé par votre licence.

Actions et retours ​

Les properties (actions) sont tout ce qui peut être envoyé à l'appareil. Les mappings (retours) sont les valeurs que l'appareil signale. Un nom peut figurer dans les deux, par exemple state pour commuter et comme état signalé ; ce n'est qu'alors que l'app affiche un interrupteur qui reflète l'état réel.

json
"properties": {
	"state":     {"method": "set", "property": "ENA", "datatype": "bool"},
	"switchon":  {"method": "set", "property": "ENA", "value": 1, "datatype": "bool", "uihidden": true},
	"switchoff": {"method": "set", "property": "ENA", "value": 0, "datatype": "bool", "uihidden": true}
},
"mappings": {
	"state":     {"method": "get", "property": "ENABLE_USER", "datatype": "bool", "defaultValue": false},
	"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}
}

Champs ​

ChampDansSignification
methodles deuxActions : command (envoyer une commande), set (définir une propriété), alias (rediriger vers une autre action). Retours : get
commandactionsNom de la commande avec method: "command"
propertyles deuxAvec set : nom de la propriété. Pour les retours : nom de la valeur signalée, pour CommandServer le nom d'un motif de réponse, pour KNX toujours value
datatypeles deuxVoir Types de données
valueactionsValeur fixe, voir Valeur fixe
defaultValueles deuxActions : valeur utilisée si aucune n'est transmise. Retours : valeur initiale jusqu'au premier signalement
valueListles deuxValeurs de choix, voir Listes de valeurs
min, max, internalMin, internalMaxles deuxVoir Échelle des valeurs
unitles deuxVoir Unités
stepValueles deuxPas des curseurs (et non step)
uihiddenles deuxPas de ligne propre dans l'app
processretoursVoir Traitement
customFormatretoursVoir Affichage
simulateFeedbackactionstrue : la valeur envoyée est aussitôt considérée comme signalée. Pour les appareils sans retour
prefix, suffixactionsPlacés avec une virgule avant ou après la valeur (prefix,valeur)
sizeInBitles deuxKNX : taille du point de données. Avec 1, true/false sont envoyés comme 1/0
filterDPTles deuxKNX : types de points de données proposés lors de l'attribution de l'adresse de groupe
mqtt, mqttValue, mqttPayload, mqttScaleles deuxMQTT, voir MQTT

Pour CommandServer, {"method": "set", "property": "ENA"} donne la commande SETENA, {"method": "command", "command": "ON"} la commande ON. Les deux doivent figurer dans structure.commands.

Types de données ​

datatypeSignification
boolOui/non. Sont considérés comme « arrêt » 0, false, off, aus, offline, close, closed, error, warning (majuscules et minuscules indifférentes), tout le reste comme « marche ». Un appareil qui signale open est donc « marche »
int, floatNombre entier ou nombre décimal (point comme séparateur décimal)
stringTexte
nullAction sans valeur, par ex. un bouton. Une valeur transmise est ignorée
triggerAction qui est seulement déclenchée, par exemple l'arrêt d'un store

Noms standard ​

L'app reconnaît les valeurs à leur nom et affiche l'élément de commande adapté. Utilisez exactement ces noms pour ces valeurs :

NomValeurType de données
stateMarche/arrêtbool
levelLuminosité 0–100int
color-temperatureTempérature de couleur en miredsint
positionPosition d'un store 0–100int
stopArrêter le storetrigger
opencloseOuvrir/fermer, obligatoire pour les portes de garagebool
openedPorte ou portail ouvertbool
temperature, setpointTempérature réelle et température de consignefloat
hvacmodeMode de fonctionnementint ou string
isheating, heatingpowerChauffe en ce moment, puissance de chauffe en %bool, int
humidity, co2, pressure, noiseValeurs mesuréesNombre
batteryNiveau de batterie en %int
reachableJoignabilitébool
powerPuissancefloat
pv_power, grid, battery_power, battery_state, e_day, e_totalÉnergie : puissance PV, réseau, stockage, production du jour et totale. grid du point de vue de la maison : injection positive, soutirage négatifNombre

Les autres valeurs peuvent porter leurs propres noms (minuscules, chiffres, _, -) ; l'app les affiche comme ligne de texte. Pour le nom, l'Éditeur de profils propose tous les noms connus.

state, switchon et switchoff ​

Lorsque l'app commute un appareil, le contrôleur n'envoie pas state, mais switchon ou switchoff. Les automatisations utilisent en revanche state lui-même. Un appareil commutable a donc besoin des trois actions : state avec le type de données bool et switchon/switchoff avec la même commande et la valeur fixe 1 ou 0, toutes deux avec uihidden. Dans propertiesMeta, une entrée regroupe les trois :

json
"propertiesMeta": {
	"state": {"text": "State", "properties": ["state", "switchon", "switchoff"]}
}

Valeur fixe ​

value sur une action est la valeur qu'elle envoie si aucune n'est transmise. Si une valeur est transmise, par exemple depuis l'app, c'est elle qui l'emporte, sauf avec "datatype": "null" : dans ce cas, value est toujours envoyée. Dans les automatisations, c'est en revanche toujours la valeur fixe du profil qui l'emporte. Pour les boutons au contenu fixe (appeler une scène, appuyer sur une touche), utilisez donc "datatype": "null" et value.

Listes de valeurs ​

json
"valueList": [
	{"text": "Off", "value": "0"},
	{"text": "Low", "value": "1"},
	{"text": "High", "value": "2"}
]

Pour une action, la liste est aussi une liste d'autorisation : une valeur qui n'y figure pas est refusée. Les automatisations n'affichent le choix que si la même liste figure aussi dans le modèle ; répétez-la à cet endroit.

Échelle des valeurs ​

internalMin/internalMax sont la plage de valeurs de l'appareil, min/max la plage dans nomos (app, automatisations). Le contrôleur convertit de façon linéaire, dans les deux sens. Exemple : la borne de recharge attend le courant de charge en mA (6000–32000), l'app affiche des A (6–32) :

json
"amperelimit": {"method": "set", "property": "CURR", "datatype": "int", "unit": "A",
	"min": 6, "max": 32, "internalMin": 6000, "internalMax": 32000}

WARNING

La mise à l'échelle s'applique dès que max est défini. Les limites manquantes valent min 0, max 100, internalMin 0, internalMax 100. Un "max": 3000 sans internalMin/internalMax convertit donc une valeur d'appareil de 0–100 en 0–3000. Définissez soit les quatre limites, soit aucune.

  • Le résultat est arrondi à des nombres entiers. Une conversion de W en kW avec des décimales n'est donc pas possible via la mise à l'échelle ; pour CommandServer, utilisez un format ({%/1000.00}, voir Filtres de format) ou indiquez la valeur dans l'unité de l'appareil.
  • Les valeurs envoyées sont limitées à min/max.
  • Une plage inversée est possible, par ex. "internalMin": 100, "internalMax": 0 pour un store qui signale 0 % comme fermé.

Unités ​

unit est soit une catégorie que l'app affiche et convertit pour chaque utilisateur (temperature, percent, luminescence, voltage, current, electric, energy, co2, angle, noise, pressure, currency, bigmetric, smallmetric), soit une unité fixe comme W, kW, kWh, Hz, m³/h, qui est affichée telle quelle.

Pour color-temperature : dans nomos, la valeur est toujours en mireds. Si l'appareil utilise des kelvins, indiquez "internalUnit": "kelvin", la plage en kelvins en commençant par le froid ("internalMin": 6500, "internalMax": 2700) et, comme min/max, les valeurs en mireds (154/370).

Traitement ​

process sur un retour traite la valeur après sa réception, notamment : invert (inverser le signe), wattHoursToKilowattHours, openCloseToBoolean (des mots comme open/closed en oui/non), calculateGridPrice, calculatePhotovoltaicsPrice, calculateWaterPrice (valeur × prix issu de la variable système GRID_PRICE, PV_PRICE ou WATER_PRICE). Les déclencheurs des automatisations comparent la valeur avant ce traitement.

Affichage ​

customFormat définit comment l'app affiche une valeur. La clé format est une expression JsonLogic qui calcule la valeur affichée ; chaque autre clé est une couleur qui s'applique lorsque son expression est vraie.

json
"grid": {"method": "get", "property": "GRID", "datatype": "float", "unit": "W",
	"customFormat": {
		"format": {"Math.abs": {"Math.round": {"var": "value"}}},
		"red-minus": {"<": [{"var": "value"}, 0]},
		"green-plus": {">": [{"var": "value"}, 0]}
	}}

Pour format, il existe en plus Math.round, Math.abs et les autres fonctions Math, toFixed1, toFixed2, toFixed3 ainsi que CustomFormatter.toHHMM et CustomFormatter.toHHMMSS (secondes affichées comme heure). Couleurs : green, red, blue, orange, purple, seules comme couleur de texte ou avec -plus, -minus, -circle, -square comme point devant la valeur.

Libellés et groupes ​

propertiesMeta et mappingsMeta donnent à chaque action ou retour son libellé :

json
"mappingsMeta": {
	"power": {"text": "Power", "group": "Vehicle charging", "properties": ["power"]}
}
  • text : libellé. L'utilisateur peut le renommer pour chaque appareil.
  • group : section sous laquelle l'app affiche la valeur. Uniquement pour les appareils avec beaucoup de valeurs ; sinon, à omettre. Les sections apparaissent dans l'ordre du profil.
  • properties : les entrées que cette ligne regroupe, par ex. state, switchon et switchoff. Pour KNX, chaque entrée de propertiesMeta et de mappingsMeta devient un champ pour une adresse de groupe.

Traduction ​

Les libellés, les groupes et les textes des listes de valeurs et des modèles sont traduits lorsqu'ils correspondent exactement à un terme que nomos connaît, par exemple State, Brightness, Power, Temperature, Reachable, Turn On, Is Turned On, Off, Low, Medium, High. Tout autre texte apparaît dans toutes les langues tel qu'il figure dans le profil. Rédigez donc ces textes dans la langue de l'installation, ou utilisez les termes standard anglais que propose l'Éditeur de profils.

Modèles ​

Les modèles sont les entrées que proposent les automatisations et la Quick Config.

json
"actionTemplates": [
	{"templateid": "switchon", "mapping": "switchon", "text": "Turn On", "icon": "toggle-on"},
	{"templateid": "level", "mapping": "level", "text": "Brightness", "icon": "sun-o"}
],
"triggerTemplates": [
	{"templateid": "state.on", "mapping": "state", "text": "Is Turned On", "value": "1", "icon": "toggle-on"}
]
ChampSignification
templateidIdentifiant unique ; il est utilisé dans les automatisations enregistrées, ne le modifiez donc plus par la suite
mappingL'action (pour actionTemplates) ou le retour (pour triggerTemplates) auquel le modèle se rapporte. S'il n'existe pas, le modèle est ignoré
text, textsuffixLibellé et complément
iconNom d'une icône Font Awesome sans fa-, par ex. toggle-on, bolt, thermometer
valueValeur fixe ; l'automatisation n'affiche alors aucun champ de saisie
valueListChoix dans l'automatisation ; copie de la liste de l'action ou du retour
placeholderTexte d'exemple dans le champ de saisie vide d'une action avec texte
hideInQuickConfigtrue : pas dans la Quick Config, mais dans les automatisations

Avec hideProperties: true ou hideMappings: true, les automatisations proposent uniquement les modèles au lieu de toutes les actions ou de tous les retours. L'Éditeur de profils définit les deux lui-même à l'enregistrement : true dès qu'il existe au moins un modèle.

Interrogations ​

Uniquement CommandServer. Chaque entrée envoie une commande de structure.commands à intervalle fixe, et une fois immédiatement au démarrage :

json
"polling": {
	"Status": {"interval": 30, "editableInterval": true, "command": "STATUS"}
}
  • interval : intervalle en secondes.
  • editableInterval: true : l'intervalle est demandé à la création de l'appareil (pré-rempli avec interval).
  • value et editableValue : valeur facultative envoyée avec la commande, et si elle est demandée à la création.

Les sous-profils ne peuvent pas interroger ; les interrogations appartiennent au profil principal.

Webhooks ​

Avec les webhooks, un appareil signale lui-même des valeurs au lieu d'être interrogé, par ex. un bouton-poussoir qui appelle une adresse à chaque appui. Dans le profil, vous indiquez quels retours y sont autorisés ; chaque entrée a besoin d'un retour du même nom :

json
"hooks": {"action": {"enabled": true}, "battery": {"enabled": true}},
"mappings": {
	"action":  {"method": "get", "property": "ACTION", "datatype": "int"},
	"battery": {"method": "get", "property": "BATTERY", "datatype": "int", "unit": "percent"}
}

À la création de l'appareil, le contrôleur indique l'adresse que l'appareil doit appeler. Elle a la forme http://<IP du contrôleur>/api/v1/hook/<ID de l'appareil> ; les valeurs figurent comme paramètres dans l'adresse (GET) ou dans le corps (POST, en formulaire ou en JSON) :

http://192.168.1.10/api/v1/hook/C12?action=1&battery=98

Le contrôleur ne reprend que les paramètres autorisés dans hooks et répond par 200 si au moins une valeur a été reprise, sinon par 204.

DANGER

Les webhooks n'ont pas d'authentification. Tout appareil du réseau local qui connaît l'adresse peut définir les valeurs autorisées. Via l'accès à distance, l'adresse est bloquée. N'autorisez donc que les retours qu'un appareil doit réellement envoyer, et ne déclenchez avec eux aucune automatisation liée à la sécurité, par exemple l'ouverture d'une porte.

Caméras ​

json
"cameras": [
	{"type": "mjpeg", "url": "http://%SERVERIP%/mjpegstream.cgi?usr=%USERNAME%&pwd=%PASSWORD%"}
]

type : snapshot (image unique, par défaut), mjpeg, rtsp ou otherhttp. Dans l'URL, les espaces réservés %NAME% sont remplacés par les valeurs de la communication. À la création de l'appareil, une caméra est créée pour chaque entrée. Si le nombre maximal de flux vidéo est atteint avec rtsp ou otherhttp, la caméra est ignorée sans message.

Sous-profils ​

json
"components": {
	"out1": {"name": "Ausgang 1", "category": "Switches", "type": "Switch",
		"properties": {}, "propertiesMeta": {}, "mappings": {}, "mappingsMeta": {}}
}

À la création de l'appareil, chaque clé devient un appareil distinct nommé « Nom de l'appareil Ausgang 1 ». Tous partagent la connexion du profil principal ; structure, polling et cameras n'existent que dans le profil principal. Un sous-profil reprend du profil principal les données de base manquantes (version, fabricant, catégorie, type, type de moteur). Ne modifiez plus la clé d'un sous-profil lorsque des appareils l'utilisent.

MQTT ​

Les profils MQTT utilisent le broker configuré dans le skill MQTT ; un profil ne peut pas choisir son propre broker. À la création de l'appareil, vous saisissez un MQTT Topic, qui figure dans le profil sous la forme %mqttTopic%.

json
"properties": {
	"switchon": {"method": "command", "command": "power", "value": 1,
		"mqtt": "cmnd/%mqttTopic%/POWER", "datatype": "null", "uihidden": true},
	"level": {"method": "command", "command": "brightness",
		"mqtt": "cmnd/%mqttTopic%/Dimmer", "datatype": "int", "unit": "percent"}
},
"mappings": {
	"level": {"method": "get", "property": "dimmer", "mqtt": "stat/%mqttTopic%/RESULT",
		"mqttValue": "Dimmer", "datatype": "int", "unit": "percent"},
	"reachable": {"method": "get", "property": "reachable", "mqtt": "tele/%mqttTopic%/LWT",
		"mqttValue": "", "datatype": "bool", "defaultValue": true}
}
ChampSignification
mqttTopic (sujet). Pour les retours, + et # sont autorisés comme jokers
commandActions : nom de la commande. Les actions avec le même command doivent avoir le même topic, comme switchon et switchoff
mqttPayloadActions : charge utile avec \# comme place de la valeur, par ex. {"brightness":\#}. Sans mqttPayload, la valeur est envoyée seule
mqttValueRetours : la partie d'une charge utile JSON qui constitue la valeur. Avec un point, un chemin (ENERGY.Power), sans point le premier champ de ce nom, pour un tableau une position. Vide : toute la charge utile
mqttScaleRetours : ajouté à la valeur comme unité, mais sans conversion. Utile uniquement avec "unit": "energy" (kW devient W)
  • L'envoi se fait avec QoS 0 et sans retain.
  • %mqttTopic% est remplacé dans mqtt, command et property, mais pas dans mqttPayload.
  • Sans retour reachable, l'appareil est toujours considéré comme joignable. Avec le topic LWT de l'appareil (Online/Offline), la joignabilité est correcte.

Des modèles MQTT prêts à l'emploi et un guide Node-RED pour connecter n'importe quel appareil sont décrits sur la page Modèles MQTT (en allemand) de la bibliothèque d'add-ons.

KNX ​

Un profil KNX ne contient aucune adresse. Il définit les valeurs d'un appareil et leur taille sur le bus ; vous attribuez les adresses de groupe à la création de l'appareil. Créer un appareil ouvre pour cela la boîte de dialogue du skill KNX avec le profil.

json
"className": "KNX", "engineType": "KNX", "platform": "KNX",
"properties": {
	"state":     {"method": "set", "property": "value", "datatype": "bool", "sizeInBit": 1, "filterDPT": ["1.001"]},
	"switchon":  {"method": "set", "property": "value", "value": 1, "datatype": "bool", "sizeInBit": 1, "uihidden": true},
	"switchoff": {"method": "set", "property": "value", "value": 0, "datatype": "bool", "sizeInBit": 1, "uihidden": true}
},
"propertiesMeta": {"state": {"text": "State", "properties": ["state", "switchon", "switchoff"]}},
"mappings": {
	"state": {"method": "get", "property": "value", "datatype": "bool", "sizeInBit": 1, "filterDPT": ["1.001"]}
},
"mappingsMeta": {"state": {"text": "State", "properties": ["state"]}}
  • className et platform valent toujours KNX, property vaut toujours value.
  • Chaque entrée de propertiesMeta devient un champ pour l'adresse de groupe de commande, chaque entrée de mappingsMeta un champ pour l'adresse d'état. La clé doit elle-même être le nom d'une action ou d'un retour. L'adresse de state vaut aussi pour switchon et switchoff.
  • sizeInBit doit correspondre au type de point de données (1 bit pour la commutation, 8 bits pour les pourcentages et les niveaux, 16 bits pour les températures) ; filterDPT restreint le choix lors de l'attribution. L'unité provient du type de point de données de l'adresse de groupe.
  • Une valeur sans adresse de groupe ne fait rien et n'apparaît pas dans l'app.
  • Un retour reachable n'est pas nécessaire ; la joignabilité suit la connexion KNX.

Le skill KNX fournit déjà de nombreux types d'appareils (lumière, variateur, store, thermostat, capteurs). Un profil propre est utile pour les appareils qui n'y figurent pas. Des indications sur les adresses de groupe et les types de points de données figurent sur la page Modèles KNX (en allemand) de la bibliothèque d'add-ons.

Erreurs fréquentes ​

  • Les valeurs restent vides : pour CommandServer, le retour manque dans mappings, ou son property ne correspond pas au nom du motif de réponse dans structure.mappings.
  • L'interrupteur revient en arrière : il n'y a pas de retour state, ou l'appareil ne signale pas son état.
  • L'app ne commute pas : switchon/switchoff manquent ; l'app n'envoie jamais state elle-même.
  • Nombres mal mis à l'échelle : max sans internalMin/internalMax (voir Échelle des valeurs).
  • Une automatisation ne propose pas une valeur : il existe des modèles, mais aucun pour cette valeur (voir Modèles).
  • Appareil toujours joignable : pour CommandServer, CONNECTEVENT/DISCONNECTEVENT manquent, pour MQTT le retour reachable (voir Joignabilité).
  • Un deuxième profil …_2 : il n'apparaît que si vous choisissez En copie pour un profil modifié dans l'Éditeur de profils. Sinon, un nouveau téléchargement ou import remplace le profil existant (voir Mises à jour depuis la bibliothèque en ligne).