Hauptmenü

Probleme mit IF / ELSE

Begonnen von okay2000, 29 Oktober 2014, 20:52:00

Vorheriges Thema - Nächstes Thema

okay2000

Hallo zusammen,

ich möchte beim Ausschalten meiner Dreambox (DM500sz ) eine Lampe (FS20_Taste6) für 60 Sekunden angehen lassen. Folgende Zeilen habe ich programmiert (Auszug):

define DM500sz ENIGMA2 192.168.0.22 8022 60 root password

define FS20_Taste6 FS20 1f00 35

define n_DM500sz_Aus notify DM500sz IF ((ReadingsVal("DM500sz","power","") eq "off")) (set FS20_Taste6 on-for-timer 60) ELSE (set FS20_Taste6 off)


Nach dem Ausschalten der Dreambox erscheinen folgende Meldungen im Log:

2014.10.29 19:01:00 2: ENIGMA2 set DM500wz off
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:00 3: FS20 set FS20_Taste6 on-for-timer 10
2014.10.29 19:01:02 2: CUL: unknown message LOVF
2014.10.29 19:01:02 2: CUL: unknown message LOVF
2014.10.29 19:01:03 2: CUL: unknown message LOVF
2014.10


Warum wird der Befehl set FS20_Taste6 on-for-timer 60 so oft gesendet? Was stimmt mit meiner notify-Zeile nicht?

Gruß, Olaf

okay2000

Hab noch mal ein anderes Beispiel gefunden und meine Zeile etwas angepasst. So scheint es zu funktionieren:

define n_DM500sz_Aus notify DM500sz:power.* IF ((ReadingsVal("DM500sz","power","") eq "off")) (set FS20_Taste6 on-for-timer 10) ELSE (set FS20_Taste6 off)

So richtig habe ich den notify-Befehl noch nicht verstanden. Warum führte mein erster Befehl zu einer "Schleife"?  :-\ So richtig sauber sieht die Befehlszeile nicht aus!?

Und warum klappt folgendes nicht?

define n_DM500sz notify DM500sz:power.* { if($EVENT eq "on") { fhem("set FS20_Taste6 on");} else {fhem("set FS20_Taste6 off");} }


Im Log steht dann:

n_DM500sz_Aus return value: syntax error at (eval 39536) line 1, near "power:"

Wäre schön, wenn mir das einer mal erklären könnte. Dann wär ich ein ganzes Stück weiter  ::)

Puschel74

#2
Moin,

Beitrag1:
Die Meldungen aus dem Logfile passen nicht zum gezeigten Code.
In der Logfilemeldung heisst es on-for-timer 10 im Code steht aber on-for-timer 60 -- passt nicht.
Edith: Und die häufige Ausführung rührt vermutlich daher das das Device mehr als ein Event sendet und bei JEDER Prüfung der Ausdruck wahr ist und daher der vorderer Teil ausgeführt wird.
Lösung: Das regexp entsprechend anpassen das nur auf EIN Event (das gewünschte) getriggert wird.
Hilfe dazu bietet der EventMonitor.

Beitrag 2:
Die Fehlermeldung bezieht sich auf keinen der beiden gezeigten Codes.
In der Fehlermeldung lautet es power: - das ist aber in keinem der beiden abgefragt und der zweite Schnipsel heisst noch nichtmal so wie in der Fehlermeldung angegeben.

Gesamt kann man sagen - viel zu viele Klammern und Fehlermeldungen die zu keinem Code passen.
Wenn du hier Hilfe willst dann lass uns nicht raten sondern poste die zugehörigen Code- und Fehlerzeilen.
Der EventMonitor kann dir noch helfen und im Einsteiger.pdf ist es auch recht gut erklärt nur nicht mit IF sondern mit if aber dazu wirst du in der commandref fündig.

IF wäre eigentlich eine Frage für Automatisierung und nicht hier.

Grüße

Edith: Hier mal ein versuch:
define n_DM500sz_Aus notify DM500sz:power.* {
  if(Value("DM500sz") eq "off") {
    fhem("set FS20_Taste6 on-for-timer 60");
  }
  else {
    fhem("set FS20_Taste6 off");
  }
}

OHNE IF sondern mit if/else.
Meine Codes gehören NICHT direkt in die fhem.cfg es sei den du willst Fehlermeldungen sehen  8)
Aber auch so gilt - Fehlermeldungen bitte dem richtigen Code zuordnen (das ist deine Aufgabe) und dann hier posten.
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.

Brockmann

Zitat von: okay2000 am 29 Oktober 2014, 21:19:03
Und warum klappt folgendes nicht?

define n_DM500sz notify DM500sz:power.* { if($EVENT eq "on") { fhem("set FS20_Taste6 on");} else {fhem("set FS20_Taste6 off");} }

Weil $EVENT das gesamte Event enthält, Du aber nur den letzten Teil davon vergleichen willst. Also $EVENT ist sowas wie "DM500sz power: on".
An die einzelnen Teile eines Events kommst Du mit $EVTPART0, $EVTPART1, $EVTPART2 usw. In Deinem Fall dürfte das "on" $EVTPART2 sein, aber besser selbst probieren.

Zitat von: Command-Ref
In der Anweisung von Notify kann das auslösende Ereignis (Event) genutzt werden:
Die Anweisung $EVENT wird das komplette Ereignis (Event) beinhalten, z.B. measured-temp: 21.7 (Celsius)
$EVTPART0,$EVTPART1,$EVTPART2,etc enthalten die durch Leerzeichen getrennten Teile des Events der Reihe nach (im Beispiel also $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)".
Diese Daten sind verfügbar als lokale Variablen in Perl, als Umgebungs-Variablen für Shell-Scripts, und werden als Text ausgetauscht in FHEM-Kommandos.
$NAME enthält den Namen des Ereignis auslösenden Gerätes, z.B. myFht

okay2000

Hallo,

vielen Dank für die prima Hilfestellungen!

@Puschel74: Ich habe die Log-Meldungen nachträglich rauskopiert. Scheinbar die falschen, sorry  :-\ Ich hatte den Timer von 10 auf 60 Sekunden geändert ...
Jetzt ist mir das aber etwas klarer geworden: Das Device sendet mehrere Events und jedesmal schlägt meine if-Prüfung zu! Danke für den Hinweis.

Im Einsteiger-PDF hab ich nicht gesehen, dass zwischen if und IF ein Unterschied besteht. Wärend meiner Tests habe ich festgestellt, dass verschiedene Fehlermeldungen kommen. Hab mich schon gewundert. Aber ich werde mich in der Commandref mal schlau lesen. Leider kann man so schlecht nach "Unterschied if IF" googeln  ::)   Wenn Du da einen guten Link hast ....

@Brockmann: Danke für den Tip. In der Richtung muss ich mal ein bischen experimentieren! Man muss es nur erstmal verstanden haben, dann gibt es so viele tolle Möglichkeiten!

Puschel74

Hallo,

ich hab dir oben noch einen Code eineditiert - versuchs mal damit.

if / IF ist eigentlich recht einfach erklärt.
if = Perl
IF = FHEM - das findest du in der commandref
Wobei mein Beispiel if (Perl) verwendet, ich das aber an deiner Stelle evtl. mit DOIF versuchen würde (auch in der commandref und auch auf deutsch erklärt).

Mach doch einfach mal spasseshalber den EventMonitor auf und warte ein bischen.
Dort siehst du was FHEM "sieht".

Und mit den Meldungen im Logfile ist es nunmal so das wir hier besser helfen können wenn die richtige Meldung zum Code gepostet wird  ;)
Daher nicht zuviel probieren sondern schön step-by-step

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.