Hauptmenü

Markisensteuerung

Begonnen von stim, 09 August 2014, 22:49:48

Vorheriges Thema - Nächstes Thema

stim

Hallo Zusammen,

ich habe bei der Anforderungsabsteckung meiner Markisensteuerung festgestellt, dass ich zwei Quellen für die Windmessung verwenden möchte.
Einen KS300 und Yahoo Wetter.
Dazu habe ich folgenden Code geschrieben.

(KS300|Wetter){

  my $level=(ReadingsVal("Markise","level",9999));;
  if($level == 9999){
    fhem("set Push msg 'Markisensteuerung' 'Markisenlevel konnte nicht gelesen werden!!!'");
  }
  if($level > 0){
   
     my $wind=(ReadingsVal("KS300","wind",9999));;
     my $windyahoo=(ReadingsVal("Wetter","wind_speed",9999));;

     if($wind > 10 && $wind < 9999 || $windyahoo > 20  && $windyahoo < 9999){
       fhem("set Markise up");
       if (defined($defs{Holddown_Push_Wind})){
         return;
       }else{
         fhem("define Holddown_Push_Wind at +00:05:00 set Dummy_Holddown on");
         fhem("set Push msg 'Markisensteuerung' 'Markise wegen Wind eingefahren'");
       }
     
     }else {
       fhem("set Push msg 'Markisensteuerung' 'Windlevel konnte nicht gelesen werden!!!'");
     }
}
}


Das define Holddown_Push_Wind macht eigentlich nur, dass ich nur alle 5 Minuten ein Push bekomme.
Jetzt meine Frage findet ihr einen Fehler oder evt. eine Möglichkeit zu Optimieren?
Insbesondere diese Zeile hat es in sich:
if($wind > 10 && $wind < 9999 || $windyahoo > 20  && $windyahoo < 9999){


Vielen Dank stimm

Bennemannc

Hallo,

bei UND und ODER Verknüpfungen müssen grundsätzlich Klammern gesetzt werden.
Zitatif($wind > 10 && $wind < 9999 || $windyahoo > 20  && $windyahoo < 9999)
also if(($wind > 10 && $wind < 9999) || ($windyahoo > 20  && $windyahoo < 9999))
Bedeutet: entweder die beiden ersten (und) oder die beiden zweiten (und) müssen erfüllt sein.
     if($wind > 10 && ($wind < 9999 || $windyahoo > 20) && $windyahoo < 9999)
Bedeutet: die Erste und die Letzte Bedingung und eine der beiden Mittleren müssen erfüllt sein.
Ich denke Du benötigst die erste Variante.

Gruß Christooh
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

stim


Damian

Zitat von: Bennemannc am 09 August 2014, 23:32:14

bei UND und ODER Verknüpfungen müssen grundsätzlich Klammern gesetzt werden.


Diese Aussage ist nicht richtig:

ob:

if($wind > 10 && $wind < 9999 || $windyahoo > 20  && $windyahoo < 9999)

oder:

if(($wind > 10 && $wind < 9999) || ($windyahoo > 20  && $windyahoo < 9999))

ist egal, denn  > bindet stärker als &&, und && bindet stärker als ||.

siehe: http://de.selfhtml.org/perl/sprache/operatoren.htm#rangfolge

Klammern setzen kann natürlich nicht schaden, wenn man sich nicht sicher ist.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF