Docker mit FHEM, MYSQL und SIGNAL

Begonnen von gotocu, 11 Juli 2023, 14:12:26

Vorheriges Thema - Nächstes Thema

gotocu

Hallo liebe FHEM-Gemeinde

wie viele betreibe ich FHEM auf einem RaspberryPi 4 mit ZWAVE Dongle. Anstelle der SD-Karte (die mir bisher 4 mal gestorben ist) läuft alles auf einer per USB angeschlossenen SSD. Ich bin nun schon lange in diesem Forum auf der Suche nach der im Betreff beschriebenen Lösung: FHEM + MYSQL + SIGNAL in einem (oder auch mehreren) Docker Containern zu betreiben. Dies wäre eine saubere und vor allem sehr einfach zu portierende Lösung.

FHEM und MYSQL als Container zu betreiben ist einfach und schon vielfach beschrieben. Ich habe auch einige Stunden damit verbracht, habe nun aber eine saubere Lösung, die aus wenigen Schritten besteht und einen gleichzeitigen Umzug von Raspi auf einen NUC ermöglicht (ich hoffe ich helfe damit jemanden):

1. Mach ein Backup von FHEM in den lokalen Ordner /fhem/core/2. Mach ein Backup deiner MySQL/MariaDB mit Hilfe eines Dumps: mysqldump -u fhemuser -p fhem > data-dump.sql3. Erstelle im Ordner /fhem/ eine Datei names docker-compose.yml mit dem folgenden Inhalt:

version: '2'

services:
    fhem:
        restart: always
        ports:
            - "8083:8083"
            - "7072:7072"
        image: fhem/fhem:bullseye
        volumes:
            - ./fhem/core/:/opt/fhem/
            - ./signal/opt/signal/:/opt/signal/
            - ./signal/var/lib/signal-cli/:/var/lib/signal-cli/
        networks:
            - fhem-network
        devices:
            - "/dev/ttyACM0:/dev/ttyACM0"
        environment:
            FHEM_UID: 1000
            FHEM_GID: 1000
            TIMEOUT: 10
            RESTART: 1
            TELNETPORT: 7072
            TZ: Europe/Berlin
        depends_on:
            - "mysql"

    mysql:
        restart: always
        expose:
            - "3306"
            - "33060"
        ports:
            - "3306:3306"
            - "33060:33060"
        image: mysql/mysql-server:5.7
        volumes:
            - ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init.sql
            - ./mysql/data:/var/lib/mysql
        environment:
            - MYSQL_DATABASE=fhem
            - MYSQL_USER=fhemuser
            - MYSQL_PASSWORD=[xxx]
            - MYSQL_ROOT_PASSWORD=[xxx]
            - MYSQL_RANDOM_ROOT_PASSWORD=false
            - MYSQL_ONETIME_PASSWORD=false
        networks:
            - fhem-network

networks:
    fhem-network:
            driver: bridge

4. Erstelle die Datei /fhem/mysql/init.sql mit dem folgenden Inhalt:
CREATE DATABASE `fhem` DEFAULT CHARACTER SET = `utf8`;

CREATE USER 'fhemuser'@'%' IDENTIFIED BY '[XXX]';

REVOKE CREATE ROUTINE, CREATE VIEW, CREATE USER, ALTER, SHOW VIEW, CREATE, ALTER ROUTINE, EVENT, SUPER, INSERT, RELOAD, SELECT, DELETE, FILE, SHOW DATABASES, TRIGGER, SHUTDOWN, REPLICATION CLIENT, GRANT OPTION, PROCESS, REFERENCES, UPDATE, DROP, REPLICATION SLAVE, EXECUTE, LOCK TABLES, CREATE TEMPORARY TABLES, INDEX ON *.* FROM 'fhemuser'@'%';

UPDATE mysql.user SET max_questions = 0, max_updates = 0, max_connections = 0 WHERE User = 'fhemuser' AND Host = '%';

GRANT CREATE ROUTINE, CREATE VIEW, ALTER, SHOW VIEW, CREATE, ALTER ROUTINE, EVENT, INSERT, SELECT, DELETE, TRIGGER, GRANT OPTION, REFERENCES, UPDATE, DROP, EXECUTE, LOCK TABLES, CREATE TEMPORARY TABLES, INDEX ON `fhem`.* TO 'fhemuser'@'%';

USE `fhem`;

CREATE TABLE history (
    TIMESTAMP TIMESTAMP,
    DEVICE varchar(64),
    TYPE varchar(64),
    EVENT varchar(512),
    READING varchar(64),
    VALUE varchar(255),
    UNIT varchar(32),
    KEY `Search_Idx` (`DEVICE`,`READING`,`TIMESTAMP`,`VALUE`),
    KEY `Device_Idx` (`DEVICE`,`READING`),
    KEY `Report_Idx` (`TIMESTAMP`,`READING`) USING BTREE
);

CREATE TABLE current (
    TIMESTAMP TIMESTAMP,
    DEVICE varchar(64),
    TYPE varchar(64),
    EVENT varchar(512),
    READING varchar(64),
    VALUE varchar(255),
    UNIT varchar(32)
);

CREATE TABLE fhemversions (
`VERSION` INT,
`VERSIONUUID` CHAR ( 50 )
);
CREATE TABLE fhemstate (
`stateString` TEXT
);
CREATE TABLE fhemconfig (
`COMMAND` VARCHAR ( 32 ),
`DEVICE` VARCHAR ( 64 ),
`P1` VARCHAR ( 50 ),
`P2` TEXT,
`VERSION` INT,
`VERSIONUUID` CHAR ( 50 )
);
CREATE TABLE fhemb64filesave (
`filename` TEXT,
`content` BLOB
);
CREATE INDEX config_idx ON fhemconfig (
`versionuuid`,
`version`
);

FLUSH PRIVILEGES;
5. Starte den Container mit Hilfe von docker compose up6. Spiele den Dump deiner Datenbank in den Container per mysql -u fhemuser -h [IP_VOM_MYSQL_CONTAINER] -p fhem < backup/data-dump.sql7. SOLLTE LAUFEN!

Jetzt kommt aber mein Problem, das ich auch nach vielen Stunden im Forum nicht lösen konnte (bitte helft mir):

Wie bekomme ich nun signal-cli in diesem Container zum Laufen? Ich schaffe es nicht.




Otto123

Hi,

hast Du einen extra Container versucht? Habe es nie probiert nur nach diesem Ansatz gesucht (Suchbegriff: signal docker).
Gibt es offenbar einige Treffer.

Hintergrund: Container nehmen wie sie sind und nicht modifizieren. Jede Applikation in extra Containern.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

gotocu

#2
Ja hab ich natürlich versucht. Ohne erfolg. Die Einträge sind alle veraltet (laufen ohne Adaption nicht mehr) oder basieren nicht auf offiziellen Images. Es gibt auch ein Image zur Containerisierung mit Signal - jedoch kann Signalbot damit nicht kommunizieren.

"Hintergrund: Container nehmen wie sie sind und nicht modifizieren. Jede Applikation in extra Containern." ← die von mir beschriebene Anleitung macht genau das. Nur offizielle Images ohne Änderungen.

Otto123

Da habe ich wohl zu kurz gedacht, ich dachte es reicht wenn eine signal-cli verfügbar ist und man bringt den Aufruf lediglich von einem Container in den anderen. Aber es sieht wohl doch komplizierter aus.
Es gibt im Wiki zwar ein Script wo alles in einen Docker Container installiert wird, aber auch das ist nicht jedermanns Sache.

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

gotocu

Das Skript im Wiki funktioniert leider auch nicht. Der Entwickler hat im Thread angedeutet dies nur als Test angesehen zu haben und dies nicht weiter warten will.

Frank6320

#5
Hallo,
habt ihr hier Fortschritte erzielt?

Ich habe das docker https://github.com/bbernhard/signal-cli-rest-api?tab=readme-ov-file
beschrieben auch hier:https://forum.fhem.de/index.php?topic=126016.msg1206129#msg1206129
ans laufen gebracht.
Ich verstehe noch nicht wo ich ansetzen muss, damit fhem dann signal kann. Beim define von signalbot kommt nur unvailable

2024.02.10 00:45:05 5: Cmd: >define SignalConnect Signalbot<
2024.02.10 00:45:05 5: Loading ./FHEM/50_Signalbot.pm
2024.02.10 00:45:05 2: SignalConnect Define: SignalConnect Signalbot
2024.02.10 00:45:05 2: Define init_done: SignalConnect Signalbot
2024.02.10 00:45:05 5: SignalConnect: Init: SignalConnect Signalbot
2024.02.10 00:45:05 2: SignalConnect: Init: Please make sure that Protocol::DBus is installed, e.g. by 'sudo cpan install Protocol::DBus'
2024.02.10 00:45:05 5: Starting notify loop for SignalConnect, 1 event(s), first is unavailable

2024.02.10 00:45:05 4: DBLogging - check Device: SignalConnect , Event: state: unavailable
2024.02.10 00:45:05 5: DBLogging - parsed Event: SignalConnect , Event: state: unavailable
2024.02.10 00:45:05 5: End notify loop for SignalConnect
2024.02.10 00:45:05 1: define SignalConnect Signalbot: unavailable

Ich hatte erwartet, dass man das device definiert und dann man ihm sagt, wie zu dem cli kommt.

Otto123

#6
Moin,

ich meine dein Ansatz mit diesem Container und 50_Signalbot.pm wird nicht funktionieren, aber wenn überhaupt kannst Du den Maintainer im richtig Board um Hilfe bitten (help signalbot zeigt den Weg)
Signalbot.pm setzt auf den D-Bus deamon auf:
Zitatprovides an interface to the Signal Messenger, via signal_cli running as dbus daemon
Ob sowas container übergreifen funktionieren kann, weiß ich nicht.

Dein Container liefert aber eine andere API! Falls ich das richtig verstanden habe.
Du kannst sicher mit diesem Container Nachrichten via REST Api versenden. Geht wie in den dortigen Beispielen mit Systembefehlen oder mit FHEM internen Perl Befehlen: https://wiki.fhem.de/wiki/HttpUtils
Könnte auch sein, man kann ein HTTPMOD Device bauen.

Nach kurzer Suche, hätte ich spontan das Gefühl, es wäre einfacher für FHEM im Docker -> Signal per MQTT anzubinden. Dafür gäbe es diesen Container:
https://github.com/git-developer/signal-mqtt

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

cbl

Ich wärme mal das alte Thema auf, da es mich auf den richtigen Weg gebracht hat. Die Integration läuft wunderbar und ist sehr gut dokumentiert auf https://github.com/git-developer/signal-mqtt.

Mir gelingt nur noch nicht der Versand von Nachrichten an eine Signal-Gruppe mit neumodischer ID. Die ist offenbar base64-codiert und solche Strings, in denen Sonderzeichen (bei mir / und =) vorkommen können, akzeptieren MQTT-Broker nicht als Topic. Ich suche also noch einen Weg, wie ich die mir bekannte base64-codierte Gruppen-ID aus Signal als Topic verwenden kann.

Der Versand an einzelne Empfänger funktioniert perfekt und gefühlt sogar schneller als vorher ohne Docker mit Signalbot.


Gruß
Christian

passibe

Ist das das, was hier im GitHub Readme beschrieben wird?
https://github.com/git-developer/signal-mqtt?tab=readme-ov-file#value-encoding
Scheint einfaches URL encoding zu sein, d.h. du musst einfach / mit %2F ersetzen und : mit %3A.

Falls das nicht funktioniert, poste doch hier einfach mal deinen Perl-Code bzw. ein list des jeweiligen Devices (ggfs. natürlich manche Daten unkenntlich machen).

cbl

Zitat von: passibe am 04 April 2025, 00:01:18Ist das das, was hier im GitHub Readme beschrieben wird?
https://github.com/git-developer/signal-mqtt?tab=readme-ov-file#value-encoding
Scheint einfaches URL encoding zu sein, d.h. du musst einfach / mit %2F ersetzen und : mit %3A.

Vielen Dank. Ich hatte in den letzten Tagen offenbar Tomaten auf den Augen (oder es war zu spät am Abend).

Die Seite habe ich mehrfach genau danach durchsucht, weil sie so sauber dokumentiert ist und es mich wunderte, dass diese Info fehlte. Den Absatz über der Tabelle habe ich beflissentlich übersehen.

Natürlich funktioniert das.

Danke für's Augenöffnen.

ch.eick

#10
Hallo zusammen,

ich versuche gerade auch Docker signal-mqtt in Betrieb zu nehmen, die registrierung hat bereits funktioniert.
Leider kann sich signal-mqtt nicht mit dem FHEM container und dem mqtt2 verbinden, was bei anderen Geräten jedoch bereits läuft.
Es kommt die Meldung "Unable to connect (Lookup error.)."

Ich habe so ziemlich alles bereits ausprobiert und verzweifle langsam.

services:
  fhem:
    network_mode: host
    privileged: true       <<<<< Das ist wegen eines alten SMA SmartMeter
< snip>


  signal-mqtt:
    image: ckware/signal-mqtt
#    network_mode: host
#    container_name: signal-mqtt
    restart: unless-stopped
    init: true
    user: "nobody:nogroup"
    environment:
      MQTT_PUBLISH_OPTIONS: "-h broker -i signal-receiver"
      MQTT_SUBSCRIBE_OPTIONS: "-h broker -i signal-sender"
      MQTT_BROKER: "tcp://192.168.178.60:1883"
    volumes:
      - "./signal-mqtt:/home/.local/share/signal-cli"

Netztest
ce@raspberrypi:/docker/fhem_2025 $ sudo docker run -it --rm -v /docker/fhem_2025/signal-mqtt:/home/.local/share/signal-cli ckware/signal-mqtt /bin/sh
/ # ping 192.168.178.60
PING 192.168.178.60 (192.168.178.60): 56 data bytes
64 bytes from 192.168.178.60: seq=0 ttl=64 time=0.087 ms
64 bytes from 192.168.178.60: seq=1 ttl=64 time=0.057 ms
64 bytes from 192.168.178.60: seq=2 ttl=64 time=0.056 ms
^C
--- 192.168.178.60 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.056/0.066/0.087 ms

VG  Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Sidey

Zitat von: ch.eick am 12 Januar 2026, 19:10:43services:
  fhem:
    network_mode: host

Naja, Du hast den Service "fhem" auf das Netzwerk von deinem host gesetzt.


https://docs.docker.com/reference/compose-file/services/#network_mode

Der Service singal-mqtt liegt in einem Standard Netzwerk weil keines konfiguriert ist:
https://docs.docker.com/reference/compose-file/services/#implicit-default-network

Container die untereinander kommunizieren sollen, sollten in ein gemeinsames Netzwerk gesteckt werden.
https://docs.docker.com/reference/compose-file/services/#networks

Wieso hast Du für den service fhem denn "network_mode: host" eingestellt?

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

ch.eick

Das mit "network host" ist für die Verbindung zum alten SMA SmartMeter notwendig, das die ein altes Windows Protokoll verwenden, was ansonsten nicht mit Docker funktioniert.

Meine Shellys, die openWB Wallboxen und auch andere Container können das FHEM MQTT2 problemlos erreichen

  zigbee2mqtt:
    image: koenkk/zigbee2mqtt:latest
    volumes:
      - ./zigbee2mqtt/data:/app/data
      - /run/udev:/run/udev:ro
    devices:
#      - /dev/ttyACM0:/dev/ttyACM0
      - /dev/serial/by-id/usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B001CD4A620-if00:/dev/ttyACM0
    restart: always
    ports:
        - '8084:8080'
    privileged: true
    environment:
      - TZ=Europe/Berlin

  sonos:
    image: ghcr.io/svrooij/sonos2mqtt
    # or the dockerhub svrooij/sonos2mqtt
    restart: unless-stopped
    ports:
      - "6329:6329"
    environment:
      - SONOS2MQTT_DEVICE=192.168.178.36 # Service discovery doesn't work very well inside docker, so start with one device.
      - SONOS2MQTT_MQTT=mqtt://192.168.178.60:1883 # mqtt2_server FHEM
      # - SONOS2MQTT_DISTINCT=true # if your want distinct topics
      - SONOS_LISTENER_HOST=192.168.178.60 # Docker host IP
      # - SONOS_TTS_ENDPOINT=http://sonos-tts:5601/api/generate # If you deployed the TTS with the same docker-compose
    depends_on:
      - "fhem"
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Ich habe mal zwei Optionen aus der .yaml raus genommen

#      MQTT_PUBLISH_OPTIONS: "-h broker -i signal-receiver"
#      MQTT_SUBSCRIBE_OPTIONS: "-h broker -i signal-sender"
Dann kommt eine andere Meldung :-)
signal-mqtt - Start
/usr/local/bin/signal-mqtt: line 114: MQTT_SUBSCRIBE_OPTIONS: parameter not set
Error: Connection refused
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hier sieht man schön die Docker Container und die anderen Geräte
MQTT2_FHEM_Server
MQTT2_FHEM_Server_172.18.0.2_45856
MQTT2_FHEM_Server_172.18.0.3_55824
MQTT2_FHEM_Server_172.18.0.6_53184
MQTT2_FHEM_Server_172.18.0.9_39772
MQTT2_FHEM_Server_192.168.178.50_57589
MQTT2_FHEM_Server_192.168.178.51_52860
MQTT2_FHEM_Server_192.168.178.53_51770
MQTT2_FHEM_Server_192.168.178.54_50525
MQTT2_FHEM_Server_192.168.178.56_6908
MQTT2_FHEM_Server_192.168.178.67_58866
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick