Apparence
CommandServer (TCP, UDP, HTTP)
Un CommandServer est une connexion propre du nomos system Controller vers un appareil, via TCP, UDP, HTTP, HTTPS ou une interface série. Les profils avec le type de moteur CommandServer ("engineType": "") décrivent cette connexion dans le bloc structure. La structure du reste d'un profil est décrite sous Format de profil ; des exemples complets sous Exemples de profils.
Fonctionnement
json
"structure": {
"config": { "SERVERPROTOCOL": {"value": "TCP", "editable": false}, … },
"commands": { "READ": {"sequence": "…", "parameterCount": 0}, … },
"mappings": { "POWER": {"match": "…", "condition": "…", "onChange": true}, … }
}- Connexion (
config) : où et comment le contrôleur envoie. - Commandes (
commands) : ce qui est envoyé. Une action du profil, une interrogation ou une automatisation appelle une commande, le cas échéant avec une valeur. - Motifs de réponse (
mappings) : ce que le contrôleur extrait des réponses et des messages de l'appareil. Chaque motif qui correspond fournit une valeur nommée, par ex.POWER=1250. - Les retours du profil (
mappingsau niveau supérieur) récupèrent ces valeurs via leurproperty:{"method": "get", "property": "POWER"}.
À la création d'un appareil, chaque connexion reçoit son propre nom de classe, formé à partir de className et d'un numéro d'ordre, par ex. KEBA_P30_1. Sous ce nom, vous pouvez envoyer des commandes à la main dans le Service Interne, par exemple <KEBA_P30_1><REPORT2></KEBA_P30_1> ou <KEBA_P30_1><SETCURR=16000></KEBA_P30_1>, et suivre les réponses dans la sortie.
Connexion
Chaque paramètre a une valeur et une indication précisant s'il est demandé à la création de l'appareil :
json
"SERVERIP": {"value": "", "editable": {"type": "host", "default": ""}},
"SERVERPORT": {"value": "502", "editable": {"type": "integer", "default": "502"}},
"SERVERMODE": {"value": "HEX", "editable": false}editable: false: la valeur est fixe.editable: {"type": …, "default": …}: la boîte de dialogue Créer un appareil demande la valeur, pré-remplie avecdefault.typevauthost,string,password,bool(devientYES/NO) ouinteger/float(champ numérique).helpest possible en plus comme texte d'aide. Remarque : unpasswords'affiche lui aussi en clair dans la boîte de dialogue.comment: true: le paramètre n'a aucun effet, mais reste utilisable comme espace réservé.
| Paramètre | Signification | Par défaut |
|---|---|---|
SERVERPROTOCOL | TCP, UDP, HTTP, HTTPS ou SERIAL. Une valeur mal orthographiée vaut UDP | UDP |
SERVERIP | Adresse IP de l'appareil. Pour TCP et UDP, uniquement une adresse IPv4, pas de nom d'hôte. Pour HTTP(S), aussi un nom d'hôte | Obligatoire |
SERVERPORT | Port. Série (voir Appareils série) : Appareil;Bauds;Bits de données;Parité;Bits d'arrêt;Flux, par ex. /dev/ttyUSB0;9600;8;N;1;NONE ou AUTO;9600;8;N;1;NONE | Obligatoire |
SERVERMODE | ASCII (texte) ou HEX (octets en chiffres hexadécimaux). Pour HTTP toujours ASCII | Obligatoire |
SERVERTIMEOUT_IN_MS | Durée pendant laquelle la connexion reste ouverte après la dernière commande et attend des réponses, en ms. NONE la garde ouverte en permanence. Prioritaire sur SERVERTIMEOUT | Obligatoire¹ |
SERVERTIMEOUT | Idem en secondes | Obligatoire¹ |
MATCHING | FULL ou NORMAL, voir Motifs de réponse. FULL pour presque tous les appareils | NORMAL |
SPACING | Pause après chaque commande envoyée, en ms | 0 |
CONNECTEVENT, DISCONNECTEVENT | Message à l'établissement ou à la fin de la connexion, le plus souvent REACHABLE=1 et REACHABLE=0, voir Joignabilité | – |
STARTUPCMD | Commandes envoyées au démarrage, séparées par une virgule | – |
SHUTDOWNCMD | Commandes envoyées à chaque fin de connexion | – |
HEARTBEATCMD | Commande;Secondes, par ex. REPORT2;30 : envoyée lorsqu'aucune autre commande n'a été exécutée pendant cette durée | – |
HEARTBEATTIMEOUT | Délai d'attente en ms d'une réponse quelconque après le heartbeat ; sans réponse, la connexion est fermée | 1000 |
RECONNECT | YES : après la fin de la connexion, renvoyer STARTUPCMD. Ne fonctionne qu'avec HEARTBEATCMD et STARTUPCMD | NO |
RETRYINTERVAL | Secondes avant la tentative suivante lorsque la connexion ou l'envoi échoue. Répété sans fin, voir Joignabilité | 0 |
CMDPREFIX, CMDSUFFIX | Texte avant ou après chaque commande, par ex. /api/ pour HTTP ou \x0D pour les protocoles texte | – |
SEQUENCEPREFIX, SEQUENCESUFFIX | Texte avant ou après le paquet envoyé entier | – |
MAPPREFIX, MAPSUFFIX | Texte avant ou après chaque motif de réponse | – |
STARTDELIMITER, ENDDELIMITER | Début ou fin d'un message, voir Messages sur plusieurs paquets | – |
SERVERTYPE | Somme de contrôle, uniquement avec HEX : MODBUS (CRC16 pour Modbus RTU, espace réservé XXXX dans la séquence), SUM, SUM=a-b, XOR, XOR=a-b (sur les octets a à b, ajoutée à la fin), ainsi que RUS, ADNOTAM, SPEAKERCRAFT, TECNOALARM, SOUNDWEB, ESP3 pour les protocoles du même nom | – |
USERNAME, PASSWORD | HTTP(S) : authentification Basic si les deux sont définis. TCP, UDP, série : après l'établissement de la connexion, le nom d'utilisateur puis le mot de passe sont envoyés, chacun avec une fin de ligne. 31 caractères au maximum chacun | – |
LOCALPORT | UDP : port local auquel l'appareil répond ; RANDOM pour un port aléatoire. Si le paramètre manque, SERVERPORT s'applique | SERVERPORT |
NEGOTIATE | TELNET : répondre à la négociation Telnet et la retirer des réponses | – |
RESOLVE_SYSVARS | YES : insérer les variables entre crochets ([ID]) dans les séquences à chaque envoi, voir Variables | NO |
URL_SAFE_CHARS | HTTP(S) : caractères à ne pas encoder dans l'adresse, par ex. () | – |
DEBUG | YES : afficher chaque séquence dans le Service Interne | NO |
ACTIVE | NO désactive la connexion | YES |
¹ L'une des deux indications de durée doit être définie.
WARNING
Une connexion erronée est ignorée sans message. Si SERVERMODE ou une indication de durée manque, si le port n'est pas valide ou si, pour TCP/UDP, SERVERIP contient un nom d'hôte au lieu d'une adresse IP, le contrôleur crée bien l'appareil, mais celui-ci n'envoie ni ne reçoit jamais rien. Dans ce cas, consultez le Service Interne : au démarrage, il y affiche config of … is not valid - skipping.
Espaces réservés
Dans les séquences, motifs de réponse, conditions, corps et URL de caméra, le contrôleur remplace %NAME% par la valeur du paramètre NAME telle qu'elle a été saisie à la création, sinon par la valeur du profil. %CLASSNAME% (par ex. KEBA_P30_1) et %PLATFORM% sont également disponibles. Des paramètres propres, que l'appareil ne connaît pas, sont autorisés ; avec comment: true, ils restent sans effet et servent uniquement d'espaces réservés :
json
"config": {
"DEVICEID": {"value": "1", "editable": {"type": "integer", "default": "1"}, "comment": true}
},
"commands": {
"STATUS": {"sequence": "/api/device/%DEVICEID%/status", "parameterCount": 0}
}Commandes
json
"commands": {
"STATUS": {"sequence": "status?filter=frc,car,ama", "parameterCount": 0},
"SETAMA": {"sequence": "set?ama=\\#", "parameterCount": 1},
"READ_INSTANT": {"sequence": "000000000006010400000020", "parameterCount": 0, "tag": "instant"}
}| Champ | Signification |
|---|---|
| Clé | Nom de la commande en majuscules. SETNAME et GETNAME sont les commandes des actions avec "method": "set" ou "get" et "property": "NAME" |
sequence | Ce qui est envoyé, voir plus bas |
parameterCount | Nombre de \# dans la séquence et le corps |
parameter | Condition et format pour la valeur transmise, voir plus bas |
timeout | Remplace SERVERTIMEOUT_IN_MS pour cette commande (ms). 0 : envoyer et fermer immédiatement la connexion. NONE : garder la connexion ouverte après cette commande |
spacing | Remplace SPACING pour cette commande (ms) |
tag | Associe les réponses à cette commande à certains motifs de réponse, voir Tags |
httpMethod, contentType, body | Uniquement HTTP(S), voir HTTP |
Séquence
- ASCII : texte. Écrivez les caractères de contrôle et les octets quelconques sous la forme
\x0D(retour chariot),\x0A(saut de ligne), etc. Un point-virgule s'écrit\x3B. - HEX : uniquement des chiffres hexadécimaux, deux par octet, sans espace, par ex.
000000000006010400000020. - HTTP(S) : chemin avec requête, par ex.
/api/status?filter=car. Écrivez les caractères tels qu'ils sont voulus : le contrôleur encode lui-même l'adresse, un%20déjà encodé deviendrait%2520.
\# est la place de la valeur avec laquelle la commande est appelée. Plusieurs valeurs sont transmises séparées par une virgule et remplissent les places dans l'ordre. Si la valeur manque entièrement, le contrôleur n'envoie rien et signale une erreur.
En mode HEX, une valeur sans format est insérée comme exactement un octet (5 → 05, -1 → FF). Pour des valeurs plus grandes, indiquez un format comme {%hex4} (deux octets).
Paramètre
parameter a la forme Condition{%Format}, les deux étant facultatifs :
- Le format est appliqué à la valeur avant son insertion. Exemple :
"sequence": "MV\#","parameter": "{%+100,%c2,2}"transforme5en texteMV05(5 + 100 = 105, dont deux caractères à partir de la deuxième position). Tous les filtres figurent sous Filtres de format. - La condition vérifie la valeur, par ex.
>=0ou<>99. Si elle n'est pas remplie, le contrôleur n'envoie rien.
HTTP
- L'adresse est
http://ouhttps://, puisSERVERIP, puis la séquence ; le port provient deSERVERPORT. httpMethod:GET(par défaut),POST,PUT,PATCH,DELETE. Pour tout saufGET,bodyetcontentTypepeuvent être indiqués ; sanscontentType, le contrôleur détecte JSON ({,[), XML (<) ou sinon un formulaire.\#dans le corps reçoit des valeurs une fois les places de la séquence remplies.
json
"SETMODE": {"sequence": "/api/mode", "httpMethod": "POST",
"contentType": "application/json", "body": "{\"mode\": \\#}", "parameterCount": 1}- Un
GETn'est considéré comme réussi que si l'appareil répond par200avec un contenu. Les autres méthodes sont considérées comme réussies pour toute réponse2xx. - La réponse passe sous forme de texte par les motifs de réponse.
- Authentification : uniquement Basic (
USERNAME,PASSWORD). En HTTPS, le certificat n'est pas vérifié ; les certificats auto-signés fonctionnent donc. - Le délai d'une requête est
SERVERTIMEOUT_IN_MS;timeoutsur la commande n'a pas d'effet en HTTP.
Motifs de réponse
json
"mappings": {
"CAR": {"match": "\"car\":\\*,", "onChange": true},
"WH": {"match": "\"wh\":\\*,", "onChange": true, "condition": "{%/1000.00}"},
"GRID": {"match": "000000000043010440\\!48!\\^^^^^^^^", "onChange": true,
"condition": "{%swap32,%float,%*-1}", "tag": "instant"}
}| Champ | Signification |
|---|---|
| Clé | Nom de la valeur, par ex. CAR. Les retours du profil récupèrent la valeur avec "property": "CAR". |
match | Motif, voir plus bas. Les majuscules et minuscules ne jouent aucun rôle |
condition | Condition et format, comme pour le paramètre d'une commande. Le formatage a lieu d'abord, puis la vérification. Si la condition n'est pas remplie, la valeur n'est pas reprise |
onChange | true : n'exécuter localAction que si la valeur a changé. La valeur elle-même est toujours transmise |
localAction | Facultatif : commande exécutée en cas de correspondance ; \# représente la valeur. Voir Action et commandes |
tag | Voir Tags |
Motifs
Un motif est un texte (avec HEX : des chiffres hexadécimaux) dans lequel les espaces réservés commencent par \. En JSON, \ s'écrit en double : \\*.
| Espace réservé | Signification | Exemple |
|---|---|---|
\* | Capture tout jusqu'au texte qui suit | VOL=\*| sur VOL=42|MUTE=0 donne 42 |
\^ | Capture exactement un caractère ; \^^^^ en capture quatre | PWR\^ sur PWR1 donne 1 |
\? | Saute exactement un caractère ; \?? deux | 01\?\?\^^ sur 0102030405 donne 03 |
\% | Saute tout jusqu'au texte qui suit | B=\% \*X sur A=1 B=22 C=3X donne C=3 |
\!n! | Saute n caractères (avec HEX, deux caractères par octet) | 01\!4!\^^ sur 0102030405 donne 04 |
Un motif sans espace réservé vérifie seulement si le texte figure dans la réponse.
À noter :
- Un
\*tout à la fin capture tout jusqu'à la fin de la réponse. Il vaut généralement mieux indiquer le texte qui suit et termine la valeur, par exemple,ou\x0D. - Le dernier champ d'un objet JSON ne se termine pas par une virgule, mais par
}."\"power\":\\*,"ne trouve donc paspowers'il s'agit du dernier champ ; écrivez pour cela"\"power\":\\*}". Pour les appareils qui envoient les champs dans un ordre variable, interrogez plutôt un champ de plus que nécessaire, afin qu'aucun champ utile ne se trouve à la fin. - Plusieurs captures dans un motif donnent une seule valeur sans séparateur :
\?\?\^^\^^sur0001020304donne0102. - Si un motif dépasse la fin de la réponse (
\^,\?ou\!n!après le dernier caractère), il ne correspond pas. Une réponse trop courte ne fournit donc aucune valeur au lieu d'une valeur erronée.
FULL et NORMAL
MATCHINGFULL: chaque motif cherche dans la réponse entière. Le bon choix pour les réponses à structure fixe (JSON, Modbus, lignes d'état).NORMAL(par défaut) : après une correspondance, les motifs suivants ne voient plus que le reste de la réponse. L'ordre des motifs doit alors suivre l'ordre des données.
Dans les deux cas, chaque motif correspond au plus une fois par réponse. Dès qu'il existe au moins un motif, tout ce qui ne correspond à aucun est ignoré.
Nom et valeur
Si un motif capture une valeur, il transmet NAME=valeur. S'il n'en capture aucune (motif sans espace réservé, ou \* reste vide), il ne transmet que le nom. C'est pourquoi les motifs pour des réponses fixes portent la valeur dans leur nom :
json
"POWER=1": {"match": "PWON\\x0D"},
"POWER=0": {"match": "PWSTANDBY\\x0D"}Les deux fournissent la valeur POWER, une fois avec 1, une fois avec 0 ; le retour {"property": "POWER"} reçoit les deux. L'Éditeur de profils ajoute lui-même =1 à l'enregistrement lorsqu'un motif n'a aucun espace réservé pour capturer et que le nom ne contient pas encore de =.
Réponses HEX
En mode HEX, une réponse est une suite de chiffres hexadécimaux en majuscules. Une valeur capturée est convertie en décimal comme nombre non signé (00FF → 255), sauf si le format commence par %raw, %swap16, %swap32, %float ou %int16/%int32 :
- Registres signés (Modbus
INT16/INT32) :{%int16}ou{%int32}. - Nombres décimaux (
FLOAT32, ordre des octets habituel pour Modbus) :{%swap32,%float}.
Exemple Modbus TCP : la réponse à « Lire 32 registres à partir de l'adresse 0 » commence par 000000000043010440 (transaction, protocole, longueur 0x43, appareil 1, fonction 4, 0x40 octets de données). \!48! saute les 24 premiers octets (6 registres), \^^^^^^^^ capture les 4 octets suivants, soit un FLOAT32 à partir du registre 12.
Tags
Si une commande a un tag, ses réponses sont évaluées uniquement par les motifs ayant le même tag ; les réponses aux commandes sans tag uniquement par les motifs sans tag. Cela permet de distinguer des réponses de même structure, par exemple deux interrogations Modbus de plages de registres différentes. Le tag s'applique jusqu'à l'envoi de la commande suivante, y compris aux messages que l'appareil envoie de lui-même. Choisissez un SPACING au moins aussi long que le temps de réponse de l'appareil, afin qu'une réponse tardive ne soit pas attribuée à la commande suivante.
Valeurs calculées
Un motif avec un match vide et une condition de la forme {$NAME$…} calcule une valeur à partir d'autres valeurs :
json
"CHARGING": {"match": "", "onChange": true, "condition": "{$CAR$,%in2}"}$NAME$ est la dernière valeur fournie par un autre motif ; plusieurs peuvent être combinées avec + - * /. Des filtres de format suivent. Dans l'exemple, CHARGING vaut 1 si CAR a la valeur 2, sinon 0.
Messages sur plusieurs paquets
Sans délimiteur, le contrôleur évalue chaque paquet reçu séparément. Si un message plus long arrive en deux paquets TCP, un motif ne le trouve alors pas. Avec ENDDELIMITER (par ex. \x0D\x0A), le contrôleur accumule les données jusqu'à la fin du message et évalue chaque message séparément. Les délimiteurs font partie du message et figurent aussi dans le motif.
Action et commandes
Les commandes adressées au contrôleur ont la forme <CLASSE><COMMANDE></CLASSE> ou, avec une valeur, <CLASSE><COMMANDE=valeur></CLASSE>. Plusieurs commandes d'une même classe se suivent, <KEBA_P30_1><REPORT2><REPORT3></KEBA_P30_1>, de même que plusieurs classes. Les majuscules et minuscules ne jouent aucun rôle. Les classes sont :
- chaque connexion d'un appareil CommandServer, par ex.
KEBA_P30_1, avec les commandes destructure.commands, SYSpour les commandes système, par exemple :
| Commande | Effet |
|---|---|
SETVAR=ID,valeur | Définit la variable ID, voir Variables |
GETVAR=ID | Renvoie la valeur de la variable |
WAKEONLAN=00:11:22:33:44:55 | Envoie un paquet Wake-on-LAN à cette adresse MAC |
GETSERIALPORTLIST | Liste les interfaces série, voir Appareils série |
Dans le Service Interne, vous envoyez ces commandes à la main. La réponse figure dans la sortie sous la forme parser: reply sequence: …, par exemple <KEBA_P30_1>OK</KEBA_P30_1> ; une commande inconnue répond par NOK.
Action d'un motif de réponse : localAction est une telle commande. Elle est exécutée à chaque correspondance, avec onChange uniquement si la valeur a changé. \# représente la valeur capturée ; si le motif ne capture aucune valeur, une action contenant \# n'est pas exécutée. Exemples :
json
"REBOOT": {"match": "\"rbt\":\\*,", "onChange": true,
"localAction": "<SYS><SETVAR=WALLBOX_UPTIME,\\#></SYS>"},
"TV_VOLUME": {"match": "data volume \\*\\x0D", "onChange": true,
"localAction": "<AVR_1><VOLUME_SET=\\#></AVR_1>"}Le premier écrit chaque nouvelle valeur dans une variable, le second transmet le volume d'un téléviseur à un amplificateur audio-vidéo, créé comme appareil CommandServer distinct avec la classe AVR_1. Une logique avec des conditions, des horaires et plusieurs appareils relève des Automatisations ; une action sert à transmettre une valeur.
Filtres de format
Les formats figurent entre accolades à la fin de parameter ou de condition, séparés par une virgule s'il y en a plusieurs, et s'appliquent de gauche à droite : {%swap32,%float,%*-1}.
| Filtre | Effet | Exemple |
|---|---|---|
%+n, %-n, %*n, %/n | Calcul. Le résultat a autant de décimales que n | 4523.7 avec %/1000 → 5, avec %/1000.00 → 4.52 |
%int16, %int32 | Hex en nombre signé | FFFF → -1 |
%float | Hex en FLOAT32 ; le plus souvent précédé de %swap32 | %swap32,%float : 43668000 → 230.500000 |
%swap16, %swap32 | Inverser l'ordre des octets | A1B2C3D4 → d4c3b2a1 (swap32) |
%dec | Hex en nombre non signé | 00FF → 255 |
%hex, %hexN | Nombre entier en hex, sur N chiffres | 255 avec %hex4 → 00FF |
%hex8 | Nombre en FLOAT32 en hex | 1.5 → 3FC00000 |
%ascii | Hex en texte | 414243 → ABC |
%in1|2|3 | 1 si la valeur figure dans la liste, sinon 0 | 3 avec %in2|3 → 1 |
%&n, %|n | ET, OU bit à bit | 12 avec %&8 → 8 |
%shrN, %shlN | Décaler les bits | 256 avec %shr8 → 1 |
%rANCIEN,NOUVEAU | Remplacer du texte | ON avec %rON,1 → 1 |
%cS,L | L caractères à partir de la position S | Hello avec %c2,3 → ell |
%preTEXT, %sufTEXT | Ajouter du texte au début ou à la fin | |
%raw | Laisser la valeur hex inchangée | |
%h, %m, %s | Secondes en heure, par ex. {%h:%02m} | 3725 → 1:02 |
INFO
Les calculs se font avec environ sept chiffres significatifs. Les grands index de compteur (plus de sept chiffres) perdent donc leurs derniers chiffres ; convertissez-les plutôt dans une unité plus grande, par exemple les Wh en kWh.
Une condition placée avant le format compare la valeur formatée : >0, <100, =5, >=5, <=5, <>5 (différent) ou un texte qui doit être exactement identique. Un texte ne remplit aucune comparaison numérique ; un nombre comme 0.000000 ou 00 est considéré comme 0.
Variables
Une variable que vous créez sous Variables s'écrit [ID] dans les commandes, avec l'ID de la variable. Le contrôleur insère sa valeur :
| Où | Quand |
|---|---|
| Actions et commandes dans le Service Interne | à chaque exécution |
Valeurs de la connexion (structure.config), par ex. "PASSWORD": {"value": "[WALLBOX_PIN]"} | lorsque le moteur charge sa configuration, donc au démarrage ; une variable modifiée ne prend effet qu'au prochain démarrage du moteur |
| Séquences et corps HTTP | à chaque envoi, si RESOLVE_SYSVARS vaut YES ; sinon [ reste un caractère ordinaire |
| Motifs de réponse et formats | à chaque évaluation |
S'il n'existe aucune variable avec cet ID, [ID] reste tel quel sous forme de texte. Avec <SYS><SETVAR=ID,valeur></SYS>, une action définit une variable ; créez tout de même la variable sous Variables, car une variable qui n'apparaît que de cette manière n'y figure pas.
Exemple : une automatisation définit la variable WALLBOX_MAX sur le courant de charge autorisé, l'interrogation de la wallbox le transmet :
json
"RESOLVE_SYSVARS": {"value": "YES", "editable": false}
…
"LIMIT": {"sequence": "set?ama=[WALLBOX_MAX]", "parameterCount": 0}[ID] est différent des espaces réservés %NAME% : le contrôleur insère les espaces réservés une seule fois à la création de l'appareil, les variables pendant le fonctionnement.
Joignabilité
La joignabilité d'un appareil CommandServer provient de CONNECTEVENT et de DISCONNECTEVENT. Pour qu'elle arrive, le profil a besoin du retour :
json
"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}Sans CONNECTEVENT/DISCONNECTEVENT, l'appareil est toujours considéré comme joignable. Le moment où arrivent les messages dépend du protocole :
| Protocole | CONNECTEVENT | DISCONNECTEVENT |
|---|---|---|
| TCP | Connexion établie | Connexion fermée : l'appareil ferme, l'envoi échoue, heartbeat sans réponse, délai écoulé |
| UDP | À chaque démarrage, même si l'appareil est éteint | Heartbeat sans réponse |
| HTTP(S) | Chaque requête réussie | Requête échouée |
Il en découle :
- TCP :
SERVERTIMEOUT_IN_MSsurNONE. Avec une durée finie, la connexion se ferme après chaque pause, et l'appareil apparaît à chaque fois brièvement comme injoignable. AvecSTARTUPCMD,HEARTBEATCMDetRECONNECT YES, le contrôleur rétablit lui-même la connexion après une coupure. - UDP : seul un heartbeat renseigne sur l'appareil :
HEARTBEATCMDavec une commande à laquelle l'appareil répond, etHEARTBEATTIMEOUT. OmettezCONNECTEVENTet déduisez plutôtREACHABLE=1d'une réponse, comme dans l'exemple KEBA. - HTTP : une interrogation régulière vérifie aussi la joignabilité. Dans l'Éditeur de profils, un profil HTTP sans interrogation reçoit l'interrogation « Reachable Check » toutes les 30 secondes sur
/; la page d'accueil de l'appareil doit pour cela répondre par200avec un contenu. Ne définissez pasRETRYINTERVALpour HTTP. RETRYINTERVAL: si l'appareil n'est pas présent lors de l'établissement de la connexion, le contrôleur réessaie sans cesse, sansDISCONNECTEVENT. L'appareil reste alors sur son dernier état.
Appareils série
Les appareils dotés d'une interface RS232 ou RS485 se raccordent directement au contrôleur via un adaptateur USB-série :
json
"SERVERPROTOCOL": {"value": "SERIAL", "editable": false},
"SERVERIP": {"value": "LOCAL", "editable": false},
"SERVERPORT": {"value": "/dev/ttyUSB0;9600;8;N;1;NONE", "editable": {"type": "string", "default": "/dev/ttyUSB0;9600;8;N;1;NONE"}},
"SERVERMODE": {"value": "ASCII", "editable": false},
"SERVERTIMEOUT_IN_MS": {"value": "NONE", "editable": false}SERVERPORT comporte six parties, séparées par un point-virgule : appareil, débit en bauds, bits de données (5–8), parité (N aucune, E paire, O impaire), bits d'arrêt (1 ou 2) et contrôle de flux (NONE, RTSCTS, DTRDSR ou XONXOFF). À la place de l'appareil, AUTO prend la première interface trouvée.
Les interfaces que voit le contrôleur s'affichent avec <SYS><GETSERIALPORTLIST></SYS> dans le Service Interne, par exemple <SYS>GETSERIALPORTLIST=/dev/ttyUSB0|/dev/ttyUSB1|</SYS>. Sont listés les adaptateurs USB (/dev/ttyUSB…) et, s'ils existent, les interfaces intégrées /dev/ttyS0 et /dev/ttyS1 ; AUTO est la première entrée. Un adaptateur qui se présente comme /dev/ttyACM… est absent de la liste et de AUTO, mais peut être saisi avec son nom.
- Avec plusieurs adaptateurs : branchez-les un par un et interrogez la liste à chaque fois ; vous saurez ainsi quel nom correspond à quel appareil.
- Rendez
SERVERPORTmodifiable comme dans l'exemple ; l'appareil et ses paramètres se saisissent alors lors de Créer un appareil.
Limites
- Séquences, motifs et conditions : 255 caractères au maximum ; au-delà, ils sont tronqués. Un corps HTTP peut être plus long (jusqu'à environ 1000 caractères).
- Ces caractères ne sont pas possibles dans les séquences, les motifs et les valeurs : point-virgule (à écrire
\x3B), tabulation, saut de ligne,/*et*/. Un motif ne doit pas commencer par//. Une valeur contenant l'un de ces caractères, par exemple un mot de passe avec un point-virgule, est refusée lors de Créer un appareil ; le message indique le paramètre concerné. Exception :HEARTBEATCMDet unSERVERPORTsérie, qui ont besoin de leur point-virgule. - Nom de classe : 28 caractères au maximum, afin que le numéro d'ordre tienne encore ; un nom plus long est refusé.
- 100 commandes en attente au maximum par connexion ; ce qui dépasse est ignoré.
- Une valeur qui contient
|ou=est mal attribuée. Remplacez ces caractères avec%r.