Skip to content

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}, … }
}
  1. Connexion (config) : où et comment le contrôleur envoie.
  2. 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.
  3. 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.
  4. Les retours du profil (mappings au niveau supérieur) récupèrent ces valeurs via leur property : {"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 avec default. type vaut host, string, password, bool (devient YES/NO) ou integer/float (champ numérique). help est possible en plus comme texte d'aide. Remarque : un password s'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ètreSignificationPar défaut
SERVERPROTOCOLTCP, UDP, HTTP, HTTPS ou SERIAL. Une valeur mal orthographiée vaut UDPUDP
SERVERIPAdresse 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ôteObligatoire
SERVERPORTPort. 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;NONEObligatoire
SERVERMODEASCII (texte) ou HEX (octets en chiffres hexadécimaux). Pour HTTP toujours ASCIIObligatoire
SERVERTIMEOUT_IN_MSDuré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 SERVERTIMEOUTObligatoire¹
SERVERTIMEOUTIdem en secondesObligatoire¹
MATCHINGFULL ou NORMAL, voir Motifs de réponse. FULL pour presque tous les appareilsNORMAL
SPACINGPause après chaque commande envoyée, en ms0
CONNECTEVENT, DISCONNECTEVENTMessage à l'établissement ou à la fin de la connexion, le plus souvent REACHABLE=1 et REACHABLE=0, voir Joignabilité–
STARTUPCMDCommandes envoyées au démarrage, séparées par une virgule–
SHUTDOWNCMDCommandes envoyées à chaque fin de connexion–
HEARTBEATCMDCommande;Secondes, par ex. REPORT2;30 : envoyée lorsqu'aucune autre commande n'a été exécutée pendant cette durée–
HEARTBEATTIMEOUTDélai d'attente en ms d'une réponse quelconque après le heartbeat ; sans réponse, la connexion est fermée1000
RECONNECTYES : après la fin de la connexion, renvoyer STARTUPCMD. Ne fonctionne qu'avec HEARTBEATCMD et STARTUPCMDNO
RETRYINTERVALSecondes avant la tentative suivante lorsque la connexion ou l'envoi échoue. Répété sans fin, voir Joignabilité0
CMDPREFIX, CMDSUFFIXTexte avant ou après chaque commande, par ex. /api/ pour HTTP ou \x0D pour les protocoles texte–
SEQUENCEPREFIX, SEQUENCESUFFIXTexte avant ou après le paquet envoyé entier–
MAPPREFIX, MAPSUFFIXTexte avant ou après chaque motif de réponse–
STARTDELIMITER, ENDDELIMITERDébut ou fin d'un message, voir Messages sur plusieurs paquets–
SERVERTYPESomme 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, PASSWORDHTTP(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–
LOCALPORTUDP : port local auquel l'appareil répond ; RANDOM pour un port aléatoire. Si le paramètre manque, SERVERPORT s'appliqueSERVERPORT
NEGOTIATETELNET : répondre à la négociation Telnet et la retirer des réponses–
RESOLVE_SYSVARSYES : insérer les variables entre crochets ([ID]) dans les séquences à chaque envoi, voir VariablesNO
URL_SAFE_CHARSHTTP(S) : caractères à ne pas encoder dans l'adresse, par ex. ()–
DEBUGYES : afficher chaque séquence dans le Service InterneNO
ACTIVENO désactive la connexionYES

¹ 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"}
}
ChampSignification
CléNom de la commande en majuscules. SETNAME et GETNAME sont les commandes des actions avec "method": "set" ou "get" et "property": "NAME"
sequenceCe qui est envoyé, voir plus bas
parameterCountNombre de \# dans la séquence et le corps
parameterCondition et format pour la valeur transmise, voir plus bas
timeoutRemplace SERVERTIMEOUT_IN_MS pour cette commande (ms). 0 : envoyer et fermer immédiatement la connexion. NONE : garder la connexion ouverte après cette commande
spacingRemplace SPACING pour cette commande (ms)
tagAssocie les réponses à cette commande à certains motifs de réponse, voir Tags
httpMethod, contentType, bodyUniquement 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 %20 dé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}" transforme 5 en texte MV05 (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. >=0 ou <>99. Si elle n'est pas remplie, le contrôleur n'envoie rien.

HTTP ​

  • L'adresse est http:// ou https://, puis SERVERIP, puis la séquence ; le port provient de SERVERPORT.
  • httpMethod : GET (par défaut), POST, PUT, PATCH, DELETE. Pour tout sauf GET, body et contentType peuvent être indiqués ; sans contentType, 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 GET n'est considéré comme réussi que si l'appareil répond par 200 avec un contenu. Les autres méthodes sont considérées comme réussies pour toute réponse 2xx.
  • 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 ; timeout sur 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"}
}
ChampSignification
CléNom de la valeur, par ex. CAR. Les retours du profil récupèrent la valeur avec "property": "CAR".
matchMotif, voir plus bas. Les majuscules et minuscules ne jouent aucun rôle
conditionCondition 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
onChangetrue : n'exécuter localAction que si la valeur a changé. La valeur elle-même est toujours transmise
localActionFacultatif : commande exécutée en cas de correspondance ; \# représente la valeur. Voir Action et commandes
tagVoir 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éSignificationExemple
\*Capture tout jusqu'au texte qui suitVOL=\*| sur VOL=42|MUTE=0 donne 42
\^Capture exactement un caractère ; \^^^^ en capture quatrePWR\^ sur PWR1 donne 1
\?Saute exactement un caractère ; \?? deux01\?\?\^^ sur 0102030405 donne 03
\%Saute tout jusqu'au texte qui suitB=\% \*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 pas power s'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 : \?\?\^^\^^ sur 0001020304 donne 0102.
  • 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 ​

  • MATCHING FULL : 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 de structure.commands,
  • SYS pour les commandes système, par exemple :
CommandeEffet
SETVAR=ID,valeurDéfinit la variable ID, voir Variables
GETVAR=IDRenvoie la valeur de la variable
WAKEONLAN=00:11:22:33:44:55Envoie un paquet Wake-on-LAN à cette adresse MAC
GETSERIALPORTLISTListe 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}.

FiltreEffetExemple
%+n, %-n, %*n, %/nCalcul. Le résultat a autant de décimales que n4523.7 avec %/1000 → 5, avec %/1000.00 → 4.52
%int16, %int32Hex en nombre signéFFFF → -1
%floatHex en FLOAT32 ; le plus souvent précédé de %swap32%swap32,%float : 43668000 → 230.500000
%swap16, %swap32Inverser l'ordre des octetsA1B2C3D4 → d4c3b2a1 (swap32)
%decHex en nombre non signé00FF → 255
%hex, %hexNNombre entier en hex, sur N chiffres255 avec %hex4 → 00FF
%hex8Nombre en FLOAT32 en hex1.5 → 3FC00000
%asciiHex en texte414243 → ABC
%in1|2|31 si la valeur figure dans la liste, sinon 03 avec %in2|3 → 1
%&n, %|nET, OU bit à bit12 avec %&8 → 8
%shrN, %shlNDécaler les bits256 avec %shr8 → 1
%rANCIEN,NOUVEAURemplacer du texteON avec %rON,1 → 1
%cS,LL caractères à partir de la position SHello avec %c2,3 → ell
%preTEXT, %sufTEXTAjouter du texte au début ou à la fin
%rawLaisser la valeur hex inchangée
%h, %m, %sSecondes 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 :

ProtocoleCONNECTEVENTDISCONNECTEVENT
TCPConnexion établieConnexion 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 éteintHeartbeat sans réponse
HTTP(S)Chaque requête réussieRequête échouée

Il en découle :

  • TCP : SERVERTIMEOUT_IN_MS sur NONE. Avec une durée finie, la connexion se ferme après chaque pause, et l'appareil apparaît à chaque fois brièvement comme injoignable. Avec STARTUPCMD, HEARTBEATCMD et RECONNECT YES, le contrôleur rétablit lui-même la connexion après une coupure.
  • UDP : seul un heartbeat renseigne sur l'appareil : HEARTBEATCMD avec une commande à laquelle l'appareil répond, et HEARTBEATTIMEOUT. Omettez CONNECTEVENT et déduisez plutôt REACHABLE=1 d'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 par 200 avec un contenu. Ne définissez pas RETRYINTERVAL pour HTTP.
  • RETRYINTERVAL : si l'appareil n'est pas présent lors de l'établissement de la connexion, le contrôleur réessaie sans cesse, sans DISCONNECTEVENT. 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 SERVERPORT modifiable 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 : HEARTBEATCMD et un SERVERPORT sé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.