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.