Hallo allerseits!
Bald ist Weihnachtszeit und somit Zeit für die Weihnachtsbeleuchtung. Bisher hatten wir das immer mit einer fixen Zeit-Schaltuhr gelöst, weil wir nicht die Beleuchtung die ganze Nacht eingeschaltet haben wollen. Dumm nur: die Zeiten haben nie so richtig gepasst, manchmal war es noch hell, dann wieder schon längst dunkel. Das manuelle Nach-Justieren der Uhr ging mir immer auf den Sack.
Lösung: eine Uhr, welche die Dämmerungs-Zeiten berücksichtigt und anhand dieser Zeiten ein- bzw. ausschaltet. Das eigentliche Schalten erledigt ein MyStrom Wifi Switch, welcher keine Cloud Anbindung etc benötigt. Könnte man also auch gut in so Heim-Automatisierungs-Zeugs integrieren. Die eigentliche Anforderung war: Lampe soll täglich um 5.00h morgens ein- und bei der Morgendämmerung wieder ausgeschaltet werden. Ebenfalls soll die Lampe bei der Abenddämmerung ein- und um 21.00h wieder ausgeschaltet werden.
Ich tat mich anfangs schwer mit den Zeiten, da ich zuerst die fehlerhafte Sun-Bibliothek verwendete und ewig herum probiert habe mit den Zeiten-Berechnungen zwischen UTC und lokaler Zeit. Doch dann fand ich zufällig die Astral-Bibliothek, welche die Sache enorm vereinfacht. Das ganze macht natürlich Sinn wenn es automatisch gestartet und verwaltet wird z.B. mit pm2 / systemd oder sowas in der Art. Vielleicht hilft das Prinzip und der Code jemand anders auch, um solche zeitgesteuerten Sachen zu realisieren ohne Internet, also alles nur im lokalen WLAN.
Viel Spass damit ![]()
René
Hier der Code:
#------------------------------------------------------------------------------------------------------------------
# Zweck:
# Zeitschaltuhr mit täglich berechneten Zeiten ahnhand der Dämmerung. Eine an einem MyStrom Switch angeschlossene
# Lampe soll täglich um 5.00h morgens ein- und bei der Morgendämmerung wieder ausgeschaltet werden. Ebenfalls soll
# die Lampe bei der Abenddämmerung ein- und um 21.00h wieder ausgeschaltet werden. Dies dient als Steuerung der
# Weihnachtsbeleuchtung
#
# Hardware: MyStrom WiFi Switch https://mystrom.ch/de/products/
#
# Author: DirtyOldFart aka. René
# Datum: # 29.10.2025
# Version: 1.0
#------------------------------------------------------------------------------------------------------------------
from astral import LocationInfo
from astral.sun import sun
import datetime
import pytz
import requests
import schedule
import time
# Standort: zB Zürich Hauptbahnhof
city = LocationInfo("Zürich", "Switzerland", "Europe/Zurich", 47.3783, 8.5402)
#Zeit-Zone
tz = pytz.timezone(city.timezone)
# URL des MyStrom-Switches
SWITCH_URL = "http://IP-des-Switches/relay?state={}"
# Lampen-Schalter
def switch_lamp(on: bool):
state = 1 if on else 0
try:
requests.get(SWITCH_URL.format(state), timeout=5)
print(f"Lampe {'ein' if on else 'aus'}geschaltet um {datetime.datetime.now(tz).strftime('%H:%M:%S')}")
except Exception as e:
print(f"Fehler beim Schalten: {e}")
# Zeitplan mit Steuerung
def schedule_lamp():
# Alte Aufgaben entfernen
schedule.clear()
# Aktueller Tag festhalten mit den Dämmerungszeiten
today = datetime.datetime.now(tz).date()
s = sun(city.observer, date=today, tzinfo=tz)
dawn = s['dawn']
dusk = s['dusk']
# Morgens: Einschalten um 5:00, Ausschalten zur Dämmerung
schedule.every().day.at("05:00").do(switch_lamp, True)
schedule.every().day.at(dawn.strftime("%H:%M")).do(switch_lamp, False)
# Abends: Einschalten zur Dämmerung, Ausschalten um 21:00
schedule.every().day.at(dusk.strftime("%H:%M")).do(switch_lamp, True)
schedule.every().day.at("21:00").do(switch_lamp, False)
print(f"Zeitplan erstellt für {today}:")
print(f" Morgendämmerung: {dawn.strftime('%H:%M')}")
print(f" Abenddämmerung: {dusk.strftime('%H:%M')}")
# Initiale Planung
schedule_lamp()
# Tägliche Aktualisierung um 00:01 Uhr
schedule.every().day.at("00:01").do(schedule_lamp)
# Endlosschleife
while True:
schedule.run_pending()
time.sleep(30)
Display More