Virtueller HTTP-Eingang

Mit dem Virtuellen HTTP Eingang und den Virtueller HTTP Eingang Befehl-Funktionen kann vom Loxone Miniserver in einem festgelegten Intervall eine Webseite abgerufen und daraus Werte extrahiert werden.

Der Aufbau ist dabei folgendermaßen:

  • In einem "Virtueller HTTP Eingang" wird die URL und das Zeitintervall hinterlegt. Beim abgerufenen Inhalt kann es sich um ein beliebiges Dokument im Textformat handeln (z.B. HTML, XML, JSON).
  • Dem "Virtuellen HTTP Eingang" kann man einen oder mehrere "Virtueller HTTP Eingang Befehl"-Funktionen zuordnen. Jeder Eingangsbefehl führt aufgrund der angegebenen "Befehlserkennung" eine Stringsuche im abgerufenen Dokument durch und gibt einen Wert als Eingang aus.
  • Durch mehrere HTTP-Eingangs-Befehle können mehrere Werte einer Seite ausgelesen werden.
  • Die Syntax für die Befehlserkennung wird im Syntaxfeld (im Eigenschaftsfenster unten) angezeigt.


Wichtig ist, dass beim Erstellen der Befehlserkennung aus einer Webseite der Seitenquelltext angezeigt wird (in Chrome: Rechts-Klick, Seitenquelltext anzeigen). Es muss sich um den reinen Quelltext handeln, nicht um eine vom Webbrowser aufbereitete Variante, da dadurch Zeilenumbrüche, Leerzeichen, Anführungszeichen usw. nicht mehr stimmen! Auch die Anzeige des Codes mit F12 (Entwicklertools) des Browsers kann dafür nicht verwendet werden!

Wer einen LoxBerry hat, kann zur Unterstützung bei der Erstellung einer Befehlserkennung das LoxBerry-Plugin Command Recognition - Befehlserkennung verwenden.


Dokumentation (Loxone Website)

Limitierungen

Alle HTTP Requests inkl. dem Request für den Türstations-Bilderabruf werden von nur einem Thread bearbeitet. D.h. stockt bei einem die Verarbeitung (Timeout/lange Responsezeit), kann sich dies negativ auf alle weiteren Requests auswirken. Wichtig ist hierbei auch einen geeigneten Timeout zu setzen. Eine Abfrage alle 10 Sekunden mit einem Timeout von 8 Sekunden kann bereits alles andere lahm legen/deutlich verzögern. Je häufiger die Abfrage umso niedriger sollte der Timeout sein. (Am besten < 1000 ms)

Der Loxone Miniserver unterstützt keine verschlüsselten Webseiten (HTTPS).


Anlegen von virtuellen HTTP-Eingängen

Das Beispiel basiert auf dem Müllkalender-Beispiel der CALDAV / Google Kalender Integration (Loxforum.com) von Sven.

Virtuellen HTTP Eingang anlegen

In der Loxone Config unter "Peripherie" einen Virtueller HTTP Eingang erstellen. Dieser virtuelle HTTP-Eingang ist dann im Peripheriebaum beim Miniserver unter Virtuelle Eingänge zu sehen.

In den Eigenschaften wird eine Bezeichnung, die URL des Aufrufs sowie das Zeitintervall eingetragen.

Hinweis

Die Parameter bei der URL müssen URL-encoded sein, z.B. muss ein Leerzeichen mit %20 angegeben werden. Hier ist ein Online-URL-Encoder/Decoder.

Virtuelle HTTP Eingangs-Befehle anlegen

Unter dem Virtuellen HTTP Eingang können dann beliebig viele Virtueller HTTP Eingang Befehle angelegt werden.


    

In der Befehlserkennung wird ein Suchstring angegeben, mit dessen Hilfe der Miniserver den Wert im Dokument sucht. Es ist gewissermaßen ein "Anleitung" dafür, wo sich der Wert befindet. Eine Kurzreferenz der Syntax ist unter dem Eigenschaftsfenster. Eine genauere Erklärung dazu befindet sich am Ende der Loxone Dokumentation (Loxone Website).

Hinweis

Wird ein Wert von der Befehlserkennung nicht gefunden, liefert diese den Status 0 zurück, dabei wird jedoch der Fehlerausgang Q nicht getriggert (Loxone Ticket #237119). Der Wert 0 ist daher nicht eindeutig (kann ein realer Wert sein, oder aber er wurde nicht gefunden).

Die Validierung der Werte kann verwendet werden: Ist 0 kein gültiger Wert, kann bei der Validierung der Wertebereich festgelegt werden (z.B. 10 bis 100). In diesem Fall wird der Fehlerausgang Q getriggert, wenn der Wert nicht gefunden und daher 0 ist.

Beispiele für die Befehlserkennung

JSON-Beispiel (CALDAV-Müllkalender)

Rückgabe des HTTP-Abrufs

JSON-Output des CALDAV-Scripts
{
	"Muellabfuhr": {
		"Start": 194832000,
		"End": 194918400,
		"Description": "gelbe Tonne=1",
		"fwDay": 4,
		"wkDay": 5
	}
	"MSTest": {
		"Start": 194543100,
		"End": 194544900,
		"Description": "",
		"fwDay": 0,
		"wkDay": 1
	}
	"now": 194542498
}

Besonderheit: Es wurden zwei Ereignisse (Muellabfuhr und MSTest) abgerufen. Die Variablen (Start, End usw.) kommen daher zweimal vor.

Befehlserkennung

Abruf vonSyntaxErklärung
Wert von gelbe Tonne"Description": "gelbe Tonne=\nWir wollen wissen, ob "Gelbe Tonne" gesetzt ist. Entsprechend springen wir zu diesem String und und übernehmen mit \v diesen String
now (Rückgabe soll 194542498 sein)"now": \vDa now nur einmal vorkommt, suchen wir direkt diesen String und übernehmen den Wert mit \v.
fwDay von MSTest (Rückgabe soll 0 sein)MSTest": \ifwDay\i": \vEs wird zuerst der String MSTest": gesucht, weil fwDay zweimal vorkommt. Mit \ifwDay\i wird von der Fundstelle ausgehend der String fwDay gesucht. Ausgehend von dieser Position befindet sich der Wert nach ": und wird mit \v abgerufen.

Siehe auch

  • LoxBerry-Plugin https2http - Verschlüsselte (https)-Webseiten über den LoxBerry für virtuelle HTTP-Eingänge bereitstellen
  • LoxBerry-Plugin Command Recognition - Befehlserkennung - Am LoxBerry mit grafischer Oberfläche Befehlserkennungen erstellen und testen

HTML-Beispiel (WH2600 Wetterstation)

Rückgabe des HTTP-Aufrufs (Auszug)

HTML-Output der WH2600 (gekürzt)
<tr>
	<td width="448" bgcolor="#EDEFEF"><div class="item_1">Indoor Sensor ID and  Battery </div></td>
	<td width="352" bgcolor="#EDEFEF">
		<input name="IndoorID" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="0xa4" maxlength="5" />
        <input name="inBattSta" disabled="disabled" type="text" class="item_2" style="WIDTH: 100px" value="LOW STATUS" maxlength="12" />
	</td>
</tr>
</tr>
<tr> 
 <td bgcolor="#EDEFEF"><div class="item_1">Outdoor Temperature</div></td> 
 <td bgcolor="#EDEFEF"><input name="outTemp" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="-3.4" maxlength="5" /></td> 
 </tr> 
 <tr> 
 <td bgcolor="#EDEFEF"><div class="item_1">Outdoor Humidity </div></td> 
 <td bgcolor="#EDEFEF"><input name="outHumi" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="80" maxlength="3" /></td> 
 </tr> 

Besonderheit: In diesem Beispiel soll außer normalen Werten auch der Batteriestatus (Normal oder LOW STATUS) ausgelesen werden. Der HTTP Eingangs-Befehl unterstützt allerdings keine Strings (Stand Loxone Firmware 7.1.9.30). 

Befehlserkennung

Abruf vonSyntaxErklärung
outTemp valuename="outTemp"\ivalue="\i\vDa der String value bei jedem einzelnen Sensorwert auftritt, muss erst zum eindeutigen String name="outTemp" gesprungen werden. Um die unvorhersehbaren HTML-Tags bis zum Value zu überspringen, wird von der Fundstelle von outTemp mit \ivalue="\i zu diesem String weitergesucht. Mit \v wird der Wert dann übernommen. Im Eingangsbefehl muss "Werteinterpretation mit Vorzeichen" aktiviert sein.
outHumi valuename="outHumi"\ivalue="\i\vSiehe outTemp
Batteriestatus
input name="inBattSta"\ivalue="\i\1
Der virtuelle HTTP-Eingang kann keine Strings abfragen, allerdings kann man den ASCII-Wert eines Zeichens auslesen. Wir suchen wie oben nach dem Value von inBattSta und lassen uns mit \1 den ASCII-Wert des ersten Zeichens des Strings ausgeben. Ist der Buchstabe L = ASCII 76 (LOW STATUS), ist der Batteriestand niedrig. Ist der Wert N = 78 (NORMAL), ist der Zustand normal. Mit einem nachfolgenden Statusbaustein kann der Wert entsprechend umgesetzt werden.

Siehe dazu die genauere Beschreibung in Wetterstation WH2600 / WH2600 SE / WH2601 direkt in Loxone einbinden

Fehlersuche

Zur Entwicklung oder der Fehlersuche der Befehlserkennung, kann am besten der "Loxone Monitor" verwendet werden. Dazu unter dem Reiter "Diagnose" den "Debug-Info" Dialog oeffnen und den Monitor auswählen.
Im Monitor kann nun über den Filter nach den Nachrichten des HTTP-Eingangs gesucht werden. Am besten funktioniert dies wenn man im Filter "HTC" einträgt.

Im Screenshot ist zu erkennen, welcher Request an verschickt wurde und wie die Antwort vom Server dazu aussah.
Da der <e2instandby> tag über 2 Zeilen verteilt ist, muss die Befehlserkennung auch entsprechend angepasst werden. Zum Beispiel

<e2instandby>\n\v