Wetterstation ws980wifi in openhab einbinden

Ich habe homematic mit openhab im Einsatz und schon länger mit einer eigenen Wetterstation geliebäugelt. Bisher greife ich auf freie Wetterdienste über das weather-Binding zurück. Aber was nützt es mir, wenn das Wetter laut Online-Dienst für meine Stadt gerade „Regen“ ansagt, aber der Regen eigentlich nur auf der anderen Seite der Start herunterkommt? Oder andersrum… Eine Warnung, dann offene Fenster zu schließen, wäre einmal umsonst und einmal wäre sie nötig – würde aber ausbleiben. Damit ist das Ganze nur bedingt verlässlich…

Zuerst habe ich mit den Homematic-Produkten geliebäugelt. Die Homematic-Produkte waren mir zu teuer und zudem war ich mir nicht sicher, ob durch meine Basisstation im Erdgeschoss eine Wetterstation am Dach, also drei Betondecken höher, noch erreicht wird. Zudem wird hier sicher viel hin- und hergefunkt. Ich wollte nicht, dass die Wetterstation irgendwelche Auswirkungen auf meinen Duty-Cycle hat…

Zufällig bin ich dann auf die elv ws980 wifi aufmerksam geworden und dachte mir, ich vergleiche diese Station einmal mit denen von Homematic und lege mir dann eine zu. Worab: Entschieden habe ich mich aus diversen Gründen für die ws980wifi und diese habe ich auf einfache Weise auch in openHAB integriert…

Infrage kommende Wetterstationen

Hier habe ich mir natürlich zuerst die Homematic-Produkte angesehen, weil diese sicher durch die Nutzung des Protokolls der CCU3 / Homematic-Zentrale am besten Ergebnisse liefern. Aber da mir möglichst viele Daten und kein zu hoher Preis für die Station wichtig waren habe ich das einer günstigen Alternative gegenüber gestellt.

Mir ging es dabei um möglichst viele Funktionen der Station zu einem günstigen Preis. Zudem war eben eine Einbindbarkeit in openHAB (ansonsten nutze ich viel Homematic-Produkte via rasbperrymatic, aber die Logik der Programmierung steckt ausschließlich in openHAB) wichtig.

Eigenschaften / ModellHomematic IP Funk-Wetteresensor HmIP-SWO-PR proHomematic IP Wettersensor – plusHomematic IP Wettersensor – basicELV ws980wifi
AnbindungHomematic IPHomematic IPHomematic IP868 MHz + WLAN
Funkreichweite Freifeld400m400m400m100m
TempNur Außentemp.Nur Außentemp.Nur Außentemp.Außen- und Innentermp.
LuftfeuchteNur Außen-LuftfeuchtigkeitNur Außen-LuftfeuchtigkeitNur Außen-LuftfeuchtigkeitAußen- und Innen-Luftfeuchtigkeit
WindstärkeJaJaJaJa
WindrichtungJaNeinNeinJa
Regensensor (Menge + Meldung)JaJaNeinJa
Sonne/LichtsensorJaJaJaJa
SolarstromversorgungNeinNeinNeinJa
LuftdruckNeinNeinNeinJa
UV-IndexNeinNeinNeinJa
Regenmeldung sofortJaJaJaNein
Auswirkung auf Duty-CiclyJaJaJaNein
Datenupload auf WetterportaleNeinNeinNeinJa
OptikSilber, wirkt edelSilber, wirkt edelSilber, wirkt edelKunststoff
Preisca. 250€ca. 180€ca. 100€ca. 130-150€
Link zum Produkthier klickenhier klickenhier klickenhier klicken
Vergleich der Eigenschaften der Wetterstationen

Gerade da ich mir nicht sicher war, ob das mit der Funkreichweite durch drei Betondecken wirklich klappt und da v.a. bei meiner Raspberrymatic-Lösung Homematic-IP (im Gegensatz zum stabilen Betrieb von Homematic [ohne IP] selbst) manchmal leider „abschmiert“ fand ich die günstige Lösung sehr überzeugend. Zudem hat die günstige für mich den Vorteil, dass ich damit auch in meinem Wohnzimmer einen Temperatursensor und einen Feuchtesensor hätte, denn auch die Basisstation misst mit… Das hat Homematic natürlich nicht, denn hier ist die Basisstation ja die CCU3 oder der Accesspoint… Und Innensensoren für Temperatur und Feuchte wären separat zu kaufen. Und eine Regenmeldung brauche ich auch nicht unbedingt sofort, wenn die ein paar Sekunden verzögert reinkommt, dann genügt auch das günstige Gerät, das grundsätzlich viel Funktion bietet… Wobei ich schon sagen muss: Die Optik der Homematic-Geräte ist schon überzeugend.. 😉

Entschieden habe ich mich für die ELV-Wetterstation ws980wifi. Beim Kauf aufpassen, es gibt ein „nicht-wifi“-Gerät ohne den „wifi“-Zusatz. Dann wird’s natürlich schwer mit dem Datenauslesen. Für Homematic gibt es zudem auch einige Integrationen (wie z.B. diese hier..), da ich aber alles über mein openHAB-System steuere und meine ccu3 (raspberrymatic) im Sinne der besseren Wartbarkeit und Updatefähigkeit ohne irgendwelche zusätzlichen Plugins und Addons auskommt und auch auskommen soll, wollte ich hier nicht ansetzen.

Das von mir verwendete Grundprinzip der Einbindung

Die ws980wifi unterstützt den Upload zu verschiedenen Wetter-Portalen (WeatherUnderground und andere) und zudem – das ist das schöne – den Upload von Daten zu einem beliebigen, individuellen Portal.

Die Daten werden an eine beliebig konfigurierbare Webadresse geschickt und es werden dabei zwei Protokolle unterstützt: Weatherunderground und Ecowitt. Ebenso kann ein Upload-Interval in Sekunden eingestellt werden. Das nutze ich, um zu meinem eigenen „Portal“ Daten senden zu lassen und diese lese ich dann später von openHAB ein.

Es funkt zudem nicht die Wetterstation selbst mit dem WLAN sondern die Basisstation zur Wetterstation. Das ist für mich gut so, denn eine WLAN-Verbindung vom Dach zum Router wird bei mir eng.

Um die Daten dann in einem eigenen Portal annehmen zu können gibt es ein kleines PHP-Script, was die Daten serialisiert in einer Datei ablegt und mit jeder Neuanlieferung aktualisiert. Das Portal liegt auf meinem openhab-Raspberry und ist nichts anderes als ein laufender apache und ein darauf aufgerufenes PHP-Skript.

OpenHAB wird dann per http-Binding ebenso auf dieses Portal – das sich rein nur in meinem Heimnetz befindet – lesend zugreifen und die Items dann regelmäßig aktualisieren.

Vorbereitung

Irgendwo brauchen wir einen installierten Webserver mit aktiviertem PHP-Modul. Dies ist bei mir ein apache, der am openHAB-Raspberry mit läuft. Bei mir ist die unten aufgeführte index.php z.B. über http://openhab.fritz.box/wetter/index.php erreichbar.

Am Raspberry als root-User wird apache wie folgt installiert:

apt-get install apache2 libapache2-mod-php

Für openHAB brauchen wir folgendes neu, was bequem über die PaperUI geht:

  1. Das http-Binding muss installiert werden
  2. Der TransformationService REGEX muss installiert werden (wir brauchen ihn zwar nicht wirklich, aber das http-Bindung braucht leider immer eine transformationRule, auch wenn sie eigentlich nicht nötig wäre…)

Erstellen des eigenen „Wetterportals“ zur Datenannahme

Das Protokoll, welches von der ws980wifi für die Anbindung von weatherunderground verwendet wird, kennt folgende Felder:

  • 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)
  • yearlyrainin (Regenmenge, inch, kumuliert für Jahr)
  • solarradiation (Sonnenstrahlung in Watt)
  • UV (UV-Index)
  • dateutc (Datum im Format Y-m-d h:i:s)

Nun brauchen wir ein kleines Skript, was eben diese Werte in Empfang nimmt und in die bei uns gängigen Werte umrechnen. Die Umrechnung findet aber nicht beim Speichern statt sondern beim Auslesen der Daten.

Um die Daten erst einmal speichern zu können wird im Web-Root des Webservers ein Unterverzeichnis „wetter“ erstellt. Darin wird folgende Datei als „index.php“ abgelegt:

<?php

/*
 * 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!";
    }
}
?>

Zusätzlich muss unter „wetter“ ein Unterverzeichnis „data“ erstellt werden und für den Webserver-Benutzer beschreibbar gemacht werden, hier das Beispiel beim Standard-Webroot des Apachen (bitte ggf. einfach anpassen):

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

Das Skript selbst funktioniert sehr simpel: Die Daten werden von der Wetterstation als Array angeliefert und eben diesen Array speichern wir json-decoded so wie er kommt im Verzeichnis „data“ in der „latest.txt“ ab. Die kann man sich auch jederzeit mit dem Texteditor anschauen, dabei handelt es sich um Schlüssel-Wert-Paare in einer Liste.

Dies sieht dann nach Aufruf durch die Wetterstation z.B. so aus:

{"ID":"ws980wifi","PASSWORD":"myprivatekey","indoortempf":"73.9","tempf":"55.6","dewptf":"46.0","windchillf":"55.6","indoorhumidity":"42","humidity":"70","windspeedmph":"5.4","windgustmph":"6.9","winddir":"231","absbaromin":"28.533","baromin":"28.533","rainin":"0.000","dailyrainin":"0.039","weeklyrainin":"1.350","monthlyrainin":"0.000","yearlyrainin":"1.441","solarradiation":"196.84","UV":"1","dateutc":"2020-05-01 08:10:26","softwaretype":"EasyWeatherV1.4.9","action":"updateraw","realtime":"1","rtfreq":"5"}

Über einen anderen Aufruf des Skriptes (siehe spätere Konfiguration http-Item in openHAB) werden dann die Einzelwerte zurückgeliefert. Für ein paar Notwendigkeiten der Umrechnung ist es dann noch so, dass wir zum Beispiel die standardmäßig in Meilen pro Stunde angegebenen Geschwindigkeiten in Kilometer pro Stunde umrechnen müssen bzw. die Temperaturen von Fahrenheit in Grad Celsius sowie beim Luftdruck inHG zu hPa sowie der Niederschlag von inch zu mm (entspricht „Litern“). Dazu sind im Script entsprechende Parameter integriert, die dann beim Daten-Auslesen jeweils berücksichtigt weden und einfach in die URL integriert werden.

Ein Beispielhafter Aufruf zum Erhalt des monatlichen Niederschlags und zum Konvertieren in mm (also Litern) lautet bei mir so und kann auch einfach im Browser eingegeben werden und liefert dann nur den gewünschten Wert zurück:

http://openhab.fritz.box/wetter/index.php?read=1&value=monthlyrainin&convert=i2m

Durch den Parameter „convert“ belegt mit „i2m“ wird der Wert von inch zu Millimetern umgerechnet und dann so ausgegeben. Nichts anderes wird später openHAB machen – eben nur automatisiert.

Konfiguration der Wetterstation für den Datenupload

Die Wetterstation muss so konfiguriert sein, dass sie auf das „Customized“ konfiguriert ist.

Dazu muss die Wetterstation im entsprechenden Wifi Mode B sein (war automatisch bei Inbetriebnahme der Fall) und man muss die Konfigurations-APP „WS View“ installieren:

Dann muss das Device konfiguriert werden (Details siehe bei Bedarf entsprechendes Benutzerhandbuch – ich hatte allerdings keinerlei Probleme…).

  • Protokoll der Daten: WeatherUnderground
  • Server: Der Webserver (bei mir „openhab.fritz.box“)
  • Aufrufdatei: Ort des PHP-Skriptes, das die Daten annimmt (bei mir: „/wetter/index.php“)
  • Station ID: beliebiger Text, für uns nicht relevant
  • Station Key: beliebiger Text, für uns nicht relevant
  • Upload-Interval: beliebige Zeitspanne, bei mir auf 30 Sek. gestellt.
Konfiguration in der wsview Android App

Konfiguration von openHAB

Für openHAB müssen dann die Items angelegt werden.

Die bei mir eingetragene URL openhab.fritz.box/wetter/index.php muss natürlich bei jedem auf die individuelle Installation angepasst werden.

Ebenso muss natürlich die Gruppenzuordnung angepasst werden. Ich habe eine Gruppe „debugWetterstation“ angelegt, die einfach nur alle Werte anzeigt und die wird bei mir der bereits existierenden und in die Sitemap eingebundenen Gruppe „debug“ zugeordnet. Bitte einfach anpassen, wie ihr es braucht!

// Wetterstation WS980 wifi
Group    debugWetterstation "Wetterstation WS980wifi" (debug)
Number   wetterstation_temperatur_gefuehlt "Gefühlte Temp. [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=windchillf&convert=f2c:20000:REGEX((.*))]"}
Number   wetterstation_temperatur_aussen "Temp. außen [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=tempf&convert=f2c:20000:REGEX((.*))]"}
Number   wetterstation_temperatur_innen "Temp. innen [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=indoortempf&convert=f2c:20000:REGEX((.*))]"}
Number   wetterstation_taupunkt "Taupunkt [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=dewptf&convert=f2c:20000:REGEX((.*))]"}
Number   wetterstation_feuchtigkeit_innen "Feuchtigkeit Innen [%d]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=indoorhumidity:20000:REGEX((.*))]"}
Number   wetterstation_feuchtigkeit_aussen "Feuchtigkeit außen [%d]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=humidity:20000:REGEX((.*))]"}
Number   wetterstation_wind_geschwindigkeit "Windgeschwindigkeit [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=windspeedmph&convert=m2k:20000:REGEX((.*))]"}
Number   wetterstation_wind_boee_geschwindigkeit "Windgeschwindigkeit Böe[%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=windgustmph&convert=m2k:20000:REGEX((.*))]"}
Number   wetterstation_wind_richtung "Windrichtung [%d]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=winddir:20000:REGEX((.*))]"}
Number   wetterstation_luftdruck_abs "Luftdruck abs. [%.0f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=absbaromin&convert=i2h:20000:REGEX((.*))]"}
Number   wetterstation_luftdruck "Luftdruck [%.0f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=baromin&convert=i2h:20000:REGEX((.*))]"}
Number   wetterstation_regen_altuell "Regen aktuell [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=rainin&convert=i2m:20000:REGEX((.*))]"}
Number   wetterstation_regen_tag "Regen akt. Tag [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=dailyrainin&convert=i2m:20000:REGEX((.*))]"}
Number   wetterstation_regen_woche "Regen akt. Woche [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=weeklyrainin&convert=i2m:20000:REGEX((.*))]"}
Number   wetterstation_regen_monat "Regen akt. Monat [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=monthlyrainin&convert=i2m:20000:REGEX((.*))]"}
Number   wetterstation_regen_jahr "Regen akt. Jahr [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=yearlyrainin&convert=i2m:20000:REGEX((.*))]"}
Number   wetterstation_sonne_einstrahlung "Sonne akt. [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=solarradiation:20000:REGEX((.*))]"}
Number   wetterstation_sonne_uv "UV [%.2f]" (debugWetterstation) {http="<[http://openhab.fritz.box/wetter/index.php?read=1&value=UV:20000:REGEX((.*))]"}

Die transformationRule REGEX bräuchte es nicht, aber opoenhab will eben hier zwingend eine Rule angegeben sehen. Und da die URL den Wert schon genau so liefert wie wir ihn brauchen macht die Rule selbst eigentlich nichts. Wer hier einen besseren Ansatz hat bitte einfach in den Kommentaren zu diesem Artikel platzieren – vielen Dank!

Die Werte lasse ich alle 20 Sekunden (in openHBA) aktualisieren. Das kürzeste Intervall wäre übrigens 16 Sekunden, weniger kann nicht eingetragen werden. Die Basisstation selbst schiebt also die Werte ja alle 30 Sekunden zum Server. So dauert es im besten Falle knapp über 30, im schlechtesten bis zu 50 Sekunden, bis geänderte Werte der Wetterstation bei mir im System ankommen. Wem das nicht genügt, der kann die Abfrageintervalle in openHAB ja kürzen und die Upload-Intervalle in der Wetterstation ebenso kürzen.

In der Sitemap eingebunden sieht das ganze dann so aus (ok, man kann natürlich noch die Items mit Maßeinheiten usw. versehen sowie mit Icons, dann wird es schöner…):

Die Wetterstation wird jetz noch auf’s Dach geschraubt und die Werte der Station werde ich dann künftig in all meinen Rules zur Automatisierung nutzen…

Vielleicht konnte es ja für den ein oder anderen als Anregung dienen. Ich denke insgesamt ist das eine pragmatische, einfache Art, die ws980wifi in openHAB zu integrieren.

Befestigen der Wetterstation

Über das Befestigen der Wetterstation habe ich mir auch Gedanken gemacht.

Am einfachsten erschien es mir, diese auf einem Flachdach- bzw.- Balkonständer für Sat-Antennen anzubringen. Vorteil: Hier musste ich weder etwas anbohren noch viel Geld ausgeben. Und falls der Standort nicht so ideal ist, kann ich sie auch beliebig verschieben…

Der Ständer kostete nicht viel, mit einer Betonplatte (bei mir eine geteilte, war mit Leiter leichter auf das Dach zu transportieren) beschwert und kurz richtig ausgerichtet hat die Station nun am Flachdach einen festen Platz und da bewegt sich auch nichts, was sich nicht bewegen soll…

Die Basisstation steht im Erdgeschoß und zeigt noch zwei von drei Balken Empfang. Und das, obwohl zwar nur ca. 12 Meter dazwischen sind, dafür aber drei Stahlbeton-Decken…

Für mich eine ideale Lösung!

Weteres: Windrichtung und Windstärke weiterverarbeiten

Windstärke und Windrichtung weiter verarbeiten…

Die Wetterstation liefert hier „Rohdaten“ für die Geschwindigkeit, aber oft möchte man ja nur die grobe Einschätzung hören. Hier gibt es die Beaufort-Skala, welche den Wind wie folgt einteilt:

kleiner als km/hWindstärke nach BeaufortBezeichnung
10Windstille
51Leiser Zug
112Leichte Brise
193Schwache Brise
4284Mäßige Brise
385Frische Brise
496Starker Wind
617Steifer Wind
748Stürmischer Wind
889Sturm
10210Schwerer Sturm
11711Orkanartiger Sturm
darüber12Orkan
Windstärke nach der Beaufort-Skala

Für die Windrichtung gibt es einen Kreis mit 360°, den wir uns einteilen und daraus Nord, Nord-Ost, Ost, Süd-Ost, Süd, Süd-West, West und Nord-West ableiten.

Um Windrichtung und Stärke als Text und als Skalenwert zu speichern braucht es neue „virtuelle“ Items die eben dann geändert werden, wenn der Rohdatenwert der Wetterstation sich ändert.

Notwendige Items

// Virtuelle items Wetterstation
String   wetterstation_wind_richtung_text "Windrichtung [%s]" (debugWetterstation)
Number   wetterstation_wind_staerke_zahl "Windstärke [%d]" (debugWetterstation)
String   wetterstation_wind_staerke_text "Windstärke [%s]" (debugWetterstation)

Notwendige Rules

rule "Windrichtung anpassen"
when Item wetterstation_wind_richtung changed
then 
    if ((wetterstation_wind_richtung.state <= 30) || (wetterstation_wind_richtung.state >= 330)) {
        wetterstation_wind_richtung_text.postUpdate("N");
    } else if ((wetterstation_wind_richtung.state > 30) && (wetterstation_wind_richtung.state < 60)) {
        wetterstation_wind_richtung_text.postUpdate("NO");
    } else if ((wetterstation_wind_richtung.state >= 60) && (wetterstation_wind_richtung.state <= 120)) {
        wetterstation_wind_richtung_text.postUpdate("O");
    } else if ((wetterstation_wind_richtung.state > 120) && (wetterstation_wind_richtung.state < 150)) {
        wetterstation_wind_richtung_text.postUpdate("SO");
    } else if ((wetterstation_wind_richtung.state >= 150) && (wetterstation_wind_richtung.state <= 210)) {
        wetterstation_wind_richtung_text.postUpdate("S");
    } else if ((wetterstation_wind_richtung.state > 210) && (wetterstation_wind_richtung.state < 240)) {
        wetterstation_wind_richtung_text.postUpdate("SW");
    } else if ((wetterstation_wind_richtung.state >= 240) && (wetterstation_wind_richtung.state <= 300)) {
        wetterstation_wind_richtung_text.postUpdate("W");
    } else if ((wetterstation_wind_richtung.state > 300) && (wetterstation_wind_richtung.state < 330)) {
        wetterstation_wind_richtung_text.postUpdate("NW");
    } else {
        wetterstation_wind_richtung_text.postUpdate("FEHLER");
    }
end

rule "Windstärke umrechnen als Zahl und Text mit Quellwert in km/h"
when Item wetterstation_wind_geschwindigkeit changed 
then
    if (wetterstation_wind_geschwindigkeit.state < 1) {
        wetterstation_wind_staerke_zahl.postUpdate(0)
        wetterstation_wind_staerke_text.postUpdate("Windstille")
    } else if (wetterstation_wind_geschwindigkeit.state <= 5) {
        wetterstation_wind_staerke_zahl.postUpdate(1)
        wetterstation_wind_staerke_text.postUpdate("Leiser Zug")
    } else if (wetterstation_wind_geschwindigkeit.state <= 11) {
        wetterstation_wind_staerke_zahl.postUpdate(2)
        wetterstation_wind_staerke_text.postUpdate("Leichte Brise")
    } else if (wetterstation_wind_geschwindigkeit.state <= 19) {
        wetterstation_wind_staerke_zahl.postUpdate(3)
        wetterstation_wind_staerke_text.postUpdate("Schwache Brise")
    } else if (wetterstation_wind_geschwindigkeit.state <= 28) {
        wetterstation_wind_staerke_zahl.postUpdate(4)
        wetterstation_wind_staerke_text.postUpdate("Mäßige Brise")
    } else if (wetterstation_wind_geschwindigkeit.state <= 38) {
        wetterstation_wind_staerke_zahl.postUpdate(5)
        wetterstation_wind_staerke_text.postUpdate("Frische Brise")
    } else if (wetterstation_wind_geschwindigkeit.state <= 49) {
        wetterstation_wind_staerke_zahl.postUpdate(6)
        wetterstation_wind_staerke_text.postUpdate("Starker Wind")
    } else if (wetterstation_wind_geschwindigkeit.state <= 61) {
        wetterstation_wind_staerke_zahl.postUpdate(7)
        wetterstation_wind_staerke_text.postUpdate("Steifer Wind")
    } else if (wetterstation_wind_geschwindigkeit.state <= 74) {
        wetterstation_wind_staerke_zahl.postUpdate(8)
        wetterstation_wind_staerke_text.postUpdate("Stürmischer Wind")
    } else if (wetterstation_wind_geschwindigkeit.state <= 88) {
        wetterstation_wind_staerke_zahl.postUpdate(9)
        wetterstation_wind_staerke_text.postUpdate("Sturm")
    } else if (wetterstation_wind_geschwindigkeit.state <= 102) {
        wetterstation_wind_staerke_zahl.postUpdate(10)
        wetterstation_wind_staerke_text.postUpdate("Schwerer Sturm")
    } else if (wetterstation_wind_geschwindigkeit.state <= 117) {
        wetterstation_wind_staerke_zahl.postUpdate(11)
        wetterstation_wind_staerke_text.postUpdate("Orkanartiger Sturm")
    } else {
        wetterstation_wind_staerke_zahl.postUpdate(12)
        wetterstation_wind_staerke_text.postUpdate("Orkan")
    } 
end

Troubleshooting

Sollte etwas nicht gleich klappen, schaut in einem ersten Schritt ob die latest.txt überhaupt im Verzeichnis data erstellt wird. Falls nicht, Eintragungen in der URL der Wetterstation überprüfen und auch die Schreibrechte auf das data-Verzeichnis prüfen.

Sollten die Items nicht aktualisiert werden: Die in der Item-Konfiguration angegebenen URLs können auch einfach per Hand aufgerufen werden im Browser, dann sieht man gleich, ob ein Wert zurückkommt oder ob die URL evtl gar nicht stimmt…

Aber so viel kann eigentlich nicht schief gehen.. Viel Erfolg!

22 Antworten auf „Wetterstation ws980wifi in openhab einbinden“

  1. Hallo,

    ich habe versucht den Apache Server zu installieren, jedoch bekomme ich nach erfolgter Installation folgende Meldung. (PI 4 mit Openhab 2.5.4)
    — The job identifier is 4636.
    Apr 29 18:52:16 openhab apachectl[31698]: AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‚Se
    Apr 29 18:52:16 openhab apachectl[31698]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
    Apr 29 18:52:16 openhab apachectl[31698]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
    Apr 29 18:52:16 openhab apachectl[31698]: no listening sockets available, shutting down
    Apr 29 18:52:16 openhab apachectl[31698]: AH00015: Unable to open logs
    Apr 29 18:52:16 openhab apachectl[31698]: Action ’start‘ failed.
    Apr 29 18:52:16 openhab apachectl[31698]: The Apache error log may have more information.
    Apr 29 18:52:16 openhab systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
    — Subject: Unit process exited
    — Defined-By: systemd
    — Support: https://www.debian.org/support

    Wir kann ich den Apache Server zum Laufen bringen?
    Gruß
    Guido

    1. Hallo Guido,

      irgendetwas läuft bei Dir schon auf Port 80. Normalerweise läuft da eben der Webserver.
      Ist deine openhab-Instanz irgendwie angepasst?

      Es gibt zwei Möglichkeiten: den apache, auf welchem Du das Script von mir ablegen willst, lässt Du einfach auf einem anderen beliebigen, freien Port laufen oder Du schaust, was auf Port 80 läuft…

      Was passiert denn, wenn Du die URL normal im Browser aufrufst – was wird dann dargestellt?

      Hilft das nicht, dann logge dich per ssh mal auf dem Server ein, wechsle in den Root-Account und gib ein:
      fuser -n tcp 80
      Bei mir gibt das z.B. folgendes aus:

      80/tcp: 11775 11843 11858 11912 11921 12020 12059 12071 12072 12077 12078 12123 12124 12125 12139 13197

      Das sind Prozess-IDs, welche auf Port 80 laufen.

      Nun schnapp Dir eine der Prozessnummern und schau, was da läuft (bei mir beispielsweise 11775):

      ps auxw | grep 11775

      Ausgabe:

      www-data 11775 0.0 0.9 120084 8764 ? S 21:56 0:00 /usr/sbin/apache2 -k start

      Das ist auch die richtige Ausgabe, der apache2 läuft auf Port 80. Die Frage ist, was bei Dir da läuft…?

      Willst Du den Apache auf einem andren Port laufen lassen, dann kannst Du ihn z.B. auf „8010“ legen, indem Du (je nach Distribition eine andere Datei) in der Datei
      /etc/apache2/ports.conf oder /etc/apache2/httpd.conf das „Listen 80“ auf „Listen 8010“ änderst.
      Ebenso musst Du im virtuellen Host den Port anpassen (/etc/apache2/sites-enabled/000-default.conf) und hier änderst auf
      Dann Apache neu starten und er müsste auf http://hostname:8010/ anspringen.
      Dann muss natürlich der Port in der items-Datei auch zusätzlich mit angegeben werden (…openhab.fritz.box:8010/wetter… wäre das in meinem Fall)

      Viel Erfolg!
      Flo

      1. Hallo Flo,

        danke für die ausführliche Anleitung. Hat alles geklappt. Rufe ich jetzt hostname:8010/wetter/index.php auf so sehe ich den Inhalt der index.php. Auch der link der items zeigt nur den Inhalt der index.php an. Habe ich was übersehen?
        Gruß
        Guido

        1. Hallo Guido,

          da fehlt Dir vermutlich das php-modul im Apache. Ich habe das im Artikel aktualisiert. Versuche das Modul „libapache2-mod-php“ via „apt-get install libapache2-mod-php“ als root zu installieren, dann müsste der Apache PHP-Dateien auch korrekt interpretieren und nicht nur den Text der .php-Datei ausgeben.

          Viel Erfolg
          Florian

  2. Hallo Florian,
    PHP wird ausgeführt, jedoch bekomme ich beim Aufruf der index.php — Done angezeigt.
    Die Datei latest.txt beinhaltet eine Zeile [].
    Irgendwie ist der Wurm drin.

    Gruß
    Guido

    1. Hallo Guido,

      alles bestens! Die Datei schreibt eben die übergebenen Parameter in die latest.txt. Wenn Du nun die Datei manuell aufrufst im Browser ist ja auch kein Parameter übergeben und daher wird eine leere Liste in die Datei geschrieben. Für den mauellen Aufruf im Browser ist das ja auch nicht gedacht 😉

      Die URL musst Du nun ja in wsview für die Wetterstation eintragen und die übergibt dann Parameter.
      Nach Konfiguration der Wetterstation überträgt diese eben im eingestellten Intervall die WErte an diese Datei. Mach dies einmal und beobachte gerne mit „tail -f /var/log/apache2/access.log“ was der Apache-Webserver macht.

      Bei mir sieht das z.B. so aus, wenn die Wetterstation die Daten überträgt und die PHP-Datei aufruft:

      192.168.188.XXX – – [30/Apr/2020:12:32:34 +0200] „GET /wetter/index.php?ID=ws980wifi&PASSWORD=myprivatekey&indoortempf=75.2&tempf=60.1&dewptf=46.2&windchillf=60.1&indoorhumidity=43&humidity=60&windspeedmph=2.7&windgustmph=3.4&winddir=238&absbaromin=28.553&baromin=28.553&rainin=0.000&dailyrainin=0.000&weeklyrainin=1.201&monthlyrainin=1.291&yearlyrainin=1.291&solarradiation=256.29&UV=2&dateutc=2020-04-30%2010:32:33&softwaretype=EasyWeatherV1.4.9&action=updateraw&realtime=1&rtfreq=5 HTTP/1.0“ 200 172 „-“ „-“
      1

      und die latest.txt hat dann einen Inhalt wie folgt:

      {„ID“:“ws980wifi“,“PASSWORD“:“myprivatekey“,“indoortempf“:“75.2″,“tempf“:“59.7″,“dewptf“:“46.8″,“windchillf“:“59.7″,“indoorhumidity“:“43″,“humidity“:“62″,“windspeedmph“:“5.4″,“windgustmph“:“5.8″,“winddir“:“103″,“absbaromin“:“28.556″,“baromin“:“28.556″,“rainin“:“0.000″,“dailyrainin“:“0.000″,“weeklyrainin“:“1.201″,“monthlyrainin“:“1.291″,“yearlyrainin“:“1.291″,“solarradiation“:“218.61″,“UV“:“2″,“dateutc“:“2020-04-30 10:33:04″,“softwaretype“:“EasyWeatherV1.4.9″,“action“:“updateraw“,“realtime“:“1″,“rtfreq“:“5″}

      Wenn das bei Dir auch so läuft passt alles. Wenn Du dann noch per http-Binding die Werte in openhab als Item jeweils konfigurierst, dann ist die Einbindung in openhab erledigt!

      Gruß
      Florian

  3. Hallo Florian,
    danke Deiner Hilfe kann ich die Daten nun auslesen. Das einzige was mich irritiert ist die Tatsache das ich die ITEMS einfach in der PagerUI unter Control nicht angezeigt werden. Hier muss ich wohn noch was suchen.
    Gruß
    Guido

    1. Hallo Guido,

      die PaperUI nutze ich nicht zum Steuern sondern lediglich zum Einbinden der Things, alles andere mache ich dateibasiert über eine items-Datei. Am besten so eine Datei erstellen. Und dann tauchen sie ja, wenn sie auch in die Sitemap integriert sind, in der BasicUI mit auf bzw. können generell verwendet werden. Bei Fragen bitte dazu (als allgemeines openHAB-Thema) am besten die bekannten openHAB-Communities um Hilfe bitten…

      Kleiner Hinweis: Bei der Regenmenge hatte ich die Umrechnung zu mm also Litern noch vergessen, d.h. bitte den Inhalt des PHP-Scripts nochmal neu übernehemn und auch die Item-Konfiguraiton der Regenwerte. Hier ist das nun korrekt angepasst und die Umrechnung ist nun richtig.
      Bitte bei den items beim Übernehmen natürlich auch darauf achten, dass entweder die Gruppe in der Sitemap vorhanden ist (debug) oder dass eben die Gruppen und Gruppenzuordnungen korrekt angepasst sind. Dies ist ja bei jedem individuell.

      Es freut mich, dass die Anbindung zu openHAB so geklappt hat!

      Viele Grüße
      Florian

  4. Hallo Florian,

    Änderungen habe ich übernommen und es funktioniert alles. Deine Ergänzungen zu Windstärke und auch Windrichtung sind super. Danke dafür. Damit beginnt jetzt ein wenig Feinarbeit wie Icons etc.
    Gruß
    Guido

    1. Danke für den Hinweis Björn, das war ein copy and paste-Fehler. Das „}“ war versehentlich eine Zeile hoch hinter die Kommentierung gerutscht. Habe es aktualisiert…

  5. Hallo Florian,
    ich bin eigentlich auf der Suche nach einer z-wave wetterstation für mein openHAB System, dabei bin ich hier auf deine sehr interessante Beschreibung gestoßen. Toll gemacht und sehr gut beschrieben! Ich denke den Weg werde ich auch gehen.

    Die WS980 habe ich zwar noch nicht gekauft, aber die Vorbereitung bzgl. apache2 habe ich schon einmal ausprobiert, und der Teil funktioniert.
    Jetzt habe ich gesehen, dass Ende Juli eine neue Wetterstation „dnt WiFi-Wetterstation WeatherScreen PRO“ auf den Markt kommt. Außengerät sieht identisch zur WS980 aus, die dnt hat aber eine, wie ich finde, schönere/bessere Basisstation und man kann auch noch weitere 8 Raumklimasensoren einbinden. Das ist natürlich teurer als die WS980, aber das wäre es mir vielleicht wert. Zumal ich gelesen habe, dass manche nach ca. 1 Jahr Probleme mit der Displayhelligkeit des WS980 haben.

    Jetzt meine Frage an dich: wenn ich mir die Bedienungsanleitung der dnt so anschauen (z.B. hier: https://files2.elv.com/public/25/2510/251064/Internet/251064_um.pdf), scheint es die gleichen Einstellungsmöglichkeiten für einen individuellen Webserver zu geben. Was ist deine Einschätzung? Würden deine beschriebenen Scripte/Konfigurationen mit der dnt auch funktionieren?

    Gruß
    Frank

    1. Hallo, wenn die Konfigurationsmöglichkeiten die gleichen sind vermute ich, dass es auch funktioniert.
      Weitere Innensensoren klingen interessant, ob diese dann mit ihren Werten auch alle so ausgelesen werden können wäre spannend…

  6. Danke für die Einschätzung! Jetzt werde ich erstmal bis Ende Juli warten, sofern die Station dann auch lieferbar ist. Ich werde dann berichten.
    Gruß
    Frank

  7. Hallo,
    habe mich jetzt doch für die ws980wifi entschieden, weil ich doch vermute, dass die Zusatz-Innensensoren der dnt nicht ausgelesen werden können (WU-Protokoll sendet nur Außendaten).
    Bei der ws980 bin ich jetzt aber doch auf Probleme gestoßen: die Station schreibt keine Werte in die latest.txt
    Ausgangslage:
    – Hostname ist bei mir openhabianpi
    – apache2 ist installiert, Port ist standardmäßig 80; url „openhabianpi:80“ im browser liefert die Apache2 Debian Default Page
    – index.php liegt unter /var/www/html/wetter
    – Unterverzeichnis /data ist angelegt
    – url Aufruf „openhabianpi/wetter/index.php“ im Browser liefert „done“

    Soweit so gut. Zunächst wurde die latest.txt gar nicht angelegt. Ich hatte wohl den falschen Webserver-Benutzer bei chown verwendet; nachdem ich „sudo chown www-data.www-data /var/www/html/wetter/data/“ verwendet habe, konnte dann die latest.txt geschrieben werden.

    Die ws980 ist erfolgreich im WLAN eingebunden, fritzbox sieht sie zumindest, und mit dem PC Tool WeatherSmartIP von ELV kann ich die Werte von der Basisstation auslesen.
    Ich habe in der App WS View die Einstellungen so vorgenommen wie du, bis auf den Servernamen, hier habe ich „openhabianpi“ (statt „openhab.fritz.box“ wie bei dir)
    Mit tail -f /var/log/apache2/access.log sehe ich nur meine manuellen Aufrufe aus dem Browser, aber keinerlei Einträge von der Station.

    Hast du irgendeine Idee, woran das liegen könnte oder was ich noch als Ursachenforschung machen kann? Doch irgendein Rechteproblem?

    Gruß
    Frank

    1. Hallo Frank,

      ich stand vor dem selben Problem, bei mir hat es geholfen in der WS View App statt dem Hostnamen die (im lokalen Netz feste) IP Adresse der Pi einzutragen.

      @Florian: Super Anleitung!

    2. Wenn es im apache log nicht auftaucht, kann es eigentlich kein Rechteproblem sein. Ich vermute ein Problem beim Auflösen des Hostnamen. Ansonsten müsste ja der Apache zumindest etwas im Log vermerken… Wie Kay auch anmerkt wäre der Versuch nur mit der IP sinnvoll.

  8. @Kay @Florian: Klasse, das war der entscheidende Hinweis! Jetzt funktioniert es auch bei mir 🙂

    Vielen Dank für eure schnelle Hilfe, und nochmal vielen Dank Florian für die sehr gute Anleitung hier!

  9. Hi,

    erstmal @Florian super geile Anleitung!!

    Meine Wetterstation kommt erst morgen, ich habe aber soweit alles vorbereitet, apache läuft, bsp. latest.txt hab ich auch angelegt und kann über openhab auch auslesen.
    Eine Frage hätte ich noch, du schreibst bei der konfiguration der Wetterstation „Aufrufdatei: Ort des PHP-Skriptes, das die Daten annimmt (bei mir: „/wetter/index.php“)“ unten im Bild steht bei Path: /wetter/index.php? muss das „?“ da hin oder war das ein versehen?

    1. Hallo, das Fragezeichen dürfte kein Problem sein. Ob es auch ohne geht vermute ich, kann ich aber aus dem Stegreif nicht sagen.. einfach ausprobieren und berichten 😃
      Vermutlich wird es hier bald ein Update geben, ich beschäftige mich derzeit mit mqtt, damit sollte es besser und schneller in Richtung openhab gehen…

      1. Hi, in wie weit willst du das mit mqtt koppeln? Dazu müsste ja die Wetterstation sich am mqtt broker anmelden und messages publishen. Oder willst du dir ein script schreiben welches dann auf den RPI läuft und die Daten aus deine Datei per mqtt verschickt?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.