Seite 1 von 2
HTTP Binding
Verfasst: 12. Jun 2018 10:48
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
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.
Re: HTTP Binding
Verfasst: 12. Jun 2018 19:31
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.
Re: HTTP Binding
Verfasst: 12. Jun 2018 20:47
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?
Re: HTTP Binding
Verfasst: 12. Jun 2018 21:59
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
Re: HTTP Binding
Verfasst: 12. Jun 2018 22:48
von udo1toni
Beide Dateien sehen erst mal gut aus. Siehst Du in openhab.log irgendwas?
Re: HTTP Binding
Verfasst: 12. Jun 2018 23:12
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) [?:?]
Re: HTTP Binding
Verfasst: 13. Jun 2018 09:36
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!
Re: HTTP Binding
Verfasst: 13. Jun 2018 16:03
von webguards
Ändere mal in der ITEMS Datei die Updaterate und schau dan mal in das log
Re: HTTP Binding
Verfasst: 13. Jun 2018 19:54
von udo1toni
Kommentare innerhalb der *.cfg Dateien bitte immer in eigene Zeilen, nie hinter einem gültigen Parameter eingeben!
Re: HTTP Binding
Verfasst: 13. Jun 2018 23:04
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.