Astral – Relais zum Sonnenaufgang / Sonnenuntergang schalten

Kein Kommentar Autor: Jürgen (jdo)

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.

Nach Sonnenuntergang wird geschaltet

Nach Sonnenuntergang wird geschaltet

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.

Ich schalte ein Nachtlicht mit einem PiFace Digital und einem Raspberry Pi B via Astral

Ich schalte ein Nachtlicht mit einem PiFace Digital und einem Raspberry Pi B via Astral

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.

Tipp

Investiere in Deine Zukunft und lerne Python günstig mit diesem Kurs* (Abschlusszertifikat möglich) – lebenslanger Zugriff auf das Material!

Nette Pi-Konstellation

Dich interessieren Kryptowährungen? Ich handle via Binance*.

Am schnellsten kaufst Du Kryptowährungen / Bitcoin über Coinbase*.

Du kannst gerne Deinen Senf zu diesem Beitrag geben: Hier geht es zu den Kommentaren




NordVPN - günstig und ideal für Anfänger
 Alle Kommentare als Feed abonnieren

Antworten

Air VPN - The air to breathe the real Internet