Turris Omnia: Z-Wave-Stick in LXC nutzen

Hinweis: Dieser Artikel wurde ursprünglich auf klein-gedruckt.de veröffentlicht.

Nachdem ich meinen Turris Omnia halbwegs eingerichtet habe und der LXC-Container aufgesetzt ist, möchte ich meinen FHEM-Server in einem Container auf dem Turris Omnia betreiben. Als Voraussetzung dafür muss ich zunächst den Z-Wave.Me-USB-Stick innerhalb meines virtuellen LXC-Containers ansprechen können.  In dieser Anleitung gehe ich davon aus, dass ein Debian Jessie Container bereits mit einer funktionierenden FHEM-Installation angelegt wurde und funktioniert.

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 ein fehlendes Kernel-Modul installiert werden:

host # opkg update && opkg install  kmod-usb-acm

Anschließend den Z-Wave-Stick anschließen überprüfen ob der Stick erkannt und das Device /dev/ttyACME0  angelegt wurde:

host # dmesg
[141895.418113] usb 2-1.2: new full-speed USB device number 10 using xhci-hcd
[141895.508103] usb 2-1.2: device descriptor read/64, error -32
[141895.708086] usb 2-1.2: device descriptor read/64, error -32
[141895.908049] usb 2-1.2: new full-speed USB device number 11 using xhci-hcd
[141895.998051] usb 2-1.2: device descriptor read/64, error -32
[141896.198040] usb 2-1.2: device descriptor read/64, error -32
[141896.397999] usb 2-1.2: new full-speed USB device number 12 using xhci-hcd
[141896.398109] usb 2-1.2: Device not responding to setup address.
[141896.608076] usb 2-1.2: Device not responding to setup address.
[141896.817957] usb 2-1.2: device not accepting address 12, error -71
[141897.097920] usb 2-1.2: new full-speed USB device number 14 using xhci-hcd
[141897.209507] cdc_acm 2-1.2:1.0: ttyACM0: USB ACM device

host # ls -la /dev/ttyACM0
crw-r--r--    1 root     root      166,   0 Dec 10 14:39 /dev/ttyACM0

Wichtig ist dabei die Nummer 166 in der letzten Zeile. Diese muss in der LXC-Konfiguration angegeben werden, damit das Device entsprechend an LXC durchgereicht wird.

2| LXC-Config anpassen

Damit ist das Device auf dem Host-System bereits verfügbar. Da ich aber mein FHEM-Service auf einer virtuellen Maschine anbieten will, muss das Device noch dem entsprechenden LXC-Container zugeordnet werden. Dazu 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):

host # echo -n "Name des zu bearbeitenden Containers: " && read container
Name des zu bearbeitenden Containers: <your_container_name_here>

host # cat >> /srv/lxc/"$container"/config << EOF
#
# 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

# Zugriff auf Z-Wave.Me-Stick (ZME_UZB1) für FHEM erlauben
lxc.cgroup.devices.allow = c 166:* rwm
lxc.mount.entry = /dev/ttyACM0 dev/ttyACM0  none bind,optional,create=file 0 0
EOF

3| hotplug einrichten

Damit FHEM auf das Device zugreifen kann müssen noch die Berechtigungen für das Device innerhalb des Gast-OS angepasst werden. 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: Arduino Nano USB in LXC nutzen'):

host # cat >> /etc/hotplug.d/usb/10-usb_permissions <<EOF
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
EOF

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 Z-Wave-Stick jetzt nochmal neu angesteckt wird, so sollte das Device folgende Berechtigungen auf dem Host zugewiesen bekommen:

host # ls -la /dev/ttyACM0
crw-rw-r--    1 root     plugdev   166,   0 Dec 10 18:27 /dev/ttyACM0

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/ttyACM0
crw-rw-r--    1 root     plugdev   166,   0 Dec 10 18:27 /dev/ttyACM0

Alle Benutzer, die auf das Device zugreifen sollen, müssen jetzt noch zur neuen Gruppe hinzugefügt werden. Damit FHEM funktioniert muss der entsprechende Benutzer im Gast-System noch in die Gruppe eingefügt werden:

lxc # usermod -a -G plugdev fhem

Danach sollte die Einrichtung soweit abgeschlossen sein und ein entsprechendes Z-Wave-Device kann in FHEM mit folgendem Kommando angelegt werden:

define ZWAVE1 ZWDongle /dev/ttyACM0@115200

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page