GELÖST: If-Schleife funktioniert nicht

Begonnen von holfmink, 22 August 2014, 10:20:36

Vorheriges Thema - Nächstes Thema

holfmink

Hallo,

ich bin neu hier und versuche eine Beschattung mit Azimuth zu erstellen.

package main;
use strict;
use warnings;
use POSIX;
sub
utilstest_azimuth_mit_zeit_Initialize($$)
{
  my ($hash) = @_;
}
sub
Wetterregelung_Sonne_Ost($){
    my ($Aktorname) = @_;
    if (Value("Beschattung_Sonne") eq "aktiv"){
        my $azimuth= ReadingsVal("T","azimuth","999");
        Log 3, "azimuth------------>$azimuth";
        my $Sonne= ReadingsVal("YahooWetter","condition","kein Wert");
        Log 3, "condition------------>$Sonne";
       my $now = time();
Log 3, "time------------>$now";
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
Log 3, "Stunde------------>$hour";
       if (($hour > 7) && ($hour < 12)) {
          if ($azimuth > 150) {fhem ("set $Aktorname 100");Log 1,"Markiese wird geöffnet Beschattung nicht mehr nötig."; }
            if (($azimuth >= 50) && (($Sonne eq "sonnig") || ($Sonne eq "teilweise wolkig") || ($Sonne eq "überwiegend wolkig")) && (Value("$Aktorname") != 1)) {fhem("set $Aktorname 20"); Log 1, "Beschattungsposition wird angefahren."; }
          elsif (($azimuth==999) || ($Sonne eq "kein Wert")) {Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $azimuth, $Sonne,";}
    }
}
}
1;

Ich bekomme den richtigen Azimuth, die richtige Zeit und Wettercondition im LOG-File zurück.
Bei der IF_Schleife bekomme ich immer nur ein Ergebnis bei Azimuth > 150, aber nie > 50.

Bitte um Hilfe.

Danke.

Lösung:
package main;
use strict;
use warnings;
use POSIX;
sub
utilstest_azimuth_mit_zeit_Initialize($$)
{
  my ($hash) = @_;
}
sub
Wetterregelung_Sonne_Ost($){
    my ($Aktorname) = @_;
    if (Value("Beschattung_Sonne") eq "aktiv"){
        my $azimuth= ReadingsVal("T","azimuth","999");
        Log 3, "azimuth------------>$azimuth";
        my $Sonne= ReadingsVal("T","condition","kein Wert");
        Log 3, "condition------------>$Sonne";
       my $now = time();
Log 3, "time------------>$now";
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
Log 3, "Stunde------------>$hour";
        if (($hour > 7) && ($hour < 14)) {
         if ($azimuth > 150) {fhem ("set $Aktorname 100");Log 1,"Markiese wird geöffnet Beschattung nicht mehr nötig."; }         
          if ((($azimuth > 50) && ($azimuth <150)) && (($Sonne = 30) || ($Sonne = 29) || ($Sonne = 28)) && (Value("$Aktorname") != 1)) {fhem("set $Aktorname 80"); Log 1, "Beschattungsposition wird angefahren."; }
          elsif (($azimuth==999) || ($Sonne eq "kein Wert")) {Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $azimuth, $Sonne,"; }
    } 
}
}


krikan

Habe mir das nicht im Detail angeschaut, aber vielleicht solltest Du Dich mal mit den Prioritäten der Operatoren beschäftigen https://perl-seiten.homepage.t-online.de/html/perl_op.html.

Elektrolurch

Mal so als Tipp: if - Bedingungen sind keine "Schleifen", es sei denn, man arbeitet mit goto's.
Schleifen werden über "for", "while", "util" usw. gebaut.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

holfmink

Hallo,

danke für die Hinweise. Ich habe anstatt des IF bei der Zeitabfrage ein while gesetzt. Jetzt ist die Fritzbox auf der FHEM läuft unter "Vollast".
Wie kann ich die while-Funtion mit einer Zeitverzögerung z. B. alle 15min nur prüfen, realisieren ?

Vielen Dank für Hinweise

Elektrolurch

Wer hat denn gesagt, dass Du das if durch ein while ersetzen sollst?
Niemand.
Ich habe nur geschrieben, dass Dein Titel "if-Schleife" keinen Sinn hat.
Vielleicht schaust Du Dir das hier mal an:


http://www.perlboard.de/perlguide/Inhalt.html

Dann würdest Du auch verstehen, dass eine "Schleife" für Dein Problem aber auch absolut keinen Sinn macht!
configDB und Windows befreite Zone!

pc1246

Hallo holfmink

Ich denke, Du hast die Reihenfolge da etwas vertauscht. Bzw. fehlt ein els(if)! Bei Dir wird nur wenn azimuth > 150 die >= 50 Bedingung geprueft!

Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

holfmink

#6
Hallo Christoph (PC126),

ich hab es so umgestellt und alles funktioniert wie geplant

package main;
use strict;
use warnings;
use POSIX;
sub
utilstest_azimuth_mit_zeit_Initialize($$)
{
  my ($hash) = @_;
}
sub
Wetterregelung_Sonne_Ost($){
    my ($Aktorname) = @_;
    if (Value("Beschattung_Sonne") eq "aktiv"){
        my $azimuth= ReadingsVal("T","azimuth","999");
        Log 3, "azimuth------------>$azimuth";
        my $Sonne= ReadingsVal("T","condition","kein Wert");
        Log 3, "condition------------>$Sonne";
       my $now = time();
Log 3, "time------------>$now";
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
Log 3, "Stunde------------>$hour";
        if (($hour > 7) && ($hour < 14)) {
         if ($azimuth > 150) {fhem ("set $Aktorname 100");Log 1,"Markiese wird geöffnet Beschattung nicht mehr nötig."; }         
          if ((($azimuth > 50) && ($azimuth <150)) && (($Sonne = 30) || ($Sonne = 29) || ($Sonne = 28)) && (Value("$Aktorname") != 1)) {fhem("set $Aktorname 80"); Log 1, "Beschattungsposition wird angefahren."; }
          elsif (($azimuth==999) || ($Sonne eq "kein Wert")) {Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $azimuth, $Sonne,"; }
    } 
}
}


Meine Beschattung ist somit getestet und lauffähig.

Danke.

Gruss Peter

Puschel74

Hallo,

dann den Beitrag bitte als Gelöst markieren (Titel im ersten Beitrag anpassen) und die Lösung auch gleich im ersten Beitrag posten.
Das erspart Nachkommenden das lesen des gesamten Beitrags.
Danke.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.