Nachdem makki ja den smsd zur Verfügung gestellt hat und das senden von SMS so einfach ist -> https://knx-user-forum.de/wiregate/1...gateway-2.html kam mir die Idee das ganze natürlich auch umgekehrt einzusetzten. Bei dem schönen Wetter mitten im Juli hat man ja doch den ein oder anderen Nachmittag Zeit ohne Reue drin zu sitzen.
Also das Grundgerüst steht, alle 60 Sekunden wird das Plugin aufgerufen und checkt den Ordner von smstools/smsd auf neue Nachrichten/Dateien. Dann werden die Dateien ausgelesen, der Emfänger und die Nachricht extrahiert.
Der Absender sollte in einer @allow-Liste stehen (nicht umgesetzt, aber kein Problem) um Missbrauch zu vermeiden.
Frage 1:
Theoretisch müsste es doch auch möglich sein das Plugin aufzurufen sobald eine Datei im entsprechenden Ordner erstellt wird (vgl. etc/wiregate/plugin/generic) - Priorität niedrig. Nice to have.
Frage 2:
Wie würdet Ihr euch die Auswertung des Textes wünschen/vorstellen?
Im Beispiel hab ich nur einen einzigen Befehl implementiert. Licht an oder Licht aus im Esszimmer (Essen). Mit ein paar arrays und hashes oder dem Auslesen der eibga.conf könnte man da bestimmt was gutes machen, setzt aber eine sehr gepflegt eibga.conf voraus. Weiter problematisch auch die unterschiedlichen GAs für Rückmeldung, Wert, relativ dimmen etc.. Hier ist ein wenig Brainstoming gefragt. Hier beruht das System erstmal aus dem Zusammensetzten der GA mit Hauptgruppe, Mittelgruppe und Untergruppe.
Eine Nachricht wäre zum Beispiel:
"Licht unten zum Essen an"
$hg -> Hauptgruppe: Licht = 1 / Steckdosen =2
$mg -> Mittelgruppe: Unten(EG) = 1 / Oben(OG) = 2
$ug -> Untergruppe: Essen(Esszimmer Licht) = 60
$val -> Wert: An = 1 / Aus =0
GA: 1/1/60 Wert: 1
Hier nun das Grundgerüst (@allow ist erstmal egal):
Also das Grundgerüst steht, alle 60 Sekunden wird das Plugin aufgerufen und checkt den Ordner von smstools/smsd auf neue Nachrichten/Dateien. Dann werden die Dateien ausgelesen, der Emfänger und die Nachricht extrahiert.
Der Absender sollte in einer @allow-Liste stehen (nicht umgesetzt, aber kein Problem) um Missbrauch zu vermeiden.
Frage 1:
Theoretisch müsste es doch auch möglich sein das Plugin aufzurufen sobald eine Datei im entsprechenden Ordner erstellt wird (vgl. etc/wiregate/plugin/generic) - Priorität niedrig. Nice to have.
Frage 2:
Wie würdet Ihr euch die Auswertung des Textes wünschen/vorstellen?
Im Beispiel hab ich nur einen einzigen Befehl implementiert. Licht an oder Licht aus im Esszimmer (Essen). Mit ein paar arrays und hashes oder dem Auslesen der eibga.conf könnte man da bestimmt was gutes machen, setzt aber eine sehr gepflegt eibga.conf voraus. Weiter problematisch auch die unterschiedlichen GAs für Rückmeldung, Wert, relativ dimmen etc.. Hier ist ein wenig Brainstoming gefragt. Hier beruht das System erstmal aus dem Zusammensetzten der GA mit Hauptgruppe, Mittelgruppe und Untergruppe.
Eine Nachricht wäre zum Beispiel:
"Licht unten zum Essen an"
$hg -> Hauptgruppe: Licht = 1 / Steckdosen =2
$mg -> Mittelgruppe: Unten(EG) = 1 / Oben(OG) = 2
$ug -> Untergruppe: Essen(Esszimmer Licht) = 60
$val -> Wert: An = 1 / Aus =0
GA: 1/1/60 Wert: 1
Hier nun das Grundgerüst (@allow ist erstmal egal):
Code:
#!/usr/bin/perl # sms-action # make action with sms # JuMi2006 / www.knx-user-forum.de # Version: 0.1 alpha # Datum: 13.07.2012 use warnings; use strict; ### KONFIGURATION ### my $directory = "/var/spool/sms/incoming"; #Pfad fuer smsd my $newpath = "/var/spool/sms/knx-used"; my @allow = (4916098331****,4917238*****); ### KONFIGURATION ENDE ### ### Variablen definieren my ($entry,$content,@line,$from,$hg,$mg,$eg,$val); ### Verzeichnis einlesen opendir (DIR, $directory) or warn "Could not open the dir ".$directory.": $!"; my @files = grep !/^\.\.?$/, readdir DIR; closedir DIR; ### Dateien abarbeiten while (defined($entry = shift @files)) { &read_line; #Zeilenweise Datei einlesen &work(@line); #Empfänger extrahieren (fuer spaetere Verifizierung) &action($content); #Nachrichtentext auswerten &move ($entry); #Nachrichtendatei verschieben } ### sub Auswertung sub action{ if ($content =~ /\bLICHT\b/i) {$hg="1"; print "Licht";} if ($content =~ /\bOBEN\b/i) {$mg="2"; print "oben";} if ($content =~ /\bUNTEN\b/i) {$mg="1"; print "Licht";} if ($content =~ /\bAN\b/i) {$val="1"; print "AN";} if ($content =~ /\bAUS\b/i) {$val="0"; print "AUS";} if ($content =~ /\bESSEN\b/i) {$eg="60"; print "60";} #system("groupwrite ip:localhost $hg/$mg/$eg $val"); #für Konsole knx_write($hg."/".$mg."/".$eg,$val,1.001); } ### sub Empfänger auslesen sub work{ my $nr=$from; # extract number substr($nr,0,6,""); # extract number #print ($nr,"\n"); # testing only #print ($content,"\n"); # testing only } ### sub Datei auslesen sub read_line { open (DATEI, $directory."/".$entry); # mit DATEI kann auf die genannte Datei später im Skript zugegriffen werden; < bedeutet, daß sie nur zum Lesen geöffnet wird @line=<DATEI>; # Dateiinhalt in array speichern close DATEI; # Datei wieder schließen $from = $line [0]; # Line 1 contains number in string "From: xxxxxxxx" chomp $from; # remove LF $content = $line [12]; # Line 13 contains message } ### sub Datei verschieben sub move { #print $entry; unless(-d $newpath) # if directory not exists { mkdir $newpath or die; # Verzeichnis anlegen } #system("cp $directory/$entry $newpath/$entry"); #only for testing system("mv $directory/$entry $newpath/$entry"); # Datei verschieben damit sie nicht noch einmal bearbeitet wird } #sub read_file { # open (DATEI, $directory."/".$entry); # mit DATEI kann auf die genannte Datei später im Skript zugegriffen werden; < bedeutet, daß sie nur zum Lesen geöffnet wird # undef $/; # bewirkt, daß die gesamte Datei gelesen wird # my $filecontent=<DATEI>; # Dateiinhalt in Variable speichern # close DATEI; # Datei wieder schließen # print ($filecontent,"\n"); #Datei drucken #}
Kommentar