Drücken sie Ctrl/Cmd + P zum drucken
oder zum Speichern als PDF.

openHAB: Wetterstation Eurochron EFWS2900 einbinden

Mit einer eigenen Wetterstation ist man unabhängiger von externen Diensten wie OpenWeatherMap & Co. und kann genauere Werte für seinen eigenen Standort in Erfahrung bringen. Gerade bei Werten wie Niederschlagsmenge und Windgeschwindigkeiten kommt es doch, jedenfalls aus meiner Erfahrung heraus, immer wieder zu größeren Unterschieden.

Auf der Suche nach einem geeigneten Modell waren mir folgende Punkte wichtig:

  • Integration in openHAB 3
  • Nutzung der Wetterstation ohne externe Cloud- / Wetterdienste (WeatherUnderground, Ecowitt etc.)
  • günstiges Modell mit Messung von Temperatur und Luftfeuchtigkeit für Innen und Außen sowie der Niederschlagsmenge

Die Wahl ist auf die Eurochron EFWS2900 gefallen. Die Wetterstation wird u.a von Conrad und Völkner vertrieben. Wenn man sich ein wenig mit dem Thema beschäftigt, stolpert man automatisch darüber, dass die Wetterstation von Fine Offset gefertigt wird und als baugleiches Modell von verschiedenen Anbietern mit unterschiedlichsten Bezeichnungen vertrieben wird:

  • Fine Offset WH2900
  • Froggit WH3000/3500
  • Ambient Weather WS-2902
  • Chilitec CTW-902
  • Ventus W830
  • Sainlogic 10 in 1

Es gibt mittlerweile ein Binding in openHAB, mit dem sich einige Wetterstationen von Fine Offset einbinden lassen. -> Fine Offset Weather Station Binding
Leider war es mir nicht möglich eine stabile Verbindung zur Wetterstation herzustellen, so das ich davon ausgehe das die EFWS2900 vom Binding nicht unterstützt wird.

Bei der Einbindung der Wetterstation bin ich den Weg gegangen, den Florian S. von der Seite forwardme.de in seinem sehr guten openHAB 2 Tutorial für die Wetterstation ws980wifi beschrieben hat. Dabei wird in der Wetterstation ein lokaler Webserver zur Auslieferung der Wetterdaten angegeben, der fortan als Wetterportal dient.

Über ein PHP-Script werden die Werte in einer Textdatei abgelegt, welche anschließend an openHAB übergeben werden. Die Daten der Textdatei werden im Aktualisierungsintervall der Wetterstation erneuert.

Voraussetzungen

Webserver

Zur Datenspeicherung nutze ich den Raspberry Pi 4, auf dem openHAB und somit schon ein Apache Webserver läuft. Ansonsten lässt sich der Webserver inkl. PHP wie folgt installieren:

  • sudo apt-get update
  • sudo apt-get install apache2 libapache2-mod-php

Zum Test ob der Webserver läuft gibt man einfach die IP-Adresse des Server (z.B. Raspberry Pi) in die Adresszeile des Browser ein. Dann sollte die Standardseite des Apache Webserver erscheinen. Das Standardverzeichnis für den Webserver (Webroot) ist /var/www/html. Hier liegt auch die index.html die als Standardseite aufgerufen wird, solange man noch keine eigenen Inhalte hat.

Bild 1: Apache2 Default Page

Um die Daten später über eine geeignete Url abrufen zu können, legen wir noch einen Unterordner für das PHP-Script (wetter) und einen weiteren für die Textdatei an (data), in der später die Wetterdaten gespeichert werden. Der Datenordner benötigt dann nur noch Schreibrechte für den Webserverbenutzer. (www-data)

  • sudo mkdir /var/www/html/wetter
  • sudo mkdir /var/www/html/wetter/data
  • sudo chown www-data.www-data /var/www/html/wetter/data/

Im wetter-Ordner wird dann das PHP-Script als index.php gespeichert:

  • sudo nano /var/www/html/wetter/index.php
<?php

/*
 * Source: https://www.forwardme.de/2020/04/16/wetterstation-ws980-wifi-in-openhab-einbinden/
 * Aufruf index.php mit Parameter ?read=1&value=XXX gibt Wert für XXX aus
 * Parameter convert kann für folgende Konvertierungen genutzt werden
 * f2c => Fahrenheit zu Grad Celsius
 * m2k => mile per hour => Kilometer pro Stunde
 * i2h => inHG zu hPA
 * i2m => in zu mm
 */

$filename_latest = 'data/latest.txt';

if (!isset($_GET['read']) || ((int) $_GET['read'] != '1')) {
    $data = json_encode($_REQUEST);
    file_put_contents($filename_latest, $data);
    echo "done";
} else {
    $var = (string) $_GET['value'];
    $content = json_decode(file_get_contents($filename_latest));
    if (isset($content->$var)) {
        $value = $content->$var;
        if (isset($_GET['convert'])) {
            $convert = (string) $_GET['convert'];
            if ($convert == 'f2c') {
                $value = (($value - 32) / 9 * 5); // Fahrenheit zu Grad
            } else if ($convert == 'm2k') {
                $value = $value * 1.60934; // mph zu kmh
            } else if ($convert == "i2h") {
                $value = $value * 33.8638815789; //inHG zu hPa
            } else if ($convert == "i2m") {
                $value = $value * 25.4; //inch zu mm           
            }
        }
        echo $value;
    } else {
        echo "not found error!";
    }
}
?>

Download Script

Das Script speichert letztendlich die Daten der Wetterstation als Wertepaare in der latest.txt und rechnet in einem zweiten Schritt einige Einheiten in für uns gängige Werte um, sobald das Script über openHAB aufgerufen wird. (z.B. Fahrenheit in Grad Celsius) Die Daten können auch jederzeit in der txt Datei angeschaut werden und sehen bei mir z.B. so aus.

{"ID":"EFWS2900","PASSWORD":"privatekey","indoortempf":"70.3", "tempf":"26.8","dewptf":"21.7","windchillf":"26.8","indoorhumidity":"50", "humidity":"81","windspeedmph":"0.0","windgustmph":"0.0","winddir":"325", "absbaromin":"29.950","baromin":"29.997","rainin":"0.000", "dailyrainin":"0.000","weeklyrainin":"0.000","monthlyrainin":"0.071", "solarradiation":"0.00","UV":"0","dateutc":"2022-12-1>

Zuordnung der Werte:

  • ID (ID-Wert der Wetterstation)
  • PASSWORD (Passwort für Authentifizierung)
  • indoortempf (Temperatur innen, Fahrenheit)
  • tempf (Temperatur außen, Fahrenheit)
  • dewptf (Taupunkt, Fahrenheit)
  • windchillf (gefühlte Temperatur, außen, Fahrenheit)
  • indoorhumidity (Feuchtigkeit innen, Prozentwert)
  • humidity (Feuchtigkeit außen, Prozentwert)
  • windspeedmph (Windgeschwindigkeit, Meilen pro Stunde)
  • windgustmph (Windgeschwindigkeit Böe, Meilen pro Stunde)
  • winddir (Windrichtung, 1-360)
  • absbaromin (Umgebungsdruck absolut, inHG)
  • baromin (Umgebungsdruck relativ, inHG)
  • rainin (Regenmenge, inch)
  • dailyrainin (Regenmenge, inch, kumuliert für Tag)
  • weeklyrainin (Regenmenge, inch, kumuliert für Woche)
  • monthlyrainin (Regenmenge, inch, kumuliert für Monat)
  • solarradiation (Sonnenstrahlung in Watt)
  • UV (UV-Index)
  • dateutc (Datum im Format Y-m-d h:i:s)

Konfiguration der Wetterstation

Die Einrichtung der Wetterstation läuft über die App WS-View.

Die Einbindung der Wetterstation funktioniert relativ einfach. Die App führt einen dazu bebildert durch die einzelnen Schritte. Der wichtige Punkt ist dann die Einbindung des Wetterportals. Die vorgefertigten Anbieter von WeatherUnderground und Ecowitt werden nicht befüllt. Was uns interessiert ist der Punkt Customized.

  • Enable: aktiviert das eigene Wetterportal
  • Protokol Type Same as: WeatherUnderground
  • Server IP / Hostname: IP-Adresse des Webserver
  • Path: Speicherort des PHP-Skriptes (/wetter/index.php)
  • Station ID: beliebiger Text
  • Station Key: beliebiger Text
  • Port: Standardport des Webserver
  • Upload Interval: Zeitspanne der die Wetterdaten an den Webserver geschickt werden
Bild 2: WS-View Wetterportal

Sobald die Daten an die Wetterstation übertragen wurden, sollte es nicht mehr lange dauern und die latest.txt füllt sich mit Daten…

Konfiguration von openHAB 3

In openHAB wird zunächst ein http-Thing angelegt und für jeden Messwert ein Channel hinzugefügt.

  • Things -> Hinzufügen (über Plussymbol unten rechts) -> HTTP Binding -> HTTP URL Thing
  • Im Reiter Code sieht das ganze dann so aus:
    UID: http:url:EFWS2900
    label: Wettertstation http
    thingTypeUID: http:url
    configuration:
    authMode: BASIC
    ignoreSSLErrors: false
    baseURL: http://192.168.100.11/wetter/
    delay: 0
    stateMethod: GET
    refresh: 20
    commandMethod: GET
    contentType: text/html
    timeout: 3000
    bufferSize: 2048
Bild 3: Create http Thing Wetterstation

Channel anlegen am Beispiel der gefühlten Temperatur:

  • Channels -> Add Channel -> Number Channel
    Channel Identifier: temperatur_gefuehlt
    Label: Gefühlte Temp. [%.1f°C]
    Show Advanced anhaken
    State URL Extension -> stateExtension: index.php?read=1&value=windchillf&convert=f2c
    Read/Write Mode -> Read Only
  • im Reite Code sieht das ganze so aus:
    channels:
    – id: temperatur_gefuehlt
    channelTypeUID: http:number
    label: Gefühlte Temp. [%.1f°C]
    description: null
    configuration:
    mode: READONLY
    stateExtension: index.php?read=1&value=windchillf&convert=f2c
Bild 4: Create Channel

Was jetzt noch fehlt ist die Zuordnung des Channel zu einem Item und die Konfiguration der Einheit. Ich musste dazu bei jedem Item noch unter Metadaten Werte bei State Description für Pattern ergänzen. Das Pattern sorgt für die richtige Darstellung der Werte mit dazugehöriger Einheit.

So macht der Eintrag %.1f °C aus dem übergebenen Wert eine Zahl mit einer Nachkommastelle und der angehängten Einheit °C.

Item anlegen am Beispiel der gefühlten Temperatur:

  • Channels -> Gefühlte Temp. [%.1f °C] -> Add Link to Item…
    Create a new Item
    Name: gefuehlte_temp_wetterstation
    Label: Gefühlte Temp.
    Type: Number
    Category: temperature
  • Items -> Gefühlte Temp. -> Metadata – Add Metadata
    State Description

    Pattern -> %.1f °C
Bild 5: Metadata state Description Pattern

Hat alle geklappt, liefert das Item nun immer die aktuellen Werte der Wetterstation…. :-)

Bild 6: Item gefühlte Temperatur

Der vollständige Codeblock mit allen Channel kann hier kopiert werden (baseURL durch eigenen Webserver ersetzen):
* Dank an den Nutzer Kay Pawlak, der diesen Code in den Kommentaren im Artikel von Florian S. ergänzt hat.

UID: http:url:EFWS2900
label: Wetterstation http
thingTypeUID: http:url
configuration:
authMode: BASIC
ignoreSSLErrors: false
baseURL: http://192.168.xxx.x/wetter/
refresh: 10
commandMethod: GET
contentType: text/html
timeout: 3000
bufferSize: 2048
channels:
– id: temperatur_gefuehlt
channelTypeUID: http:number
label: Gefühlte Temp. [%.2f °C]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=windchillf&convert=f2c
– id: temperatur_aussen
channelTypeUID: http:number
label: Temp. außen [%.2f °C]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=tempf&convert=f2c
– id: temperatur_innen
channelTypeUID: http:number
label: Temp. innen [%.2f °C]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=indoortempf&convert=f2c
– id: taupunkt
channelTypeUID: http:number
label: Taupunkt [%.2f °C]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=dewptf&convert=f2c
– id: feuchtigkeit_innen
channelTypeUID: http:number
label: Feuchtigkeit Innen in %[%d ]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=indoorhumidity
– id: feuchtigkeit_aussen
channelTypeUID: http:number
label: Feuchtigkeit außen in %[%d ]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=humidity
– id: wind_geschwindigkeit
channelTypeUID: http:number
label: Windgeschwindigkeit [%.2f km/h]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=windspeedmph&convert=m2k
– id: wind_boee_geschwindigkeit
channelTypeUID: http:number
label: Windgeschwindigkeit Böe[%.2f km/h]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=windgustmph&convert=m2k
– id: wind_richtung
channelTypeUID: http:number
label: Windrichtung [%d °]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=winddir
– id: luftdruck_abs
channelTypeUID: http:number
label: Luftdruck abs. [%.0f hPa]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=absbaromin&convert=i2h
– id: luftdruck
channelTypeUID: http:number
label: Luftdruck [%.0f hPa]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=baromin&convert=i2h
– id: regen_aktuell
channelTypeUID: http:number
label: Regen aktuell [%.2f mm/h]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=rainin&convert=i2m
– id: regen_tag
channelTypeUID: http:number
label: Regen akt. Tag [%.2f l/m²]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=dailyrainin&convert=i2m
– id: regen_woche
channelTypeUID: http:number
label: Regen akt. Woche [%.2f l/m²]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=weeklyrainin&convert=i2m
– id: regen_monat
channelTypeUID: http:number
label: Regen akt. Monat [%.2f l/m²]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=monthlyrainin&convert=i2m
– id: sonne_einstrahlung
channelTypeUID: http:number
label: Sonne akt. [%.2f w/m²]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=solarradiation
– id: sonne_uv
channelTypeUID: http:number
label: UV [%.2f]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=UV
– id: letztes_Update
channelTypeUID: http:string
label: Daten von (UTC) [%s]
description: null
configuration:
mode: READONLY
stateExtension: index.php?read=1&value=dateutc
Hinweis
Im Tutorial von Florian ergänzen die Nutzer in den Kommentaren noch weitere Möglichkeiten die Einbindung in openHAB 3 umzusetzen. Wer Interesse hat kann da mal reinschauen und findet für sich vielleicht noch eine optimiertere Variante.

Quellen