Kurzfassung: Direkter TRIAC-Phasenanschnitt über Raspberry-Pi- GPIO ist nicht machbar — Linux-OS-Jitter beträgt 1–10 ms, während TRIAC-Timing < 100 µs erfordert. Verwenden Sie DimmerLink als Hardware-Controller: RPi schreibt einen Helligkeitswert (0–100) an I2C-Adresse 0x50, Register 0x10. Eine Zeile in Python:
bus.write_byte_data(0x50, 0x10, level).
Warum Raspberry Pi keinen TRIAC direkt ansteuern kann
Phasenanschnitt-Dimmung feuert das TRIAC-Gate mit einer präzisen Verzögerung nach jedem AC-Nulldurchgang (alle 10 ms bei 50 Hz). Der zulässige Timing-Fehler liegt unter 100 µs, um sichtbares Flimmern zu vermeiden.
Raspberry Pi läuft unter Linux — einem Allzweck-Betriebssystem mit preemptivem Scheduler, Swap, Netzwerktreibern und GPU-Aktivität, die alle um CPU-Zeit konkurrieren. Die GPIO-Interrupt-Latenz unter diesem OS:
| Bedingung | GPIO-Interrupt-Latenz |
|---|---|
| System im Leerlauf | 0,5–2 ms |
| Aktives Netzwerk / USB | 2–10 ms |
| Festplatten-I/O | bis zu 50 ms |
Ein Jitter von 2 ms bei 10 % Helligkeit (9 ms Feuerfenster) entspricht
22 % Helligkeitsvariation — deutlich sichtbares Flimmern. Selbst mit dem
pigpio-Daemon (DMA-basiertes GPIO, beste verfügbare Option) beträgt der
Jitter typischerweise 200–500 µs — immer noch über dem erforderlichen
Schwellenwert unter realer Last.
Dies ist keine Einschränkung speziell für Raspberry Pi. Jeder Linux- SBC (Orange Pi, Rock Pi, Jetson Nano, Banana Pi) hat dieselbe Beschränkung. Echtzeit-TRIAC-Steuerung unter Linux erfordert entweder einen RT-Kernel-Patch (unpraktisch für Hobby-Einsatz) oder die Auslagerung des Timings an einen dedizierten Mikrocontroller.
DimmerLink ist dieser dedizierte Controller. Er übernimmt Nulldurchgangserkennung und TRIAC-Zündung auf einem Cortex-M0+ (STM32-Familie) und erreicht < 50 µs Jitter unabhängig von der CPU-Last des Hosts. Raspberry Pi teilt nur die gewünschte Helligkeit mit — keinerlei Timing-Anforderungen.
Benötigte Hardware
- Raspberry Pi 3, 4, 5 oder Zero 2W (jedes Modell mit I2C)
- DimmerLink-Modul
- rbdimmer AC-Dimmer-Modul (beliebiger Nennstrom)
- 2 × 4,7-kΩ-Widerstände (I2C-Pull-ups — oft nicht nötig auf RPi 3/4)
Schritt 1 — DimmerLink in den I2C-Modus umschalten
DimmerLink wird standardmäßig im UART-Modus ausgeliefert. Schalten Sie ihn vor dem Anschluss an Raspberry Pi in den I2C-Modus um.
Verbinden Sie DimmerLink mit einem USB-UART-Adapter (TX → RX, RX → TX, GND, VCC 3.3V). Öffnen Sie auf einem beliebigen Computer den Port mit 115200 Baud, 8N1, und senden Sie:
Raw bytes: 02 5BErwartete Antwort: 00 (OK). Das Gerät startet nun nach jedem
Einschalten im I2C-Modus. (Modus wird in EEPROM gespeichert.)
Schritt 2 — Verdrahtung
Raspberry Pi → DimmerLink (I2C)
| Raspberry Pi GPIO-Header | Jeder ESP32 | Funktion |
|---|---|---|
| Pin 1 (3.3V) | VCC | Stromversorgung |
| Pin 6 (GND) | GND | Masse |
| Pin 3 (GPIO2 / SDA) | SDA | I2C-Daten |
| Pin 5 (GPIO3 / SCL) | SCL | I2C-Takt |
Pull-up-Widerstände: Raspberry Pi 3/4/5 hat integrierte 1,8-kΩ-Pull-ups an GPIO2 und GPIO3. Diese sind normalerweise ausreichend bei Kabellängen unter 30 cm. Für längere Kabel oder unzuverlässige Kommunikation fügen Sie externe 4,7-kΩ-Widerstände von SDA und SCL nach 3.3V hinzu.
DimmerLink → AC-Dimmer-Modul
| Jeder ESP32 | Dimmer-Modul |
|---|---|
| VCC | VCC |
| GND | GND |
| Z-C | Z-C |
| Dim | DIM |
Connect the dimmer module to mains AC and the load per the Hardware Connection Guide.
Schritt 3 — I2C auf Raspberry Pi aktivieren
sudo raspi-config
# Interface Options → I2C → Enable → OK → Finish
sudo rebootNach dem Neustart installieren Sie i2c-tools und prüfen die Verbindung:
sudo apt install i2c-tools
i2cdetect -y 1Erwartete Ausgabe — Adresse 50 in der Tabelle sichtbar:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
...
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --If the device does not appear, see DimmerLink Not Detected.
Schritt 4 — Python-Steuerung (smbus2)
Installieren Sie die Bibliothek:
pip install smbus2Minimales Beispiel
from smbus2 import SMBus
DIMMER_ADDR = 0x50
REG_LEVEL = 0x10 # DIM0_LEVEL — Helligkeit 0–100%
bus = SMBus(1) # Raspberry Pi I2C-Bus 1
bus.write_byte_data(DIMMER_ADDR, REG_LEVEL, 50) # auf 50% setzen
bus.close()Vollständige Klasse mit Fehlerbehandlung
from smbus2 import SMBus
import time
class DimmerLink:
ADDR = 0x50
REG_STATUS = 0x00
REG_LEVEL = 0x10 # Helligkeit 0-100%
REG_CURVE = 0x11 # 0=LINEAR, 1=RMS, 2=LOG
REG_FREQ = 0x20 # Netzfrequenz (50 oder 60 Hz)
def __init__(self, bus_number=1):
self.bus = SMBus(bus_number)
def is_ready(self):
status = self.bus.read_byte_data(self.ADDR, self.REG_STATUS)
return bool(status & 0x01)
def set_level(self, level: int):
"""Helligkeit 0–100% setzen."""
level = max(0, min(100, level))
self.bus.write_byte_data(self.ADDR, self.REG_LEVEL, level)
def get_level(self) -> int:
"""Aktuelle Helligkeit lesen."""
return self.bus.read_byte_data(self.ADDR, self.REG_LEVEL)
def set_curve(self, curve: int):
"""Dimmkurve setzen: 0=LINEAR, 1=RMS, 2=LOG."""
if curve not in (0, 1, 2):
raise ValueError("curve must be 0, 1, or 2")
self.bus.write_byte_data(self.ADDR, self.REG_CURVE, curve)
def get_frequency(self) -> int:
"""Netzfrequenz lesen (50 oder 60 Hz)."""
return self.bus.read_byte_data(self.ADDR, self.REG_FREQ)
def close(self):
self.bus.close()
if __name__ == "__main__":
dimmer = DimmerLink()
if dimmer.is_ready():
print(f"Netzfrequenz: {dimmer.get_frequency()} Hz")
# Sanftes Hochdimmen
for level in range(0, 101, 5):
dimmer.set_level(level)
print(f"Helligkeit: {level}%")
time.sleep(0.1)
# RMS-Kurve für Glühlampen setzen
dimmer.set_curve(1) # 1 = RMS
print("Kurve: RMS (Glühlampen)")
else:
print("DimmerLink nicht bereit — Verdrahtung und I2C-Modus prüfen")
dimmer.close()Schnelle CLI-Steuerung (kein Python nötig)
# Helligkeit auf 50% setzen (0x32 hex = 50 dezimal)
i2cset -y 1 0x50 0x10 50
# Aktuelle Helligkeit lesen
i2cget -y 1 0x50 0x10
# Netzfrequenz lesen
i2cget -y 1 0x50 0x20Schritt 5 — Node-RED-Integration
Über den exec-Knoten mit i2cset-Befehl
In einem einfachen Flow verwenden Sie exec zum Ausführen von i2cset:
[inject: level=50] → [function: Befehl erstellen] → [exec] → [debug]Function-Knoten:
var level = msg.payload; // 0-100
msg.payload = "i2cset -y 1 0x50 0x10 " + level;
return msg;Über node-red-contrib-i2c
Installieren Sie den Knoten:
cd ~/.node-red
npm install node-red-contrib-i2cKonfigurieren Sie einen i2c out-Knoten:
- Address:
0x50 - Command:
0x10(Register) - Payload: der Helligkeitswert (0–100) aus
msg.payload
Ein Slider-UI-Knoten mit Bereich 0–100 steuert dann direkt den Dimmer.
Schritt 6 — Home Assistant OS auf Raspberry Pi
Wenn Raspberry Pi Home Assistant OS ausführt (nicht Home Assistant auf Raspberry Pi OS), ist der I2C-Hardwarezugriff aus Add-ons durch das HA-OS-Containermodell eingeschränkt.
Empfohlener Weg:
- Behalten Sie den Raspberry Pi als HA-Server.
- Fügen Sie einen separaten ESP32 mit DimmerLink als Hardware- Controller hinzu.
- Verwenden Sie das ESPHome-Add-on in Home Assistant zum Flashen und Verwalten des ESP32.
- HA steuert die Helligkeit über die ESPHome-Integration — kein direktes I2C vom RPi-Host.
See: AC Dimmer with Home Assistant and ESPHome
Wenn Sie Home Assistant supervised auf Raspberry Pi OS (nicht
HA OS) ausführen, ist der I2C-Zugriff aus Python-Skripten
uneingeschränkt und der smbus2-Ansatz funktioniert direkt.
Schritt 7 — Als systemd-Dienst ausführen
Zum automatischen Start des Dimmer-Steuerungsskripts:
Erstellen Sie /etc/systemd/system/dimmer.service:
[Unit]
Description=DimmerLink Controller
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/dimmer_control.py
Restart=on-failure
User=pi
[Install]
WantedBy=multi-user.targetAktivieren und starten:
sudo systemctl daemon-reload
sudo systemctl enable dimmer.service
sudo systemctl start dimmer.serviceAndere Linux-Einplatinencomputer
Der gleiche Ansatz funktioniert auf jedem Linux-SBC mit I2C:
| Platine | I2C-Bus | Erkennungsbefehl | Hinweise |
|---|---|---|---|
| Raspberry Pi 3/4/5 | /dev/i2c-1 | i2cdetect -y 1 |
Standard |
| Raspberry Pi Zero 2W | /dev/i2c-1 | i2cdetect -y 1 |
Standard |
| Orange Pi Zero 2 | /dev/i2c-3 | i2cdetect -y 3 |
Modellabhängig |
| Rock Pi 4 | /dev/i2c-7 | i2cdetect -y 7 |
Modellabhängig |
| Banana Pi M2 | /dev/i2c-1 | i2cdetect -y 1 |
Standard |
| Jetson Nano | /dev/i2c-1 | i2cdetect -y 1 |
— |
| HA OS auf RPi | Nicht zugänglich | — | ESP32 + DimmerLink verwenden |
Verfügbare I2C-Busse auf jeder Linux-Platine finden:
ls /dev/i2c-*Für Orange Pi und Banana Pi aktivieren Sie I2C über armbian-config:
sudo armbian-config
# System → Hardware → enable i2cIn Python übergeben Sie die korrekte Busnummer an SMBus():
bus = SMBus(3) # für /dev/i2c-3 auf Orange Pi Zero 2Häufige Fehler
| Problem | Ursache | Lösung |
|---|---|---|
i2cdetect zeigt nichts bei 0x50 |
DimmerLink noch im UART-Modus | Mit 02 5B über UART umschalten |
OSError: [Errno 121] |
Kein Pull-up / falsche Verdrahtung | SDA/SCL-Verbindungen prüfen |
PermissionError: /dev/i2c-1 |
Benutzer nicht in i2c-Gruppe | sudo usermod -aG i2c $USER |
i2cdetect hängt (keine Ausgabe) |
UART-Modus zieht SDA auf Low | DimmerLink zuerst in I2C-Modus schalten |
| Flimmern durch RPi-OS-Jitter | Direkter TRIAC-Versuch | DimmerLink erforderlich — RPi-GPIO kann keinen Phasenanschnitt |
| RPi Zero 2W langsames I2C | Low-Speed-Modus | smbus2.SMBus(1, force_open=True) setzen oder Kabellänge reduzieren |
Schnell-Checkliste
Verwandte Artikel
- DimmerLink I2C not detected → DimmerLink Not Detected: I2C vs UART Mode
- Tasmota integration → Tasmota AC Dimmer via DimmerLink
- Home Assistant guide → AC Dimmer with Home Assistant and ESPHome
- ESPHome YAML → ESPHome YAML for AC Dimmer and DimmerLink
- Safety and wiring → AC Dimmer Safety: Mains Voltage, Isolation, and Wiring
Noch Fragen?
Ask on forum.rbdimmer.com or open a GitHub Issue.