Smart Home Installation Teil 5 – Wetter / Astronomie

In Beitrag Nummer 5 meiner Reihe Smart Home 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$/maps/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=[Home_MoonPhase == WAXING_CRESCENT, Home_MoonPhase == FIRST_QUARTER, Home_MoonPhase == WAXING_GIBBOUS, 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=[Home_MoonPhase == WANING_GIBBOUS, Home_MoonPhase == THIRD_QUARTER, Home_MoonPhase == WANING_CRESCENT, Home_MoonPhase == NEW]
   }
}

Quellen:
https://www.openhab.org/

7 Antworten

  1. Volker sagt:

    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:

      // IMPORT MODULE FOR DYNAMIC ICON DOWNLOAD
      import java.io.FileOutputStream
      // CREATE/DOWNLOAD DYNAMIC SITEMAP ICON FOR CURRENT WEATHER CONDITION
      rule "Weather Current Conditon: Dynamic Icon"
      when Item Owm_Home_Current_ConditionIcon changed
      then
        val raw = Owm_Home_Current_ConditionIcon.state as RawType
        val file = new FileOutputStream("/etc/openhab2/icons/classic/weather_condition_current.png")
        file.write(raw.getBytes)
        file.close
      end
      // CREATE/DOWNLOAD DYNAMIC SITEMAP ICON FOR 24 HOUR WEATHER CONDITION
      rule "Weather 24 Hour Conditon: Dynamic Icon"
      when Item Owm_Home_Forecast24h_ConditionIcon changed
      then
        val raw = Owm_Home_Forecast24h_ConditionIcon.state as RawType
        val file = new FileOutputStream("/etc/openhab2/icons/classic/weather_condition_forecast24h.png")
        file.write(raw.getBytes)
        file.close
      end

      Der Eintrag in meiner .sitemap-Datei sieht so aus:

      Text item=Owm_Home_Current_Condition label="Wetterlage [%s]" icon="weather_condition_current"
      Text item=Owm_Home_Forecast24h_Condition label="Wetterlage [%s]" icon="weather_condition_forecast24h"

      Gruß
      Andreas

  2. Volker sagt:

    Ich meine die Mondphasen Bildchen. 🌗→🌑

  3. Volker sagt:

    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

  4. Volker sagt:

    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

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.