fhem mit sonos im docker container Problem

Begonnen von lewej, 27 April 2017, 22:01:53

Vorheriges Thema - Nächstes Thema

lewej

Hallo Zusammen,

hat jemand einen fhem docker container mit sonos und UPNP am laufen. Fhem ist kein Problem, leider funktioniert das SONOS Plugin nicht mehr.
Hat jemand eine funktionieren Konfiguration?

Mit diese Optionen funktioniert es nicht:
docker-compose.yml ausschnitt

expose:
            - "8083"
            - "7072"
            - "8084"
            - "8085"
            - "2222"
            - "9001"
            - "4711"
            - "1900"
        ports:
            - "1900:1900/udp"
            - "8083:8083"
            - "7072:7072"
            - "8084:8084"
            - "8085:8085"
            - "9001:9001"
            - "2222:2222"
            - "4711:4711"
        build: fhem_jessie
        cap_add:
            -  SYS_ADMIN
        privileged: true


Gruß
lewej

crowzero

Hallo lewej,
ich kämpfe auch gerade mit dem Sonos im Docker. Neben den Ports habe ich aber auch das Netzwerksegment in verdacht.
docker inspect myfhem | grep IP
Der Container läuft in einem anderen Segment als der Sonos. IMHO funktioniert Sonos immer nur im selben Netzwerk.

Bin gespannt auf Antworten.

Gruß
crowzero

dev0

Ihr werdet nicht drum herumkommen Euch mit Multicast auseinander zu setzen. Sonos benutzt 239.255.255.250/1900.

Zitat von: crowzero am 29 April 2017, 00:05:08
IMHO funktioniert Sonos immer nur im selben Netzwerk.
Out of the box funktioniert es nicht, aber je nachdem wie Du das Netz segmentiert hast, kannst Du IGMP oder einen Multicast/Bonjour-Proxy einsetzen.

lewej

Hallo Zusammen,

ich finde es zwar nicht schön, aber damit ich erstmal weiter machen kann, habe ich folgende Option gesetzt. Damit funktioniert es erstmal.

network_mode: host

Gruß
lewej

Reinerlein

Hallo,

alternativ kannst du auch den Sonos-SubProzess selber auf einer Maschine innerhalb des Netzes laufen lassen, wo deine Sonos-Player laufen.
Dein Docker-Fhem kann sich dann mit diesem Prozess verbinden.

Das bedeutet aber immer noch, dass du eine laufende Maschine innerhalb deines "normalen" Netzes brauchst, auf der Perl läuft...

Wenn du das versuchen möchtest, so kannst du den SubProzess selber starten:

perl 00_SONOS.pm <PORT> <INITIAL_VERBOSELEVEL> <MSECLOG>

also z.B.

perl 00_SONOS.pm 4711 1 1


Grüße
Reinerlein

lewej

Zitat von: Reinerlein am 29 April 2017, 23:38:36
Hallo,

alternativ kannst du auch den Sonos-SubProzess selber auf einer Maschine innerhalb des Netzes laufen lassen, wo deine Sonos-Player laufen.
Dein Docker-Fhem kann sich dann mit diesem Prozess verbinden.

Das bedeutet aber immer noch, dass du eine laufende Maschine innerhalb deines "normalen" Netzes brauchst, auf der Perl läuft...

Wenn du das versuchen möchtest, so kannst du den SubProzess selber starten:

perl 00_SONOS.pm <PORT> <INITIAL_VERBOSELEVEL> <MSECLOG>

also z.B.

perl 00_SONOS.pm 4711 1 1


Grüße
Reinerlein

Hallo,

danke für den Tipp. Ich habe das SONOS Modul in einen seperaten CONTAINER gepackt und lasse diesen Container mit network-mode host laufen. Fhem kann dann wiederum im bridge Modus weiter laufen.

Gruß
lewej

Erdmännchen

Hallo lewej,
Hallo Reinerlein,

Ich bin noch blutiger Anfänger was Linux/Docker/Perl/FHEM angeht und ich stehe vor dem selben Problem wie lewej.

Wenn ich das richtig verstehe kann FHEM (bridge modus) die SONOS Lautsprecher vom Container aus nicht erreichen, weil der IP Adressbereich nicht der selbe ist.
Deshalb muss ich das SONOS Modul in einen eigenen Container packen mit network-host. (Wieso und Weshalb oder was genau der Unterschied zwischen bridge und host ist, weiss ich nicht genau)

Jetzt hapert es natürlich an der praktischen Umsetzung.
Was für ein Image muss ich für den "SONOS-Container" nehmen?
Wie bekomme ich das einzelne SONOS Modul in den Container?
Wie verbinde ich den SONOS- und FHEM-Container?

Ansatz aus einem anderen Foreneintrag:
Muss ich einen zweiten FHEM Container (jessie) als host erstellen und mit FHEM2FHEM die Daten an der FHEM Container übergeben?

Oder wie funktioniert das mit den "SubProzessen"? (perl 00_SONOS.pm <PORT> <INITIAL_VERBOSELEVEL> <MSECLOG>)

Habt ihr vielleicht einen Auszug aus eurer Dockerfile, yml und fhem.cfg?

Es wäre echt super, wenn ihr mich mal in die richtige Richtung schubsen könntet, damit würde ich mir tage langes googeln ersparen.

Danke euch schon mal im voraus und hoffe auf eine kompetente Hilfe.

MfG Erdmännchen

Reinerlein

Hi Erdmännchen,

kurzer Umriss: Eine Docker Bridge arbeitet wie ein Netzwerk-Router, der IP-Adressbereiche trennt bzw. kontrolliert verbindet.
UPnP, das Basisprotokoll der Sonosplayer, ist ein sogenanntes Broadcast-Verfahren. Leider werden an einem Router alle Broadcast-Pakete verworfen, und nicht geroutet.

Deshalb die Idee, wenn Fhem in einem solchen Bridged-Host laufen soll (wegen konfigurierter, größerer Sicherheit o.ä.), dann kann man in einem anderen Container, der dann im Host-Modus laufen muss, damit er Bestandteil des "normalen" Netzes ist, den Sonos-SubProzess selber anstarten, und von Fhem aus dahin verbinden lassen. Der SubProzess fungiert dann sozusagen als Befehlsproxy für die Befehle und als Informationsproxy für alle Events der Player.
Das tut der SubProzess sowieso, nur passiert das sonst versteckt im Hintergrund, weil die meisten Menschen sich nicht damit beschäftigen wollen/müssen.

Also: Du kannst Fhem direkt im Host-Modus laufen lassen, oder einen zweiten Container (der die gleichen Bedingungen aufweisen muss, wie dein Fhem-Container, also Perl usw.) starten.
In diesem zweiten Container läßt du Fhem nicht laufen, aber du installierst es normal. Dort kannst du dann mit der angegebenen Befehlszeile den SubProzess starten.

In deinem Fhem-Sonos-Define gibst du dann die IP-Adresse und den von dir verwendeten Port in diesem zweiten Container an.

Das wars :)
Bedenke, dass du bei Sonos-Updates dann immer beide Container updaten musst, und den SubProzess im zweiten Container selber beenden und neu anstarten musst...

Grüße
Reinerlein

Erdmännchen

Hallo Reinerlein,
erstmal herzlichen dank für deine schnelle und herrvoragende Hilfe.

Ich habe zwar ein paar Tage gebraucht deinen Vorschlag um zu setzen, aber ich habe jetzt die Lösung  :D

Hier meine yml File:

version: '3'

services:
    portainer:
        container_name: portainer
        expose:
            - "9000"
        ports:
            - "9000:9000"
        image: portainer/portainer
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        network_mode: "bridge"

    mysql:
        container_name: mysql
        expose:
            - "3306"
            - "33060"
        ports:
            - "3306:3306"
            - "33060:33060"
        image: mysql/mysql-server:latest
        volumes:
            - ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init.sql
            - ./mysql/data:/var/lib/mysql
        environment:
            - MYSQL_RANDOM_ROOT_PASSWORD=yes
        networks:
            - bridge

    fhem:
        container_name: fhem
        expose:
            - "8083"
            - "7072"
        ports:
            - "8083:8083"
            - "7072:7072"
        build: fhem
        privileged: true
        volumes:
            - ./fhem/start.sh:/opt/fhem/start.sh
            - ./fhem/log/:/opt/fhem/log
            - ./fhem/backup/:/opt/fhem/backup
            - ./fhem/data/fhem.cfg:/opt/fhem/fhem.cfg
            - ./fhem/data/FHEM/controls.txt:/opt/fhem/FHEM/controls.txt
            - ./fhem/data/FHEM/99_myUtils.pm:/opt/fhem/FHEM/99_myUtils.pm
            - ./fhem/data/contrib/dblog/db.conf:/opt/fhem/contrib/dblog/db.conf
        networks:
            - bridge
        depends_on:
            - "mysql"
            - "sonos"

    sonos:
        container_name: fhem_sonos
        build: fhem_sonos
        volumes:
            - ./fhem_sonos/start.sh:/opt/fhem/start.sh
        hostname: fhem_sonos
        network_mode: "host"

networks:
    bridge:
        driver: bridge


Dockerfile: FHEM
# FHEM_update
FROM debian:jessie

MAINTAINER Erdmaennchen <ich@welt.com>

#TAG jessie/fhem

ENV FHEM_VERSION 5.8
ENV DEBIAN_FRONTEND noninteractive
ENV TERM xterm

# non-free & contrib Quellen hinzufügen (snmp-mibs-downloader)
COPY etc/apt/sources.list etc/apt/sources.list

# Install Updates
RUN apt-get update && \
apt-get upgrade -y --force-yes && \
apt-get dist-upgrade -y --force-yes && \
apt-get install -y --force-yes --no-install-recommends apt-utils

# Install dependencies
RUN apt-get -y --force-yes install \
perl \
wget \
git \
apt-transport-https \
sudo \
etherwake \
dfu-programmer \
build-essential \
snmpd \
snmp \
snmp-mibs-downloader \
nano \
telnet \
usbutils \
sqlite3

# Install perl packages
RUN apt-get -f -y --force-yes install \
libavahi-compat-libdnssd-dev \
libalgorithm-merge-perl \
libclass-dbi-mysql-perl \
libclass-isa-perl \
libcommon-sense-perl \
libdatetime-format-strptime-perl \
libdbi-perl \
libdevice-serialport-perl \
libdpkg-perl \
liberror-perl \
libfile-copy-recursive-perl \
libfile-fcntllock-perl \
libio-socket-ip-perl \
libio-socket-ssl-perl \
libjson-perl \
libjson-xs-perl \
libmail-sendmail-perl \
libsocket-perl \
libswitch-perl \
libsys-hostname-long-perl \
libterm-readkey-perl \
libterm-readline-perl-perl \
libwww-perl \
libxml-simple-perl \
libdbd-sqlite3-perl \
libtext-diff-perl \
libsoap-lite-perl \
libxml-parser-lite-perl

# Install snmp mibs (NAS Status)
RUN cpan install use Net::SNMP

# Timzone
RUN echo Europe/Berlin > /etc/timezone && dpkg-reconfigure tzdata

# FHEM installieren
RUN wget https://fhem.de/fhem-${FHEM_VERSION}.deb && dpkg -i fhem-${FHEM_VERSION}.deb

# Benutzdefinierter Skin laden
RUN cd /opt/fhem/www/ && git clone https://github.com/klein0r/fhem-style-haus-automatisierung.git hausautomatisierung-com && chown -R fhem:dialout /opt/fhem/www/hausautomatisierung-com

# FHEM-User löschen
RUN userdel fhem

# Verzeichnis wechseln
WORKDIR "/opt/fhem"

# Update Config kopieren
COPY /data/fhem.cfg.update /opt/fhem/fhem.cfg

# Quellen für Update hinzufügen
COPY data/FHEM/controls.txt ./FHEM/controls.txt

# FEHM starten zum Updaten (durch notify in fhem.cfg)
RUN perl fhem.pl fhem.cfg | tee /opt/fhem/log/fhem.log

# Abfallkalender kopieren
COPY data/kal_abfall.ics ./kal_abfall.ics

# Wetterverlauf gplot kopieren
COPY data/www/gplot/SVG_Wetterverlauf.gplot ./www/gplot/SVG_Wetterverlauf.gplot
EXPOSE 8083 7072

# Start-Script kopieren
COPY start.sh ./
CMD bash /opt/fhem/start.sh


Dockerfile: FHEM_Sonos
# SONOS
FROM debian:jessie

MAINTAINER Erdmaennchen <ich@welt.com>

#TAG jessie/fhem_sonos

ENV FHEM_VERSION 5.8
ENV DEBIAN_FRONTEND noninteractive
ENV TERM xterm

# Install Updates
RUN apt-get update && \
apt-get upgrade -y --force-yes && \
apt-get dist-upgrade -y --force-yes && \
apt-get install -y --force-yes --no-install-recommends apt-utils

# Install dependencies
RUN apt-get -y --force-yes install \
perl \
wget \
git \
apt-transport-https \
sudo \
etherwake \
dfu-programmer \
build-essential \
nano \
telnet \
usbutils \
sqlite3

# Install perl packages
RUN apt-get -f -y --force-yes install \
libavahi-compat-libdnssd-dev \
libalgorithm-merge-perl \
libclass-dbi-mysql-perl \
libclass-isa-perl \
libcommon-sense-perl \
libdatetime-format-strptime-perl \
libdbi-perl \
libdevice-serialport-perl \
libdpkg-perl \
liberror-perl \
libfile-copy-recursive-perl \
libfile-fcntllock-perl \
libio-socket-ip-perl \
libio-socket-ssl-perl \
libjson-perl \
libjson-xs-perl \
libmail-sendmail-perl \
libsocket-perl \
libswitch-perl \
libsys-hostname-long-perl \
libterm-readkey-perl \
libterm-readline-perl-perl \
libwww-perl \
libxml-simple-perl \
libdbd-sqlite3-perl \
libtext-diff-perl \
libsoap-lite-perl \
libxml-parser-lite-perl

# Timzone
RUN echo Europe/Berlin > /etc/timezone && dpkg-reconfigure tzdata

# Install fhem
RUN wget https://fhem.de/fhem-${FHEM_VERSION}.deb && dpkg -i fhem-${FHEM_VERSION}.deb
RUN userdel fhem

WORKDIR "/opt/fhem"

# Update-Config kopieren
COPY /data/fhem.cfg.update /opt/fhem/fhem.cfg

# FEHM starten zum Updaten (durch notify in fhem.cfg)
RUN perl fhem.pl fhem.cfg | tee /opt/fhem/log/fhem.log

COPY start.sh ./
CMD bash /opt/fhem/start.sh


start.sh FHEM_Sonos

#!/bin/bash

echo "Starte SONOS"
perl /opt/fhem/FHEM/00_SONOS.pm 4711 1 1


Wenn jemand möchte kann ich meinen kompletten Code mal auf github posten.

Ich update FHEM schon beim erstellen. Zuerst kopiere ich eine einfache fhem.cfg.update:
# FHEM updaten und beenden
define Update notify global:INITIALIZED sleep 2;;update
define Shutdown notify global:UPDATE sleep 2;;shutdown

dann starte ich fhem mit dieser Config und Fhem macht ein update und beendet sich danach.
Erst dann wir meine richtige fhem.cfg kopiert.

Somit ist mein fhem schon beim ersten Starten auf dem neusten Stand.

Im FHEM Container starte ich fhem und im Sonos Container nur das perl modul.

Die Container sind schon ziemlich auf mein System angepasst, daher ist dieser Code nur als Beispiel gedacht.

Falls jemand Fragen hat stehe ich gerne zur Verfügung.

Einen großen Dank auch an Matthias Kleine der mir die Grundlage für meine yml File geliefert hat.
https://github.com/klein0r/fhem-docker
https://haus-automatisierung.com/

MfG Erdmännchen

Otto

Hallo Erdmännchen,
ZitatWenn jemand möchte kann ich meinen kompletten Code mal auf github posten.

ich fange gerade mit Docker an und würde mich freuen, wenn du den Code auf github posten würdest.
Gruss Otto

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

docker - homematic

Erdmännchen

Hallo Otto,

danke für dein Interesse.

Ich habe mal meinen Code online gestellt, vielleicht können wir uns ja gegenseitig helfen.

https://github.com/3rdmaennchen/docker_test

Der Code ist nur als Beispiel gedacht, musste viele Sachen löschen bzw. ändern.

Falls du noch Fragen oder Anregungen hast, immer raus damit.

MfG Erdmännchen

Otto

Hi Erdmännchen,

danke für deine config.

Ich "forsche" gerade mit docker, also viel kann ich nicht helfen.

Alexa-Fhem habe ich schon mal laufen, habe dieses hier genommen.
https://github.com/sbiermann/x86-alexa-fhem
Gruss Otto

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

docker - homematic

FunkOdyssey

#12
Was ich mich hier noch frage:

Wie greifst du innerhalb der FHEM-Umgebung (bridge) auf das fhem_sonos (Host) zu?

Mir steht der Hostname in der bridged-Umgebung nicht zur Verfügung. Folgende Varianten funktioniere nicht:

define Sonos SONOS dockerhost:4711 1 1
define Sonos SONOS fhem_sonos:4711 1 1
define Sonos SONOS sonos:4711 1 1

Nutze ich die hart-verdrahtete IP, dann kann ich darauf zugreifen:

define Sonos SONOS 192.168.0.x:4711 1 1

Aber das ist ja nicht wirklich optimal.

Die Frage ist wahrscheinlich: Wie kann ich den Hostname der Host-Umgebung (z.B. per Environment-Variable) an das FHEM weitergeben. Ich scheitere an der Syntax der Environment-Parameter.




Alternative: add-host?

Erdmännchen

Servus,

Zur Zeit habe ich meinen Sonos Container deaktiviert, da ich noch andere Baustellen habe, die mir wichtiger sind.

Ich habe auch die "hart-verdrahtete IP" genommen. Vielleicht kann man das anders/besser lösen.
Hier einige Ideen:

- Fhem Container in der yml Datei mit dem Sonos Container "verlinken"
https://docs.docker.com/compose/compose-file/#links

-Mutlicast (habe mich damit noch nicht beschäftigt, hat vielleicht etwas mit den docker Netzwerken zu tun)
Zitat von: dev0 am 29 April 2017, 08:08:04
Ihr werdet nicht drum herumkommen Euch mit Multicast auseinander zu setzen. Sonos benutzt 239.255.255.250/1900.

Out of the box funktioniert es nicht, aber je nachdem wie Du das Netz segmentiert hast, kannst Du IGMP oder einen Multicast/Bonjour-Proxy einsetzen.

Weiss nicht genau was er damit sagen möchte.
Vielleicht interne IP Adressen und Subnet richtig mit Multicast vergeben?

- Eigenes internes docker-Netzwerk konfigurieren mit IP/Subnet usw.
https://runnable.com/docker/docker-compose-networking
unter "Custom Network" (habe auf die schnelle kein besseres Beispiel gefunden)

Habe die Vermutung das man ein eigenes Netzwerk in der yml Datei mit Multicast erstellt und die Container ins selbe Netzwerk zuweist. Also anstatt network mode bridge ein eigenes erstelltes Netzwerk.
Wie genau das geht und wie man die internen IP Adressen und Subnetze richtig verteilt weiß ich nicht genau. So genau kenne ich mich mit der Netzwerktechnik nicht aus.

Werde mich heute nachmittag mit der HA-Bridge auseinander setzen. Wenn die HA-Bridge nicht im network mode bridge läuft, hänge ich schon wieder beim selben Thema (host mode) fest.

MfG Erdmännchen

FunkOdyssey

Ich habe bei mir auch noch das Problem, dass sich die fhem_sonos-Instanz irgendwann irgendwie zerlegt und in einer CPU-Last im Host mit 100% endet.
Noch spiele ich mit Docker und habe aktuell folgende Container eingeplant:

- Fhem
- eBusd
- Fhem_sonos (Host-Modus)
- Ha-bridge (Host-Modus)
- Hmcfgusb (privileged=true)
- Homebridge
- ReverseProxy mit SSL (Passwort und Client-Zertifikat)

Dabei habe ich mich an deiner Vorarbeit und der des Foren-Users pipp37 orientiert.
Mit dem Proxy bin ich noch gar nicht angefangen. Der Rest scheint schon zu laufen.
Ich traue mich nur noch nicht, den Hebel umzulegen und das RasPi durch meine neue Hardware zu ersetzen.
Außerdem will ich vorher noch das Host-Betriebssystem wieder wechseln. Ich habe derzeit Debian9Stretch und will wieder zu Ubuntu 16.04 LTS.

Wenn ich fertig bin, werde ich das auch in ein GitHub-Repository packen. Aber noch ist mir das zu sehr gepfuscht.

Es würde mich freuen, wenn du deine Neuerungen auch ins Repo committen könntest.




Frage am Rande: Ich sehe in vielen Fhem-Docker-Images, dass supervisord genutzt wird. Ist das überhaupt notwendig? Nice to have und praktisch, wenn man Fhem eigentlich nur als Daemon laufen lassen kann. Aber irgendwie ist mir das zu viel (ich nenne es mal) "Overhead".