FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: neyzen am 21 September 2020, 21:27:41

Titel: DOIF - mehrere "or" Bedingungen?
Beitrag von: neyzen am 21 September 2020, 21:27:41
Hallo,
eigentlich sollte dass Einfach sein,aber ich weis echt nicht wo der Wurm steckt.

Ich Frage mit einem at die letzten Zeiten von meinen Sensoren aus und steckt die Zeit dann in ein userreading.
Das sieht so aus:

Internals:
   COMMAND    set ZigbeeCheck active
   DEF        +*06:00:00 set ZigbeeCheck active
   FUUID      5f41a0b2-f33f-2b39-16d4-ab57d7a708ac78b1
   NAME       ZigbeeCheck
   NR         197
   NTM        23:39:14
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 23:39:14
   TIMESPEC   06:00:00
   TRIGGERTIME 1600724354.98425
   TRIGGERTIME_FMT 2020-09-21 23:39:14
   TYPE       at
   READINGS:
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_KZ1 7
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_KZ2 30
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_Kueche 49
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_Schlafzimmer1 0
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_Schlafzimmer2 11
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_UG1 20
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_UG2 18
     2020-09-21 21:20:34   LetzteZeitFensterkontakt_WC 39
     2020-09-21 21:20:34   LetzteZeitVibrationPost 1595
     2020-09-21 21:20:34   state           Next: 23:39:14
Attributes:
   room       HUEDevice
   userReadings LetzteZeitFensterkontakt_KZ1 { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_KZ1", "reachable",0)))/60);;},
LetzteZeitFensterkontakt_KZ2 { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_KZ2", "reachable",0)))/60);; },
LetzteZeitFensterkontakt_Kueche { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_Kueche", "reachable",0)))/60);; },
LetzteZeitFensterkontakt_Schlafzimmer1 { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_Schlafzimmer1", "reachable",0)))/60);; },
LetzteZeitFensterkontakt_Schlafzimmer2 { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_Schlafzimmer2", "reachable",0)))/60);; },
LetzteZeitFensterkontakt_UG1 { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_UG1", "reachable",0)))/60);; },
LetzteZeitFensterkontakt_UG2 { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_UG2", "reachable",0)))/60);; },
LetzteZeitFensterkontakt_WC { int(int(time() - time_str2num(ReadingsTimestamp("Fensterkontakt_WC", "reachable",0)))/60);; },
LetzteZeitVibrationPost { int(int(time() - time_str2num(ReadingsTimestamp("VibrationPost", "reachable",0)))/60);; },


Das funktioniert gut.
Jetzt möchte ich das ein dummy "ZigbeeStatus" auf "on" geschaltet wird, wenn einer von den Sensoren die LetzteZeit größer als 720 hat. Das wäre hier der Sensor "LetzteZeitVibrationPost". Der hat den Wert zu diesem Zeitpunkt 1595.

Mein DOIF sieht so aus:

Internals:
   DEF        ([ZigbeeCheck:LetzteZeitFensterkontakt_KZ1] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_KZ2] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Kueche] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Schlafzimmer1] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Schlafzimmer2] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_UG1] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_UG2] < 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_WC] < 720 or [ZigbeeCheck:LetzteZeitVibrationPost] < 720) (set ZigbeeStatus off)
DOELSEIF ([ZigbeeCheck:LetzteZeitFensterkontakt_KZ1] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_KZ2] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Kueche] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Schlafzimmer1] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Schlafzimmer2] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_UG1] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_UG2] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_WC] > 720 or [ZigbeeCheck:LetzteZeitVibrationPost] > 720) (set ZigbeeStatus on)



   FUUID      5f4169e8-f33f-2b39-90ee-48c719810d9656b7
   MODEL      FHEM
   NAME       DOIF_ZigbeeCheck
   NOTIFYDEV  global,ZigbeeCheck
   NR         195
   NTFY_ORDER 50-DOIF_ZigbeeCheck
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22030 2020-05-25 14:10:16
   READINGS:
     2020-09-21 21:20:34   Device          ZigbeeCheck
     2020-09-21 21:20:34   cmd             1
     2020-09-21 21:20:34   cmd_event       ZigbeeCheck
     2020-09-21 21:20:34   cmd_nr          1
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_KZ1 7
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_KZ2 30
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_Kueche 49
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_Schlafzimmer1 0
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_Schlafzimmer2 11
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_UG1 20
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_UG2 18
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitFensterkontakt_WC 39
     2020-09-21 21:20:34   e_ZigbeeCheck_LetzteZeitVibrationPost 1595
     2020-09-21 21:20:25   mode            enabled
     2020-09-21 21:20:34   state           cmd_1


Hier sollte er eigentlich auf cmd2 springen. Tut sie aber nicht.
Wo mach ich was falsch?
Titel: Antw:DOIF - mehrere "or" Bedingungen?
Beitrag von: Otto123 am 21 September 2020, 21:34:45
Hi,

wenn einer kleiner ist als 720 ist das wahr, bei OR ist dann der ganze Ausdruck wahr. Deswegen cmd1 - das auch der zweite Ausdruck wahr wird interessiert DOIF nicht.
Für Deine Textaufgabe nimmst Du einfach nur den DOLESIF Zweig, lässt den ersten weg und machst nur DOELSE

Gruß Otto
Titel: Antw:DOIF - mehrere "or" Bedingungen?
Beitrag von: amenomade am 21 September 2020, 21:44:50
Das Gegenteil von A or B or C (mind. eine der Bedingungen ist wahr)
ist nicht not A or not B or not C (mind. eine der Bedingungen ist nicht wahr)
sondern not A and not B and not C(alle Bedingungen sind nicht wahr)

Deswegen die Empfehlung von Otto, einfach DOELSE (alle andere Fälle) zu benutzen
Titel: Antw:DOIF - mehrere "or" Bedingungen?
Beitrag von: Otto123 am 21 September 2020, 22:09:12
Das deckt dann auch den Fall ab: willi == 720 - den hättest Du bei willi < 720 DOELSEIF willi > 720 ausgespart ;)
Titel: Antw:DOIF - mehrere "or" Bedingungen?
Beitrag von: xenos1984 am 22 September 2020, 08:24:07
Das klingt für mich nach DOIF mit Aggregation (http://fhem.de/commandref_DE.html#DOIF_aggregation). Sowas in der Art:

([#max:"^ZigbeeCheck$":"^LetzteZeit"] > 720) (set ZigbeeStatus on) DOELSE (set ZigbeeStatus off)

Die RegEx für die Readings muss man ggf. anpassen, falls sie so zu allgemein ist.
Titel: Antw:DOIF - mehrere "or" Bedingungen?
Beitrag von: neyzen am 24 September 2020, 21:28:29
Hi,

so scheint es wohl zu funktionieren


([ZigbeeCheck:LetzteZeitFensterkontakt_KZ1] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_KZ2] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Kueche] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Schlafzimmer1] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_Schlafzimmer2] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_UG1] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_UG2] > 720 or [ZigbeeCheck:LetzteZeitFensterkontakt_WC] > 720 or [ZigbeeCheck:LetzteZeitVibrationPost] > 720) (set ZigbeeStatus on)
DOELSE (set ZigbeeStatus off)