Seite 1 von 2

http-Binding

Verfasst: 4. Feb 2021 19:52
von haiko
Hallo,

ich bin nicht sicher, ob das das richtige Forum für diese Frage ist. Falls nein, bitte ich um einen Hinweis!

Ich möchte von einer WebSite regelmäßig Informationen abholen und auf meiner Sitemap anzeigen. Dazu habe ich das HTTP-Binding installiert und folgendes Item konfiguriert:

Code: Alles auswählen

String doorText "Geklingelt" { http="<[http://doorbell/bell.json:10000:REGEX((.*))]" }
Ich sehe auch, dass er einen String abholt und in doorText speichert:

Code: Alles auswählen

2021-02-04 19:39:42.486 [vent.ItemStateChangedEvent] - doorText changed from NULL to ["2021-02-03, 18:12:13", "2021-02-03, 18:12:13", 1]
Aber dieser wird nicht im SimpleUI angezeigt. Dort steht lediglich "Geklingelt".

Was mache ich falsch?

Danke für Eure Hilfe!
Haiko

Re: http-Binding

Verfasst: 4. Feb 2021 20:21
von int5749
haiko hat geschrieben: 4. Feb 2021 19:52 Danke für Eure Hilfe!
Hallo und guten Abend,

hilfreich wäre es den Code hier in entsprechende Tags zu packen, damit er "lesbarer" erscheint. Bei 1-3 Zeilen mag das noch gehen, danach wird es schwierig zu lesen ;)

Versuch mal

Code: Alles auswählen

 String doorText "Geklingelt [%s]" { http="<[http://doorbell/bell.json:10000:REGEX((.*))]" }
 
Durch [%s] wird der gelesene String an den Text angehangen. Falls dies zu lang ist, müsste es evtl. noch umformatiert werden.

Viele Grüße
Jörg

Re: http-Binding

Verfasst: 4. Feb 2021 21:44
von udo1toni
Ich hab das mal angepasst... ;)

Re: http-Binding

Verfasst: 5. Feb 2021 00:36
von haiko
Klappt! Danke erstmal und sorry, für das fehlende Markup. Ich gelobe Besserung. Gleich noch eine paar Fragen:

1) Ich hatte mir alternativ überlegt, eine Rule zu schreiben, die regelmäßig pollt und das Ergebnis in die Variablen schreibt. Wäre das nicht sogar einfacher?

2) Gibt es auch so etwas wie eine 1:1 Transformation, soll heißen eine Transformation, wo ich nicht REGEX oder JS oder sonst was bemühen muss?

3) Wie sieht es mit Typkonversionen aus? Ich bekomme ja ein Datum und eine Uhrzeit zurück. Schick wäre natürlich, wenn ich das gleich in ein DateTime Item packen könnte.

Nochmals vielen dank für die schnelle Hilfe!

Herzliche Grüße
Haiko

Re: http-Binding

Verfasst: 5. Feb 2021 00:41
von haiko
udo1toni hat geschrieben: 4. Feb 2021 21:44 Ich hab das mal angepasst... ;)

Code: Alles auswählen

String danke "Herzlichen Dank!!"

Re: http-Binding

Verfasst: 5. Feb 2021 13:33
von udo1toni
Warum willst Du da eine Rule nutzen? openHAB erledigt den Poll doch ganz alleine? Was ist denn einfacher, als ein Item, welches vollautomatisch befüllt wird?
Sinnvoller wäre es natürlich, wenn die Klingel selbst ein post oder put absetzen könnte und darüber dann aktiv den Status des Items setzt, ein Event Push ist immer effizienter als ein frequent Pull.

Das angegebene REGEX übernimmt die Antwort 1:1. Es ist nicht vorgesehen, auf eine Transformation zu verzichten, aber das sollte auch nicht weiter stören. So gut wie alle http Antworten müssen irgendwie gefiltert werden.

Eine Umwandlung in ein "echtes" Datum ist leider nicht so einfach, schon weil das gelieferte Format keine vollständige Information liefert (es fehlt die Zeitzone). Du könntest aber mit JS (JavaScript) einen Filter programmieren, der ein passendes Zielformat erzeugt und anschließend kannst Du aus dem String Item ein DateTime Item machen, welches dann ein echtes Datum enthält. Die fehlende Zeitzone muss das JavaScript dann ergänzen.

Re: http-Binding

Verfasst: 17. Feb 2021 16:44
von haiko
Vielen Dank für die Antworten und Hinweise. Ich habe meine Aufgabe nun gelöst. Folgende Konfiguration für das Binding habe ich gewählt:

Code: Alles auswählen

DateTime lastRinging "Last ringing [%1$tY-%1$tm-%1$td %1$tH:%1$tM]" { http="<[http://drosselbell/bell.json:10000:JSONPATH($.[0])]" }
DateTime bellStart "Start Drosselbell [%1$tY-%1$tm-%1$td %1$tH:%1$tM]" { http="<[http://drosselbell/bell.json:10000:JSONPATH($.[1])]" }
Number ringCount "Ringings [%d]" { http="<[http://drosselbell/bell.json:10000:JSONPATH($.[2])]" }
Number bellTemp "Bell temperature [%.3f °C]" { http="<[http://drosselbell/bell.json:10000:JSONPATH($.[3])]" }
Mit JSONPATH kann ich hervorragend, die Einzelteile aus dem JSON heraus fummeln:

Code: Alles auswählen

["2021-02-16T15:29:28", "2021-02-15T11:01:14", 3, 25.25]
TimeZone ist nicht notwendig, zum Parsen muss nur in dem Datumsstring das 'T' zwischen Datum und Zeit stehen.

Herzlichen dank nochmals für die Hilfe!
Grüße
Haiko

P.S. Ich bin auch kein Fan von Polling, aber das schien mir die einfachste Lösung zu sein, zumal der Datensatz ja sehr schmal ist. Wie könnte man das anders (besser) lösen?

Re: http-Binding

Verfasst: 17. Feb 2021 18:53
von udo1toni
Da Du das http1 Binding nutzt, solltest Du einen http Cache anlegen. Alternativ kannst Du auch auf http2 umstellen, dort ist der Cache automatisch mit eingebaut.

Der http Cache wird anstelle des http-Aufrufs angegeben. Vorteil: Es gibt nur einen Aufruf für alle vier Items. Mit Deiner Konfiguration rufst Du alle 10 Sekunden vier mal die Adresse auf.

Re: http-Binding

Verfasst: 18. Feb 2021 10:54
von haiko
Danke für den Hinweis! Über den Cache hatte ich auch schon nachgedacht. Allerdings finde ich vier Aufrufe alle zehn Sekunden für einen Apache auf einem RasPi Zero, der sich ansonsten total langweilt vertretbar. Es ist eine Optimierungsmöglichkeit. Ich schau mir das nochmal an.

Wenn ich in meinem OpenHAB2 über PaperUI die Bindings anschaue, finde ich nur EINE http-Implementierung. Wie komme ich zu http2? Ich habe mir die Konfiguration von http2 mal angeschaut und das scheint mir doch erheblich komplizierter zu sein.

Re: http-Binding

Verfasst: 18. Feb 2021 12:23
von udo1toni
http2 steht offiizell in OH2 nicht zur Verfügung, es gibt aber ein entsprechendes jar, welches man manuell installieren kann. Ich habe das in der Beta-Phase des Bindings getan. Die Konfiguration ist nicht komplexer als bei http1, es gibt aber (wesentlich) mehr Möglichkeiten. Man muss dabei immer im Hinterkopf behalten, dass alle neuen Bindings den Thing-Ansatz verfolgen. Das bedeutet für http2, dass die URL nun das Thing darstellt, die Channel enthalten dann lediglich die spezifischen Anteile, getrennt für beide Richtugnen, falls ein Channel bidirektional ist. Was also in http1 z.B. in drei Teilen konfiguriert wurde (ankommend, abgehend ON und abgehend OFF), ist in http2 ein Thing mit dem unabänderlichen Teil der URL und einem Channel, in dem der Input-Teil als state sowie der Output-Teil (wiederum unabhängig vom Befehl) als command angegeben sind, sowie dem konkreten ON- Befehl und dem OFF-Befehl. Die URL muss also nur einmal angegeben werden. Was auf den ersten Blick komplexer wirkt, ist in Wirklichkeit nur eine andere Aufteilung der Teilparameter.