Hauptmenü

DOIF - mehrere "or" Bedingungen?

Begonnen von neyzen, 21 September 2020, 21:27:41

Vorheriges Thema - Nächstes Thema

neyzen

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?

Otto123

#1
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Das deckt dann auch den Fall ab: willi == 720 - den hättest Du bei willi < 720 DOELSEIF willi > 720 ausgespart ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

xenos1984

Das klingt für mich nach DOIF mit 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.

neyzen

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)