Textsecure bzw. Signal aus FHEM nutzen

Begonnen von malted, 21 Dezember 2014, 01:13:04

Vorheriges Thema - Nächstes Thema

malted

Da ich whatsapp nicht mag, keine Lust auf jabber habe und trotzdem unterwegs ggf. mal ne Info von FHEM haben will, habe ich mit der nagelneuen textsecure-cli was gebaut. Funktioniert hier auf den ersten Blick astrein.

Ist bisher nur eine Richtung, d.h. FHEM an Handy. Die Software ist aber grundsätzlich bidirektional. Eventuell kann man zukünftig so auch Fotos von einer Webcam verschicken, wenn jemand an der Tür klingel etc.

Wer sich fragt, warum Textsecure, findet bei Wikipedia etliche Gründe. Kurzum ist es ein Programm wie Whatsapp, bloß OpenSource unter der GPL3 mit vernünftiger End-zu-End-Verschlüsselung. Textsecure verwendet unter Android GCM, weshalb die Nachrichten sofort auftauchen. Alles was an Heimautomation von außen erreichbar wird, sollte ziemlich wasserdicht sein, weshalb Textsecure eine naheliegende Lösung ist, um von unterwegs mit FHEM zu kommunizieren.

Ist etwas detailierter, da auf meinem Banana-pi unter Debian nur ein altes go 1.0.x vorhanden war, erstmal ein aktuelles bauen: siehe auch https://golang.org/doc/install/source
Kann hinterher alles wieder geloescht werden, da die go gebauten binaries static sind (d.h. sie laufen stand-alone ohne irgendwelche Libs).


root@fhem:~# apt-get install mercurial
root@fhem:~# hg clone -u release https://code.google.com/p/go
root@fhem:~# cd go/src
root@fhem:~/go/src# ./all.bash
# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, linux/arm.
lib9
libbio
...
ALL TESTS PASSED

---
Installed Go for linux/arm in /root/go
Installed commands in /root/go/bin
*** You need to add /root/go/bin to your PATH.


Nun das Textsecure holen und bauen:

root@fhem:~# mdir ~/gocode
root@fhem:~# export GOPATH=~/gocode
root@fhem:~# ./go/bin/go get github.com/janimo/textsecure/cmd/textsecure
root@fhem:~#

Wenn das oben ohne Fehler fertig ist, hat alles geklappt. Nun die Demo-Config holen und mal testeN.


root@fhem:~# cp -R gocode/src/github.com/janimo/textsecure/cmd/textsecure/.config/ ~
root@fhem:~# vim ~/.config/config.yml
# Telefonnummer eintragen, es gehen auch Festnetz-Nummern, dann aber logischerweise den verificationType auf voice stellen. Dann ruft da ein Roboter an und gibt einem den Code durch. Der ist relativ schnell und wiederholt nichts. Deswegen was zu schreiben bereitlegen.
root@fhem:~# ./gocode/bin/textsecure
Enter verification number (without the '-')>537723 # <- Das ist der vom Anruf oder von der SMS
2014/12/21 00:24:45 Registration done

Nun wird unter /root/.storage alles nötige angelegt (keys).

Jetzt kann man es direkt zu seinem Handy mal ausprobieren. Das ist eine session, wo man quasi chatten kann.
Wichtig ist, dass es aus dem Ordner aufgerufen wird, in dem die .config und .storage liegt. Man kann leider keinen Pfad zur Config angeben, zumindest habe ich da jetzt in den Parametern des Binarys nix gefunden.

root@fhem:~# ./gocode/bin/textsecure -to "+4915xxxxxx"
>test
                                               Works
>^Croot@fhem:~#


Nun das ganze für fhem verfügbar machen:

root@fhem:~# mkdir -p /opt/textsecure/bin
root@fhem:~# cp gocode/bin/textsecure /opt/textsecure/bin
root@fhem:~# mkdir /opt/fhem/ts
root@fhem:~# cp -R .config/ .storage/ /opt/fhem/ts
root@fhem:~# chown fhem:dialout -R /opt/fhem/ts
root@fhem:/opt/fhem/ts# sudo -u fhem /opt/textsecure/bin/textsecure -to="+4915xxxxx"
>adf
root@fhem:/opt/fhem/ts#


Last but not least, die helper-function einfügen. Muss leider kurzzeitig das working-directory ändern, damit das .config und .storage ordentlich gefunden wird.

root@fhem:/opt/fhem# cat FHEM/99_myUtils.pm
package main;
use strict;
use warnings;
use Cwd;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

######################################################
# Aufgabe    :Versenden von textsecure
# Parameter 1:Nummer Format +4917012345678
# Parameter 2:Message
#

sub sendTextsecure($$)
{
   my ($nr, $Message) = @_;
   my $dir = getcwd();
   chdir "/opt/fhem/ts/";
   Log 3, "sendTextsecure  Nr: ". $nr . " Message:\x22" . $Message . "\x22 ";
   #Direkter Aufruf
   system("/opt/textsecure/bin/textsecure -to=\"$nr\" -message=\"$Message\"");
   chdir "$dir";

}

1;
root@fhem:/opt/fhem#



Fast fertig, noch ein schlankes

reload 99_myUtils.pm

in FHEM

und dann kann man auch schon loslegen:

define test at *00:41 { sendTextsecure("+4915xxxxxxx", "test") }

malted

#1
Nachdem jetzt folgende Änderung Eingang gefunden hat Fix attachment sending and receiving., funktioniert nun auch der Versand von Attachments hervorragend.

Vorstellbar sind der Versand von Audio-Files (z.B. vom Anrufbeantworter der Fritzbox holen und per Textsecure verschicken oder ein Raummikro aktivieren, wenn Bewegung ausgelöst wurde),  Webcam-Fotos oder sogar Videos.
Beispiel, es klingelt an der Tür, direkt Foto oder Video machen und zurückschicken.


Hierzu einfach in der /opt/fhem/FHEM/99_myUtils.pm noch die folgende Subroutine ergänzen:


sub sendTextsecureAttachment($$)
{
   my ($nr, $Message) = @_;
   my $dir = getcwd();
   chdir "/opt/fhem/ts/";
   Log 3, "sendTextsecure  Nr: ". $nr . " Message:\x22" . $Message . "\x22 ";
   #Direkter Aufruf
   system("/opt/textsecure/bin/textsecure -to=\"$nr\" -attachment=\"$Message\"");
   chdir "$dir";
}


Wenn man nun eine IPCam wiefolgt hat:

define IPCam IPCAM 192.168.178.40:8080
attr IPCam snapshots 3
attr IPCam delay 3
attr IPCam path shot.jpg
attr IPCam event-on-update-reading snapshots
attr IPCam storage /opt/fhem/snapshots/


Kann man leicht bei z.B. Bewegung sich ein Bild aufs Handy schicken lassen.


define bewegungssensorSendFoto notify Bewegungsmelder1:motion ({ sendTextsecureAttachment("+491xxxxxxxxx","/opt/fhem/snapshots/IPCam_snapshot.jpg") })


Wenn man sich die schönen Graphiken zuschicken lassen will, geht so etwas leicht:
Zitat
system("wget -q -O -  'http://fhem:8083/fhem/SVG_showLog?dev=SVG_FileLog_t.wohnzimmer_Climate_1&logdev=FileLog_t.wohnzimmer_Climate&gplotfile=SVG_FileLog_t.wohnzimmer_Climate_1&logfile=CURRENT&pos=' | convert -density 1200  - /tmp/out.png);
Und

({ sendTextsecureAttachment("+491xxxxxxxxx","/tmp/out.png") })

malted

Da jetzt das Schicken von Bildern so gut klappt, habe ich bei dem Statusbild für Kindle-Reader etwas geklaut.

Wichtig ist, dass man am Ende den convert-Aufruf in der 99_myUtils.pm so ändert, dass er einen weißen statt transparenten Hintergrund baut:


system("convert $Ausgabedatei.svg -background white -flatten -type GrayScale -depth 8 $Ausgabedatei.png &");


Und dann am Ende noch ein zusätzliches:
Zitat
{ sendTextsecureAttachment("+491xxxxxxxxxx","/opt/fhem/snapshots/KindleDisplay.png") }
Ansonsten kommen da jetzt niedliche kleine Statusbilder.

otto

#3
Hallo habs mal installiert funkioniert recht gut ,
nun meine frage wie kann man ein *.txt versenden ?

{ sendTextsecureAttachment("+491xxxxxxxxxx","/opt/fhem/log/Seriell.txt") }
So bekomm ich Anwort :Doppelte Nachricht

{ sendTextsecure("+4917xxxxxxxxx","/opt/fhem/log/Seriell.txt") }
So bekomm ich Antwort :  "/opt/fhem/log/Seriell.txt"
kann mir einer helfen  ??

Gruß otto
Fhem 1 wire Adapter mit FT232RL&DS2480B Raspberry PI HMLAN HM485LAN HM-LC-Sw4-PCB   HMW-IO-12-SW7-DR Funkhandsender
FRITZ!Powerline 546E

malted

Bisher sind wohl nur Medien-Attachments vorgesehen.

Textfiles kann man aber einfach als Text direkt in Textsecure schicken.

Ich würde das umgekehrt einlesen und nur die letzten x Zeilen schicken. Dafür hab ich mal einen kurzen Proof of Concept geschrieben:

Das passende CPAN-Modul installieren:
sudo apt-get install libfile-readbackwards-perl

Dann oben in der 99_myUtils.pm das eintragen:
use File::ReadBackwards;

Folgende Sub schickt dann die letzten X Zeilen aus einem Logfile:

sub sendTextsecureLog($$$)
{
   my ($nr, $logfile,$numlines) = @_;
   my $dir = getcwd();
   my $Message="Sending last $numlines Lines from $logfile:\n";
   my $line;
   chdir "/opt/fhem/ts/";
   my $bw = File::ReadBackwards->new( $logfile ) or return "can't read 'log_file' $!" ;
   while ($numlines >0 and defined($line= $bw->readline ) ) {
     $numlines--;
     $Message.=$line;
   }
   Log 3, "sendTextsecure  Nr: ". $nr . " Message:\x22" . $Message . "\x22 ";
   #Direkter Aufruf
   system("/opt/textsecure/bin/textsecure -to=\"$nr\" -message=\"$Message\"");
   chdir "$dir";
}


Auf dem Telnet-Prompt dann einfach hiermit testen...
{ sendTextsecureLog("+4915xxxxxx", "/opt/fhem/log/fhem-2015-01.log", 10) }

otto

#5
Sorry meine Frage aber anscheinend liest ja dein Modul auch aus einem File oder ?
So könnte ich ja mit deiner Verson mein file Senden ?
oder versteh ich das falsch ?


Habs Versucht bekomm beim speichern der 99_myUtils.pm :

ERROR:
Undefined subroutine &main::myUtils_Initialize called at fhem.pl line 2019.

wenn ichs dan Teste bekomm ich wieder "doppelte Nachricht" aufs Handy
Ka was da fehtlt ?


Gruß otto
Fhem 1 wire Adapter mit FT232RL&DS2480B Raspberry PI HMLAN HM485LAN HM-LC-Sw4-PCB   HMW-IO-12-SW7-DR Funkhandsender
FRITZ!Powerline 546E

malted

Genau, damit kannst Du Textdateien verschicken.

Du hast irgendwas in Deiner 99_myUtils.pm falsch gemacht.

So sieht meine vollständig aus und damit geht es:


package main;
use strict;
use warnings;
use Cwd;
use File::ReadBackwards;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

######################################################
# Aufgabe    :Versenden von textsecure
# Parameter 1:Nummer Format +4917012345678
# Parameter 2:Message
#

sub sendTextsecure($$)
{
   my ($nr, $Message) = @_;
   my $dir = getcwd();
   chdir "/opt/fhem/ts/";
   Log 3, "sendTextsecure  Nr: ". $nr . " Message:\x22" . $Message . "\x22 ";
   #Direkter Aufruf
   system("/opt/textsecure/bin/textsecure -to=\"$nr\" -message=\"$Message\"");
   chdir "$dir";
}

######################################################
# Aufgabe    :Versenden von Attachments via textsecure - derzeit gehen nur Audio, Video und Bilder
# Parameter 1:Nummer Format +4917012345678
# Parameter 2:Pfad+Dateiname zu Attachment
#

sub sendTextsecureAttachment($$)
{
   my ($nr, $Message) = @_;
   my $dir = getcwd();
   chdir "/opt/fhem/ts/";
   Log 3, "sendTextsecure  Nr: ". $nr . " Message:\x22" . $Message . "\x22 ";
   #Direkter Aufruf
   system("/opt/textsecure/bin/textsecure -to=\"$nr\" -attachment=\"$Message\"");
   chdir "$dir";
}

######################################################
# Aufgabe    :Versenden der letzten x Zeilen von Textdateien via textsecure
# Parameter 1:Nummer Format +4917012345678
# Parameter 2:Pfad+Dateiname zu Textdatei
# Parameter 3:Die letzten wieviel Zeilen gesendet werden sollen
#


sub sendTextsecureLog($$$)
{
   my ($nr, $logfile,$numlines) = @_;
   my $dir = getcwd();
   my $Message="Sending last $numlines Lines from $logfile:\n";
   my $line;
   chdir "/opt/fhem/ts/";
   my $bw = File::ReadBackwards->new( $logfile ) or return "can't read 'log_file' $!" ;
   while ($numlines >0 and defined($line= $bw->readline ) ) {
     $numlines--;
     $Message.=$line;
   }
   Log 3, "sendTextsecure  Nr: ". $nr . " Message:\x22" . $Message . "\x22 ";
   #Direkter Aufruf
   system("/opt/textsecure/bin/textsecure -to=\"$nr\" -message=\"$Message\"");
   chdir "$dir";
}

1;


otto

Hab das von dir reingeschrieben Bekomm ich den Fehler :
Can't locate File/ReadBackwards.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl . ./FHEM) at ./FHEM/99_myUtils.pm line 5. BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 5.

Was muß ich alles nachinstallieren, und wo bekomm ich das her?

Gruß otto
Fhem 1 wire Adapter mit FT232RL&DS2480B Raspberry PI HMLAN HM485LAN HM-LC-Sw4-PCB   HMW-IO-12-SW7-DR Funkhandsender
FRITZ!Powerline 546E

malted

Zitat von: otto am 13 Januar 2015, 18:24:16
Was muß ich alles nachinstallieren, und wo bekomm ich das her?


Steht doch oben:
sudo apt-get install libfile-readbackwards-perl

otto

Sorry hab ich überlesen ::)
Gruß otto
Fhem 1 wire Adapter mit FT232RL&DS2480B Raspberry PI HMLAN HM485LAN HM-LC-Sw4-PCB   HMW-IO-12-SW7-DR Funkhandsender
FRITZ!Powerline 546E

otto

Hallo noch eine Frage dazu der Text wird von unten nach oben gelesen und so Zeilenweise gesendet
So kommt er bei Fhem rein:

1.1.2015  12:02    Störung im
                  Netzteil
1.1.2015  12:03   Rücketzen
so wird gesendet
1.1.2015  12:03   Rücketzen
                 Netzteil
1.1.2015  12:02    Störung im
kann man das umkehren ?


Gruß otto
Fhem 1 wire Adapter mit FT232RL&DS2480B Raspberry PI HMLAN HM485LAN HM-LC-Sw4-PCB   HMW-IO-12-SW7-DR Funkhandsender
FRITZ!Powerline 546E

malted

Zitat von: otto am 15 Januar 2015, 22:54:45
der Text wird von unten nach oben gelesen und so Zeilenweise gesendet
kann man das umkehren ?

Streiche:
     $Message.=$line;
Setze:
     $Message=$line.$Message;

opa007

Hallo malted,

bin begeistert von Deiner Anleitung. Vielen Dank für Deine Mühe!


Der opa007

fu_zhou

#13
Hallo malted,

bei mir ist bei der Installation irgendetwas schief gelaufen auf dem RasPi. Ich habe versucht, alles zu löschen, um noch einmal von vorne beginnen zu können, das gelingt mir aber nicht.
Es hat alles zunächst geklappt und ich habe auch den Code per SMS bekommen.
...
real    26m50.363s
user    20m58.890s
sys     3m22.900s

# Checking API compatibility.
Go version is "go1.4", ignoring -next /root/go/api/next.txt

real    3m33.505s
user    2m54.520s
sys     0m11.930s

ALL TESTS PASSED

---
Installed Go for linux/arm in /root/go
Installed commands in /root/go/bin
*** You need to add /root/go/bin to your PATH.
root@raspi:~/go/src#

Den SMS code habe ich eingegeben und es kam die Rückmeldung "Registration done", nur kam kein prompt mehr, der RasPi war also beschäftigt. Ich habe die Session über Nacht offen gelassen und heute morgen war der Bildschirm mit einem "EOF" je Zeile voll. Ich habe die Session geschlossen und eine Neue aufgemacht. Wenn ich jetzt versuche, eine Nachricht zu schicken, kommt ein panic:
root@raspi:~# ./gocode/bin/textsecure -to "+4917xxxxxxxx"
>Duplicate message: expected 1, got 0
panic: runtime error: slice bounds out of range

Hast du eine Idee, wie ich das gefixt bekomme bzw. was ich alles löschen muss, um noch mal vor vorne anfangen zu können?
FHEM auf RasPi 2, S7-300 mit ET200S über ProfiNet

Hausautomat

Das gleiche Problem habe ich hier auf einem ganz normalen laptop mit ubuntu auch. Die "Registration Done" muss man mit CTRL-C beenden (sonst tut sich da nix) und bei jedem SEND kommt ein Panic.