Moin zusammen,
ich sitze gerade vor einem Problem und komme nicht weiter. Hoffe mir kann jemand helfen.
Hintergrund:
Ich will eine simple Anwesenheitssteuerung realisieren. Diese wird mittels zweier Taster (Schlafzimmer/Haustür) und Präsenzmelder realisiert (diese steuern nur abwesend und anwesend, schlaf wird ausschließlich über Taster geregelt).
Wird ein Taster gedrückt, ändert sich der Status sofort (anwesend, abwesend, schlaf). Der andere Taster wird dann entsprechend aktualisiert.
Wird das Plugin zyklisch aufgerufen, werden die Präsenzmelder abgefragt. Sollte sich jemand im Bereich befinden -> anwesend; ist niemand da und der Taster schlaf nicht gedrückt -> abwesend.
Jetzt habe ich das Problem, dass ich im Plugin auf die hörenden GAs schreibe und hierdurch sich das Plugin endlos selbst aufrufen würde. Wie löse ich das?
Hier der Code:
Danke,
Grüße!
EDIT:
1. Aufrufzyklus angepasst
2. Syntax Abfrage der PM geändert (@PM_GA)
ich sitze gerade vor einem Problem und komme nicht weiter. Hoffe mir kann jemand helfen.
Hintergrund:
Ich will eine simple Anwesenheitssteuerung realisieren. Diese wird mittels zweier Taster (Schlafzimmer/Haustür) und Präsenzmelder realisiert (diese steuern nur abwesend und anwesend, schlaf wird ausschließlich über Taster geregelt).
Wird ein Taster gedrückt, ändert sich der Status sofort (anwesend, abwesend, schlaf). Der andere Taster wird dann entsprechend aktualisiert.
Wird das Plugin zyklisch aufgerufen, werden die Präsenzmelder abgefragt. Sollte sich jemand im Bereich befinden -> anwesend; ist niemand da und der Taster schlaf nicht gedrückt -> abwesend.
Jetzt habe ich das Problem, dass ich im Plugin auf die hörenden GAs schreibe und hierdurch sich das Plugin endlos selbst aufrufen würde. Wie löse ich das?
Hier der Code:
Code:
# Logik für Anwesenheit # Voraussetzungen: # - Taster sind Master (bei Druck sofort auf Abwesenheit / Schlafen bzw. anders herum) # - Status Schlaf wird nur durch Taster aktiviert # - PM melden Anwesenheit bei Änderung auf je eine eigene GA; # bei mehr als 30 Min (Nachlauf im PM eingestellt) keine Bewegung => Abwesenheit # Kommentieren, um Plugin zu aktivieren return; # Variablen my @PM_GA=("12/0/0", "12/0/10"); # PM, die den Status ändern dürfen, z.B. Küche etc. my $anwesenheit_GA="0/0/254"; # (dpt 2, 00: anwesend; 01: schlafen, 10: abwesend, 11: spare) my $taster_schlaf_GA="12/1/0"; my $taster_weg_GA="12/1/12"; my $status=undef; # Aufrufzyklus auf 5 Min setzen $plugin_info{$plugname.'_cycle'} = 300; # Plugin an Taster GAs anmelden, um bei Änderungen aufgerufen zu werden $plugin_subscribe{$taster_schlaf_GA}{$plugname} = 1; $plugin_subscribe{$taster_weg_GA}{$plugname} = 1; # Überprüfen, ob Plugin wg. Tastendruck (Schlaf od. Abwesenheit) aufgerufen wurde if ($msg{'apci'} eq "A_GroupValue_Write") { # Taster schlaf gedrückt? if ($msg{'dst'} eq ($taster_schlaf_GA)) { # Status abfragen und auf den Bus senden if (int ($msg{'data'}) == 1) { knx_write($anwesenheit_GA,01,2); # Status Schlaf knx_write($taster_weg_GA,0,1); # Taster weg aktualisieren $status="01"; } else { knx_write($anwesenheit_GA,00,2); # Status Anwesend knx_write($taster_weg_GA,0,1); # Taster weg aktualisieren $status="00"; } } # Taster weg gedrückt? if ($msg{'dst'} eq ($taster_weg_GA)) { # Statusänderung abfragen und auf den Bus senden if (int ($msg{'data'}) == 1) { knx_write($anwesenheit_GA,10,2); # Status Abwesend knx_write($taster_schlaf_GA,0,1);# Taster Schlaf aktualisieren $status="10"; } else { knx_write($anwesenheit_GA,00,2); # Status Anwesend knx_write($taster_schlaf_GA,0,1); # Taster Schlaf aktualisieren $status="00"; } } } if ($status == undef) { # Da beide Taster nicht gedrückt wurden, zyklische Abfrage der PM # Hierdurch wird sichergestellt, dass der korrekte Status auch ohne Tastendruck gemeldet wird # Prüfen, ob irgendeine Bewegung im Haus my $anwesenheit = 0; $anwesenheit+=knx_read(_$,300,1) for (@PM_GA); # Auswertung der PM if ($anwesenheit!=0) # Bewegung im Haus { knx_write($anwesenheit_GA, 00, 2); # Status Anwesend knx_write($taster_weg_GA,0,1); # Taster weg aktualisieren knx_write($taster_schlaf_GA,0,1); # Taster schlaf aktualisieren $status="00"; } elsif (knx_read($taster_schlaf_GA,300,1)==0)# keine Bewegung und Taster schlaf nicht gedrückt { knx_write($anwesenheit_GA,10,2); # Status abwesend knx_write($taster_weg_GA,0,1); # Taster weg aktualisieren knx_write($taster_schlaf_GA,0,1); # Taster schlaf aktualisieren $status="10"; } } return $status;
Danke,
Grüße!
EDIT:
1. Aufrufzyklus angepasst
2. Syntax Abfrage der PM geändert (@PM_GA)
Kommentar