Smart Home openHAB Installation Teil 5 – Wetter / Astronomie
Update 12.11.2020
Ab Dezember 2020 habe ich das Glück, ein Eigenheim zu besitzen. Mit dem Umzug werde ich mein Smart Home zukünftig mit Home Assistant steuern, sodass die Serie Smart Home openHAB Installation nicht länger fortgeführt und gepflegt wird.
In Beitrag Nummer 5 meiner Reihe Smart Home openHAB Installation werden nun Wetter- und Astrodaten in openHAB eingebunden. Dabei möchte ich Daten nutzen um einerseits meine Sitemap ein bisschen aufzuhübschen und andererseits um sie z.B. in Regeln verwenden zu können. Da Wetter und Astronomie ähnliche Themenbereiche sind, packe ich die Werte, die ich von den Bindings bekomme, in einen Frame in der Sitemap.
Binding: OpenWeatherMap
Um Wetterdaten in die Sitemap einzubinden und um wetterabhängige Regeln einzurichten, nutze ich OpenWeatherMap (OWM). OWM bietet einen kostenlosen API-Key, der normalerweise für die einfache Nutzung von Wetterdaten ausreicht.
Für die Nutzung des OWM Bindings ist bei mir vorab folgende Firewall Regel erforderlich:
Source: openHAB-Server Destination: api.openweathermap.org Port: TCP/80
Danach geht’s an die Konfiguration des Bindings.
$OPENHAB_CONF$/things/openweathermap.things
Mit meinem API Key konfiguriere ich nun meine OWM Things. Einmal die „Bridge“, was im Prinzip nur die Angabe des API Keys, des Refresh Intervals und optional der Sprache ist. In der Bridge Konfiguration werden nun noch pro Standort 2 Things benötigt (wenn man Wetter und UV-Index verwenden möchte) unter Angabe der Koordinaten und der Forecast Werte.
Bridge openweathermap:weather-api:api "OpenWeatherMap Account: API-Key" [ apikey="<OpenWeatherMap-API-Key>", refreshInterval=30, language="de" ] { Thing weather-and-forecast home "OpenWeatherMap: Weather/Forecast" [ location="48.1502867,11.8526639", forecastHours=120, forecastDays=0 ] Thing uvindex home "OpenWeatherMap: UV Index" [ location="48.1502867,11.8526639", forecastDays=7 ] }
Erst im Binding der kommenden openHAB 2.5 Version wird auch der OWM UV Index unterstützt. Wer dieses Feature also nutzen will, muss das 2.4er Binding über die Paper UI deinstallieren, das 2.5er Binding hier herunterladen und in den Addons-Ordner legen.
Und noch eine Erklärung zu den forecastHours
und forecastDays
Parametern:
Wer einen kostenlosen API-Key von OWM verwendet hat laut Service Beschreibung „5 days/3 hour forecast API“ für die Wettervorhersage, also 3-stündlich bis maximal 5 Tage. Daher muss hier der Parameter forecastHours=120 (oder weniger) eingetragen werden, für 5 Tage à 24 Stunden. Eine Parametrisierung forecastDays=5 funktioniert nicht.
Wer einen kostenpflichtigen API-Key von OWM verwendet hat für z.B. das „Startup-Paket“ 16 days/daily forecast API“ für die Wettervorhersage. Das wiederum bedeutet, dass man den Parameter forecastDays=16 (oder weniger) konfigurieren muss, da der Forecast täglich ist für maximal 16 Tage.
$OPENHAB_CONF$/items/openweathermap.items
Sind die Things konfiguriert, geht’s an die Items, um die entsprechenden Channels anzusprechen. Im folgenden Beispiel konfiguriere ich für meinen Standort Details zur verwendeten Wetterstation, die aktuellen Wetterdaten, sowie die aktuellen UV-Index Daten.
// STATION ITEMS String Owm_Home_StationId "OpenWeatherMap Weather Station: ID [%s]" <weather_location> { channel="openweathermap:weather-and-forecast:api:home:station#id" } String Owm_Home_StationName "OpenWeatherMap Weather Station: Name [%s]" <weather_location> { channel="openweathermap:weather-and-forecast:api:home:station#name" } Location Owm_Home_StationLocation "OpenWeatherMap Weather Station: Location [%2$s°N %3$s°E]" <weather_map> { channel="openweathermap:weather-and-forecast:api:home:station#location" } // WEATHER CURRENT DateTime Owm_Home_LastMeasurement "OpenWeatherMap Weather Data (Current): Time of Last Measurement [%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS]" <time> { channel="openweathermap:weather-and-forecast:api:home:current#time-stamp" } String Owm_Home_Current_Condition "OpenWeatherMap Weather Data (Current): Condition [%s]" <sun_clouds> { channel="openweathermap:weather-and-forecast:api:home:current#condition" } Image Owm_Home_Current_ConditionIcon "OpenWeatherMap Weather Data (Current): Icon" { channel="openweathermap:weather-and-forecast:api:home:current#icon" } Number:Temperature Owm_Home_Current_Temperature "OpenWeatherMap Weather Data (Current): Temperature [%.1f %unit%]" <temperature> { channel="openweathermap:weather-and-forecast:api:home:current#temperature" } Number:Pressure Owm_Home_Current_Pressure "OpenWeatherMap Weather Data (Current): Barometric Pressure [%.1f %unit%]" <pressure> { channel="openweathermap:weather-and-forecast:api:home:current#pressure" } Number:Dimensionless Owm_Home_Current_Humidity "OpenWeatherMap Weather Data (Current): Atmospheric Humidity [%d %unit%]" <humidity> { channel="openweathermap:weather-and-forecast:api:home:current#humidity" } Number:Speed Owm_Home_Current_WindSpeed "OpenWeatherMap Weather Data (Current): Wind Speed [%.1f km/h]" <wind> { channel="openweathermap:weather-and-forecast:api:home:current#wind-speed" } Number:Angle Owm_Home_Current_WindDirection "OpenWeatherMap Weather Data (Current): Wind Direction [%d %unit%]" <wind> { channel="openweathermap:weather-and-forecast:api:home:current#wind-direction" } Number:Dimensionless Owm_Home_Current_Cloudiness "OpenWeatherMap Weather Data (Current): Cloudiness [%d %unit%]" <sun_clouds> { channel="openweathermap:weather-and-forecast:api:home:current#cloudiness" } Number:Length Owm_Home_Current_RainVolume "OpenWeatherMap Weather Data (Current): Rain Volume [%.1f %unit%]" <rain> { channel="openweathermap:weather-and-forecast:api:home:current#rain" } Number:Length Owm_Home_Current_SnowVolume "OpenWeatherMap Weather Data (Current): Snow Volume [%.1f %unit%]" <snow> { channel="openweathermap:weather-and-forecast:api:home:current#snow" } Number:Length Owm_Home_Current_Visibility "OpenWeatherMap Weather Data (Current): Visibility [%.1f km]" <visibility> { channel="openweathermap:weather-and-forecast:api:home:current#visibility" } // UV INDEX CURRENT DateTime Owm_Home_Current_UvIndexTimestamp "OpenWeatherMap Weather UV-Index (Current): Time of Last Measurement [%1$tY-%1$tm-%1$td]" <time> { channel="openweathermap:uvindex:api:home:current#time-stamp" } Number Owm_Home_Current_UvIndex "OpenWeatherMap Weather UV-Index (Current): UV Index [%d]" <weather_uvindex> { channel="openweathermap:uvindex:api:home:current#uvindex" }
$OPENHAB_CONF$/transform/openweathermap.scale
Da ich in der Sitemap die Zahlenwerte des UV-Index auch als Textbewertungswert anzeigen möchte, verwende ich die Scale Datei, um diese Zahlenwerte zu konvertieren.
[..3[=Niedrig [3..6[=Moderat [6..8[=Hoch [8..11[=Sehr Hoch [11..]=Extrem Hoch
$OPENHAB_CONF$/sitemaps/home.sitemap
Frame label="Wetter & Astronomie" { Text item=Owm_Home_Current_Temperature label="Aktuelle Temperatur [%.1f %unit%]" icon="temperature" { Mapview item=Owm_Home_StationLocation label="Standort Karte" icon="weather_map" height=5 Text item=Owm_Home_StationName label="Standort" icon="weather_location" Text item=Owm_Home_Current_Condition label="Wetterlage [%s]" icon="weather_condition_current" Text item=Owm_Home_Current_Temperature label="Temperatur [%.1f %unit%]" icon="temperature" Text item=Owm_Home_Current_Pressure label="Luftdruck [%.1f %unit%]" icon="pressure" Text item=Owm_Home_Current_Humidity label="Luftfeuchtigkeit [%d %unit%]" icon="humidity" Text item=Owm_Home_Current_Cloudiness label="Bewölkung [%d %unit%]" icon="sun_clouds" Text item=Owm_Home_Current_WindSpeed label="Windgeschwindigkeit [%.1f km/h]" icon="wind" Text item=Owm_Home_Current_WindDirection label="Windrichtung [%d %unit%]" icon="wind" Text item=Owm_Home_Current_RainVolume label="Regenmenge [%.1f %unit%]" icon="rain" visibility=[Home_Current_RainVolume > 0] Text item=Owm_Home_Current_SnowVolume label="Schneemenge [%.1f %unit%]" icon="snow" visibility=[Home_Current_SnowVolume > 0] Text item=Owm_Home_Current_UvIndex label="UV-Index [%d]" icon="weather_uvindex" Text item=Owm_Home_Current_UvIndex label="UV-Bewertung [SCALE(openweathermap.scale):%s]" icon="weather_uvindex" valuecolor=[<3="green", <6="yellow", <8="orange", <11="red", >=11="purple"] Text item=Owm_Home_Current_ObservationTime label="Zeitstempel [%1$td.%1$tm.%1$tY %1$tH:%1$tM]" icon="time" } }
Binding: Astro
Für die astronomischen Daten verwende ich das Astro Binding.
$OPENHAB_CONF$/things/astro.things
Für das Astro Binding sind (pro Standort) 2 Things zu konfigurieren, wenn man Sonnen- und Mond-Daten nutzen möchte:
astro:sun:home [ geolocation="48.1502867,11.8526639,510", interval=300 ] astro:moon:home [ geolocation="48.1502867,11.8526639", interval=300 ]
$OPENHAB_CONF$/items/astro.items
Analog zum Wetter binde ich in der Items Datei nun auch die Astro-Daten für meinen Standort ein.
Group Astro "Astro Group" <sun_clouds> DateTime Astro_Home_SunsetTime_Start "Astro: Sunset Start [%1$tH:%1$tM]" <sunrise> (Astro) { channel="astro:sun:home:set#start" } DateTime Astro_Home_SunsetTime_End "Astro: Sunset End [%1$tH:%1$tM]" <sunrise> (Astro) { channel="astro:sun:home:set#end" } DateTime Astro_Home_SunriseTime_Start "Astro: Sunrise Start [%1$tH:%1$tM]" <sunset> (Astro) { channel="astro:sun:home:rise#start" } DateTime Astro_Home_SunriseTime_End "Astro: Sunrise End [%1$tH:%1$tM]" <sunset> (Astro) { channel="astro:sun:home:rise#end" } DateTime Astro_Home_EveningTime "Astro: Evening [%1$tH:%1$tM]" (Astro) { channel="astro:sun:minus90:set#start" } String Astro_Home_DayPhase "Astro: Phase of Day [MAP(astro.map):%s]" <sun> (Astro) { channel="astro:sun:home:phase#name" } Switch Astro_Home_NightState "Astro: Night" <astro_moon> (Astro) String Astro_Home_SeasonName "Astro: Season [MAP(astro.map):%s]" (Astro) { channel="astro:sun:home:season#name" } String Astro_Home_ZodiacSign "Astro: Zodiac [MAP(astro.map):%s]" <astro_zodiac> (Astro) { channel="astro:sun:home:zodiac#sign" } Number:Angle Astro_Home_SunAzimuth "Astro: Sun Azimuth" <sun> (Astro) { channel="astro:sun:home:position#azimuth" } Number:Angle Astro_Home_SunElevation "Astro: Sun Elevation [%.1f °]" <sun> (Astro) { channel="astro:sun:home:position#elevation" } Number:Intensity Astro_Home_TotalRadiation "Astro: Radiation [%.2f %unit%]" <sun> (Astro) { channel="astro:sun:home:radiation#total" } Number:Intensity Astro_Home_DiffuseRadiation "Astro: Diffuse Radiation [%.2f %unit%]" <sun> (Astro) { channel="astro:sun:home:radiation#diffuse" } Number:Angle Astro_Home_MoonAzimuth "Astro: Moon Azimuth" <astro_moon> (Astro) { channel="astro:moon:home:position#azimuth" } Number:Angle Astro_Home_MoonElevation "Astro: Moon Elevation [%.1f °]" <astro_moon> (Astro) { channel="astro:moon:home:position#elevation" } String Astro_Home_MoonPhase "Astro: Moon Phase [MAP(astro.map):%s]" <astro_moonphase> (Astro) { channel="astro:moon:home:phase#name" } DateTime Astro_Home_MoonNextFull "Astro: Next Full Moon [%1$td.%1$tm.%1$tY, %1$tH:%1$tM]" <astro_moon_full> (Astro) { channel="astro:moon:home:phase#full" } DateTime Astro_Home_MoonNextNew "Astro: Next New Moon [%1$td.%1$tm.%1$tY, %1$tH:%1$tM]" <astro_moon_new> (Astro) { channel="astro:moon:home:phase#new" } Number:Length Astro_Home_MoonDistance "Astro: Moon Distance [%.1f %unit%]" <astro_moon> (Astro) { channel="astro:moon:home:distance#distance" }
Hinweis: Das Item Astro_Home_NightState
lege ich ohne Channel an, weil ich es unten in einer Rule definiere.
$OPENHAB_CONF$/transform/astro.map
Die Datei astro.map
wird benötigt, um die Englischen Werte in die Deutsche Sprache für die Sitemap zu übersetzen.
Wichtig! Möchte man die „Bildchen“ nutzen, muss die Datei im UTF-8 Format gespeichert werden. Zudem können die Bildchen so oder so in der Web-UIs nicht sauber dargestellt werden; statt dessen werden „?“ eingeblendet. Das ist natürlich nicht so schön, hier muss man sich überlegen, ob man die Web-UIs verwendet oder nur die mobilen Apps. Ich habe das bei mir umgangen, indem ich die UTF-8 Bildchen entfernt habe und statt dessen lieber dynamische Icons einblenden lasse. Daher sind die UTF-8 Bildchen in Klammern nur zur Veranschaulichung, was möglich wäre.
// ZODIACSIGNS / TIERKREISZEICHEN
ARIES=Widder (♈)
TAURUS=Stier (♉)
GEMINI=Zwilling (♊)
CANCER=Krebs (♋)
LEO=Löwe (♌)
VIRGO=Jungfrau (♍)
LIBRA=Waage (♎)
SCORPIO=Skorpion (♏)
SAGITTARIUS=Schütze (♐)
CAPRICORN=Steinbock (♑)
AQUARIUS=Wassermann (♒)
PISCES=Fische (♓)
// SEASONS / JAHRESZEITEN
SPRING=Frühling
SUMMER=Sommer
AUTUMN=Herbst
WINTER=Winter
// DAYPHASES / TAGESZEITEN
SUN_RISE=Sonnenaufgang
ASTRO_DAWN=astronomische Morgendämmerung
NAUTIC_DAWN=nautische Morgendämmerung
CIVIL_DAWN=zivile Morgendämmerung
CIVIL_DUSK=zivile Abenddämmerung
NAUTIC_DUSK=nautische Abenddämmerung
ASTRO_DUSK=astronomische Abenddämmerung
SUN_SET=Sonnenuntergang
DAYLIGHT=Tag
NOON=Abend
NIGHT=Nacht
// MOONPHASES / MONDPHASEN
NEW=Neumond (🌑)
WAXING_CRESCENT=zunehmender Halbmond (🌑→🌓)
FIRST_QUARTER=erstes Viertel (🌓)
WAXING_GIBBOUS=zunehmender Mond (🌓→🌕)
FULL=Vollmond (🌕)
WANING_GIBBOUS=abnehmender Mond (🌕→🌗)
THIRD_QUARTER=drittes Viertel (🌗)
WANING_CRESCENT=abnehmender Halbmond (🌗→🌑)
// MISC. / SONSTIGES
NULL=unbekannt ⁉
-=unbekannt ⁉
$OPENHAB_CONF$/rules/astro.rules
In der astro.rules
konfiguriere ich nun meine Regeln für das Astro Binding, z.B. den oben genannten Wert für das Item Home_NightState
. Den Wert des Items lege ich anhand der Events Sunset=END und Sunrise=START fest.
rule "Astro: Night State ON" when Channel 'astro:sun:home:set#event' triggered END then Astro_Home_NightState.postUpdate(ON) end rule "Astro: Night State OFF" when Channel 'astro:sun:home:rise#event' triggered START then Astro_Home_NightState.postUpdate(OFF) end
$OPENHAB_CONF$/sitemaps/home.sitemap
Von den Items platziere ich die, die ich in der Sitemap sehen möchte, im bereits für’s Wetter angelegten Frame „Wetter & Astronomie“. Sonnen- und Mondelevation blende ich dabei nur ein, wenn der Wert größer 0 ist – nur dann ist Sonne/Mond sichtbar – und nächster Vollmond/Neumond wird abwechselnd eingeblendet, je nachdem, was als Nächstes kommt.
Frame label="Wetter & Astronomie" { ... <Wetterdaten> ... Text item=Ntp_Date label="Astronomische Daten [ %1$td.%1$tm.%1$tY]" icon="sun" { Text item=Astro_Home_SeasonName label="Jahreszeit [MAP(astro.map):%s]" icon="astro_season" Text item=Astro_Home_ZodiacSign label="Tierkreiszeichen [MAP(astro.map):%s]" icon="astro_zodiac" Text item=Astro_Home_DayPhase label="Tageszeit [MAP(astro.map):%s]" icon="astro_dayphase" Text item=Astro_Home_SunriseTime label="Sonnenaufgang [%1$tH:%1$tM]" icon="sunrise" Text item=Astro_Home_SunsetTime label="Sonnenuntergang [%1$tH:%1$tM]" icon="sunset" Text item=Astro_Home_SunElevation label="Sonnenelevation [%.1f °]" icon="sun" visibility=[Home_SunElevation > 0] Text item=Astro_Home_MoonElevation label="Mondelevation [%.1f °]" icon="astro_moon" visibility=[Home_MoonElevation > 0] Text item=Astro_Home_MoonPhase label="Mondphase [MAP(astro.map):%s]" icon="astro_moonphase" Text item=Astro_Home_MoonNextFull label="Nächster Vollmond [%1$td.%1$tm.%1$tY %1$tH:%1$tM]" icon="astro_moon_full" visibility=[Astro_Home_MoonPhase == WAXING_CRESCENT, Astro_Home_MoonPhase == FIRST_QUARTER, Astro_Home_MoonPhase == WAXING_GIBBOUS, Astro_Home_MoonPhase == FULL] Text item=Astro_Home_MoonNextNew label="Nächster Neumond [%1$td.%1$tm.%1$tY %1$tH:%1$tM]" icon="astro_moon_new" visibility=[Astro_Home_MoonPhase == WANING_GIBBOUS, Astro_Home_MoonPhase == THIRD_QUARTER, Astro_Home_MoonPhase == WANING_CRESCENT, Astro_Home_MoonPhase == NEW] } }
Quellen:
https://www.openhab.org/
Hallo,
wie hast du das gemacht, dass dynamische Icons eingenblenden werden?
Ich habe nämlich Probleme die „Bildchen“ im UTF-8 Format angezeigt zu bekommen.
Gruß
Volker
Servus.
Ich bin mir nicht sicher, was du mit „Bildchen im UTF-8 Format“ genau meinst. Ich lade die Bilder im RAW Format runter. In der Sitemap konfiguriere ich als Icon für die Weather-Condition das heruntergeladene PNG.
Die .rules-Datei sieht bei mir wie folgt aus:
Der Eintrag in meiner .sitemap-Datei sieht so aus:
Gruß
Andreas
Ich meine die Mondphasen Bildchen. 🌗→🌑
Bei mir werden die Tierkreiszeichen angezeigt.
die Mondfasen leider nicht. ��→�� zunehmender Mond
Die astro.map ist in UTF-8 konvertiert.
Achso, das ist gemeint.
Also ich verwende die UTF-8 Bildchen leider nicht mehr, sondern habe inzwischen stattdessen dynamische Icons für die Mondphasen und die Tierkreiszeichen. Mir hat das optisch nicht mehr gefallen.
Hatte das aber in Verwendung und hat problemlos funktioniert. Ich hab allerdings die .maps-Datei erst als UTF-8 mit Notepad++ gespeichert und dann Inhalte eingefügt. Nicht umgekehrt.
Gruß
Andreas
Ich habe gerade bemerkt das die Mondphasen nur im Browser nicht richtig dargestellt werden.
In der openHAB App sieht alles super aus.
Alles klar, super. Im Browser hab ich’s tatsächlich nie ausprobiert, nur in der App. Mich hat allerdings irgendwann gestört, dass auf Handy’s eh das Ende der Zeile abgeschnitten und fast nicht zu sehen war. Daher bin ich auf die „Icon-Lösung“ umgestiegen und hab mir einfach einen Satz PNGs zusammengesucht und entsprechend nach den Mondphasen/Tierkreiszeichen benannt. Dadurch wechselt das auch schön durch und ist besser erkennbar.
Gruß
Andreas
Hallo,
erst mal vielen Dank für diese ausführliche Beschreibung.
Bei mir läuft ein OpenHAB 2.5 ich habe alles so eingerichtet wie du es hier Beschrieben hast. Die ‚things‘ laufen Daten bekomme ich soweit alles tuti.
Leider funktioniert bei mir die ‚visibility‘ (zB Regen/Schnee) nicht die Daten werden immer angezeigt. Auch das Mappen und Scalen über die Dateien astro.map und openweathermap.scale funktioniert bei mir nicht.
Kann es sein das dies an einer Grundeinstellung von openHAB liegt? Oder hast du einen anderen Tipp woran das liegen kann?
Gruß
David
Servus
Für Map/Scale müssen in openHAB die entsprechenden Transformations installiert werden (PaperUI->Addons->Transformations). Die Transformation-Dateien müssen dann nur im richtigen Ordner liegen (\\OH-Server\config\transform).
Für die Visibility braucht’s nichts extra. Ich hab aber gesehen, dass im Beitrag ein Copy/Paste Fehler drin war. Die Items waren falsch benannt. Falls du das 1:1 kopiert hast, dann überprüfe das nochmal, ist jetzt korrigiert.
Gruß
Andreas
Dank dir … jetzt geht es … und ja ich hatte es erst mal 1:1 kopiert. Mir ist der Fehler in der Benennung der Items erst aufgefallen nach dem ich deine Antwort gelesen habe.
Hi, vielen Dank erstmal für deine tollen Tutorials. Dies hat bei mir sehr gut geklappt.
Nur in der Sitemap für das Astro Binding hast du ein Item verwendet, was nicht definiert ist: Ntp_Date
Ich komme leider nicht drauf, was das sein könnte, es sieht aber sehr vielversprechend aus: „Astronomische Daten [ %1$td.%1$tm.%1$tY]“
Ist es eine Art Zusammenfassung per Rule?
Servus Ingo
Danke für deinen Kommentar. Das Item kommt aus dem NTP-Binding. Das findest du im dritten Beitrag der Reihe.
Gruß
Andreas