FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: holfmink am 22 August 2014, 10:20:36

Titel: GELÖST: If-Schleife funktioniert nicht
Beitrag von: holfmink am 22 August 2014, 10:20:36
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,"; }
    } 
}
}

Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: krikan am 22 August 2014, 10:46:03
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.
Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: Elektrolurch am 22 August 2014, 10:57:12
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
Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: holfmink am 22 August 2014, 12:53:24
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
Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: Elektrolurch am 22 August 2014, 13:24:12
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!
Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: pc1246 am 22 August 2014, 13:40:32
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
Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: holfmink am 22 August 2014, 18:24:16
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
Titel: Antw:If-Schleife funktioniert nicht
Beitrag von: Puschel74 am 22 August 2014, 20:30:08
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