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?
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
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
Das deckt dann auch den Fall ab: willi == 720 - den hättest Du bei willi < 720 DOELSEIF willi > 720 ausgespart ;)
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.
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)