Neues Modul: Signalbot (Integration für den Signal Messenger) via signal-cli

Begonnen von Adimarantis, 31 Januar 2021, 19:16:19

Vorheriges Thema - Nächstes Thema

Adimarantis

@weini und andere Interessierte:

Ich hab mir mal deine Idee von vor einer Weile mit dem GoogleAuth angeschaut.

Folgendes hab ich jetzt mal eingebaut (noch nicht ganz fertig, aber mal zum Diskutieren vom Konzept):

Attribute: commandKeyword, authTimeout und authDev (wird automatisch mit vorhandener GoogleAuth device gesetzt).

Beispiel commandKeyword: =
Man sendet dann =<authtoken>
Wenn korrekt, dann ist der aktuelle Sender für authTimeout Sekunden berechtigt Befehle zu senden - ebenfalls mit "=" am Anfang - ein Token im Befehl wird in diesem Zeitraum nicht benötigt. Die Berechtigung erlischt automatisch nach diesem Zeitraum. Kann auch von mehreren Nutzern (individueller Zeitraum) genutzt werden.
Eventuelle Rückmeldungen/Fehler bzw. eine Bestätigung geht per PM an den Absender.

Eine Einschränkung der Befehle oder zusätzliche Beschränkung des Absenders habe ich jetzt nicht eingebaut - braucht man das?

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

enno

Zitat von: Adimarantis am 19 Februar 2021, 21:40:53
die Zeilenumbrüche gehen doch jetzt schon ganz normal mit "\n", oder was meinst du?
ok, das hatte ich überlesen und falsch getestet: "\n" in DOIF klappt. Erledigt!

Zum Readingsgroup: Ich habe z.B, ein Readingsgroup, das mir alle Batterien anzeigt (https://wiki.fhem.de/wiki/ReadingsGroup#Auswahl_.C3.BCber_Reading-Namen.2C_Status_als_Symbol_dargestellt)
Dieses "Bild" würde ich gerne einfach so per Signal schicken ;) Das scheint aber nicht so einfach machbar zu sein. Das Thema wurde auch schon mal im Forum kurz in Verbindung mit Telegram angefragt: https://forum.fhem.de/index.php?topic=81826.0

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

Adimarantis

Hi Enno,

Kurz mal geschaut, da bräuchte man dann tatsächlich einen HTML -> JPEG Konverter. Der in den Threads referenzierte wird nicht mehr unterstützt. Signal selbst unterstützt auch kein HTML. Letztendlich wäre das eine Sache für ein Extra Modul, welches man dann wie die SVG's mit dem &() Syntax aufruft. Das gehört m.E. nicht individuell in ein Modul eingebaut sondern als generische Funktionalität extra. In der Hauptsache müsste man dazu einen "headless" Browser oder Service finden. Hab auf die Schnelle da sogar im Internet Services gefunden, die scheinen aber zumindest teilweise kostenpflichtig zu sein und man dann nie weiß wie lange es die gibt und ob sich die API ändert. Das nächste Problem ist, das z.B. bei deinen Batterien Verweise auf Bilder/Icons enthalten sind. Die müsste man bei einem Webservice mitschicken - also ggf. ein zip hochladen. Du siehst, das führt ziemlich weit.

Ich fände so eine Übersicht ohnehin unübersichtlich am Handy. Für meine zig Homematic Geräte habe ich das einfach so in einem DOIF gelöst:
([SignalBot:msgText] eq "Status") (
{ my $group = "[SignalBot:msgGroupName]";
  my $reply = "@"."[SignalBot:msgSender]";
  if ($group ne "") {
    $reply="#$group";
  }
  my $text= "Batterie: [d_ccu:battery_list],[d_ccu:voltage_list] \nOffen:[d_ccu:lock_list] \nNicht erreichbar: [d_ccu:unreach_list]";
  fhem "set SignalBot send $reply $text";
})


Einfach kompakt die Liste der Problemgeräte.

Gruß,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Sany

Hallo Jörg,

vielen Dank für Dein Modul und Script zum SignalBot. Habe es nach Wiki installiert, lief problemlos durch (Debian Buster auf Zotac MiniPC). Registrierung auf eine Festnetznummer per voice.
Nun bin ich dabei, meine fhem-messages von Telegram auf Signal umzuziehen. Signal kann ja leider kein fett, kursiv, code etc, aber damit kann ich leben und es scheint bei Signal auf der Todo-list zu stehen. Was ich gerne nutze sind die Smilies/Emojys, wie bei https://wiki.fhem.de/wiki/TelegramBot#Versand_von_Emojis_.28Smileys.29 beschrieben. Das klappt auch, also die empfangenen Messages haben die Smilies dabei, es gibt aber eine Perlwarning:
PERL WARNING: Wide character in print at fhem.pl line 1000.
Da muss irgendwie dem Teil, der das Smilie transportiert/druckt mitgeteilt werden, dass es ein utf8 codiertes Zeichen ist. Vielleicht kannst Du da ja etwas erreichen, damit die Warning nicht mehr kommt.
Weiterhin bekomme ich im Log bei jedem Versand so etwas:
2021.02.21 15:06:01.625 3: mySignalBot: Before parse:\@Empfaenger Text:
Empfaenger und Text je nach message.
Ist das nur eine Anzeige im Log, dass etwas verschickt wurde?
Edit: gerade getestet, wird bei verbose 2 nicht mehr ausgegeben.

Nochmal vielen Dank. Bis jetzt kann SignalBot alles, was ich brauche. Nutze es eigentlich nur, damit fhem mir verschiedene Mitteilungen macht, und da Abfragen recht simpel sind werde ich mir da ein paar einbauen (Statusbericht oder Spritpreis z.B., das spart dann unterwegs den VPN anwerfen und die Oberfläche starten).

Gruß

Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

sinus61

Ich habe auch für die Meldungen die per Signal kommen meist ein Emoji dabei. Die schicke ich mir vorher aus Signal an Fhem, kopiere die dann da und füge sie direkt in meine Notifys ein. Eine Fehlermeldung sehe ich da nicht in Log.

Für Textformatierung kann man als Workaround z.B. https://yaytext.com nehmen. Text dort einfügen und in der gewünschten Formatierung ins Notify übernehmen. Allerdings wird sowas wie [Device:Reading] nicht mehr erkannt.

Adimarantis

Also ich bekomme die
PERL WARNING: Wide character in print at fhem.pl line 992.

erstens nur einmalig und zweitens nur wenn das logging  eingeschaltet ist (verbose=3+) und FHEM entsprechend versucht die Smileys ins Log zu schreiben (was trotzdem klappt)
@sinus61: Klasse Tipp mit dem https://yaytext.com/ - da kriegt man wirklich so ziemlich alles dargestellt was man möchte, obwohl Signal das native (noch) nicht kann.

Da kann man denke ich nicht viel machen.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Testversion mit GoogleAuth

Wer mag, bitte mal probieren.
Vorrausetzung ist ein GoogleAuth device und entsprechend aktivierter App wie hier beschrieben: https://forum.fhem.de/index.php?topic=64791.0

Im Signalbot sind dann folgende Attribute zu definieren:
cmdKeyword = Zeichen oder Zeichenkette die einen Befehl einleitet - in meinem Beispiel hier das "=" Zeichen
authTimeout = Anzahl der Sekunden die eine Authentifizierung Gültigkeit behalten soll
authDev = der Name der GoogleAuth Device. Wird automatisch beim Setzen von "authTimeout" auf die erste gefundene Device vom Typ "GoogleAuth" gesetzt

Jetzt einfach das 6-stellige Token aus der Google Authenticator App kopieren und
=123456
senden. Sofern alles ok ist bekommt man die Bestätigung das man jetzt für xx Sekunden Zugriff hat.
alternativ kann man auch gleich den ersten Befehl senden
=123456 set Lampe1 aus
Solange der "Countdown" läuft werden jetzt beliebige Befehle mit
=set Lampe1 an
akzeptiert.

Die Befehle triggern keine Events und tauchen auch nicht in der Message History auf. Vielleicht sollte ich hier noch ein Reading "lastCommand" befüllen. Das kann ja dann ruhig triggern da andere Notifys wohl eher auf "msgText" horchen werden.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

weini

Zitat von: Adimarantis am 20 Februar 2021, 00:18:48
Eine Einschränkung der Befehle oder zusätzliche Beschränkung des Absenders habe ich jetzt nicht eingebaut - braucht man das?

Erst mal finde ich es super cool, dass du die Idee aufgegriffen hast. 1000 Dank dir!

Ja, das macht aus meiner Sicht viel vom Mehrwert aus:

  • einfache Sachen wie Temperaturen abfragen will ich komfortabel haben
  • für sensible Dinge wie Rollos hoch oder Türe auf wünscht ich mir die zusätzliche Sicherheit, da kommt GoogleAuth ins Spiel

Aus meiner Sicht ist eine Whitelist (welche Befehle dürfen ohne GoogleAuth laufen) besser als eine Blacklist.
Ich sehe schon, ich muss jetzt endlich mal testen. Ich versuche, im Verlauf der Woche zu starten und gebe dann Rückmeldung.

LG, weini

Sany

ZitatAlso ich bekomme die
Code: [Auswählen]
PERL WARNING: Wide character in print at fhem.pl line 992.
erstens nur einmalig und zweitens nur wenn das logging  eingeschaltet ist (verbose=3+) und FHEM entsprechend versucht die Smileys ins Log zu schreiben (was trotzdem klappt)
@sinus61: Klasse Tipp mit dem https://yaytext.com/ - da kriegt man wirklich so ziemlich alles dargestellt was man möchte, obwohl Signal das native (noch) nicht kann.

Da kann man denke ich nicht viel machen.

Hallo Jörg,
danke für die Antwort. Ich habe die Warnmeldung auch nur bei verbose 3 oder höher. Habs jetzt auf 2 gestellt, das tut es so für mich.

Jetzt bin ich gerade am kämpfen mit der Einrichtung einer Gruppe (XYZ). Habe 2 Handys mit eigenem Signal und die Instanz auf fhem (heißt hier fhem). Wenn ich es richtig verstehe starte ich die Gruppeneinrichtung von fhem aus. Die anderen Teilnehmer müssen dann die Einladung annehmen. Korrekt bis hier?
Leider kommt bei einem Handy (iOS) da eine Meldung, die mir nicht weiterhilft:
Error in invite:org.asamk.Signal.Error.Failure: Cannot join a V2 group as self does not have a versioned profile
(also der Fehler wird in fhem angezeigt, nach schicken des invite)

Wenn ich dann an die Gruppe (fhem + 1 Handy) etwas schicke kommt:
Error sending message:org.asamk.Signal.Error.GroupNotFound: User is not a member in group: XYZ (Zahlen/Buchstabensalat passwort/Kennung??)

Schaue ich im Handy, welches sich verbinden ließ, die Gruppeninfo an, bekomme ich:
Zitatfhem hat die Gruppe aktualisiert
fhem ist der Gruppe beigetreten
Gruppenname lautet jetzt "XYZ"

Diese Gruppe wurde auf eine Gruppe neuen Typs aktualisiert

Ein Mitglied konnte der Gruppe neuen Typs nicht hinzugefügt werden und wurde daher eingeladen, beizutreten.
(Mehr erfahren): u.a. dieses Mitglied muss eine Einladung zum erneuten Gruppenbeitritt annehmen und wird bis dahin keine Gruppennachrichten erhalten:
fhem

Beim iOS-Handy könnte es evtl. an einer Einstellung liegen, da muss ich mal schauen (habs nicht so mit äpple), aber bei den andern Problemen komme ich nicht weiter.
Die Fehlersuche im Wiki habe ich mal angeschaut und durchgearbeitet, aber die Fehler bei mir äußern sich ja etwas anders, die Dateien sind jeweils nur einmal vorhanden im Zusammenhang mit signal-Verzeichnissen. Das Installscript habe ich nochmals laufen lassen, (bis auf die Regisitrierung): alle Punkte sind erfolgreich und am Ende erhalte ich die 3 Messages.

Was kann ich tun?

Danke schon mal.

Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Adimarantis

Hi Sany,

erstmal ein wenig Theorie:
Signal hat vor eine Weile so genannte "V2" Gruppen eingeführt. Da wurde wohl einiges an Funktionalität verbessert. Um mit diesen Gruppen zu arbeiten, braucht man zwingend eine native library (libzkgroup.so). Ohne diese, findet ein Fallback auf V1 Gruppen statt.
Gruppen müssen nicht zwingend aus Signalbot erstellt werden. Man kann "fhem" auch ganz normal in eine Gruppe einladen.

Was bei dir jetzt passiert ist: Dein System findet die library nicht und macht daher nur V1 Gruppen. Diese konntest du auch Erstellen und Leute einladen. Nur als diese neuen Mitglieder beigetreten sind, wurde die Gruppe in V2 umgewandelt und da dein System das nicht kann, fliegst du raus.

Fazit: Die Suche geht weiter, warum findet dein System die Library nicht? Hast du auch schon mit dem neusten Installscript auf signal-cli 0.8.0 upgegradet? Ab dann gibt es nämlich sogar zwei libraries und dann geht ohne gar nichts mehr - da wundert mich nämlich warum du nur GroupV2 Probleme hat.
Was für ein System hast du? (Betriebssystem. Architektur?)

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Zitat von: weini am 21 Februar 2021, 21:05:19
  • einfache Sachen wie Temperaturen abfragen will ich komfortabel haben

Um sowas komfortabel zu haben, würde ich halt mit Notify/DOIF arbeiten und spezifische Befehle anbieten. Über "allowedPeer" findet hier ja eine grundsätzliche Einschränkung statt. Mit GoogleAuth ist es halt so eine Art Administratorzugang.
Freie FHEM Befehle - auch mit einer Einschränkung über eine Whitelist - ohne Absicherung anzubieten halte ich jetzt grundsätzlich für bedenklich.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

weini

Also die Einschränkung via allowedPeer soll natürlich immer greifen.

Wenn GoogleAuth konfiguriert ist, dann solle der Standard sein, dass ein Token übergeben werden muss.
Über eine GoogleAuth Whitelist könnte man aber Befehle definieren, für die kein GoogleAuth Token notwendig ist.

PS: Meine grundsätzliche Installation läuft übrigens, jetzt geht es ans Ausprobieren und Feinschleifen....

Sany

ZitatFazit: Die Suche geht weiter, warum findet dein System die Library nicht? Hast du auch schon mit dem neusten Installscript auf signal-cli 0.8.0 upgegradet? Ab dann gibt es nämlich sogar zwei libraries und dann geht ohne gar nichts mehr - da wundert mich nämlich warum du nur GroupV2 Probleme hat.
Was für ein System hast du? (Betriebssystem. Architektur?)

Hallo Jörg,
ich habe das vorgestern zum ersten Mal installiert, dazu vorher das system upgedated (Debian Buster auf x86 Zotac MiniPC) und die Dateien vom Forum frisch heruntergeladen, also Script-Version 1.5.

Schon mal Danke für die Theoriestunde, dann erklärt sich das Verhalten ja.

Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Adimarantis

Hi Sany,

kannst du mal den /opt/signal Ordner löschen und die Installation nochmal machen.
Dann bitte das /tmp/signal_install.log und die Bildschirmausgabe posten (Telefonnummern vorher unkenntlich machen).
Aktuell kann ich mir nur noch vorstellen, das mein Script dein System versehentlich als Raspberry identifiziert und diese Libraries installiert - was dann unter X86 nicht mehr funktioniert.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Sany

Zitatkannst du mal den /opt/signal Ordner löschen und die Installation nochmal machen.
Dann bitte das /tmp/signal_install.log und die Bildschirmausgabe posten (Telefonnummern vorher unkenntlich machen).

die Bildschirmausgabe:
This script will help you to install signal-cli as system dbus service
and prepare the use of the FHEM Signalbot module

Please verify that these settigns are correct:
Signal-cli User:              signal-cli
Signal-cli Install directory: /opt
Signal config storage:        /var/lib/signal-cli
Signal version:               0.8.0
System library path:          /usr/lib
Phone number to be used:      +49yyyyyy
Your configuration
Linux ZotacFHEM 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64 GNU/Linux
has not been tested, continue at own risk
This will update system packages, install signal-cli and help to register with Signal service

To do this rather step by step use the command line arguments or just proceed to do system,install,register:
system   : prepare required system package (except signal-cli) - make sure you ran this before you do anything else!
install  : install signal-cli and setup as dbus system service
register : register a NEW number with Signal
link     : link an EXISTING number with Signal (e.g. you Smartphone)
test     : run a basic test if everything is installed and registered correctly
remove   : Remove signal-cli and all configurations (will be archived)
join     : Join current number to an existing group (invite by group link)
name     : set or change Signal user name and/or avatar picture
start    : Start the signal-cli service (or respective docker processes)

!!! Everything needs to run with sudo/root !!!

Proceed (Y/n)? y
Checking for /usr/lib...found
Checking for /etc/dbus-1...found
Checking for /etc/dbus-1/system.d...found
Checking for /usr/share/dbus-1...found
Checking for /usr/share/dbus-1/system-services...found
Checking for /etc/systemd/system...found
Checking for /run/dbus...found
Checking for apt-ftparchive...available
Checking for wget...available
Checking for sudo...available
Checking for haveged...available
Checking for java...available
Checking for diff...available
Checking for dbus-send...available
Checking for cpan...available
Checking for qrencode...available
Checking for pkg-config...available
Checking for gcc...available
Checking for zip...available
Checking for /usr/include/dbus-1.0/dbus/dbus.h...available
Checking for /usr/share/perl5/Test/CPAN/Changes.pm...available
Checking for /usr/include/expat.h...available
Checking for /usr/share/doc-base/libxml-parser-perl...available
Checking for /usr/share/doc/libtemplate-perl...available
Checking for /usr/share/doc/libxml-xpath-perl...available
Checking for /usr/share/build-essential/essential-packages-list...available
Checking for /usr/share/doc/libxml-twig-perl...available
Checking for /usr/share/doc/libimage-librsvg-perl...available
Checking for Net::DBus...V1.2.0 found
Checking user signal-cli ...found
Checking for /opt...found
Checking for /var/lib/signal-cli...found
Checking for existing signal-cli installation...not found
Proceed with signal cli installation
Downloading signal-cli 0.8.0...done
Unpacking ...
done
Changing file ownership ...done
Checking for /etc/dbus-1/system.d/org.asamk.Signal.conf...found
Checking for /usr/share/dbus-1/system-services/org.asamk.Signal.service...found
Checking for /etc/systemd/system/signal.service...found
Your device +49yyyyyyyy is already configured, do want to run through registration again?
Continue (y) or skip (N)?n
Please enter the number (+49...) of somebody that you can send a test message to
Number:+49xxxxxxx
Sending a message from command line to +49xxxxxx
Stopping signal-cli service
If you get a 'in use, waiting' message, skip by pressing CTRL-C - this is normal when system service is already up and running
1613983968341
Start signal-cli service
Sending a message via dbus-send command
method return time=1613983980.192610 sender=:1.82 -> destination=:1.83 serial=7 reply_serial=2
   int64 1613983978861
Sending a message via perl Net::DBus
return timestamp:1613983980678
If the recipient got all three messages, your setup looks healthy and you're ready to go to set up Signalbot in FHEM


und das log:
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"


wie gesagt, script läuft ohne Fehlermeldungen durch.

Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....