Moin moin :-)
Ich hab ein Doif, dass mir in meiner Abwesenheit infos über ausgelöste Bewegungsmelder inkl. Raumangabe liefert.
Nun merkte ich - oh es gibt bei dem einen Bewegungsmelder IMMER eine Info, solange der ein Event hat -> also eine IF in den Ausführungsteil.
Seither hab ich nun ein Klammer Problem.
Vom Gefühl her glaub ich ich mixe zwei Modis :-D Und weiß nicht so ganz weiter.
Ohne das IF im Ausführungsteil funktioniert es ganz gut - nur halt bei jedem Event des einen Melders (die anderen haben keine Lichtmessung und geben nur Motion aus).
Mag mir jemand auf die Sprünge helfen?
(["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent") (IF ([$DEVICE] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))}))
Error:
error
IF ([Motion_Kueche] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("Motion_Kueche","room", "Motion_Kueche"))}): IF: no right bracket: {(AttrVal("Motion_Kueche"
Funktionierend ohne IF war es:
(["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))})
Oder kann ich sinnvoller auf das Reading "motion" oder eben NUR den state reagieren schon im Bedingunsteil des DOIF -also eben ausschließen, dass eine Lichtmessung das DOIF triggert?
Lg und Danke!
Ist das alles in deinem DOIF oder hast du mehrere Zweige?
Das ist alles.
define Movement_DOIF DOIF (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent") (IF ([$DEVICE] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))}))
attr Movement_DOIF do always
attr Movement_DOIF group DOIF FHEM
attr Movement_DOIF room ~Technikraum
attr Movement_DOIF verbose 1
# DEF (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent") (IF ([$DEVICE] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))}))
# FUUID 64523548-f33f-bf4c-0c43-b99966ebea63f6a4
# FVERSION 98_DOIF.pm:0.274870/2023-04-26
# MODEL FHEM
# NAME Movement_DOIF
# NOTIFYDEV .*(^Motion_[A-Z]).*,Anwesenheit,global
# NR 232
# NTFY_ORDER 50-Movement_DOIF
# STATE cmd_1
# TYPE DOIF
# VERSION 27487 2023-04-26 08:04:04
# eventCount 201
# READINGS:
# 2023-05-16 19:52:09 Device Motion_Flur
# 2023-05-16 19:24:51 cmd 1
# 2023-05-16 19:24:51 cmd_event Motion_Flur
# 2023-05-16 19:24:51 cmd_nr 1
# 2023-05-16 19:25:07 e_Anwesenheit_STATE present
# 2023-05-16 19:24:51 error IF ([Motion_Flur] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("Motion_Flur","room", "Motion_Flur"))}): IF: no right bracket: {(AttrVal("Motion_Flur"
# 2023-05-16 17:06:54 mode enabled
# 2023-05-16 19:24:51 state cmd_1
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# cond:
# :
# 0:
# "^Motion_[A-Z]:on" ^Motion_[A-Z]:on
# Anwesenheit:
# 0:
# &STATE ^Anwesenheit$
# attr:
# cmdState:
# wait:
# waitdel:
# condition:
# 0 ::EventDoIf('^Motion_[A-Z]',$hash,'on',0) and ::InternalDoIf($hash,'Anwesenheit','STATE') eq "absent"
# do:
# 0:
# 0 IF ([$DEVICE] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))})
# 1:
# helper:
# NOTIFYDEV .*(^Motion_[A-Z]).*,Anwesenheit,global
# event transmission-state: incoming publish received
# globalinit 1
# last_timer 0
# sleeptimer -1
# timerdev Motion_Flur
# timerevent transmission-state: incoming publish received
# triggerDev Motion_Flur
# timerevents:
# transmission-state: incoming publish received
# timereventsState:
# transmission-state: incoming publish received
# triggerEvents:
# transmission-state: incoming publish received
# triggerEventsState:
# transmission-state: incoming publish received
# internals:
# all Anwesenheit:STATE
# readings:
# trigger:
# uiState:
# uiTable:
#
setstate Movement_DOIF cmd_1
setstate Movement_DOIF 2023-05-16 19:52:09 Device Motion_Flur
setstate Movement_DOIF 2023-05-16 19:24:51 cmd 1
setstate Movement_DOIF 2023-05-16 19:24:51 cmd_event Motion_Flur
setstate Movement_DOIF 2023-05-16 19:24:51 cmd_nr 1
setstate Movement_DOIF 2023-05-16 19:25:07 e_Anwesenheit_STATE present
setstate Movement_DOIF 2023-05-16 19:24:51 error IF ([Motion_Flur] eq "on") (set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("Motion_Flur","room", "Motion_Flur"))}): IF: no right bracket: {(AttrVal("Motion_Flur"
setstate Movement_DOIF 2023-05-16 17:06:54 mode enabled
setstate Movement_DOIF 2023-05-16 19:24:51 state cmd_1
ich würde es gleich in DOIF-Perl machen. Probiere mal:
DOIF { if (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:state] eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}}
Vielen Dank dir erstmal :-)
Ich glaube damit hab ich bisher kaum oder gar nicht gearbeitet :-D
Nehme ich das mit dem "DOIF" in die Zeile?
Quasi so?
define Movement_DOIF DOIF DOIF { if (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:state] eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}}
attr Movement_DOIF do always
attr Movement_DOIF group DOIF FHEM
attr Movement_DOIF room ~Technikraum
attr Movement_DOIF verbose 1
# DEF DOIF { if (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:state] eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}}
# FUUID 64523548-f33f-bf4c-0c43-b99966ebea63f6a4
# FVERSION 98_DOIF.pm:0.274870/2023-04-26
# MODEL Perl
# NAME Movement_DOIF
# NOTIFYDEV Anwesenheit,.*(^Motion_[A-Z]).*,global
# NR 232
# NTFY_ORDER 50-Movement_DOIF
# STATE initialized
# TYPE DOIF
# VERSION 27487 2023-04-26 08:04:04
# eventCount 214
# READINGS:
# 2023-05-16 20:29:37 mode enabled
# 2023-05-16 20:29:37 state initialized
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# cond:
# :
# 0:
# "^Motion_[A-Z]:on" ^Motion_[A-Z]:on
# Anwesenheit:
# 0:
# &STATE ^Anwesenheit$
# attr:
# cmdState:
# wait:
# waitdel:
# condition:
# 0 if (::EventDoIf('^Motion_[A-Z]',$hash,'on',0) and ::InternalDoIf($hash,'Anwesenheit','STATE') eq "absent" and ::ReadingValDoIf($hash,'$DEVICE','state') eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}
# helper:
# NOTIFYDEV Anwesenheit,.*(^Motion_[A-Z]).*,global
# globalinit 1
# last_timer 0
# sleeptimer -1
# internals:
# all Anwesenheit:STATE
# perlblock:
# 0 DOIF
# uiState:
# uiTable:
#
setstate Movement_DOIF initialized
setstate Movement_DOIF 2023-05-16 20:29:37 mode enabled
setstate Movement_DOIF 2023-05-16 20:29:37 state initialized
EDIT--> Rubberducking -> man sieht hier ja sogar das DOIF DOIF ^^ Also NEIN!
Habe es nun so drin und teste direkt mal:
define Movement_DOIF DOIF { if (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:state] eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}}
attr Movement_DOIF do always
attr Movement_DOIF group DOIF FHEM
attr Movement_DOIF room ~Technikraum
attr Movement_DOIF verbose 1
# DEF { if (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:state] eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}}
# FUUID 64523548-f33f-bf4c-0c43-b99966ebea63f6a4
# FVERSION 98_DOIF.pm:0.274870/2023-04-26
# MODEL Perl
# NAME Movement_DOIF
# NOTIFYDEV Anwesenheit,.*(^Motion_[A-Z]).*,global
# NR 232
# NTFY_ORDER 50-Movement_DOIF
# STATE initialized
# TYPE DOIF
# VERSION 27487 2023-04-26 08:04:04
# eventCount 215
# READINGS:
# 2023-05-16 20:32:48 mode enabled
# 2023-05-16 20:32:48 state initialized
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# cond:
# :
# 0:
# "^Motion_[A-Z]:on" ^Motion_[A-Z]:on
# Anwesenheit:
# 0:
# &STATE ^Anwesenheit$
# attr:
# cmdState:
# wait:
# waitdel:
# condition:
# 0 if (::EventDoIf('^Motion_[A-Z]',$hash,'on',0) and ::InternalDoIf($hash,'Anwesenheit','STATE') eq "absent" and ::ReadingValDoIf($hash,'$DEVICE','state') eq "on") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}
# helper:
# NOTIFYDEV Anwesenheit,.*(^Motion_[A-Z]).*,global
# globalinit 1
# last_timer 0
# sleeptimer -1
# internals:
# all Anwesenheit:STATE
# perlblock:
# 0 block_01
# uiState:
# uiTable:
#
setstate Movement_DOIF initialized
setstate Movement_DOIF 2023-05-16 20:32:48 mode enabled
setstate Movement_DOIF 2023-05-16 20:32:48 state initialized
-> Da passiert nun gar nix :o
Device (also den Melder) getriggert und Abwesenheit = absent -> Keine Meldung -> DOIF weiter auf "initialized".
Wie hast du getestet?
Wenn nichts passiert und der Block auf executed steht, dann ist die Bedingung einfach nicht wahr.
Ich hab mein WLAN aus am Handy = Anwesenheit -> absent.
Laufe in den Flur wenn der Melder auf "off" ist.
Melder wechselt auf on.
Anwesenheit = absent.
Somit sollte es ja getriggert werden.
Ah eine Log Meldung:
Oh sorry die war von der falschen Uhrzeit :-D
Mhhh also es passiert ja "etwas":
ZitatDevice Motion_Flur 2023-05-16 20:41:28
block_01 executed2023-05-16 20:41:28
@Damian VIELEN DANK!!!
Hab es -> OFF und ON waren falsch ;-)
Habe es dann auch noch direkt auf das "motion" Reading geändert.
True und False sind es unter der Haube -> hab es angepasst wie folgt:
{ if (["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:motion] eq "true") {fhem_set "GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: ".AttrVal($device,"room", $device)}}
Einen schönen Abend :-)
Guten Morgen,
@Damian gab es eigentlich irgendwas, dass ich falsch gemacht hatte oder geht ein IF nicht im Ausführungsteil bei nicht PERL Mode?
Gibt es irgendwo eine Festlegung wann welche Art RegEx genutzt werden muss?
Danke dir :-)
Das geht auch mit IF, das Problem ist hier das Komma, das als Trennzeichen beim IF-Befehl gilt, daher muss man die Anweisung zusätzlich Klammern.
(["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent") (IF ([$DEVICE] eq "on") ((set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))})))
Allerdings auch im FHEM-Modus ist das IF überflüssig, wenn man die Bedingung [$DEVICE] eq "on" in die DOIF-Bedingung mit and aufnimmt.
Ich dank dir für die Erklärung :-)
Mh habe die Version mal getestet, es kommen dabei cmd1 und cmd2 raus - war aber gerade auch mur am Mobiltelfon - da ist Debuggen doof.
Funktionieren tut die Version so nicht.
**EDIT:
Guten Morgen :-)
Gerade nochmal angesehen - da war logischerweise noch "on" statt "true" und ohne Eingrenzung auf das reading motion :)
Teste gerade nochmal.
(["^Motion_[A-Z]:on"] and [Anwesenheit] eq "absent" and [$DEVICE:motion] eq "true") ((set GoogleCloudMessages send Homeland|Bewegung in Abwesenheit|Bewegung im Raum: {(AttrVal("$DEVICE","room", "$DEVICE"))}))
So tut es :-)
Danke dir!