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

darkness

Ok, hat sich erledigt. Jetzt läuft alles. Es lag letztendlich an Berechtigungsproblemen.

Adimarantis

Hallo zusammen.

Nachdem ich über den Sommer ein großes "nicht-IT" Projekt realisiert habe, bin ich jetzt wieder dran am Signabot weiterzuentwickeln.
Daher möchte ich mal kurz einen Ausblick geben, was gerade geplant ist:

Eine aktuelle Änderung in signal-cli (die der Autor dankenswerterweise auf meine Anregung aufgenommen hat) wird wohl ab Version 0.8.6 ermöglichen den Service ohne vorherige Registrierung einer Nummer zu starten. D.h. das Installationsscript kann dahingehend vereinfacht werden, dass es eine "blanke" signal-cli Installation zur Verfügung stellt und alles weitere (Nummern linken oder registrieren) aus FHEM heraus geht. Dies ist für mich ein entscheidender Schritt um SignalBot später ins automatische Update aufzunehmen. Hierbei ist es dann auch möglich zwischen mehreren Nummern zu wechseln (vielleicht um auf einer Nummer mitzuhören und eine andere zum Senden zu verwenden).

Meine aktuelle Beta-Version kann schon zwischen Nummern wechseln und auch einen QR Code anzeigen um FHEM zu einer bestehenden Signal App auf dem Smartphone dazuzulinken.
Ein großes Problem ist wie schon im Script, dass die feste Registrierung ein Captcha erfordert. Hier habe ich nach wie vor keinen guten Weg gefunden das Token automatisiert auszulesen (da braucht man wohl einen handler im Browser der auf "signalcapcha://" hört. Wer da Ahnung hat bitte melden.
Sonst wird es wohl darauf rauslaufen, dass ich den Link zum Captcha zwar zum Anklicken anzeigen kann, man aber nach wie vor gleich umständlich das Token suchen und per Copy&Paste einfügen muss. Immerhin kann der Anwender etwas schöner durch die Prozedur geführt werden, als im Script.

Die signal-cli API unterstützt inzwischen noch ein paar weitere Aktionen wie das Löschen von Nachrichten und schicken on "Reactions" (also z.B. eine empfangene Nachricht mit "Daumen hoch" zu markieren) aber da sehe ich eigentlich keinen sinnvollen Anwendungsfall in FHEM - korrigiert mich wenn ich da falsch liege - und plane nicht das einzubauen.

Ich hoffe ich kriege die Änderungen einigermassen Rückwärtskompatibel hin.
Möglicherweise werde ich aber die neuste signal-cli Version "erzwingen" müssen und man muss ggf. einmalig nach dem Update die korrekte Nummer in FHEM definieren (nicht neu registrieren).

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)

dkreutz

Zitat von: Adimarantis am 29 August 2021, 23:26:39
Ein großes Problem ist wie schon im Script, dass die feste Registrierung ein Captcha erfordert. Hier habe ich nach wie vor keinen guten Weg gefunden das Token automatisiert auszulesen (da braucht man wohl einen handler im Browser der auf "signalcapcha://" hört. Wer da Ahnung hat bitte melden.

Ich habe mal etwas ähnliches (Token auslesen, 2FA automatisieren) experimentell für den Amazon-Music Login geskriptet und dafür Selenium/Webdriver verwendet.
Das war allerdings in Python, ob und wie ein Perl-Support vorhanden is, habe ich nicht recherchiert.
Das ganze ist/war aber ziemlich hakelig (sobald es eine Änderung auf der Webseite gibt, muss man sein Skripting wieder anpassen) und der Installationsaufwand für Selenium/Webdriver für ein FHEM-Modul dürfte auch nicht unerheblich sein.
Raspberry Pi3B+ (Bullseye) / JeeLink868v3c (LaCrosse), nanoCUL433 (a-culfw V1.24.02), HM-MOD-UART (1.4.1), TEK603, MapleCUL / diverse Sensoren/Sender/Aktoren von Technoline, Intertechno, Shelly, Homematic und MAX!, Froggit Wetterstation, Luftdaten.info / Autor des fhem-skill für Mycroft.ai

Adimarantis

Ich habe mithilfe des signal-cli Forums tatsächlich eine Lösung für Windows gefunden. Der Plan ist dynamisch eine Registry Datei zur Verfügung zu stellen mit der das dann vollautomatisch abläuft.
Für Linux muss es da auch was geben (Stichwort xdg-utils) aber da muss ich noch mal stöbern.

Hier schon mal ein Preview wie das aussehen kann.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Hallo,

das angekündigte Update ist quasi fertig. Es müsste nur noch besser getestet werden.
Das Problem dabei ist, dass die signal-cli Version die dazu nötig ist, derzeit noch nicht released ist und mein Pull Request auf GitHub schon eine Weile auf approval wartet.
Wenn jemand ganz viel Lust hat das Ganze mal auf Herz und Nieren zu testen, könnte ich meine Version (für Raspberry Pi, wenn nötig auch für Ubuntu/Debian X86) zusammenzippen und zur Verfügung stellen.
Bei Interesse per PM melden.

Sobald die nächste signal-cli version (hoffentlich inklusive meiner Patches) released ist, können wir in die öffentliche Beta gehen.

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

fz55

Hallo Adimarantis,

vielen Dank für dieses Modul.

Nachdem das Modul SiSi Ende August bei  mir plötzlich nicht mehr funktionierte, bin ich auf Signalbot (inklusive Neuregistrierung) umgestiegen. Probleme hatte ich nur beim Auslesen des Captchas mit meinem Standardbrowser Firefox - mit Edge hat es aber funktioniert.

In meiner Automation benutzte ich häufig den FHEM-Befehl msg, um Signal-Nachrichten zu versenden. Mit Signalbot ist dies zur Zeit nicht möglich. Deshalb meine Bitte: Könntest du parallel zu "set Signalbor send" auch "set Signabot msg" einpflegen, damit msg weiterhin benutzt werden kann. Ich habe es so bei mir umgesetzt:


27a28
>   "msg" => "textField",
131c132
<       if ( $cmd ne "send") {
---
>       if ( $cmd ne "send" and $cmd ne "msg") {
207c208
<       } elsif ( $cmd eq "send") {
---
>       } elsif ( $cmd eq "send" || $cmd eq "msg") {



Vielen Dank

Adimarantis

Mal sehen, ich möchte eigentlich die "set" Liste möglichst kurz halten und das "msg" wäre eben ein redundanter Eintrag.
Ich weiss, Telegrambot hat z.B. eine ganze Liste solcher "Aliase". Ich hatte mich eben beim Erstellen des Moduls auf "send" festgelegt.

Grundsätzlich liesse sich hier eine bestehenden Automatisierung per find&replace im fhem.cfg (msg->send) ja recht schnell umstellen.

Findet die Einführung von "msg" als alias für "send" noch weitere Unterstützer? Am Besten einfach den Beitrag "hochvoten" - das ist übersichtlicher als lauter Antworten.

Ich warte aber ohnehin noch das die neue signal-cli Version veröffentlicht wird. Vorher werde ich kein Update machen.
Mit der neuen Version wird das mit den Captchas dann übrigens einfacher. Ich habe inzwischen eine Automatisierung wenn der Browser unter Windows läuft und für Linux zumindest für den Firefox.

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

Flachzange

Ich beschäftige mich jetzt zum ersten Mal mit dem msg-Framework und wollte auch primär Signalbot nutzen (dessen Einrichtung prima geklappt hat). Vielleicht täuche ich mich, aber aus meiner Sicht braucht es keine Unterstützung für msg, da ich einfach  msgCmdPush entsprechend mit "send" setze:

attr globalMsg msgCmdPush set %DEVICE% send @%RECIPIENT% %MSG%

Erstmal nur stumpf adaptiert. Aber wie gesagt, lasse mich hier als Newbie auch gerne eines besseren belehren.

fz55

Flachzanges Lösungsvorschlag funktioniert!! Wieder etwas gelernt. Besten Dank.

Flachzange

Ich bin mir nicht sicher, ob es vielleicht zu OffTopic ist, aber ich denke schon, dass es eine Spezialiät von Signalbot. Ich möchte gerne über msg eine Nachricht an alle Hausbewohner schicken. Die Nachricht soll aber nicht einzeln an jeden geschickt werden, sondern an eine Signal-Gruppe, in der alle drin sind. FHEM ist bereits Teildieser Gruppe und ich kann Nachrichten an diese Gruppe schicken.

Wie kann ich nun über

Zitatmsg @Hausbewohner Hier Text

die Nachricht in genau diese Gruppe schicken ohne dass ich die Gruppe msg-Befehl direkt erwähne?

Ich habe es bereits versucht mit

Zitatattr Hausbewohner msgContactPush Signalbot:#"Smart Home"

Hausbewohner ist das RESIDENTS device
Signalbot ist das Signalbot Device
"Smart Home" ist die entsprechende Signal-Gruppe.

Danke!

Adimarantis

Hilft das vielleicht:

Setze das Attribut defaultPeer auf #gruppenname

Dann kannst du ein "send" ohne weitere Angaben (nur mit dem Nachrichtentext) machen und es landet in der entsprechenden Gruppe.

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)

Flachzange

Danke für die schnelle Antwort. Das funktioniert und ist sicherlich ein Workaround geht dann aber leider auch am msg-Konzept vorbei. Der für mich entscheidende Punkt ist, wie msg mit Signalbot interagiert und bei Gruppen scheint das irgendwie zu haken bzw. ich habe ich noch nicht verstanden, wie es funktioniert. Für Einzelempfänger funktioniert es mit

attr globalMsg msgContactPush Signalbot:+49175xxxxxx

Adimarantis

Hab mich mit dem "msg" Modul jetzt noch kaum beschäftigt, aber es schaut mir nicht so aus als ob da eine Unterscheidung für Einzelempfänger und Gruppen vorgesehen ist.
Was aber auf jeden Fall geht, ist generell an Gruppen statt Einzelempfänger zu schicken:
attr globalMsg msgCmdPush set %DEVICE% send #%RECIPIENT% %MSG%
attr globalMsg msgContactPush Signalbot:testgruppe

klappt bei mir.

Wenn das "#" Zeichen für msgContactPush eingesetzt wird, dann sehe ich im Logfile noch nicht mal den Versuch Signalbot aufzurufen. "msg" kann da die Device vom Recipient nicht sauber trennen:
msg globalMsg: ID=1631471291.47571.1 TYPE=push ROUTE=SignalBot:#testgruppe STATUS=UNDEFINED PRIORITY=0 TITLE='' 'test'

Wenn ich es aber wie oben konfiguriere kommt korrekt:
msg globalMsg: ID=1631471759.65634.1 TYPE=push ROUTE=SignalBot RECIPIENT=testgruppe STATUS=OK PRIORITY=0 TITLE='' MSG='test'

und ich erhalte auch die Nachricht in meiner Gruppe.

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)

Adimarantis

Beta Test Signalbot V3

Es ist soweit. Signal-cli 0.9.0 ist released - leider ohne meine Änderungsvorschläge, wofür ich jetzt ein paar Workarounds bauen musste, was aber für die Funktionalität selbst keine große Rolle spielt.
Da mit dieser Version geplant ist ins reguläre FHEM update zu gehen, liegt das jetzt als tgz Archiv mit voller Verzeichnisstruktur bei.
Einfach als user "fhem" im fhem home (also überlicherweise /opt/fhem) entpacken:
tar xf SignalbotV3beta1.tgz
Ausgepackt wird das Modul nach FHEM sowie ein paar Hilfsdateien und der Installer nach www/signal

Testszenarien:
- An sich sollte Signalbot nach einem "shutdown restart" weiter funktionieren (ist ja auch nötig falls jemand Signalbot schon verwendet und nicht mitkriegt, dass "update" seine alte Version überschrieben hat). Hier sollten aber im Modul deutliche Hinweise auf das entsprechende signal-cli update angezeigt werden
- Nachdem der Installer gelaufen ist (dann bitte "shutdown restart" oder zumindest "set reinit") ist der Normalfall wahrscheinlich, dass man genau eine Nummer registriert hat. Signalbot sollte das erkennen und diese automatisch als Standard übernehmen
- Sollten mehrere Nummern registriert sein, dann muss erst mit "set account" eine davon ausgewählt werden oder eine weitere Nummer registriert werden.
- Wenn noch gar nichts registriert ist gibt es fast den selben Hinweis, nur das jetzt zwingend mit "set register" der Registrierungsprozess gestartet werden muss. Das könnt ihr testen indem ihr mit
sudo mv /var/lib/signal-cli/data /var/lib/signal-cli/data.org
die alte Registrierung wegschiebt ("sudo service signal restart" nicht vergessen).
- Grundsätzlich ist es kein Problem die selbe Nummer testweise nochmal zu registrieren (ich würde allerdings vorsichtshalber die neue Registrierung auch weiter verwenden, anstatt die alte wiederherzustellen)

Sonst will ich jetzt gar nicht gross mehr Anleitung geben, da der Registrierungsprozess wie eine Art "Wizard" geführt wird und damit hoffentlich selbsterklärend ist.
Bitte ruhig kreuz und quer rumprobieren. Ich hab sicher nicht alle möglichen Fehlerfälle und Benutzereingaben abgedeckt. Wenn was auffällt bitte mit Loglevel 5 nachstellen und posten (oder per PM, dann braucht ihr nicht zwangsweise die Telefonnummer rauszulöschen - ich gelobe die PM nach Durchsicht zu löschen und die Nummern nicht für Werbezwecke zu verwenden :) )

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)

KuhKai

Bei mir hängt sich install.sh auf...
ZitatLinux fhem-fhem0 4.4.180+ #41890 SMP Fri Jun 25 02:37:14 CST 2021 x86_64 GNU/Linux                                                                                     
has not been tested, continue at own risk                                                                                                                               
This will update system packages, install or uninstall signal-cli                                                                                                       
                                                                                                                                                                       
system   : prepare required system package (except signal-cli)                                                                                                         
install  : install signal-cli and setup as dbus system service                                                                                                         
test     : run a basic test if everything is installed and registered correctly                                                                                         
remove   : Remove signal-cli and all configurations (will be archived)                                                                                                 
start    : Start the signal-cli service (or respective docker processes)                                                                                               
all      : Run system, install, start and test (default)                                                                                                               
                                                                                                                                                                       
!!! 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                                                                                                                                         
Running in Docker, performing apt update/upgrade...Hit:1 https://deb.nodesource.com/node_10.x buster InRelease                                                         
Hit:2 https://cdn-aws.deb.debian.org/debian buster InRelease                                                                                                           
Hit:3 https://cdn-aws.deb.debian.org/debian-security buster/updates InRelease                                                                                           
Hit:4 https://cdn-aws.deb.debian.org/debian buster-updates InRelease                                                                                                   
Reading package lists...                                                                                                                                               
Reading package lists...                                                                                                                                               
Building dependency tree...                                                                                                                                             
Reading state information...                                                                                                                                           
Calculating upgrade...                                                                                                                                                 
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.                                                                                                         
done                                                                                                                                                                   
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 zip...available                                                                                                                                           
Checking for /usr/include/dbus-1.0/dbus/dbus.h...available                                                                                                             
Checking for /usr/share/build-essential/essential-packages-list...available                                                                                             
Checking for /usr/share/doc/libimage-librsvg-perl...available                                                                                                           
Checking for Protocol::DBus...V0.19 found                                                                                                                               
Checking user signal-cli ...Adding user `signal-cli' ...                                                                                                               
Adding new group `signal-cli' (1000) ...                                                                                                                               
Adding new user `signal-cli' (1000) with group `signal-cli' ...                                                                                                         
The home directory `/home/signal-cli' already exists.  Not copying from `/etc/skel'.                                                                                   
created                                                                                                                                                                 
Checking for /opt/fhem...found                                                                                                                                         
Checking for /var/lib/signal-cli...found                                                                                                                               
Checking for existing signal-cli installation...found                                                                                                                   
Checking signal-cli version...signal-cli 0.9.0                                                                                                                         
signal-cli matches target version...ok                                                                                                                                 
Starting dbus daemon for Docker                                                                                                                                         
Waiting for dbus to become ready..running                                                                                                                               
Starting signal-cli daemon for Docker                                                                                                                                   
Waiting for signal-cli to become ready..........

...ab hier geht es nicht mehr weiter. Das Docker Protokoll sagt: "connect(unix:path=/var/run/dbus/system_bus_socket): Connection refused at /usr/local/share/perl/5.28.1/Protocol/DBus/Client.pm line 144."