Seite 1 von 1

Laseregg einbinden

Verfasst: 22. Mär 2019 11:52
von jheiler
Hallo,

ich möchte mein Feinstaubmessgerät Laseregg 2+ von Kaiterra einbinden. Die API ist unter https://dev.kaiterra.com/ beschrieben und lautet

Code: Alles auswählen

https://api.origins-china.cn/v1/lasereggs/XXX?key=YYY. 
Die XXX ist die UID des Gerätes, die YYY ist der API-Key, den man dort anfordern kann.

Bei einer Abfrage dieser API erhalte ich

{"id":"XXX","info.aqi":{"ts":"2019-03-22T10:32:13Z","data":{"humidity":29.52,"pm10":3,"pm25":3,"rtvoc":125,"temp":25.23}}}

Diese Werte entsprechen:

pm25: PM2.5 (µg/m³), post-calibration

pm10: PM10 (µg/m³), post-calibration

humidity: relative humidity in % (0-100)

temp: temperature in Celsius

tvoc: (Laser Egg 2+) TVOC measurement, in parts per billion (ppb)

Kann ich das über HTTP einbinden?

Der Eintrag in die http..cfg wäre dann:
http:cacheLaseregg.url=https://api.origins-china.cn/v1/lasereggs/XXX?key=YYY
http:cacheLaseregg.updateInterval=600, richtig?

Wie sähe ein Item aus?

Vielen Dank für eine Anregung.

Viele Grüße
Jürgen

Re: Laseregg einbinden

Verfasst: 22. Mär 2019 14:44
von udo1toni
Deine http.cfg sollte so aussehen:

Code: Alles auswählen

# alle möglichen Kommentare... egal wichtig ist nur der unkommentierte Teil:
 
# Nur zur Orientierung: der http cache für Laseregg. Abfrageinterval 60 Sekunden
laseregg.url=https://api.origins-china.cn/v1/lasereggs/XXX?key=YYY
laseregg.updateInterval=60000
Der Abfrageinterval ist in Millisekunden angegeben, ich war jetzt zu faul, die Doku zur API zu lesen, Dein Abfrageinterval darf natürlich nicht dazu führen, dass die API Dich sperrt, im Zweifel könnte also der Interval auch 5 Minuten oder 10 Minuten betragen.

Die passenden Items sollten dann so aussehen:

Code: Alles auswählen

Group laseregg
String lasereggID "Laseregg ID [%s]"                         (laseregg) { http="<[laseregg:30000:JSONPATH($.id)]"" }
DateTime lasereggTS "Laseregg TS [%1$tA, %1$td.%1$tm.%1$tY]" (laseregg) { http="<[laseregg:30000:JSONPATH($.["info.aqi"].ts)]"" }
Number lasereggHum "Laseregg Feuchte [%s]"                   (laseregg) { http="<[laseregg:30000:JSONPATH($.["info.aqi"].data.humidity)]"" }
Number lasereggPm10 "Laseregg pm10 [%s]"                     (laseregg) { http="<[laseregg:30000:JSONPATH($.["info.aqi"].data.pm10)]"" }
Number lasereggPm25 "Laseregg pm25 [%s]"                     (laseregg) { http="<[laseregg:30000:JSONPATH($.["info.aqi"].data.pm25)]"" }
Number lasereggRtvoc "Laseregg rtvoc [%s]"                   (laseregg) { http="<[laseregg:30000:JSONPATH($.["info.aqi"].data.rtvoc)]"" }
Number lasereggTemp "Laseregg Temp [%s]"                     (laseregg) { http="<[laseregg:30000:JSONPATH($.["info.aqi"].data.temp)]"" }
Die Items werden nun alle 30 Sekunden (30 000 Millisekunden) aktualisiert. Diesen Wert kannst Du natürlich passend zum Cache Updateinterval setzen, aber an dieser Stelle schadet eine höhere Updatefrequenz nichts, der Cache ist ja bereits gefüllt.
Das erste Item lasereggID ist nur der Vollständigkeit halber in der Liste.

Da es sich dem dem String um ein JSON Objekt handelt, brauchst Du noch die JSONPATH Transformation, die musst Du z.B. über Paper UI installieren.

Re: Laseregg einbinden

Verfasst: 22. Mär 2019 16:23
von jheiler
Vielen Dank für die Hilfe.
Meine vorläufig finale(?) Version sieht so aus, durch Probieren ermittelt:

Code: Alles auswählen

Group laseregg
String lasereggID "Laseregg ID [%s]"                         (laseregg) { http="<[laseregg:600000:JSONPATH($.id)]" }
DateTime lasereggTS "Laseregg TS [%1$tA, %1$td.%1$tm.%1$tY]" (laseregg) { http="<[laseregg:600000:JSONPATH($.[{info.aqi}].ts)]" }
Number lasereggHum "Laseregg Feuchte [%s]"                   (laseregg) { http="<[laseregg:600000:JSONPATH($.[{info.aqi}].data.humidity)]" }
Number lasereggPm10 "Laseregg pm10 [%s]"                     (laseregg) { http="<[laseregg:600000:JSONPATH($.[{info.aqi}].data.pm10)]" }
Number lasereggPm25 "Laseregg pm25 [%s]"                     (laseregg) { http="<[laseregg:600000:JSONPATH($.[{info.aqi}].data.pm25)]" }
Number lasereggRtvoc "Laseregg rtvoc [%s]"		     (laseregg) { http="<[laseregg:600000:JSONPATH($.[{info.aqi}].data.rtvoc)]" }
Number lasereggTemp "Laseregg Temp [%s]"                     (laseregg) { http="<[laseregg:600000:JSONPATH($.[{info.aqi}].data.temp)]" }
In der openhab.log habe ich jetzt noch einen Fehler und sehe auch keine Daten in der Sitemap:

Code: Alles auswählen

2019-03-22 16:17:54.498 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'laseregg.items'
2019-03-22 16:17:57.503 [ERROR] [org.openhab.io.net.http.HttpUtil    ] - Fatal transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
2019-03-22 16:17:57.506 [ERROR] [ab.binding.http.internal.HttpBinding] - No response received from 'laseregg'
Woran kann das liegen?

Re: Laseregg einbinden

Verfasst: 22. Mär 2019 22:13
von udo1toni

Code: Alles auswählen

unable to find valid certification path to requested target
Zertifikatsfehler... Dazu fällt mir ehrlich gesagt nichts ein. Grundsätzlih sollte das http Binding auch mit https arbeiten.

Schau mal hier: https://community.openhab.org/t/http-bi ... ttps/21430 vermutlich wirst Du das https Zertifikat händisch in den Java Zertifikatspeicher laden müssen.

Ach so, gerade noch bemerkt...

Im Label der Number Items müsste der Platzhalter natürlich nicht [%s] sondern [%.2f] heißen, wenn die Float Zahl als Zahl mit zwei Nachkommastellen dargestellt werden soll. Natürlich ist das erst dann interessant, wenn Du den Zertifikatfehler beseitigt hast. :)