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

Zitat von: mspa am 07 Februar 2021, 20:40:59
eine kurze Frage, wird ein Zeilenumbruch auch mit \n gemacht, wie bei anderen Modulen?
Aktuell geht das nur aus Perl (also z.B. im DOIF):
{fhem("set SignalBot send \@Joerg Zeile 1".chr(10)."Zeile2");}

Habs aber schon ausprobiert. Eine Erweiterung die "\n" in ein echtes Newline übersetzt ist einfach. Kommt dann ins nächste update.
Man muss dann allerdings "\\n" machen um das "\" zu escapen.

Zitat
Achja die installtion hat super geklappt, es hat nur noch das modul libimage-librsvg-perl für SVG_plots gefehlt.
Danke. Nehme ich mit in den Installer auf.

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

sinus61

In Perl geht das mit \n aber auch so:


$txt = " $eventDesc\n $onset\n $expires\n $description\n";
fhem ("set SignalBot send $txt");



Adimarantis

Stimmt. Geht sogar direkt. Zu kompliziert gedacht.
{fhem("set SignalBot send \@Joerg Zeile 1\nZeile2");}
Nur in FHEM klappt das durch das pre-processing für eingebaute Readings ala [device:reading] irgendwie nicht.
Das muss ich mir noch in Ruhe anschauen.
Vielleicht kann man das "\\n" auch irgendwie umgehen, damit es via Perl und FHEM gleich funktioniert indem ich das bereits vorher in Chr(10) konvertiere.

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

BAfH

Morgen,
so ich war wieder aktiv.
Ich habe genau nach Anleitung, den Dockercontainer neu erstellt.
hier eine kurze Aufstellung.
1. Alten Container gelöscht
docker rm -f fhem-docker_fhem_1
docker rmi -f fhem-docker_fhem

2. Neuen Container erstellen
Dockerfile
ARG BASE_IMAGE="fhem/fhem"
ARG BASE_IMAGE_TAG="latest"
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG}

ARG L_SIGNAL_CLI="0.7.4"

# Install base environment

VOLUME [ "/opt/signal-cli" ]

Kommando
docker-compose up -d
3. FHEM startet
4. Kommando apt-get update
5. Editor apt-get install nano
6. Kommando ./signal_install.sh system
hier kommen teilweise Fehler
npacking unzip (6.0-23+deb10u2) over (6.0-23+deb10u1) ...
Errors were encountered while processing:
/tmp/apt-dpkg-install-33B4nC/00-tzdata_2021a-0+deb10u1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
done
Checking for haveged...installing (haveged)E: Sub-process /usr/bin/dpkg returned an error code (1)
Extracting templates from packages: 100%jre)
E: Sub-process /usr/bin/dpkg returned an error code (1)
done
Checking for qrencode...installing (qrencode)E: Sub-process /usr/bin/dpkg returned an error code (1)
done
Checking for zip...installing (zip)E: Sub-process /usr/bin/dpkg returned an error code (1)
done
Checking for Net::DBus...Can't locate Net/DBus.pm in @INC (you may need to install the Net::DBus module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/arm-linux-gnueabihf/perl5/5.28 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at /tmp/signal16413.tmp line 5.
BEGIN failed--compilation aborted at /tmp/signal16413.tmp line 5.
Installing latest NET::DBus...done
Checking user signal-cli ...Adding user `signal-cli' ...
Adding new group `signal-cli' (1001) ...
Adding new user `signal-cli' (1001) with group `signal-cli' ...
Creating home directory `/home/signal-cli' ...
Copying files from `/etc/skel' ...
created


7. Kommando ./signal_install.sh install
Ausgabe
Checking for /opt...found
Checking for /var/lib/signal-cli...created
Checking for existing signal-cli installation...not found
Proceed with signal cli installation
Downloading signal-cli 0.7.4...done
Unpacking ...
Removing native x86 since you're on Raspberry...deleting: libzkgroup.so
done
Downloading native armv7l libraries...
done
done
Changing file ownership ...done
Checking for /etc/dbus-1/system.d/org.asamk.Signal.conf.../etc/dbus-1/system.d/org.asamk.Signal.conf installed
Checking for /usr/share/dbus-1/system-services/org.asamk.Signal.service.../usr/share/dbus-1/system-services/org.asamk.Signal.service installed


10. Kommando dbus-daemon --system --address=unix:path=/run/dbus/system_bus_socket &
11. Kommando scp -r pi@192.168.10.50:/var/lib/signal-cli /var/lib
12. Kommando chown -R signal-cli: signal-cli
13. Kommando sudo -u signal-cli /opt/signal/bin/signal-cli -u +49festnetz --config /var/lib/signal-cli daemon --system &
Ausgabe [1] 8649
nach einer gewissen Zeit kommt
root@FHEM:/var/lib# ERROR App - Error while checking account +49festnetz: Authorization failed!

14. Kommando ps -ef | grep java Keine Ausgabe nur der Prozess selbst
15. Testscript perl signal_test.pl
Ausgabe org.freedesktop.DBus.Error.Spawn.ChildExited: Launch helper exited with unknown return code 1

Frage ich die Prozess dbus ab root@FHEM:/opt/fhem# ps -ef | grep dbus
message+  8148     1  0 09:42 ?        00:00:00 dbus-daemon --system --address=unix:path=/run/dbus/system_bus_socket
message+ 31542  8148  0 10:05 ?        00:00:00 dbus-daemon --system --address=unix:path=/run/dbus/system_bus_socket
root     31543 31542  0 10:05 ?        00:00:00 /usr/lib/dbus-1.0/dbus-daemon-launch-helper org.freedesktop.systemd1
root     31577  9615  0 10:05 pts/1    00:00:00 grep dbus

Könnte es am Fehler während der Installation
Sub-process /usr/bin/dpkg returned an error code (1)
liegen.
Meine Umgebung
Linux FHEM 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux

PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Kernel
5.4.72-v7l+

Ich teste mal weiter....
Gruß Thorben
mit sonnige Grüße aus Schönow

Adimarantis

Hi Thorben,

Um das von a-z zu testen, wollte ich mr jetzt noch ein vollautomatisertes Script für eine FHEM/signa-cli Docker Umgebung bauen. Sollte eigentlich nicht so wild sein, braucht aber noch Zeit (zum Bauen, aber auch um noch ein paar Dinge über Docker zu lernen).
Wenn du es also nicht zu eilig hat, warte mal auf das :) In der Arbeit geht's gerade auch ein bisschen rund.

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

BAfH

Hi Jörg,

kein Problem, ich taste mich auch gerade mal ran. Teste weiter, verschiedene Docker den es lief ja mal.
Ich bin auch gerade aktiv im Job.. Wir sind jung und brauchen das Geld.
Also pass auf Dich auf.

Thorben
Gruß Thorben
mit sonnige Grüße aus Schönow

sinus61

Ich hab gerade mal über das Thema Favoriten nachgedacht, die ich in Telegram genutzt habe. Babble ist mir für diesen Zweck zu umständlich.

Ich hab mir für den Zweck ein Notify angelegt. Ein "/" schickt einen Text mit den Favoriten zurück, mit "/1" usw. wird dann der jeweilige Favorit ausgeführt.
Vielleicht kann es ja jemand als Anregung gebrauchen.


SignalBot:msgText:./.* {
my $favs = "/1 = Verkehr\n/2 = Warnungen\n/3 = Aussentemperatur\n/4 = Kamera";
if ($EVTPART1 eq "/") {
fhem('set $NAME send "@[$NAME:msgSender]" '.$favs);
}
elsif ($EVTPART1 eq "/1") {
fhem('set $NAME send "@[$NAME:msgSender]"  '.Verkehrsinfo_GetData('A27'));
}
elsif ($EVTPART1 eq "/2") {
DWD_Alert("DWD_Wetter");
}
elsif ($EVTPART1 eq "/3") {
fhem('set $NAME send "@[$NAME:msgSender]" Aussentemperatur: [au_Wetterstation:temperature]');
}
elsif ($EVTPART1 eq "/4") {
fhem("get Cam1 image");
fhem("sleep 1;set $NAME send '@[$NAME:msgSender]' &/opt/fhem/www/snapshots/Cam1_snapshot.jpg");
}
}

weini

Zitat von: Adimarantis am 06 Februar 2021, 14:43:45
Um Befehle automatisiert auszuführen habe ich die Verknüfung mit dem Babble Modul eingebaut. Der kann erstens mal sehr flexibel unterschiedliche Formulierungen erkennen und zweitens muss man dann das Rad nicht zweimal erfinden. Auf den ersten Blick hat der Telegrambot Entwickler da ganz schön Aufwand reingesteckt.
Ich lasse mich gerne davon überzeugen, was der Vorteil gegenüber Babble ist (oder potentiell auch "talk") ist.
Kannst du mir dazu mehr Infos geben? Was ist der Anwendungsfall und wie schauen deine notifys aus die sowas simulieren?

Sorry für die späte Antwort, ich hatte keine Benachrichtiungen mehr bekommen.

Favoriten:
Ich finde es sehr komfortabel, für mich wichtige Funktionen schnell mit einem Kürzel zu erreichen. Bei Babble werden die Eingaben ja eher länger. Kurz ein fav3 und ich habe die aktuellen Temperaturen oder ein fav5 und ich bekomme ein Foto der Wifi-Cam zugesandt. Über die Fav-Menü Funktion vom TelegramBot wird das ganze dann noch komfortabler. Ich weiß nur nicht, ob man so etwas mit Signal überhaupt machen kann.

Notify:
Den TelegramBot habe ich so konfiguriert, dass er nur Befehle via "trigger" ausführt. Normale "set" sind erst mal verboten. Einen "set" Befehl erkennt aber das notify. Das prüft dann zusätzlich, ob eine Zahl mit übergeben wurde und validiert die via GoogleAuth.
Das notify sieht so aus (steht irgendwo auch im über 100 Seite langen TelegramBot Thread):

defmod ntf_telegramBot notify telegramBot:msgText.* {\
  my $msgpeer = ReadingsVal("telegramBot", "msgPeerId", "");;\
  my @evtparts = split(" ",$EVENT);;\
  \
  # Reading-Namen entfernen\
  shift @evtparts;;\
  # das Token steht vor dem Befehl\
  my $GivenToken = shift @evtparts;;\
  my $FhemCmd = join " ", @evtparts;;\
  my $cmdKeyword = AttrVal("telegramBot", "cmdKeyword", undef);;\
  my $cmdFavorites = AttrVal("telegramBot", "cmdFavorites", undef);;\
  my @favarray;;\
  my $favno;;\
\
  # nur verarbeiten, wenn das Token nur aus Zahlen besteht -> sonst ist es verm. ein reguläres Kommando für das Bot-Modul\
  if ($GivenToken =~ /^\d+$/) {\
    Log3("ntf_telegramBot",4,"ntf_telegramBot: EVENT: $EVENT");;\
    Log3("ntf_telegramBot",3,"ntf_telegramBot: FhemCmd: $FhemCmd");;\
\
    # prüfe ob die Zeichenfolge von eben einen gültigen Token ergibt\
    my $GAuthResult = gAuth("googleAuth",$GivenToken);;\
    Log3("ntf_telegramBot",3,"ntf_telegramBot: googleAuth Token: $GivenToken result: $GAuthResult");;\
\
    # ggf. Favoriten auflösen\
if (substr($FhemCmd, 0, length($cmdFavorites)) eq $cmdFavorites) {\
   $favno = int(substr($FhemCmd, length($cmdFavorites)));;\
   @favarray = split(";;",AttrVal("telegramBot", "favorites", ""));;\
   $FhemCmd = $favarray[$favno-1];;\
       # wenn ein Alias definiert ist, dann den Befehlsteil aus dem Favoriten extrahieren\
       if (index($FhemCmd, "=") >= 0) {\
     $FhemCmd = substr($FhemCmd, index($FhemCmd, "=")+1);;\
   }\
       Log3("ntf_telegramBot",3,"ntf_telegramBot: FhemCmd after favorite substitution: $FhemCmd");;\
}\
\
    #Prüfung, dass der aktuelle peer in der Liste der cmdRestrictPeer ist. Achtung: es wird auf die PeerId geprüft, username funktioniert nicht\
    if ( index(AttrVal("telegramBot", "cmdRestrictedPeer", $msgpeer), $msgpeer) >= 0 and $GAuthResult eq '1') {\
      Log3("ntf_telegramBot",4,"ntf_telegramBot: execute cmd");;\
      fhem($FhemCmd);;\
    }\
  }\
}


enno

Zitat von: weini am 08 Februar 2021, 23:06:09Bei Babble werden die Eingaben ja eher länger.
Moin,

das ist richtig, aber, ich kann meine zweiten Hälfte nicht davon überzeugen, sich Kürzel zu merken. Daher nutze ich auf dem Handy die Möglichkeit, den Text zu sprechen, umzuwandeln und dann zu schicken. "Mach das Radio an", "Schalt das Radio ein" oder "Schalt das Radio bitte an". Die Ansage muss halbwegs passen und Signal und Babble machen dann den Rest.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

Adimarantis

Das diese Favorites mit einem Notify einfach zu realisieren sind, hat ja sinus61 oben gezeigt. Ich würde das ja eher mit einem DOIF machen, aber das ist Geschmackssache. Daher bin ich nach wie vor nicht davon überzeugt das Rad nochmal zu erfinden.

Was allerdings sinnvoll sein könnte wäre ein "babbleExclude" Parameter. Wenn dieses Zeichen (oder Zeichenkette) am Anfang der Nachricht steht, dann wird Babble nicht aufgeufen. So könnte man z.B. das "/" oder "fav" etc. ausnehmen und per Notify behandeln, alles andere geht immer noch an die Sprachanalyse.

Was meint ihr?

So einen Marker brauche ich auch in umgekehrte Richtung für die Rive Dateien um ggf. die Umlaute anders zu kodieren. Der Babble Autor hat in seinen Rivescript Dateien eine spezielle Kodierung verwendet und kodiert das in Babble um. Ich habe aber jetzt die Beispiele von TALKTOME ausprobiert, die "normale" Umlaute enthalten, und dann kommt nach Babble Müll raus. Mit einer speziellen Markierung im "send" der "helpFunc" erkenne ich das aktuell und korrigiere das wieder (generell darf man das aber nicht machen).
Alternativ könnte ich mir noch ein "sendutf8" vorstellen, das dürfte aber die meisten eher verwirren. Da wäre ein versteckter Marker meiner Ansicht nach besser.

Jörg

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

kjmEjfu

Wegen Docker, habt ihr mal mit Julian gesprochen?
Sein Docker-Container (https://github.com/fhem/fhem-docker) bietet doch schon einiges an Anpassungsmöglichkeiten.

Eventuell könnte man die Installation für signal-cli nach /post-init.sh, /docker/post-init.sh auslagern und mit Julian besprechen, dass man nur sowas wie

-e install_signal_bot=true

setzen muss und dann automatisch der entsprechende Installationsprozess ausgeführt wird?

Dabei habe ich vor allem die User im Hinterkopf, die zwar einen normalen Docker-Container hochfahren, aber selber nichts mit composer usw. anlegen können.
Migriere derzeit zu Home Assistant

Adimarantis

Zitat von: kjmEjfu am 09 Februar 2021, 09:54:21
Sein Docker-Container (https://github.com/fhem/fhem-docker) bietet doch schon einiges an Anpassungsmöglichkeiten.

Ich bastele gerade an einem Script das "from scratch" einen FHEM/signal-cli Container per script (natürlich auch mit docker-compose uns so) anlegt.
Ist jetzt mehr ein Lernprojekt für mich, da ich viele Prinzipien von Docker noch nicht ganz verstehe. Vom dem Projekt oben gucke ich da bereits ein wenig ab. Meins basiert jetzt auf dem standard "ubuntu/latest" und ist dadurch sehr schlank (250 MB vs. 1.6 GB von fhem docker, der einen haufen Zeug reinpackt, dass nicht jeder braucht).

Eine Problematik hier ist die Erstellung der Registry. Kann man irgendwie ein interaktives Script per "RUN" im Dockerfile ausführen?
Dadurch müsste man die Registrierung erstmal außerhalb vom Container machen und im Rahmen des compose Prozesses reinkopieren (geht natürlich, stellt aber schon wieder eine Hürde dar)

Aktuell kämpfe ich noch ein wenig mit der Persistenz. Wie stellt man sicher das mit "apt-get install" installierte Pakete erhalten bleiben. Nahezu das ganze Filesystem als "volume" zu definieren kommt mir nicht zielführend vor. Naja.. wie gesagt, Lernprojekt.

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

Schön, dass es eine Lösung für dei Favoriten gibt.
Mittelfristig würde ich es schön finden, wenn das Modul selbst Favoriten unterstützen würde. Die notify Konstruktion erhöht nicht eben die Wartbarkeit.
Aber bzgl. Priorisierung bin ich fein, das ist am Anfang nicht das dringendeste auf der Welt, wenn es einen funktionireneden Workaround gibt.

Just my 2 cents, Entscheidung liegt natürlich beim Autor  ;)

sinus61

Zitat von: enno am 09 Februar 2021, 07:24:20
das ist richtig, aber, ich kann meine zweiten Hälfte nicht davon überzeugen, sich Kürzel zu merken.

Gibt da sicher unterschiedliche Anforderungen. Für Zuhause hab ich für sowas meine Echos, mit denen ich reden kann. Unterwegs, im Büro oder im Zug würde ich nicht sowas im mein Handy sagen wollen. Da sind mir ein paar Kürzel zum eintippen lieber.

Ich bin aber mit der Notify Lösung zufrieden. Da ist das mit den verschiedenen Befehlen einfacher, als wenn das in einem Modul eingibt, wo dann alles mögliche escaped werden muss oder so. Im notify weiss ich besser wie ein Befehl aussehen muss.

enno

Zitat von: sinus61 am 09 Februar 2021, 13:42:53
dann alles mögliche escaped werden muss oder so. Im notify weiss ich besser wie ein Befehl aussehen muss.

Ich steuer das über ein DOIF. Die Shortcuts werden als erstes abgefragt und ganz am Schluss kommt Babble. So kann ich die Abkürzung nehmen und wenn davon nichts passt, kommt noch die Schleife über Babble, die ganz zum Schluss auch noch ausgibt, wenn gar nichts verstanden wurde. Vor Babble habe ich noch einen DOELSEIF Zweig, der "set" und andere nicht gewünschte Befehle abfängt. Dadurch benötige ich die "babbleExclude" die Jörg vorschlägt für mich nicht.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC