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!

41 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?

        1. Richtig erkannt. Das Script soll das dann direkt weiterschieben per mqtt und nicht darauf warten, dass im Intervall die Daten aktualisiert werden..

  10. Hallo, ich bin schon lange auf der Suche nach einer Wetterstation die ich ohne externe Umwege an den openhab raspi anbinden kann (und damit komplett lokal im eigenen Netz bleibe), dies scheint hier ja ohne Probleme möglich zu sein. Nun scheint es ja so zu sein das die ELV eigentlich eine Froggit Wetterstation ist und es da inzwischen ein neueres Modell gibt: https://www.froggit.de/product_info.php?info=p436_hp1000se-pro-wi-fi-internet-funkwetterstation.html

    Die Außeneinheit scheint noch die gleiche zu sein. Laut Beschreibung scheint auch eine „Benutzerdefinierte Website“ zum hochladen der Daten („Unterstützt das Hochladen auf Ihre individuelle Website, wenn die Website das gleiche Protokoll mit Wunderground oder Ecowitt hat.“) möglich sein.
    Gehe ich richtig davon aus das die Anleitung dann auch auf diese Anlage übertragbar wäre? Oder hat das vielleicht jemand schon einmal probiert?

    Mich irretiert aber noch das an den benutzerdefinierten Server nur die „Übertragung der Messwerte des Außenbereichs“ möglich ist, nur bei Ecowitt direkt auch die Innensensoren? Gibt es diese einschränkung bei der WS980 auch? Wäre jetzt nicht sooo schlimm aber trotzdem schade…

    Hat jemand Erfahrung damit? Sie ist teurer, klar, hat aber definitiv die schönere Anzeige…

    1. Ich vermute, dass das auch funktioniert, das Protokoll ist ja das gleiche.
      Das Protokoll sieht auch die zusätzlichen Innensensoren nicht vor, daher können die auch vermutlich nicht übertragen werden in diesem Rahmen.
      Wenn das klappt berichte das doch hier, dann haben andere Leser auch etwas davon!

    2. Hallo,
      erst einmal vielen Dank für die super Anleitung.

      Ich habe die Froggit HP1000 am letzten Wochenende integriert. Ich musste allerdings den Path anpassen. Bei funktioniert das Wundergroundprotokol mit dem Pfad: „/wetter/index.php?GET%20“.
      Ich habe nur einen innensensor, der wird auch mit übertragen.

      Gruß
      Oliver

    1. Hallo Stefan,

      Nein, ich bin leider noch nicht zu einer Migration auf openhab 3 gekommen und das wird auch noch etwas dauern. Falls du vor mir eine Lösung hast gib bitte Bescheid, dann Update ich den Artikel gerne.
      Viele Grüße
      Florian

  11. EINBINDUNG in OH3
    so hats bei mir geklappt…
    „neues“ http-Binding installieren (http1 wird nicht mehr unterstützt)
    –> dann entweder über die Weboberfläche von Openhab ein http-thing und die channels anlegen.
    Sieht unter dem Reiter CODE dann z.B. so aus:
    UID: http:url:WS980Wifi
    label: Wetterstation_
    thingTypeUID: http:url
    configuration:
    authMode: BASIC
    ignoreSSLErrors: false
    baseURL: http://192.168.11.2/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: regen_jahr
    channelTypeUID: http:number
    label: Regen akt. Jahr [%.2f l/m²]
    description: null
    configuration:
    mode: READONLY
    stateExtension: index.php?read=1&value=yearlyrainin&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

    ODER ÜBER DIE BEARBETUNG DER klassischen .things Datei:

    //HTTP THINGS
    //Wetterstation
    Thing http:url:WS980Wifi „Wetterstation_“ [
    baseURL=“http://192.168.11.2/wetter/“,
    refresh=10,
    timeout=3000,
    commandMethod=“GET“,
    contentType=“text/html“,
    bufferSize=2048
    ]{
    Channels:
    Type number : temperatur_gefuehlt „Gefühlte Temp. [%.2f °C]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=windchillf&convert=f2c“]
    Type number : temperatur_aussen „Temp. außen [%.2f °C]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=tempf&convert=f2c“]
    Type number : temperatur_innen „Temp. innen [%.2f °C]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=indoortempf&convert=f2c“]
    Type number : taupunkt „Taupunkt [%.2f °C]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=dewptf&convert=f2c“]
    Type number : feuchtigkeit_innen „Feuchtigkeit Innen in %[%d ]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=indoorhumidity“]
    Type number : feuchtigkeit_aussen „Feuchtigkeit außen in %[%d ]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=humidity“]
    Type number : wind_geschwindigkeit „Windgeschwindigkeit [%.2f km/h]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=windspeedmph&convert=m2k“]
    Type number : wind_boee_geschwindigkeit „Windgeschwindigkeit Böe[%.2f km/h]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=windgustmph&convert=m2k“]
    Type number : wind_richtung „Windrichtung [%d °]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=winddir“]
    Type number : luftdruck_abs „Luftdruck abs. [%.0f hPa]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=absbaromin&convert=i2h“]
    Type number : luftdruck „Luftdruck [%.0f hPa]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=baromin&convert=i2h“]
    Type number : regen_aktuell „Regen aktuell [%.2f mm/h]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=rainin&convert=i2m“]
    Type number : regen_tag „Regen akt. Tag [%.2f l/m²]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=dailyrainin&convert=i2m“]
    Type number : regen_woche „Regen akt. Woche [%.2f l/m²]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=weeklyrainin&convert=i2m“]
    Type number : regen_monat „Regen akt. Monat [%.2f l/m²]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=monthlyrainin&convert=i2m“]
    Type number : regen_jahr „Regen akt. Jahr [%.2f l/m²]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=yearlyrainin&convert=i2m“]
    Type number : sonne_einstrahlung „Sonne akt. [%.2f w/m²]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=solarradiation“]
    Type number : sonne_uv „UV [%.2f]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=UV“]
    Type string : letztes_Update „Daten von (UTC) [%s]“ [mode=“READONLY“, stateExtension=“index.php?read=1&value=dateutc“]
    }

    1. Vielen Dank für deinen Kommentar!
      Aus Zeitgründen bin ich noch komplett auf openhab 2, der Umstieg steht noch aus. Ich freue mich dann auf deine Vorarbeit zurückgreifen zu können!

  12. Hallo Stefan, hallo Florian,

    was mich an meiner eigenen Lösung für OH3 stört(e), ist dass für jeden Channel eine eigene Abfrage an den Wetterserver geht. Das geht in OH3 besser, dachte ich mir. Folgende Lösung fragt nur einmal ab und übernimmt die Zerlegung in Channels und dann zwangsläufig auch die Umrechnung der Einheiten innerhalb von Openhab.

    Notwendige Änderung an der index.php um den kompletten Inhalt der ‚latest.txt‘ beziehen zu können, die „alte“ Abfrage bleibt hierbei erhalten:

    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;
    }
    //EINFÜGUNG ABFRAGE AUF ALLE DATEN
    else {
    if($var == ‚ALL‘ ){
    if (!file_exists(„$filename_latest“))
    {
    echo „Datei nicht vorhanden.“;
    exit;
    }

    $dz=fopen(„$filename_latest“,“r“);

    if(!$dz)
    {
    echo „Datei konnte nicht geöffnet werden.“;
    exit;
    }

    while (!feof($dz))
    {
    $reihe=fgets($dz,500);
    echo $reihe;
    }

    fclose($dz);
    }
    // ENDE DER EINFÜGUNG
    else{
    echo „not found error!“;
    }
    }
    }
    ?>

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    In OH3 wird die JSONPath Transformation benötigt.
    Installation auf der OH3-Seite unter Administrator>>Einstellungen>>Transformations

    Einrichtung über die *.Things-Datei
    Thing http:url:WS980Wifi_JSON „Wetterstation JSON“ [
    baseURL=“http://192.168.11.2/wetter/index.php?read=1&value=ALL“,
    refresh=20,
    timeout=3000,
    commandMethod=“GET“,
    contentType=“text/html“,
    bufferSize=2048
    ]{
    Channels:
    Type string : ID „ID“ [ stateTransformation=“JSONPATH:$.ID“]
    Type string : PASSWORD „PASSWORD“ [ stateTransformation=“JSONPATH:$.PASSWORD“]
    Type number : temperatur_gefuehlt „Gefühlte Temp. [%.2f F]“ [ stateTransformation=“JSONPATH:$.windchillf“]
    Type number : temperatur_aussen „Temp. außen [%.2f F]“ [ stateTransformation=“JSONPATH:$.tempf“]
    Type number : temperatur_innen „Temp. innen [%.2f F]“ [ stateTransformation=“JSONPATH:$.indoortempf“]
    Type number : taupunkt „Taupunkt [%.2f F]“ [ stateTransformation=“JSONPATH:$.dewptf“]
    Type number : feuchtigkeit_innen „Feuchtigkeit Innen in %[%d ]“ [ stateTransformation=“JSONPATH:$.indoorhumidity“]
    Type number : feuchtigkeit_aussen „Feuchtigkeit außen in %[%d ]“ [ stateTransformation=“JSONPATH:$.humidity“]
    Type number : wind_geschwindigkeit „Windgeschwindigkeit [%.2f mph]“ [ stateTransformation=“JSONPATH:$.windspeedmph“]
    Type number : wind_boee_geschwindigkeit „Windgeschwindigkeit Böe[%.2f mph]“ [ stateTransformation=“JSONPATH:$.windgustmph“]
    Type number : wind_richtung „Windrichtung [%d °]“ [ stateTransformation=“JSONPATH:$.winddir“]
    Type number : luftdruck_abs „Luftdruck abs. [%.0f inHG]“ [ stateTransformation=“JSONPATH:$.absbaromin“]
    Type number : luftdruck „Luftdruck [%.0f inHG]“ [ stateTransformation=“JSONPATH:$.baromin“]
    Type number : regen_aktuell „Regen aktuell [%.2f inch/h]“ [ stateTransformation=“JSONPATH:$.rainin“]
    Type number : regen_tag „Regen akt. Tag [%.2f inch]“ [ stateTransformation=“JSONPATH:$.dailyrainin“]
    Type number : regen_woche „Regen akt. Woche [%.2f inch]“ [ stateTransformation=“JSONPATH:$.weeklyrainin“]
    Type number : regen_monat „Regen akt. Monat [%.2f inch]“ [ stateTransformation=“JSONPATH:$.monthlyrainin“]
    Type number : regen_jahr „Regen akt. Jahr [%.2f inch]“ [ stateTransformation=“JSONPATH:$.yearlyrainin“]
    Type number : sonne_einstrahlung „Sonne akt. [%.2f w/m²]“ [ stateTransformation=“JSONPATH:$.solarradiation“]
    Type number : sonne_uv „UV [%.2f]“ [ stateTransformation=“JSONPATH:$.UV“]
    Type string : letztes_Update „dateutc [%s]“ [ stateTransformation=“JSONPATH:$.dateutc“]
    }

    ITEMS

    // „falsche“ Einheiten

    Number WetterstationJSONTemperaturGefuehlt „Gefühlte temp. [%.2f F]“ {channel=“http:url:WS980Wifi_JSON:temperatur_gefuehlt“}
    Number WetterstationJSONTemperaturAussen „Temp. außen [%.2f F]“ {channel=“http:url:WS980Wifi_JSON:temperatur_aussen“}
    Number WetterstationJSONTemperaturInnen „Temp. innen [%.2f F]“ {channel=“http:url:WS980Wifi_JSON:temperatur_innen“}
    Number WetterstationJSONTaupunkt „Taupunkt [%.2f F]“ {channel=“http:url:WS980Wifi_JSON:taupunkt“}
    Number WetterstationJSONWindGeschwindigkeit „Windgeschwindigkeit [%.2f mph]“ {channel=“http:url:WS980Wifi_JSON:wind_geschwindigkeit“}
    Number WetterstationJSONWindBoeeGeschwindigkeit „Windgeschwindigkeit böe[%.2f mph]“ {channel=“http:url:WS980Wifi_JSON:wind_boee_geschwindigkeit“}
    Number WetterstationJSONLuftdruckAbs „Luftdruck abs. [%.0f inHG]“ {channel=“http:url:WS980Wifi_JSON:luftdruck_abs“}
    Number WetterstationJSONLuftdruck „Luftdruck [%.0f inHG]“ {channel=“http:url:WS980Wifi_JSON:luftdruck“}
    Number WetterstationJSONRegenAktuell „Regen aktuell [%.2f inch/h]“ {channel=“http:url:WS980Wifi_JSON:regen_aktuell“}
    Number WetterstationJSONRegenTag „Regen akt. tag [%.2f inch]“ {channel=“http:url:WS980Wifi_JSON:regen_tag“}
    Number WetterstationJSONRegenWoche „Regen akt. woche [%.2f inch]“ {channel=“http:url:WS980Wifi_JSON:regen_woche“}
    Number WetterstationJSONRegenMonat „Regen akt. monat [%.2f inch]“ {channel=“http:url:WS980Wifi_JSON:regen_monat“}
    Number WetterstationJSONRegenJahr „Regen akt. jahr [%.2f inch]“ {channel=“http:url:WS980Wifi_JSON:regen_jahr“}

    // korrigierte Einheiten

    Number wetterstation_temperatur_gefuehlt „Gefühlte Temp. [%.2f °C]“ (debugWetterstation)
    Number wetterstation_temperatur_aussen „Temp. außen [%.2f °C]“ (debugWetterstation, wetterstation_temperaturen)
    Number wetterstation_temperatur_innen „Temp. innen [%.2f °C]“ (debugWetterstation, wetterstation_temperaturen)
    Number wetterstation_taupunkt „Taupunkt [%.2f °C]“ (debugWetterstation)
    Number wetterstation_feuchtigkeit_innen „Feuchtigkeit Innen in %[%d ]“ (debugWetterstation) {channel=“http:url:WS980Wifi_JSON:feuchtigkeit_innen“}
    Number wetterstation_feuchtigkeit_aussen „Feuchtigkeit außen in %[%d ]“ (debugWetterstation) {channel=“http:url:WS980Wifi_JSON:feuchtigkeit_aussen“}
    Number wetterstation_wind_geschwindigkeit „Windgeschwindigkeit [%.2f km/h]“ (debugWetterstation, wetterstation_Wind)
    Number wetterstation_wind_boee_geschwindigkeit „Windgeschwindigkeit Böe[%.2f km/h]“ (debugWetterstation, wetterstation_Wind)
    Number wetterstation_wind_richtung „Windrichtung [%d °]“ (debugWetterstation, wetterstation_windrichtung_gruppe ) {channel=“http:url:WS980Wifi_JSON:wind_richtung“}
    Number wetterstation_luftdruck_abs „Luftdruck abs. [%.0f hPa]“ (debugWetterstation)
    Number wetterstation_luftdruck „Luftdruck [%.0f hPa]“ (debugWetterstation)
    Number wetterstation_regen_aktuell „Regen aktuell [%.2f mm/h]“ (debugWetterstation, rainday)
    Number wetterstation_regen_tag „Regen akt. Tag [%.2f l/m²]“ (debugWetterstation, rainday)
    Number wetterstation_regen_woche „Regen akt. Woche [%.2f l/m²]“ (debugWetterstation)
    Number wetterstation_regen_monat „Regen akt. Monat [%.2f l/m²]“ (debugWetterstation)
    Number wetterstation_regen_jahr „Regen akt. Jahr [%.2f l/m²]“ (debugWetterstation)
    Number wetterstation_sonne_einstrahlung „Sonne akt. [%.2f w/m²]“ (debugWetterstation, wetterstation_Sonne) {channel=“http:url:WS980Wifi_JSON:sonne_einstrahlung“}
    Number wetterstation_sonne_uv „UV [%.2f]“ (debugWetterstation) {channel=“http:url:WS980Wifi_JSON:sonne_uv“}
    String Wetterstation_letztes_Update „Daten von (UTC) [%s]“ (debugWetterstation) {channel=“http:url:WS980Wifi_JSON:letztes_Update“}
    DateTime Wetterstation_letztes_update_Local „Daten von [%s]“

    RULES zum korrigieren der Einheiten

    rule „Einheiten anpassen“
    when
    Item Wetterstation_letztes_Update changed
    then
    wetterstation_temperatur_gefuehlt.postUpdate(((WetterstationJSONTemperaturGefuehlt.state as Number)-32)/9*5)
    wetterstation_temperatur_aussen.postUpdate(((WetterstationJSONTemperaturAussen.state as Number)-32)/9*5)
    wetterstation_temperatur_innen.postUpdate(((WetterstationJSONTemperaturInnen.state as Number)-32)/9*5)
    wetterstation_taupunkt.postUpdate(((WetterstationJSONTaupunkt.state as Number)-32)/9*5)
    wetterstation_wind_geschwindigkeit.postUpdate((WetterstationJSONWindGeschwindigkeit.state as Number)* 1.60934)
    wetterstation_wind_boee_geschwindigkeit.postUpdate((WetterstationJSONWindBoeeGeschwindigkeit.state as Number)* 1.60934)
    wetterstation_luftdruck_abs.postUpdate((WetterstationJSONLuftdruckAbs.state as Number)* 33.8638815789)
    wetterstation_luftdruck.postUpdate((WetterstationJSONLuftdruck.state as Number)* 33.8638815789)
    wetterstation_regen_aktuell.postUpdate((WetterstationJSONRegenAktuell.state as Number)* 25.4)
    wetterstation_regen_tag.postUpdate((WetterstationJSONRegenTag.state as Number)* 25.4)
    wetterstation_regen_woche.postUpdate((WetterstationJSONRegenWoche.state as Number)* 25.4)
    wetterstation_regen_monat.postUpdate((WetterstationJSONRegenMonat.state as Number)* 25.4)
    wetterstation_regen_jahr.postUpdate((WetterstationJSONRegenJahr.state as Number)* 25.4)
    end

    @Florian, wenn du noch eine Möglichkeit findest, wie man die Berechnung der Einheiten trotzdem schon in der Index.php stattfinden lassen kann oder eine Möglichkeit kennst/findest die Umrechnung beim Einlesen der Channels durchzuführen wäre das natürlich perfekt. 🙂

    Grüße an alle mit Spaß an ihren Projekten

  13. Hallo

    Vielen Dank für eure Arbeit! Ich bin weder ein großer PHP- noch OpenHab-Crack, habe aber trotzdem mal versucht, eure Vorarbeit für Openhab3 umzubauen und das ist mir in weitesten Teilen gelungen. Einzig die Einbindung der Local-Time als Item Thing klappt bisher nicht. Vielleicht hat ja wer eine Idee.
    Die Wetterstation die ich nutze ist die Waldbeck Huygens. Das Setup funktioniert identisch zur ELV; könnte daran liegen, dass es vermutlich derselbe Hersteller ist. Einzig die Jahresregensumme scheint es hier nicht zu geben; aber das sollte jeder ergänzt bekommen.

    index.php

    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);
    $dec = json_decode($data);
    // Here we modify values
    $dec->indoortempf = round(((float)$dec->indoortempf-32)/9*5,1);
    $dec->tempf = round(((float)$dec->tempf-32)/9*5,1);
    $dec->dewptf = round(((float)$dec->dewptf-32)/9*5,1);
    $dec->windchillf = round(((float)$dec->windchillf-32)/9*5,1);
    $dec->windspeedmph = round((float)$dec->windspeedmph*1.60934,1);
    $dec->windgustmph = round((float)$dec->windgustmph*1.60934,1);
    $dec->absbaromin = round((float)$dec->absbaromin*33.8638815789,1);
    $dec->baromin = round((float)$dec->baromin*33.8638815789,1);
    $dec->rainin = round((float)$dec->rainin*25.4,1);
    $dec->dailyrainin = round((float)$dec->dailyrainin*25.4,1);
    $dec->weeklyrainin = round((float)$dec->weeklyrainin*25.4,1);
    $dec->monthlyrainin = round((float)$dec->monthlyrainin*25.4,1);
    //error_log(print_r($dec->tempf,true));
    $data = json_encode($dec);
    file_put_contents($filename_latest, $data);
    echo „done“;
    exit;
    } else {
    if (!file_exists(„$filename_latest“))
    {
    echo „Datei nicht vorhanden.“;
    exit;
    }
    $dz=fopen(„$filename_latest“,“r“);
    if(!$dz)
    {
    echo „Datei konnte nicht geöffnet werden.“;
    exit;
    }
    while (!feof($dz))
    {
    $reihe=fgets($dz,500);
    echo $reihe;
    }
    fclose($dz);
    }
    ?>

    THING

    UID: http:url:1709f1492f
    label: Wetterstation Waldbeck Huygens
    thingTypeUID: http:url
    configuration:
    authMode: BASIC
    ignoreSSLErrors: false
    baseURL: http://localhost/wetter/index.php?read=1
    refresh: 30
    commandMethod: GET
    contentType: text/html
    timeout: 3000
    bufferSize: 2048
    location: Outdoor
    channels:
    – id: id
    channelTypeUID: http:string
    label: ID
    description: null
    configuration:
    stateTransformation: JSONPATH:$.ID
    – id: password
    channelTypeUID: http:string
    label: PASSWORD
    description: null
    configuration:
    stateTransformation: JSONPATH:$.PASSWORD
    – id: temperatur_gefuehlt
    channelTypeUID: http:number
    label: Gefühlte Temp. [°C]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.windchillf
    – id: temperatur_aussen
    channelTypeUID: http:number
    label: Temp. außen [°C]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.tempf
    – id: temperatur_innen
    channelTypeUID: http:number
    label: Temp. innen [°C]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.indoortempf
    – id: taupunkt
    channelTypeUID: http:number
    label: Taupunkt [°C]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.dewptf
    – id: feuchtigkeit_innen
    channelTypeUID: http:number
    label: Feuchtigkeit Innen in %
    description: null
    configuration:
    stateTransformation: JSONPATH:$.indoorhumidity
    – id: letztes_Update
    channelTypeUID: http:string
    label: dateutc [%s]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.dateutc
    – id: feuchtigkeit_aussen
    channelTypeUID: http:number
    label: Feuchtigkeit außen in %
    description: null
    configuration:
    stateTransformation: JSONPATH:$.humidity
    – id: wind_geschwindigkeit
    channelTypeUID: http:number
    label: Windgeschwindigkeit [km/h]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.windspeedmph
    – id: wind_boee_geschwindigkeit
    channelTypeUID: http:number
    label: Windgeschwindigkeit Böe [km/h]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.windgustmph
    – id: wind_richtung
    channelTypeUID: http:number
    label: Windrichtung [°]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.winddir
    – id: luftdruck_abs
    channelTypeUID: http:number
    label: Luftdruck abs. [hPa]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.absbaromin
    – id: luftdruck
    channelTypeUID: http:number
    label: Luftdruck [hPa]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.baromin
    – id: regen_aktuell
    channelTypeUID: http:number
    label: Regen aktuell [mm/h]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.rainin
    – id: regen_tag
    channelTypeUID: http:number
    label: Regen akt. Tag [mm]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.dailyrainin
    – id: regen_woche
    channelTypeUID: http:number
    label: Regen akt. Woche [mm]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.weeklyrainin
    – id: regen_monat
    channelTypeUID: http:number
    label: Regen akt. Monat [mm]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.monthlyrainin
    – id: sonne_einstrahlung
    channelTypeUID: http:number
    label: Sonne akt. [w/m²]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.solarradiation
    – id: sonne_uv
    channelTypeUID: http:number
    label: UV [%.2f]
    description: null
    configuration:
    stateTransformation: JSONPATH:$.UV

    ITEMS (Können durch Copy/Paste in Openhab3 als „Items from Textual Definition“ eingebunden werden)

    Number wetterstation_temperatur_gefuehlt „Gefühlte Temp. [°C]“ (Wetterstation) {channel=“http:url:1709f1492f:temperatur_gefuehlt“}
    Number wetterstation_temperatur_aussen „Temp. außen [°C]“ (Wetterstation, wetterstation_temperaturen) {channel=“http:url:1709f1492f:temperatur_aussen“}
    Number wetterstation_temperatur_innen „Temp. innen [°C]“ (Wetterstation, wetterstation_temperaturen) {channel=“http:url:1709f1492f:temperatur_innen“}
    Number wetterstation_taupunkt „Taupunkt [°C]“ (Wetterstation) {channel=“http:url:1709f1492f:taupunkt“}
    Number wetterstation_feuchtigkeit_innen „Feuchtigkeit Innen in %“ (Wetterstation) {channel=“http:url:1709f1492f:feuchtigkeit_innen“}
    Number wetterstation_feuchtigkeit_aussen „Feuchtigkeit außen in %“ (Wetterstation) {channel=“http:url:1709f1492f:feuchtigkeit_aussen“}
    Number wetterstation_wind_geschwindigkeit „Windgeschwindigkeit [km/h]“ (Wetterstation, wetterstation_Wind) {channel=“http:url:1709f1492f:wind_geschwindigkeit“}
    Number wetterstation_wind_boee_geschwindigkeit „Windgeschwindigkeit Böe[km/h]“ (Wetterstation, wetterstation_Wind) {channel=“http:url:1709f1492f:wind_boee_geschwindigkeit“}
    Number wetterstation_wind_richtung „Windrichtung [°]“ (Wetterstation, wetterstation_windrichtung_gruppe ) {channel=“http:url:1709f1492f:wind_richtung“}
    Number wetterstation_luftdruck_abs „Luftdruck abs. [hPa]“ (Wetterstation) {channel=“http:url:1709f1492f:luftdruck_abs“}
    Number wetterstation_luftdruck „Luftdruck [hPa]“ (Wetterstation) {channel=“http:url:1709f1492f:luftdruck“}
    Number wetterstation_regen_aktuell „Regen aktuell [mm/h]“ (Wetterstation, rainday) {channel=“http:url:1709f1492f:regen_aktuell“}
    Number wetterstation_regen_tag „Regen akt. Tag [l/m²]“ (Wetterstation, rainday) {channel=“http:url:1709f1492f:regen_tag“}
    Number wetterstation_regen_woche „Regen akt. Woche [l/m²]“ (Wetterstation) {channel=“http:url:1709f1492f:regen_woche“}
    Number wetterstation_regen_monat „Regen akt. Monat [l/m²]“ (Wetterstation) {channel=“http:url:1709f1492f:regen_monat“}
    Number wetterstation_sonne_einstrahlung „Sonne akt. [w/m²]“ (Wetterstation, wetterstation_Sonne) {channel=“http:url:1709f1492f:sonne_einstrahlung“}
    Number wetterstation_sonne_uv „UV“ (Wetterstation) {channel=“http:url:1709f1492f:sonne_uv“}
    String Wetterstation_letztes_Update „Daten von (UTC) [%s]“ (Wetterstation) {channel=“http:url:1709f1492f:letztes_Update“}
    DateTime Wetterstation_letztes_update_Local „Daten Update Uhrzeit“

    RULES

    triggers:
    – id: „1“
    configuration:
    itemName: Wetterstation_letztes_Update
    type: core.ItemStateUpdateTrigger
    conditions: []
    actions:
    – inputs: {}
    id: „2“
    configuration:
    type: application/javascript
    script: >
    // Um die Zeit korrekt hinzubekommen muss erst ein UTC-Date-Objekt aus
    dem Zeitstring gebaut werden
    var timestring = itemRegistry.getItem(‚Wetterstation_letztes_Update‘).getState().toString();
    var calarray = timestring.split(‚ ‚);
    var datearray = calarray[0].split(‚-‚);
    var timearray = calarray[1].split(‚:‘);
    var localtime = new Date(Date.UTC(datearray[0], datearray[1], datearray[2], timearray[0], timearray[1], timearray[2]));
    // Das zweite Zeititem befuellen
    events.postUpdate(‚Wetterstation_letztes_update_Local‘,localtime);
    type: script.ScriptAction

  14. Hey,
    vielen Dank für euren Input hier, ich habe alles zusammengenommen und noch mal etwas umgebaut für meine OpenHAB 2.5 Instanz. Den Code könnt ihr hier finden: https://gist.github.com/KorbinianP/7436d3e0fc4c7ef257bf1924dc6af42f

    Änderungen:
    – Im PHP wird ein OH Item per REST API mit dem JSON gefüttert. So muss OH nicht mehr das PHP pollen, es entstehen keine Verzögerungen oder doppeltes auslesen
    – In OpenHAB wird in einer Rule bei Aktualisierung des JSON Items eine Rule getriggert, die alle Werte auf die Items verteilt

  15. Hi, super Anleitung! Hat alles auf anhieb bei mir funktioniert.

    Eine Frage:
    In der JSON-Datei mit den Werten wir bei mir immer ein falsches Datum / ein falscher Timestamp angezeigt. In der Empfangsstation/dem Display habe ich die richtige Uhrzeit eingestellt. Wie bekomme ich auch die andere Uhrzeit richtig eingestellt? Habe die Wetterstation nicht mit einem Onlinedienst verbunden.

    Danke!

    1. Hallo,

      kann das evtl. an einem Sommer-Winterzeit-Versatz liegen?
      Habe das bei mir geprüft, die Uhrzeit wird hier korrekt übergeben…
      Workaround: Wenn die Uhrzeit irgendwo verwendet wird per Rule in ein anderes item übernehmen und manipulieren 😉

      Viele Grüße
      Florian

  16. Hallo Florian,

    ich habe das „Fine Offset Weather Station“ Binding für OpenHAB geschrieben, mit dem man direkt das Gateway abfragen kann. Hier gibt es auch die Diskussion dazu: https://community.openhab.org/t/fine-offset-weather-station-binding-beta-and-discussion/134167

    Ab OpenHAB Version 3.2 kann man das Binding bereits über den Marketplace installieren: https://community.openhab.org/t/fine-offset-weather-station-binding/134164

    Vielleicht hilft es dir!

    Viele Grüße,

    Andreas

    1. Das klingt ja prima! Ich bin leider aus Zeitgründen immer noch bei OH2 und noch nicht OH3 – aber das werde ich dann gern einmal testen, wenn’s bei mir so weit ist!

  17. Hi Florian,

    erstmal herzlichen Dank für dieses 1a-Projekt, selbstverständlich auch an all die, die weitere Vorschläge und Ideen dazu beigetragen haben.
    Bin vor wenigen Wochen auf die Suche gegangen, um meine dnt WiFi-Wetterstation WeatherScreen PRO in Openhab 3.3 zu integrieren, und dann (wie selbstverständlich) auf dieser Seite gelandet:).
    Habe einen Apache-Server erfolgreich auf meinem Windows-NAS aufgesetzt und die Daten von der Wetterstation ausgelesen.
    Mit dem Vorschlag von Kay Pawlak vom 20.2.21 habe ich dann die Verbindung zu Openhab 3.3 erfolgreich umsetzen können. Seit ca. 3 Wochen kann ich nun alle Daten in meiner Wetter-Sitemap ablesen!

    Daher habe ich mich entschlossen, hier mal Danke zu sagen und von meinem Erfolg zu berichten.

    Einen kleinen Beitrag kann ich vielleicht auch liefern hinsichtlich Umrechnung von UTC zu lokaler Zeit:
    Eigentlich soll es eine Reihe von Umrechnungsmethoden innerhalb von Javascript geben. Ich habe etliche ausprobiert und im JavaScript Tester (https://www.webtoolkitonline.com/javascript-tester.html), der in der Openhab Dokumentation im Kapitel „JavaScript Transformation Service“ vorgeschlagen wird, erfolgreich ausprobiert. Im Umrechnungs-Skript dagegen wurden Fehler generiert. Daher habe ich mich entschlossen, das Ganze in einer kleinen JS-Transformation umzusetzen:

    function utc2local(sutc) {

    // String zerlegen in einzelne Parameter
    var sye = sutc.substr(0, 4)
    var smo = sutc.substr(5, 2)
    var sda = sutc.substr(8, 2)
    var sho = sutc.substr(11, 2)
    var smi = sutc.substr(14, 2)

    // Zuordnung zu Intgerwerten
    var ye = parseInt(sye)
    var mo = parseInt(smo)
    var da = parseInt(sda)
    var ho = parseInt(sho)
    var mi = parseInt(smi)

    // Zeitzonenunterschied bestimmen in min und hinzufügen
    var jetzt = new Date()
    var unterschied = -jetzt.getTimezoneOffset()

    var local = new Date(ye, mo, da, ho, mi)
    local.setMinutes(local.getMinutes() + unterschied)

    if (mo < 10) { mo = '0' + mo; }
    if (da < 10) { da = '0' + da; }
    if (ho < 10) { ho = '0' + ho; }
    if (mi < 10) { mi = '0' + mi; }

    // Einzelne Werte aus Datum auslesen
    ye = local.getFullYear()
    mo = local.getMonth()
    da = local.getDate()
    ho = local.getHours()
    mi = local.getMinutes()

    // Führende Nullen ergänzen
    if (mo < 10) { mo = '0' + mo; }
    if (da < 10) { da = '0' + da; }
    if (ho < 10) { ho = '0' + ho; }
    if (mi < 10) { mi = '0' + mi; }

    var zeit = ho + ":" + mi
    var datum = da + "." + mo + "." + ye
    var slocal = datum + " – " + zeit

    return slocal
    }

    utc2local(input)

    Anmerkung: Komme aus der Hochsprachenentwicklergilde, wo man manches etwas leserlich hinschreibt. Man könnte obiges Skript auch kürzer schreiben;).

    Damit ergibt sich z.B. aus dem UTC-String
    "2022-10-03 18:11:27"
    der vom Apache-Server zurückgegeben wird, folgende lokale Zeit
    03.10.2022 – 20:11

    In meiner Sitemap wird das dann so angewandt:
    Text item= label=“Lokale Zeit [JS(utc2local.js):%s]“

    Ich hätte auch einen Screenshot, weiß aber nicht, wie ich den zeigen kann, bzw. ob das gestattet ist.

    Dann noch eine Frage an Andreas und sein „Fine Offset Weather Station“ Binding:

    Ich habe das für meine Station ausprobiert.
    Es scheint eine Verbindung stattzufinden, aber das Thing wechselt alle paar Sekunden zwischen Online und Offline. Daten habe ich auch nicht gesehen.
    Kann es sein, dass meine Station das Protokoll nicht kann?

    Vielen Dank nochmals an alle!

  18. Korrektur meines UTC2Local Skriptes:

    function utc2local(sutc) {

    // String zerlegen in einzelne Parameter
    var sye = sutc.substr(0, 4)
    var smo = sutc.substr(5, 2)
    var sda = sutc.substr(8, 2)
    var sho = sutc.substr(11, 2)
    var smi = sutc.substr(14, 2)

    // Zuordnung zu Intgerwerten
    var ye = parseInt(sye)
    var mo = parseInt(smo)
    var da = parseInt(sda)
    var ho = parseInt(sho)
    var mi = parseInt(smi)

    // Zeitzonenunterschied bestimmen in min und hinzufügen
    var jetzt = new Date()
    var unterschied = -jetzt.getTimezoneOffset()

    var local = new Date(ye, mo-1, da, ho, mi)
    local.setMinutes(local.getMinutes() + unterschied)

    if (mo < 10) { mo = '0' + mo; }
    if (da < 10) { da = '0' + da; }
    if (ho < 10) { ho = '0' + ho; }
    if (mi < 10) { mi = '0' + mi; }

    // Einzelne Werte aus Datum auslesen
    ye = local.getFullYear()
    mo = local.getMonth() + 1
    da = local.getDate()
    ho = local.getHours()
    mi = local.getMinutes()

    // Führende Nullen ergänzen
    if (mo < 10) { mo = '0' + mo; }
    if (da < 10) { da = '0' + da; }
    if (ho < 10) { ho = '0' + ho; }
    if (mi < 10) { mi = '0' + mi; }

    var zeit = ho + ":" + mi
    var datum = da + "." + mo + "." + ye
    var slocal = datum + " – " + zeit

    return slocal
    }

    Der erste Block mit 4 if-Statements war überflüssig.
    JavaScript-"Eigenheit" bei der Berechnung des Monats korrigiert, da die Monatszählung bei 0 beginnt und nicht bei 1. Der Fehler hat sich hier erst im Dezember bemerkbar gemacht. 😉

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.

Durch die weitere Nutzung der Seite wird der Verwendung von Cookies und den Inhalten der Datenschutzerklärung zugestimmt. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen