openHAB und das Astro Binding
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
.
- Ich nutze eines, das mir die Mondphasen übersetzt: Mond.map
- eines für die Jahreszeiten Jahreszeit.map und
- 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.
Hintergrundbild: Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten