Hallo zusammen! Heute zeige ich dir, wie du deine Shelly-Geräte mit einem Python-Skript und Systemd automatisieren kannst. Dabei werde ich dir auch von meinen eigenen Fehlern erzählen, damit du sie hoffentlich vermeiden kannst. Viel Spaß!
1. Einleitung
Ich wollte zwei Shelly Plus Plug S Geräte steuern, um zwei Lampen (IR und UV) zu bestimmten Zeiten ein- und auszuschalten. Die IR-Lampe sollte sich täglich zu festen Zeiten ein- und ausschalten, und die UV-Lampe sollte stündlich für 10 Minuten leuchten. Außerdem wollte ich den Status der Lampen an einen MQTT-Broker senden.
2. Python-Skript erstellen
Zuerst erstellen wir das Python-Skript, das die Shelly-Geräte über die Shelly API steuert und den Status an einen MQTT-Broker sendet.
2.1 Installation der benötigten Pakete
Da ich auf einem Raspberry Pi arbeite, musste ich zuerst die benötigten Pakete installieren. Hier sind die Schritte:
sudo apt update
sudo apt install python3-full python3-venv
2.2 Virtuelle Umgebung erstellen
Um Konflikte mit systemweiten Paketen zu vermeiden, erstellen wir eine virtuelle Umgebung:
python3 -m venv lamp_control_env
source lamp_control_env/bin/activate
2.3 Installation der Python-Pakete
Nun installieren wir die benötigten Python-Pakete requests und paho-mqtt:
pip install requests paho-mqtt
2.4 Das Python-Skript
Hier ist das vollständige Python-Skript:
import requests
import paho.mqtt.client as mqtt
import time
from datetime import datetime
# IP-Adressen der Shelly-Geräte
IR_LAMP_IP = "192.168.178.123"
UV_LAMP_IP = "192.168.178.124"
# MQTT-Broker-Informationen
MQTT_BROKER = "IHR_MQTT_BROKER"
MQTT_PORT = 1883
MQTT_USER = "IHR_BENUTZERNAME"
MQTT_PASSWORD = "IHR_PASSWORT"
# MQTT-Topics für den Status der Lampen
IR_LAMP_STATUS_TOPIC = "home/ir_lamp/status"
UV_LAMP_STATUS_TOPIC = "home/uv_lamp/status"
# Funktion zum Senden von MQTT-Nachrichten
def send_mqtt_message(topic, message):
client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.publish(topic, message)
client.disconnect()
# Funktion zum Schalten der IR-Lampe
def toggle_ir_lamp(status):
url = f"http://{IR_LAMP_IP}/relay/0"
params = {"turn": "on" if status else "off"}
requests.get(url, params=params)
send_mqtt_message(IR_LAMP_STATUS_TOPIC, "on" if status else "off")
# Funktion zum Schalten der UV-Lampe
def toggle_uv_lamp(status):
url = f"http://{UV_LAMP_IP}/relay/0"
params = {"turn": "on" if status else "off"}
requests.get(url, params=params)
send_mqtt_message(UV_LAMP_STATUS_TOPIC, "on" if status else "off")
# Hauptfunktion zur Steuerung der Lampen
def main():
while True:
now = datetime.now()
current_time = now.strftime("%H:%M")
# IR-Lampe schalten
if current_time == "09:45" or current_time == "22:00":
toggle_ir_lamp(True)
elif current_time == "10:00" or current_time == "22:15":
toggle_ir_lamp(False)
# UV-Lampe schalten
if current_time.endswith(":30"):
hour = int(current_time.split(":")[0])
if 10 <= hour <= 21:
toggle_uv_lamp(True)
elif current_time.endswith(":40"):
toggle_uv_lamp(False)
# Wartezeit bis zur nächsten Minute
time.sleep(60)
if __name__ == "__main__":
main()
3. Systemd-Dienst erstellen
Um sicherzustellen, dass das Skript automatisch startet und im Falle eines Fehlers neu gestartet wird, erstellen wir einen Systemd-Dienst.
3.1 Systemd-Dienstdatei erstellen
Erstellen Sie eine neue Dienstdatei:
sudo nano /etc/systemd/system/lamp_control.service
Fügen Sie den folgenden Inhalt ein:
[Unit]
Description=Lamp Control Service
After=network.target multi-user.target
[Service]
ExecStart=/path/to/lamp_control_env/bin/python /path/to/your/script.py
WorkingDirectory=/path/to/your
StandardOutput=inherit
StandardError=inherit
Restart=always
User=DEIN USER (Meisten Pi)
[Install]
WantedBy=multi-user.target
Achtung: Ersetze /path/to/lamp_control_env durch den tatsächlichen Pfad zu deiner virtuellen Umgebung und /path/to/your/script.py durch den tatsächlichen Pfad zu deinem Skript. Stelle sicher, dass du den richtigen Benutzernamen (in meinem Fall userx) verwendest, um Fehler wie status=217/USER zu vermeiden.
3.2 Systemd-Konfiguration neu laden und Dienst starten
Lade die Systemd-Konfiguration neu und starte den Dienst:
sudo systemctl daemon-reload
sudo systemctl start lamp_control.service
sudo systemctl enable lamp_control.service
3.3 Status des Dienstes überprüfen
Überprüfe den Status des Dienstes, um sicherzustellen, dass alles korrekt läuft:
sudo systemctl status lamp_control.service
4. Fehler und Lösungen
4.1 Falscher Benutzername
Einer meiner Fehler war, dass ich den falschen Benutzernamen in der Systemd-Dienstdatei angegeben hatte. Stelle sicher, dass du den richtigen Benutzernamen verwendest!
4.2 Systemd-Fehler status=217/USER
Wenn du den Fehler status=217/USER erhältst, bedeutet dies, dass der Benutzer nicht gefunden werden konnte. Überprüfe den Benutzernamen und stelle sicher, dass der Benutzer auf dem System existiert.
Fazit
Mit diesem Tutorial solltest du in der Lage sein, deine Shelly-Geräte mit einem Python-Skript und Systemd zu automatisieren. Denke daran, aus meinen Fehlern zu lernen und stelle sicher, dass du die richtigen Benutzernamen verwendest!
Viel Spaß beim Automatisieren! (Und Growen 😉 )