Zurück   KNX-User-Forum > Öffentlicher Bereich > KNX EIB Forum > Code-Schnipsel
knx-user-forum - International KNX Award Winner 2010


Links
Kalender
Spende

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 13.06.2012, 23:58
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 1.011
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard Neues Plugin: Anwesenheitssimulation

Hallo zusammen,
auf Wunsch (siehe dieser Thread) habe ich mal eine Anwesenheitssimulation als Wiregate-Plugin zusammengehackt. Wie immer "ohne Gewehr" :-)

Folgender Disclaimer: es handelt sich um einen Quick Hack, auch um zu zeigen, wie schön Perl doch ist, wenn es um Quick Hacks geht :-)

Ich selbst brauche keine Anwesenheitssimulation, deshalb bittet mich nicht um eure 10.000 Wunschfeatures. Wer das Plugin erweitern will - be my guest, aber beachtet die GPL und postet das verbesserte Plugin hier bzw. im SVN.

Das Ganze funktioniert so: das Plugin Anwesenheitssimulation abonniert eine einzige GA (im Skript festgelegt, extra dafür wollte ich kein .conf-File schreiben). Diese GA sollte (wie immer) in der eibga.conf hinterlegt sein und DPT-Typ 1 haben (wie ein Schalter: an/aus).

Wird die Anwesenheitssimulation über die GA angeschaltet (Telegrammwert 1), so erzeugt sie ein neues Plugin aus der eib.log. Das neue Plugin wird danach vom Wiregate-Daemon ausgeführt und wiederholt einfach die Telegramme, die im eib.log gefunden wurden. (Beispielhaft steht im Skript auch drin, wie man bestimmte GAs ausfiltern kann).

Wird die Anwesenheitssimulation über die GA ausgeschaltet (Telegrammwert 0), so löscht sie das erzeugte Plugin wieder.

Und hier das Skript, wie immer auch im SVN zu finden:

Code:
#!/usr/bin/perl -w                                                                                                                                 
##########################                                                                                                                         
# Anwesenheitssimulation #                                                                                                                         
##########################                                                                                                                         
# Wiregate-Plugin                                                                                                                                  
# (c) 2012 Fry under the GNU Public License                                                                                                        

#$plugin_info{$plugname.'_cycle'}=0; return 'deaktiviert';                                                                                         

# Aufrufgrund ermitteln                                                                                                                            
my $event=undef;
if (!$plugin_initflag)
{ $event='restart'; } # Restart des daemons / Reboot                                                                                               
elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'})
{ $event='modified'; } # Plugin modifiziert                                                                                                        
elsif (%msg) { $event='bus'; } # Bustraffic                                                                                                        
elsif ($fh) { $event='socket'; } # Netzwerktraffic                                                                                                 
else { $event='cycle'; } # Zyklus                                                                                                                  

# eine Gruppenadresse zum Starten und Stoppen. Diese ist vom Typ DPT 1 (An/Aus)                                                                    
$plugin_subscribe{'1/2/0'}{$plugname}=1;

# kein regelmaessiger Aufruf                                                                                                                       
$plugin_info{$plugname.'_cycle'}=0;

# Nur auf Bustraffic reagieren                                                                                                                     
return unless $event=~/bus/ && $msg{apci} eq "A_GroupValue_Write";
my $in=int($msg{value});

# Name des Simulationsskriptes                                                                                                                     
my $simscript="/etc/wiregate/plugin/generic/Anwesenheitssimulationsskript.pl";

unless($in) { system "rm", "-f", $simscript; return "Anwesenheitssimulation gestoppt"; }

# Start Anwesenheitssimulation: einfach ein neues Plugin aus eib.log erzeugen, der wiregate-Daemon fuehrt es dann aus                              
open SIM, ">$simscript";

my $line=1;

print SIM <<EOF;
#!/usr/bin/perl -w                                                                                                                                 

\$plugin_info{\$plugname.'_line'}=1 unless defined \$plugin_info{\$plugname.'_line'};

given(\$plugin_info{\$plugname.'_line'}) {
when($line) {
EOF

my $time=`/bin/date +%X`; $time=~/^([0-9][0-9])\:([0-9][0-9])\:([0-9][0-9])/; my ($h,$m,$s)=($1,$2,$3);
my $lastdaynum=undef;

open IN, "</var/log/eib.log";

$/="\n";

while($_=<IN>)
{
    chomp;

    next unless /^([0-9][0-9][0-9][0-9])\-([0-9][0-9])\-([0-9][0-9]) ([0-9][0-9])\:([0-9][0-9])\:([0-9][0-9])[^,]*,[^,]*,[^,]*,([0-9]+\/[0-9]+\/[0\
-9]+),[^,]*,([^,]*),[^,]*,([^,]*),.*$/;

    my ($year, $month, $day, $hour, $min, $sec, $ga, $val, $dpt)=($1, $2, $3, $4, $5, $6, $7, $8, $9);
    $val="'$val'" if $dpt=~/^16/;

    # Alle Telegramme auf manchen Hauptgruppen ausfiltern                                                                                        
    next if $ga=~m!^(5|6)/0!;

    my $daynum=365*$year; $year-- if $month<=2; $daynum+=int($year/4) - int($year/100) + int($year/400);

    my $delta = (defined $lastdaynum) ? $daynum-$lastdaynum : 0;
    $lastdaynum=$daynum;
    $delta=(($delta*24+($hour-$h))*60+($min-$m))*60+($sec-$s);
    next if $delta<0;
    ($h,$m,$s)=($hour,$min,$sec);

    if($delta>0)
    {
        $line++;
    print SIM <<EOF;
\$plugin_info{\$plugname.'_cycle'}=$delta; }
when($line) {
EOF
    }

    print SIM <<EOF;
# $_                                                                                                                                               
knx_write('$ga', $val, $dpt);
EOF

}
close IN;


print SIM <<EOF;
}

}

default { \$plugin_info{\$plugname.'_line'}=1; }
}

\$plugin_info{\$plugname.'_line'}++;

return \$plugin_info{\$plugname.'_line'}-1;

EOF

close SIM;

return "Anwesenheitssimulation gestartet";
Bitte holt das Plugin aus dem SVN - dort stehen ggf. neuere Versionen.

Have fun!

VG, Fry

Geändert von Fry (14.06.2012 um 16:47 Uhr)
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #2  
Alt 14.06.2012, 08:53
Erfahrener Benutzer
 
Registriert seit: 07.05.2010
Ort: Weyhe
Beiträge: 2.502
henfri befindet sich auf einem aufstrebenden Ast
Standard

Genial.
Wie machst du das alles nebenher?
Und dann noch ohne Eigennutzen!

Wow
DANKE!
__________________
Aus Bremen und Umgebung?
Komm zum Stammtisch!
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #3  
Alt 14.06.2012, 09:08
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 1.011
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat von henfri Beitrag anzeigen
Wie machst du das alles nebenher?
Und dann noch ohne Eigennutzen!
Danke henfri!

War gestern abend eine Sondersituation. Das Plugin ist übrigens zu 80% erstmal auf der Kommandozeile (perl -e) entstanden. Erst als die Simulation lief, hab ich es in ein File kopiert, die GA-subscription usw ergänzt.

So einfach ist das mit Perl. Macht das mal in Python...

VG, Fry

PS. Wofür braucht man nochmal einen Homeserver?
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #4  
Alt 14.06.2012, 09:14
Benutzerbild von 2ndsky
Erfahrener Benutzer
 
Registriert seit: 24.10.2010
Ort: Amtzell
Beiträge: 3.789
2ndsky sorgt für eine eindrucksvolle Atmosphäre2ndsky sorgt für eine eindrucksvolle Atmosphäre2ndsky sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat von Fry Beitrag anzeigen
PS. Wofür braucht man nochmal einen Homeserver?
Das Frage ich mich seit dem du hier aktiv bist auch
__________________
Mit freundlichen Grüßen
Niko Will

neustes Projekt: smarthome.py (Logik Engine von mknx)
Dreambox DM8000 - iPhone 5 - iPad 3 - WireGate - ekey - IrTrans - Russound C5 (RIO over TCP Plugin)
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #5  
Alt 14.06.2012, 15:44
Benutzer
 
Registriert seit: 02.06.2007
Beiträge: 232
Obiwan befindet sich auf einem aufstrebenden Ast
Standard

oh man sowas nennst du nen "Quick Hack". Bei mir wäre das ein "14 Tage Urlaub/24h Hack"
Steh aber auch erst am Anfang mit Perl.

Jedenfalls kann ich dem nur bei plichten, das seid dem du ein paar Plug-Ins geschrieben hast, ich meine Kaufentscheidung vom HS zum Wiregate geschwenkt habe. Bzw. ich werd es wohl die Tage auch bestellen.
Bis jetzt spiel ich mit den Plug-Ins immer im Communitygate.

Wie genau/ oder welche GA's filterst du denn hier aus.
Code:
# Alle Telegramme auf manchen Hauptgruppen ausfiltern                                                                                          
    next if $ga=~m!^(5|6)/0!;
__________________
Gruß
Marco
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #6  
Alt 14.06.2012, 16:23
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 1.011
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard

Im genannten Beispiel wären alle GAs "5/0/*" und "6/0/*" ausgefiltert.
VG, Fry
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #7  
Alt 14.06.2012, 16:32
Benutzer
 
Registriert seit: 02.06.2007
Beiträge: 232
Obiwan befindet sich auf einem aufstrebenden Ast
Standard

Alle klar! Danke.
...nicht das nachher noch das "Rolladen Rodeo" losgeht
__________________
Gruß
Marco
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #8  
Alt 14.06.2012, 16:48
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 1.011
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard

Habe gerade die Zeile mit dem Ausfiltern noch nach oben geschoben - das verbessert die Codequalität des erzeugten Skriptes.
VG, Fry
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #9  
Alt 14.06.2012, 16:49
Benutzerbild von mknx
Erfahrener Benutzer
 
Registriert seit: 21.06.2010
Ort: Würzburg
Beiträge: 822
mknx wird schon bald berühmt werden
Standard

Zitat von Fry Beitrag anzeigen
So einfach ist das mit Perl. Macht das mal in Python...
Full Ack
<flamewar>da geht es einfacher und schöner lesbar/schreibbar</flamewar>

Friedliche Grüße

Marcus
__________________
Logik? Visu? KNX? 1-Wire? Russound? ... => SmartHome.py - Version 0.9 und Raspberry Pi Image 2.0
Information & Download: http://mknx.github.io/smarthome/ Support: http://knx-user-forum.de/smarthome-py/
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #10  
Alt 14.06.2012, 20:54
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 1.011
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard

Wie kommt es eigentlich, dass die Forumssoftware aus Python einen Link nach Python Programming Language &ndash; Official Website bastelt, aber nicht aus Perl einen Link nach The Perl Programming Language - www.perl.org ?

Wäre schön, wenn das mal jemand fixen könnte...

(ok, es mag Wichtigeres geben)

Fry
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort

Stichworte
anwesenheitssimulation, wiregate-plugin

Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[WireGate-Plugin] Neues Plugin: Logikprozessor.pl Fry Code-Schnipsel 222 05.06.2013 19:57
[WireGate-Plugin] Neues Plugin: Universeller Szenencontroller Fry Code-Schnipsel 9 15.11.2012 23:07
[WireGate-Plugin] Decoder Plugin zum Haustüröffnen etc. emax WireGate 13 20.10.2012 20:03
Erstmalige Inbetriebnahme Wiregate, erstes Plugin Fechter65 WireGate 10 05.07.2012 08:35
[WireGate-Plugin] Neues Plugin: Universeller Translator Fry Code-Schnipsel 2 05.05.2012 22:10


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:45 Uhr.



SEO by vBSEO