openHAB und das Astro Binding

openHAB und das Astro Binding

Diesen Beitrag schrieb ich 9 Jahre und 8 Monate zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 2 Minuten

Die ersten Versuche mit meiner Funksteckdose machte ich davon abhängig, ob jemand von uns zu Hause war; es war Weihnachtszeit, und waren wir zu Hause, so durfte die Lichterkette an sein.

Saisonal bedingt hängt an der Funksteckdose inzwischen ein LED-Band, und es ist nicht nötig, dieses ständig leuchten zu lassen. Ich könnte mir Regeln definieren, die das Band zu bestimmten Uhrzeiten an- und ausschalten; ich könnte es aber auch vom Stand der Sonne abhängig machen. Das klingt nun irgendwie ein Stück weit irre, ist in der Praxis aber ziemlich einfach umzusetzen: openHAB bietet hierfür das Astro binding. Das müssen wir in die addons/ schieben (cp org.openhab.binding.astro-$VERSION.jar /opt/openhab/addons/), konfigurieren – und schon können wir eine Fülle an Parametern nutzen, um unser Regelwerk zu verfeinern.

## configurations/openhab.cfg
############################# Astro Binding ###################################
## Für diese Demo setze ich die Koordinaten auf den Eiffelturm in Paris
astro:latitude=48.858370
astro:longitude=2.294481
# astro:interval=

Die Lat/Long-Angaben habe ich analog zu meiner mqtt-Konfiguration gemacht. Ist das JAR an Ort und Stelle und die Konfiguration syntaktisch korrekt, werden beim start_debug.sh Meldungen wie diese hier auftauchen:

09:04:19.438 [DEBUG] [.a.internal.bus.AstroActivator:32   ] - Astro binding has been started.
09:04:20.954 [INFO ] [.b.a.internal.bus.AstroBinding:70   ] - AstroConfig[latitude=48.858370,longitude=2.294481,interval=disabled,systemTimezone=Europe/Berlin (CET +0100),daylightSavings=false]

Großartig! Darauf lässt sich nun ein Regelwerk aufsetzen, wir können Items definieren, Switches, Events – wie gehabt. Zu beachten ist hierbei natürlich, dass wir Map-Files benötigen, um die Rückgabewerte „einzudeutschen“; aufgrund gestiegener Nachfrage verwalte ich die Konfigurationen nun per GitHub, und ihr dürft sie gerne aus Ausgangspunkt für eigene Spielereien verwenden. Sie gehören nach /opt/openhab/configurations/transform.

  1. Ich nutze eines, das mir die Mondphasen übersetzt: Mond.map
  2. eines für die Jahreszeiten Jahreszeit.map und
  3. eines für die Tierkreiszeichen Tierkreiszeichen.map

Als erstes wollen wir uns in unserer Sitemap eine kleine Übersicht anzeigen lassen. Der Übersichtlichkeit halber erstellen wir uns dazu eine neue Item-Konfiguration: astro.items

## /opt/openhab/configurations/items/astro.items
Group		Astro		<sun>		(All)
 
DateTime	Sonnenaufgang_Time	"Sonnenaufgang [%1$tH:%1$tM]"			<sun>		(Astro)		{ astro="planet=sun, type=rise, property=start" }
DateTime	Sonnenuntergang_Time	"Sonnenuntergang [%1$tH:%1$tM]"			<sun>		(Astro)		{ astro="planet=sun, type=set, property=end" }
String		Mondphase		"Mondphase [MAP(Mond.map):%s]"			<moon>		(Astro)		{ astro="planet=moon, type=phase, property=name" }
String		Sternzeichen		"Sternzeichen [MAP(Tierkreiszeichen.map):%s]"	<colorwheel>	(Astro)		{ astro="planet=sun, type=zodiac, property=sign" }
String		Jahreszeit		"Jahreszeit [MAP(Jahreszeit.map):%s]"		<sun_clouds>	(Astro)		{ astro="planet=sun, type=season, property=name" }
 
// Setzt den Switch zur Zeit auf ON, gefolgt von OFF
// Event genau zum Sonnenaufgang
Switch		Sonnenaufgang_Event										{ astro="planet=sun, type=rise, property=start" }
// Event genau zum Sonnenuntergang
Switch		Sonnenuntergang_Event										{ astro="planet=sun, type=set, property=end" }
// Event 20min *nach* Sonnenaufgang
Switch		Sonnenaufgang_20A_Event										{ astro="planet=sun, type=rise, property=start, offset=20" }
// Event 10min *vor* Sonnenaufgang
Switch		Sonnenaufgang_10B_Event										{ astro="planet=sun, type=rise, property=start, offset=-10" }
// Event 20min *nach* Sonnenuntergang
Switch		Sonnenuntergang_20A_Event									{ astro="planet=sun, type=set, property=end, offset=20" }
// Event wenn Vollmond ist
Switch		Vollmond_Event

In der Sitemap kann es nun einfach eingebunden werden; für diese Demo erstelle ich eine neue sitemap und nenne sie astro.sitemap.

sitemap default label="Mein Haus" {
  Frame {
    Group item=Astro
  }
}

Bringt man nun alles zusammen und startet den Dienst im Debug-Mode, so erhält man unter anderem Output wie diesen:

12:42:22.411 [INFO ] [c.internal.ModelRepositoryImpl:80   ] - Loading model 'astro.sitemap'
12:42:22.528 [INFO ] [c.internal.ModelRepositoryImpl:80   ] - Loading model 'astro.items'
12:42:22.574 [DEBUG] [i.internal.GenericItemProvider:154  ] - Processing binding configs for items from model 'astro.items'
12:42:22.578 [DEBUG] [i.internal.GenericItemProvider:133  ] - Read items from model 'astro.items'
12:42:23.575 [INFO ] [.o.u.w.i.servlet.WebAppServlet:79   ] - Started Classic UI at /openhab.app
12:42:26.495 [DEBUG] [.a.internal.bus.AstroActivator:32   ] - Astro binding has been started.
12:42:26.801 [INFO ] [.b.a.internal.bus.AstroBinding:70   ] - AstroConfig[latitude=48.85837,longitude=2.294481,interval=disabled,systemTimezone=Europe/Berlin (CET +0100),daylightSavings=false]
12:42:29.820 [DEBUG] [a.internal.job.AbstractBaseJob:40   ] - Starting Astro DailyJob
12:42:29.841 [DEBUG] [.b.a.internal.job.JobScheduler:207  ] - Scheduled job with name Season at 2015-03-20 23:46:00
12:42:29.846 [DEBUG] [.b.a.internal.job.JobScheduler:212  ] - Skipping job with name Sonnenaufgang_Event for today, starttime is in the past
12:42:29.848 [DEBUG] [.b.a.internal.job.JobScheduler:212  ] - Skipping job with name Sonnenaufgang_10B_Event for today, starttime is in the past
12:42:29.848 [DEBUG] [.b.a.internal.job.JobScheduler:207  ] - Scheduled job with name Sonnenuntergang_Event at 2015-02-24 18:26:00
12:42:29.849 [DEBUG] [.b.a.internal.job.JobScheduler:207  ] - Scheduled job with name Sonnenuntergang_20A_Event at 2015-02-24 18:46:00
12:42:29.849 [DEBUG] [.b.a.internal.job.JobScheduler:212  ] - Skipping job with name Sonnenaufgang_20A_Event for today, starttime is in the past
12:42:29.851 [INFO ] [runtime.busevents             :26   ] - Sonnenaufgang_Time state updated to 2015-02-24T07:45:00
12:42:29.852 [INFO ] [runtime.busevents             :26   ] - Jahreszeit state updated to Winter
12:42:29.853 [INFO ] [runtime.busevents             :26   ] - Sonnenuntergang_Time state updated to 2015-02-24T18:26:00
12:42:29.853 [INFO ] [runtime.busevents             :26   ] - Sternzeichen state updated to Pisces
12:42:29.854 [INFO ] [runtime.busevents             :26   ] - Mondphase state updated to Waxing Crescent
12:42:29.854 [DEBUG] [.b.a.internal.job.JobScheduler:207  ] - Scheduled job with name Vollmond_Event at 2015-03-05 19:07:00

Abrufbar ist die Seite per http://$SERVERNAME:8080/openhab.app?sitemap=astro; ich nutze greent, da ist die Adresse einfach http://localhost:8080/greent/, die astro.sitemap habe ich dann ausgewählt. Basierend auf den Items & Co. können nun natürlich wiederum Regeln definiert werden: schalte das LED-Band 20min vor Sonnenaufgang an. Schalte es zu Sonnenuntergang ab, aber nur, wenn draußen weniger als 5°C herrschen. Schalte es zu Vollmond an, aber nur im Winter und… okay, ihr versteht. Meine astro.rules ist noch in Arbeit; das Partnerdings sabotiert sie, indem es ständig auf dem Knopf der Funksteckdose herumdrückt. Sobald ich eine einigermaßen getestete Version habe, stelle ich sie als Idee hier (bzw. auch auf GitHub) zur Diskussion.

Alle Bilder dieser Seite: © Marianne Spiller – Alle Rechte vorbehalten
Hintergrundbild: Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten

Eure Gedanken zu „openHAB und das Astro Binding“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.