FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Puschel74 am 08 Januar 2013, 10:53:05

Titel: Oder-Abfrage trifft nicht zu
Beitrag von: Puschel74 am 08 Januar 2013, 10:53:05
So,

nun hat es auch mich mal wieder erwischt.
Ich bitte 2 unabhängige Augen mal drüber zu schauen:

EG_WZ_Bewegungsmelder:Ein.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  if (Value("WZ_Deckenlicht") eq "Aus" || Value("WZ_Fernsehlicht") eq "Aus") {
    if ($now >= "21:00" && $now <= "11:30") {
      if($now >= "00:00" && $now < "05:00") {
          fhem ("set WZ_Deckenlicht dim25%%");
      }
      if($now >= "05:00" && $now < "11:30") {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if($now >= "21:00" && $now <= "22:00") {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if($now >= "22:00" && $now <= "23:59") {
        fhem ("set WZ_Deckenlicht dim25%%");
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
    }
  }
  fhem ("set EG_WZ_Bewegungsmelder off")
}


Sollte WZ_Deckenlicht ODER WZ_Fernsehlicht Aus sein soll, nach Uhrzeit, gedimmt werden.
Beide Lichter haben den Status Aus (und nicht off oder toggle) allerdings wird direkt der letzte Befehl ausgeführt
}
  }
  fhem ("set EG_WZ_Bewegungsmelder off")

Das einzige Attribut für diesen Schnipsel lautet
attr Licht_abends room 21_Geraete

Bitte entfernt meine Tomaten und lenkt mich mal in die richtige Richtung.

Grad probiert:

Auch das

EG_WZ_Bewegungsmelder:Ein.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
    if ($now >= "21:00" && $now <= "11:30") {
      if($now >= "00:00" && $now < "05:00") {
          fhem ("set WZ_Deckenlicht dim25%%");
      }
      if($now >= "05:00" && $now < "11:30") {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if($now >= "21:00" && $now <= "22:00") {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if($now >= "22:00" && $now <= "23:59") {
        fhem ("set WZ_Deckenlicht dim25%%");
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
    }
  fhem ("set EG_WZ_Bewegungsmelder off")
}

führt direkt zum ausführen der letzte Zeile wobei das

EG_Eingang_Bewegungsmelder:on.* {
my $now=sprintf("%%02d:%%02d",$hour,$min);
my $fhttk_eing_tuer = ReadingsVal("EG_Eingangstuer", "Window", "nA");
if ( $fhttk_eing_tuer eq "Closed" ) {
if ($now >= "15:00" or $now < "09:00") {
fhem ("set EG_Eingang_Licht_innen on-for-timer 30; set EG_Vorraum_Licht on-for-timer 48; set EG_Eingang_Bewegungsmelder Aus");
}
}
fhem ("set EG_Eingang_Bewegungsmelder off");
}

einwandfrei funktioniert.

Danke und Grüße
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Joachim am 08 Januar 2013, 11:52:04
Moin Puschel74,

habe zwar auch keine Ahnung von Perl,

aber Du rennst in die Falle der If-Schleife.

EG_WZ_Bewegungsmelder:Ein.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  if (Value("WZ_Deckenlicht") eq "Aus" || Value("WZ_Fernsehlicht") eq "Aus") { beginn der If-Abfrage
    if ($now >= "21:00" && $now <= "11:30") {
      if($now >= "00:00" && $now < "05:00") {
          fhem ("set WZ_Deckenlicht dim25%%");
      }
      if($now >= "05:00" && $now < "11:30") {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if($now >= "21:00" && $now <= "22:00") {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if($now >= "22:00" && $now <= "23:59") {
        fhem ("set WZ_Deckenlicht dim25%%");
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
    }   
  } Ende der If-Abfrage
  fhem ("set EG_WZ_Bewegungsmelder off") nächste Zeile die abgearbeitet wird
}

Gruß Joachim
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Puschel74 am 08 Januar 2013, 11:56:35
Hallo,

danke schonmal für die Antwort.

Das ich in dieser Falle hänge ist mir klar ;-)

Was ich nicht ganz verstehe ist, warum nicht IN dieses If verzweigt wird da doch
WZ_Deckenlicht UND auch WZ_Fernsehlicht AUS sind.
Nach meinem Verständnis sollte in das if verzweigt werden sobald EINER der beiden Aus ist.
Und es sind definitv beide Aus und nicht off oder toggle.

Somit sollte doch eigentlich die Prüfung nach der Uhrzeit erfolgen (diese habe ich
bereits erweitert auf 12:30).
Der letzte Zeile dient nur dazu den Bewegungsmelder wieder "scharf" zu schalten in fhem.

Grüße
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Joachim am 08 Januar 2013, 12:39:56
Versuchs mal mit mehr Klammern

  if (($now >= "21:00") && ($now <= "11:30")) {
nicht getestet, aber wenn ich es richtig verstanden habe, dann gibt and (&&) einen Wahrheitswert zurück, wenn links und rechts vom && wahr ist. Ich habe die Prioritäten im Moment auch nicht im Kopf.

diese oder-Verknüpfung rennt in Meinem Perl-Modul wunderbar
if((($t0 eq "00") || ($t0 eq "06") || ($t0 eq "12") || ($t0 eq "18")) && ($t0 ne $t2)){

Gruß Joachim
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Puschel74 am 08 Januar 2013, 12:55:23
Hallo,

danke mal für den Tipp aber ...

EG_WZ_Bewegungsmelder:Ein.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  if (Value("WZ_Deckenlicht") eq "Aus") {
    if (($now >= "21:00") && ($now <= "20:30")) {
      if(($now >= "00:00") && ($now < "05:00")) {
          fhem ("set WZ_Deckenlicht dim25%%");
      }
      if(($now >= "05:00") && ($now < "20:30")) {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if(($now >= "21:00") && ($now <= "22:00")) {
        fhem ("set WZ_Deckenlicht dim50%%");
      }
      if(($now >= "22:00") && ($now <= "23:59")) {
        fhem ("set WZ_Deckenlicht dim25%%");
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
    }
  }
  fhem ("set EG_WZ_Bewegungsmelder off")
}

liefert mir im Logfile nur
2013.01.08 12:47:30 2: FS20 EG_WZ_Bewegungsmelder on
2013.01.08 12:47:30 2: FS20 set EG_WZ_Bewegungsmelder off

Ich lass jetzt auch WZ_Deckenlicht auf off prüfen aber auch nüscht.
Ich habe eigentlich gedacht das dann das Deckenlicht auf 50% gedimmt wird.

Wo hingegen dieser Teil

EG_Eingang_Bewegungsmelder:on.* {
my $now=sprintf("%%02d:%%02d",$hour,$min);
my $fhttk_eing_tuer = ReadingsVal("EG_Eingangstuer", "Window", "nA");
if ( $fhttk_eing_tuer eq "Closed" ) {
if ($now >= "15:00" or $now < "09:00") {
fhem ("set EG_Eingang_Licht_innen on-for-timer 30; set EG_Vorraum_Licht on-for-timer 48; set EG_Eingang_Bewegungsmelder Aus");
}
}
fhem ("set EG_Eingang_Bewegungsmelder off");
}


wunderbar funktioniert.

Grüße
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Joachim am 08 Januar 2013, 13:27:15
geht er denn überhaupt durch die If-Abfragen?

--> Pflaster die Abfrage mal mit LOG (stammt von Dir) und bau mal ein else mit ein.

EG_WZ_Bewegungsmelder:Ein.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  if ($now >= "21:00" && $now <= "11:30") {
    logeintrag
    } else{
      logeintrag    
      if($now >= "00:00" && $now < "05:00") {
        fhem ("set WZ_Deckenlicht dim25%%");
        logeintrag
      } else{
        logeintrag
      }      
      if($now >= "05:00" && $now < "11:30") {
        fhem ("set WZ_Deckenlicht dim50%%");
logeintrag
      } else{
 logeintrag
}
      if($now >= "21:00" && $now <= "22:00") {
        fhem ("set WZ_Deckenlicht dim50%%");
logeintrag
      } else{
 logeintrag
}
      if($now >= "22:00" && $now <= "23:59") {
        fhem ("set WZ_Deckenlicht dim25%%");
logeintrag
} else{
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
    }
  fhem ("set EG_WZ_Bewegungsmelder off")
}


Gruß Joachim
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Puschel74 am 08 Januar 2013, 13:59:44
Hallo,

ja das mit dem Log ist nicht verkehrt :-)
Aber das ...
EG_WZ_Bewegungsmelder:on.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  if (Value("WZ_Deckenlicht") eq "off") {
    if (($now >= "21:00") && ($now <= "20:30")) {
      if(($now >= "00:00") && ($now < "05:00")) {
          fhem ("set WZ_Deckenlicht dim25%%");
          Log (3,"absatz1");  
      }
      if(($now >= "05:00") && ($now < "20:30")) {
        fhem ("set WZ_Deckenlicht dim50%%");
Log (3,"absatz2");
      }
      if(($now >= "21:00") && ($now <= "22:00")) {
        fhem ("set WZ_Deckenlicht dim50%%");
Log (3,"absatz3");
      }
      if(($now >= "22:00") && ($now <= "23:59")) {
        fhem ("set WZ_Deckenlicht dim25%%");
Log (3,"absatz4");
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
Log (3,"Durchs if durch");
    }
  }
  fhem ("set EG_WZ_Bewegungsmelder off");
  Log (3,"und der schluss");
}

liefert mir im Log das

2013.01.08 13:55:19 2: FS20 set EG_WZ_Bewegungsmelder on
2013.01.08 13:55:19 2: FS20 set EG_WZ_Bewegungsmelder off
2013.01.08 13:55:19 3: und der schluss
2013.01.08 13:55:20 2: FS20 EG_WZ_Bewegungsmelder off

also wird doch garnicht geprüft ob das Deckenlicht aus ist??

Grüße
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Joachim am 08 Januar 2013, 14:17:02
Deshalb der else-Block, damit man sieht, wie er die Schleifen durchlauft.
Eventuell sogar mit den Werten, die abgefragt werden, denn Computer haben eine andere Logic wie Menschen.
Nicht umsonst heißt EDV auch Ende der Vernunft

Gruß Joachim
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Joachim am 08 Januar 2013, 14:22:23
Läuft das eigentlich in einem Modul (z.B. Myutils) oder steht dass in der fhem.cfg?
Paralel lese ich Den anderen Tread von Dir
 Aw: Projekt Abwesenheit Erkennung (Ping) + Heizung Steuerung

und da sind ja doppelte ;; und Zeilenschutz drin \

define Heizung_AutoEco notify Anwesenheit.*:.* { \
if (Value("Anwesenheit_Chris") eq "on") { \
fhem ("set Heizung auto") if (Value("Heizung") eq "off");; \
Log (3,"Setze Heizung Auto");; \
} \
else { \
fhem ("set Heizung eco") if (Value("Heizung") eq "on");; \
Log (3,"Setze Heizung Eco");;\
}\
Log (3,"Ich mach nix warum auch immer);;\
}

nicht dass das dadurch hängt.

Gruß Joachim
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Puschel74 am 08 Januar 2013, 15:15:17
Hallo,

der Code steht in der fhem.cfg aber ich editiere immer über das DEF vom notify.
Da braucht es nichts zu schützen, aber in der fhem.cfg steht der Code geschützt - das übernimmt fhem beim speichern sonst würde es ja nur noch Fehlermeldungen hageln *g*

Ich hab grad gesehen das ich in einem anderen Codeschnipsel bei mir

if(sunrise_abs(7200) gt $now or $now gt sunset_abs(-3600) or ( $fhttk_bad_tuer eq "Closed" and $fhttk_sz_tuer eq "Closed" ) ) {
  if($now >= "00:00" && $now < "06:45") {


abfrage und das klappt auch wunderbar.

Ich muss mein Problem im Wohnzimmer aber mal von ganz klien angehen und langsam erweitern.
Ich hab jetzt die Prüfung auf das Deckenlicht rausgenommen, aber der if-Zweig wird immer noch nicht durchlaufen.
Ich werd mal die else einbauen und nochmal testen aber erstmal nur ob das Licht überhaupt an geht wenn der BM auslöst *g*

Danke schonmal bis hier für die Hilfe.
Ich meld mich wieder

Grüße
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Puschel74 am 08 Januar 2013, 17:19:52
So,

von klein aufgedröselt und den Fehler erkannt.
Tja, nur so lernt man ;-)

Das ist richtig:

EG_WZ_Bewegungsmelder:on.* {
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  if ((Value("WZ_Deckenlicht") eq "Aus") || (Value("WZ_Fernsehlicht") eq "Aus")) {
    if($now gt "00:00" && $now lt "05:00") {
      fhem ("set WZ_Deckenlicht dim25%%");
      Log (3,"absatz1");  
      }
      if($now gt "05:00" && $now lt "17:30") {
        fhem ("set WZ_Deckenlicht dim50%%");
Log (3,"absatz2");
      }
      if($now gt "17:30" && $now lt "22:00") {
        fhem ("set WZ_Deckenlicht dim50%%");
Log (3,"absatz3");
      }
      if($now gt "22:00" && $now lt "23:59") {
        fhem ("set WZ_Deckenlicht dim25%%");
Log (3,"absatz4");
      }
    fhem ("delete wieder_aus") if (Value("wieder_aus") ne "");
    fhem ("define wieder_aus at +00:00:40 set WZ_Deckenlicht off;; set EG_WZ_Bewegungsmelder off");
Log (3,"Durchs if durch");
    }
  fhem ("set EG_WZ_Bewegungsmelder off");
  Log (3,"und der schluss");
}

dann funktioniert es auch mit dem Licht.

Danke nochmal für die Hilfe.

Grüße

P.S.: Die Werte bleiben nicht so - das war nur zum probieren
Titel: Aw: Oder-Abfrage trifft nicht zu
Beitrag von: Joachim am 08 Januar 2013, 18:31:51
Dann haben wir beide wieder etwas gelernt.

Gruß Joachim