Zum Inhalt springen

Raspberry Pi AC-Dimmer-Steuerung über DimmerLink

Linux bietet keine Echtzeit-GPIO-Steuerung — direkter TRIAC-Phasenanschnitt ist ohne dedizierten Controller unmöglich. DimmerLink löst das: Raspberry Pi sendet nur einen Helligkeitswert, DimmerLink übernimmt die präzise Steuerung.

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:

text
Raw bytes: 02 5B

Erwartete 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

bash
sudo raspi-config
# Interface Options → I2C → Enable → OK → Finish
sudo reboot

Nach dem Neustart installieren Sie i2c-tools und prüfen die Verbindung:

bash
sudo apt install i2c-tools
i2cdetect -y 1

Erwartete Ausgabe — Adresse 50 in der Tabelle sichtbar:

text
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:

bash
pip install smbus2


Minimales Beispiel

python
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

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

bash
# 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 0x20



Schritt 5 — Node-RED-Integration


Über den exec-Knoten mit i2cset-Befehl

In einem einfachen Flow verwenden Sie exec zum Ausführen von i2cset:

text
[inject: level=50] → [function: Befehl erstellen] → [exec] → [debug]

Function-Knoten:

javascript
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:

bash
cd ~/.node-red
npm install node-red-contrib-i2c

Konfigurieren 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:

  1. Behalten Sie den Raspberry Pi als HA-Server.
  2. Fügen Sie einen separaten ESP32 mit DimmerLink als Hardware- Controller hinzu.
  3. Verwenden Sie das ESPHome-Add-on in Home Assistant zum Flashen und Verwalten des ESP32.
  4. 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:

ini
[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.target

Aktivieren und starten:

bash
sudo systemctl daemon-reload
sudo systemctl enable dimmer.service
sudo systemctl start dimmer.service



Andere 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:

bash
ls /dev/i2c-*

Für Orange Pi und Banana Pi aktivieren Sie I2C über armbian-config:

bash
sudo armbian-config
# System → Hardware → enable i2c

In Python übergeben Sie die korrekte Busnummer an SMBus():

python
bus = SMBus(3)  # für /dev/i2c-3 auf Orange Pi Zero 2



Hä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

  • ☐ DimmerLink in I2C-Modus umgeschaltet (`02 5B` über UART)
  • ☐ I2C in `raspi-config` (oder `armbian-config`) aktiviert
  • ☐ `i2cdetect -y 1` zeigt Adresse `50`
  • ☐ Benutzer zur `i2c`-Gruppe hinzugefügt (`sudo usermod -aG i2c $USER`)
  • ☐ `pip install smbus2` abgeschlossen
  • ☐ `bus.write_byte_data(0x50, 0x10, 50)` ändert Lampenhelligkeit



  • Verwandte Artikel



    Noch Fragen?

    Ask on forum.rbdimmer.com or open a GitHub Issue.

    Diesen Beitrag teilen
    Anmelden , um einen Kommentar zu hinterlassen