Hallo zusammen. Dank der grossartigen Hilfe von makki hab ich nun endlich mein erstes eigenes Plugin am laufen. Es ist noch im Beta stadium aber wer will kann es gerne testen.
Für Fragen und Anregungen bin ich immer dankbar.
Grundsätzliches zum Plugin selbst...
Unter einstellungen ist für jedes Fenster eine GA für den oberen MK, eine GA für den unteren MK und eine GA für den Status einzutragen. Dabei ist darauf zu achten, dass die zusammengehörenden GA's auch an der gleichen Position in den Array's eingetragen werden müssen.
Der Status wird als 8bit ausgegeben. Folgende Zustände werden ausgegeben:
0 = Fenster geschlossen
1 = Fenster offen
2 = Fenster gekipt
3 = Fehler (unmöglicher Zustand)
Und hier das Plugin:
Für Fragen und Anregungen bin ich immer dankbar.
Grundsätzliches zum Plugin selbst...
Unter einstellungen ist für jedes Fenster eine GA für den oberen MK, eine GA für den unteren MK und eine GA für den Status einzutragen. Dabei ist darauf zu achten, dass die zusammengehörenden GA's auch an der gleichen Position in den Array's eingetragen werden müssen.
Der Status wird als 8bit ausgegeben. Folgende Zustände werden ausgegeben:
0 = Fenster geschlossen
1 = Fenster offen
2 = Fenster gekipt
3 = Fehler (unmöglicher Zustand)
Und hier das Plugin:
Code:
# Plugin zum auswerten beliebig vieler Fensterzustände # Version 0.3 10.03.2011 # Copyright: swiss (https://knx-user-forum.de/members/swiss.html) # License: GPL (v2) # Aufbau möglichst so, dass man unterhalb der Einstellungen nichts verändern muss! #################### ###Einstellungen:### #################### my @MK_unten = ('7/1/180','7/1/182','7/1/184'); #Pro Fenster ein Eintrag hinzufügen " ,'GA MK unten' " und die GA eintragen. my @MK_oben = ('7/1/181','7/1/183','7/1/185'); #Pro Fenster ein Eintrag hinzufügen " ,'GA MK oben' " und die GA eintragen. my @Status_8bit = ('9/1/180','9/1/182','9/1/184'); #Pro Fenster ein Eintrag hinzufügen " ,'GA Status' " und die GA eintragen. ###################### ##ENDE Einstellungen## ###################### # Eigenen Aufruf-Zyklus auf 1T setzen $plugin_info{$plugname.'_cycle'} = 86400; # Zyklischer Aufruf nach restart und alle 86400 sek., dient dem anmelden an die Gruppenadresse, einmalig (0) würde in diesem Fall auch genügen my $i = 0; #Hauptzählervariabel für diverse Schleifen im Plugin my $m = 0; #Noch eine Hilfsvariabel die zur Laufzeit gebraucht wird my %MKs_unten = (); my %MKs_oben = (); #Hier wird die aktuelle Anzahl Fenster anhand der eingetragenen GA's #in "@schluessel_MK_unten" ermittelt. my $Fensteranzahl = @MK_unten; for($i = 0; $i < $Fensteranzahl; $i++) { $MKs_unten{$MK_unten[$i]} = ''; $MKs_oben{$MK_oben[$i]} = ''; } #Ab hier werden die remanenten Variabeln ausgelesen und weiter verarbeitet: my @hilfsarry_MK_oben = split(/-/,$plugin_info{$plugname.'_MKoben'}); my @hilfsarry_MK_unten = split(/-/,$plugin_info{$plugname.'_MKunten'}); my $hilfszaehler = $Fensteranzahl * 2; $hilfszaehler = $hilfszaehler - 2; #An dieser Stelle werden die Hash's mit den aus dem Speicher gelesenen Werten aktualisiert: $i = 0; for(my $hilfsvariabel = 0; $i <= $hilfszaehler; $i = $i + 2) { $hilfsvariabel = $i + 1; $MKs_unten{$hilfsarry_MK_unten[$i]} = $hilfsarry_MK_unten[$hilfsvariabel]; $MKs_oben{$hilfsarry_MK_oben[$i]} = $hilfsarry_MK_oben[$hilfsvariabel]; } #Ab hier wird nun auf eine Statusänderung reagiert: #Hier werden die Hash's bei Statusänderungen aktualisiert und die neuen Werte auf den BUS geschrieben if ($msg{'apci'} eq "A_GroupValue_Write"){ if (exists($MKs_unten{$msg{'dst'}})){ $MKs_unten{$msg{'dst'}} = knx_read($msg{'dst'},0,1); } if (exists($MKs_oben{$msg{'dst'}})){ $MKs_oben{$msg{'dst'}} = knx_read($msg{'dst'},0,1); } #Ab hier geschieht nun die Berechnung der neuen Zustände: #Um das zusammen gehörende GA paar (MK oben und MK unten) zu bestimmen, wird die Indexnummer ermittelt if (exists($MKs_unten{$msg{'dst'}})){ for($i = 0; $i < $Fensteranzahl; $i++) { if($MK_unten[$i] eq $msg{'dst'}) { last } } } elsif (exists($MKs_oben{$msg{'dst'}})){ for($i = 0; $i < $Fensteranzahl; $i++) { if($MK_oben[$i] eq $msg{'dst'}) { last } } } #Hier wird aus den Zuständen der 2 zusammen gehörenden MK's der Status ermittelt und auf den BUS gesendet if ($MKs_oben{$MK_oben[$i]} == 0 and $MKs_unten{$MK_unten[$i]} == 0){ knx_write($Status_8bit[$i],0,5.010); #Wenn das Fenster geschlossen ist, wird eine 0 gesendet } elsif ($MKs_oben{$MK_oben[$i]} == 1 and $MKs_unten{$MK_unten[$i]} == 1){ knx_write($Status_8bit[$i],1,5.010); #Wenn das Fenster offen ist, wird eine 1 gesendet } elsif ($MKs_oben{$MK_oben[$i]} == 1 and $MKs_unten{$MK_unten[$i]} == 0){ knx_write($Status_8bit[$i],2,5.010); #Wenn das Fenster gekipt ist, wird eine 2 gesendet } else{ knx_write($Status_8bit[$i],3,5.010); #Wenn das Fenster einen unmöglichen Zustand hat, wird eine 3 gesendet } } #Ab hier werden die Zustände der MK's aufbereitet und danach remanent gespeichert: my $MKobenListe = ''; my $MKuntenListe =''; #Hier werden erst mal alle Hash's in einen String umgewandelt und das Trennzeichen (-) eingefügt for($i = 0; $i < $Fensteranzahl; $i++) { $MKobenListe = $MKobenListe.$MK_oben[$i]; $MKobenListe = $MKobenListe."-"; $MKobenListe = $MKobenListe.$MKs_oben{$MK_oben[$i]}; if ($i != ($Fensteranzahl - 1)){ $MKobenListe = $MKobenListe."-"; } $MKuntenListe = $MKuntenListe.$MK_unten[$i]; $MKuntenListe = $MKuntenListe."-"; $MKuntenListe = $MKuntenListe.$MKs_unten{$MK_unten[$i]}; if ($i != ($Fensteranzahl - 1)){ $MKuntenListe = $MKuntenListe."-"; } #Hier werden alle MK - GA's angemeldet $plugin_subscribe{$MK_oben[$i]}{$plugname} = 1; $plugin_subscribe{$MK_unten[$i]}{$plugname} = 1; } #Hier werden die neu erstellten Zustandslisten an die remanenten Variabeln übergeben. $plugin_info{$plugname.'_MKoben'} = $MKobenListe; $plugin_info{$plugname.'_MKunten'} = $MKuntenListe;
Kommentar