Turris Omnia: Arduino Nano USB in LXC nutzen
Hinweis: Dieser Artikel wurde ursprünglich auf klein-gedruckt.de veröffentlicht.
Wie ich schon in einem anderen Artikel beschrieben habe, können mit pilight kostengünstig Steckdosen geschaltet werden. Dabei können im Heimnetzwerk mehrere pilight-Dienste gestartet werden. Die Schaltvorgänge werden dann an alle pilight-Instanzen im Netzwerk übermittelt und von dort per Funk an die Aktoren übertragen. Auf diese Weise lässt sich vor allem die Reichweite der Funkmodule erweitern.
Da pilight seit einiger Zeit auch einen Transmitter auf Basis eines Arduino Nano über USB ansteuern kann und ich seit kurzem einen Turris Omnia besitze, wollte ich meine Hausautomatisierungslösung auf eine virtuelle Maschine auf dem Turris umziehen. Im ersten Schritt habe ich daher ein Debian in einem LXC-Container aufgesetzt. Damit ich nun auch pilight in diesem Container nutzen kann muss zunächst der pilight USB Nano eingebunden werden.
Hinweis: Auch wenn der Adruino Nano USB fast genauso angeschlossen und eingerichtet wird wie der Z-Wave-Stick (siehe Artikel ‘Turris Omnia: Z-Wave-Stick in LXC nutzen’) habe ich alle Einrichtungsschritte in dieser Anleitung wieder mit aufgenommen, damit nicht unnötig zwischen den Artikeln hin und her gesprungen werden muss.
Anmerkung: Im Folgenden müssen alle Kommandozeilen die mit host # beginnen im OpenWRT auf dem Turris Omnia, also dem Host, ausgeführt werden. Beginnt die Kommandozeile mit lxc #, müssen die Befehle innerhalb des LXC-Containers ausgeführt werden.
1| Kernel Modul installieren
Zunächst muss auf dem Host das fehlendes Kernel-Modul für Serial FTDI Devices installiert werden:
host # opkg update && opkg install kmod-usb-serial-ftdi
Danach wird der pilight USB Nano angeschlossen und per dmesg kann überprüft werden, ob das Device /dev/ttyUSB0
korrekt erkannt und angelegt wird:
host # dmesg [ 1630.004388] usb 2-1: new full-speed USB device number 3 using xhci-hcd [ 1895.695941] usbcore: registered new interface driver ftdi_sio [ 1895.695999] usbserial: USB Serial support registered for FTDI USB Serial Device [ 1895.696122] ftdi_sio 2-1:1.0: FTDI USB Serial Device converter detected [ 1895.696202] usb 2-1: Detected FT232RL [ 1895.696378] usb 2-1: FTDI USB Serial Device converter now attached to ttyUSB0 host # ls -la /dev/ttyUSB0 crw-r--r-- 1 root root 188, 0 Dec 7 22:13 /dev/ttyUSB0
Wichtig ist dabei die Nummer 188 in der letzten Zeile. Diese muss in der LXC-Konfiguration angegeben werden, damit das Device entsprechend an LXC durchgereicht wird.
2| LXC-Config anpassen
Jetzt kann das das Device dem entsprechenden LXC-Container zugeordnet werden. Dazu wird in der Datei /srv/lxc/<container>/config auf dem Host folgende Zeilen ergänzen (<container> muss natürlich mit dem eigenen Container-Namen ausgetauscht werden):
# # USB-Devices für LXC-Container bereitstellen ############################################# # /dev/bus/usb für lsusb im LXC-Container bereitstellen # beseitigt Fehlermeldung "unable to initialize libusb: -99" lxc.mount.entry = /dev/bus/usb dev/bus/usb none bind,optional,create=dir 0 0 # pilight USB Nano erlauben lxc.cgroup.devices.allow = c 188:* rwm lxc.mount.entry = /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file 0 0
3| hotplug einrichten
Auch wenn es nicht zwingend erforderlich ist weil der pilight-Daemon in der Standardkonfiguration mit root-Rechten läuft, habe ich die Berechtigungen für das Device angepasst. Leider nutzt OpenWRT hotplug und nicht udev, so dass ich für die Einrichtung das Script /etc/hotplug.d/usb/10-usb_permissions auf dem Host angelegt habe (siehe auch Artikel ‘Turris Omnia: Z-Wave-Stick in LXC nutzen’):
# cat /etc/hotplug.d/usb/10-usb_permissions case "$ACTION" in add) # Für Debug-Zwecke in /var/log/messages Device-Details ausgeben, wenn ein USB-Device angeschlossen wird logger -t DEBUG "hotplug usb: action='$ACTION' product='$PRODUCT' type='$TYPE' interface='$INTERFACE'" # Einstellungen pro Device vornehmen: case "$PRODUCT" in # Berechtigungen für Z-Wave-Device setzen 658/200/*) logger -t DEBUG "hotplug usb: ZME_UZB1 angeschlossen!" if [ -e /dev/ttyACM0 ] ; then chmod 664 /dev/ttyACM0 chown root:plugdev /dev/ttyACM0 fi ;; # Berechtigungen für pilight-USB-Nano setzen 403/6001/*) logger -t DEBUG "hotplug usb: Arduino Nano angeschlossen!" if [ -e /dev/ttyUSB0 ] ; then chmod 664 /dev/ttyUSB0 chown root:plugdev /dev/ttyUSB0 fi ;; esac ;; remove) ;; esac
4| Gruppe einrichten
Jetzt muss noch die Gruppe plugdev auf dem Host und dem Gast-Systeme angelegt werden, falls diese nicht sowieso schon existiert.
lxc # grep plugdev: /etc/group || (groupadd -r plugdev && grep plugdev /etc/group) plugdev:x:46: host # groupadd -g 46 plugdev
Wenn der Arduino Nano jetzt nochmal neu angesteckt wird, so sollte das Device folgende Berechtigungen auf dem Host zugewiesen bekommen:
host # ls -la /dev/ttyUSB0 crw-rw-r-- 1 root plugdev 166, 0 Dec 10 18:27 /dev/ttyUSB0
5| Container neu starten
Passt alles kann der LXC-Container neu gestartet werden:
host # lxc-stop -r -n <container>
Sobald der Container wieder erreichbar ist sollte das Device nun auch im Gast-OS mit den korrekten Berechtigungen verfügbar sein:
lxc # ls -la /dev/ttyUSB0 crw-rw-r-- 1 root plugdev 166, 0 Dec 10 18:27 /dev/ttyUSB0
Danach sollte die Einrichtung soweit abgeschlossen sein und pilight kann im Gast-System wie üblich installiert werden (siehe auch Steckdosen fernsteuern mit pilight – Teil 1 und Teil2). Bei der Konfiguration von pilight muss lediglich der Abschnitt hardware in der Datei /etc/pilight/config.json
angepasst werden:
[…] "hardware": { "433nano": { "comport": "/dev/ttyUSB0" } }, […]
Kommentare