FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Otto am 31 Mai 2016, 11:07:22

Titel: wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: Otto am 31 Mai 2016, 11:07:22
Hallo,

ich bekomme mein DoIF nicht hin:


define di_Rollo_AZ DOIF ([Wetter:temperature]>5 and [Bewegungsmelder1:brightness]>[([du_Helligkeit_hell]+20)] and [([du_Rollo_Zeit_hoch]+[00:15]) - ([du_Rollo_spaetestens_hoch]-[00:05])]\
or [[du_Rollo_spaetestens_hoch]] or [([du_Rollo_Zeit_hoch]+[01:35])|7]) (set Rollo_AZ:FILTER=level!=100 on)\
DOELSEIF\
([Bewegungsmelder1:brightness]<[du_Helligkeit_hell] and [[du_Rollo_Zeit_runter] - ([du_Rollo_spaetestens_runter] - [00:05])] and [EG_Wz_TerrasseTuer] eq "geschlossen") (set Rollo_AZ:FILTER=level!=0 off) \
DOELSEIF\
([du_Rollo_spaetestens_runter] and [EG_Wz_TerrasseTuer] eq "geschlossen") (set Rollo_AZ:FILTER=level!=0 off)


Es wohl ein Klammerfehler bei der letzten DOELSEIF, der letzte Timer_7 (du_Rollo_spaetestens_runter) wird nicht gesetzt.

siehe
Zitat2016-05-31 10:29:37   state           cmd_1
     2016-05-31 10:29:16   timer_1_c1      01.06.2016 00:02:10
     2016-05-31 10:30:00   timer_2_c1      01.06.2016 07:15:00
     2016-05-31 10:30:00   timer_3_c1      01.06.2016 10:30:00
     2016-05-31 10:35:00   timer_4_c1      01.06.2016 10:35:00
     2016-05-31 10:29:16   timer_5_c1      01.06.2016 08:35:00|7
     2016-05-31 10:29:16   timer_6_c2      31.05.2016 16:00:00
     2016-05-31 10:29:16   timer_7_c2      31.05.2016 22:30:00


Wer kann mir helfen und wie prüfe ich die einzelnen Klammern?
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: CoolTux am 31 Mai 2016, 12:01:46
Die geöffneten hochzählen und die geschlossenen runter. Am Ende muss 0 stehen. Deine Bedingung in ein Editor mit Syntaxhighlighting laden.
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: igami am 31 Mai 2016, 12:02:22
Benutzt du den JavaScript Editor? Der markiert zugehörige Klammern.
Ansonsten helfen Zeilenumbrüche und Einrückungen.
So würde ich es schreiben

define di_Rollo_AZ DOIF
([Wetter:temperature] > 5 and
[Bewegungsmelder1:brightness] > [([du_Helligkeit_hell] + 20)] and
[([du_Rollo_Zeit_hoch]+[00:15]) - ([du_Rollo_spaetestens_hoch]-[00:05])]
or
[[du_Rollo_spaetestens_hoch]] or
[([du_Rollo_Zeit_hoch]+[01:35])|7]
)(
  set Rollo_AZ:FILTER=level!=100 on
)
DOELSEIF
([Bewegungsmelder1:brightness]<[du_Helligkeit_hell] and
[[du_Rollo_Zeit_runter] - ([du_Rollo_spaetestens_runter] - [00:05])] and
[EG_Wz_TerrasseTuer] eq "geschlossen"
)(
  set Rollo_AZ:FILTER=level!=0 off
)
DOELSEIF
([du_Rollo_spaetestens_runter] and
[EG_Wz_TerrasseTuer] eq "geschlossen"
)(
  set Rollo_AZ:FILTER=level!=0 off
)


Ich bin mir nicht sicher, dass das

[([du_Helligkeit_hell] + 20)]

so funktioniert.

Grüße
igami
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: Otto am 31 Mai 2016, 12:08:01
ZitatBenutzt du den JavaScript Editor
Ja für kleine DEF.

Sonst nehme ich notepad++

Was mir noch nicht ganz klar ist: Wann nehme ich runde Klammern? Das ein Zustand in eckige kommt ist klar.
Ich denke das ist mein Problem.
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: igami am 31 Mai 2016, 13:09:37
Zitat von: Otto am 31 Mai 2016, 12:08:01
Wann nehme ich runde Klammern?

define <name> DOIF (<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)

Bei and und or wird and zuerst ausgewertet (wie Punkt vor Strich bei Mathe)
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: CoolTux am 31 Mai 2016, 13:16:26
Und genau wie in der Mathematik kann man das Bevorzugen auch erzwingen. Hierfür nimmt man dann zusätzlich Runde Klammern
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: Damian am 31 Mai 2016, 20:33:07
Mit runden Klammern werden bei Zeitangaben oder Zeitintervallen Zeitberechnung initiiert:

Die Angabe:

[([du_Helligkeit_hell] + 20)]


oder

[[du_Rollo_Zeit_runter] - ([du_Rollo_spaetestens_runter] - [00:05])]

sollte kein Problem sein.

Immer aktuelle DOIF-Version verwenden.

Gruß

Damian

Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: igami am 31 Mai 2016, 20:55:47
Zitat von: Damian am 31 Mai 2016, 20:33:07
sollte kein Problem sein.
Wenn ich das richtig gesehen habe wird

[([du_Helligkeit_hell] + 20)]

aber nicht als Zeitangabe sondern Vergleich verwendet.
Da müstte es doch

{([du_Helligkeit_hell] + 20)}

sein, oder?
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: Damian am 31 Mai 2016, 23:12:32
Zitat von: igami am 31 Mai 2016, 20:55:47
Wenn ich das richtig gesehen habe wird

[([du_Helligkeit_hell] + 20)]

aber nicht als Zeitangabe sondern Vergleich verwendet.
Da müstte es doch

{([du_Helligkeit_hell] + 20)}

sein, oder?

OK. Für Zeitvergleiche ist es nicht gedacht, sondern für Timer, die auch gesetzt werden. Für Zeitvergleich wird es nicht funktionieren, auch nicht mit geschweiften Klammern. Da kann man besser mit nicht triggernden Zeitintervallen arbeiten.

Gruß

Damian
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: Otto am 31 Mai 2016, 23:23:29
Ist nutze es an der Stelle nicht als Zeitvergleich, sondern als Wertevergleich:

[Bewegungsmelder1:brightness]>130
habe ich als dummy du_Helligkeit_hell mit state 110, ergibt dann
[Bewegungsmelder1:brightness]>[([du_Helligkeit_hell]+20)]

geht das? Habe es noch nicht getestet :)
Titel: Antw:wie mache ich eine Klammerprüfung bei vielen Bedingungen
Beitrag von: Damian am 01 Juni 2016, 07:30:51
Zitat von: Otto am 31 Mai 2016, 23:23:29
Ist nutze es an der Stelle nicht als Zeitvergleich, sondern als Wertevergleich:

[Bewegungsmelder1:brightness]>130
habe ich als dummy du_Helligkeit_hell mit state 110, ergibt dann
[Bewegungsmelder1:brightness]>[([du_Helligkeit_hell]+20)]

geht das? Habe es noch nicht getestet :)

Dann musst du angeben:

[Bewegungsmelder1:brightness] > ([du_Helligkeit_hell]+20)