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.