Skip to content

CommandServer (TCP, UDP, HTTP) ​

Een CommandServer is een eigen verbinding van de nomos system Controller met een apparaat, via TCP, UDP, HTTP, HTTPS of een seriële interface. Profielen met het motortype CommandServer ("engineType": "") beschrijven deze verbinding in het blok structure. Hoe de rest van een profiel is opgebouwd, staat onder Profielformaat; volledige voorbeelden onder Voorbeeldprofielen.

Werking ​

json
"structure": {
	"config":   { "SERVERPROTOCOL": {"value": "TCP", "editable": false}, … },
	"commands": { "READ": {"sequence": "…", "parameterCount": 0}, … },
	"mappings": { "POWER": {"match": "…", "condition": "…", "onChange": true}, … }
}
  1. Verbinding (config): waarheen en hoe de controller verzendt.
  2. Opdrachten (commands): wat wordt verzonden. Een actie van het profiel, een polling of een automatisering roept een opdracht aan, eventueel met een waarde.
  3. Antwoordpatronen (mappings): wat de controller uit antwoorden en meldingen van het apparaat haalt. Elk patroon dat past, levert een benoemde waarde, bijv. POWER=1250.
  4. De terugmeldingen van het profiel (mappings op het hoogste niveau) halen deze waarden op via hun property: {"method": "get", "property": "POWER"}.

Bij het aanmaken van een apparaat krijgt elke verbinding een eigen klassennaam uit className en een volgnummer, bijv. KEBA_P30_1. Onder deze naam kunt u opdrachten met de hand verzenden in de Interne dienst, bijvoorbeeld <KEBA_P30_1><REPORT2></KEBA_P30_1> of <KEBA_P30_1><SETCURR=16000></KEBA_P30_1>. De antwoorden volgt u in de uitvoer.

Verbinding ​

Elke instelling heeft een waarde en de aanduiding of ze bij het aanmaken van het apparaat wordt gevraagd:

json
"SERVERIP":   {"value": "", "editable": {"type": "host", "default": ""}},
"SERVERPORT": {"value": "502", "editable": {"type": "integer", "default": "502"}},
"SERVERMODE": {"value": "HEX", "editable": false}
  • editable: false: de waarde ligt vast.
  • editable: {"type": …, "default": …}: het dialoogvenster Apparaat aanmaken vraagt de waarde, vooraf ingevuld met default. type is host, string, password, bool (wordt YES/NO) of integer/float (getalveld). Daarnaast is help als hulptekst mogelijk. Let op: ook een password wordt in het dialoogvenster leesbaar weergegeven.
  • comment: true: de instelling heeft geen effect, maar blijft bruikbaar als plaatsaanduiding.
InstellingBetekenisStandaard
SERVERPROTOCOLTCP, UDP, HTTP, HTTPS of SERIAL. Een verkeerd gespelde waarde geldt als UDPUDP
SERVERIPIP-adres van het apparaat. Bij TCP en UDP alleen een IPv4-adres, geen hostnaam. Bij HTTP(S) ook een hostnaamverplicht
SERVERPORTPoort. Serieel (zie Seriële apparaten): apparaat;baud;databits;pariteit;stopbits;flow, bijv. /dev/ttyUSB0;9600;8;N;1;NONE of AUTO;9600;8;N;1;NONEverplicht
SERVERMODEASCII (tekst) of HEX (bytes als hexadecimale cijfers). Bij HTTP altijd ASCIIverplicht
SERVERTIMEOUT_IN_MSHoelang de verbinding na de laatste opdracht open blijft en op antwoorden wacht, in ms. NONE houdt haar permanent open. Heeft voorrang op SERVERTIMEOUTverplicht¹
SERVERTIMEOUTHetzelfde in secondenverplicht¹
MATCHINGFULL of NORMAL, zie Antwoordpatronen. Voor bijna alle apparaten FULLNORMAL
SPACINGPauze na elke verzonden opdracht in ms0
CONNECTEVENT, DISCONNECTEVENTMelding bij het opbouwen of beëindigen van de verbinding, meestal REACHABLE=1 en REACHABLE=0, zie Bereikbaarheid–
STARTUPCMDOpdrachten die bij de start worden verzonden, gescheiden door een komma–
SHUTDOWNCMDOpdrachten die bij elk einde van de verbinding worden verzonden–
HEARTBEATCMDopdracht;seconden, bijv. REPORT2;30: wordt verzonden als er zo lang geen andere opdracht is uitgevoerd–
HEARTBEATTIMEOUTWachttijd in ms op een willekeurig antwoord na de heartbeat; zonder antwoord wordt de verbinding beëindigd1000
RECONNECTYES: na het einde van de verbinding STARTUPCMD opnieuw verzenden. Werkt alleen samen met HEARTBEATCMD en STARTUPCMDNO
RETRYINTERVALSeconden tot de volgende poging als verbinden of verzenden mislukt. Herhaalt eindeloos, zie Bereikbaarheid0
CMDPREFIX, CMDSUFFIXTekst voor of achter elke opdracht, bijv. /api/ bij HTTP of \x0D bij tekstprotocollen–
SEQUENCEPREFIX, SEQUENCESUFFIXTekst voor of achter het hele verzonden pakket–
MAPPREFIX, MAPSUFFIXTekst voor of achter elk antwoordpatroon–
STARTDELIMITER, ENDDELIMITERBegin of einde van een melding, zie Berichten over meerdere pakketten–
SERVERTYPEControlesom, alleen bij HEX: MODBUS (CRC16 voor Modbus RTU, plaatsaanduiding XXXX in de sequentie), SUM, SUM=a-b, XOR, XOR=a-b (over de bytes a tot en met b, wordt toegevoegd), daarnaast RUS, ADNOTAM, SPEAKERCRAFT, TECNOALARM, SOUNDWEB, ESP3 voor de gelijknamige protocollen–
USERNAME, PASSWORDHTTP(S): Basic-aanmelding als beide zijn ingesteld. TCP, UDP, serieel: na het opbouwen van de verbinding wordt eerst de gebruikersnaam en dan het wachtwoord verzonden, telkens met een regeleinde. Elk maximaal 31 tekens–
LOCALPORTUDP: lokale poort waarop het apparaat antwoordt; RANDOM voor een willekeurige poort. Ontbreekt de instelling, dan geldt SERVERPORTSERVERPORT
NEGOTIATETELNET: Telnet-onderhandeling beantwoorden en uit de antwoorden verwijderen–
RESOLVE_SYSVARSYES: variabelen tussen vierkante haken ([ID]) in sequenties bij elke verzending invullen, zie VariabelenNO
URL_SAFE_CHARSHTTP(S): tekens die in het adres niet gecodeerd moeten worden, bijv. ()–
DEBUGYES: elke sequentie weergeven in de Interne dienstNO
ACTIVENO schakelt de verbinding uitYES

¹ Een van de twee tijdsaanduidingen moet zijn ingesteld.

WARNING

Een foutieve verbinding wordt zonder melding verworpen. Ontbreekt SERVERMODE of een tijdsaanduiding, is de poort ongeldig of staat bij TCP/UDP een hostnaam in plaats van een IP-adres in SERVERIP? Dan maakt de controller het apparaat wel aan, maar het verzendt en ontvangt nooit iets. Kijk in dat geval in de Interne dienst. Daar staat bij de start config of … is not valid - skipping.

Plaatsaanduidingen ​

In sequenties, antwoordpatronen, condities, bodies en camera-URL's vervangt de controller %NAME% door de waarde van de instelling NAME zoals die bij het aanmaken is ingevuld, anders door de waarde in het profiel. Daarnaast zijn %CLASSNAME% (bijv. KEBA_P30_1) en %PLATFORM% beschikbaar. Eigen instellingen die het apparaat niet kent, zijn toegestaan. Met comment: true hebben ze geen effect en dienen ze alleen als plaatsaanduiding:

json
"config": {
	"DEVICEID": {"value": "1", "editable": {"type": "integer", "default": "1"}, "comment": true}
},
"commands": {
	"STATUS": {"sequence": "/api/device/%DEVICEID%/status", "parameterCount": 0}
}

Opdrachten ​

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"}
}
VeldBetekenis
SleutelNaam van de opdracht in hoofdletters. SETNAME en GETNAME zijn de opdrachten voor acties met "method": "set" of "get" en "property": "NAME"
sequenceWat wordt verzonden, zie hieronder
parameterCountAantal \# in sequentie en body
parameterConditie en formaat voor de meegestuurde waarde, zie hieronder
timeoutVervangt SERVERTIMEOUT_IN_MS voor deze opdracht (ms). 0: verzenden en de verbinding direct sluiten. NONE: de verbinding na deze opdracht open houden
spacingVervangt SPACING voor deze opdracht (ms)
tagWijst antwoorden op deze opdracht toe aan bepaalde antwoordpatronen, zie Tags
httpMethod, contentType, bodyAlleen HTTP(S), zie HTTP

Sequentie ​

  • ASCII: tekst. Stuurtekens en willekeurige bytes schrijft u als \x0D (carriage return), \x0A (line feed) enz. Een puntkomma als \x3B.
  • HEX: alleen hexadecimale cijfers, twee per byte, zonder spaties, bijv. 000000000006010400000020.
  • HTTP(S): pad met query, bijv. /api/status?filter=car. Schrijf tekens zoals ze bedoeld zijn: de controller codeert het adres zelf. Een vooraf gecodeerde %20 zou %2520 worden.

\# is de plek voor de waarde waarmee de opdracht wordt aangeroepen. Meerdere waarden worden gescheiden door een komma doorgegeven en vullen de plekken op volgorde. Ontbreekt de waarde helemaal, dan verzendt de controller niets en meldt hij een fout.

In de HEX-modus wordt een waarde zonder formaat als precies één byte ingevoegd (5 → 05, -1 → FF). Geef voor grotere waarden een formaat op zoals {%hex4} (twee bytes).

Parameter ​

parameter heeft de vorm conditie{%formaat}. Beide delen zijn optioneel:

  • Het formaat wordt op de waarde toegepast voordat die wordt ingevoegd. Voorbeeld: "sequence": "MV\#", "parameter": "{%+100,%c2,2}" maakt van 5 de tekst MV05 (5 + 100 = 105, daarvan twee tekens vanaf de tweede positie). Alle filters staan onder Formaatfilters.
  • De conditie controleert de waarde, bijv. >=0 of <>99. Is ze niet vervuld, dan verzendt de controller niets.

HTTP ​

  • Het adres is http:// of https://, dan SERVERIP, dan de sequentie. De poort komt uit SERVERPORT.
  • httpMethod: GET (standaard), POST, PUT, PATCH, DELETE. Voor alles behalve GET kunnen body en contentType worden opgegeven. Zonder contentType herkent de controller JSON ({, [), XML (<) of anders een formulier. \# in de body neemt waarden op nadat de plekken in de sequentie zijn gevuld.
json
"SETMODE": {"sequence": "/api/mode", "httpMethod": "POST",
	"contentType": "application/json", "body": "{\"mode\": \\#}", "parameterCount": 1}
  • Een GET geldt alleen als geslaagd als het apparaat met 200 en inhoud antwoordt. Andere methoden gelden bij elk antwoord 2xx als geslaagd.
  • Het antwoord gaat als tekst door de antwoordpatronen.
  • Aanmelding: alleen Basic (USERNAME, PASSWORD). Bij HTTPS wordt het certificaat niet gecontroleerd; zelfondertekende certificaten werken dus.
  • De tijdslimiet van een verzoek is SERVERTIMEOUT_IN_MS; timeout bij de opdracht werkt bij HTTP niet.

Antwoordpatronen ​

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"}
}
VeldBetekenis
SleutelNaam van de waarde, bijv. CAR. Terugmeldingen van het profiel halen de waarde op met "property": "CAR".
matchPatroon, zie hieronder. Hoofdletters en kleine letters maken niet uit
conditionConditie en formaat, zoals bij de parameter van een opdracht. Eerst wordt geformatteerd, dan gecontroleerd. Is de conditie niet vervuld, dan wordt de waarde niet overgenomen
onChangetrue: localAction alleen uitvoeren als de waarde is gewijzigd. De waarde zelf wordt altijd doorgegeven
localActionOptioneel: opdracht die bij een treffer wordt uitgevoerd; \# staat voor de waarde. Zie Actie en opdrachten
tagZie Tags

Patronen ​

Een patroon is tekst (bij HEX: hexadecimale cijfers) waarin plaatsaanduidingen met \ beginnen. In JSON wordt \ dubbel geschreven: \\*.

PlaatsaanduidingBetekenisVoorbeeld
\*Vangt alles tot de tekst die erna volgtVOL=\*| op VOL=42|MUTE=0 geeft 42
\^Vangt precies één teken; \^^^^ vangt er vierPWR\^ op PWR1 geeft 1
\?Slaat precies één teken over; \?? twee01\?\?\^^ op 0102030405 geeft 03
\%Slaat alles over tot de tekst die erna volgtB=\% \*X op A=1 B=22 C=3X geeft C=3
\!n!Slaat n tekens over (bij HEX twee tekens per byte)01\!4!\^^ op 0102030405 geeft 04

Een patroon zonder plaatsaanduiding controleert alleen of de tekst in het antwoord voorkomt.

Let op:

  • Een \* helemaal aan het einde vangt alles tot het einde van het antwoord. Meestal is het beter de tekst erachter op te geven die de waarde afsluit, bijvoorbeeld , of \x0D.
  • Het laatste veld van een JSON-object eindigt niet met een komma, maar met }. "\"power\":\\*," vindt power daarom niet als het het laatste veld is. Schrijf daarvoor "\"power\":\\*}". Bij apparaten die velden in wisselende volgorde verzenden, vraagt u beter één veld meer op dan u nodig hebt, zodat geen benodigd veld aan het einde staat.
  • Meerdere vangplekken in één patroon geven één waarde zonder scheidingsteken: \?\?\^^\^^ op 0001020304 geeft 0102.
  • Reikt een patroon voorbij het einde van het antwoord (\^, \? of \!n! achter het laatste teken), dan past het niet. Een te kort antwoord levert dus geen waarde op in plaats van een verkeerde.

FULL en NORMAL ​

  • MATCHING FULL: elk patroon zoekt in het hele antwoord. Voor antwoorden met een vaste opbouw (JSON, Modbus, statusregels) de juiste keuze.
  • NORMAL (standaard): na een treffer zien de volgende patronen alleen nog de rest van het antwoord. De volgorde van de patronen moet dan de volgorde van de gegevens volgen.

In beide gevallen treft elk patroon per antwoord hoogstens één keer. Zodra er minstens één patroon is, wordt alles wat geen enkel patroon treft, verworpen.

Naam en waarde ​

Vangt een patroon een waarde, dan geeft het NAME=waarde door. Vangt het niets (patroon zonder plaatsaanduiding, of \* blijft leeg), dan geeft het alleen de naam door. Daarom dragen patronen voor vaste antwoorden de waarde in de naam:

json
"POWER=1": {"match": "PWON\\x0D"},
"POWER=0": {"match": "PWSTANDBY\\x0D"}

Beide leveren de waarde POWER, de ene keer met 1, de andere keer met 0. De terugmelding {"property": "POWER"} krijgt ze allebei. De Profiel Editor voegt bij het opslaan zelf =1 toe als een patroon geen plaatsaanduiding heeft om te vangen en de naam nog geen = bevat.

HEX-antwoorden ​

In de HEX-modus is een antwoord een reeks hexadecimale cijfers in hoofdletters. Een gevangen waarde wordt als getal zonder teken omgerekend naar decimaal (00FF → 255), behalve als het formaat begint met %raw, %swap16, %swap32, %float of %int16/%int32:

  • Registers met teken (Modbus INT16/INT32): {%int16} of {%int32}.
  • Decimale getallen (FLOAT32, bytevolgorde zoals gebruikelijk bij Modbus): {%swap32,%float}.

Voorbeeld Modbus TCP: het antwoord op "Lees 32 registers vanaf adres 0" begint met 000000000043010440 (transactie, protocol, lengte 0x43, apparaat 1, functie 4, 0x40 bytes gegevens). \!48! slaat de eerste 24 bytes over (6 registers), \^^^^^^^^ vangt de volgende 4 bytes, dus een FLOAT32 vanaf register 12.

Tags ​

Heeft een opdracht een tag, dan evalueren alleen de patronen met dezelfde tag de antwoorden daarop. Antwoorden op opdrachten zonder tag evalueren alleen de patronen zonder tag. Zo houdt u gelijk opgebouwde antwoorden uit elkaar, bijvoorbeeld twee Modbus-pollings van verschillende registerbereiken. De tag geldt tot de volgende opdracht wordt verzonden, ook voor meldingen die het apparaat uit zichzelf stuurt. Kies SPACING minstens zo lang als de antwoordtijd van het apparaat, zodat een laat antwoord niet aan de volgende opdracht wordt toegerekend.

Berekende waarden ​

Een patroon met een lege match en een conditie in de vorm {$NAME$…} berekent een waarde uit andere waarden:

json
"CHARGING": {"match": "", "onChange": true, "condition": "{$CAR$,%in2}"}

$NAME$ is de laatst geleverde waarde van een ander patroon. Meerdere waarden kunt u combineren met + - * /. Daarachter volgen formaatfilters. In het voorbeeld is CHARGING 1 als CAR de waarde 2 heeft, anders 0.

Berichten over meerdere pakketten ​

Zonder scheidingstekens evalueert de controller elk ontvangen pakket afzonderlijk. Komt een langere melding in twee TCP-pakketten, dan treft een patroon haar niet. Met ENDDELIMITER (bijv. \x0D\x0A) verzamelt de controller tot het einde komt, en evalueert hij elke melding afzonderlijk. De scheidingstekens horen bij de melding en staan ook in het patroon.

Actie en opdrachten ​

Opdrachten aan de controller hebben de vorm <KLASSE><OPDRACHT></KLASSE> of, met waarde, <KLASSE><OPDRACHT=waarde></KLASSE>. Meerdere opdrachten van één klasse staan achter elkaar, <KEBA_P30_1><REPORT2><REPORT3></KEBA_P30_1>, en meerdere klassen eveneens. Hoofdletters en kleine letters maken niet uit. Klassen zijn:

  • elke verbinding van een CommandServer-apparaat, bijv. KEBA_P30_1, met de opdrachten uit structure.commands,
  • SYS voor systeemopdrachten, zoals:
OpdrachtWerking
SETVAR=ID,waardeStelt de variabele ID in, zie Variabelen
GETVAR=IDLevert de waarde van de variabele
WAKEONLAN=00:11:22:33:44:55Verzendt een Wake-on-LAN-pakket naar dit MAC-adres
GETSERIALPORTLISTToont de seriële interfaces, zie Seriële apparaten

In de Interne dienst verzendt u zulke opdrachten met de hand. Het antwoord staat in de uitvoer als parser: reply sequence: …, bijvoorbeeld <KEBA_P30_1>OK</KEBA_P30_1>; een onbekende opdracht antwoordt met NOK.

Actie van een antwoordpatroon: localAction is zo'n opdracht. Ze wordt bij elke treffer uitgevoerd, met onChange alleen als de waarde is gewijzigd. \# staat voor de gevangen waarde; vangt het patroon geen waarde, dan wordt een actie met \# niet uitgevoerd. Voorbeelden:

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>"}

Het eerste schrijft elke nieuwe waarde in een variabele, het tweede geeft het volume van een televisie door aan een AV-receiver die als eigen CommandServer-apparaat met de klasse AVR_1 is aangemaakt. Logica met condities, tijden en meerdere apparaten hoort thuis in automatiseringen; een actie is bedoeld om een waarde door te geven.

Formaatfilters ​

Formaten staan tussen accolades aan het einde van parameter of condition, meerdere gescheiden door een komma. Ze werken van links naar rechts: {%swap32,%float,%*-1}.

FilterWerkingVoorbeeld
%+n, %-n, %*n, %/nRekenen. Het resultaat heeft evenveel decimalen als n4523.7 met %/1000 → 5, met %/1000.00 → 4.52
%int16, %int32Hex als getal met tekenFFFF → -1
%floatHex als FLOAT32; meestal eerst %swap32%swap32,%float: 43668000 → 230.500000
%swap16, %swap32Bytevolgorde omwisselenA1B2C3D4 → d4c3b2a1 (swap32)
%decHex als getal zonder teken00FF → 255
%hex, %hexNGeheel getal als hex, met N posities255 met %hex4 → 00FF
%hex8Getal als FLOAT32 in hex1.5 → 3FC00000
%asciiHex als tekst414243 → ABC
%in1|2|31 als de waarde in de lijst staat, anders 03 met %in2|3 → 1
%&n, %|nBitsgewijze AND, OR12 met %&8 → 8
%shrN, %shlNBits verschuiven256 met %shr8 → 1
%rOUD,NIEUWTekst vervangenON met %rON,1 → 1
%cS,LL tekens vanaf positie SHello met %c2,3 → ell
%preTEXT, %sufTEXTTekst ervoor of erachter plaatsen
%rawHex-waarde ongewijzigd laten
%h, %m, %sSeconden als tijd, bijv. {%h:%02m}3725 → 1:02

INFO

Er wordt gerekend met ongeveer zeven significante cijfers. Grote meterstanden (meer dan zeven cijfers) verliezen daardoor de laatste cijfers. Reken ze daarom liever om naar een grotere eenheid, bijvoorbeeld Wh naar kWh.

Een conditie voor het formaat vergelijkt de geformatteerde waarde: >0, <100, =5, >=5, <=5, <>5 (ongelijk) of een tekst die precies gelijk moet zijn. Een tekst voldoet aan geen enkele getalvergelijking; een getal zoals 0.000000 of 00 geldt als 0.

Variabelen ​

Een variabele die u onder Variabelen aanmaakt, staat in opdrachten als [ID], met de ID van de variabele. De controller vult haar waarde in:

WaarWanneer
Acties en opdrachten in de Interne dienstbij elke uitvoering
Waarden van de verbinding (structure.config), bijvoorbeeld "PASSWORD": {"value": "[WALLBOX_PIN]"}wanneer de engine haar configuratie laadt, dus bij de start; een gewijzigde variabele werkt pas na de volgende start van de engine
Sequenties en HTTP-bodiesbij elke verzending, als RESOLVE_SYSVARS op YES staat; anders blijft [ een gewoon teken
Antwoordpatronen en formatenbij elke evaluatie

Bestaat er geen variabele met deze ID, dan blijft [ID] als tekst staan. Met <SYS><SETVAR=ID,waarde></SYS> stelt een actie een variabele in; maak de variabele toch aan onder Variabelen, want een variabele die alleen zo ontstaat, verschijnt daar niet.

Voorbeeld: een automatisering zet de variabele WALLBOX_MAX op de toegestane laadstroom, en de polling van de wallbox stuurt die mee:

json
"RESOLVE_SYSVARS": {"value": "YES", "editable": false}
…
"LIMIT": {"sequence": "set?ama=[WALLBOX_MAX]", "parameterCount": 0}

[ID] is iets anders dan de plaatsaanduidingen %NAME%: plaatsaanduidingen vult de controller één keer in bij het aanmaken van het apparaat, variabelen tijdens de werking.

Bereikbaarheid ​

De bereikbaarheid van een CommandServer-apparaat komt uit CONNECTEVENT en DISCONNECTEVENT. Om die te ontvangen, heeft het profiel deze terugmelding nodig:

json
"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}

Zonder CONNECTEVENT/DISCONNECTEVENT geldt het apparaat altijd als bereikbaar. Wanneer de meldingen komen, hangt af van het protocol:

ProtocolCONNECTEVENTDISCONNECTEVENT
TCPVerbinding opgebouwdVerbinding beëindigd: apparaat sluit, verzenden mislukt, heartbeat zonder antwoord, tijd verstreken
UDPBij elke start, ook als het apparaat uit staatHeartbeat zonder antwoord
HTTP(S)Elk geslaagd verzoekVerzoek mislukt

Daaruit volgt:

  • TCP: SERVERTIMEOUT_IN_MS op NONE. Met een eindige tijd eindigt de verbinding na elke rustpauze, en verschijnt het apparaat telkens kort als niet bereikbaar. Met STARTUPCMD, HEARTBEATCMD en RECONNECT YES bouwt de controller de verbinding na een onderbreking zelf weer op.
  • UDP: alleen een heartbeat zegt iets over het apparaat: HEARTBEATCMD met een opdracht waarop het apparaat antwoordt, en HEARTBEATTIMEOUT. Laat CONNECTEVENT weg en leid REACHABLE=1 in plaats daarvan af uit een antwoord, zoals in het voorbeeld KEBA.
  • HTTP: een regelmatige polling controleert de bereikbaarheid mee. Een HTTP-profiel zonder polling krijgt in de Profiel Editor de polling "Reachable Check" elke 30 seconden op /. De startpagina van het apparaat moet daarvoor met 200 en inhoud antwoorden. Stel RETRYINTERVAL bij HTTP niet in.
  • RETRYINTERVAL: is het apparaat bij het opbouwen van de verbinding niet aanwezig, dan probeert de controller het steeds opnieuw, zonder DISCONNECTEVENT. Het apparaat blijft daarbij op zijn laatste toestand staan.

Seriële apparaten ​

Apparaten met een RS232- of RS485-interface sluit u via een USB-serieeladapter direct op de controller aan:

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 heeft zes delen, gescheiden door een puntkomma: apparaat, baudrate, databits (5–8), pariteit (N geen, E even, O oneven), stopbits (1 of 2) en flow control (NONE, RTSCTS, DTRDSR of XONXOFF). In plaats van het apparaat neemt AUTO de eerste gevonden interface.

Welke interfaces de controller ziet, toont <SYS><GETSERIALPORTLIST></SYS> in de Interne dienst, bijvoorbeeld <SYS>GETSERIALPORTLIST=/dev/ttyUSB0|/dev/ttyUSB1|</SYS>. Vermeld worden USB-adapters (/dev/ttyUSB…) en, indien aanwezig, de ingebouwde interfaces /dev/ttyS0 en /dev/ttyS1; AUTO is de eerste vermelding. Een adapter die zich als /dev/ttyACM… aanmeldt, ontbreekt in de lijst en bij AUTO, maar kan wel met zijn naam worden ingevuld.

  • Met meerdere adapters: sluit ze een voor een aan en vraag telkens de lijst op, dan weet u welke naam bij welk apparaat hoort.
  • Maak SERVERPORT bewerkbaar zoals in het voorbeeld, dan worden apparaat en instellingen bij Apparaat aanmaken ingevuld.

Grenzen ​

  • Sequenties, patronen en condities: maximaal 255 tekens; langere worden afgekapt. Een HTTP-body mag langer zijn (tot ongeveer 1000 tekens).
  • Deze tekens werken niet in sequenties, patronen en waarden: puntkomma (schrijf \x3B), tab, regeleinde, /* en */. Een patroon mag niet met // beginnen. Een waarde met een van deze tekens, bijvoorbeeld een wachtwoord met puntkomma, wordt bij Apparaat aanmaken geweigerd; de melding noemt de instelling. Uitzondering: HEARTBEATCMD en een seriële SERVERPORT, die hun puntkomma nodig hebben.
  • Klassennaam: maximaal 28 tekens, zodat het volgnummer er nog bij past; een langere wordt geweigerd.
  • Per verbinding maximaal 100 wachtende opdrachten; wat daarboven komt, wordt verworpen.
  • Een waarde die | of = bevat, wordt verkeerd toegewezen. Vervang zulke tekens met %r.