Hallo,
mit DOIF tue ich mir immer noch schwer. Habe einen aqara Virbrationssensor und möchte ein DOIF auf mehrere Readings anwenden. Das zweite Bedingung möchte ich so definieren, dass sie ohne spezifischen Wert wahr wird.
Über den Event Monitor habe ich mir Unterstützung geholt. Was mir aber nicht klar, wie ich die Definition auf irgendeinen Wert des Readings durchführe. Stimmt das also mit dem .* in der Bedingung zum Reading ,, vibrationstrength" ?
Das hab ich als Beispiel in der commandref nicht gefunden oder überlesen
Internals:
DEF ([Vibrationssensor:vibration] == 1 or [Vibrationssensor:"^vibrationstrength:.*$"] and [07:00-20:00]) (set Sonos_Buero speak 25 de Die Post ist da Bitte Briefkasten leeren , set Sonos_Wohnzimmer speak 25 de Die Post ist da Bitte Briefkasten leeren , set Sonos_Kueche speak 25 de Die Post ist da Bitte Briefkasten leeren , set Sonos_Schlafzimmer speak 25 de Die Post ist da Bitte Briefkasten leeren)
FUUID 5fd133e7-f33f-45fc-f1e8-799bbc0fd719a40f
MODEL FHEM
NAME Post_Eingang
NOTIFYDEV Vibrationssensor,global
NR 489
NTFY_ORDER 50-Post_Eingang
STATE initialized
TYPE DOIF
VERSION 23466 2021-01-03 17:14:46
.attraggr:
.attrminint:
READINGS:
2021-01-24 12:49:41 cmd 0
2021-01-24 12:49:41 mode enabled
2021-01-24 12:49:41 state initialized
2021-01-24 12:49:41 timer_01_c01 25.01.2021 07:00:00
2021-01-24 12:49:41 timer_02_c01 24.01.2021 20:00:00
Regex:
accu:
cond:
Vibrationssensor:
0:
&STATE ^Vibrationssensor$
vibration ^Vibrationssensor$:^vibration:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Vibrationssensor','vibration') == 1 or ::EventDoIf('Vibrationssensor',$hash,'vibrationstrength:.?$',1) and ::DOIF_time($hash,0,1,$wday,$hms)
days:
do:
0:
0 set Sonos_Buero speak 25 de Die Post ist da Bitte Briefkasten leeren , set Sonos_Wohnzimmer speak 25 de Die Post ist da Bitte Briefkasten leeren , set Sonos_Kueche speak 25 de Die Post ist da Bitte Briefkasten leeren , set Sonos_Schlafzimmer speak 25 de Die Post ist da Bitte Briefkasten leeren
1:
helper:
DEVFILTER ^global$|^Vibrationssensor$
NOTIFYDEV global|Vibrationssensor
globalinit 1
last_timer 2
sleeptimer -1
triggerDev
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1611554400
1 1611514800
readings:
all Vibrationssensor:vibration
realtime:
0 07:00:00
1 20:00:00
time:
0 07:00:00
1 20:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
all Vibrationssensor
triggertime:
1611514800:
localtime 1611514800
hash:
1611554400:
localtime 1611554400
hash:
uiState:
uiTable:
Attributes:
do always
Wenn das DOIF passt soll natürlich nur eine Nachricht ausgegeben werden wenn sich das Reading ändert. Im Device habe ich dazu noch ein event-on-change-reading auf das reading vibrationstrength angelegt.
Hoffe, die Kombination gibt so Sinn?
Hi,
diese Kombination:
([Vibrationssensor:vibration] == 1 or [Vibrationssensor:"^vibrationstrength:.*$"] and [07:00-20:00])
wir im Wesentlich von dem Eintreffen dieses Events getriggert Vibrationssensor:"^vibrationstrength:.*$" wenn Dir egal ist was im Reading steht kannst Du auch so machen:
Vibrationssensor:"vibrationstrength" Schau Dir hier an was es bedeutet https://regex101.com/.
Die Kombination .*$ ist eventuell doppelt gemoppelt :) weil .* ist der Rest und $ steht für "am Ende"
Meist ist es genauer den or Teil zu Klammern sonst wird es falsch (wäre in deinem Fall so, denke ich) https://perldoc.perl.org/perlop#Operator-Precedence-and-Associativity:
(([Vibrationssensor:vibration] == 1 or [Vibrationssensor:"^vibrationstrength:.*$"]) and [07:00-20:00])
Deinen set Sonos Befhel kannst Du kürzer machen:
Entweder: set Sonos_.* .... für alle, oder set Sonos_Kueche,Sonos_Büro usw. - im zweiten Fall musst Du (nur) bei DOIF eine doppelte Klammer um alles machen!
((set Sonos_Buero,Sonos_Wohnzimmer,Sonos_Kueche,Sonos_Schlafzimmer speak 25 de Die Post ist da Bitte Briefkasten leeren))
Gruß Otto
Hallo Otto,
danke soweit
Zitat von: Otto123 am 24 Januar 2021, 14:04:09
Hi,
diese Kombination:
([Vibrationssensor:vibration] == 1 or [Vibrationssensor:"^vibrationstrength:.*$"] and [07:00-20:00])
wir im Wesentlich von dem Eintreffen dieses Events getriggert Vibrationssensor:"^vibrationstrength:.*$" wenn Dir egal ist was im Reading steht kannst Du auch so machen:
Vibrationssensor:"vibrationstrength" Schau Dir hier an was es bedeutet https://regex101.com/.
Die Kombination .*$ ist eventuell doppelt gemoppelt :) weil .* ist der Rest und $ steht für "am Ende"
Ja, der Wert spielt hier keine Rolle für mich.
Zitat von: Otto123 am 24 Januar 2021, 14:04:09
Meist ist es genauer den or Teil zu Klammern sonst wird es falsch (wäre in deinem Fall so, denke ich) https://perldoc.perl.org/perlop#Operator-Precedence-and-Associativity:
(([Vibrationssensor:vibration] == 1 or [Vibrationssensor:"^vibrationstrength:.*$"]) and [07:00-20:00])
Ok, danke für den Tipp
Zitat von: Otto123 am 24 Januar 2021, 14:04:09
Deinen set Sonos Befhel kannst Du kürzer machen:
Entweder: set Sonos_.* .... für alle, oder set Sonos_Kueche,Sonos_Büro usw. - im zweiten Fall musst Du (nur) bei DOIF eine doppelte Klammer um alles machen!
((set Sonos_Buero,Sonos_Wohnzimmer,Sonos_Kueche,Sonos_Schlafzimmer speak 25 de Die Post ist da Bitte Briefkasten leeren))
Gruß Otto
Sieht gleich besser aus :-) Werds gleich mal testen.
Was mir noch nicht klar ist, dass Sonos nur einen speak ausgibt, wenn sich das Reading vibrationstrength ändert. Wie muss ich das angehen?
deleteattr Post_Eingang do always
Dann macht er es genau einmal am Tag, egal was passiert :) - meine ich - wenn ich DOIF richtig verstanden habe