Aspetto
CommandServer (TCP, UDP, HTTP)
Un CommandServer è una connessione propria del nomos system Controller verso un dispositivo, tramite TCP, UDP, HTTP, HTTPS o un'interfaccia seriale. I profili con il tipo di motore CommandServer ("engineType": "") descrivono questa connessione nel blocco structure. Come è strutturato il resto di un profilo è descritto in Formato del profilo; esempi completi in Profili di esempio.
Funzionamento
json
"structure": {
"config": { "SERVERPROTOCOL": {"value": "TCP", "editable": false}, … },
"commands": { "READ": {"sequence": "…", "parameterCount": 0}, … },
"mappings": { "POWER": {"match": "…", "condition": "…", "onChange": true}, … }
}- Connessione (
config): dove e come invia il Controller. - Comandi (
commands): che cosa viene inviato. Un'azione del profilo, un'interrogazione o un'automazione richiama un comando, eventualmente con un valore. - Pattern di risposta (
mappings): che cosa il Controller legge dalle risposte e dai messaggi del dispositivo. Ogni pattern che corrisponde fornisce un valore con nome, ad es.POWER=1250. - I feedback del profilo (
mappingsal livello più alto) prendono questi valori tramite il loroproperty:{"method": "get", "property": "POWER"}.
Alla creazione di un dispositivo ogni connessione riceve un nome classe proprio, formato da className e da un numero progressivo, ad es. KEBA_P30_1. Con questo nome può inviare comandi a mano nel Servizio interno, ad esempio <KEBA_P30_1><REPORT2></KEBA_P30_1> o <KEBA_P30_1><SETCURR=16000></KEBA_P30_1>, e seguire le risposte nell'output.
Connessione
Ogni impostazione ha un valore e l'indicazione se viene richiesta alla creazione del dispositivo:
json
"SERVERIP": {"value": "", "editable": {"type": "host", "default": ""}},
"SERVERPORT": {"value": "502", "editable": {"type": "integer", "default": "502"}},
"SERVERMODE": {"value": "HEX", "editable": false}editable: false: il valore è fisso.editable: {"type": …, "default": …}: la finestra Crea dispositivo richiede il valore, precompilato condefault.typeèhost,string,password,bool(diventaYES/NO) ointeger/float(campo numerico). È possibile anchehelpcome testo di aiuto. Nota: anche unapasswordviene mostrata in chiaro nella finestra.comment: true: l'impostazione non ha effetto, ma resta utilizzabile come segnaposto.
| Impostazione | Significato | Standard |
|---|---|---|
SERVERPROTOCOL | TCP, UDP, HTTP, HTTPS o SERIAL. Un valore scritto male vale come UDP | UDP |
SERVERIP | Indirizzo IP del dispositivo. Con TCP e UDP solo un indirizzo IPv4, nessun nome host. Con HTTP(S) anche un nome host | Obbligatorio |
SERVERPORT | Porta. Seriale (vedi Dispositivi seriali): Dispositivo;Baud;Bitdati;Parità;Bitstop;Flusso, ad es. /dev/ttyUSB0;9600;8;N;1;NONE o AUTO;9600;8;N;1;NONE | Obbligatorio |
SERVERMODE | ASCII (testo) o HEX (byte come cifre esadecimali). Con HTTP sempre ASCII | Obbligatorio |
SERVERTIMEOUT_IN_MS | Per quanto tempo la connessione resta aperta dopo l'ultimo comando e attende risposte, in ms. NONE la tiene aperta in modo permanente. Ha la precedenza su SERVERTIMEOUT | Obbligatorio¹ |
SERVERTIMEOUT | Lo stesso in secondi | Obbligatorio¹ |
MATCHING | FULL o NORMAL, vedi Pattern di risposta. Per quasi tutti i dispositivi FULL | NORMAL |
SPACING | Pausa dopo ogni comando inviato in ms | 0 |
CONNECTEVENT, DISCONNECTEVENT | Messaggio all'apertura o alla chiusura della connessione, di solito REACHABLE=1 e REACHABLE=0, vedi Raggiungibilità | – |
STARTUPCMD | Comandi inviati all'avvio, separati da virgola | – |
SHUTDOWNCMD | Comandi inviati a ogni chiusura della connessione | – |
HEARTBEATCMD | Comando;Secondi, ad es. REPORT2;30: viene inviato se per tutto questo tempo non è stato eseguito nessun altro comando | – |
HEARTBEATTIMEOUT | Tempo di attesa in ms per una risposta qualsiasi dopo l'heartbeat; senza risposta la connessione viene chiusa | 1000 |
RECONNECT | YES: dopo la chiusura della connessione inviare di nuovo STARTUPCMD. Funziona solo insieme a HEARTBEATCMD e STARTUPCMD | NO |
RETRYINTERVAL | Secondi fino al tentativo successivo se la connessione o l'invio non riescono. Ripete senza fine, vedi Raggiungibilità | 0 |
CMDPREFIX, CMDSUFFIX | Testo prima o dopo ogni comando, ad es. /api/ con HTTP o \x0D con i protocolli di testo | – |
SEQUENCEPREFIX, SEQUENCESUFFIX | Testo prima o dopo l'intero pacchetto inviato | – |
MAPPREFIX, MAPSUFFIX | Testo prima o dopo ogni pattern di risposta | – |
STARTDELIMITER, ENDDELIMITER | Inizio o fine di un messaggio, vedi Messaggi su più pacchetti | – |
SERVERTYPE | Checksum, solo con HEX: MODBUS (CRC16 per Modbus RTU, segnaposto XXXX nella sequenza), SUM, SUM=a-b, XOR, XOR=a-b (sui byte da a a b, viene aggiunta in coda), inoltre RUS, ADNOTAM, SPEAKERCRAFT, TECNOALARM, SOUNDWEB, ESP3 per i protocolli omonimi | – |
USERNAME, PASSWORD | HTTP(S): autenticazione Basic, se sono impostati entrambi. TCP, UDP, seriale: dopo l'apertura della connessione viene inviato prima il nome utente, poi la password, ciascuno con fine riga. Ciascuno al massimo 31 caratteri | – |
LOCALPORT | UDP: porta locale a cui risponde il dispositivo; RANDOM per una porta casuale. Se l'impostazione manca, vale SERVERPORT | SERVERPORT |
NEGOTIATE | TELNET: rispondere alla negoziazione Telnet e rimuoverla dalle risposte | – |
RESOLVE_SYSVARS | YES: inserire le variabili tra parentesi quadre ([ID]) nelle sequenze a ogni invio, vedi Variabili | NO |
URL_SAFE_CHARS | HTTP(S): caratteri che non devono essere codificati nell'indirizzo, ad es. () | – |
DEBUG | YES: mostrare ogni sequenza nel Servizio interno | NO |
ACTIVE | NO disattiva la connessione | YES |
¹ Deve essere impostata una delle due indicazioni di tempo.
WARNING
Una connessione errata viene scartata senza messaggio. Se manca SERVERMODE o un'indicazione di tempo, se la porta non è valida o se con TCP/UDP in SERVERIP c'è un nome host invece di un indirizzo IP, il Controller crea sì il dispositivo, ma questo non invia né riceve mai nulla. In questo caso controlli nel Servizio interno: all'avvio lì compare config of … is not valid - skipping.
Segnaposto
In sequenze, pattern di risposta, condizioni, corpi e URL delle telecamere il Controller sostituisce %NAME% con il valore dell'impostazione NAME come è stato inserito alla creazione, altrimenti con il valore nel profilo. Sono inoltre disponibili %CLASSNAME% (ad es. KEBA_P30_1) e %PLATFORM%. Sono ammesse impostazioni proprie che il dispositivo non conosce; con comment: true restano senza effetto e servono solo come segnaposto:
json
"config": {
"DEVICEID": {"value": "1", "editable": {"type": "integer", "default": "1"}, "comment": true}
},
"commands": {
"STATUS": {"sequence": "/api/device/%DEVICEID%/status", "parameterCount": 0}
}Comandi
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"}
}| Campo | Significato |
|---|---|
| Chiave | Nome del comando in lettere maiuscole. SETNAME e GETNAME sono i comandi per le azioni con "method": "set" o "get" e "property": "NAME" |
sequence | Che cosa viene inviato, vedi sotto |
parameterCount | Numero di \# nella sequenza e nel corpo |
parameter | Condizione e formato per il valore inviato, vedi sotto |
timeout | Sostituisce SERVERTIMEOUT_IN_MS per questo comando (ms). 0: inviare e chiudere subito la connessione. NONE: tenere aperta la connessione dopo questo comando |
spacing | Sostituisce SPACING per questo comando (ms) |
tag | Assegna le risposte a questo comando a determinati pattern di risposta, vedi Tag |
httpMethod, contentType, body | Solo HTTP(S), vedi HTTP |
Sequenza
- ASCII: testo. I caratteri di controllo e i byte qualsiasi li scrive come
\x0D(ritorno a capo),\x0A(avanzamento riga) e così via. Un punto e virgola come\x3B. - HEX: solo cifre esadecimali, due per byte, senza spazi, ad es.
000000000006010400000020. - HTTP(S): percorso con query, ad es.
/api/status?filter=car. Scriva i caratteri così come sono intesi: il Controller codifica l'indirizzo da sé, un%20già codificato diventerebbe%2520.
\# è il posto per il valore con cui viene richiamato il comando. Più valori vengono passati separati da virgola e riempiono i posti in ordine. Se il valore manca del tutto, il Controller non invia nulla e segnala un errore.
In modalità HEX un valore senza formato viene inserito come esattamente un byte (5 → 05, -1 → FF). Per valori più grandi indichi un formato come {%hex4} (due byte).
Parametro
parameter ha la forma Condizione{%Formato}, entrambe le parti sono facoltative:
- Il formato viene applicato al valore prima che venga inserito. Esempio:
"sequence": "MV\#","parameter": "{%+100,%c2,2}"trasforma5nel testoMV05(5 + 100 = 105, di cui due caratteri dalla seconda posizione). Tutti i filtri si trovano in Filtri di formato. - La condizione verifica il valore, ad es.
>=0o<>99. Se non è soddisfatta, il Controller non invia nulla.
HTTP
- L'indirizzo è
http://ohttps://, poiSERVERIP, poi la sequenza; la porta viene daSERVERPORT. httpMethod:GET(standard),POST,PUT,PATCH,DELETE. Per tutto tranneGETsi possono indicarebodyecontentType; senzacontentTypeil Controller riconosce JSON ({,[), XML (<) o altrimenti un modulo.\#nel corpo accoglie valori dopo che i posti della sequenza sono stati riempiti.
json
"SETMODE": {"sequence": "/api/mode", "httpMethod": "POST",
"contentType": "application/json", "body": "{\"mode\": \\#}", "parameterCount": 1}- Un
GETvale come riuscito solo se il dispositivo risponde con200e contenuto. Gli altri metodi valgono come riusciti con qualsiasi risposta2xx. - La risposta passa come testo attraverso i pattern di risposta.
- Autenticazione: solo Basic (
USERNAME,PASSWORD). Con HTTPS il certificato non viene verificato; i certificati autofirmati funzionano quindi. - Il limite di tempo di una richiesta è
SERVERTIMEOUT_IN_MS;timeoutnel comando non ha effetto con HTTP.
Pattern di risposta
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"}
}| Campo | Significato |
|---|---|
| Chiave | Nome del valore, ad es. CAR. I feedback del profilo prendono il valore con "property": "CAR". |
match | Pattern, vedi sotto. Maiuscole e minuscole non contano |
condition | Condizione e formato, come per il parametro di un comando. Prima si formatta, poi si verifica. Se la condizione non è soddisfatta, il valore non viene acquisito |
onChange | true: eseguire localAction solo se il valore è cambiato. Il valore stesso viene sempre trasmesso |
localAction | Facoltativo: comando eseguito a ogni corrispondenza; \# sta per il valore. Vedi Azione e comandi |
tag | Vedi Tag |
Pattern
Un pattern è testo (con HEX: cifre esadecimali) in cui i segnaposto iniziano con \. Nel JSON \ si scrive doppio: \\*.
| Segnaposto | Significato | Esempio |
|---|---|---|
\* | Cattura tutto fino al testo che segue | VOL=\*| su VOL=42|MUTE=0 dà 42 |
\^ | Cattura esattamente un carattere; \^^^^ ne cattura quattro | PWR\^ su PWR1 dà 1 |
\? | Salta esattamente un carattere; \?? due | 01\?\?\^^ su 0102030405 dà 03 |
\% | Salta tutto fino al testo che segue | B=\% \*X su A=1 B=22 C=3X dà C=3 |
\!n! | Salta n caratteri (con HEX due caratteri per byte) | 01\!4!\^^ su 0102030405 dà 04 |
Un pattern senza segnaposto verifica solo se il testo compare nella risposta.
Da osservare:
- Un
\*proprio alla fine cattura tutto fino alla fine della risposta. Di solito è meglio indicare il testo che segue e chiude il valore, ad esempio,o\x0D. - L'ultimo campo di un oggetto JSON non termina con una virgola, ma con
}."\"power\":\\*,"non trova quindipowerse è l'ultimo campo; in questo caso scriva"\"power\":\\*}". Con dispositivi che inviano i campi in ordine variabile, è meglio interrogare un campo in più del necessario, così nessun campo richiesto si trova alla fine. - Più punti di cattura in un pattern danno un valore senza separatore:
\?\?\^^\^^su0001020304dà0102. - Se un pattern va oltre la fine della risposta (
\^,\?o\!n!dopo l'ultimo carattere), non corrisponde. Una risposta troppo corta non fornisce quindi alcun valore, invece di uno sbagliato.
FULL e NORMAL
MATCHINGFULL: ogni pattern cerca nell'intera risposta. La scelta giusta per risposte con struttura fissa (JSON, Modbus, righe di stato).NORMAL(standard): dopo una corrispondenza i pattern successivi vedono solo il resto della risposta. L'ordine dei pattern deve allora seguire l'ordine dei dati.
In entrambi i casi ogni pattern corrisponde al massimo una volta per risposta. Non appena esiste almeno un pattern, tutto ciò che non corrisponde a nessuno viene scartato.
Nome e valore
Se un pattern cattura un valore, trasmette NAME=valore. Se non ne cattura nessuno (pattern senza segnaposto, oppure \* resta vuoto), trasmette solo il nome. Per questo i pattern per risposte fisse portano il valore nel nome:
json
"POWER=1": {"match": "PWON\\x0D"},
"POWER=0": {"match": "PWSTANDBY\\x0D"}Entrambi forniscono il valore POWER, una volta con 1, una volta con 0; il feedback {"property": "POWER"} li riceve entrambi. L'Editor profilo aggiunge da sé =1 al salvataggio, se un pattern non ha un segnaposto per catturare e il nome non contiene ancora un =.
Risposte HEX
In modalità HEX una risposta è una sequenza di cifre esadecimali in lettere maiuscole. Un valore catturato viene convertito in decimale come numero senza segno (00FF → 255), tranne se il formato inizia con %raw, %swap16, %swap32, %float o %int16/%int32:
- Registri con segno (Modbus
INT16/INT32):{%int16}o{%int32}. - Numeri decimali (
FLOAT32, ordine dei byte come d'uso con Modbus):{%swap32,%float}.
Esempio Modbus TCP: la risposta a «Leggi 32 registri dall'indirizzo 0» inizia con 000000000043010440 (transazione, protocollo, lunghezza 0x43, dispositivo 1, funzione 4, 0x40 byte di dati). \!48! salta i primi 24 byte (6 registri), \^^^^^^^^ cattura i 4 byte successivi, cioè un FLOAT32 dal registro 12.
Tag
Se un comando ha un tag, le sue risposte vengono valutate solo dai pattern con lo stesso tag; le risposte ai comandi senza tag solo dai pattern senza tag. Così si possono distinguere risposte con la stessa struttura, ad esempio due interrogazioni Modbus di aree di registri diverse. Il tag vale finché non viene inviato il comando successivo, anche per i messaggi che il dispositivo invia di sua iniziativa. Scelga SPACING almeno lungo quanto il tempo di risposta del dispositivo, così una risposta tardiva non viene attribuita al comando successivo.
Valori calcolati
Un pattern con match vuoto e una condizione della forma {$NAME$…} calcola un valore da altri valori:
json
"CHARGING": {"match": "", "onChange": true, "condition": "{$CAR$,%in2}"}$NAME$ è l'ultimo valore fornito da un altro pattern; più valori si possono combinare con + - * /. Seguono i filtri di formato. Nell'esempio CHARGING è 1 se CAR ha il valore 2, altrimenti 0.
Messaggi su più pacchetti
Senza delimitatori il Controller valuta ogni pacchetto ricevuto singolarmente. Se un messaggio più lungo arriva in due pacchetti TCP, un pattern allora non lo trova. Con ENDDELIMITER (ad es. \x0D\x0A) il Controller raccoglie i dati finché arriva la fine, e valuta ogni messaggio singolarmente. I delimitatori fanno parte del messaggio e compaiono anche nel pattern.
Azione e comandi
I comandi al Controller hanno la forma <CLASSE><COMANDO></CLASSE> oppure, con un valore, <CLASSE><COMANDO=valore></CLASSE>. Più comandi di una classe si scrivono uno dopo l'altro, <KEBA_P30_1><REPORT2><REPORT3></KEBA_P30_1>, e lo stesso vale per più classi. Maiuscole e minuscole non contano. Le classi sono:
- ogni connessione di un dispositivo CommandServer, ad es.
KEBA_P30_1, con i comandi distructure.commands, SYSper i comandi di sistema, ad esempio:
| Comando | Effetto |
|---|---|
SETVAR=ID,valore | Imposta la variabile ID, vedi Variabili |
GETVAR=ID | Restituisce il valore della variabile |
WAKEONLAN=00:11:22:33:44:55 | Invia un pacchetto Wake-on-LAN a questo indirizzo MAC |
GETSERIALPORTLIST | Elenca le interfacce seriali, vedi Dispositivi seriali |
Nel Servizio interno può inviare questi comandi a mano. La risposta compare nell'output come parser: reply sequence: …, ad esempio <KEBA_P30_1>OK</KEBA_P30_1>; un comando sconosciuto risponde con NOK.
Azione di un pattern di risposta: localAction è un comando di questo tipo. Viene eseguito a ogni corrispondenza, con onChange solo se il valore è cambiato. \# sta per il valore catturato; se il pattern non cattura alcun valore, un'azione con \# non viene eseguita. Esempi:
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>"}Il primo scrive ogni nuovo valore in una variabile, il secondo trasmette il volume di un televisore a un ricevitore AV, creato come dispositivo CommandServer a sé stante con la classe AVR_1. La logica con condizioni, orari e più dispositivi va nelle Automazioni; un'azione serve a trasmettere un valore.
Filtri di formato
I formati si trovano tra parentesi graffe alla fine di parameter o condition, più formati separati da virgola, e agiscono da sinistra a destra: {%swap32,%float,%*-1}.
| Filtro | Effetto | Esempio |
|---|---|---|
%+n, %-n, %*n, %/n | Calcolo. Il risultato ha tanti decimali quanti n | 4523.7 con %/1000 → 5, con %/1000.00 → 4.52 |
%int16, %int32 | Hex come numero con segno | FFFF → -1 |
%float | Hex come FLOAT32; prima di solito %swap32 | %swap32,%float: 43668000 → 230.500000 |
%swap16, %swap32 | Invertire l'ordine dei byte | A1B2C3D4 → d4c3b2a1 (swap32) |
%dec | Hex come numero senza segno | 00FF → 255 |
%hex, %hexN | Numero intero come hex, con N cifre | 255 con %hex4 → 00FF |
%hex8 | Numero come FLOAT32 in hex | 1.5 → 3FC00000 |
%ascii | Hex come testo | 414243 → ABC |
%in1|2|3 | 1 se il valore è nell'elenco, altrimenti 0 | 3 con %in2|3 → 1 |
%&n, %|n | AND, OR bit a bit | 12 con %&8 → 8 |
%shrN, %shlN | Spostare i bit | 256 con %shr8 → 1 |
%rVECCHIO,NUOVO | Sostituire testo | ON con %rON,1 → 1 |
%cS,L | L caratteri dalla posizione S | Hello con %c2,3 → ell |
%preTEXT, %sufTEXT | Anteporre o aggiungere testo | |
%raw | Lasciare invariato il valore hex | |
%h, %m, %s | Secondi come tempo, ad es. {%h:%02m} | 3725 → 1:02 |
INFO
Si calcola con circa sette cifre significative. I valori grandi dei contatori (più di sette cifre) perdono così le ultime cifre; è meglio convertirli in un'unità più grande, ad esempio da Wh a kWh.
Una condizione prima del formato confronta il valore formattato: >0, <100, =5, >=5, <=5, <>5 (diverso) o un testo che deve essere esattamente uguale. Un testo non soddisfa alcun confronto numerico; un numero come 0.000000 o 00 vale come 0.
Variabili
Una variabile che crea in Variabili si scrive nei comandi come [ID], con l'ID della variabile. Il Controller ne inserisce il valore:
| Dove | Quando |
|---|---|
| Azioni e comandi nel Servizio interno | a ogni esecuzione |
Valori della connessione (structure.config), ad esempio "PASSWORD": {"value": "[WALLBOX_PIN]"} | quando il motore carica la sua configurazione, cioè all'avvio; una variabile modificata ha effetto solo dopo il successivo avvio del motore |
| Sequenze e corpi HTTP | a ogni invio, se RESOLVE_SYSVARS è impostato su YES; altrimenti [ resta un carattere normale |
| Pattern di risposta e formati | a ogni valutazione |
Se non esiste alcuna variabile con questo ID, [ID] resta come testo. Con <SYS><SETVAR=ID,valore></SYS> un'azione imposta una variabile; crei comunque la variabile in Variabili, perché una variabile che nasce solo in questo modo lì non compare.
Esempio: un'automazione imposta la variabile WALLBOX_MAX sulla corrente di carica consentita, l'interrogazione della wallbox la invia insieme:
json
"RESOLVE_SYSVARS": {"value": "YES", "editable": false}
…
"LIMIT": {"sequence": "set?ama=[WALLBOX_MAX]", "parameterCount": 0}[ID] è una cosa diversa dai segnaposto %NAME%: il Controller inserisce i segnaposto una volta sola alla creazione del dispositivo, le variabili durante il funzionamento.
Raggiungibilità
La raggiungibilità di un dispositivo CommandServer deriva da CONNECTEVENT e DISCONNECTEVENT. Perché arrivi, il profilo ha bisogno del feedback:
json
"reachable": {"method": "get", "property": "REACHABLE", "datatype": "bool", "defaultValue": false}Senza CONNECTEVENT/DISCONNECTEVENT il dispositivo vale sempre come raggiungibile. Quando arrivano i messaggi dipende dal protocollo:
| Protocollo | CONNECTEVENT | DISCONNECTEVENT |
|---|---|---|
| TCP | Connessione aperta | Connessione chiusa: il dispositivo chiude, l'invio non riesce, heartbeat senza risposta, tempo scaduto |
| UDP | A ogni avvio, anche se il dispositivo è spento | Heartbeat senza risposta |
| HTTP(S) | Ogni richiesta riuscita | Richiesta non riuscita |
Ne consegue:
- TCP:
SERVERTIMEOUT_IN_MSsuNONE. Con un tempo finito la connessione si chiude dopo ogni pausa e il dispositivo appare ogni volta per breve tempo come non raggiungibile. ConSTARTUPCMD,HEARTBEATCMDeRECONNECT YESil Controller riapre da sé la connessione dopo un'interruzione. - UDP: solo un heartbeat dice qualcosa sul dispositivo:
HEARTBEATCMDcon un comando a cui il dispositivo risponde, eHEARTBEATTIMEOUT. OmettaCONNECTEVENTe ricavi inveceREACHABLE=1da una risposta, come nell'esempio KEBA. - HTTP: un'interrogazione regolare verifica anche la raggiungibilità. Un profilo HTTP senza interrogazione riceve nell'Editor profilo l'interrogazione «Reachable Check» ogni 30 secondi su
/; la pagina iniziale del dispositivo deve rispondere a questo scopo con200e contenuto. Con HTTP non impostiRETRYINTERVAL. RETRYINTERVAL: se il dispositivo non c'è all'apertura della connessione, il Controller riprova continuamente, senzaDISCONNECTEVENT. Il dispositivo resta così fermo sul suo ultimo stato.
Dispositivi seriali
I dispositivi con interfaccia RS232 o RS485 li collega direttamente al Controller tramite un adattatore USB-seriale:
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 ha sei parti, separate da punto e virgola: dispositivo, baud rate, bit di dati (5–8), parità (N nessuna, E pari, O dispari), bit di stop (1 o 2) e controllo di flusso (NONE, RTSCTS, DTRDSR o XONXOFF). Al posto del dispositivo, AUTO prende la prima interfaccia trovata.
Quali interfacce vede il Controller lo mostra <SYS><GETSERIALPORTLIST></SYS> nel Servizio interno, ad esempio <SYS>GETSERIALPORTLIST=/dev/ttyUSB0|/dev/ttyUSB1|</SYS>. Vengono elencati gli adattatori USB (/dev/ttyUSB…) e, se presenti, le interfacce integrate /dev/ttyS0 e /dev/ttyS1; AUTO è la prima voce. Un adattatore che si presenta come /dev/ttyACM… manca nell'elenco e con AUTO, ma si può inserire con il suo nome.
- Con più adattatori: li colleghi uno alla volta e interroghi l'elenco ogni volta, così sa quale nome appartiene a quale dispositivo.
- Renda
SERVERPORTmodificabile come nell'esempio, così il dispositivo e le impostazioni si inseriscono con Crea dispositivo.
Limiti
- Sequenze, pattern e condizioni: al massimo 255 caratteri; quelli più lunghi vengono troncati. Un corpo HTTP può essere più lungo (fino a circa 1000 caratteri).
- Questi caratteri non funzionano in sequenze, pattern e valori: punto e virgola (da scrivere come
\x3B), tabulazione, a capo,/*e*/. Un pattern non può iniziare con//. Un valore con uno di questi caratteri, ad esempio una password con punto e virgola, viene rifiutato con Crea dispositivo; il messaggio indica l'impostazione. Eccezione:HEARTBEATCMDe unSERVERPORTseriale, che hanno bisogno del loro punto e virgola. - Nome classe: al massimo 28 caratteri, così che il numero progressivo ci stia ancora; uno più lungo viene rifiutato.
- Per ogni connessione al massimo 100 comandi in attesa; quelli in eccesso vengono scartati.
- Un valore che contiene
|o=viene assegnato in modo errato. Sostituisca tali caratteri con%r.