Die Rollladenaktoren, die bei mir verbaut sind, können doch immerhin die Rollläden rauf und runter fahren. Das war's dann aber auch schon ziemlich. Funktionen, die ich vermisse:
Gruß
Martin
- Rückmelden der Position (für Visu)
- Oben verbleiben, wenn das Fenster bzw. die Tür offen ist
- In Lüftungsposition fahren, wenn der Rollladen geschlossen ist und das Fenster geöffnet wird, und umgekehrt

Gruß
Martin
Code:
# Plugin zur Statusmeldung von "einfachen" Rollladen-Aktoren (Berker)
# Aktor kennt keine Statusmeldung -> wird hier generiert
# Zusätzlich Lüftungs- und Sicherheitsfunktion:
# - Rollladen bleibt oben, wenn Fenster offen
# - Rollladen fährt in Lüftungsposition, wenn unten und Fenster geht auf
# - Rollladen fährt nach unten, wenn in Lüftungsposition und Fenster geht zu
### Definitionen
###
### Sendewerte
my $hoch = 0;
my $runter = 1;
### Statuswerte
my $oben = 0;
my $unten = 255;
my $lueftung = 204;
###
my $laufzeit = 4; # Laufzeit nach oben für Lüften
my $aktiv_lueftung = 0; # Plugin-Aufrufzeit, =2 wenn gerade Lüftungsposition angefahren wird
# Jede Zeile ein Rollladen
my @rollladen;
# name wird derzeit nicht verwendet, hashname für permanentes Speichern
# Langzeit-GA: 3 Stück, für einzelnen Rollladen, ganzes Zimmer und ganzes Haus
# Kurzzeit-GA zum Stoppen
# Positions-GA für die Rückmeldung Position
# Fenster-GA: 1 = Fenster offen, 0 = Fenster zu
push @rollladen, { name => "HWR Fenster", hashname => "HWRF", einzel_ga => "2/0/0", kurz_ga => "2/1/0", group_ga => "", global_ga => "0/3/0", position_ga => "2/3/0", fStatus_ga => "3/2/0" };
push @rollladen, { name => "Küche links", hashname => "KueL", einzel_ga => "2/0/1", kurz_ga => "2/1/1", group_ga => "2/0/4", global_ga => "0/3/0", position_ga => "2/3/1", fStatus_ga => "10/0/3" };
push @rollladen, { name => "Küche rechts", hashname => "KueR", einzel_ga => "2/0/2", kurz_ga => "2/1/2", group_ga => "2/0/4", global_ga => "0/3/0", position_ga => "2/3/2", fStatus_ga => "10/0/2" };
push @rollladen, { name => "Bad", hashname => "Bad", einzel_ga => "2/0/3", kurz_ga => "2/1/3", group_ga => "", global_ga => "0/3/0", position_ga => "2/3/3", fStatus_ga => "3/2/4" };
### Ende Definitionen
foreach my $roll (@rollladen) {
# Plugin an Gruppenadressen "anmelden", sofern definiert
if ($roll->{einzel_ga})
{
$plugin_subscribe{$roll->{einzel_ga}}{$plugname} = 1;
}
if ($roll->{group_ga})
{
$plugin_subscribe{$roll->{group_ga}}{$plugname} = 1;
}
if ($roll->{global_ga})
{
$plugin_subscribe{$roll->{global_ga}}{$plugname} = 1;
}
if ($roll->{fStatus_ga})
{
$plugin_subscribe{$roll->{fStatus_ga}}{$plugname} = 1;
}
# Verstell-Kommando vom Bus
if ($msg{'apci'} eq "A_GroupValue_Write" and ($msg{'dst'} eq $roll->{einzel_ga} or
$msg{'dst'} eq $roll->{group_ga} or $msg{'dst'} eq $roll->{global_ga}))
{
# vorherige Position zwischenspeichern
my $previous = $plugin_info{$plugname.'_pos_'.$roll->{hashname}};
# hochfahren aus Position unten
if ($msg{'data'} == $hoch and not ($plugin_info{$plugname.'_LS_'.$roll->{hashname}} > 0) ) {
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} = $oben;
}
# runterfahren aus nicht geschlossener Position -> Fensterstatus einbeziehen, ggfs. stoppen
if ($msg{'data'} == $runter and $previous != $unten) {
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} = $unten;
my $fenster = knx_read($roll->{fStatus_ga},0,1);
if ($fenster) #Fenster geöffnet - Rolladen anhalten
{
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} = $previous;
knx_write($roll->{kurz_ga}, $hoch, 1);
}
}
# Bei veränderter Position diese ausgeben
if ($plugin_info{$plugname.'_pos_'.$roll->{hashname}} != $previous)
{
knx_write($roll->{position_ga},$plugin_info{$plugname.'_pos_'.$roll->{hashname}},'5.001');
}
}
# Position lesen
if ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $roll->{position_ga})
{
knx_write($roll->{position_ga},$plugin_info{$plugname.'_pos_'.$roll->{hashname}},'5.001');
}
#Fenster geht auf, Rollladen geschlossen -> auf Lüftungsposition
if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $roll->{fStatus_ga} and
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} == $unten and $msg{'data'} == 1)
{
$plugin_info{$plugname.'_LS_'.$roll->{hashname}} = time();
knx_write($roll->{einzel_ga}, $hoch, 1);
}
#Fenster geht zu, Rollladen auf Lüftung -> Rollladen zu
if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $roll->{fStatus_ga} and
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} == $lueftung and $msg{'data'} == 0)
{
knx_write($roll->{einzel_ga}, $runter, 1);
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} = $unten;
knx_write($roll->{position_ga},$unten,'5.001');
}
if($plugin_info{$plugname.'_LS_'.$roll->{hashname}} > 0) # Fenster fährt gerade in Lüftungsposition
{
if (time()-$plugin_info{$plugname.'_LS_'.$roll->{hashname}} > $laufzeit) # Zeit abgelaufen
{
#Rollladen stoppen
knx_write($roll->{kurz_ga}, $hoch, 1);
$plugin_info{$plugname.'_LS_'.$roll->{hashname}} = 0;
$plugin_info{$plugname.'_pos_'.$roll->{hashname}} = $lueftung;
knx_write($roll->{position_ga}, $lueftung, '5.001');
}
else
{
$aktiv_lueftung = 2;
}
}
}
# Zykluszeit auf 2, falls gerade Lüftungsposition angefahren wird, ansonsten auf 0
$plugin_info{$plugname.'_cycle'} = $aktiv_lueftung;
return $msg{'dst'}." ".$msg{'data'};




Kommentar