Neues Modul für "(Si)gnal - (Si)cherer Messenger" [32_SiSi.pm]

Begonnen von Quantum, 26 Februar 2018, 14:32:42

Vorheriges Thema - Nächstes Thema

Quantum

Hallo FHEM-Gemeinde

da es noch kein Modul für den quelloffenen Messenger "Signal" gibt,

Android: https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=de
iOS: https://itunes.apple.com/de/app/signal-private-messenger/id874139669?mt=8

habe ich versucht, etwas dafür zu schreiben.
Das Modul setzt auf die Kommandozeilenschnittstelle signal-cli: https://github.com/AsamK/signal-cli
und ist nur für Linux verfügbar !

Der Vorteil gegenüber WhatsApp/Telegram ist die Quellofenheit sowohl der Clienten, als auch des !!Servers!!.
Auch das zugrundeliegende Verschlüsselungsprotokoll zur E2E-Verschlüsselung ist durchgehnd einsehbar.
Es können auch ohne Probleme Festnetznummern registriert werden, ohne Gefahr zu laufen, dass diese wieder gelöscht werden.

Den Code und eine zusätzliche Beschreibung zur Einrichtung und Bedienung findet ihr unter:
https://github.com/Quantum1337/32_SiSi.pm
!! Das Modul Net::DBus >= 1.1.0 muss für die Funktion installiert sein !!

Die Entwicklung befindet sich in einem frühen Stadium. Fehlverhalten ist deshalb nicht ausgeschlossen.

Was sollte es können ;):
Empfangen von Nachrichten jeglicher Art
Senden von Nachrichten an einen oder mehrerer Empfänger, wahlweise mit Anhang
Senden von Gruppennachrichten

Was kann es noch nicht:
Vieles :)
.
.

Probleme bitte direkt auf GitHub melden !

Anregungen und konstruktive Kritik gern gesehen !

Grüße
Quantum

Ma_Bo

Hallo Quantum,
werde es die Tage mal testen, klingt aber recht interessant...

Arbeitet das Modul komplett nonBlocking...?

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Quantum

Hallo Marcel,

ja das war mein Hauptanliegen.
Um dies zu erreichen wird der FHEM-Prozess geforkt. Der Kindsprozess hört dann auf entsprechende D-Bus-Signale.
Der Kindsprozess wartet des Weiteren auf Events des Vaterprozesses und gibt dies an eine DBus-Methode weiter. Zum Beispiel das senden einer Nachricht durch den Benutzer.
Um keine DBus Signale zu verpassen bleibt der Kindsprozess nach dem enable dauerhaft am Leben.

Wäre dankbar wenn es der eine oder andere Testen könnte. Bis jetzt lief es nur bei mir und man selber bedient sein "Kind" immer anders als andere :)

Grüße
Quantum

Ma_Bo

Klingt gut...
Gibt es eine Übersicht, was mit dem Messanger möglich ist, z.B. Nachrichten mit einem bestimmten Klingelton versehen oder komplett ohne Ton, Kursivschrift usw...?
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

klausw

im Moment scheitere ich noch an dbus selbst  :-\
signal-cli in Version 0.5.6 läuft, einen Nummer ist registriert und ich kann Nachrichten senden und empfangen.
libunixsocket-java habe ich auf dem Raspian Jessie installiert.
signal-cli -u USERNAME daemon bringt den Fehler:
org.freedesktop.dbus.exceptions.DBusException: Cannot Resolve Session Bus Address
        at org.freedesktop.dbus.DBusConnection.getConnection(DBusConnection.java:244)
        at org.asamk.signal.Main.handleCommands(Main.java:625)
        at org.asamk.signal.Main.main(Main.java:80)

was habe ich übersehen?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Quantum

@Marcel: Ich kann dich bzgl des Funktionsumfanges nur auf die offizielle Seite weiterleiten: https://signal.org/ Oder auf die AppStore links verweisen, die ich gepostet habe.
Signal ist aber noch nicht so umfangreich wie vergleichbare Dienste. Was nicht ist, kann aber noch werden :)

@klausw:
Hast du diese Schritte unter dem Kapitel "System Bus" erledigt ?
https://github.com/AsamK/signal-cli/wiki/DBus-service

Wenn hier alles korrekt eingerichtet wurde kann mit
dbus-send --system --type=method_call --print-reply --dest="org.asamk.Signal" /org/asamk/Signal org.asamk.Signal.sendMessage string:MessageText array:string: string:RECIPIENT
das senden einer Nachricht getriggert werden. Dabei startet DBus automatisch den entsprechenden systemd Service, wenn er noch nicht gestartet wurde, und springt die Methode "sendMessage" an. RECIPIENT entsprechend mit +49XXXXX ersetzen

Wichtig zu erwähnen sind vielleicht noch folgende Dinge, die in diesem Text etwas untergehen:

Die Dateien die du dafür benötigst findest du unter: https://github.com/AsamK/signal-cli/tree/master/data

Durch den Schritt
sed -i -e "s|%dir%|<INSERT_INSTALL_PATH>|" -e "s|%number%|<INSERT_YOUR_NUMBER>|" /etc/systemd/system/signal.service
werden Installationspfad des signal-cli und USERNAME/NUMBER in der systemd service datei gesetzt. Dies ist notwendig, damit systemd den daemon richtig starten kann.

Es muss der user signal-cli existieren. Wenn nicht entsprechend anlegen.

und ganz wichtig!!
wenn du schon eine nummer registriert hast findest du bei dem entsprechenden Nutzer im Homeverzeichnis unter ~/.config/signal einen Ordner "data". Dierser Ordner enthält die Schlüssel des Benutzers. Der Ordner "data" muss dann rekursiv nach /var/lib/signal-cli/ kopiert werden. Danach mit root die Rechten den Ordner rekursiv auf den Nutzer "signal-cli" anpassen.
sudo chown -R signal-cli:signal-cli /var/lib/signal-cli/data

Danach sollte es klappen :)

Freundliche Grüße
Quantum


Quantum

mir ist noch was aufgefallen:

Du benutzst mit

signal-cli -u USERNAME daemon

den "Session Bus"  von DBus. Dieser ist auf headless systemen meistens nicht gestartet (wird normalerweise vom Grafischen Loginmanger gestartet). Um dennoch zu Testzwecken den signal-cli in diesem Modus zu starten muss also der "Session Bus" für den angemeldeten Benutzer erst gestartet werden. Hierfür einfach zuerst
dbus-launch
eintippen und es sollte funktionieren. Dann kann mit
dbus-send --session --type=method_call --print-reply --dest="org.asamk.Signal" /org/asamk/Signal org.asamk.Signal.sendMessage string:MessageText array:string: string:RECIPIENT
überprüft werden ob das senden einer Nachricht funktioniert. Man beachte den Unterschied session/system !

Der "System Bus" muss trotzdem eingerichtet werden, da das Modul bis jetzt nur "System Bus" adressen anspringt.

klausw

Danke Quantum,

/var/lib/signal-cli hatte ich nicht angelegt. Das ganze ist meiner Meinung nach etwas irreführend beschrieben.
Das Programm dbus-launch ist bei dem Paket fürs Raspbian gar nicht mit dabei. Aber es geht ja auch ohne.

Senden und empfangen klappt mit Deinem Modul super. signal-cli hatte ich bisher nicht in der näheren Auswahl, weil alles so ewig dauert. Aber als Daemon passt die Geschwindigkeit.

Ein paar Anregungen hätte ich  ;)

Wenn Du im sub SiSi_Initialize($) die benötigten Module über eval lädst kannst du fehlende Module direkt abfangen. Andernfalls kann es passieren das FHEM abschmiert wenn ein Modul fehlt. So z.B.:
eval "use Net::DBus;";
return "please install Net::DBus" if($@);


Eventuell würde es Sinn machen, soweit es geht, die Readings und sets wie im Modul TelegramBot zu benennen.
Das würde Parallelnutzung/Umstieg vereinfachen. Z.B. beim benutzen von eigenen Scripten zur Steureung von FHEM über die Messenger.

Attribut für Standard Empänger in welchem Nummern abgelegt werden können, an die gesendet wird wenn r= nicht angegeben wird.

Attribut für Nummern die man Empfangen möchte. (wenn gesetzt werden alle anderen ignoriert)

Grüße
Klaus
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

klausw

Hallo Quantum,

gibt es für das senden von Dateien spezielle Vorgaben?

set signal sendMessage r=+49171234567 m="test" a="/opt/fhem/www/images/default/weather/partly_cloudy.png"

geht bei mir nicht raus, es gibt auch nix im Log (verbose 5)

wenn ich Parameter a weglasse geht es:
set signal sendMessage r=+49171234567 m="test"
2018.02.28 17:15:37 3: SiSi signal - Trying to send message to DBus method 'sendMessage' on service org.asamk.Signal
2018.02.28 17:15:38 3: SiSi signal - The message: 'test' with attachment(s): 'NONE' was sended to recipient(s): '+49171234567'
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Quantum

#9
Hallo klausw,

schön das es zunächst mal mit der Einrichtung geklappt hat. Und danke für die Anregungen hab Sie aufgenommen.

Zitatgibt es für das senden von Dateien spezielle Vorgaben?

Was ich mir vorstellen könnte sind Berechtigungsprobleme. Kann der Nutzer "signal-cli" auf die Datei zugreifen ?

EDIT:
ok hab es jetzt mal selbst ausprobiert. Sowohl mit keinen Berechtigungen als auch wenn die Datei nicht vorhanden ist.
Die Fehler sollten im Log erscheinen. Das Modul initiiert dann einen reconnect. Das sollte so nicht sein, werde das gleich beheben.

Wird beim senden mit Anhang im Log garnichts angezeigt ? Nicht mal

ZitatTrying to send message to DBus method 'sendMessage' on service org.asamk.Signal
?

Hast du die neueste Modulversion ? Hab gestern noch ein bisschen war dran gemacht, da mir selber noch sachen aufgefallen sind.

Freundliche Grüße
Quantum

klausw

#10
Hallo Quantum,

Die Datei kann von allen geleden werden.
Es erscheint gar nix im Log wenn a=".." mit übergeben wird
Stimmt, ich hatte es mit der alten Version versucht.
Habe gerade die neue aufgespielt. Leider funktioniert es jetzt gar nicht mehr  :-\
2018.03.01 00:11:25 4: SiSi signal - Connected to DBus' System Bus.
2018.03.01 00:11:25 5: SiSi signal - Setting DBus Timeout to 60s.
2018.03.01 00:11:25 3: SiSi signal - An unexpected error occured. Closing connection to DBus service org.asamk.Signal Can't locate object method "timeout" via package "Net::DBus" at ./FHEM/32_SiSi.pm line 386.
2018.03.01 00:11:25 3: SiSi signal - Reconnect to DBus service org.asamk.Signal.
2018.03.01 00:11:25 4: SiSi signal - Closing connection to DBus service org.asamk.Signal.
2018.03.01 00:11:25 4: SiSi signal - Trying to kill PID '30515'.
2018.03.01 00:11:25 4: SiSi signal - Killing PID '30515' failed. Maybe the process crashed due to an error?.
2018.03.01 00:11:25 3: SiSi signal - Connection to DBus service org.asamk.Signal closed.
2018.03.01 00:11:25 3: SiSi signal - Trying to connect to DBus' System Bus.
2018.03.01 00:11:25 4: SiSi signal - Connected to DBus' System Bus.
2018.03.01 00:11:25 5: SiSi signal - Setting DBus Timeout to 60s.
2018.03.01 00:11:25 3: SiSi signal - An unexpected error occured. Closing connection to DBus service org.asamk.Signal Can't locate object method "timeout" via package "Net::DBus" at ./FHEM/32_SiSi.pm line 386.
2018.03.01 00:11:25 3: SiSi signal - Reconnect to DBus service org.asamk.Signal.
2018.03.01 00:11:25 4: SiSi signal - Closing connection to DBus service org.asamk.Signal.
2018.03.01 00:11:25 4: SiSi signal - Trying to kill PID '30516'.
2018.03.01 00:11:25 4: SiSi signal - PID '30516' killed.
2018.03.01 00:11:25 3: SiSi signal - Connection to DBus service org.asamk.Signal closed.
2018.03.01 00:11:25 3: SiSi signal - Trying to connect to DBus' System Bus.


Grüße
Klaus
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Quantum

#11
mhm ok. Welche Modul Version von Net::DBus hast du ?
Einfach mal:
Zitatperl -MNet::DBus -le 'print $Net::DBus::VERSION'
eintippen.

Habe gerade die Änderungen von heute (gestern) gepushed. Bitte nochmal aktualisieren.

EDIT: Hab gerade nochmal auf cpan.org geschaut.
Du hast bestimmt eine Modulversion < 1.1.0. Die Timeoutfunktion kam nämlich erst mit 1.1.0 hinzu.
Ich mach das ganze auf ArchLinuxARM die liefern die neuste Version aus. Debian liefert hier ne ältere Version aus.
Besteht die Möglichkeit diese auf die neuste Version zu aktualisieren, evtl direkt mittels cpan ?

Danke&
Viele Grüße
Quantum

klausw

#12
du hast recht, es ist die 1.0.0 drauf
Über cpan schlug fehl, da die installierter DBus Version zu alt.

nach
sudo aptitude install -y libapparmor1
export VERSION="1.13.0-1"
wget http://ftp.fr.debian.org/debian/pool/main/d/dbus/libdbus-1-3_$VERSION_armhf.deb
sudo dpkg --auto-deconfigure -i libdbus-1-3_$VERSION_armhf.deb
wget http://ftp.fr.debian.org/debian/pool/main/d/dbus/dbus_$VERSION_armhf.deb
sudo dpkg -i dbus_$VERSION_armhf.deb
wget http://ftp.fr.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_$VERSION_armhf.deb
sudo dpkg --auto-deconfigure -i libdbus-1-dev_$VERSION_armhf.deb
sudo perl -MCPAN -e 'install Net::DBus'
sudo reboot

sollte es passen:
pi@drham:~ $ dpkg -l dbus
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
         Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name                                 Version                 Architektur             Beschreibung
+++-====================================-=======================-=======================-==============================================================================
ii  dbus                                 1.13.0-1                armhf                   simple interprocess messaging system (daemon and utilities)
pi@drham:~ $ perl -MNet::DBus -le 'print $Net::DBus::VERSION'
1.1.0


Neuste Version deines Moduls funktioniert jetzt, incl. senden von Anhängen
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Quantum

sehr gut :) Freut mich zu hören
Hab nun einen Modul und Versionscheck implementiert. Werd ich heute abend dann pushen.

Ersetz mal --session durch --system. Dann sollte es gehen :)

Freundliche Grüße
Quantum

klausw

Zitat von: Quantum am 01 März 2018, 12:36:14
Hab nun einen Modul und Versionscheck implementiert. Werd ich heute abend dann pushen.
sehr schön, ich werde zeitnah testen

Zitat von: Quantum am 01 März 2018, 12:36:14
Ersetz mal --session durch --system. Dann sollte es gehen :)
auch gerade gemerkt  ::)
ich meine es funktionierte vorher mit session
Kannst du mir sagen wann was verwendet wird?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280