SMS empfangen (und senden) mit SMSTools

Begonnen von Carsten, 10 Mai 2013, 16:19:54

Vorheriges Thema - Nächstes Thema

Carsten

Hallo zusammen,

für ein Bastelprojekt brauche ich die Möglichkeit, SMS zu empfangen und auszuwerten.

Zu diesem Zweck habe ich mir auf einem Raspberry mit UMTS-Stick neben FHEM auch SMSTools installiert.

Die SMSTools ( oder SMS Server Tools ), schreiben und lesen die SMS als Textfiles in verschiedene Verzeichnisse. Eine empfangene SMS sieht z.B. so aus:

From: 4917612345678
From_TOA: 91 international, ISDN/telephone
From_SMSC: 491760000443
Sent: 13-05-10 11:43:43
Received: 13-05-10 11:44:01
Subject: GSM1
Modem: GSM1
IMSI: 1234567890
Report: no
Alphabet: ISO
Length: 8

Test SMS


Um nicht in dutzenden Funktionen mit den Files hantieren zu müssen, habe ich mir mit viel abgucken, googlen und ausprobieren ein kleines Modul zusammengeschustert. Das Empfangen und Senden von SMS funktioniert bei mir auch ganz gut. Da es mir aber sowohl im Linux- als auch im Perl-Umfeld an Erfahrung mangelt und ich irgendwie auch keine FHEM-Programmierreferenz finden konnte, ist bestimmt einiges an Blödsinn drin und ich wäre froh, wenn mal jemand mit mehr Erfahrung drüber schauen könnte.

Außerdem habe ich zwei Saschen, bei denen ich nicht weiß, wie ich sie umsetzen kann:

Im Moment suche ich alle <Interval> Sekunden nach neuen SMS-Dateien. SMSTools hat in der .conf aber auch einen Parameter um aktiv ein Skript zu starten, wenn Post kommt. Wie kann ich darüber den Einlese-Prozess in FHEM von außen anstoßen?

Da ich eine Prepaidkarte nutze, suchte ich außerdem nach einer Möglichkeit, das Guthaben unter Linux abzufragen. Ging laut Congstar nur mit Handy oder Windows-Software. Ich habe jetzt herausgefunden, dass das mit dem Programm "Gammu" und dem Befehl
gammu getussd '*100#'
in der Konsole funktioniert. Kann ich das Ergebnis irgendwie in FHEM einlesen?

Viele Grüße

Carsten

*edit* veralteten Anhang entfernt

Carsten

Okay,

bevor sich jetzt doch noch jemand die Mühe macht zu antworten ;) : Hat sich erledigt.

Ich starte den SMS-Fetch jetzt mit wget aus einem Shellscript. Unschön, aber funktioniert.
Für Gammu werde ich Webmin nutzen.

Danke trotzdem.

fiedel

Hi Carsten,

viel helfen kann ich dir wahrscheinlich nicht, aber ich möchte dich gern motivieren hier ab und zu deinen Entwicklungsstand zu posten. Es gibt scheinbar doch noch mehr Leute, die kein Smartphone mit Internetflat haben und gern per SMS benachrichtigt werden möchten, bzw. etwas steuern wollen.

Ich hab so ähnlich begonnen wie du und hab einen E220 (USB) am Dreamplug hängen, der per FHEM und Gammu SMSe schicken kann. Einfach ohne Perlmodul nur über Kommandozeilenaufruf aus FHEM:

...

    {system("echo $SMSText. | sudo gammu --sendsms TEXT 01621234567890 &")};;\
    Log 1, "SMS wurde versendet: $SMSText";; \

...

Für das Empfangen und Auswerten hatte ich bisher nichts gefunden, was mit meinem Kenntnisstand halbwegs zu bewerkstelligen war und hab das Thema also erst mal beiseite gelegt.

Da kommt mir doch dein Modul wie gerufen... ;o)
Irgendwas unsinniges konnte ich darin nicht entdecken, das Meiste verstehe ich aber ohnehin noch nicht.
Ganz unten schreibst du die Variablen mit den Daten der empf. SMS in Readings und weißt nicht wozu das gut ist? Ich glaube die Readings stehen dann FHEM- weit zur Verfügung und können im Programmcode überall verwendet werden, ähnlich wie globale Variablen, die aber immer zu einem bestimmten Gerät gehören:

z.B. hier die Werte von Temperatursensoren:

...

my $T_aussen = (ReadingsVal("Sens_TF_Aussen", "temperature", " "));;\
my $T_innen = (ReadingsVal("Sens_TF_Wohnz_UG", "temperature", " "));;\
\
  if (($T_aussen <= 15.0) and OldValue("Fenster_Status") eq "Closed") {\
  fhem("define Lueft_beend_A at +00:03:00 trigger Func_Fenster_Pruef_zu_N");;\

...

Also vielen Dank für das Modul, das mich einen großen Schritt weiter bringt in Richtung SMS- Steuerung und natürlich weiter so! ;o)

Viele Grüße

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Carsten

Hallo Frank,

danke für das Feedback.

Bei mir ist der Grund nicht fehlendes Internet am Handy sondern am Raspi :)
Außerdem will ich damit Alarm-SMS auswerten, die eben nur als SMS kommen. Daher brauchte ich die Möglichkeit, SMS zu empfangen. Das Senden ist eher willkommenes Abfallprodukt.

Zitat von: fiedel schrieb am So, 12 Mai 2013 09:54Ganz unten schreibst du die Variablen mit den Daten der empf. SMS in Readings und weißt nicht wozu das gut ist? Ich glaube die Readings stehen dann FHEM- weit zur Verfügung und können im Programmcode überall verwendet werden, ähnlich wie globale Variablen, die aber immer zu einem bestimmten Gerät gehören:

Danke, ich weiß schon, wozu die Readings gut sind. Das funktioniert auch. Was ich nicht weiß, ist der Unterschied zwischen der Verwendung von ReadingsBulkUpdate() und dem direkten Schreiben in die Readings. Meine Vermutung ist, das die Bulk-Geschichte nur ein Event triggert, aber ich konnte keine Doku dazu finden.

Was ich z.B. auch nicht weiß, ist, wie man es hinkriegt, dass es so ein Dropdown mit den möglichen Set-Befehlen gibt. Für die Attribute habe ich was gefunden, für die Befehle bisher nicht.
Auch das zusammenkleistern der SMS beim Senden ist eine Krücke, weil ich nicht weiß, wie ich an den gesamten Reststring komme. Funktioniert aber scheinbar. :)

Ich häng den aktuellen Stand nochmal an, an dem sich wohl auch nicht mehr viel ändern wird. Für mich funktioniert das so ganz gut, allerdings ist es vermutlich nicht sehr fehlertolerant, da es quasi kein Fehlerhandling gibt. Mir fehlt aber das Know-How um das allgemein gültig zu machen.

Neu im Vergleich zur Vorversion ist, dass man mit
set <Name> FetchSMS
das Suchen nach SMS-Files manuell anschubsen kann und den Automatismus mit
attr <Name> Interval 0
abschalten kann.
Mit set <Name> SendSMS <Nummer> <Text> kann man SMS senden.
Die Nummer muss dabei mit dem Ländercode ohne + oder 00 beginnen. Also z.B.
set SMS SendSMS 4917612345678 Dies ist eine SMS
Kann sein, dass die Nummer auch anders geschluckt wird, aber so stand es in der Doku und so funktionierts auch.

Im Attribut "ReceivedDir" muss man ein Verzeichnis angeben, in das bereits eingelesene SMS verschoben werden, damit dieselbe SMS nicht immer wieder eingelesen wird. Der default ist /var/spool/sms/received.

Gruß

Carsten

CQuadrat

Hallo Carsten,

ich habe smstools auf Linux-Ebene am laufen und würde SMS-Benachrichtigungen nun gerne in FHEM einbinden. Dazu scheint mir dieses Modul gerade richtig zu sein. Nur kann ich leider keine Doku finden, wie ich das Modul einbinden kann. Gibt es dazu irgendetwas? Wäre schade, wenn daher dieses Modul keine Anwender finden würde.


Danke und Gruß

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

Carsten

#5
Hallo Christoph,

sorry für die späte Antwort, ich war die letzten Tage nicht im Forum.

Eine Doku gibt es leider nicht. Mangels Resonanz sah ich auch keinen Grund, das zu ändern. Eigentlicher Sinn des Threads war ja, jemanden mit Perl-Know-How über den Code schauen zu lassen.

Man muss aber auch gar nicht soviel machen, um das zu nutzen.

Mit Define <MyName> SMSTOOLS legt man wie bei den meisten anderen Modulen auch eine Instanz von SMSTools an.

Wenn die SMSTools so konfiguriert sind, wie bei mir, war es das im Grunde schon.
Das Modul braucht drei Verzeichnisse:

  • IncomingDir für eigehende SMS. Default "/var/spool/sms/incoming/"
  • ReceivedDir für eingelesene SMS. (Werden nach dem Einlesen aus IncomingDir in ReceivedDir verschoben.) Default "/var/spool/sms/received/"
  • OutgoingDir für zu sendende SMS. Default "/var/spool/sms/outgoing"

Wenn die Verzeichnisnamen anders lauten, als der Default, sollte man Sie über die gleichnamigen Attribute ändern können.
Also z.B.
attr MyName IncomingDir /etc/incoming
Das habe ich allerdings nie ausprobiert.  ::)

In allen drei Verzeichnissen braucht FHEM die entsprechenden Rechte.

Außerdem gibt es noch ein Attribut "Interval", in dem man hinterlegen kann, in welchen Intervall nach neuen SMS im Verzeichnis <IncomingDir> geschaut werden soll. Alternativ kann man das einlesen mit set <MyName> FetchSMS
manuell anstoßen.

*edit*
Das Senden hatte ich ja oben schonmal beschrieben. Der Vollständigkeit halber aber hier auch nochmal:
Zitat von: Carsten am 12 Mai 2013, 11:57:41
Mit set <Name> SendSMS <Nummer> <Text> kann man SMS senden.
Die Nummer muss dabei mit dem Ländercode ohne + oder 00 beginnen. Also z.B.
set SMS SendSMS 4917612345678 Dies ist eine SMS
Kann sein, dass die Nummer auch anders geschluckt wird, aber so stand es in der Doku und so funktionierts auch.


Gruß

Carsten

CQuadrat

Hallo Carsten,

vielen Dank für Deine ausführliche Antwort.

Ich will, dass FHEM unabhängig vom Internetzugang ist und mir die Möglichkeit schaffen, dass mir mein FHEM Warn-SMS zuschickt. Zusätzlich möchte ich es ermöglichen, per SMS an FHEM diverse Aktionen auszulösen. Dies sollte mit Deinem Modul möglich sein.

Leider kämpfe ich noch damit, meinen UMTS-Stick auf meinem FHEM-Raspberry zum Laufen zu bringen. Allerdings läuft der Stick sowohl auf meinem Ubuntu-Notebook als auch auf einem zweiten Raspberry mit xmbc ohne Probleme. Wegen der Stromversorgung habe ich auch schon die verschiedensten USB-Hubs ausprobiert. 

Irgendjemand hier eine Idee, wo das Problem liegen könnte?



Viele Grüße

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

Carsten

Hallo,

wie sieht denn das Fehlerbild aus?

Ist ne Weile her, dass ich das eingerichtet habe. An meinem Raspi (Raspbian) läuft ein Tchibo USB-Stick (Huaweii irgendwas) mit Congstar SIM an einem aktiven USB-Hub (auch Tchibo) ohne Probleme.
Davor hatte ich einen Vodafone Websessions Stick dran, der auch problemlos funktionierte. Allerdings musste ich feststellen, dass der Vodafone-Tarif keinen SMS-Versand beinhaltete.

Das nächste Problem, über das ich gestolpert bin, war, dass die Huawei Sticks sich erstmal als Datenträger anmelden. Unter Windows schaltet die der Treiber dann in den Modemmodus, unter Linux muss man das ggf. selber machen. Dafür gibt es usb_modeswitch

Eingerichtet habe ich den Stick nach SMSTools-Doku bzw. -Forum. Da gibt es ja für fast jeden Stick die nötigen Einstellungen.
Soweit ich mich erinnere schreiben die SMSTools auch ein Log, wenn irgendwas nicht funktioniert.

nochmal zusammengefasst aus dem Gedächtnis mögliche Fehlerquellen(, die ich alle mitgenommen habe):
- Stick hat zu wenig Strom -> aktives USB-HUB nutzen
- SMSTools verbindet sich zu falschem Port -> Prüfen, ob der Stick auch am konfigurierten Port hängt.
- Stick ist im Datenträgermodus -> usb_modeswitch
- SMSTools ist falsch konfiguriert -> Prüfen, ob der daemon läuft und Log checken
- SMSTools hat keine Rechte im Zielverzeichnis -> Rechte prüfen, sollte auch im Log stehen
- Tarif lässt keinen SMS-Versand zu -> tjoa... Empfang ging bei dem zumindest trotzdem

Viele Grüße

Carsten

kud

Tolle Geschichte.
Hast Du etwas vorgesehen wenn eine SMS eintrifft und einen bestimmten Inhalt hat?
Also quasi FEHM reagiert auf eingende SMS mit bestimmten Aktionen.

Gruss
Kai-Uwe

Carsten

Hallo Kai-Uwe,

ich habe das bei mir so gemacht, dass ich über ein notify bei jeder eingehenden SMS eine Prozedur in meiner myUtils triggere, die die SMS auswertet.
Ob man direkt im Notify schon per Regexp auf den Inhalt prüfen kann, weiß ich leider nicht. Ich finde es übersichtlicher, nicht zuviel Logik in die notifys selbst zu packen.
Im besten Fall würde wahrscheinlich jedes Wort der SMS als einzelner EVTPART interpretiert. Habe ich aber noch nicht ausprobiert.

Gruß

Carsten

CQuadrat

Hallo Carsten,

Zitat von: Carsten am 21 Januar 2014, 12:16:48
wie sieht denn das Fehlerbild aus?
(...)
Das nächste Problem, über das ich gestolpert bin, war, dass die Huawei Sticks sich erstmal als Datenträger anmelden. Unter Windows schaltet die der Treiber dann in den Modemmodus, unter Linux muss man das ggf. selber machen. Dafür gibt es usb_modeswitch

Der Stick wird in der Tat als Datenträger erkannt. Leider hatte ich noch keine Zeit gefunden, das mit usb_modeswitch zu ändern. Ich hoffe aber, dass ich mir das die nächsten Tage nochmal vornehmen kann.


Viele Grüße

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

kud

Nochmal zurück zur eingehenden SMS.
Habe ich richtig verstanden, dass nach einer "Interval"-zeit oder per Hand eine eingehende SMS zur Verfügung steht. Also nicht zeitgleich.
Wie sieht denn der entsprechende NOTIVY aus?  Kannst Du bitte ein Beispiel einstellen.

Danke und Gruss

Carsten

Hallo,

wie im zweiten Post geschrieben, habe ich das bei mir so gelöst, dass ich per Linux-Script das "manuelle" abrufen starte, sobald eine SMS eingegangen ist. In der Config von SMSTools kann man einstellen, dass ein Programm oder Script gestartet werden soll, sobald eine SMS eingeht. Da habe ich das Script hinterlegt, dass per WGET den Befehl zum Abrufen triggert. Dadurch wird die SMS sofort eingelesen.

Sorry, aber für eine elegantere Lösung fehlt mir das Know How und in Ermangelung besserer Tipps musste ich mir halt so behelfen.  :-[

Ich hab im Moment keinen Zugriff auf den betr. Raspi, aber ich werde versuchen das zwecks Beispiel die nächsten Tage zu ändern.

Gruß

Carsten

Carsten

Hallo,

habe jetzt mal den Raspi wieder in den Fingern gehabt.

In /etc/smsd.conf habe ich eingetragen:
eventhandler = /usr/local/bin/smsscript/fetchsms.sh
Dadurch wird bei jeder eingehenden SMS das Script fetchsms.sh gestartet.

Das Script sieht so aus:
wget "localhost:8083/fhem?cmd=set+SMSGateway+FetchSMS";
rm fhem?cmd*

SMSGateway ist der Name meiner SMSTools-Instanz. Dadurch wird das einlesen der SMS gestartet.

Mit
define act_OnSMS notify SMSGateway {DoOnSMSReceived()}
habe ich ein notify definiert, dass die Verarbeitung der SMS startet.
Die Funktion DoOnSMSReceived ist in meiner 99_myUtils und verarbeitet über
ReadingsVal("SMSGateway", "MsgText", "" );
direkt das Reading MsgText.

Gruß

Carsten

no_Legend

#14
Hi ich hab auch gerade probiert mit dem Modul eine SMS abzusetzen.
Leider startet jedesmal, wenn ich probiere eine sms zu verschicken FHEM neu.
Hat einer ne Idee dazu?

Edit: Nun gehts. Scheint nur dann abzustürzen wenn smstools nicht richtig konfiguriert ist.
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.