Ankündigung

Einklappen
Keine Ankündigung bisher.

Hitzeprogrammm Verschattung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Hitzeprogrammm Verschattung

    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.


    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;
    }

    #2
    So, der Praxistest hat eine weitere nötige Verbesserung aufgedeckt.

    Ich habe das Plugin so umgebaut, dass man für jedes Rollo eine eigene Gruppenadresse für die Globalstrahlung angeben kann.
    So kann man unterschiedliche Werte je nach Himmelsrichtung des Fensters benutzen.

    Nachteil: Die $plugin_infos werden ziemlich zugemüllt, für jeden Raffstore gibt es eine ganze Reihe Einträge. Ist aber wahrscheinlich eher ein kosmetisches Problem, denn ein praktisches.

    Die Logeinträge sind ebenfalls noch aktiviert und schreiben ziemlich viel ins Log, aber die kann man ja ausschalten.

    Neue Version:

    Code:
    my $globalstrahlung_hysterese = 50;
    my $globalstrahlung_schwelle = 350;
    
    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 => "wohnzimmerfenstersued", pos_ga => "2/3/22", winkel_ga => "2/4/6", azimuth_start => 0, azimuth_stop => 180, globalstrahlung_ga => "0/1/15"};
    push @raffstores, { name => "wohnzimmersued", pos_ga => "2/3/21", winkel_ga => "2/4/5",azimuth_start => 0, azimuth_stop => 180,globalstrahlung_ga => "0/1/15"};
    push @raffstores, { name => "schlafzimmerwest", pos_ga => "2/3/13", winkel_ga => "2/3/250",azimuth_start => 110, azimuth_stop => 180, globalstrahlung_ga => "0/1/16"};
    
    
    ################### 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);
    $daemmerung = knx_read($daemmerung_ga,86400,1);
    $beschattung_status = knx_read($beschattung_status_ga,86400,1);
    $azimuth = knx_read($azimuth_ga,600,8);
    
    plugin_log($plugname, 'Temperatur innen: '.$temperatur_innen);
    plugin_log($plugname, 'Temperatur aussen: '.$temperatur_aussen);
    plugin_log($plugname, 'Daemmerung: '.$daemmerung);
    plugin_log($plugname, 'Azimuth: '.$azimuth);
    
    
    foreach my $raffstore (@raffstores) { 
     
    my $global_ga = $raffstore->{globalstrahlung_ga};
    $globalstrahlung = knx_read($global_ga,600,9);
    
    plugin_log($plugname.' '.$raffstore->{name}, 'Globalstrahlung: '.$globalstrahlung);
    
    
    if($beschattung_status > 0) {
      $plugin_info{$plugname.'_'.$raffstore->{name}.'lastorderissued'} = -1;
      #plugin_log($plugname.' '.$raffstore->{name}, 'Beschattung gesperrt');
      return;  
    }
    
    if($daemmerung > 0) {
      $plugin_info{$plugname.'_'.$raffstore->{name}.'lastorderissued'} = -1; # Wenn der nächste Tag anbricht, sollen evtl. Befehle neu gegeben werden
      #plugin_log($plugname.' '.$raffstore->{name}, 'Daemmerung, mache nichts');  
      return;
    }
      
    
    
    ### 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.' '.$raffstore->{name},'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.$raffstore->{name}.'lastorder'};
    $timestamp = time();
    if($lastorder != $beschattung) {
      $plugin_info{$plugname.'_'.$raffstore->{name}.'timestamp'} = $timestamp;
      $fahrbefehl = 0;
      plugin_log($plugname.' '.$raffstore->{name},'Neuer Fahrbefehl, setze Wartezeit auf '.($timehysterese / 60).' Minuten');
    } else {
      if(($plugin_info{$plugname.'_'.$raffstore->{name}.'timestamp'} + $timehysterese) > $timestamp) {
        $fahrbefehl = 0;
        plugin_log($plugname.' '.$raffstore->{name},'Noch '.(-1 * ($timestamp - ($plugin_info{$plugname.$raffstore->{name}.'timestamp'} + $timehysterese)) / 60).' Minuten bis zur Aufuehrung des neuen Fahrbefehls');
      }
    }
    
    $plugin_info{$plugname.'_'.$raffstore->{name}.'lastorder'} = $beschattung;
    
    if($fahrbefehl) {
      if($plugin_info{$plugname.'_'.$raffstore->{name}.'lastorderissued'} == $beschattung) {
        $fahrbefehl = 0;
        #plugin_log($plugname.' '.$raffstore->{name},'Fahrbefehl wurde bereits ausgefuehrt.');
      }
    }
    plugin_log($plugname.' '.$raffstore->{name},'Beschattung: '.$beschattung.' Fahrbefehl: '.$fahrbefehl);
     
    if($fahrbefehl) {
         
          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.'_'.$raffstore->{name}.'lastorderissued'} = $beschattung;  
      }
      
    }

    Kommentar

    Lädt...
    X