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
"structure": {
"config": { "SERVERPROTOCOL": {"value": "TCP", "editable": false}, … },
"commands": { "READ": {"sequence": "…", "parameterCount": 0}, … },
"mappings": { "POWER": {"match": "…", "condition": "…", "onChange": true}, … }
}- Verbinding (
config): waarheen en hoe de controller verzendt. - Opdrachten (
commands): wat wordt verzonden. Een actie van het profiel, een polling of een automatisering roept een opdracht aan, eventueel met een waarde. - Antwoordpatronen (
mappings): wat de controller uit antwoorden en meldingen van het apparaat haalt. Elk patroon dat past, levert een benoemde waarde, bijv.POWER=1250. - De terugmeldingen van het profiel (
mappingsop het hoogste niveau) halen deze waarden op via hunproperty:{"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:
"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 metdefault.typeishost,string,password,bool(wordtYES/NO) ofinteger/float(getalveld). Daarnaast ishelpals hulptekst mogelijk. Let op: ook eenpasswordwordt in het dialoogvenster leesbaar weergegeven.comment: true: de instelling heeft geen effect, maar blijft bruikbaar als plaatsaanduiding.
| Instelling | Betekenis | Standaard |
|---|---|---|
SERVERPROTOCOL | TCP, UDP, HTTP, HTTPS of SERIAL. Een verkeerd gespelde waarde geldt als UDP | UDP |
SERVERIP | IP-adres van het apparaat. Bij TCP en UDP alleen een IPv4-adres, geen hostnaam. Bij HTTP(S) ook een hostnaam | verplicht |
SERVERPORT | Poort. 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;NONE | verplicht |
SERVERMODE | ASCII (tekst) of HEX (bytes als hexadecimale cijfers). Bij HTTP altijd ASCII | verplicht |
SERVERTIMEOUT_IN_MS | Hoelang de verbinding na de laatste opdracht open blijft en op antwoorden wacht, in ms. NONE houdt haar permanent open. Heeft voorrang op SERVERTIMEOUT | verplicht¹ |
SERVERTIMEOUT | Hetzelfde in seconden | verplicht¹ |
MATCHING | FULL of NORMAL, zie Antwoordpatronen. Voor bijna alle apparaten FULL | NORMAL |
SPACING | Pauze na elke verzonden opdracht in ms | 0 |
CONNECTEVENT, DISCONNECTEVENT | Melding bij het opbouwen of beëindigen van de verbinding, meestal REACHABLE=1 en REACHABLE=0, zie Bereikbaarheid | – |
STARTUPCMD | Opdrachten die bij de start worden verzonden, gescheiden door een komma | – |
SHUTDOWNCMD | Opdrachten die bij elk einde van de verbinding worden verzonden | – |
HEARTBEATCMD | opdracht;seconden, bijv. REPORT2;30: wordt verzonden als er zo lang geen andere opdracht is uitgevoerd | – |
HEARTBEATTIMEOUT | Wachttijd in ms op een willekeurig antwoord na de heartbeat; zonder antwoord wordt de verbinding beëindigd | 1000 |
RECONNECT | YES: na het einde van de verbinding STARTUPCMD opnieuw verzenden. Werkt alleen samen met HEARTBEATCMD en STARTUPCMD | NO |
RETRYINTERVAL | Seconden tot de volgende poging als verbinden of verzenden mislukt. Herhaalt eindeloos, zie Bereikbaarheid | 0 |
CMDPREFIX, CMDSUFFIX | Tekst voor of achter elke opdracht, bijv. /api/ bij HTTP of \x0D bij tekstprotocollen | – |
SEQUENCEPREFIX, SEQUENCESUFFIX | Tekst voor of achter het hele verzonden pakket | – |
MAPPREFIX, MAPSUFFIX | Tekst voor of achter elk antwoordpatroon | – |
STARTDELIMITER, ENDDELIMITER | Begin of einde van een melding, zie Berichten over meerdere pakketten | – |
SERVERTYPE | Controlesom, 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, PASSWORD | HTTP(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 | – |
LOCALPORT | UDP: lokale poort waarop het apparaat antwoordt; RANDOM voor een willekeurige poort. Ontbreekt de instelling, dan geldt SERVERPORT | SERVERPORT |
NEGOTIATE | TELNET: Telnet-onderhandeling beantwoorden en uit de antwoorden verwijderen | – |
RESOLVE_SYSVARS | YES: variabelen tussen vierkante haken ([ID]) in sequenties bij elke verzending invullen, zie Variabelen | NO |
URL_SAFE_CHARS | HTTP(S): tekens die in het adres niet gecodeerd moeten worden, bijv. () | – |
DEBUG | YES: elke sequentie weergeven in de Interne dienst | NO |
ACTIVE | NO schakelt de verbinding uit | YES |
¹ 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:
"config": {
"DEVICEID": {"value": "1", "editable": {"type": "integer", "default": "1"}, "comment": true}
},
"commands": {
"STATUS": {"sequence": "/api/device/%DEVICEID%/status", "parameterCount": 0}
}Opdrachten
"commands": {
"STATUS": {"sequence": "status?filter=frc,car,ama", "parameterCount": 0},
"SETAMA": {"sequence": "set?ama=\\#", "parameterCount": 1},
"READ_INSTANT": {"sequence": "000000000006010400000020", "parameterCount": 0, "tag": "instant"}
}| Veld | Betekenis |
|---|---|
| Sleutel | Naam van de opdracht in hoofdletters. SETNAME en GETNAME zijn de opdrachten voor acties met "method": "set" of "get" en "property": "NAME" |
sequence | Wat wordt verzonden, zie hieronder |
parameterCount | Aantal \# in sequentie en body |
parameter | Conditie en formaat voor de meegestuurde waarde, zie hieronder |
timeout | Vervangt SERVERTIMEOUT_IN_MS voor deze opdracht (ms). 0: verzenden en de verbinding direct sluiten. NONE: de verbinding na deze opdracht open houden |
spacing | Vervangt SPACING voor deze opdracht (ms) |
tag | Wijst antwoorden op deze opdracht toe aan bepaalde antwoordpatronen, zie Tags |
httpMethod, contentType, body | Alleen 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%20zou%2520worden.
\# 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 van5de tekstMV05(5 + 100 = 105, daarvan twee tekens vanaf de tweede positie). Alle filters staan onder Formaatfilters. - De conditie controleert de waarde, bijv.
>=0of<>99. Is ze niet vervuld, dan verzendt de controller niets.
HTTP
- Het adres is
http://ofhttps://, danSERVERIP, dan de sequentie. De poort komt uitSERVERPORT. httpMethod:GET(standaard),POST,PUT,PATCH,DELETE. Voor alles behalveGETkunnenbodyencontentTypeworden opgegeven. ZondercontentTypeherkent de controller JSON ({,[), XML (<) of anders een formulier.\#in de body neemt waarden op nadat de plekken in de sequentie zijn gevuld.
"SETMODE": {"sequence": "/api/mode", "httpMethod": "POST",
"contentType": "application/json", "body": "{\"mode\": \\#}", "parameterCount": 1}- Een
GETgeldt alleen als geslaagd als het apparaat met200en inhoud antwoordt. Andere methoden gelden bij elk antwoord2xxals 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;timeoutbij de opdracht werkt bij HTTP niet.
Antwoordpatronen
"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"}
}| Veld | Betekenis |
|---|---|
| Sleutel | Naam van de waarde, bijv. CAR. Terugmeldingen van het profiel halen de waarde op met "property": "CAR". |
match | Patroon, zie hieronder. Hoofdletters en kleine letters maken niet uit |
condition | Conditie 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 |
onChange | true: localAction alleen uitvoeren als de waarde is gewijzigd. De waarde zelf wordt altijd doorgegeven |
localAction | Optioneel: opdracht die bij een treffer wordt uitgevoerd; \# staat voor de waarde. Zie Actie en opdrachten |
tag | Zie Tags |
Patronen
Een patroon is tekst (bij HEX: hexadecimale cijfers) waarin plaatsaanduidingen met \ beginnen. In JSON wordt \ dubbel geschreven: \\*.
| Plaatsaanduiding | Betekenis | Voorbeeld |
|---|---|---|
\* | Vangt alles tot de tekst die erna volgt | VOL=\*| op VOL=42|MUTE=0 geeft 42 |
\^ | Vangt precies één teken; \^^^^ vangt er vier | PWR\^ op PWR1 geeft 1 |
\? | Slaat precies één teken over; \?? twee | 01\?\?\^^ op 0102030405 geeft 03 |
\% | Slaat alles over tot de tekst die erna volgt | B=\% \*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\":\\*,"vindtpowerdaarom 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:
\?\?\^^\^^op0001020304geeft0102. - 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
MATCHINGFULL: 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:
"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:
"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 uitstructure.commands, SYSvoor systeemopdrachten, zoals:
| Opdracht | Werking |
|---|---|
SETVAR=ID,waarde | Stelt de variabele ID in, zie Variabelen |
GETVAR=ID | Levert de waarde van de variabele |
WAKEONLAN=00:11:22:33:44:55 | Verzendt een Wake-on-LAN-pakket naar dit MAC-adres |
GETSERIALPORTLIST | Toont 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:
"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}.
| Filter | Werking | Voorbeeld |
|---|---|---|
%+n, %-n, %*n, %/n | Rekenen. Het resultaat heeft evenveel decimalen als n | 4523.7 met %/1000 → 5, met %/1000.00 → 4.52 |
%int16, %int32 | Hex als getal met teken | FFFF → -1 |
%float | Hex als FLOAT32; meestal eerst %swap32 | %swap32,%float: 43668000 → 230.500000 |
%swap16, %swap32 | Bytevolgorde omwisselen | A1B2C3D4 → d4c3b2a1 (swap32) |
%dec | Hex als getal zonder teken | 00FF → 255 |
%hex, %hexN | Geheel getal als hex, met N posities | 255 met %hex4 → 00FF |
%hex8 | Getal als FLOAT32 in hex | 1.5 → 3FC00000 |
%ascii | Hex als tekst | 414243 → ABC |
%in1|2|3 | 1 als de waarde in de lijst staat, anders 0 | 3 met %in2|3 → 1 |
%&n, %|n | Bitsgewijze AND, OR | 12 met %&8 → 8 |
%shrN, %shlN | Bits verschuiven | 256 met %shr8 → 1 |
%rOUD,NIEUW | Tekst vervangen | ON met %rON,1 → 1 |
%cS,L | L tekens vanaf positie S | Hello met %c2,3 → ell |
%preTEXT, %sufTEXT | Tekst ervoor of erachter plaatsen | |
%raw | Hex-waarde ongewijzigd laten | |
%h, %m, %s | Seconden 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:
| Waar | Wanneer |
|---|---|
| Acties en opdrachten in de Interne dienst | bij 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-bodies | bij elke verzending, als RESOLVE_SYSVARS op YES staat; anders blijft [ een gewoon teken |
| Antwoordpatronen en formaten | bij 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:
"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:
"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:
| Protocol | CONNECTEVENT | DISCONNECTEVENT |
|---|---|---|
| TCP | Verbinding opgebouwd | Verbinding beëindigd: apparaat sluit, verzenden mislukt, heartbeat zonder antwoord, tijd verstreken |
| UDP | Bij elke start, ook als het apparaat uit staat | Heartbeat zonder antwoord |
| HTTP(S) | Elk geslaagd verzoek | Verzoek mislukt |
Daaruit volgt:
- TCP:
SERVERTIMEOUT_IN_MSopNONE. Met een eindige tijd eindigt de verbinding na elke rustpauze, en verschijnt het apparaat telkens kort als niet bereikbaar. MetSTARTUPCMD,HEARTBEATCMDenRECONNECT YESbouwt de controller de verbinding na een onderbreking zelf weer op. - UDP: alleen een heartbeat zegt iets over het apparaat:
HEARTBEATCMDmet een opdracht waarop het apparaat antwoordt, enHEARTBEATTIMEOUT. LaatCONNECTEVENTweg en leidREACHABLE=1in 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 met200en inhoud antwoorden. StelRETRYINTERVALbij HTTP niet in. RETRYINTERVAL: is het apparaat bij het opbouwen van de verbinding niet aanwezig, dan probeert de controller het steeds opnieuw, zonderDISCONNECTEVENT. 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:
"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
SERVERPORTbewerkbaar 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:HEARTBEATCMDen een seriëleSERVERPORT, 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.