Die Wetterstation WS980WiFi von ELV kann in das WLAN eingebunden werden und bietet eine binäre Schnittstelle zum Abruf der Wetterdaten. Grundsätzlich kann die Wetterstation die Daten auch in das Internet übertragen. Dort könnte man dann seine Daten wieder abrufen. Aber das finde ich weder praktisch noch sinnvoll, wenn ich die Daten nur lokal verwenden will. Ich habe daher einen Spring Boot Microservice entwickelt, der die Daten regelmäßig direkt von der Wetterstation lädt und über eine REST-Schnittstelle bereitstellt. Das ermöglicht dann eine einfache Anbindung in OpenHAB oder ein Monitoring mit Zabbix.
Hier eine Beispielausgabe bei Aufruf des Services unter http://HOSTNAME:PORT/weather
{ "ApparentAirTemperature":{ "id":4,"name":"Gefühlte Temperatur","unit":"°C","value":19.2 }, "BarometricPressureAbsolute":{ "id":8,"name":"Luftdruck absolut","unit":"hPa","value":1010.5 }, "BarometricPressureRelative":{ "id":9,"name":"Luftdruck relativ","unit":"hPa","value":1010.5 }, "DewPoint":{ "id":3,"name":"Taupunkt","unit":"°C","value":18.3 }, "GustyWindSpeed":{ "id":12,"name":"Windböen","unit":"km/h","value":0.0 }, "Lightness":{ "id":21,"name":"Helligkeit","unit":"Lux","value":1364.0 }, "OutsideHumidity":{ "id":7,"name":"Aussenfeuchtigkeit","unit":"%","value":95.0 }, "OutsideTemperature":{ "id":2,"name":"Aussentemperatur","unit":"°C","value":19.2 }, "RainAll":{ "id":20,"name":"Regen gesamt","unit":"mm ","value":1285.7 }, "RainDay":{ "id":16,"name":"Regen Tag","unit":"mm ","value":10.7 }, "RainHour":{ "id":14,"name":"Regen Stunde","unit":"mm ","value":0.0 }, "RainMonth":{ "id":18,"name":"Regen Monat","unit":"mm ","value":51.3 }, "RainWeek":{ "id":17,"name":"Regen Woche","unit":"mm ","value":10.7 }, "RainYear":{ "id":19,"name":"Regen Jahr","unit":"mm ","value":287.2 }, "RoomHumidity":{ "id":6,"name":"Innen Feuchtigkeit","unit":"%","value":65.0 }, "RoomTemperature":{ "id":1,"name":"Innentemperatur","unit":"°C","value":24.9 }, "TemperatureHumidityIndex":{ "id":5,"name":"","unit":"°C","value":19.2 }, "UvIdxRaw":{ "id":23,"name":"UV Index","unit":"","value":0.0 }, "UvRaw":{ "id":22,"name":"UV roh","unit":"uW/m²","value":13.0 }, "WindDirection":{ "id":10,"name":"Windrichtung","unit":"Grad","value":259.0 }, "WindSpeed":{ "id":11,"name":"Windgeschwindigkeit","unit":"km/h","value":0.0 } }
Downloads
Der Sourcecode befindet sich auf GitHub unter https://github.com/chpoulter/weathergateway. Nach dem Herunterladen (oder Clonen) kann man das Projekt einfach mittels
mvn clean install
bauen. Im target Verzeichnis landet dann eine JAR-Datei, die direkt mit Java startet.
Wetterdienst installieren und starten
Ich habe den Microservice auf einem meiner Debian-Server installiert. Da es sich um eine Spring Boot Anwendung handelt, sollte er aber überall laufen, wo Java zur Verfügung steht. Zu beachten ist, dass der Service die Wetterstation über einen Netzwerk-Broadcast sucht. Server und Wetterstation müssen daher im selben Netzwerksegment liegen.
Lege die Spring Boot JAR Datei nach dem bauen in einem Verzeichnis ab. Von dort kann man sie dann direkt starten:
java -Xmx256m -jar weathergateway.jar --spring.profiles.active=prod --server.port=10001
Praktischer ist es natürlich, den Dienst über systemd automatisch zu starten. Dazu erstellt man unter Debian eine neue Datei /etc/systemd/system/weathergateway.service mit folgendem Inhalt:
[Unit]
Description=Weather Gateway Service
[Service]
User=weather
WorkingDirectory=/opt/weather
ExecStart=/usr/bin/java -Xmx256m -Dlogging.file.path=/var/log/weathergateway -jar weathergateway.jar --spring.profiles.active=prod --server.port=10001
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=20
[Install]
WantedBy=multi-user.target
Das Weathergateway wird in diesem Beispiel mit dem Benutzer weather
gestartet. Ausserdem legen wir den Pfad für die Logdateien auf /var/log/weathergateway
fest.
Jetzt noch aktivieren und starten:
systemctl enable weathergateway.service
systemctl start weathergateway.service
Auf andere Betriebssystemen erfolgt die Einbindung möglicherweise anders.
OpenHAB
Die Einbindung in OpenHAB2 mit KNX kann sehr umfangreich sein. Daher zeige ich dir hier die Einbindung an ein paar einfachen Beispielen. Erstelle bzw. füge folgenden Zeilen in die Dateien ein.
things/weather.things
Diese Datei enthält den Ort, an dem der Microservice abrufbar ist. OpenHAB aktuallisiert hier alle 60 Sekunden die Wetterdaten.
Thing http:url:wetterstation [ baseURL="http://HOSTNAME:PORT/weather", refresh=60 ] {
Channels:
Type number : Temperatur [ stateTransformation="JSONPATH:$.OutsideTemperature.value" ]
Type number : Taupunkt [ stateTransformation="JSONPATH:$.DewPoint.value" ]
Type number : Feuchtigkeit [ stateTransformation="JSONPATH:$.OutsideHumidity.value" ]
Type number : Helligkeit [ stateTransformation="JSONPATH:$.Lightness.value" ]
Type number : Luftdruck [ stateTransformation="JSONPATH:$.BarometricPressureRelative.value" ]
Type number : Windgeschwindigkeit [ stateTransformation="JSONPATH:$.WindSpeed.value" ]
Type number : Windrichtung [ stateTransformation="JSONPATH:$.WindDirection.value" ]
Type number : Regen_Tag [ stateTransformation="JSONPATH:$.RainDay.value" ]
Type number : Regen_Monat [ stateTransformation="JSONPATH:$.RainMonth.value" ]
Type number : Regen_Jahr [ stateTransformation="JSONPATH:$.RainYear.value" ]
Type number : Uv [ stateTransformation="JSONPATH:$.UvRaw.value" ]
}
things/knx.things
Diese Datei ist nur dann erforderlich, falls die Wetterdaten auf einen KNX-Bus repliziert werden sollen. Ich habe hier nur die Aussentemperatur eingetragen, da die übrigen Wetterdaten derzeit im KNX-Bereich nicht verwendet werden.
ridge knx:ip:bridge "IP Schnittstelle" @ "KNX" [
type="TUNNEL",
ipAddress="HOSTNAME KNX IP Schnittstelle",
portNumber=PORTNUMMER KNX IP Schnittstelle,
localIp="IP des OpenHAB Servers",
readingPause=30,
responseTimeout=10,
readRetriesLimit=3,
autoReconnectPeriod=30,
localSourceAddr="1.1.1"
] {
Thing device Aktor_1 "Aktor 1" @ "KNX" [
address="1.1.2",
fetch=true,
pingInterval=600,
readInterval=0
] {
Type switch : Licht_Aussen "Licht Aussen" [ ga="1/2/1+<1/2/2" ]
}
Thing device Wetterstation [] {
Type number-control : Temperatur [ ga="9.001:5/2/1" ]
}
}
items/weather.items
Für jeden Messwert wird in OpenHAB über diese Datei ein Item erstellt und die zugehörigen Kanäle definiert.
Number Wetterstation_Temperatur "[%.2f °C]" <temperature> {
channel="http:url:wetterstation:Temperatur",
channel="knx:device:bridge:Wetterstation:Temperatur"
}
Number Wetterstation_Taupunkt "[%.2f °C]" <temperature> {
channel="http:url:wetterstation:Taupunkt"
}
Number Wetterstation_Feuchtigkeit "[%d %%]" <humidity> {
channel="http:url:wetterstation:Feuchtigkeit"
}
Number Wetterstation_Helligkeit "[%d Lux]" <sun> {
channel="http:url:wetterstation:Helligkeit"
}
Number Wetterstation_Uv "Wetterstation UV [%d uW/m²]" <sun> {
channel="http:url:wetterstation:Uv"
}
Number Wetterstation_Luftdruck "Wetterstation Luftdruck [%.1f hPa]" <pressure> {
channel="http:url:wetterstation:Luftdruck"
}
Number Wetterstation_Regen_Tag "Wetterstation Regen_Tag [%.1f mm]" <rain> {
channel="http:url:wetterstation:Regen_Tag"
}
Number Wetterstation_Regen_Monat "Wetterstation Regen_Monat [%.1f mm]" <rain> {
channel="http:url:wetterstation:Regen_Monat"
}
Number Wetterstation_Regen_Jahr "Wetterstation Regen_Jahr [%.1f mm]" <rain> {
channel="http:url:wetterstation:Regen_Jahr"
}
Number Wetterstation_Windgeschwindigkeit "Wetterstation Windgeschwindigkeit [%.2f km/h]" <wind> {
channel="http:url:wetterstation:Windgeschwindigkeit"
}
Number Wetterstation_Windrichtung "Wetterstation Windrichtung [%d Grad]" <movecontrol> {
channel="http:url:wetterstation:Windrichtung"
}
sitemaps/demo.sitemap
sitemap demo label="Demo" {
Frame label="Demo" {
Switch item=knx_Licht_Aussen label="Licht Aussen" icon="light"
Text item=Wetterstation_Temperatur label="Aussentemperatur [%.1f °C]" icon="temperature"
Text item=Wetterstation_Feuchtigkeit label="Luftfeuchtigkeit [%d%%]" icon="humidity"
Text item=Wetterstation_Helligkeit label="Helligkeit [%d Lux]" icon="sun"
Text item=Wetterstation_Luftdruck label="Luftdruck [%.1f hPa]" icon="pressure"
Text item=Wetterstation_Windrichtung label="Windrichtung [%d Grad]" icon="movecontrol"
Text item=Wetterstation_Windgeschwindigkeit label="Windgeschwindigkeit [%.2f km/h]" icon="wind"
}
}
items/knx.items
Diese Datei definiert einen Schalter für die Lampe. Er wird für die Steuerung in der nachfolgenden Datei benötigt.
Switch knx_Licht_Aussen "Licht Aussen" <light> ["Switchable"]{channel="knx:device:bridge:Aktor_1:Licht_Aussen" }
rules/knx.rules
Über die letzte Datei können Regeln für eine automatische Steuerung definiert werden. Hier wird z.B. eine Lampe in Abhängigkeit zur Helligkeit gesteuert. Die Grenzwerte habe ich durch ausprobieren ermittelt. Bei mir ergeben sich bei 100 und 200 gute Zeitpunkte.
rule "Licht Aussen nach Helligkeit schalten"
when
Item Wetterstation_Helligkeit received update
then
if ( knx_Licht_Aussen.state == OFF && Wetterstation_Helligkeit.state < 100 ) {
knx_Licht_Aussen.sendCommand(ON)
} else if ( knx_Licht_Aussen.state == ON && Wetterstation_Helligkeit.state > 200 ) {
knx_Licht_Aussen.sendCommand(OFF)
}
end