[Gelöst] Wie funktioniert negation von Perl Aufruf

Begonnen von luftdieb, 02 Juni 2018, 13:06:24

Vorheriges Thema - Nächstes Thema

luftdieb

Hallo,
leider erzeugt folgende DOIF Abfrage permanent einen Fehler, sofern die Funktion checkBeschatten() 0 zurück gibt:

({checkBeschatten("o")}) (set .*Ost_RL pct 30) DOELSEIF ([08:00-22:00] and !{checkBeschatten("o")} and [duAutomatic:state]==1) (set .*Ost_RL on) DOELSEIF ([16:00-23:00] and [HM_Hellligkeit:brightness]<[duHelligkeit:state]) (set .*Ost_RL off)

checkBeschatten gibt entweder 1 oder 0 zurück. Wenn es 1 zurück gibt, ist alles ok und cmd1 wird ausgeführt.
Wird 0 zurückgegeben, erscheint im logbuch folgender Eintrag
- PERL WARNING: Odd number of elements in anonymous hash at (eval 136467) line 1.
- eval: di_Rollos_Osten: warning in condition c02
wird die negation "!" vor der geschweiften Klammer entfernt, gibt es weiterhin die Fehlermeldung... jedoch wird dann cmd2 ausgeführt.

Die Funktion checkBeschatten() sieht wie folgt aus:
sub checkBeschatten($) {
# Benötigt: nur die Himmelsrichtung (n o s w)

# Rückgabe: 1 = Beschatten sinnvoll
# 0 =Beschatten nicht erforderlich
my ($Himmelsrichtung) = @_;
my $Status = 0;
my $CurrentSunPosition = ReadingsVal("TC_TWILIGHT","azimuth", "");
my $CurrentTemp = ReadingsVal("Heizung","Temp-Aussen","");
my $CurrentMaxTemp = ReadingsVal("duBeschattenTemp","state","");
my $Automatic = ReadingsVal("duAutomatic","state","");
if ($Himmelsrichtung eq ""){
Log3(undef,3,"checkBeschatten: Keine Himmerlsrichtung angegeben!");
return ( 0 );
}
if ($Automatic eq "0"){
Log3(undef,3,"checkBeschatten: Automatic = 0");
return ( 0 );
}
if ($CurrentTemp lt $CurrentMaxTemp ){
Log3(undef,3,"checkBeschatten: Kalt genug!");
return ( 0 );
}
if ($CurrentSunPosition gt 60 and $CurrentSunPosition lt 157 and $Himmelsrichtung eq "o") {
Log3(undef,3,"checkBeschatten: Im Osten schatten sinnvoll");
return ( 1 );
}
elsif ($CurrentSunPosition gt 157 and $CurrentSunPosition lt 268 and $Himmelsrichtung eq "s") {
Log3(undef,3,"checkBeschatten: Im Sueden schatten sinnvoll");
return ( 1 );
}
elsif ($CurrentSunPosition gt 230 and $Himmelsrichtung eq "w") {
Log3(undef,3,"checkBeschatten: Im Westen schatten sinnvoll");
return ( 1 );
}
else {
Log3(undef,3,"checkBeschatten: Keine Beschattung erforderlich");
return ( 0 );
}

return ( 0 );
}


Damian

In der DOIF-Bedingung gibt es normalerweise keine geschweiften Klammern (nur aus Kompatibiliätsgründen zu at bei Zeitfunktionen):

... !checkBeschatten("o")...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

luftdieb

Vielen Dank. Die Lösung kann manchmal so einfach sein :-)

Gruß
lufdieb