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,"; }
}
}
}
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.
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
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
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!
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
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
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