HTTP Binding

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

HTTP Binding

Beitrag von SmartHomer »

Ich möchte gerne über das HTTP Binding von OpenHab2 verschiedene Daten abfragen. Die Daten der URL stehen mir als JSON zur Verfügung. Bisher habe ich zwei Möglichkeiten gefunden um die Daten abzufragen:
  • JavaScript Transformation
  • JsonPath Trannsformation
Jedoch bekomme ich nur teilweise Werte ausgelesen. Folgende URL-Adresse möchte ich abfragen:
http://api.openweathermap.org/data/2.5/ ... de275d6938

Mit Hilfe der JsonPath Transformation bekomme ich beispielsweise die Werte für die Bewölkung ausgelesen. Hierbei habe ich folgende Items definiert: ...

In der Sitemap rufe ich dann die einzelnen Items auf um diese sichtbar zu machen.

Code: Alles auswählen

sitemap Clouds label="Abfrage Bewölkung" {
	Frame label="5-Tagesvorhersage Bewölkung" {
	        Text item=Number_Clouds_0
        	Text item=Number_Clouds_1
        	}
        }
Ich möchte gerne noch für die einzelnen Werte die jeweilige Uhrzeit und das Datum auslesen. "dt_txt"

Code: Alles auswählen

{
  "cod": "200",
  "message": 0.0025,
  "cnt": 40,
  "list": [
    {
      "dt": 1528794000,
      "main": {
        "temp": 291.42,
        "temp_min": 291.42,
        "temp_max": 291.868,
        "pressure": 960.13,
        "sea_level": 1022.78,
        "grnd_level": 960.13,
        "humidity": 97,
        "temp_kf": -0.45
      },
      "weather": [
        {
          "id": 500,
          "main": "Rain",
          "description": "light rain",
          "icon": "10d"
        }
      ],
      "clouds": {
        "all": 68
      },
      "wind": {
        "speed": 1.85,
        "deg": 277.505
      },
      "rain": {
        "3h": 0.0125
      },
      "sys": {
        "pod": "d"
      },
     "dt_txt": "2018-06-12 09:00:00"
    }
Wie lautet eine mögliche Abfrage um die Uhrzeit und das Datum auszulesen?

Ich habe hier sowohl die JsonPath transformation als auch die JavaScript transformation versucht jedoch ohne Erfolg.

Danke für möglich Lösungsvorschläge im Voraus.

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HTTP Binding

Beitrag von udo1toni »

Momentan fragst Du die Daten alle 6 Sekunden ab. Ich glaube nicht, dass openweathermap das so toll findet ;)
Auch ist es wenig sinnvoll, für jedes Item immer wieder im Netz nachzufragen. Besser ist es, einen http cache einzurichten. Das geht über
${OPENHAB_CONF}/services/http.cfg:

Code: Alles auswählen

openwmapLorch.url=http://api.openweathermap.org/data/2.5/forecast?lat=48.801619&lon=9.677863&appid=44c33c26a54bb8f04e2d58de275d6938
# updateInterval in Milliseconds, also 10 Minuten
openwmapLorch.updateInterval=600000
Entsprechend kannst Du dann diesen Cache für alle Items verwenden:

Code: Alles auswählen

Number Number_Clouds_1 "Bewölkungsgrad [%.2f %%]" <sun_clouds> {http="<[openwmapLorch:60000:JSONPATH($.list[0].clouds.all)]"}
Number Number_Clouds_0 "Bewölkungsgrad [%.2f %%]" <sun_clouds> {http="<[openwmapLorch:60000:JSONPATH($.list[1].clouds.all)]"}
String Date_Clouds_0   "Datum [%s]"               <clock>      {http="<[openwmapLorch:60000:JSONPATH($.list[0].dt_txt)]"}
Wenn Du statt des Strings ein echtes Datum haben willst, wirst Du um eine Konvertierung nicht herum kommen, das ließe sich über ein Proxy Item und eine Rule erledigen, oder über ein Javascript, welches dann zuerst den Wert per JSONPATH extrahiert und anschließend ein DateTime Objekt erzeugt und zurück gibt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Re: HTTP Binding

Beitrag von SmartHomer »

Wenn ich versuche den Cache zu verwenden, dann bekomme ich keine Werte ausgelesen. An was kann das liegen?

Meine http.cfg sieht folgendermaßen aus:

Code: Alles auswählen

# timeout in milliseconds for the http requests (optional, defaults to 5000)
#timeout=

# the interval in milliseconds when to find new refresh candidates
# (optional, defaults to 1000)
#granularity=

# whether to substitute the current time or state value into the URL
# (optional, defaults to true)
#format=

# configuration of the first cache item
openweathermapLorch.url=http://api.openweathermap.org/data/2.5/forecast?lat=48.801619&lon=9.677863&appid=44c33c26a54bb8f04e2d58de275d6938 
openweathermapLorch.updateInterval=60000 

# configuration of the second cache item  
#<id2>.url=
#<id2>.updateInterval=
Meine Items habe ich so definiert:

Code: Alles auswählen

Number Number_Clouds_0 "Bewölkungsgrad [%.2f %%]" <sun_clouds> {http="<[openweathermapLorch:60000:JSONPATH($.list[0].clouds.all)]"}
Number Number_Clouds_1 "Bewölkungsgrad [%.2f %%]" <sun_clouds> {http="<[openweathermapLorch:60000:JSONPATH($.list[1].clouds.all)]"}
Meine Sitemap sieht so aus:

Code: Alles auswählen

 sitemap Clouds label="Abfrage Bewölkung" {
		Frame label="5-Tagesvorhersage Bewölkung" {
			Text item=Number_Clouds_0
        		Text item=Number_Clouds_1
        	}
        }
Ist hier was falsch oder wieso werden keine Werte ausgegeben?

Kannst Du eine Anleitung oder Beispiel geben für eine Konvertierung des Datums? Was sind die Vorteile eines echten Datums? Und was ist ein Proxy Item?

Benutzeravatar
webguards
Beiträge: 56
Registriert: 5. Jun 2018 17:06

Re: HTTP Binding

Beitrag von webguards »

items

Code: Alles auswählen

Number Number_Clouds_0 "Bewölkungsgrad [%.2f %%]" 	<sun_clouds> {http="<[openweathermapLorch:60000:JSONPATH($.list[0].clouds.all)]"}
Number Number_Clouds_1 "Bewölkungsgrad [%.2f %%]" 	<sun_clouds> {http="<[openweathermapLorch:60000:JSONPATH($.list[1].clouds.all)]"}
String Date_Clouds_0 "Date 1 [%s]" 			<sun_clouds> {http="<[openweathermapLorch:60000:JSONPATH($.list[0].dt_txt)]"}
String Date_Clouds_1 "Date 2 [%s]"			<sun_clouds> {http="<[openweathermapLorch:60000:JSONPATH($.list[1].dt_txt)]"}
sidemap

Code: Alles auswählen

Frame label="5-Tagesvorhersage Bewölkung" {
Text item=Number_Clouds_0 
Text item=Date_Clouds_0 
Text item=Number_Clouds_1 
Text item=Date_Clouds_1
}

Bewölkungsgrad: 92,00 % | Date 1: 2018-06-12 21:00:00
Bewölkungsgrad: 92,00 % | Date 2: 2018-06-13 00:00:00

Das kommt mit deinen Vorgaben bei mir raus
=== Das Kuriose an SMARTHOME, man wird nie fertig ;) ===

Thin Client HP als Multifunktionsserver (Docker) | 2x Echo Dot als SST und TTS | Fritzbox | FritzDect | KODI MediaCenter | Samsung TV und Samsung HTS | fireTV via adb | CasaControl mit 20 Aktoren via EXEC | Xiaomi Gateway mit mehrere Tür- und Temperatursensoren | Broadlink RM PRO | 80% regelbasiert Automatisiert

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HTTP Binding

Beitrag von udo1toni »

Beide Dateien sehen erst mal gut aus. Siehst Du in openhab.log irgendwas?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Re: HTTP Binding

Beitrag von SmartHomer »

Vielleicht hier:

Code: Alles auswählen

java.lang.NumberFormatException: For input string: "60000 # updateInterval in Milliseconds, also 10 Minuten"

	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[?:?]

	at java.lang.Integer.parseInt(Integer.java:580) [?:?]

	at java.lang.Integer.valueOf(Integer.java:766) [?:?]

	at org.openhab.binding.http.internal.HttpBinding.updated(HttpBinding.java:507) [307:org.openhab.binding.http:1.11.0]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updated(ManagedServiceTracker.java:189) [7:org.apache.felix.configadmin:1.8.16]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updateService(ManagedServiceTracker.java:152) [7:org.apache.felix.configadmin:1.8.16]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker.provideConfiguration(ManagedServiceTracker.java:85) [7:org.apache.felix.configadmin:1.8.16]

	at org.apache.felix.cm.impl.ConfigurationManager$UpdateConfiguration.run(ConfigurationManager.java:1792) [7:org.apache.felix.configadmin:1.8.16]

	at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:141) [7:org.apache.felix.configadmin:1.8.16]

	at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:109) [7:org.apache.felix.configadmin:1.8.16]

	at java.lang.Thread.run(Thread.java:748) [?:?]

opus
Beiträge: 4
Registriert: 11. Jun 2018 08:24

Re: HTTP Binding

Beitrag von opus »

Die Fehlermeldung enthält den String "60000 # updateInterval in Milliseconds, also 10 Minuten", dieser ist aber nicht in Deinem letzten geposten hht.cfg!


Weiterer Hinweis: Die obigen Posts enthalten Deinen persönlichen API-Key! Das solltest Du ändern!

Benutzeravatar
webguards
Beiträge: 56
Registriert: 5. Jun 2018 17:06

Re: HTTP Binding

Beitrag von webguards »

Ändere mal in der ITEMS Datei die Updaterate und schau dan mal in das log
=== Das Kuriose an SMARTHOME, man wird nie fertig ;) ===

Thin Client HP als Multifunktionsserver (Docker) | 2x Echo Dot als SST und TTS | Fritzbox | FritzDect | KODI MediaCenter | Samsung TV und Samsung HTS | fireTV via adb | CasaControl mit 20 Aktoren via EXEC | Xiaomi Gateway mit mehrere Tür- und Temperatursensoren | Broadlink RM PRO | 80% regelbasiert Automatisiert

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HTTP Binding

Beitrag von udo1toni »

Kommentare innerhalb der *.cfg Dateien bitte immer in eigene Zeilen, nie hinter einem gültigen Parameter eingeben!
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Re: HTTP Binding

Beitrag von SmartHomer »

Ich hatte ganz am Anfang ausversehen in der http.cfg Datei den Kommentar hinter einem gültigen Parameter eingefügt. Ich habe diesen Kommentar aber wieder aus der http.cfg Datei entfernt. Jedoch scheint es, dass dieser Kommentar immer noch vorhanden ist, obwohl ich diesen wieder entfernt habe. Wie kann ich die http.cfg Datei wieder reseten? Ich hatte auch bereits versucht das http Binding neu zu installieren. Danach kommt immer noch diese Meldung.

Antworten