Home Automatisierung - LED Steuerung

Dieses Projekt startete vor um das Jahr 2015 - ich wollte eine LED Beleuchtung in der Küche. Da ich von Tinkerforge bereits passende Bausteine hatte, habe ich diese verwendet.

Die reine Steuerung anhand von Sonnenauf- und Untergang war die erste Funktion. Nach und nach habe ich dann noch den Belichtungssensor und den Luftqualitätssensor hinzugefügt, um die Steuerung zu verfeinern.

led.py ist ein Python3-Dienst, der für den Dauerbetrieb gedacht ist. Er sammelt Daten von Tinkerforge bricklets und berechnet die Helligkeit und Farbe für den LED Streifen.

Dieser Dienst liegt in meinem GitHub Konto und kann öffentlich heruntergeladen werden.

Es ist eine MQTT Integration enthalten, die Daten an mosquitto für die Visualisierung und Steuerung in Home Assistant gedacht ist.

graph TD
    HA[Home Assistant] <-->|MQTT| MQ[mosquitto MQTT Broker]

    PY[LED Daemon] <-->|MQTT Publish/Subscribe| MQ
    PY -->|Status / Zustandsinformationen| FIFO
    PY <-->|Tinkerforge API| TFD[Tinkerforge Daemon]
    TFD <--> HAT[Tinkerforge HAT]

    HS[Air Quality Bricklet] -->|Sensor Daten| HAT
    LS[Ambient Light Bricklet] -->|Sensor Daten| HAT

    HAT -->|LED Steuerung| LEDCTRL[LED Strip Bricklet]
    LEDCTRL -->|PWM / Digital| LED[LED Streifen]

Notwendige Komponenten

  • Tinkerforge
    • BrickD Daemon
    • HAT
    • Air Quality Bricklet
    • Ambient Light Bricklet
    • LED Strip Bricklet
  • Ein kompatibles LED strip (bitte überrpüfe die LED Strip Bricklet 2.0 Dokumentation für kompatible Geräte LED Strip Bricklet 2.0)

Optionale Komponenten

  • MQTT server
  • Home Assistant

Features

  • Tinkerforge Bricklet Datem sammeln
    • Air Quality Bricklet (Temperatur, Feuchtigkeit und Luftdruck Sensoren, IAQ Luftqualitätsindex)
    • Ambient Light Bricklet (Licht Sensor)
    • LED Strip Bricklet (LED Steuerung)
  • Berechnung von Sonnenauf- und untergang mit astral
  • Setzen der LED Farbe und Helligkeit basierend auf den gesammelten Daten
  • Senden der gemessenen Daten an einen MQTT Server (bspw. mosquitto auf einem Home Assistant)

Installieren und Ausführen auf einem Raspberry Pi

Das Skript kann mit dem Benutzer root und git installiert werden:

cd /opt
git clone https://github.com/sirrus/led.git

Bitte konfiguriere den LED Dienst, bevor du Ihn startest!

Du kannst auch einen systemd Dienst oder irgend einen anderes System Dienst Management verwenden, wenn du ein saubereres Setup haben möchtest.

Einfache Installation mit rc.local

Der einfachste Weg den LED Dienst zu starten, ist die folgenden Zeitel zu /etc/rc.local hinzuzufügen:

/usr/bin/python3 /opt/led/led.py

Systemd Integration

Die folgenden Definition kann zum aktivieren des LED Dienst als systemd Dienst verwendet werden (speichern als /etc/systemd/system/led-daemon.service):

[Unit]
Description=LED Daemon
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/led
ExecStart=/usr/bin/python3 /opt/led/led.py
Restart=always
RestartSec=5
EnvironmentFile=/opt/led/.env
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Aktivieren des Dienstes:

sudo systemctl daemon-reload
sudo systemctl enable led-daemon
sudo systemctl start led-daemon

Einsehen kann man die Dienst Protokolle mit:

journalctl -u led-daemon -f

Notwendige python3 Module

Die folgenden python3 Module sind notwendig:

  • python3-astral
  • python3-pydantic
  • python3-pydantic-settings
  • python3-tinkerforge

Konfigurations Datei .env

Das Konfigurationsdatei Template kann so kopiert werden:

cp .env-template .env

Du musst die Parameter entsprechend deiner Konfiguration anpassen.

Der Wert: SLEEP=0.3 setzt die Wartezeit am Ende jedes durchlaufenen Zyklus.

Die FIFO und LOG Werte sollten existierende Pfade verwenden. Der FIFO Wert definiert einen Pfaf zu einer Status FIFO, welche einfach während der Dienst läuft ausgelesen werden kann. Beide Werte sind für Debugging / Protokollierung gedacht.

Für den Wert FIFO=/tmp/led.py kann man den Status wie folgt auslesen:

tail -f /tmp/led.py

Die folgenden Werte sind für die Berechnung von Sonnenauf- und untergang:

  • LATITUDE (Breitengrad)
  • ALTITUDE (Höhengrad)
  • TIMEZONE (Zeitzone)
  • COUNTRY (Land)
  • CITY (Stadt)

Den ausführlichen/Debugging modus kan man entweder mit dem Wert DEBUG=True - oder durch den Kommandozeilen Parameter -d aktivieren.

Der LED Wert aktiviert oder deaktiviert den LED Streifen und ist nur für die Initialisierung gedacht. Dieser Wert kann durch den Home Assistant MQTT gesetzt werden. Der Wert LED=True sollte gesetzt werden, wenn du den LED Dienst ohne Home Assistant verwenden möchtest. Du kannst jeden initialien Wert (True/False) setzen, der deine Anforderung erfüllt (wenn du den Home Assistant verwendest).

Tinkerforge

Die folgenden Werte müssen für Tinkerforge konfiguriert werden:

  • TF_HOST = Tinkerforge Server name oder IP
  • TF_PORT = Tinkerforge Server port
  • TF_HATUID = Tinkerforge HAT ID
  • TF_LEDUID = Tinkerforge LED Strip Bricklet ID
  • TF_AIRUID = Tinkerforge Air Quality Bricklet ID
  • TF_LUXUID = Tinkerforge Ambient Light Bricklet ID

MQTT

MQTT kann mit dem Wert MQTT_ENABLED=True aktivert oder mit dem Wert MQTT_ENABLED=False deaktiviert werden.

Die folgenden Werte müssen konfiguriert werden:

  • MQTT_BROKER = MQTT Server Name oder IP
  • MQTT_PORT = MQTT Server Port
  • MQTT_USER und MQTT_PASS sind optional (basierend auf deinen Anforderungen)
  • MQTT_TOPIC = MQTT Topic für die gesammelten Daten (muss mit der Home Assistant Konfiguration übereinstimmen)
  • MQTT_SWTOPIC = optionales MQTT Topic für einen Schalter (muss mit der Home Assistant Konfiguration übereinstimmen)

Der LED Dienst wird die folgenden Daten in jedem Zyklus and den Home Assistant publizieren:

  • temperature (Temperatur)
  • humidity (Luftfeuchtigkeit)
  • iaq_index (IAQ Luftqualitätsindex)
  • air_pressure (Luftdruck)
  • illumination (Beleuchtung)

Wenn MQTT_SWTOPIC gesetzt ist wird eine Subscription auf das MQTT Topic (MQTT_SWTOPIC) aktiviert, um einen Schalter in Home Assistant zu aktivieren.

Sensor Daten (Publish)

Der LED Dienst sendet folgende Nutzlast (Beispieldaten) mit dem konfigurierten MQTT Topic (MQTT_TOPIC) an den konfigurierten MQTT server (MQTT_BROKER) :

{
  "temperature": 21.6,
  "humidity": 48.2,
  "air_pressure": 1013.4,
  "iaq_index": 42,
  "illumination": 135
}

LED-Status (Subscribe)

Der LED Dienst abonniert den konfigurierten MQTT topic (MQTT_SWTOPIC) am konfigurierten MQTT server (MQTT_BROKER). Die Nutzlast ist eine der foglenden:

  • ON
  • OFF

Home Assistant

Die Home Assistant Integration basiert auf MQTT. Du benötigst einen installierten MQTT Broker (bspw. mosquitto) und du musst einen normalen Benutzer anlegen, sowie die Konfigurations Werte setzen (MQTT_User, MQTT_PASS).

Danach musst du ein MQTT Gerät (mit einem Namen wie RaspberryPi) anlegen, welches die folgenden Entitäten beeinhaltet:

mqtt:
  sensor:
    - name: "temperature"
      state_topic: "raspi/sensors"
      unit_of_measurement: "°C"
      value_template: "{{ value_json.temperature }}"
      retain: true

    - name: "humidity"
      state_topic: "raspi/sensors"
      unit_of_measurement: "%"
      value_template: "{{ value_json.humidity }}"
      retain: true

    - name: "illumination"
      state_topic: "raspi/sensors"
      unit_of_measurement: "lx"
      value_template: "{{ value_json.illumination }}"
      retain: true

    - name: "air pressure"
      state_topic: "raspi/sensors"
      unit_of_measurement: "hPa"
      value_template: "{{ value_json.air_pressure }}"
      retain: true

Bitte nehme Notiz von retain: true. Das speichert die Sensor Daten bei einem Home Assistant oder MQTT Neustart.

Der Schalter für das Aktivieren oder Deaktivieren des LED Streifens kann so konfiguriert werden:

mqtt:
  switch:
    - name: "LED"
      command_topic: "home/led/set"
      state_topic: "home/led/state"
      payload_on: "ON"
      payload_off: "OFF"
      retain: true

Bitte nehme Notiz von retain: true. Das speichert die Schalter Daten bei einem Home Assistant oder MQTT Neustart.