Umzug von Telegram auf Signal über MQTT.

Begonnen von tomleitner, 27 August 2024, 17:15:53

Vorheriges Thema - Nächstes Thema

tomleitner

Hallo,

Ich wollte aus bekannten Gründen endlich Telegram loswerden und auf Signal umziehen. Allerdings wollte ich nicht zusätzlich auf meinem FHEM Server noch weitere Software installieren und den SignalBot von FHEM benutzen und mir dependencies einfangen etc. Ich habe die meisten Interfaces zu anderen Systemen (noch ein paar alte ZWAVE Devices etc) auf eigene LXC Container ausgelagert die in einer Proxmox Umgebung laufen. Bin sehr zufrieden damit. Irgendwann ziehe ich FHEM auch auf einen Proxmox Container um.

Anforderungen für den Umzug von Telegram auf Signal also waren:

  • Einfach Messages schicken mit "set Signal message xyz"
  • Befehle empfangen und im FHEM drauf reagieren
  • Images schicken von Kameras

Daher war meine Vorgangsweise wie folgt:

  • signal-cli in einem LXC Container unter Proxmox installieren und zum Laufen bringen laut signal-cli Dokumentation. Interface nach aussen sollte MQTT und JSON-RPC sein.
  • Einfache Scripts auf dem Signal LXC container setzen JSON-RPC in MQTT um.
  • In FHEM wird das Ganze über ein MQTT Device bedient.

Hier die Scripts zum Umsetzen von JSON-RPC auf MQTT. Von Signal empfangene JSON Messages landen im topic signal/event und Kommandos an Signal sollen über signal/command topics abgesetzt werden. Dazu zwei unterschiedliche Scripts:

mqtt-receive.sh - empfängt MQTT commands und schickst sie per JSON-RPC weiter:
#!/bin/sh
BROKER=192.168.x.y
while true ; do
    mosquitto_sub -h $BROKER -t 'signal/command' |  nc -q 1 localhost 7583
    sleep 5
done

mqtt-send.sh - empfängt JSON status messages und schickt sie per MQTT weiter:
#!/bin/sh
BROKER=192.168.x.y
while true ; do
    nc localhost 7583 | while read m ; do mosquitto_pub -h $BROKER -t 'signal/event' -m "$m" ; done
    sleep 5
done

Diese Scripts müssen immer im Hintergrund laufen. Ich erledige das mit einem Cronjob der jede Minute läuft und schaut ob das Script läuft und es ggf. startet:

#!/bin/sh
cd /home/signal/mqtt-bridge
pidof -x mqtt-receive.sh >/dev/null
if [ $? -ne 0 ]; then
    nohup ./mqtt-receive.sh </dev/null >/dev/null 2>&1 &
    echo mqtt-receive.sh started
fi
pidof -x mqtt-send.sh >/dev/null
if [ $? -ne 0 ]; then
    nohup ./mqtt-send.sh </dev/null >/dev/null 2>&1 &
    echo mqtt-send.sh started
fi

Das Ganze dann im FHEM mit folgendem Device empfangen:

defmod Signal MQTT2_DEVICE signal
attr Signal IODev MQTT_Client
attr Signal icon signal_messenger
attr Signal readingList signal/event:.* { json2nameValue($EVENT) }
attr Signal setList message { $EVENT =~ s/^\s*\S+\s*//;; "signal/command " .  '{"jsonrpc":"2.0","method":"send","params":{"recipient":["+49NUMMER"],"message":"' .  $EVENT . '"},"id":4}' }
attr Signal stateFormat msg
attr Signal userReadings msg:params_envelope_dataMessage_message.* { ReadingsVal("Signal", "params_envelope_dataMessage_message", "") }\

Somit kann man dann mit "set Signal message xyz" eine Message xyz absetzen. Gleich wie früher mit dem Telegram Bot.

Nun für Images noch ein kleines Script:

sendimage.sh - schicke das Image File im Parameter 1 mit Zusatztext im Parameter 2:
#!/bin/sh
mimetype=$(file -bN --mime-type "$1")
content=$(base64 -w0 < "$1")
m="{\"jsonrpc\":\"2.0\",\"method\":\"send\",\"params\":{\"recipient\":[\"+49NUMMER\"],\"message\":\"$2\",\"attachment\":\"data:$mimetype;base64,$content\"},\"id\":4}"
echo "${m}" | mosquitto_pub -t signal/command -l

NUMMER natürlich mit eurer Handynummer ersetzen.

Ich hoffe das hilft dem einen oder anderen.

Grüße // Tom