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
Wichtig: Die Group-ID der plugdev-Gruppe muss auf dem Gast und Host-Betriebssystem identisch sein. Daher muss die Gruppen-ID im zweiten Kommando (-g Parameter) ggf. angepasst werden.

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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page