Astral – Relais zum Sonnenaufgang / Sonnenuntergang schalten
Nachdem ich mich nun etwas genauer mit Astral beschäftigt habe, gefällt mir das richtig gut, muss ich sagen. Bisher habe ich mir die Daten für Sonnenaufgang und Sonnenuntergang online geholt. Da sich die Berechnungen mit Astral aber kaum zu den Online-Ergebnissen unterscheiden, ist mir eine Offline-Lösung lieber.
Ich möchte nochmals betonen, dass der Raspberry Pi keine RTC (Real Time Clock) besitzt. Damit sich die Uhrzeit beim Raspberry Pi richtig beim Hochfahren stellt, muss er online sein. Natürlich kannst Du die Uhr manuell stellen oder Du lötest eine RTC an. Der Unterschied ist, dass der Pi nur kurz online sein muss. Ein weiterer Vorteil ist, dass das Python Script viel kürzer und damit übersichtlicher wird.
Da Astral mit Python 3 funktioniert, bist Du natürlich nicht auf einen Raspberry Pi beschränkt. Der Winzling eignet sich aber gut für Smarthome-Projekte oder um einfach damit zu experimentieren.
Astral installieren
Auf dem Raspberry Pi ist Astral schnell via pip installiert, vorausgesetzt, das ist vorhanden.
sudo apt install python3-pip pip3 install astral
Das war es auch schon. Bei Raspbian Lite ist gpiozero im Gegensatz zur Desktop-Variante nicht installiert. Da ich am Schluss die GPIO-Schnittstelle mit Astral schalte, erledige ich diesen Schritt auch gleich:
sudo apt install python3-gpiozero
Nun bin ich vorbereitet. Auf meinem Raspberry Pi läuft übrigens Raspbian Buster.
Mein neues Script
Ich möchte gleich mit dem Script ins Haus fallen, zumindest mit dem Konzept davon. Mein neues Gerüst sieht wie folgt aus:
from astral import LocationInfo from astral.sun import sun from datetime import datetime from time import sleep import pytz utc=pytz.UTC city = LocationInfo(name="Regensburg", region="Germany", timezone="Europe/Berlin", latitude=49.03451, longitude=12.11923) # Durch Deinen Standort ersetzen while True: s = sun(city.observer) time_now = utc.localize(datetime.now()) sunrise = s["sunrise"] dusk = s["dusk"] if time_now > sunrise and time_now < dusk: # bin ich zwischen Sonnenaufgang und Abenddämmerung? print("Es ist hell") else: print("Schalte das Nachtlicht ein") sleep(60)
Das Script ist sehr logisch. Es holt sich in meinem Fall die Daten für den Sonnenaufgang und der Abenddämmerung. Danach sieht das Programm nach, ob sich die aktuelle Zeit zwischen Sonnenaufgang und Abenddämmerung befindet. Ist das der Fall, gibt es aus, dass es hell ist – wenn nicht, dann wird es oder ist es dunkel.
Das ist eine Endlosschleife, die am Ende eines Durchlaufs 60 Sekunden Pause macht.
Bei meiner Online-Lösung habe ich noch das Datum überprüft und eine Abfrage an das API nur bei einem Wechsel des Datums gemacht. Das könnte ich hier auch, aber die Berechnung ist so schnell, dass es mir als nicht notwendig erscheint.
Mein Nachtlicht mit pfFace Digital und Astral
Warum ich einen piFace Digital nehmen? Weil ich den schon habe und es ein Geburtstagsgeschenk war – und das Ding funktioniert. Heute würde ich eher zu einem Automation HAT greifen, glaube ich – oder gleich ein echtes Relais nehmen und es via GPIO schalten.
Mein Raspberry Pi B mit dem piFace Digital schaltet mein Nachtlicht nun wie folgt.
from astral import LocationInfo from astral.sun import sun from datetime import datetime from time import sleep import pifacedigitalio as p import pytz utc=pytz.UTC pifacedigital = p.PiFaceDigital() pifacedigital.output_pins[3].turn_on() # Schaltet bei einem Pi-Neustart an, ist nur ein Check sleep(10) city = LocationInfo(name="Regensburg", region="Germany", timezone="Europe/Berlin", latitude=49.03451, longitude=12.11923) # Durch Deinen Standort ersetzen while True: s = sun(city.observer) time_now = utc.localize(datetime.now()) sunrise = s["sunrise"] dusk = s["dusk"] if time_now > sunrise and time_now < dusk: # bin ich zwischen Sonnenaufgang und Abenddämmerung? if pifacedigital.output_pins[3].value == 1: # ist das Relais nicht aus pifacedigital.output_pins[3].turn_off() # schalte es aus else: if pifacedigital.output_pins[3].value != 1: #ist das Relais nicht an pifacedigital.output_pins[3].turn_on() # schalte es an sleep(60)
In der if-else-Abfrage wird noch überprüft, ob das Licht bereits geschaltet ist oder nicht. Damit verhindere ich ein kurzes Flackern, da der piFace Digital sonst eine Schaltung vornimmt.
time_now wandle ich auch in UTC um, da ich sonst nicht vergleichen kann. Das Datum inklusive Zeit aus Astral kommt mit einer Zeitzonenangabe und wandle ich time_now nicht um, sagt mir das Programm: TypeError: can’t compare offset-naive and offset-aware datetimes
Das ist im Prinzip: Du kannst Äpfel nicht mit Birnen vergleichen.
Bei mir läuft der Pi als UTC, einfach um die Sache unkomplizierter zu machen. Willst Du mit einer Zeitzone hantieren, könntest Du zum Beispiel mit timedelta Deine aktuelle Zeit um x Stunden anpassen, damit es zu Deiner Zeitzone passt. Da gibt es mehrere Möglichkeiten an dieser Stelle. Hier ein Beispiel mit plus und minus 2 Stunden.
import datetime tdplus = datetime.datetime.now() + datetime.timedelta(hours=2) tdminus = datetime.datetime.now() - datetime.timedelta(hours=2) print(tdplus) print(tdminus)
GPIO Pins mit Astral schalten
Das Script lässt sich natürlich auch sehr einfach anpassen, um GPIO Pins damit zu schalten. Wie gesagt kannst Du damit ein geeignetes Relais schalten oder Du experimentierst einfach mit einer LED.
from astral import LocationInfo from astral.sun import sun from datetime import datetime from time import sleep from gpiozero import LED import pytz utc=pytz.UTC led = LED(17) city = LocationInfo(name="Regensburg", region="Germany", timezone="Europe/Berlin", latitude=49.03451, longitude=12.11923) # Durch Deinen Standort ersetzen while True: s = sun(city.observer) time_now = utc.localize(datetime.now()) sunrise = s["sunrise"] dusk = s["dusk"] if time_now > sunrise and time_now < dusk: # bin ich zwischen Sonnenaufgang und Abenddämmerung? led.off() else: led.on() sleep(60)
In meinem Fall schalte ich GPIO17 (Pin 11).
Vielleicht ändere ich das Verhalten noch auf das Ende der Morgendämmerung. Der Vorteil dieser Lösung gegenüber einer herkömmlichen Zeitschaltuhr ist, dass ich damit das Nachtlicht wirklich nur während der dunklen Stunden schalten kann. Ein weiterer Vorteil ist, dass es einfach Spaß macht, damit zu tüfteln. 🙂
Astral dürfte auch für Fotografen sehr interessant sein, weil sich damit unter anderem goldene stunde, blaue Stunde und Mondphasen berechnen lassen.
Für meinen Bitcoin-Tracker und den Coronavirus-Ticker gibt es natürlich keine Offline-Lösungen. Hier muss ich Daten aus dem Internet abfragen.
Nette Pi-Konstellation
Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.