Python für die CCU3

Wenn die Homematic-Installation wächst, wachsen auch die Möglichkeiten und Ideen rund um die Automatisierung. Mit Homematic-Script sind kleine und kurze Programmierungen auf der CCU zwar möglich, aber es ist recht mühsam und fehleranfällig und vor allem stösst man schnell an Grenzen.

Hier wäre eine ausgewachsene Programmiersprache von Vorteil. Wer nicht C/C++ cross-compilieren möchte landet schnell bei Javascript/Node oder Python. Zu Node.js werde ich in der Zukunft einen gesonderten Post erstellen. Hier beschäftige ich mich mit der Installation von Python auf der CCU3.

Mit pmatic existiert bereits eine hervorragende API inklusive einer read-to-use Installation von Python für die CCU2. Leider funktioniert das darin enthaltene Python nicht auf der CCU3.

Buildroot

Es wird ein Linux-Rechner benötigt, Ubuntu-Docker-Image oder eine Virtual Box mit Linux tuns aber auch. Wer Linux auf Intel/AMD-Systemen verwendet, benötigt die buildroot-Umgebung um python für den ARM der CCU3 zu kompilieren. Um Kompatibilitätsproblemen von vornherein aus dem Weg zu gehen, verwende ich dieselbe Version, welche auch für den Build der CCU3-Firmware verwendet wurde: 2018.08.2

Nach dem Auspacken, kann die Konfiguration beginnen:

cd buildroot-2018.08.2
make menuconfig

Das sollte dann so aussehen:

Wichtig sind die "Target options". Die Settings sollten so aussehen:

Mit <Exit> wieder eine Ebene höher gehen und in "Toolchain" rein. Dort folgendes ändern:

  • C library = "glibc"
  • Kernel Headers = "Linux 4.14.x"
  • Enable C++ support
  • Enable compiler OpenMP support (wird für Python nicht benötigt)

Jetzt kommt das eigentlich Python an die Reihen. Von der Hauptnavigation in "Target packages" gehen und unter "Interpreter languages and scripting" python3 auswählen. Im den Unterpunkten "core python3 modules" und "External python modules" kann man nach Belieben und Bedarf sich auch direkt einige Python module kompilieren lassen.

Abschliessend wird die Konfiguration mit <Save> gespeichert und dann mit <Exit> verlassen.

Jetzt sollte alles fertig für den Build sein. Dieser funktioniert nur online, da er einige Quellen während des Builds aus dem Internet zieht.

make clean all -j 4

Der Build dauert recht lange. Je nach Hardware kann man daher teilweise parallel kompilieren. Im Beispiel lasse ich den Build parallel auf 4 Kernen laufen. Und trotzdem sollte man Zeit mitbringen...

Wenn alles sauber durchgelaufen ist, befindet sich die Python-Umgebung unter ./output/build/python3-3.6.3. Sie kann nur per scp auf die CCU3 kopiert werden, am besten unter /usr/local/.

Als letzten Schritt muss noch der Suchpfad für den Linker erweitert werden, damit er auch die Python-libs findet. Normalerweise würde dies in der /etc/ld.so.conf eingetragen. Leider ist das CCU3-root-filesystem readonly, so dass nur eine weniger elegante Variante übrig bleibt:

ssh root@<your CCU3 IP>
# cd /usr/local/python3-3.6.3
# vi python.sh

Dort folgendes einfügen:

!/bin/sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/python3-3.6.3
export PATH=$PATH:/usr/local/python3-3.6.3
python

Speichern und testen:

# chmod 750 python.sh
# ./python.sh
 Python 3.6.3 (default, Aug 18 2019, 15:15:35) 
 [GCC 7.3.0] on linux
 Type "help", "copyright", "credits" or "license" for more information.
                        

Wenn obiger Output erscheint, hat alles geklappt. Im Moment ist das python noch nicht sehr nützlich, da eine schöne Einbindung in das WebUI fehlt. Genau das werde ich in einem weiteren Post vorstellen.

Nachtrag: Für ganz Mutige gibt es statt dem obigen Script noch die Möglichkeit, das root-Filesystem der CCU3 read-write zu mounten und dann die notwendigen Änderungen vorzunehmen. Aber Vorsicht, das ist für Ungeübte eine Operation am offenen Herzen.

# mount -o remount,rw /
# ln -s /usr/local/python3-3.6.3/python /usr/bin/python3.6
# ln -s /usr/bin/python3.6 /usr/bin/python
# vi /etc/profile.d/python.sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/python3-3.6.3
export PATH=$PATH:/usr/local/python3-3.6.3
# mount -o remount,ro /

Einmal noch aus- und wieder einloggen und python sollte funktionieren.