mehrere Aktionen ausführen bei IF Bedingung

Begonnen von casy_, 21 Juni 2013, 18:55:07

Vorheriges Thema - Nächstes Thema

casy_

Hallo,

ich habe aufgegeben.

ich bin dabei mich in IF Bedingungen und dementsprechend auch in Perl einzuarbeiten.
Aber ich bekomme es nicht hin, innerhalb einer IF-Bedingung zwei Aktionen auszuführen.

ich habe programmiert:
define Anwesend_leaving_home notify Anwesend.*off.* \
  { if(Value("draussen") eq "hell") \
      { fhem("set Haus_Rollos pct 19;;set Haus_Lichter off;;set anwesend nein") \
      } \
  }


jeder der Befehle "set Haus_Rollos pct 19", "set Haus_lichter off" und "set anwesend nein" funktioniert für sich alleine.

aber in der Kombination funktionieren nur zwei. Im Augenblick die beiden letzten, egal wie ich die Befehle umstelle. Vorhin eine zeitlang der mittlere Befehl nicht. Dazwischen habe ich die gleiche Formel in FHEM direkt der Aktion zugeordnet, statt über edit file.

Kann mir hier jemand einen Tipp geben?

Im Log erhalte ich derzeit:

2013.06.21 18:45:56 2: CUL_HM set WZ_Deckenleuchte off rxt:1
2013.06.21 18:45:56 3: Anwesend_leaving_home return value: Unknown command {, try help
2013.06.21 18:45:56 2: CUL_HM set Anwesend off rxt:1

Bei Haus_Lichter und Haus_Rollos handelt es sich um structures.
Haus_Lichter greift derzeit auf EG_Lichter, EG_Lichter wiederum auf WZ_Lichter und WZ_Lichter dann schlussendlich auf WZ_Deckenleuchte


Puschel74

Hallo,

vom kleinen zum großen (lies erstmal unten weiter ;-) ):

Eingang_aussen:temperature.* {
  my $temp_aussen = ReadingsVal("Eingang_aussen", "temperature", 99);
  my $now=sprintf("%%02d:%%02d",$hour,$min);
  my $light = ReadingsVal("myTwilight", "light", 99);
  my $rollo_status = Value("OG_Zimmer_Rollo");
  my $SommerWinter_Status = Value("SommerWinter");
  my $Migraene_Status = Value("Migraene_Check");
  my $Zimmer_Temp = ReadingsVal("OG_Zimmer_Heizung","measured-temp",99);
  if ($Migraene_Status eq "Nein") {
    if ($SommerWinter_Status eq "Sommer") {
      if (($now gt "08:05") && ($now lt "20:00")) {
        if ($temp_aussen > 25 && $rollo_status eq "Auf") {
          fhem("set OG_Zimmer_Rollo on-for-timer 3");
     fhem("setstate OG_Zimmer_Rollo Ab25");
        }
if ($temp_aussen < 24 && $rollo_status eq "Ab25") {
          fhem("set OG_Zimmer_Rollo off-for-timer 3");
     fhem("setstate OG_Zimmer_Rollo Auf");
        }
   if ($temp_aussen > 27 && $rollo_status eq "Ab25") {
     fhem("set OG_Zimmer_Rollo on-for-timer 2");
          fhem("setstate OG_Zimmer_Rollo Ab50");
   }
   if ($temp_aussen < 26 && $rollo_status eq "Ab50") {
     fhem("set OG_Zimmer_Rollo off-for-timer 3");
          fhem("setstate OG_Zimmer_Rollo Ab25");
   }
if ($temp_aussen > 29 && $rollo_status eq "Ab50") {
     fhem("set OG_Zimmer_Rollo on-for-timer 3");
     fhem("setstate OG_Zimmer_Rollo Ab75");
   }
if ($temp_aussen < 28 && $rollo_status eq "Ab75") {
     fhem("set OG_Zimmer_Rollo off-for-timer 3");
     fhem("setstate OG_Zimmer_Rollo Ab50");
   }
   if ($temp_aussen > 31 && $rollo_status eq "Ab75") {
     fhem("set OG_Zimmer_Rollo on-for-timer 2");
     fhem("setstate OG_Zimmer_Rollo Ab");
   }
if ($temp_aussen < 30 && $rollo_status eq "Ab") {
     fhem("set OG_Zimmer_Rollo off-for-timer 2");
     fhem("setstate OG_Zimmer_Rollo Ab75");
   }
   if (($temp_aussen < $Zimmer_Temp) && ($rollo_status ne "Auf")) {
     fhem("set OG_Zimmer_Rollo off");
   }
      }
      if (($now gt "20:30") && ($now lt "21:45")) {
        if (($temp_aussen < $Zimmer_Temp) && ($rollo_status eq "Ab") && ($temp_aussen > 10)) {
          fhem("set OG_Zimmer_Rollo off-for-timer 9");
          fhem("setstate OG_Zimmer_Rollo Ab50");
        }
      }
    }
  }
}


Auch wenn mein Code nicht deine Frage betrifft oder, schlimmer noch, mehr Fragen aufwirft.
Ich hab diesen Code auch ganz langsam "erarbeitet".
Bau dir
Log 3,("Das ist ein Logeintrag und sagt dir wo du im Code stehst");
ein (den Text natürlich anpassen).
Den Eintrag kannst du auch erweitern auf ein
my $hell=Value("draussen");
Log 3,("Wert von draussen ".$hell);

Dann siehst du ob du das richtige abfrägst.
Und dann Schritt für Schritt.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Zrrronggg!

Dein Code erscheint mir an sich korrekt.

Der dürfte eigentlich keine Fehlermeldung der Art
Unknown command {, try help
abwerfen.

Ich vermute daher irgendeine Seltsamigkeit mit den Zeilenumbrüchen oder verstecken Zeichen oder sowas.


Schreib doch mal diese Variante in deine fhem.cfg (also als Einzeiler:

define Anwesend_leaving_home notify Anwesend.*off.*  { if (Value("draussen") eq "hell")  { fhem("set Haus_Rollos pct 19 ;; set Haus_Lichter off ;; set anwesend nein")  }  }



Und versuche es nochmal.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

casy_

Zitat von: Puschel74 schrieb am Fr, 21 Juni 2013 19:14Dann siehst du ob du das richtige abfrägst.
Und dann Schritt für Schritt.

Grüße

Danke für dieses if-Konstrukt. Sowas habe ich mal gesucht um mir Verschachtelungen näher anzusehen.

Allerdings hilft mir das bei dem konkreten Problem nicht.



Zitat von: Zrrronggg! schrieb am Fr, 21 Juni 2013 19:35Schreib doch mal diese Variante in deine fhem.cfg (also als Einzeiler:

define Anwesend_leaving_home notify Anwesend.*off.*  { if (Value("draussen") eq "hell")  { fhem("set Haus_Rollos pct 19 ;; set Haus_Lichter off ;; set anwesend nein")  }  }



Und versuche es nochmal.

das habe ich... und? nun, es funktioniert. alle drei Aktionen werden ausgeführt. Bleibt nur: warum? ich hab gedacht, wegen der Übersichtlichkeit mache ich das mit den \ aber das scheint irgendwie nicht zu funktionieren.

danke für die Hilfe.


Puschel74

Hallo,

ZitatBleibt nur: warum?

Weil

if (Value("draussen") eq "hell")

true liefert - oder was hast du erwartet?

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

casy_

Zitat von: Puschel74 schrieb am Fr, 21 Juni 2013 23:16Hallo,

ZitatBleibt nur: warum?

Weil

if (Value("draussen") eq "hell")

true liefert - oder was hast du erwartet?

Grüße


Entschuldigung, ich habe mich vielleicht nicht klar ausgedrückt...
warum die drei Aktionen ausgeführt werden, ist logisch - das habe ich ja auch erwartet, genauso wie logischerweise das ich ein true erhalte.

Die Frage war eher, warum

define Anwesend_leaving_home notify Anwesend.*off.*  { if (Value("draussen") eq "hell")  { fhem("set Haus_Rollos pct 19 ;; set Haus_Lichter off ;; set anwesend nein")  }  }

funktioniert, hingegen mein

define Anwesend_leaving_home notify Anwesend.*off.* \
  { if(Value("draussen") eq "hell") \
      { fhem("set Haus_Rollos pct 19;;set Haus_Lichter off;;set anwesend nein") \
      } \
  }


nur zwei Aktionen und eine Fehlermeldung (siehe oben) auswirft...

aber das wird wohl ein geheimnis bleiben....

Danke nochmal

Gruß
Carsten

oniT

Hallo Carsten,

Zitatdefine Anwesend_leaving_home notify Anwesend.*off.*  { if (Value("draussen") eq "hell")  { fhem("set Haus_Rollos pct 19 ;; set Haus_Lichter off ;; set anwesend nein")  }  }

funktioniert, hingegen mein

define Anwesend_leaving_home notify Anwesend.*off.* \
  { if(Value("draussen") eq "hell") \
      { fhem("set Haus_Rollos pct 19;;set Haus_Lichter off;;set anwesend nein") \
      } \
  }


nur zwei Aktionen und eine Fehlermeldung (siehe oben) auswirft...

aber das wird wohl ein geheimnis bleiben....

Danke nochmal

Gruß
Carsten

ich weiß nicht ob es daran liegt, mach mal noch zwei Semikolon hinter die Klammer. Würde mich interessieren ob es dann geht. Zumindest habe ich diese immer an der Stelle.

define Anwesend_leaving_home notify Anwesend.*off.* \
 { if(Value("draussen") eq "hell");;\
 { fhem("set Haus_Rollos pct 19;;set Haus_Lichter off;;set anwesend nein");;\
 } \
 }



Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

MisterEltako

Hallo!

Das ist ein Problem mit dem "\" und nachfolgendem "{"! Wenn es als "{\" die Zeile trennt, wird es korrekt ausgeführt. Wogegen "\" und Fortführung in der nächsten Zeile mit "{" nicht funktioniert.

statt so:
define Anwesend_leaving_home notify Anwesend.*off.*[color=red] \
  { [/color]if(Value("draussen") eq "hell")[color=orangered] \
      { [/color]fhem("set Haus_Rollos pct 19;;set Haus_Lichter off;;set anwesend nein") \
      } \
  }




muss es dann so lauten:
define Anwesend_leaving_home notify Anwesend.*off.* [color=limegreen]{\[/color]
  if(Value("draussen") eq "hell") [color=limegreen]{\[/color]
                                  fhem("set Haus_Rollos pct 19;;set Haus_Lichter off;;set anwesend nein")\
                                  }\
}


MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Markus

@MisterEltako
Danke für den Hinweis jetzt wird mir so manche schlaflose Nacht Klar...
Aber warum ist es nicht egal wo ich die Zeile umbreche?

Gruß Markus
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

Zrrronggg!

Zitatich weiß nicht ob es daran liegt, mach mal noch zwei Semikolon hinter die Klammer. Würde mich interessieren ob es dann geht. Zumindest habe ich diese immer an der Stelle.

Das ist Cargo Cult (mit anderen Worten: Das muss man nicht machen, das hat sich hier so eingebürgert, weil manche Leute Beispiele quasi falsch zitieren)

ZitatDanke für den Hinweis jetzt wird mir so manche schlaflose Nacht Klar...
Aber warum ist es nicht egal wo ich die Zeile umbreche?

Manchmal fragen mich Leute ja, warum ich eine Einzeiler Fan bin.... Ihr habt gerade einen Grund entdeckt       ;-)
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL