Ich hab mir ne SMS-Alarmierung aus einem kleinen C-Programm und bash-Skripten gebastelt. Beim auslösen des FME (Anschluß des Relais am Parallelport des PC) geht die ganze Sache los.
Hat jemand Interesse an einer näheren Beschreibung?
duese
Ich hab mir ne SMS-Alarmierung aus einem kleinen C-Programm und bash-Skripten gebastelt. Beim auslösen des FME (Anschluß des Relais am Parallelport des PC) geht die ganze Sache los.
Hat jemand Interesse an einer näheren Beschreibung?
duese
Geändert von duese (10.02.2006 um 10:41 Uhr)
immer gerne eine sehr praktische sache
Also hier die Beschreibung für eine SMS-Alarmierung unter Linux (ausgelöst durch einen FME):
Ich entschuldige mich jetzt schon für die Länge, aber trotzdem viel Spaß!
Fangen wir mit der Hardware an.
Das Signal vom FME-Relais wird dem Rechner per paralleler Schnittstelle mitgegeben.
Der Parallelport hat fünf Input-Leitungen S3-S7. Die Verteilung auf die Pins am Stecker ist wie folgt:
S3 Pin15
S4 Pin13
S5 Pin12
S6 Pin10
S7 Pin11
Von diesen fünf Pins wird jeweils ein 4,7kOhm Widerstand zu Pin1 gelötet (wenn weniger Eingänge benötigt werden, kann man auch weniger Widerstände einbauen. Aber die sind nicht teuer und man ist für alles kommende flexibel).
Die Widerstände ziehen die Einganspins auf HIGH-Potential. Will man nun dem PC etwas mitteilen, wird der betreffende Pin auf LOW-Potential gezogen, d.h. einfach mit Masse (Pin18 - Pin25) verbunden. Die beiden Kontakte des FME-Relais werden also beispielsweise an Pin15 und Pin25 angeschlossen.
Das wars schon von der Hardwareseite.
Auslesen des Parallelports.
Nachdem ich kein passendes fertiges Programm gefunden hab, hab ich ein kleines Tools selbst geschrieben: lpin1.0
Das Tool ließt ca. 5 mal pro Sekunde den Status des ersten Parallelports (Basisadresse 0x378) ein. (Sollte ein andere Parallelport verwendet werden, wird das im Sourcecode geändert und nochmal kompiliert. Falls nötig einfach den Quellcode anschauen, sollte fast selbsterklärend sein, ansonsten Fragen, dann kriegen wir das hin)
Eine kompilierte Version von lpin hab ich anghängt. Die Erweiterung ZIP ist nur, weil das Board lpin ohne erweiterung nicht wollte. Speichern, Erweiterung entfernen und chmod nicht vergessen. Der Quellcode kommt nach sobald ich eine README geschrieben hab. [Edit: Der Quellcode ist jetzt auch verfügbar, siehe Anhang]
Das Tool wird als root gestartet.
(Bei mir im GENTOO hab ich
su - root -c "/usr/local/bin/lpin > /dev/tty9 &"
in /etc/conf.d/local.start eingetragen ums beim Systemstart auszuführen)
Verändert eine der Leitungen S3-S7 den Status wird ein zugehöriges Skript ausgeführt.
Beispiel:
Ein an Pin15 (S3) angeschlossenes Relais zieht an (wird eingeschaltet) führt /usr/local/bin/on3 aus.
Fällt das Relais wieder ab, wird /usr/local/bin/off3 ausgeführt
Für die anderen Leitungen entsprechen on4, off4, on5.........
(Bemerkung: Solange eines dieser Skripen ausgeführt wird, hält das lpin an. Diese Zeit kann minimiert werden, z.B. durch den Aufruf von weiteren Skripten/Programmen druch screen im Hintergrund.)
/usr/local/bin/on3 sieht bei mir z.B. so aus:
Zuerst wird ein Logeintrag in /var/log/lpin.log mit Datum und Uhrzeit und dem ausgeführten Skript erzeugt.Code:#!/bin/bash echo "`date +"%Y%m%d %X"` Ausfuehrung $0" >> /var/log/lpin.log su - smsalarm -c 'screen -d -m /home/smsalarm/execute_alarm_by_fme'
Die nächste Zeile startet das Skript, daß alle weiteren Aktionen ausführt.
su - smsalarm -c bewirkt, daß das Alarmierungsskript nicht mehr als root sondern als User smsalarm läuft. (Es kann natürlich jeder andere User verwendet werden...)
screen -d -m bewirkt das execute_alarm_by_FME im Homeverzeichnis des Users smsalarm im Hintergrund ausgeführt wird. (Dafür ist natürlich das Programm screen nötig)
Ab hier spielt sich alles alles im Homeverzeichnis vom User smsalarm ab.
execute_alarm_by_FME:
Der eigentliche Aufruf der Alarmierung ist /home/smsalarm/smsalarm alarmCode:#!/bin/bash screen -d -m /home/smsalarm/smsalarm alarm screen -d -m /Was_auch_immer_sonst_noch_ausgeführt_werden_soll
Das zusätzliche screen ist nicht nötig, wenn nur der SMS-Alarm ausgelöst werden soll. Sollen jedoch noch andere Skripte/Programme zeitgleich mit der SMS-Alarmierung gestartet werden macht das Sinn (siehe zweite Zeile)
Jetzt aber zum eigentlichen SMS-Alarmirungsskript
Vorraussetzung ist eine Verbindung zum Internet. Entweder DSL-Faltrate (wie bei mir) oder auch Einwahl. Diese müßte dann halt noch an entsprechender Stelle eingebaut werden.
Das Skript wurde zur Versendung von SMS mit sms77.net geschrieben.
Solltet ihr euch da anmelden wollen, wäre es nett, ihr würdet es über folgenden Link tun:
http://www.sms77.net/?ref=dmu
In die Datei /home/smsalarm/smsalarm.users werden in jede Zeile einzeln die zu alarmierenden Handynummern geschrieben. Dahinter kann auch druch Leerzeichen getrennt ein Name stehen, um den Überblick zu behalten.
z.B.
Alarmiert wird nur wenn als erster Parameter alarm Angegeben wird.: /home/smsalarm/smsalarm alarmCode:01797654321 Name1 016166666666
Wird nichts angegeben wird nur bei sms77.net angefragt, ob die Parameter des Anrufs korrekt sind.
wird /home/smsalarm/smsalarm debug aufgerufen, wird das das gleiche gemacht wie ohne Parameter, die Meldungen werden aber nicht in das logfile smsalarm.log geschrieben, sondern am Bildschirm ausgegeben.
Im Skript selber müssen noch Username, Passwort, der zu schickende Text die Handynummer, an die die Statussms am Schluß geschickt werden soll und der Absender geändert werden.
Für die Übermittlung der Daten an SMS77 muß das Programm curl installiert sein.
Mit den jetzigen Einstellungen versucht das Skript jede SMS mit einem Timeout von max. 5 Sekunden zu verschicken. Schlägt der Versand einer oder mehrerer Nummern fehl (falscher oder kein Fehlercode von sms77) werden für jede Nummer maximal insgesamt 5 Versuche gemacht.
Geändert von duese (17.11.2006 um 14:30 Uhr)
Das Skript ist kommentiert. Sollte doch was unklar sein, einfach fragen.....
smsalarm:
Beim Start von smsalarm wird überprüft ob die Datei smsalarm.lock existiert. Wenn nicht wird sie angelegt und das Skript ausgeführt.Code:#!/bin/bash # Skript zur SMS-Alarmierung über SMS77 # Daniel Müllegger 2006 # Dieses Skript darf frei verwendet oder verändert werden. # Für Funktion oder Fehlerfreiheit kann ich keinerlei Garantien übernehmen # Viel Spaß beim alarmieren! # Dieses Skript benötigt CURL # USER: Username bei sms77.de: # PASS: Passwort bei sms77.de: # USERSFILE: Diese Datei enthält die zu alarmierenden Tel.-Nummern, eine je Zeile: # ALARMTEXT: Der Text der in der SMS enthalten ist: # TYPE: Typ der SMS. Möglich: basicplus, quality, standard, festnetz, flash # FROM: Absender der SMS USER=xxx; PASS=xxxxxxxx ALARMTEXT="FFW XYZ SMS Benachrichtigung. Ein Alarm ist eingegangen. Alle Angaben ohne Gewähr "`date +"%X %d.%m.%Y"` TYPE=quality FROM=FFWXyz # STATUSUSER: An diese Nummer wird als letztes eine SMS-verschickt mit Text, Startzeit, Datum, Endzeit der Alarmierung, # Anzahl erfolgreicher SMS/Anzahl User/Anzahl der Versuche insgesamt und Kontostand vor Versand der Statussms STATUSUSER=01711234567 # USERSFILE: In dieser Datei stehen die zu alarmierenden Handynummern je eine am Anfang einer Zeile. # Dahinter durch ein Leerzeichen getrennt können Namen oder Kommentar stehen. # LOGFILE: Logdatei # LOCKFILE: Wenn diese Datei existiert, wird das Skript nicht ausgführt und nur eine Logmeldung ausgeben. # Damit werden Mehrfachalarmierungen (z.B. durch mehrere Schleifen) vermieden. # URL: An diese URL werden die Parameter per http-get-Befehl mittels curl übergeben. USERSFILE=$0.users LOGFILE=$0.log LOCKFILE=$0.lock URL="http://www.sms77.net/gateway/" #Für Logfile WHAT="[sms] " # Wenn DISABLESMS=" -d debug=1" gesetzt ist, werden keine SMS verschickt, # sondern nur am Server angefragt, ob die Syntax i. O. ist DISABLESMS=" -d debug=1" if [ "$DISABLESMS" = " -d debug=1" ] ; then WHAT=[nosms]; fi if [ "$1" = "alarm" ] ; then WHAT=[alarm]; DISABLESMS="" ; fi if [ "$1" = "debug" ] ; then WHAT=[debug]; DISABLESMS=" -d debug=1" ; fi if [ -e $0.probe ] ; then WHAT=[probe]; DISABLESMS=" -d debug=1" ; fi if [ ! -e $LOCKFILE ] then { touch $LOCKFILE WRITETOLOG="`date +"%Y%m%d %X"` $WHAT ***************** Start der SMS Alarmierung ********************" ; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** Übermittelte Nachricht: $ALARMTEXT ***" ; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; # Zu alarmierende Tel.-Nummern einlesen USERSTOALARM=`cat $USERSFILE |awk '{ print $1}'` USERSNOTALARMED="" NOOFUSERS=0 NOOFALARMEDUSERS=0 NOOFTRYS=0 for TRY in `seq 5` do USERSNOTALARMED="" for NUMBER in $USERSTOALARM do if [ $TRY = 1 ]; then NOOFUSERS=$[$NOOFUSERS + 1] ; fi TEXT=$ALARMTEXT DATA="-d u=$USER -d p=$PASS -d to=$NUMBER -d from=$FROM -d text=${TEXT//" "/%20} -d type=$TYPE$DISABLESMS" RESULT="" RESULT=$(curl -m 5 --silent --get $DATA --url $URL); if [ "$RESULT" != "100" ]; then USERSNOTALARMED="$USERSNOTALARMED $NUMBER"; else NOOFALARMEDUSERS=$[$NOOFALARMEDUSERS +1]; fi WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $TRY $RESULT $NUMBER $FROM $TYPE"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; NOOFTRYS=$[$NOOFTRYS + 1] done USERSTOALARM=$USERSNOTALARMED if [ "$USERSTOALARM" != "" ]; then sleep 3; fi done ACCOUNTDATA="-d u=$USER -d p=$PASS" GUTHABEN=-na- GUTHABEN=$(curl -m 5 --silent --get $ACCOUNTDATA --url $URL/balance.php); WRITETOLOG="`date +"%Y%m%d %X"` $WHAT Konto: $USER Restguthaben: $GUTHABEN"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; TO=$STATUSUSER TRY=X TEXT="$ALARMTEXT `date +"%X"` $NOOFALARMEDUSERS/$NOOFUSERS/$NOOFTRYS Konto: $USER $GUTHABEN EUR" DATA="-d u=$USER -d p=$PASS -d to=$TO -d from=$FROM -d text=${TEXT//" "/%20} -d type=$TYPE$DISABLESMS" RESULT="" RESULT=$(curl -m 5 --silent --get $DATA --url $URL); WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $TRY $RESULT $TO $FROM $TYPE ---$TEXT---"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; NOWAIT="" if [ "$2" = "nosleep" ] ; then NOWAIT="ist deaktiviert" ; fi WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** 60 Sekunden warten $NOWAIT ***"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; if [ "$2" != "nosleep" ] ; then sleep 60 ; fi rm $LOCKFILE > /dev/null 2>&1 WRITETOLOG="`date +"%Y%m%d %X"` $WHAT ***************** Ende der SMS Alarmierung ********************"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; }; else { WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $0 abgebrochen ($LOCKFILE existiert)"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; }; fi
Wenn nicht wird nur eine Log-Meldung geschrieben.
Nachdem die Alarmierung durch ist wird noch 60 Sekunden gewartet und dann smsalarm.lock gelöscht. Auf diese Weise werden Mehrfachalarmierungen (z.B. durch AU) verhindert.
Existiert die Datei /home/smsalarm/smsalarm.probe wird das Skript wie beim Aufruf smsalarm debug abgearbeitet und Logmeldungen geschrieben, aber keine SMS versandt.
So können z.B. mit cronjobs einfach Probealarme ausgeblendet werden.
Noch eine Anmerkung zu den Dateinamen:
Die lock, log, users und probe Dateien sind abhängig von Name und Pfad des eigentlichen Alarmskriptes. Benennt man smsalarm um in kleineschleife, dann werden die Dateien
kleineschleife.log, kleineschleife.lock, kleineschleife.users und kleineschleife.probe heißen.
Auf diese Weise kann man einfach Verschiedene Schleifen realisieren.
Ich hoffe ich hab verständlich genug geschrieben. Viel Spaß beim Alarmieren.
duese
P.S. Für Richtigkeit und Fehlerfreiheit der Skripten und Programme kann ich leider keine Garantie übernehmen. Aber den ersten erfolgreichen Einsatz hatte das System heute beim Probealarm
Wäre es möglich auch ein Skript zu schreiben für IB-Systems und Aufruf durch den Crusader?
Leider hab ich von dem ganzen Skripzeugs keine Ahnung.
Vielen Dank aber schon im Voraus.
Gruss Andy
Weil kein <html> mehr zugelassen ist, muss ich mir erst eine neue Signatur im vB Code machen. So long....
Natürlich kann das ganze umgebaut/erweitert werden um auch mit IB-Systems zu funktionieren. Ich hab aber bis jetzt noch keine Beschreibung der http-API gesehen.
Der Aufruf kann selbstverständlich auch von jedem anderen Programm unter Linux aus passieren (läuft Crusader unter Linux?).
duese
Ja, der FMS-Crusader läuft unter Linux weil er in Java geschrieben wurde.Zitat von duese
Ok, dann kein Problem, wenn er externe Programme ausführen kann.
/Verzeichnis_in_dem_das_skript_liegt/smsalarm alarm
ausführen und der Spaß geht los.
duese
Hi duese,
hab deinen Beitrag im "SMS über DSL für 4,7Ct" - Thread gelesen.
Was meinst du mit http-api?
Gruss Andy
Weil kein <html> mehr zugelassen ist, muss ich mir erst eine neue Signatur im vB Code machen. So long....
Meinst du das hier:
www.gibma.de/ibss.zip In der Anleitung steht da was von Parametern und wie die html-Zeile aussieht, wenns rausgeschickt wird.
Anbei noch ein Datenblatt von IB-Systems http-Schnittstelle,
Gruss Andy
Weil kein <html> mehr zugelassen ist, muss ich mir erst eine neue Signatur im vB Code machen. So long....
Der Versand der SMS geschieht über eine http-Schnittstelle.
(API steht glaub ich für AdvancedProgrammingInterface oder so ähnlich)
Bei SMS77 (mit den anderen hab ich mich noch nicht näher beschäftigt) werden die benötigten Daten als Parameter eines http-get-Befehls übergeben.
D.h. Du könntest allein mit einem Internet-Browser SMS verschicken.
Gib im browser
ein und es wird mit dem Benutzerkonto "benutzer", Passwort "passwort" eine qualitysms an "00491609876543" mit dem Text "meine erste nachricht" verschickt.Code:http://www.sms77.de/gateway/?u=benutzer&p=passwort&to=00491609876543&text= meine%20erste%20nachricht&type=quality&from=sms77.de
Genau diese Aufrufe werden im Skript mit dem Programm curl statt einem Browser gemacht.
duese
Hallo duese,
ja genau das ist es! Bei IB-Systems läuft des genauso. Nur dass hier andere Parameter/Variablen benutzt werden. Kann man sehr gut in dieser Beschreibung rausfinden: www.gibma.de/ibss.zip
Wäre super, wenn du da was drehen könntest.
Gruss Andy
Weil kein <html> mehr zugelassen ist, muss ich mir erst eine neue Signatur im vB Code machen. So long....
@kOnDeNsAtOr:
Die Parameter die in der Beschreibung von ibss.exe angegeben werden sind nicht die gleichen wie die die dann von ibss.exe an das Gateway übergeben werden.
Aber ich hab mich mal testweise bei ib-systems angemeldet und eine Beschreibung der API gefunden. Ich denk, daß sollte sich im Laufe der nächsten Woche machen lassen.
Machst Du mir den (alpha/beta)Tester?
duese
Moin Düse, hast du Lust die Anleitung als Projekt mit in das MonitorWiki (http://monitor.gambri.net) einzupflegen?Zitat von duese
Hmm also den Anbieter SMS77 kann ich überhaupt nicht empfehlen.
Ich habe mehrere Tests gemacht:
Mail2SMS -> SMS kamen 2 Tage später auf meinem Handy an
SMS per URL -> kam überhaupt nicht an
das einzige was klappte, allerdings auch mit einer Verzögerung von gut 5min war
das senden einer SMS von deren Webseite aus.
Das hat mich garnicht überzeugt :/
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)