Hallo,
da ich es bisher nicht geschafft habe, die Verschattung in Verbindung mit dem Hitzeprogramm der BMS Wetterstation vernünftig hinzubekommen, habe ich mir kurzerhand selbst ein Plugin geschrieben.
Das Plugin wertet die Aussen- sowie eine Innentemperatur, die Globalstrahlung und den Zustand "Dämmerung" (1 für Dämmerung) aus.
Liegt der Wert für die Temperaturen und Globalstrahlung über den definierten Grenzwerten + Hysterese, so wird eine feste Beschattungsposition angefahren.
Weiterhin kann eine zeitliche Verzögerung festgelegt werden, damit die Raffstores nicht schon bei kurzer Verschattung wieder hochfahren.
Bei Dämmerung macht das Plugin nichts, es werden keinerlei Befehle ausgeführt.
Weiterhin gibt es ein Sperrobjekt, falls dieses auf 1 steht, macht das Plugin auch nichts.
Edit: Gerade habe ich auch noch die Möglichkeit hinzugefügt, die einzelnen Raffstores bzw. Rollos abhängig vom Azimuth der Sonne fahren zu lassen. Bei uns scheint z.B. Abends die Sonne durchs Westfenster ins Schlafzimmer und heizt dieses auf, dies möchte ich vermeiden. Allerdings möchte ich auch nicht den ganzen Tag das Rollo geschlossen haben, da dies erst in den Abendstunden ein Problem wird.
da ich es bisher nicht geschafft habe, die Verschattung in Verbindung mit dem Hitzeprogramm der BMS Wetterstation vernünftig hinzubekommen, habe ich mir kurzerhand selbst ein Plugin geschrieben.
Das Plugin wertet die Aussen- sowie eine Innentemperatur, die Globalstrahlung und den Zustand "Dämmerung" (1 für Dämmerung) aus.
Liegt der Wert für die Temperaturen und Globalstrahlung über den definierten Grenzwerten + Hysterese, so wird eine feste Beschattungsposition angefahren.
Weiterhin kann eine zeitliche Verzögerung festgelegt werden, damit die Raffstores nicht schon bei kurzer Verschattung wieder hochfahren.
Bei Dämmerung macht das Plugin nichts, es werden keinerlei Befehle ausgeführt.
Weiterhin gibt es ein Sperrobjekt, falls dieses auf 1 steht, macht das Plugin auch nichts.
Edit: Gerade habe ich auch noch die Möglichkeit hinzugefügt, die einzelnen Raffstores bzw. Rollos abhängig vom Azimuth der Sonne fahren zu lassen. Bei uns scheint z.B. Abends die Sonne durchs Westfenster ins Schlafzimmer und heizt dieses auf, dies möchte ich vermeiden. Allerdings möchte ich auch nicht den ganzen Tag das Rollo geschlossen haben, da dies erst in den Abendstunden ein Problem wird.
Code:
my $globalstrahlung_ga="0/1/15"; my $globalstrahlung_hysterese = 50; my $globalstrahlung_schwelle = 150; my $temperatur_aussen_ga = "0/1/5"; my $temperatur_aussen_schwelle = 20; my $temperatur_aussen_hysterese = 2; my $temperatur_innen_ga = "15/1/2"; my $temperatur_innen_schwelle = 20; my $temperatur_innen_hysterese = 1; my $daemmerung_ga = "0/5/4"; my $beschattung = 0; my $fahrbefehl = 0; my $position = 100; my $winkel = 10; my $time_hysterese_beschattung_an = 30; # Verzögerung der Befehlsausführung, damit bei kurzzeitigen Änderungen (Wolken etc.) nicht sofort reagiert wird my $time_hysterese_beschattung_aus = 600; my $beschattung_status_ga = "0/5/5"; my $beschattung_status; my $azimuth_ga = "0/1/1"; my $azimuth; my $daemmerung; my $temperatur_innen; my $temperatur_aussen; my $globalstrahlung; my $timestamp; my $lastorder; my $lastorderissued; my $timehysterese; my @raffstores; # Fuer Rolladen beim Winkel eine nicht vergebene GA angeben. Ist nicht schoen, aber einfacher zu handhaben push @raffstores, { name => "wohnzimmerfenster süd", pos_ga => "2/3/22", winkel_ga => "2/4/6", azimuth_start => 0, azimuth_stop => 180}; push @raffstores, { name => "wohnzimmer süd", pos_ga => "2/3/21", winkel_ga => "2/4/5",azimuth_start => 0, azimuth_stop => 180}; push @raffstores, { name => "schlafzimmer west", pos_ga => "2/3/13", winkel_ga => "2/3/250",azimuth_start => 110, azimuth_stop => 180}; push @raffstores, { name => "kueche west", pos_ga => "2/3/2", winkel_ga => "2/3/250",azimuth_start => 110, azimuth_stop => 180}; ################### ENDE DEFINITION ################## ### PLUGIN AUFRUFZEIT ### $plugin_info{$plugname.'_cycle'} = 120; ### WERTE EINLESEN ### $temperatur_innen = knx_read($temperatur_innen_ga,600,9); $temperatur_aussen = knx_read($temperatur_aussen_ga,600,9); $globalstrahlung = knx_read($globalstrahlung_ga,600,9); $daemmerung = knx_read($daemmerung_ga,86400,1); $beschattung_status = knx_read($beschattung_status_ga,86400,1); $azimuth = knx_read($azimuth_ga,600,8); if($beschattung_status > 0) { $plugin_info{$plugname.'lastorderissued'} = -1; plugin_log($plugname, 'Beschattung gesperrt'); return; } if($daemmerung > 0) { $plugin_info{$plugname.'lastorderissued'} = -1; # Wenn der nächste Tag anbricht, sollen evtl. Befehle neu gegeben werden plugin_log($plugname, 'Daemmerung, mache nichts'); return; } plugin_log($plugname, 'Temperatur innen: '.$temperatur_innen); plugin_log($plugname, 'Temperatur aussen: '.$temperatur_aussen); plugin_log($plugname, 'Globalstrahlung: '.$globalstrahlung); plugin_log($plugname, 'Daemmerung: '.$daemmerung); plugin_log($plugname, 'Azimuth: '.$azimuth); ### Wenn alle Voraussetzungen erfüllt sind, verschatten #### if($temperatur_aussen > ($temperatur_aussen_schwelle + $temperatur_aussen_hysterese)) { if($temperatur_innen > ($temperatur_innen_schwelle + $temperatur_innen_hysterese)) { if($globalstrahlung > ($globalstrahlung_schwelle + $globalstrahlung_hysterese)) { $fahrbefehl = 1; $beschattung = 1; } } } ### Wenn eine Voraussetzungen nicht erfüllt ist, hochfahren #### if($temperatur_aussen < ($temperatur_aussen_schwelle - $temperatur_aussen_hysterese)) { $fahrbefehl = 1; $beschattung = 0; } if($temperatur_innen < ($temperatur_innen_schwelle - $temperatur_innen_hysterese)) { $fahrbefehl = 1; $beschattung = 0; } if($globalstrahlung < ($globalstrahlung_schwelle - $globalstrahlung_hysterese)) { $fahrbefehl = 1; $beschattung = 0; } if($fahrbefehl < 1) { plugin_log($plugname,'Nichts zu tun. Over and out.'); return; } if($beschattung > 0) { $timehysterese = $time_hysterese_beschattung_an; } else { $timehysterese = $time_hysterese_beschattung_aus; } $lastorder = $plugin_info{$plugname.'lastorder'}; $timestamp = time(); if($lastorder != $beschattung) { $plugin_info{$plugname.'timestamp'} = $timestamp; $fahrbefehl = 0; plugin_log($plugname,'Neuer Fahrbefehl, setze Wartezeit auf '.($timehysterese / 60).' Minuten'); } else { if(($plugin_info{$plugname.'timestamp'} + $timehysterese) > $timestamp) { $fahrbefehl = 0; plugin_log($plugname,'Noch '.(-1 * ($timestamp - ($plugin_info{$plugname.'timestamp'} + $timehysterese)) / 60).' Minuten bis zur Aufuehrung des neuen Fahrbefehls'); } } $plugin_info{$plugname.'lastorder'} = $beschattung; if($fahrbefehl) { if($plugin_info{$plugname.'lastorderissued'} == $beschattung) { $fahrbefehl = 0; plugin_log($plugname,'Fahrbefehl wurde bereits ausgefuehrt.'); } } plugin_log($plugname,'Beschattung: '.$beschattung.' Fahrbefehl: '.$fahrbefehl); if($fahrbefehl) { foreach my $raffstore (@raffstores) { if($beschattung and (($raffstore->{azimuth_start} <= $azimuth) or ($azimuth <= $raffstore->{azimuth_stop}))) { knx_write($raffstore->{pos_ga},$position,5); knx_write($raffstore->{winkel_ga},$winkel,5); } else { knx_write($raffstore->{pos_ga},0,5); ### Jalousie fahren ganz hoch knx_write($raffstore->{winkel_ga},0,5); } } $plugin_info{$plugname.'lastorderissued'} = $beschattung; }
Kommentar