Hallo, ich arbeite mich schon einige Zeit an dem Thema ab...
Ich habe meine Türen aus anderen Gründen umbenannt, damit sie in mein "Fensterschema" passen. Als Alias habe ich jedem Fenster und den Türen den Klarnamen mitgegeben.
Meine Überwachung reagiert auf offen bzw. gekippt und soll dann nach einer Wartezeit von drei Sekunden die Telegrammeldung absetzen, wenn ich nicht da bin bzw. der Heizmodus "Urlaub" ist. Das funzt mit dem $DEVICE auch, allerdings ist es mir nicht gelungen, die Meldung auf Alias umzustellen. Ich möchte allerdings auch keine zusätzlichen Dummies anlegen.
Hier mal die Überwachung:
Internals:
CFGFN ./FHEM/16_Heizung_Lueftung.cfg
DEF (["\D\D_Fenster:offen"] or ["\D\D_Fenster:gekippt"])
()(IF ([androiduwe] ne "1.0" or [Heizmodus] eq "Urlaub") (set Nachrichten message ACHTUNG! $DEVICE ist $EVENT))
DOELSEIF
([WZ_Fenster] eq "geschlossen" and
[KU_Fenster] eq "geschlossen" and
[SZ_Fenster] eq "geschlossen" and
[BD_Fenster] eq "geschlossen" and
[AZ_Fenster] eq "geschlossen" and
[BK_Fenster] eq "geschlossen" and
[FL_Fenster] eq "geschlossen")
()(IF ([androiduwe] ne "1.0" or [Heizmodus] eq "Urlaub") (set Nachrichten message INFO Tür und alle Fenster sind geschlossen))
DOIFDEV ^global$|^SZ_Fenster$|^KU_Fenster$|\D\D_Fenster|^BD_Fenster$|^FL_Fenster$|^AZ_Fenster$|^BK_Fenster$|^WZ_Fenster$
FUUID 5c443db2-f33f-b425-75b7-db869794e75f6349
MODEL FHEM
NAME Fenster_check
NR 445
NTFY_ORDER 50-Fenster_check
STATE initialized
TYPE DOIF
VERSION 24595 2021-06-06 17:52:38
READINGS:
2021-06-09 12:08:52 cmd 0
2021-06-09 09:56:28 ftui_background red
2021-06-09 12:08:52 mode enabled
2021-06-09 12:08:52 state initialized
Regex:
accu:
collect:
cond:
:
0:
"\D\D_Fenster:gekippt" \D\D_Fenster:gekippt
"\D\D_Fenster:offen" \D\D_Fenster:offen
AZ_Fenster:
1:
&STATE ^AZ_Fenster$
BD_Fenster:
1:
&STATE ^BD_Fenster$
BK_Fenster:
1:
&STATE ^BK_Fenster$
FL_Fenster:
1:
&STATE ^FL_Fenster$
KU_Fenster:
1:
&STATE ^KU_Fenster$
SZ_Fenster:
1:
&STATE ^SZ_Fenster$
WZ_Fenster:
1:
&STATE ^WZ_Fenster$
attr:
cmdState:
wait:
0:
0
3
1:
0
20
waitdel:
condition:
0 ::EventDoIf('\D\D_Fenster',$hash,'offen',0) or ::EventDoIf('\D\D_Fenster',$hash,'gekippt',0)
1 ::InternalDoIf($hash,'WZ_Fenster','STATE') eq "geschlossen" and ::InternalDoIf($hash,'KU_Fenster','STATE') eq "geschlossen" and ::InternalDoIf($hash,'SZ_Fenster','STATE') eq "geschlossen" and ::InternalDoIf($hash,'BD_Fenster','STATE') eq "geschlossen" and ::InternalDoIf($hash,'AZ_Fenster','STATE') eq "geschlossen" and ::InternalDoIf($hash,'BK_Fenster','STATE') eq "geschlossen" and ::InternalDoIf($hash,'FL_Fenster','STATE') eq "geschlossen"
devices:
do:
0:
0
1 IF ([androiduwe] ne "1.0" or [Heizmodus] eq "Urlaub") (set Nachrichten message ACHTUNG! $DEVICE ist $EVENT)
1:
0
1 IF ([androiduwe] ne "1.0" or [Heizmodus] eq "Urlaub") (set Nachrichten message INFO Tür und alle Fenster sind geschlossen)
2:
helper:
DEVFILTER ^global$|^SZ_Fenster$|^KU_Fenster$|\D\D_Fenster|^BD_Fenster$|^FL_Fenster$|^AZ_Fenster$|^BK_Fenster$|^WZ_Fenster$
NOTIFYDEV global|SZ_Fenster|KU_Fenster|.*\D\D_Fenster.*|BD_Fenster|FL_Fenster|AZ_Fenster|BK_Fenster|WZ_Fenster
globalinit 1
last_timer 0
sleeptimer -1
internals:
all WZ_Fenster:STATE KU_Fenster:STATE SZ_Fenster:STATE BD_Fenster:STATE AZ_Fenster:STATE BK_Fenster:STATE FL_Fenster:STATE
uiState:
uiTable:
Attributes:
alias Sicherheit
appOptions {
"template": "contact",
"home": true
}
devStateIcon cmd_1:LED.red cmd_2:LED.green cmd_2_1:LED.green
do always
group Bedienung
icon building_security
room 000Wohnung
sortby 00
wait 0,3:0,20
Und ein Fenster als Beispiel, das sind HM-RHS bzw. IT-Kontakte:
Internals:
CFGFN ./FHEM/065_AZ.cfg
DEF 1527xea41a 1110 0111 1011 0000
FUUID 5c443da8-f33f-b425-7bac-3db3e8d21ed34522
IODev CUNO2
NAME AZ_Fenster
NR 264
STATE offen
TYPE IT
XMIT 1dddf00fdd
XMITdimdown 0000
XMITdimup 1011
XMIToff 0111
XMITon 1110
CODE:
1 1527xea41a
READINGS:
2021-03-10 08:05:00 Activity alive
2019-06-11 17:15:31 Batteriedauer_alt 461
2021-06-09 08:05:00 Batteriewechsel 702
2021-06-07 09:49:58 IODev CUNO2
2021-03-10 08:05:00 Last_closed 2021-03-09 09:30:04
2020-05-12 08:05:00 Last_open 2020-05-12 07:53:55
2021-06-08 12:33:26 dim on
2021-06-08 12:33:26 ftui_background red
2017-06-17 19:23:19 lastDimValue
2017-06-16 19:29:34 protocol EV1527
2021-06-08 12:33:26 state on
Attributes:
IODev CUNO2
alias Arbeitszimmerfenster
appOptions {"template":"contact"}
eventMap off:geschlossen on:offen dimup:Sabotage dimdown:Batt?
model itdimmer
room 005Arbeitszimmer
webCmd :
Ich habe versucht, das mit AttrVal zu lösen oder das "IF" mit "if" zu ersetzen -ich war dabei nicht erfolgreich.
Könnt ihr mir auf die "Sprünge" helfen.
(set Nachrichten message ACHTUNG! [$DEVICE:alias] ist $EVENT)
Zitat von: locodriver am 09 Juni 2021, 12:22:26
Ich habe versucht, das mit AttrVal zu lösen oder das "IF" mit "if" zu ersetzen -ich war dabei nicht erfolgreich.
Könnt ihr mir auf die "Sprünge" helfen.
Der Ansatz mit AttrVal ist doch schon mal ok. Du musst halt den Ausführungsteil des DOIF in Perl definieren. Z.B.:
... (["\D\D_Fenster:offen"] or ["\D\D_Fenster:gekippt"] and ([?androiduwe] ne "1.0" or [?Heizmodus] eq "Urlaub"))
() ({fhem("set Nachrichten message ACHTUNG! ".AttrVal($device,'alias','')." ist ".$event)})
DOELSEIF
([WZ_Fenster] eq "geschlossen" and
[KU_Fenster] eq "geschlossen" and
[SZ_Fenster] eq "geschlossen" and
[BD_Fenster] eq "geschlossen" and
[AZ_Fenster] eq "geschlossen" and
[BK_Fenster] eq "geschlossen" and
[FL_Fenster] eq "geschlossen" and ([?androiduwe] ne "1.0" or [?Heizmodus] eq "Urlaub"))
()(set Nachrichten message INFO Tür und alle Fenster sind geschlossen)
DOELSE ()
Edit:
Cooltux war schneller und besser.
@Cooltux: das funzt so leider nicht:
Als Telegrammeldung kommt nur: "ACHTUNG! ist" und im log (Reverse!) kommt die Felermeldung:
2021.06.09 12:57:33.561 2: Fenster_check: IF ([androiduwe] eq "1.0" or [Heizmodus] eq "Urlaub") (set Nachrichten message ACHTUNG! [FL_Fenster:alias] ist offen): IF: unknown reading: FL_Fenster:alias
2021.06.09 12:57:30.501 3: CUNO2 IT: FL_Fenster geschlossen->on
Es wird ein Reading erwartet - Alias ist aber ein Attribut.
@Ralli:
Du hast die Anwesenheits- und Urlaubabfrage mit in den Bedingungsteil gepackt, diese Bedingungen sollen aber erst im zweiten Ausführungsteil geprüft werden, der erste - leere - Ausführungsteil dient dazu, die IF-Abfrage eindeutig dem Ausführungsteil zuzuordnen. DOIF könnte sonst "denken", das IF gehört noch zum Bedingungsteil (IF kann in beiden Teilen verwendet werden).
Was spricht dagegen?
Wenn das unbedingt im Ausführungsteil abgefragt werden soll, musst du das in ein Perl-if umsetzen.
... (["\D\D_Fenster:offen"] or ["\D\D_Fenster:gekippt"])
() ({if (Value('androiduwe') ne '1.0' || Value('Heizmodus') eq 'Urlaub') {fhem("set Nachrichten message ACHTUNG! ".AttrVal($device,'alias','')." ist ".$event)}})
...
Der Status von Fenster_Check soll immer aktualisiert werden, die Meldung möchte ich nur haben, wenn ich nicht da bin bzw. im Urlaub.
Evtl. ist das Anlegen eines Userreadings zielführend, dann könnte es mit der Lösung von Cooltux funzen...
Edit:
Ich habe es gerade probiert, es klappt. Damit ist das für mich die einfachste Lösung, ich muss nur bei allen Türen bzw. Fenstern den Alias als Userreading anlegen.
Falls es doch noch eine Lösung nur mit dem Attribut gibt, dann würde ich sie auch noch ausprobieren. Bei ähnlichen Fällen ist es evtl. zu mühsam viele Userreadings anzulegen...
Danke für den Input.
@Ralli: ich habe deine Lösung auch noch getestet - die funzt leider nicht:
Das ist die resultierende Fehlermeldung:
Global symbol "$event" requires explicit package name (did you forget to declare "my $event"?) at (eval 204167) line 1.
2021.06.09 13:34:24.120 1: ERROR evaluating {if (Value('androiduwe') eq '1.0' || Value('Heizmodus') eq 'Urlaub') {fhem("set Nachrichten message ACHTUNG! ".AttrVal($device,'alias','')." ist ".$event)}}: Global symbol "$device" requires explicit package name (did you forget to declare "my $device"?) at (eval 204167) line 1.
Weil $event $EVENT heißen muss (oder $EVTPART1 usw. je nachdem).
Also sofern das in einem notify etc. genutzt wird (bzw. dort wo eben $EVENT auch existiert)... ;)
EDIT: ich würde von Value() abstand nehmen! Value() "frägt" STATE (also das INTERNAL!) ab! Das kann durch z.B. stateFormat etc. "umgebogen" werden. Besser mittels ReadingsVal("Devicename","Readingname","Ersatzwert") bzw. ReadingsNum("Devicename","Readingname",Ersatzwert) einen Reading-Wert abfragen oder wenn wirklich Internal interessieren mittels InternalVal("Devicename","Internalname","Ersatzwert") dann halt das...
Gruß, Joachim
Danke für die zusätzlichen Erläuterungen.
Ich werde erstmal bei den extra angelegten Userreadings bleiben...