Fhem und Deconz im Docker unter Unraid - leicht verständliches Tutorial

  • Ich habe festgestellt, dass es kein einfaches Tutorial auf deutsch gibt, wie man mal eben Fhem und Deconz im Docker Container unter Unraid laufen lassen kann. Daher dachte ich, ich mache das mal schnell mit ein paar Bildern und sehr leicht verständlich, in der Hoffnung, dass es jemandem bei Zeiten hilft.

    Fhem im Dockercontainer:
    Für Fhem gibt es mittlerweile offizielle Container, die regelmäßig gepflegt werden, daher bietet es sich an, diese zu nutzen. Um Fhem als Container auf einem unraid System laufen lassen zu können, musst du Dich auf der Weboberfläche deines unraid Systems anmelden.
    Wenn Du USB Gateways oder Culs benutzt, wie z.b. einen 433MHz Cul oder einen Conbee Stick für Zigbee, musst diese natürlich vorher einstecken. Es empfielt sich allerdings, nicht alle Sticks aufeinmal einzustecken, sondern die Sticks nacheinander. Also erst einen Stick einstecken, diesen dann einrichten/konfigurieren, dann den nächsten Stick und so weiter. Diese vorgehensweise macht es leichter, den jeweiligen Stick zu identifizieren und es kann, wie in meinem Fall, zu Problemen kommen, wenn man alle Sticks aufeinmal steckt.


    Punkt 1
    USB Stick identifizieren:


    Nachdem Du also Dein USB Gateway oder Deinen Cul gesteckt hat, mußt Du herausfinden, auf welchem Bus und als welche Device ID unraid den Stick erkannt hat. Dafür gehst du in der unraid Web-UI auf Tools -> System Devices und schaust dann unter USB Devices.

    Wenn du, wie empfohlen, nur einen Stick gesteckt hast, kann man den jetzt leicht identifizieren. Die beiden aufgeführten Geräte mit dem Namen Linux Foundation 2.0 und 3.0 sind für uns uninteressant. Dabei handelt es sich um dem Systemstick, auf dem unraid läuft. Was dann noch verbleibt, ist Dein USB Stick. In meinem Fall und auf dem Bild sind aktuell zwei Sticks zu sehen, einmal der Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
    und einmal Atmel Corp. LUFA USB to Serial Adapter Project.
    Der erstgenannte ist der Cobee Stick von Dresden Elektronik und der zweite ist ein 433MHz Cul von Busware. Alleine an den Beschreibungen erkennt man auf den ersten Blick nicht, welcher Stick wofür sein soll. Daher sollte man die Stick auch nacheinaner einstecken, damit man direkt weiß, wofür der Stick sein soll. Im Nachhein ist eine Unterscheidung schwierig. Jetzt brauchst du die Bus ID und die Device ID von dem jeweiligen Stick. Für den Amtel Corp. LUFA USB to Serial Stick wäre das in dem Fall Bus 001 und Device 006 (siehe Bild). Diese beiden ID brauchst du später noch.

    Punkt 2
    Fhem Dockercontainer installieren:

    Einen Dockercontainer unter unraid zu installieren ist denkbar einfach. Einfach in der unraid WEB UI auf Apps klicken und dann im Suchfenster Fhem eingeben. Erst einmal wird hier nichts gefunden, da es keinen Fhem Container speziell für unraid gibt. Ist aber nicht weiter tragisch, denn mit einem klick auf click here to get more results from docker hub wird auch der Fhem Container gefunden. Du solltest den Container nehmen, der offiziell von Fhem angeboten wird.
    Bild 2

    Bei den Suchergebnissen steht immer ganz oben zu erst der Name des Containers und darunter (schiefgestellt) der Name, von dem der Container erstellt wurde. Am besten benutzt Du den offiziellen Fhem Container, also wälhst Du den ersten in den Suchergebnissen aus mit dem Containernamen "fhem" und dem Namen des Erstellers "fhem". Zum installieren auf das Festplattensymbol mit dem Pfeil nach unten klicken.
    Dann fragt unraid die gewünschte Konfiguration für den Container ab. Hier gibt es einige Dinge die man einstellen muss, da der Fhem Container, anders als viele andere Docker Container, keine voreingestellten Einstellungen hat.

    Du kannst die Einstellungen auf dem folgenden Bild verwenden:

    Bild 3

    Zuerst musts du den Container einen Namen geben. Ich habe mich hier für fhemsmarthome entschieden, der Name ist aber natürlich frei wählbar. Standartmäßig steht als Name Fhem. Repository und Network Typ kannst du ignorieren, bzw. auf den vorgegebenen Einstellungen lassen. Standartmäßig sollte bei Network Typ Bridge ausgewählt sein. Wenn dem nicht so ist, dann bitte auf Bridge (wenn Du mit Fhem andere PC via WOL wecken willst, wird bei im Brdige Modus Probleme geben!!! In dem Fall könnte es nötig sein, den Network Typ auf Host zu ändern, dann sollte auch WOL wieder funktionieren) ändern. Bei Privileged den kleinen Schieber auf [b]on [/b]stellen. Das bedeutet, dass der Container auf die Hardware des Hostsystems zugreifen darf. Läßt man das aus, kann es Probleme mit der Erkennung der USB Sticks geben.
    FHEM Config ist ein Punkt, der bei Dir jetzt vermutlich nicht auftaucht. Normalerweise ist der Punkt für den Betrieb auch nicht zwingend erforderlich, aber dennoch sinnvoll. Denn hier kann man die config, die standartmäßig im Dockercontainer abgespeichert wird, auslagern. Das hat den Vorteil, dass man den Container löschen kann, ohne die Konfiguration zu verlieren. Erstellt man den container später neu und verlinkt die Config auf dieses Verzeichnis, sind alle Einstellungen wieder da, ohne das man Fhem neu einrichten muss.
    Um diesen Punkt anlegen zu können musst Du auf + Add another Path, Port, Variable, Labe or Device klicken. Es öffnet sich ein neues Fenster in dem Du bitte die folgenden Werte eingibst:
    Bild 4
    Den Namen kannst du frei wählen. Ich habe mich für Fhem config entschieden. Bei Container Path muss zwingend /opt/fhem eingetragen werden. Das ist der Pfad zur Fhem Konfiguration innerhalb des Containers. Bei Host Path musst du den Pfad eintragen, auf den Du die Fhem Configuration mounten/verlinken willst. Ich habe mir auf meinem System eine Freigabe "Daten" erstellt, wo all solche Sachen rein kommen. Die Wahl ist aber Dir überlassen. Access Mode bitte auch einfach auf read/write lassen. Dann auf Add klicken.
    Zu letzt müssen wir noch den Port von unserem Fhem auf einen Port von unserem Hostsystem verknüpfen. Der Fhem Standartport ist die 8083 und es empfiehlt sich, der Einfachheit halber auch bei dem Hostsystem die 8083 zu verwenden, jedoch kann der Port frei gewählt werden.
    Um nun den containerport mit einem Hostport zu verknüpfen einfach wieder auf + Add another Path, Port, Variable, Labe or Device klicken bei Config Type Port auswählen, einen frewiwählbaren Namen bei Name: eintragen und bei Container Port den Fhem port 8083  und beim Host Port entweder auch die 8083 oder einen anderen, freien Port des Host Systems eingeben und auf Add klicken.
    Nachdem du alles eingestellt hast, sollte es so aussehen wie in dem Bild 3.
    Dann mit einen klick auf Apply wird er Container heruntergeladen und automatisch konfiguriert. Jetzt läuft ein bisschen Gerödel auf dem Bildschirm und nach einigen Sekunden kann man mit Done bestätigen und fhem läuft.

    Unter Docker in der unraid UI sollte Fhem jetzt auftauchen und in etwa so aussehen:
    Bild 5
    Die IP Adressen werden vermutlich andere sein, entsprechend Euren System, aber der Rest sollte passen. Ganz rechts auf dem Bild sieht noch einen kleinen Schalter, der wie auf dem Bild standartmäßig auf off steht. Der Schalter ist den Autostart des Containers, sprich ob der container bei einem Absturz oder nach einem Neustart des System automatisch gestartet werden soll. Sinnvoll wäre es, hier auf on zu stellen.


    Jetzt müßte Euer Fhem über die IP Eures unraid Systems und den Port 8083 erreichbar sein. und funktionieren. Den Cul erkennt Fhem normalerweise von alleine, wenn in Fhem autodetect aktiviert ist. Hierzu im Zweifelsfall einen Blick in das Fhem-Wiki werfen. Sollte der Cul nicht erkannt werden, wird Punkt 1 dieser Erklärung interessant. Denn dann kann es ggf. nötig sein, den Cul Stick im container einzurichten. Dazu einfach auf den Container klicken und es geht ein Menü mit den Optionen auf, was aussieht wie auf Bild 3. Wird der Stick also nicht automatisch in Fhem erkannt, hier einfach wieder auf + Add another Path, Port, Variable, Labe or Device klicken, dann wo Path steht einfach Device auswählen, einen beliebigen Namen vergeben und bei Value den Pfad für den USB angeben. Der Pfad der USB Geräte ist /dev/bus/usb/ und dann die beiden Zahlen für Bus und Device aus Punkt 1. Möchte ich als meinen Cul, in meinem Fall Atmel Corp. LUFA USB to Serial Adapter Project hier angeben, der die Bus ID 001 und die Device ID 006 hat, wäre er korrekte Pfad wie folgt: /dev/bus/usb/001/006 Den Pfad bitte entsprechend anpassen.

    Diese Angabe von USB Geräten ist nicht persistent, also sie kann sich nach einem Neustart verändern, dass der Stick dann Bus 001 Device 005 zugewiesen bekommt. Das spielt aber in der Regel keine Rolle, wenn der Stick einmal von Fhem erkannt wurde.

    Punkt 3
    Deconz Conainer installieren:

    Bevor Du mit der Installation startest, solltest du deinen vorher eingesteckte Cul abziehen und den Conbee Stick (oder anderen Zigbee Stick) in einen anderen, freien USB Port einstecken, damit wir diesen wieder einfacher identifieren können, wie in Punkt 1. Dann arbeitest du Punkt 1 wieder ab und notierst dir Bus und Device ID für den Zigbee Stick.

    Die Installtion des Deconz Containers läuft genau so wie bei Fhem. Du gehst in der unraid Web UI wieder auf Apps und gibst im Suchfenster deconz ein. Vermutlich wird wieder nichts gefunden und Du klickst auf click here to get more results from docker hub. Dann sieht es wieder genau so aus wie auf Bild 2. Du nimmst bitte den Container von marthoc, dieser wird von Dresden Elektronik empfohlen und auch regelmäßig gepflegt.

    Für den container bitte die folgenden Einstellungen übernehmen, wie auch schon bei dem Fhem Container:

    Den host Port muss man nicht zwingend angeben, aber im Unterschied zu dem fhem container müssen wir den Web Port für Deconz angeben, da dieser standartäßig auf dem Port 80 liegt. Um einen anderen Web Port angeben zu können, machen wir das diesmal aber nicht über Port, sondern über eine Variable. Dazu bitte auf + Add another Path, Port, Variable, Labe or Device klicken, dann als config Type Variable auswählen. Der Name ist wieder frei wählbar. Bei Key bitte DECONZ_WEB_PORT eintragen und als Value den gewünschten Port, in meinem Fall 666. In meinem Fall ist das der Port 666

    Zu letzt sollte man auch die Deconz config persistent machen, wie auch schon bei Fhem. Dazu wieder auf + Add another Path, Port, Variable, Labe or Device klicken, als config Type Path auswählen und einen beliebigen Namen eintragen.

    Bei Container Path wird der Config Pfad innerhalb des Containers angegeben, der immer /root/.local/share/dresden-elektronik/deCONZ ist, und als Host Pfad bitte die eigene, gewünschte Freigabe angeben. In meinem Fall ist das unter /mnt/user/Daten/Deconz. Aber hier bitte ein selbst gewähltes Verzeichnis auf Eurem Host System auswählen.
    Network Typ und Console Shell Command bleiben in den Standarteinstellungen, Privileged bitte wie bei Fhem auf on stellen, damit deconz Zugriff auf Eure Hardware (USB Sticks bekommt) und das war es dann auch schon. Mit Apply bestätigen und der container wird mit der angegebenen Konfiguration installiert.
    Wie zuvor auch schon bei Fhem in Bild 5 gezeigt, auch den Container für Deconz bei Autostart auf on stellen, damit der Container immer automatisch gestartet wird.
    Das Phoscon Gateway sollte jetzt über die IP Eures unraid System mit dem vergebenen Port (in dem Beispiel hier 666) erreichbar sein. Bitte einmal das Gateway starten und schauen, ob der Zigbee Stick erkannt wurde. Das sieht man in der Phoscon App unter Gateway und dann sollte bei Firmware ein Wert stehen. Erfahrungsgemäß wird der Stick auf diesem hier beschriebenen Weg problemlos erkannt. Sollte dem nicht so ein, könnte ein Neustart von Unraid helfen.

    Wurde der Zigbee Stick erkannt, kannst Du auch wieder Deinen Cul einstecken und Fhem jetzt konfigurieren, wie gewohnt. Wie man Fhem selbst konfiguriert und mit deconz verknüüft, erkläre ich hier nicht, dafür gibt es zahlreiche, sehr gute deutsche Erklärungen und auch das Fhem Wiki ist hier sehr gut.


    Natürlich kann man die Docker Container auch über das Terminal von unraid erstellen. In fast allen Wikis ist das so angegeben. Der Befehl für Fhem wäre dann z.b. docker pull fhem/fhem . Ich persönlich würde aber den hier beschriebenen Weg empfehlen. Denn über den Command im Terminal ist es kompliziert, die ganzen Variablen wie Ports, Pfade ect. anzugeben. Über die unraid Web Ui ist das einfacher und hat den Vorteil, dass unraid selbst eine kleine Config für jeden über die UI erstellen Container anlegt. Das macht das Handling im nachhinein einfacher.

    Ich hoffe, dass der beschriebene Weg leicht verständlich war und dem einen oder anderen beim Einstieg hilft.

    5 Mal editiert, zuletzt von Bjoern (14. April 2020 um 17:16)

  • Vielen lieben Dank Björn das Du dieses Turorial geschrieben hast!

    Ich habe es versucht so wie in deiner Anleitung nachzubauen, aber mein FHEM Container bekommt keinen Zugriff auf die USB Schnittstelle mit aktivierten Privileged Modus.

    Im Log steht folgendes:

    Code
    JeeLinkLaCrosse: Can't open /dev/bus/usb/001/007: Permission denied


    und wenn ich mit chmod -R 777 /dev/bus/usb/001/007 die Rechte ändere bekomme ich diese Fehlermeldung:


    Code
    Opening JeeLinkLaCrosse device /dev/bus/usb/001/007
    PERL WARNING: can't getattr: Inappropriate ioctl for device at ./FHEM/DevIo.pm line 612.
    JeeLinkLaCrosse: Can't open /dev/bus/usb/001/007: Inappropriate ioctl for device

    Hättest Du vielleicht eine Idee für mich?

    Vielen lieben Dank

  • okay, das ist ärgerlich,
    versuch mal auf der unraid Konsole (nicht in der Container Console) das dev der Benutzergruppe "nobody" hinzuzufügen (unraid startet docker mit dem Benutzer nobody)

    also einmal chown root:nobody /dev/bus/usb/001/009
    oder chmod 777 /dev/bus/usb/001/009

    und dann den Docker starten, wenn das klappt musst du es persistent in der /boot/config/go so machen, nach einem Neustart ist nämlich sonst alles auf 0.

  • mit den Befehl:
    chown root:nobody /dev/bus/usb/001/009

    Bekomme ich diese Fehlermeldung:

    Code
    JeeLinkLaCrosse: Can't open /dev/bus/usb/001/009: Permission denied

    und mit diesen:
    chmod 777 /dev/bus/usb/001/009

    Code
    2023.01.08 11:28:45.207 3: Opening JeeLinkLaCrosse device /dev/bus/usb/001/009
    2023.01.08 11:28:45.212 1: PERL WARNING: can't getattr: Inappropriate ioctl for device at ./FHEM/DevIo.pm line 612.
    2023.01.08 11:28:45.212 1: JeeLinkLaCrosse: Can't open /dev/bus/usb/001/009: Inappropriate ioctl for device

    Vorab danke für Deine Hilfe

  • mich wundert aktuell auch die generelle Vorgehensweise, normalerweise wird das usb device doch als /dev/ttyusb0-X erkannt und dieses sollte dann in den Container Einstellungen durchgereicht werden.
    Zieh mal den dongle raus, wieder rein, und check mal

    dmesg | grep "tty"

  • Code
    root@NetServer:~# dmesg | grep "tty"
    [    0.318881] printk: console [tty0] enabled
    [    0.890382] 00:01: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
    [50798.490964] usb 1-6.3: FTDI USB Serial Device converter now attached to ttyUSB0
    [54973.413590] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
    [54978.681925] usb 1-6.3: FTDI USB Serial Device converter now attached to ttyUSB0
    [55276.443715] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
    [55291.874447] usb 1-6: FTDI USB Serial Device converter now attached to ttyUSB0

    Das ist die komplette Meldung

  • Code
    root@NetServer:~# ls -la /dev/ttyUSB0
    crw-rw---- 1 root dialout 188, 0 Jan  8 12:00 /dev/ttyUSB0

    Ich habe mit diesen Befehlen versucht mir die Berechtigung zu holen

    Code
    root@NetServer:~# chown root:nobody /dev/ttyUSB0
    root@NetServer:~# chmod 777 /dev/ttyUSB0

    und im Docker dieses Device erstellt:

    Im Log von FHEM wird nichts erkannt :(

  • hmm,
    Klappt es wenn du mal neu startest (so das /dev/ttyUSB0) wieder zu dialout gehört, anschließend den benutzer nobody zur gruppe dialout mit
    usermod -aG dialout nobody
    hinzufügst ?
    achtung, ist auch nicht persistent.

    Ist ttyUSB0 auch eine "null" im den Container Settings, nicht das es ein ooo ist :)

  • Code
    root@NetServer:~# usermod -aG dialout nobody
    root@NetServer:~# ls -la /dev/ttyUSB0
    crw-rw---- 1 root dialout 188, 0 Jan  8 14:39 /dev/ttyUSB0

    müsste nicht nobody laut Theorie nicht in Zeile 3 mit aufgeführt werden (hatte den Befehl auch mit sudo getestet)?

  • Ne, ich hab aber Unraid und reiche auch eine serielle Schnittstelle mit ftdi Chipsatz "problemlos" durch, gelöst über usermod in der /boot/config/go .
    Sehr merkwürdig.
    Möglicherweise falsche Baudrate ?
    Bei dir wird sie mit 115200 initialisiert, lässt sich aber auch anpassen...

  • Du hast diesen Befehl in deiner /boot/config/go?

    Code
    usermod -aG dialout nobody

    die Baudrate ist laut meiner alten Pi FHEM Installation 57600, diese wurde auch automatisch von FHEM eingestellt.
    Wie kann ich diese direkt in Unraid anpassen?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!