Dieser Artikel beschäftigt sich mit dem Thema Wind und was sich daraus alles über Plugins und Logiken am Ende in der smartVISU realisieren lässt.

Anmerkung: mittlerweile sind die API Keys für Wundergrund leider nicht mehr kostenlos! Die Anleitung muss also mit einem alternativen Plugin wie Darksky oder OpenWeatherMap durchgeführt werden!

Basis des Artikels sind Daten zu Windrichtung und Windgeschwindigkeit über das Wundergrund Plugin. Es lassen sich aber bspw. auch Daten der KNX Wetterstation verwenden, sofern vorhanden.

Das Wundergrund Plugin konfigurieren

Die automatisch generierte Doku zum Wundergrund Plugin findet sich unter https://www.smarthomeng.de/user/plugins_doc/config/wunderground.html.

Das Plugin liegt auf Github unter https://github.com/smarthomeNG/plugins/tree/master/wunderground.

Als Erstes muss das Plugin in der etc/plugin.yaml eingetragen werden. Der apikey kann kostenlos (Update: leider sind die API Keys inzwischen nicht mehr kostenlos!) über https://www.wunderground.com/weather/api/d/pricing.html beantragt werden. Es ist darauf zu achten, dass das Updateintervall eine bestimmte Zeitdauer nicht überschreitet, speziell, wenn man Wundergrund auch direkt in der smartVISU nutzt. Das Limit sind 500 Calls pro Tag bzw. 10 Calls pro Minute. Das Default-Updateintervall für das Plugin sind 600 Sekunden, also einmal in 10 Minuten. Per cycle Attribut ließe sich dieses in der plugin.yaml anpassen.

Als location setzt man bspw. seinen Ort, es sind hier neben dem Namen aber auch Geokoordinaten möglich.


wundergrund_wetter:
    class_name: Wunderground
    class_path: plugins.wunderground
    apikey: 'xxxxyyyyxxxxyyyy'
    language: 'de'
    location: 'Germany/Hamburg'
    item_subtree: weather.wundergrund
    # cycle: 600

item_subtree ist der Ast im Itemtree, unter dem die Wundergrund-relevanten Items liegen. Im Beispiel ist es weather.wundergrund.
Die notwendigen Items sehen wie folgt aus:


%YAML 1.1
---
# items/wetter.yaml
weather:

    wundergrund:

        windrichtung:
            type: str
            wug_matchstring: current_observation/wind_dir

        windrichtung_grad:
            type: num
            wug_matchstring: current_observation/wind_degrees

        windgeschwindigkeit:
            type: num
            value: -9999
            wug_matchstring: current_observation/wind_kph
            wug_datatype: positive

            ms:
                type: num
                eval: (sh.weather.wundergrund.windgeschwindigkeit()/3.6)
                eval_trigger: weather.wundergrund.windgeschwindigkeit

            beaufort:
                type: num

            string:
                type: str
               
        windboeen:
            type: num
            value: -9999
            wug_matchstring: current_observation/wind_gust_kph
            wug_datatype: positive

Tipp: Neben dem Wind gibt es über Wundergrund noch viele weitere Wetterdaten.

Anzeige der Windrichtung in der smartVISU

Die Windrichtung lässt sich nun in der smartVISU 2.9 sehr einfach ausgeben:


{{ icon.compass('weather.wundergrund.windrichtung_compass', '', 'weather.wundergrund.windrichtung_grad',  '0', '360', '') }}
{{ basic.print('weather.wundergrund.windrichtung', 'weather.wundergrund.windrichtung', 'text') }}

Das Ergebnis ist eine sehr schöne Darstellung der Windrichtung:

Windstärke auswerten und in der smartVISU anzeigen

Als nächstes soll die Windstärke ausgewertet werden. Dafür dient die nach Sir Francis Beaufort benannte Beaufortskala, die Windstärken in 13 Bereichte von 0 (Windstille) bis 12 (Orkan) klassifiziert.

Für diese Skala ist der Wert im Item weather.wundergrund.windgeschwindigkeit.ms notwendig, das via Eval-Ausdruck die Windgeschwindigkeit von Kilometer pro Stunde in Meter pro Sekunde umrechnet (sh.weather.wundergrund.windgeschwindigkeit()/3.6). Die Umrechnung triggert jedes Mal, wenn sich weather.wundergrund.windgeschwindigkeit verändert.

Für die Auswertung der Windstärke muss unter logics/wind.py eine neue Logik erstellt werden, die die Items weather.wundergrund.windgeschwindigkeit.string und weather.wundergrund.windgeschwindigkeit.beaufort befüllt:
Der Eintrag in der etc/logic.yaml sieht wie folgt aus:


WindLogic:
    crontab: init
    filename: wind.py
    watch_item: weather.wundergrund.windgeschwindigkeit.ms

Die Logik löst also jedes Mal aus, wenn sich weather.wundergrund.windgeschwindigkeit.ms ändert.

Der Code der Logik in der Datei logics/wind.py mappt nun die Windgeschwindigkeit in Meter pro Sekunde auf die Beaufortskala:


if sh.weather.wundergrund.windgeschwindigkeit.ms() < 0.3:
    sh.weather.wundergrund.windgeschwindigkeit.string("Windstille")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(0)
elif 0.3 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 1.6:
    sh.weather.wundergrund.windgeschwindigkeit.string("leiser Zug")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(1)
elif 1.6 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 3.4:
    sh.weather.wundergrund.windgeschwindigkeit.string("leichte Brise")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(2)
elif 3.4 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 5.5:
    sh.weather.wundergrund.windgeschwindigkeit.string("schwacher Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(3)
elif 5.5 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 8.0:
    sh.weather.wundergrund.windgeschwindigkeit.string("mäßiger Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(4)
elif 8.0 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 10.8:
    sh.weather.wundergrund.windgeschwindigkeit.string("frischer Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(5)
elif 10.8 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 13.9:
    sh.weather.wundergrund.windgeschwindigkeit.string("starker Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(6)
elif 13.9 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 17.2:
    sh.weather.wundergrund.windgeschwindigkeit.string("steifer Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(7)
elif 17.2 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 20.8:
    sh.weather.wundergrund.windgeschwindigkeit.string("stürmischer Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(8)
elif 20.8 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 24.5:
    sh.weather.wundergrund.windgeschwindigkeit.string("Sturm")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(9)
elif 24.5 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 28.5:
    sh.weather.wundergrund.windgeschwindigkeit.string("schwerer Sturm")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(10)
elif 28.5 <= sh.weather.wundergrund.windgeschwindigkeit.ms() < 32.7:
    sh.weather.wundergrund.windgeschwindigkeit.ms.string("orkanartiger Sturm")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(11)
else:
    sh.weather.wundergrund.windgeschwindigkeit.string("Orkan")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(12)

Damit die Logik effektiv wird, muss SmartHomeNG neu gestartet oder die Logik via Backend-Plugin aktiviert werden.

Sinnvollerweise kann diese Logik auch in einer Funktion gekapselt werden. Dies ist an einem Alternativansatz, der mit einer Lookup-Tabelle arbeitet, im Folgenden dargestellt:

#!/usr/bin/env python3
# beaufort3.py

def get_beaufort(speed):
    """
    :parameter speed: windspeed in meter per second
    :return: a tuple of a string with the (german) description and an integer with beaufort speed
    """
    table = [ 
        (  0.3, "Windstille",0),
        (  1.6, "leiser Zug",1),
        (  3.4, "leichte Brise",2),
        (  5.5, "schwacher Wind",3),
        (  8.0, "mäßiger Wind",4),
        ( 10.8, "frischer Wind ",5),
        ( 13.9, "starker Wind",6),
        ( 17.2, "steifer Wind",7),
        ( 20.8, "stürmischer Wind",8),
        ( 24.5, "Sturm",9),
        ( 28.5, "schwerer Sturm",10),
        ( 32.7, "orkanartiger Sturm",11),
        ( 999,  "Orkan",12) ]
    
    try:
        description = min(filter(lambda x: x[0] >= speed, table))[1]
        bft = min(filter(lambda x: x[0] >= speed, table))[2]
        return description,bft
    except ValueError:
        return None, None

decription, bft = get_beaufort(sh.weather.wundergrund.windgeschwindigkeit.ms())
sh.weather.wundergrund.windgeschwindigkeit.string(description)
sh.weather.wundergrund.windgeschwindigkeit.beaufort(bft)

 

In der smartVISU können diese Werte nun wie folgt angezeigt werden:


{{ basic.symbol('', '', '', 'weather_wind_speed_bft') }}                       
Bft: {{ basic.print('wind_weatherstation_bfvalue', 'knx.weather.wind.beaufort') }}, 
{{ basic.print('wind_weatherstation_string', 'knx.weather.wind.string', 'text') }}

Das Ergebnis:

(Die in diesem Artikel verwendeten Screenshots wurden selber erstellt. Das Titelbild ist unter der Creative Commons Zero (CC0) Lizenz veröffentlicht und wurde von www.pexels.com bezogen.)


2 Kommentare

Marc René Frieß · 2. November 2018 um 14:30

Das ist korrekt. Dafür gibt es jetzt ja auch das OpenWeatherMap (derzeit nur DEVELOP: https://github.com/smarthomeNG/plugins/tree/develop/openweathermap) oder das Darksky Plugin (https://github.com/smarthomeNG/plugins/tree/master/darksky).. Oder man nimmt gleich den Wert vom KNX Sensor..

Achja: für bestehende API Keys von Wundergrund geht es natürlich schon noch, die sind derzeit noch valide!

Alex · 2. November 2018 um 14:25

Hallo,

sehr nette Beschreibung.

Leider besagt dein Link https://www.wunderground.com/weather/api/d/pricing.html, dass es keine kostenlose Version mehr gibt.

Schreibe einen Kommentar

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