TapHome

Packet-Parser-Funktionen

Packet-Parser-Funktionen der TapHome-Skripte — HTTPREQUEST, SENDHTTPREQUEST, SENDDATA, MQTTPUBLISH, FTPDOWNLOAD, FTPUPLOAD, COMPLETESERVICEATTRIBUTE und COMPLETESERVICEACTION — für HTTP, TCP, UDP, MQTT und FTP.

Packet-Parser-Funktionen kommunizieren mit Geräten über HTTP, TCP, UDP, MQTT und FTP. Sie funktionieren nur in den Skripten eines Packet-Parser-Moduls oder -Geräts, dessen Protokoll zur Funktion passt; anderswo hält das Skript mit PacketParserFunction - PacketParserContext is null an. Alle erfordern Core 2022.2 oder neuer. Die Einrichtung eines Packet-Parser-Moduls ist unter Packet Parser beschrieben; eingehende Nachrichten werden in Listener-Skripten verarbeitet, und Modbus-Geräte haben eigene Modbus-Funktionen.

Protokolle und Skripte

Jedes Protokoll hat eigene Funktionen und eine typische Aufgabenteilung zwischen den Skripten.

ProtokollFunktionenTypische Skripte
HTTPHTTPREQUEST, SENDHTTPREQUESTDas Leseskript des Moduls sendet eine Anfrage und speichert die Antwort in einer Modulvariablen; die Leseskripte der Geräte parsen sie.
TCP, UDPSENDDATALese- oder Schreibskripte senden eine Anfrage; die Antwort kommt im Listener-Skript an.
MQTTMQTTPUBLISHDas Listener-Skript verarbeitet eingehende Nachrichten; das Schreibskript veröffentlicht Befehle.
FTPFTPDOWNLOAD, FTPUPLOADLese- und Schreibskripte übertragen Dateien.

Beispiel — eine HTTP-Anfrage für alle Geräte eines Moduls

VAR response := SENDHTTPREQUEST("/status", "GET");
StatusJson := response.Content;
PARSEJSON(StatusJson, "temperature");

Das erste Skript ist das Leseskript des Moduls, das zweite ein Leseskript eines Geräts; StatusJson ist eine Modulvariable.

HTTPREQUEST

HTTPREQUEST erstellt einen httprequest-Wert, dessen Pfad, Methode, Body und Header geändert werden können, bevor er mit SENDHTTPREQUEST gesendet wird.

1
HTTPREQUEST(path [, method [, body]])

Hinweise — Die Standardmethode ist GET. Die Eigenschaften PATH, METHOD, BODY und HEADERS können gelesen und geschrieben werden; HEADERS ist eine Sammlung von Strings der Form "Name: value". Die Funktion erstellt nur einen Wert und funktioniert daher in jedem Skript.

Beispiel

VAR request := HTTPREQUEST("/api/v1/state", "POST", "{\"on\":true}");
request.HEADERS := {"Content-Type: application/json", "Authorization: Bearer " + token};
VAR response := SENDHTTPREQUEST(request);

SENDHTTPREQUEST

SENDHTTPREQUEST sendet eine HTTP-Anfrage, wartet auf die Antwort und gibt sie als httpresponse-Wert mit den Eigenschaften Content, StatusCode, ReasonPhrase, IsSuccess und Headers zurück.

1
2
SENDHTTPREQUEST(path [, method [, body [, header1, header2, …]]])
SENDHTTPREQUEST(request)
NameTypBeschreibung
pathStringPfad auf dem im Modul eingestellten Gerät, zum Beispiel "/status".
methodString, optionalGET (Standard), POST, PUT, …
bodyString, optionalBody der Anfrage.
header1 …String, optionalBis zu 27 Header als "Name: value".
requesthttprequestEine mit HTTPREQUEST erstellte Anfrage.

Rückgabewert — httpresponse:

EigenschaftBedeutung
ContentDer Body der Antwort als Text.
StatusCodeHTTP-Statuscode, zum Beispiel 200.
ReasonPhraseStatustext, zum Beispiel OK.
IsSuccessTRUE für die Statuscodes 200 – 299.
HeadersHeader der Antwort als JSON-Text — ein Array aus {"Key": …, "Value": [ … ]} —, lesbar mit PARSEJSON.

Hinweise — Nur für ein Modul mit dem Protokoll HTTP. Die Antwort darf höchstens 128 kB groß sein.

Beispiel

VAR response := SENDHTTPREQUEST("/status", "GET");
IF response.IsSuccess
    StatusJson := response.Content;
ELSE
    ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
END
SENDHTTPREQUEST("/doSomething", "POST", "someData", "header1: value1", "header2: value2");

Fehler — Response is too long (Nbytes). Maximum supported length is 128KB; PacketParserFunction - unable to use ‘SENDHTTPREQUEST’ with … (das Modul verwendet ein anderes Protokoll).

SENDDATA

SENDDATA sendet einen String oder eine Bytesammlung über TCP oder UDP und gibt TRUE zurück; die Antwort kommt im Listener-Skript an.

1
SENDDATA(data)

Hinweise — Ein String wird als iso-8859-1-Bytes gesendet. Eine Sammlung muss eine collection<uint8> sein. Eingehende Daten werden dem Listener-Skript in Blöcken von höchstens 4096 Bytes übergeben.

Beispiel

SENDDATA(BYTECOLLECTION("0a dd ef a2"));
SENDDATA("STATUS?\r\n");

MQTTPUBLISH

MQTTPUBLISH veröffentlicht eine Nachricht mit dem angegebenen Topic beim MQTT-Broker des Moduls und gibt Null zurück.

1
MQTTPUBLISH(topic, data)

Hinweise — data ist ein String oder eine collection<uint8>. Ein vom Broker gemeldeter Fehler hält das Skript mit dessen Text an. Der Broker wird unter MQTT Broker eingerichtet.

Beispiel

MQTTPUBLISH("shellies/" + plugTopic + "/relay/0/command", IF(St > 0, "on", "off"));

FTPDOWNLOAD

FTPDOWNLOAD lädt eine Datei vom FTP-Server des Moduls herunter und gibt ihren Inhalt als Bytesammlung (collection<uint8>) zurück.

1
FTPDOWNLOAD(path)

Beispiel

VAR data := FTPDOWNLOAD("/export/values.csv");
VAR csv := TOSTRING(data, "utf-8");

FTPUPLOAD

FTPUPLOAD schreibt Daten in eine Datei auf dem FTP-Server des Moduls — mit "write" (Standard) wird die Datei ersetzt, mit "append" an ihr Ende angehängt.

1
FTPUPLOAD(path, data [, mode])

Hinweise — data ist ein String oder eine collection<uint8>. mode muss kleingeschrieben sein.

Beispiel

FTPUPLOAD("/path/to/file", "some data", "write");
FTPUPLOAD("/path/to/file", BYTECOLLECTION("a7 ff e2"), "append");

Fehler — FTPUPLOAD - invalid argument, upload mode must be ‘append’ or ‘write’.

COMPLETESERVICEATTRIBUTE

COMPLETESERVICEATTRIBUTE liefert den Wert eines Service-Attributs aus einem TCP- oder UDP-Listener-Skript an die App, nachdem das Skript des Attributs die Anfrage mit SENDDATA gesendet hat.

1
COMPLETESERVICEATTRIBUTE(name, value [, error])

Hinweise — name ist der Name des Service-Attributs. Mit error zeigt das Attribut den Fehlertext statt eines Wertes an. Gibt Null zurück.

Beispiel

COMPLETESERVICEATTRIBUTE("Uptime", "2d:21h:43m");
COMPLETESERVICEATTRIBUTE("Status", "", "Device is offline");

COMPLETESERVICEACTION

COMPLETESERVICEACTION meldet das Ergebnis einer Service-Aktion aus einem TCP- oder UDP-Listener-Skript an die App, nachdem das Skript der Aktion die Anfrage mit SENDDATA gesendet hat.

1
COMPLETESERVICEACTION(name, result)

Beispiel

COMPLETESERVICEACTION("Reboot", "Rebooted successfully");

Fehler — No service action with name X.

Siehe auch — Listener-Skripte, Parsing-Funktionen, Konvertierung von Datentypen.