[gelöst] Beregnung/mehrere Kreise schaltbar/Sonnenstandabhängig/Pumpen gesteuert

Begonnen von holle75, 03 April 2017, 17:43:09

Vorheriges Thema - Nächstes Thema

Per


Rheininsel

Nach sehr langer Zeit ist jetzt wieder Bewässerungszeit und ich wollte Euch nicht den Code schuldig bleiben... Sorry. Wer mehr Infos haben möchte... Ich bemühe mich nun um eine Zeitnahe Antwort ;-)


(([{sunrise(+3600,"06:30","08:30")}|8] or [{sunrise(+7200,"07:30","08:30")}|7]) and [11_Gartenautomatik] eq "JA" and [01_MODUS] eq "Sommer" and [Wetterstation:statRainHour24] < (2 + (([Wetter:fc1_high_c]-20)/5) ))
       ({
          prowl("Bewässerung wird jetzt gestartet","","0","0");
          my $testwert;;;;
          my $testwert2;;;;
          my $testwert3;;;;
          my $testwert4;;;;
          my @Ventilwerte;;;;
          my @Ventilgroessen;;;;
          my @Ventilgruppen;;;;
          my @Ventilzeiten;;;;
          my @Startzeit;;;;
          my $Ventilwert;;;;
          my $i=0;;;;
          my $j=0;;;;
          my $z1=0;;;;
          my $z2=0;;;;
          my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;;
          my $Zeitspeicher=3;;;;
          my $aktuelleZeit=0;;;;
          my $sec2;;;;
          my $min2;;;;
          my $hour2;;;;
          my $mday2;;;;
          my $mon2;;;;
          my $temperatur=ReadingsVal('Wetter', 'fc1_high_c', '25');;;;
          my $temperatur_korrekturwert=ReadingsVal('Korrekturfaktor', 'state', '10');;;;
          my $temp_korrekturwert;;;;
          if ($temperatur > 25) {
             $temp_korrekturwert=(($temperatur-25))/$temperatur_korrekturwert;;;;
          } else {
             $temp_korrekturwert=0;;;;
          }


          @Ventilgroessen[1] = 0;;;;
          @Ventilgroessen[2] = 0;;;;
          @Ventilgroessen[3] = 0;;;;
          @Ventilgroessen[4] = 0;;;;
          @Ventilgroessen[5] = 0;;;;
          @Ventilgroessen[6] = 0;;;;
          @Ventilgroessen[7] = 0;;;;
          @Ventilgroessen[8] = 0;;;;

          push(@Ventilwerte,['Gartenventil01',ReadingsVal('Gartenventil01', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil01', 'Dauer', 'AUS'),ReadingsVal('Gartenventil01', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil02',ReadingsVal('Gartenventil02', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil02', 'Dauer', 'AUS'),ReadingsVal('Gartenventil02', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil03',ReadingsVal('Gartenventil03', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil03', 'Dauer', 'AUS'),ReadingsVal('Gartenventil03', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil04',ReadingsVal('Gartenventil04', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil04', 'Dauer', 'AUS'),ReadingsVal('Gartenventil04', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil05',ReadingsVal('Gartenventil05', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil05', 'Dauer', 'AUS'),ReadingsVal('Gartenventil05', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil06',ReadingsVal('Gartenventil06', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil06', 'Dauer', 'AUS'),ReadingsVal('Gartenventil06', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil07',ReadingsVal('Gartenventil07', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil07', 'Dauer', 'AUS'),ReadingsVal('Gartenventil07', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil08',ReadingsVal('Gartenventil08', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil08', 'Dauer', 'AUS'),ReadingsVal('Gartenventil08', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil09',ReadingsVal('Gartenventil09', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil09', 'Dauer', 'AUS'),ReadingsVal('Gartenventil09', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil10',ReadingsVal('Gartenventil10', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil10', 'Dauer', 'AUS'),ReadingsVal('Gartenventil10', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil11',ReadingsVal('Gartenventil11', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil11', 'Dauer', 'AUS'),ReadingsVal('Gartenventil11', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil12',ReadingsVal('Gartenventil12', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil12', 'Dauer', 'AUS'),ReadingsVal('Gartenventil12', 'Volumen', 'gross')]);;

          for my $row (@Ventilwerte) {

            if (@$row[1] eq "morgens" or @$row[1] eq "beides") {
              if (@$row[2] != 0) {
                 if    (@$row[3] eq "klein")  { @$row[3] = 1;;;; }
                 elsif (@$row[3] eq "mittel") { @$row[3] = 2;;;; }
                 elsif (@$row[3] eq "gross")  { @$row[3] = 4;;;; }
                 

                 if     ((@Ventilgroessen[1] + @$row[3]) <= 4) { @Ventilgroessen[1] += @$row[3];;;; push( @{$Ventilgruppen[1]}, @$row[0] );;;; push( @{$Ventilzeiten[1]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[2] + @$row[3]) <= 4) { @Ventilgroessen[2] += @$row[3];;;; push( @{$Ventilgruppen[2]}, @$row[0] );;;; push( @{$Ventilzeiten[2]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[3] + @$row[3]) <= 4) { @Ventilgroessen[3] += @$row[3];;;; push( @{$Ventilgruppen[3]}, @$row[0] );;;; push( @{$Ventilzeiten[3]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[4] + @$row[3]) <= 4) { @Ventilgroessen[4] += @$row[3];;;; push( @{$Ventilgruppen[4]}, @$row[0] );;;; push( @{$Ventilzeiten[4]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[5] + @$row[3]) <= 4) { @Ventilgroessen[5] += @$row[3];;;; push( @{$Ventilgruppen[5]}, @$row[0] );;;; push( @{$Ventilzeiten[5]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[6] + @$row[3]) <= 4) { @Ventilgroessen[6] += @$row[3];;;; push( @{$Ventilgruppen[6]}, @$row[0] );;;; push( @{$Ventilzeiten[6]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[7] + @$row[3]) <= 4) { @Ventilgroessen[7] += @$row[3];;;; push( @{$Ventilgruppen[7]}, @$row[0] );;;; push( @{$Ventilzeiten[7]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[8] + @$row[3]) <= 4) { @Ventilgroessen[8] += @$row[3];;;; push( @{$Ventilgruppen[8]}, @$row[0] );;;; push( @{$Ventilzeiten[8]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[9] + @$row[3]) <= 4) { @Ventilgroessen[9] += @$row[3];;;; push( @{$Ventilgruppen[9]}, @$row[0] );;;; push( @{$Ventilzeiten[9]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[10] + @$row[3]) <= 4) { @Ventilgroessen[10] += @$row[3];;;; push( @{$Ventilgruppen[10]}, @$row[0] );;;; push( @{$Ventilzeiten[10]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[11] + @$row[3]) <= 4) { @Ventilgroessen[11] += @$row[3];;;; push( @{$Ventilgruppen[11]}, @$row[0] );;;; push( @{$Ventilzeiten[11]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[12] + @$row[3]) <= 4) { @Ventilgroessen[12] += @$row[3];;;; push( @{$Ventilgruppen[12]}, @$row[0] );;;; push( @{$Ventilzeiten[12]}, @$row[2] );;;; }
                   
              }
            }
          }

          my $anzahl_ventilgruppen;;;;
          my $anzahl_ventiluntergruppen;;;;
          my $zwischenwert=0;;;;
          my $maximale_Ventilzeiten=0;;;;
          my $steuerwert;;;;
          my $ListeVentile;;;;
          my $ListeZeiten;;;;

          $anzahl_ventilgruppen = scalar @Ventilgruppen;;;;
          $z1 = 1;;;;
         
          while($z1 < $anzahl_ventilgruppen) {
            my $aktuelleZeit  = mktime($sec+$Zeitspeicher+(($sec+$Zeitspeicher)*$temp_korrekturwert), $min, $hour, $mday, $mon, $year);;;;
            ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)  = localtime($aktuelleZeit);;;;
            if ($sec < 10) { $sec2 = "0";;} else { $sec2 = "";;}
            if ($min < 10) { $min2 = "0";;} else { $min2 = "";;}
            if ($hour < 10) { $hour2 = "0";;} else { $hour2 = "";;}
            if ($mday < 10) { $mday2 = "0";;} else { $mday2 = "";;}
            if ($mon < 9) {$mon2 = "0";;} else { $mon2 = "";;}

            if ($z1==0) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[0]};;;; 
              $ListeVentile = "@{@Ventilgruppen[0]}";
              $ListeZeiten  = "@{$Ventilzeiten[0]}";
            }
            elsif ($z1==1) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[1]};;;; 
              $ListeVentile = "@{@Ventilgruppen[1]}";
              $ListeZeiten  = "@{$Ventilzeiten[1]}";
            }
            elsif ($z1==2) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[2]};;;; 
              $ListeVentile = "@{@Ventilgruppen[2]}";
              $ListeZeiten  = "@{$Ventilzeiten[2]}";
            }
            elsif ($z1==3) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[3]};;;; 
              $ListeVentile = "@{@Ventilgruppen[3]}";
              $ListeZeiten  = "@{$Ventilzeiten[3]}";
            }
            elsif ($z1==4) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[4]};;;; 
              $ListeVentile = "@{@Ventilgruppen[4]}";
              $ListeZeiten  = "@{$Ventilzeiten[4]}";
            }
            elsif ($z1==5) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[5]};;;; 
              $ListeVentile = "@{@Ventilgruppen[5]}";
              $ListeZeiten  = "@{$Ventilzeiten[5]}";
            }
            elsif ($z1==6) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[6]};;;; 
              $ListeVentile = "@{@Ventilgruppen[6]}";
              $ListeZeiten  = "@{$Ventilzeiten[6]}";
            }
            elsif ($z1==7) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[7]};;;; 
              $ListeVentile = "@{@Ventilgruppen[7]}";
              $ListeZeiten  = "@{$Ventilzeiten[7]}";
            }
            elsif ($z1==8) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[8]};;;; 
              $ListeVentile = "@{@Ventilgruppen[8]}";
              $ListeZeiten  = "@{$Ventilzeiten[8]}";
            }
            elsif ($z1==9) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[9]};;;; 
              $ListeVentile = "@{@Ventilgruppen[9]}";
              $ListeZeiten  = "@{$Ventilzeiten[9]}";
            }
            elsif ($z1==10) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[10]};;;; 
              $ListeVentile = "@{@Ventilgruppen[10]}";
              $ListeZeiten  = "@{$Ventilzeiten[10]}";
            }
            elsif ($z1==11) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[11]};;;; 
              $ListeVentile = "@{@Ventilgruppen[11]}";
              $ListeZeiten  = "@{$Ventilzeiten[11]}";
            }
            elsif ($z1==12) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[12]};;;; 
              $ListeVentile = "@{@Ventilgruppen[12]}";
              $ListeZeiten  = "@{$Ventilzeiten[12]}";
            }
            $z2 = 1;;;;
            my @ListeVentile = split (/ /,$ListeVentile);
            my @ListeZeiten  = split (/ /,$ListeZeiten);
           
            foreach my $AktuellesVentil (@ListeVentile) {
                my $AktuelleVentilzeit = shift(@ListeZeiten);
                if ($AktuelleVentilzeit > $maximale_Ventilzeiten)
                   {
                    $maximale_Ventilzeiten = $AktuelleVentilzeit;;;;
                   }
                fhem ("define Start_$AktuellesVentil at ".($year+1900)."-".$mon2.($mon+1)."-".$mday2.$mday."T".$hour2.$hour.":".$min2.$min.":".$sec2.$sec." set Bewaesserung_Sw_".substr ($AktuellesVentil, 12, 2)." on-for-timer ".($AktuelleVentilzeit*10+(($AktuelleVentilzeit*10)*$temp_korrekturwert))."");
                fhem ("attr Start_$AktuellesVentil room Bewässerung");
                fhem ("attr Start_$AktuellesVentil group aktuell_Zeitsteuerung");
            }
                   
                $testwert .= "Maxwert -> ".$maximale_Ventilzeiten."\n";;;;
                $Zeitspeicher = ($maximale_Ventilzeiten*10)-5;;;; ##$Zeitspeicher+
                $maximale_Ventilzeiten = 0;;
            $z1++;;;;
          }
         
         
        })

DOELSEIF

(([{sunset("REAL",0,"18:00","21:00")}]) and [11_Gartenautomatik] eq "JA" and [01_MODUS] eq "Sommer" and [Wetterstation:statRainHour24] < (2 + (([Wetter:fc1_high_c]-20)/5) ))
       ({
          prowl("Bewässerung wird jetzt gestartet","","0","0");
          my $testwert;;;;
          my $testwert2;;;;
          my $testwert3;;;;
          my $testwert4;;;;
          my @Ventilwerte;;;;
          my @Ventilgroessen;;;;
          my @Ventilgruppen;;;;
          my @Ventilzeiten;;;;
          my @Startzeit;;;;
          my $Ventilwert;;;;
          my $i=0;;;;
          my $j=0;;;;
          my $z1=0;;;;
          my $z2=0;;;;
          my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;;
          my $Zeitspeicher=3;;;;
          my $aktuelleZeit=0;;;;
          my $sec2;;;;
          my $min2;;;;
          my $hour2;;;;
          my $mday2;;;;
          my $mon2;;;;
          my $temperatur=ReadingsVal('Wetter', 'fc1_high_c', '25');;;;
          my $temperatur_korrekturwert=ReadingsVal('Korrekturfaktor', 'state', '10');;;;
          my $temp_korrekturwert;;;;
          if ($temperatur > 25) {
             $temp_korrekturwert=(($temperatur-25))/$temperatur_korrekturwert;;;;
          } else {
             $temp_korrekturwert=0;;;;
          }


          @Ventilgroessen[1] = 0;;;;
          @Ventilgroessen[2] = 0;;;;
          @Ventilgroessen[3] = 0;;;;
          @Ventilgroessen[4] = 0;;;;
          @Ventilgroessen[5] = 0;;;;
          @Ventilgroessen[6] = 0;;;;
          @Ventilgroessen[7] = 0;;;;
          @Ventilgroessen[8] = 0;;;;

          push(@Ventilwerte,['Gartenventil01',ReadingsVal('Gartenventil01', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil01', 'Dauer', 'AUS'),ReadingsVal('Gartenventil01', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil02',ReadingsVal('Gartenventil02', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil02', 'Dauer', 'AUS'),ReadingsVal('Gartenventil02', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil03',ReadingsVal('Gartenventil03', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil03', 'Dauer', 'AUS'),ReadingsVal('Gartenventil03', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil04',ReadingsVal('Gartenventil04', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil04', 'Dauer', 'AUS'),ReadingsVal('Gartenventil04', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil05',ReadingsVal('Gartenventil05', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil05', 'Dauer', 'AUS'),ReadingsVal('Gartenventil05', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil06',ReadingsVal('Gartenventil06', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil06', 'Dauer', 'AUS'),ReadingsVal('Gartenventil06', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil07',ReadingsVal('Gartenventil07', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil07', 'Dauer', 'AUS'),ReadingsVal('Gartenventil07', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil08',ReadingsVal('Gartenventil08', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil08', 'Dauer', 'AUS'),ReadingsVal('Gartenventil08', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil09',ReadingsVal('Gartenventil09', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil09', 'Dauer', 'AUS'),ReadingsVal('Gartenventil09', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil10',ReadingsVal('Gartenventil10', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil10', 'Dauer', 'AUS'),ReadingsVal('Gartenventil10', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil11',ReadingsVal('Gartenventil11', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil11', 'Dauer', 'AUS'),ReadingsVal('Gartenventil11', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil12',ReadingsVal('Gartenventil12', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil12', 'Dauer', 'AUS'),ReadingsVal('Gartenventil12', 'Volumen', 'gross')]);;

          for my $row (@Ventilwerte) {

            if (@$row[1] eq "abends" or @$row[1] eq "beides") {
              if (@$row[2] != 0) {
                 if    (@$row[3] eq "klein")  { @$row[3] = 1;;;; }
                 elsif (@$row[3] eq "mittel") { @$row[3] = 2;;;; }
                 elsif (@$row[3] eq "gross")  { @$row[3] = 4;;;; }
                 

                 if     ((@Ventilgroessen[1] + @$row[3]) <= 4) { @Ventilgroessen[1] += @$row[3];;;; push( @{$Ventilgruppen[1]}, @$row[0] );;;; push( @{$Ventilzeiten[1]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[2] + @$row[3]) <= 4) { @Ventilgroessen[2] += @$row[3];;;; push( @{$Ventilgruppen[2]}, @$row[0] );;;; push( @{$Ventilzeiten[2]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[3] + @$row[3]) <= 4) { @Ventilgroessen[3] += @$row[3];;;; push( @{$Ventilgruppen[3]}, @$row[0] );;;; push( @{$Ventilzeiten[3]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[4] + @$row[3]) <= 4) { @Ventilgroessen[4] += @$row[3];;;; push( @{$Ventilgruppen[4]}, @$row[0] );;;; push( @{$Ventilzeiten[4]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[5] + @$row[3]) <= 4) { @Ventilgroessen[5] += @$row[3];;;; push( @{$Ventilgruppen[5]}, @$row[0] );;;; push( @{$Ventilzeiten[5]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[6] + @$row[3]) <= 4) { @Ventilgroessen[6] += @$row[3];;;; push( @{$Ventilgruppen[6]}, @$row[0] );;;; push( @{$Ventilzeiten[6]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[7] + @$row[3]) <= 4) { @Ventilgroessen[7] += @$row[3];;;; push( @{$Ventilgruppen[7]}, @$row[0] );;;; push( @{$Ventilzeiten[7]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[8] + @$row[3]) <= 4) { @Ventilgroessen[8] += @$row[3];;;; push( @{$Ventilgruppen[8]}, @$row[0] );;;; push( @{$Ventilzeiten[8]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[9] + @$row[3]) <= 4) { @Ventilgroessen[9] += @$row[3];;;; push( @{$Ventilgruppen[9]}, @$row[0] );;;; push( @{$Ventilzeiten[9]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[10] + @$row[3]) <= 4) { @Ventilgroessen[10] += @$row[3];;;; push( @{$Ventilgruppen[10]}, @$row[0] );;;; push( @{$Ventilzeiten[10]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[11] + @$row[3]) <= 4) { @Ventilgroessen[11] += @$row[3];;;; push( @{$Ventilgruppen[11]}, @$row[0] );;;; push( @{$Ventilzeiten[11]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[12] + @$row[3]) <= 4) { @Ventilgroessen[12] += @$row[3];;;; push( @{$Ventilgruppen[12]}, @$row[0] );;;; push( @{$Ventilzeiten[12]}, @$row[2] );;;; }
                   
              }
            }
          }

          my $anzahl_ventilgruppen;;;;
          my $anzahl_ventiluntergruppen;;;;
          my $zwischenwert=0;;;;
          my $maximale_Ventilzeiten=0;;;;
          my $steuerwert;;;;
          my $ListeVentile;;;;
          my $ListeZeiten;;;;

          $anzahl_ventilgruppen = scalar @Ventilgruppen;;;;
          $z1 = 1;;;;
         
          while($z1 < $anzahl_ventilgruppen) {
            my $aktuelleZeit  = mktime($sec+$Zeitspeicher+(($sec+$Zeitspeicher)*$temp_korrekturwert), $min, $hour, $mday, $mon, $year);;;;
            ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)  = localtime($aktuelleZeit);;;;
            if ($sec < 10) { $sec2 = "0";;} else { $sec2 = "";;}
            if ($min < 10) { $min2 = "0";;} else { $min2 = "";;}
            if ($hour < 10) { $hour2 = "0";;} else { $hour2 = "";;}
            if ($mday < 10) { $mday2 = "0";;} else { $mday2 = "";;}
            if ($mon < 9) {$mon2 = "0";;} else { $mon2 = "";;}

            if ($z1==0) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[0]};;;; 
              $ListeVentile = "@{@Ventilgruppen[0]}";
              $ListeZeiten  = "@{$Ventilzeiten[0]}";
            }
            elsif ($z1==1) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[1]};;;; 
              $ListeVentile = "@{@Ventilgruppen[1]}";
              $ListeZeiten  = "@{$Ventilzeiten[1]}";
            }
            elsif ($z1==2) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[2]};;;; 
              $ListeVentile = "@{@Ventilgruppen[2]}";
              $ListeZeiten  = "@{$Ventilzeiten[2]}";
            }
            elsif ($z1==3) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[3]};;;; 
              $ListeVentile = "@{@Ventilgruppen[3]}";
              $ListeZeiten  = "@{$Ventilzeiten[3]}";
            }
            elsif ($z1==4) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[4]};;;; 
              $ListeVentile = "@{@Ventilgruppen[4]}";
              $ListeZeiten  = "@{$Ventilzeiten[4]}";
            }
            elsif ($z1==5) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[5]};;;; 
              $ListeVentile = "@{@Ventilgruppen[5]}";
              $ListeZeiten  = "@{$Ventilzeiten[5]}";
            }
            elsif ($z1==6) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[6]};;;; 
              $ListeVentile = "@{@Ventilgruppen[6]}";
              $ListeZeiten  = "@{$Ventilzeiten[6]}";
            }
            elsif ($z1==7) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[7]};;;; 
              $ListeVentile = "@{@Ventilgruppen[7]}";
              $ListeZeiten  = "@{$Ventilzeiten[7]}";
            }
            elsif ($z1==8) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[8]};;;; 
              $ListeVentile = "@{@Ventilgruppen[8]}";
              $ListeZeiten  = "@{$Ventilzeiten[8]}";
            }
            elsif ($z1==9) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[9]};;;; 
              $ListeVentile = "@{@Ventilgruppen[9]}";
              $ListeZeiten  = "@{$Ventilzeiten[9]}";
            }
            elsif ($z1==10) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[10]};;;; 
              $ListeVentile = "@{@Ventilgruppen[10]}";
              $ListeZeiten  = "@{$Ventilzeiten[10]}";
            }
            elsif ($z1==11) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[11]};;;; 
              $ListeVentile = "@{@Ventilgruppen[11]}";
              $ListeZeiten  = "@{$Ventilzeiten[11]}";
            }
            elsif ($z1==12) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[12]};;;; 
              $ListeVentile = "@{@Ventilgruppen[12]}";
              $ListeZeiten  = "@{$Ventilzeiten[12]}";
            }
            $z2 = 1;;;;
            my @ListeVentile = split (/ /,$ListeVentile);
            my @ListeZeiten  = split (/ /,$ListeZeiten);
           
            foreach my $AktuellesVentil (@ListeVentile) {
                my $AktuelleVentilzeit = shift(@ListeZeiten);
                if ($AktuelleVentilzeit > $maximale_Ventilzeiten)
                   {
                    $maximale_Ventilzeiten = $AktuelleVentilzeit;;;;
                   }
                fhem ("define Start_$AktuellesVentil at ".($year+1900)."-".$mon2.($mon+1)."-".$mday2.$mday."T".$hour2.$hour.":".$min2.$min.":".$sec2.$sec." set Bewaesserung_Sw_".substr ($AktuellesVentil, 12, 2)." on-for-timer ".($AktuelleVentilzeit*10+(($AktuelleVentilzeit*10)*$temp_korrekturwert))."");
                fhem ("attr Start_$AktuellesVentil room Bewässerung");
                fhem ("attr Start_$AktuellesVentil group aktuell_Zeitsteuerung");
            }
                   
                $testwert .= "Maxwert -> ".$maximale_Ventilzeiten."\n";;;;
                $Zeitspeicher = ($maximale_Ventilzeiten*10)-5;;;; ##$Zeitspeicher+
                $maximale_Ventilzeiten = 0;;
            $z1++;;;;
          }
         
         
        })


Es wird mit verschiedenen Dummys gearbeitet und auch die Ventile sind nochmals einzeln steuerbar. Die zugehörige Pumpe zur Versorgung aus Wasserfässern wird nur eingeschaltet, wenn auch ein Ventil geöffnet wurde.

Grüße und schöne Ostern!

Gregor

Damian

Das sieht nicht nach einem Output von Rawdefinition aus: Warum hast du vier Semikolons, statt einem?

Aufwändigere Berechnungen würde ich alleine schon aus Performance-Gründen in eine Funktion auslagern. In deinem Fall wird bei jeder Ausführung der ganze Perlcode übersetzt. Unnötige Trigger würde ich mit ? ausbauen.

Effizienter und auch übersichtlicher:

DOIF
## Definition der beiden Bewesserungsroutinen

subs {
sub bewesserung1
{
   prowl("Bewässerung wird jetzt gestartet","","0","0");
          my $testwert;
          my $testwert2;
          my $testwert3;
...
}

sub bewesserung2
{
...
}

} ## end of subs

## Ausführungsblock 1
{if (([{sunrise(+3600,"06:30","08:30")}|8] or [{sunrise(+7200,"07:30","08:30")}|7]) and [?11_Gartenautomatik] eq "JA" and [?01_MODUS] eq "Sommer" and [?Wetterstation:statRainHour24] < (2 + ([?Wetter:fc1_high_c]-20)/5)) {
   bewesserung1();
}
}

## Ausführungsblock 2
{if ([{sunset("REAL",0,"18:00","21:00")}] and [?11_Gartenautomatik] eq "JA" and [?01_MODUS] eq "Sommer" and [?Wetterstation:statRainHour24] < (2 + ([?Wetter:fc1_high_c]-20)/5)) {
  bewesserung2();
}
}


Das war Perl-Modus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rheininsel

Hihi! Das schaut nach Potential aus. Danke! Ich werde das anpassen. Schaut wirklich besser aus.

Grüße
Gregor

Damian

Zitat von: Rheininsel am 21 April 2019, 11:00:15
Hihi! Das schaut nach Potential aus. Danke! Ich werde das anpassen. Schaut wirklich besser aus.

Grüße
Gregor

Du solltest bei der Umstellung daran denken, dass im Perl-Modus der Namensraum von DOIF gekapselt (geschützt) ist, das hat den Vorteil, dass man sich nicht bestehende Routinen versehentlich überschreibt, die außerhalb der DOIF-Welt definiert wurden.  Bei fremden Routinen, die angemeckert werden, musst du :: voranstellen z. B. ::prowl(...).
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Ein paar Anmerkungen, ohne weitere Syntaxprüfungen, mathematische Vereinfachungen oder Auslagerung in Funktionen u.ä.:
1.

          push(@Ventilwerte,['Gartenventil01',ReadingsVal('Gartenventil01', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil01', 'Dauer', 'AUS'),ReadingsVal('Gartenventil01', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil02',ReadingsVal('Gartenventil02', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil02', 'Dauer', 'AUS'),ReadingsVal('Gartenventil02', 'Volumen', 'gross')]);;
...
          push(@Ventilwerte,['Gartenventil11',ReadingsVal('Gartenventil11', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil11', 'Dauer', 'AUS'),ReadingsVal('Gartenventil11', 'Volumen', 'gross')]);;
          push(@Ventilwerte,['Gartenventil12',ReadingsVal('Gartenventil12', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil12', 'Dauer', 'AUS'),ReadingsVal('Gartenventil12', 'Volumen', 'gross')]);;


Mit Änderung der Nahmen auf ohne führende 0 (sonst wird es etwas aufwendiger):


my @a = (1..12);
for my $i (@a){
          my $GV_Nr = 'Gartenventil' . $i;
          push(@Ventilwerte,[$GV_Nr, ReadingsVal($GV_Nr, 'Betrieb', 'AUS'),ReadingsVal($GV_Nr, 'Dauer', 'AUS'),ReadingsVal($GV_Nr, 'Volumen', 'gross')]);
}


2.

                 if     ((@Ventilgroessen[1] + @$row[3]) <= 4) { @Ventilgroessen[1] += @$row[3];;;; push( @{$Ventilgruppen[1]}, @$row[0] );;;; push( @{$Ventilzeiten[1]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[2] + @$row[3]) <= 4) { @Ventilgroessen[2] += @$row[3];;;; push( @{$Ventilgruppen[2]}, @$row[0] );;;; push( @{$Ventilzeiten[2]}, @$row[2] );;;; }
...
                 elsif  ((@Ventilgroessen[11] + @$row[3]) <= 4) { @Ventilgroessen[11] += @$row[3];;;; push( @{$Ventilgruppen[11]}, @$row[0] );;;; push( @{$Ventilzeiten[11]}, @$row[2] );;;; }
                 elsif  ((@Ventilgroessen[12] + @$row[3]) <= 4) { @Ventilgroessen[12] += @$row[3];;;; push( @{$Ventilgruppen[12]}, @$row[0] );;;; push( @{$Ventilzeiten[12]}, @$row[2] );;;; }

-->

my @a = (1..12);
for my $i (@a){
                 if     ((@Ventilgroessen[$i] + @$row[3]) <= 4) { @Ventilgroessen[$i] += @$row[3];push( @{$Ventilgruppen[$i]}, @$row[0] );push( @{$Ventilzeiten[$i]}, @$row[2] );
                                  break;}
}


und 3.

            if ($z1==0) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[0]};;;; 
              $ListeVentile = "@{@Ventilgruppen[0]}";
              $ListeZeiten  = "@{$Ventilzeiten[0]}";
            }
            elsif ($z1==1) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[1]};;;; 
              $ListeVentile = "@{@Ventilgruppen[1]}";
              $ListeZeiten  = "@{$Ventilzeiten[1]}";
            }
...
            elsif ($z1==11) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[11]};;;; 
              $ListeVentile = "@{@Ventilgruppen[11]}";
              $ListeZeiten  = "@{$Ventilzeiten[11]}";
            }
            elsif ($z1==12) {
              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[12]};;;; 
              $ListeVentile = "@{@Ventilgruppen[12]}";
              $ListeZeiten  = "@{$Ventilzeiten[12]}";
            }

-->

              $anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[$z1]}; 
              $ListeVentile = "@{@Ventilgruppen[$z1]}";
              $ListeZeiten  = "@{$Ventilzeiten[$z1]}";