Tutorial: Automatisierung von Shelly-Geräten mit Python und Systemd

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 😉 )

RSS
LinkedIn
Share
Instagram
Telegram
Reddit
Mastodon
URL has been copied successfully!