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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz