Normalerweise wird die Light Bar von Xiaomi über den mitgelieferten Steuerknopf gesteuert. Durch Drücken auf den Knopf geht die Light Bar an oder aus. Drehen am Knopf steuert die Helligkeit und Drücken+Drehen steuert die Farbintensität von 2700 – 6500k. Die Steuerung ist nur über die Fernbedienung möglich, auch nicht über den USB-Anschluss. Wir werden die Lichtleiste per Raspberry Pi mit einem Funkmodul steuern, sodass man keine Fernbedienung mehr auf dem Schreibtisch rumfliegen hat. Wobei sie ja eigentlich vom Konzept her nicht schlecht ist. Nur ergeben sich mit der Steuerung über den Raspberry Pi ganz neue Möglichkeiten, wie z.B. auch eine Steuerung über Alexa oder Google Home. Darum geht es in diesem Tutorial aber (erstmal) nicht.

Die mitgelieferte Fernbedienung der Xiaomi Lightbar

Das Projekt basiert auf dem xiaomi-lightbar-nrf24 GitHub-Repository. Schau dir für weitere Infos über die Funktionsweise und einer Dokumentation das Repository an.

Hardware

Für das Tutorial brauchst du folgende Dinge:

Die externen Links führen zu Amazon. Unbezahlte Werbung.

Die Jumper-Kabel sind nicht unbedingt notwendig. Wenn man nicht extra welche bestellen möchte (so wie ich), kann man auch normale Verbindungskabel verwenden und diese direkt am Funkmodul fest löten. Das Modul kann aber u.U. dabei zerstört werden – man sollte also wissen, was man tut.

Die Modellbezeichnung findest du auf der Rückseite

Es gibt zwei verschiedene Varianten der Light Bar. Nur das Modell „MJGJD01YL“ kann für das Tutorial verwendet werden.

Setup

RC-Modul anschließen

Zunächst muss das Funkmodul mit den Jumper-Kabeln an den Raspberry Pi angeschlossen werden.

SPI aktivieren

Zunächst müssen wir SPI aktivieren. Das Serial Peripheral Interface ist ein Protokoll, welches verwendet wird um mit Mikrocontrollern zu kommunizieren, wie z.B. unserem Funkmodul. Zum aktivieren öffnen wir die Einstellungen:

sudo raspi-config

Verwende die Pfeiltasten, um zu „Interfacing Options“ zu navigieren und drücke Enter. Wähle die SPI-Option und drücke Enter. Wähle dann „Yes“ aus, um SPI zu aktivieren. Nachdem du SPI aktiviert hast, wirst du aufgefordert, den Raspberry Pi neu zu starten. Wähle „Yes“ aus, um den Neustart durchzuführen.

Installation

Zunächst müssen wir „RF24“ und „CRC“ installieren. Falls du während der Installation auf Fehler stößt, schau einfach weiter unten unter Mögliche Fehler nach, dort sind nochmal einige Spezialfälle aufgelistet.

Installation von RF24

Die RF24-Bibliothek ermöglicht die Kommunikation mit dem angeschlossenen Funkmodul.

Zunächst aktualisieren wir die Paketlisten und installieren die notwendigen Pakete.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git build-essential python-dev libboost-python-dev libboost-thread-dev python3-spidev -y

Dann können wir mit der Installation der RF24-Bibliothek beginnen. Dazu klonen wir erst das zugehörige Git-Repository.

git clone https://github.com/nRF24/RF24.git

Dann wechseln wir in das Verzeichnis der heruntergeladenen Bibliothek.

cd RF24

Im nächsten Schritt kompilieren wir die RF24-Bibliothek für den Raspberry Pi. Hier können unter Umständen Fehler auftreten. Die häufigsten Fehler habe ich unten aufgelistet.

./configure --driver=SPIDEV
make
sudo make install

Nach der Installation neuer Bibliotheken muss häufig der Linker-Cache aktualisiert werden, damit dein Raspberry Pi weiß, wo er die neuen Bibliotheken finden kann.

sudo ldconfig

RF24 Python Wrapper-Bibliothek installieren

Nach der Installation der RF24-Bibliothek können wir jetzt die RF24 Python Wrapper-Bibliothek installieren.

cd pyRF24/
sudo python setup.py install

CRC installieren

“CRC” installieren wir wie gewohnt über den Python Paketmanager.

pip install crc

Geräte-ID bestimmen

Um nun die passenden Signale über das Funkmodul zu senden müssen wir die Geräte-ID der Lightbar bestimmen. Führe dazu dieses Script mit Python auf deinem Raspberry Pi aus.

Bringe die Fernbedienung der Lichtleiste so nah wie möglich an das Funkmodul. Bewege dabei den Drehknopf an der Fernbedienung, sodass konstant Signale gesendet werden. Das Funkmodul erkennt manche der Signale und versucht sie auszulesen. So sieht ein korrekt ausgelesenes Signal aus:

Decoded packet, CRC ok
• id: 0xa9ea42
• separator: 0xff
• counter: 0x57
• command: 0x5ff
• crc: 0xd362

Bei mir hat es etwa 10 Minuten gedauert, bis dieses eine korrekte Paket ausgelesen wurde. Es ist also Geduld gefragt. Falls es nicht klappt, versuche mit den Parametern im Skript etwas rum zu probieren.

Zur Steuerung verwende ich das Repository xiaomi-lightbar-nrf24. Es kommuniziert über die RF24 Bibliothek mit dem Funkmodul. Lade das Repository dazu von Github herunter. Die ermittelte Geräte-ID kannst du dann im Python Script verwenden.

from xiaomi_lightbar import Lightbar

bar = Lightbar(22, 0, 0xa9ea42)
bar.brightness(16)
bar.color_temp(0)

✅ Fertig! Du kannst jetzt die Light Bar über Python steuern.

Mögliche Fehler

Achtung! In diesem Abschnitt geht es um mögliche Fehler. Sollte bei dir alles funktionieren, brauchst du dich hiermit nicht weiter beschäftigen.

Falsche Compiler Flags

finn@raspberrypi:~/RF24 $ make
g++ -fPIC -marm -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -Ofast -Wall -pthread  -DRF24_NO_INTERRUPT -c RF24.cpp
g++: error: unrecognized command-line option ‘-marm’
g++: error: unrecognized command-line option ‘-mfpu=vfp’
g++: error: unrecognized command-line option ‘-mfloat-abi=hard’
make: *** [Makefile:50: RF24.o] Error 1

Falls du die Fehlermeldung oben beim Kompilieren von RF24 siehst, dann liegt das unter Umständen dran, dass die Compiler-Flags nicht zu der Architektur deines Raspberrys passen. Überprüfe daher zunächst deine Architektur:

uname -m

Falls du „aarch64“ in der Ausgabe siehst, dann hast du ein ARM64-System. Mit ARM64-Systemen sind die Compiler-Flags aus der Fehlermeldung nicht kompatibel. Wir müssen daher die Makefile entsprechend anpassen. Zunächst öffnen wir die Makefile mit einem Texteditor. Bitte stelle vorher sicher, dass du im richtigen Ordner bist.

nano Makefile.inc

Ändere dann diese Zeilen:

CPUFLAGS=-marm -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard
CFLAGS=-marm -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -Ofast -Wall -pthread  -DRF24_NO_INTERRUPT

Zu diesen Zeilen:

# CPUFLAGS=-marm -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard
CFLAGS=-Ofast -Wall -pthread -DRF24_NO_INTERRUPT

Speichere dann die bearbeitete Datei ab. Die spezifischen ARMv6-Flags sind nun deaktiviert, während allgemeine Optimierungs- und Warnflags beibehalten werden. Führe dann die Kompilierung erneut durch:

make clean
make

libboost_python3 nicht gefunden

/usr/bin/ld: cannot find -libboost_python3

Falls du folgenden Fehler in der Konsole siehst, konnte Linker die Bibliothek „libboost_python3“ nicht finden. Stelle zunächst sicher, dass „libboost-python“ installiert ist:

sudo apt-get update
sudo apt-get install libboost-python-dev

Danach kannst du versuchen das RF64 Python-Modul erneut zu installieren.

Falls der Fehler immer noch auftritt, ist die Bibliothek zwar installiert, aber unter einem anderen Namen, dann müssen wir einen symbolischen Link erstellen. Überprüfe zunächst die tatsächlich Installierten Boost-Bibliotheken, um den genauen Namen zu finden:

ls /usr/lib/x86_64-linux-gnu/ | grep boost_python

Beachte, dass der Pfad je nach Systemarchitektur variieren kann (z.B. könnte es „aarch64-linux-gnu“ anstelle von „x86_64-linux-gnu“ für ARM-Architekturen sein).

Wenn du die spezifische Boost Python Bibliothek für Python 3 findest, aber sie einen anderen Namen hat (z.B. libboost_python38.so oder libboost_python-py39.so), kannst du einen symbolischen Link erstellen, der auf die tatsächliche Bibliotheksdatei zeigt:

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py39.so /usr/lib/x86_64-linux-gnu/libboost_python3.so

Passe den Pfad und den Dateinamen entsprechend dem an, was du auf deinem System gefunden hast.