Hallo zusammen,
diesen Entwurf fürs Plugin-Schreiben stelle ich allgemein zur Verfügung und Diskussion. Gerne was dran verbessern, und für Plugin-Anfänger ist das ein Vorschlag, wie man starten könnte.
OHNE GEWÄHR und OHNE ANSPRUCH AUF DIE LETZTGÜLTIGE WEISHEIT!
"use it if you find it useful"
Have fun,
Fry
diesen Entwurf fürs Plugin-Schreiben stelle ich allgemein zur Verfügung und Diskussion. Gerne was dran verbessern, und für Plugin-Anfänger ist das ein Vorschlag, wie man starten könnte.
OHNE GEWÄHR und OHNE ANSPRUCH AUF DIE LETZTGÜLTIGE WEISHEIT!
"use it if you find it useful"
Code:
#!/usr/bin/perl -w # ###################### # <NAME DES PLUGINS> # ###################### # # Wiregate-Plugin # # (c) 2012 <AUTOR>, licensed under the GNU Public License v2 or later # # this skeleton is (c) 2012 Fry, licensed under the GNU Public License v2 or later # # Option zum einfachen Deaktivieren # $plugin_info{$plugname.'_cycle'}=0; return "deaktiviert"; # Benutzte Perl-Packages use POSIX qw(floor strftime); # Optional: wer blanke Gruppenadressen hasst, gibt jeder GA einen Namen # und pflegt diesen auch in /etc/wiregate/eibga.conf ein (wie auch die DPTs). # # Empfehlung: bei mir ist das erste Wort des GA-Namens ein eindeutiges Kuerzel, # zum Beispiel "LI_K1 Licht an/aus Kinderzimmer 1"=4/3/17. Ich arbeite dann in allen # Plugins statt mit 4/3/17 mit $eibshort{LI_K1}{ga}. # # Hilfs-Hash eibshort initialisieren my %eibshort; for my $ga (keys %eibgaconf) { next unless defined $eibgaconf{$ga}{'name'}; my $short=$eibgaconf{$ga}{'name'}; # wer lieber mit vollen GA-Namen arbeitet, kommentiert die nächste Zeile aus next unless $short=~/^(\S+)/; $short=$1; $eibshort{$short}=$eibgaconf{$ga}; $eibshort{$short}{ga}=$ga; $eibshort{$ga}=$short; # inverses Lookup } # 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 # Konfigurationsfile einlesen # Im Konfigurationsfile muss das Hash %config definiert werden (ohne "my"!) # zum Beispiel so: # %config=( subscribe => [ '4/3/16', $eibshort{LI_K1}{ga} ] ); # my $conf=$plugname; $conf=~s/\.pl$/.conf/; $conf="/etc/wiregate/plugin/generic/conf.d/$conf"; my %config=(); open CONFIG, "<$conf" || return "no config found"; my @lines = <CONFIG>; close CONFIG; eval("@lines"); return "config error: $@" if $@; # Plugin-Code fuer die verschiedenen Aufrufvarianten if($event=~/restart|modified/) { # Erster Aufruf nach Reboot, Daemon-Restart oder Plugin-Modifikation # Cleanup aller Variablen for my $k (grep /^$plugname\_/, keys %plugin_info) { delete $plugin_info{$k}; } # Alle GAs abonnieren for my $ga (@{$config{subscribe}}) { plugin_subscribe{$ga}{plugname}=1; } $plugin_info{$plugname.'_cycle'}=1000; return 'initialisiert'; } elsif($event=~/cycle/) { # Aktivitaet bei zyklischem Aufruf return 'cycle'; } elsif($event=~/bus/) { # Aufruf durch Bustraffic return if $msg{apci} eq 'A_GroupValue_Response'; # darauf nicht reagieren my $ga=$msg{dst}; my $val=$msg{value}; # falls DPT-Typen nicht in /etc/wiregate/eibga.conf eingepflegt sind, # muss $val hier durch expliziten Aufruf von decode_dpt(...) ermittelt werden. given($ga) { when ($eibshort{LI_K1}{ga}) { if($msg{apci} eq 'A_GroupValue_Write') { # AKtivitaet bei erhaltenem Bustelegramm return $ga; # Returnwert des Plugins } elsif($msg{apci} eq 'A_GroupValue_Read') { # Antwort auf Lesetelegramm senden knx_write($ga, 1, 1); return; # ohne Wert } } when ('4/3/17') # Version mit "nackter" GA { if($msg{apci} eq 'A_GroupValue_Write') { # AKtivitaet bei erhaltenem Bustelegramm return $ga; # Returnwert des Plugins } elsif($msg{apci} eq 'A_GroupValue_Read') { # Antwort auf Lesetelegramm senden knx_write($ga, 1, 1); return; # ohne Wert } } default { # GA-Abonnement loeschen delete $plugin_subscribe{$ga}{$plugname}; } } } return;
Fry
Kommentar