Hi,
ich habe ein Problem mit dem DOIF (wobei ich mir noch ncihtmal sicher bin, dass es am DOIF liegt)
Folgendes DOIF habe ich, um die Rollläden über den Homestatus zu steuern:
([homestatus] eq "unterwegs" and ([[Sonnenstand:ss_civil]|0123456]) and (["^ZWave_SENSOR_NOTIFICATION_:open"])) (setreading speak Fenster AUF, set RL_Alle Runter, set pushmsg msg 'Homestatus' 'Alle Rolläden geschlossen')
Aber aus igrndeinem Grund wird mir das Reading des Dummy "speak" nicht gesetzt.
Ich habe schon alles versucht, aber finde den Fehler nicht.
Das Device ZWave_SENSOR_NOTIFICATION_17 hat im state "open" stehen. Damit dies aber so ist, musste ich im Device mit StateFormat erst folgendes angeben: {(split(/,|is /, ReadingsVal($name,"alarm_AccessControl","")))[1]}
Normalerweise würde da nämlich stehen "AccessControl: Window/Door is closed". Es handelt sich um einen Fibaro Fenster Sensor.
Ich will einfach nur realisieren, dass wenn eines der zahlreichen Fenster offen ist und jemand den Homestatus auf "unterwegs" setzt, über tts eine Sprachausgabe gestartet wird und daran erinnert, dass noch Fenster offen sind.
Gruss
Dennis
Vollständiges "list" des DOIFs bitte liefern
Springt der DOIF auf cmd1? Dann ist der DOIF nicht das Problem
Hier das vollständige list:
Internals:
DEF ([homestatus] eq "home" and ([[Sonnenstand:sr]-[Sonnenstand:ss_civil]|12345] or [09:00:00-[Sonnenstand:ss_civil]|60]) and [Lang_schlafen] eq "off") (set RL_Alle Hoch, set pushmsg msg 'Homestatus' 'Alle Rolläden geöffnet')
DOELSEIF
([homestatus] eq "home" and ([[Sonnenstand:sr]-[Sonnenstand:ss_civil]|12345] or [09:00:00-[Sonnenstand:ss_civil]|60]) and [Lang_schlafen] eq "on") (set RL_lang_schlafen Hoch, set pushmsg msg 'Homestatus' 'Alle Rolläden ausser Schlafzimmer geöffnet')
DOELSEIF
([homestatus] =~ "home|unterwegs|ferien" and ([[Sonnenstand:ss_civil]|0123456]) and (["^ZWave_SENSOR_NOTIFICATION_:open"])) (setreading speak Fenster 1111, set RL_Alle Runter, set pushmsg msg 'Homestatus' 'Alle Rolläden geschlossen')
DOELSEIF
([homestatus] eq "unterwegs" and ([[Sonnenstand:sr]-[Sonnenstand:ss_civil]|12345] or [09:00:10-[Sonnenstand:ss_civil]|60]) and (["^ZWave_SENSOR_NOTIFICATION_:open"])) (setreading speak Fenster 1111, set RL_Unterwegs Runter, set pushmsg msg 'Homestatus' 'Rolläden unterwegs geschlossen')
DOELSEIF
([homestatus] eq "ferien" and ([09:00:00-[Sonnenstand:ss_civil]|12345] or [09:00:10-[Sonnenstand:ss_civil]|60])) (set RL_Ferien Hoch, set pushmsg msg 'Homestatus' 'Rolläden Ferien geöffnet')
MODEL FHEM
NAME di_Rolladen
NR 61
NTFY_ORDER 50-di_Rolladen
STATE initialized
TYPE DOIF
READINGS:
2019-11-23 20:58:40 Device ZWave_SENSOR_NOTIFICATION_17
2019-11-23 20:29:21 cmd 0
2019-11-23 20:30:09 e_homestatus_STATE home
2019-11-23 20:29:21 mode enabled
2019-11-23 20:29:21 state initialized
2019-11-23 20:29:21 timer_01_c01 24.11.2019 07:57:50|12345
2019-11-23 20:29:21 timer_02_c01 24.11.2019 17:16:48|12345
2019-11-23 20:29:21 timer_03_c01 24.11.2019 09:00:00|60
2019-11-23 20:29:21 timer_04_c01 24.11.2019 17:16:48|60
2019-11-23 20:29:21 timer_05_c02 24.11.2019 07:57:50|12345
2019-11-23 20:29:21 timer_06_c02 24.11.2019 17:16:48|12345
2019-11-23 20:29:21 timer_07_c02 24.11.2019 09:00:00|60
2019-11-23 20:29:21 timer_08_c02 24.11.2019 17:16:48|60
2019-11-23 20:29:21 timer_09_c03 24.11.2019 17:16:48|0123456
2019-11-23 20:29:21 timer_10_c04 24.11.2019 07:57:50|12345
2019-11-23 20:29:21 timer_11_c04 24.11.2019 17:16:48|12345
2019-11-23 20:29:21 timer_12_c04 24.11.2019 09:00:10|60
2019-11-23 20:29:21 timer_13_c04 24.11.2019 17:16:48|60
2019-11-23 20:29:21 timer_14_c05 24.11.2019 09:00:00|12345
2019-11-23 20:29:21 timer_15_c05 24.11.2019 17:16:48|12345
2019-11-23 20:29:21 timer_16_c05 24.11.2019 09:00:10|60
2019-11-23 20:29:21 timer_17_c05 24.11.2019 17:16:48|60
Regex:
cond:
:
0:
1:
2:
"^ZWave_SENSOR_NOTIFICATION_:open" ^ZWave_SENSOR_NOTIFICATION_:open
3:
"^ZWave_SENSOR_NOTIFICATION_:open" ^ZWave_SENSOR_NOTIFICATION_:open
4:
condition:
0 InternalDoIf($hash,'homestatus','STATE') eq "home" and (DOIF_time($hash,0,1,$wday,$hms,"12345") or DOIF_time($hash,2,3,$wday,$hms,"60")) and InternalDoIf($hash,'Lang_schlafen','STATE') eq "off"
1 InternalDoIf($hash,'homestatus','STATE') eq "home" and (DOIF_time($hash,4,5,$wday,$hms,"12345") or DOIF_time($hash,6,7,$wday,$hms,"60")) and InternalDoIf($hash,'Lang_schlafen','STATE') eq "on"
2 InternalDoIf($hash,'homestatus','STATE') =~ "home|unterwegs|ferien" and (DOIF_time_once($hash,8,$wday,"0123456")) and (EventDoIf('^ZWave_SENSOR_NOTIFICATION_',$hash,'open',0))
3 InternalDoIf($hash,'homestatus','STATE') eq "unterwegs" and (DOIF_time($hash,9,10,$wday,$hms,"12345") or DOIF_time($hash,11,12,$wday,$hms,"60")) and (EventDoIf('^ZWave_SENSOR_NOTIFICATION_',$hash,'open',0))
4 InternalDoIf($hash,'homestatus','STATE') eq "ferien" and (DOIF_time($hash,13,14,$wday,$hms,"12345") or DOIF_time($hash,15,16,$wday,$hms,"60"))
days:
0 12345
1 12345
10 12345
11 60
12 60
13 12345
14 12345
15 60
16 60
2 60
3 60
4 12345
5 12345
6 60
7 60
8 0123456
9 12345
devices:
0 homestatus Lang_schlafen
1 homestatus Lang_schlafen
2 homestatus
3 homestatus
4 homestatus
all homestatus Lang_schlafen
do:
0:
0 set RL_Alle Hoch, set pushmsg msg 'Homestatus' 'Alle Rolläden geöffnet'
1:
0 set RL_lang_schlafen Hoch, set pushmsg msg 'Homestatus' 'Alle Rolläden ausser Schlafzimmer geöffnet'
2:
0 setreading speak Fenster 1111, set RL_Alle Runter, set pushmsg msg 'Homestatus' 'Alle Rolläden geschlossen'
3:
0 setreading speak Fenster 1111, set RL_Unterwegs Runter, set pushmsg msg 'Homestatus' 'Rolläden unterwegs geschlossen'
4:
0 set RL_Ferien Hoch, set pushmsg msg 'Homestatus' 'Rolläden Ferien geöffnet'
5:
helper:
DOIF_Readings_events
DOIF_eventas
event alarm_AccessControl: Window/Door is open, notificationIsOn
globalinit 1
last_timer 17
sleeptimer -1
triggerDev ZWave_SENSOR_NOTIFICATION_17
triggerEvents:
alarm_AccessControl: Window/Door is open, notificationIsOn
triggerEventsState:
alarm_AccessControl: Window/Door is open, notificationIsOn
internals:
0 homestatus:STATE Lang_schlafen:STATE
1 homestatus:STATE Lang_schlafen:STATE
2 homestatus:STATE
3 homestatus:STATE
4 homestatus:STATE
all homestatus:STATE Lang_schlafen:STATE
interval:
0 -1
1 0
10 9
11 -1
12 11
13 -1
14 13
15 -1
16 15
2 -1
3 2
4 -1
5 4
6 -1
7 6
9 -1
itimer:
all Sonnenstand
localtime:
0 1574578670
1 1574612208
10 1574612208
11 1574582410
12 1574612208
13 1574582400
14 1574612208
15 1574582410
16 1574612208
2 1574582400
3 1574612208
4 1574578670
5 1574612208
6 1574582400
7 1574612208
8 1574612208
9 1574578670
readings:
realtime:
0 07:57:50
1 17:16:48
10 17:16:48
11 09:00:10
12 17:16:48
13 09:00:00
14 17:16:48
15 09:00:10
16 17:16:48
2 09:00:00
3 17:16:48
4 07:57:50
5 17:16:48
6 09:00:00
7 17:16:48
8 17:16:48
9 07:57:50
time:
0 [Sonnenstand:sr]
1 [Sonnenstand:ss_civil]
10 [Sonnenstand:ss_civil]
11 09:00:10
12 [Sonnenstand:ss_civil]
13 09:00:00
14 [Sonnenstand:ss_civil]
15 09:00:10
16 [Sonnenstand:ss_civil]
2 09:00:00
3 [Sonnenstand:ss_civil]
4 [Sonnenstand:sr]
5 [Sonnenstand:ss_civil]
6 09:00:00
7 [Sonnenstand:ss_civil]
8 [Sonnenstand:ss_civil]
9 [Sonnenstand:sr]
timeCond:
0 0
1 0
10 3
11 3
12 3
13 4
14 4
15 4
16 4
2 0
3 0
4 1
5 1
6 1
7 1
8 2
9 3
timer:
0 0
1 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0 1 2 3
1 4 5 6 7
2 8
3 9 10 11 12
4 13 14 15 16
trigger:
triggertime:
1574578670:
localtime 1574578670
hash:
1574582400:
localtime 1574582400
hash:
1574582410:
localtime 1574582410
hash:
1574612208:
localtime 1574612208
hash:
uiState:
uiTable:
Attributes:
checkReadingEvent 1
room Homestatus
Das DOIF springt nicht auf cmd1
Gruss
Dennis
Ähhhm ich habe den Fehler gefunden.
Und zwar wird das DOIF nur ausgeführt, wenn das Fenster geschlossen ist, der Homestatus auf "unterwegs" steht und dann ein Fenster geöffnet wird.
Ich will ja aber, dass das DOIF erkennt, ob noch Fenster offen sind, wenn jemand den Homestatus auf "unterwegs" gesetzt hat.
Wie realisiere ich das am besten?
Gruss
Dennis
Schwierig, ohne deine Komponenten zu kennen.
Statt auf Ereignis "open" zu triggern, nutze die Aggregationsfunktionen vom DOIF.
https://fhem.de/commandref_DE.html#DOIF_aggregation
Es gibt schöne Beispiele im CommandRef, die einfach für dein Bedarf anzupassen wären
Z.B. wenn deine Zwave Sensoren einen Status "open" behalten, solange geöffnet:
DOELSEIF
([homestatus] =~ "home|unterwegs|ferien" and ([[Sonnenstand:ss_civil]|0123456]) and [?#"^ZWave_SENSOR_NOTIFICATION_":state:"open"] > 0) (setreading speak Fenster 1111, set RL_Alle Runter, set pushmsg msg 'Homestatus' 'Alle Rolläden geschlossen')
wird bei Änderung von homestatus oder zeitgretriggert nur prüfen, ob die Anzahl von offenen Fenster grösser als null ist
Ich danke dir schonmal.
Das schaue ich mir gleich an.
Gruss
Dennis
Hi,
also ich habe das mal getestet, aber es scheint noch nicht zu funktionieren.
Folgendes steht in meinem eigens für die Sprachausgabe angelegtem DOIF jetzt:
([homestatus] eq "test" and ([?#"^ZWave_SENSOR_NOTIFICATION_":state:"open"] > 0)) (set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet)
Ich habe mittlerweile die Sprachausgabe über SOnos realisiert. Wenn ich "set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet" manuell eingebe, funktioniert die Sprachausgabe auch wunderbar.
Aber irgendwie greift das DOIF nicht.
Gruss
Dennis
Das komplette List des DOIF lautet:
Internals:
DEF ([homestatus] eq "test" and ([?#"^ZWave_SENSOR_NOTIFICATION_":state:"open"] > 0)) (set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet)
FUUID 5ddb935d-f33f-8212-b97c-b74132274baf6179
MODEL FHEM
NAME di_Sprachausgabe
NOTIFYDEV homestatus,global
NR 103
NTFY_ORDER 50-di_Sprachausgabe
STATE cmd_2
TYPE DOIF
VERSION 20500 2019-11-12 17:54:48
READINGS:
2019-11-25 11:21:50 Device homestatus
2019-11-25 11:21:51 cmd 2
2019-11-25 11:21:51 cmd_event homestatus
2019-11-25 11:21:51 cmd_nr 2
2019-11-25 11:21:50 e_homestatus_STATE test
2019-11-25 11:21:29 mode enabled
2019-11-25 11:21:51 state cmd_2
Regex:
accu:
cond:
homestatus:
0:
&STATE ^homestatus$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'homestatus','STATE') eq "test" and (::AggregateDoIf($hash,'#','^ZWave_SENSOR_NOTIFICATION_','state','"open"') > 0)
do:
0:
0 set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet
1:
helper:
DEVFILTER ^global$|^homestatus$
NOTIFYDEV global|homestatus
event test
globalinit 1
last_timer 0
sleeptimer -1
timerdev homestatus
timerevent test
triggerDev homestatus
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: homestatus
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: homestatus
state: cmd_2
timerevents:
test
timereventsState:
state: test
triggerEvents:
test
triggerEventsState:
state: test
internals:
all homestatus:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
room Homestatus
Leider hast Du aber anscheinend das "list" vom DOIF erst gezogen, als homestatus nicht mehr auf "test" stand.
Du hast recht. hier das list wenn es auf test steht:
Internals:
DEF ([homestatus] eq "test" and ([?#"^ZWave_SENSOR_NOTIFICATION_":state:"open"] > 0)) (set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet)
FUUID 5ddb935d-f33f-8212-b97c-b74132274baf6179
MODEL FHEM
NAME di_Sprachausgabe
NOTIFYDEV homestatus,global
NR 103
NTFY_ORDER 50-di_Sprachausgabe
STATE initialized
TYPE DOIF
VERSION 20500 2019-11-12 17:54:48
READINGS:
2019-11-25 11:42:30 Device homestatus
2019-11-25 11:32:55 cmd 0
2019-11-25 11:42:30 e_homestatus_STATE test
2019-11-25 11:32:55 mode enabled
2019-11-25 11:32:55 state initialized
Regex:
accu:
cond:
homestatus:
0:
&STATE ^homestatus$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'homestatus','STATE') eq "test" and (::AggregateDoIf($hash,'#','^ZWave_SENSOR_NOTIFICATION_','state','"open"') > 0)
do:
0:
0 set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet
1:
helper:
DEVFILTER ^global$|^homestatus$
NOTIFYDEV global|homestatus
event test
globalinit 1
last_timer 0
sleeptimer -1
triggerDev homestatus
triggerEvents:
test
triggerEventsState:
state: test
internals:
all homestatus:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
do always
room Homestatus
Bitte ein "list" von einem ZWave_SENSOR_NOTIFICATION_XXXX der dabei auf "open" stand
Hier das list des Devices welches auf open steht:
Internals:
DEF c1aa9dda 17
FUUID 5ddb935d-f33f-8212-587c-a5ecfd591e77da1b
IODev ZWDongle_0
LASTInputDev ZWDongle_0
MSGCNT 10
NAME ZWave_SENSOR_NOTIFICATION_17
NR 100
STATE open
TYPE ZWave
ZWDongle_0_MSGCNT 10
ZWDongle_0_RAWMSG 00040011063105012200c8
ZWDongle_0_TIME 2019-11-25 11:40:26
ZWaveSubDevice no
homeId c1aa9dda
isWakeUp 1
nodeIdHex 11
READINGS:
2019-11-23 17:21:45 alarm AccessControl: Window/Door is closed
2019-11-25 11:21:38 alarm_AccessControl Window/Door is open, notificationIsOn
2019-11-25 04:19:29 battery 80 %
2019-11-23 17:14:18 model FIBARO System FGDW002 Door Opening Sensor 2
2019-11-23 17:14:18 modelConfig fibaro/fgdw2.xml
2019-11-23 17:14:18 modelId 010f-0702-1000
2019-11-23 17:14:16 state wakeupInterval 86400 1
2019-11-25 11:40:26 temperature 20.0 C
2019-11-25 04:19:31 timeToAck 0.023
2019-11-25 04:19:31 transmit OK
2019-11-25 04:19:29 wakeup notification
Attributes:
IODev ZWDongle_0
alias Sensor_Buero_rechts
classes ZWAVEPLUS_INFO ASSOCIATION ASSOCIATION_GRP_INFO APPLICATION_STATUS BATTERY CONFIGURATION CRC_16_ENCAP DEVICE_RESET_LOCALLY FIRMWARE_UPDATE_MD MANUFACTURER_SPECIFIC MULTI_CHANNEL_ASSOCIATION ALARM POWERLEVEL SECURITY SENSOR_MULTILEVEL VERSION WAKE_UP
extendedAlarmReadings 1
room ZWave
stateFormat {(split(/,|is /, ReadingsVal($name,"alarm_AccessControl","")))[1]}
vclasses ALARM:5 APPLICATION_STATUS:1 ASSOCIATION:2 ASSOCIATION_GRP_INFO:1 BATTERY:1 CONFIGURATION:1 CRC_16_ENCAP:1 DEVICE_RESET_LOCALLY:1 FIRMWARE_UPDATE_MD:4 MANUFACTURER_SPECIFIC:2 MULTI_CHANNEL_ASSOCIATION:3 POWERLEVEL:1 SECURITY:1 SENSOR_MULTILEVEL:5 VERSION:2 WAKE_UP:2 ZWAVEPLUS_INFO:2
Naja... im Reading state steht nicht "open" sondern "wakeupInterval 86400 1"
Versuch mal mit STATE statt state in der Aggregation:
([?#"^ZWave_SENSOR_NOTIFICATION_"::$STATE eq "open"] > 0))
::) Funktioniert jetzt einwandfrei.
Vielen, vielen Dank für Deine Hilfe.
Ich habe nur nach dem "state" geschaut, welches ich durch StateForma umwandle.
Nochmals Danke.
Gruss
Dennis
(set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet)
Komma sind im DOIF Befehlstrenner, die hier passende Syntax ist:
((set Sonos_Arbeitszimmer Speak 45 de Achtung, es sind noch Fenster geöffnet))
(Den passenden Link in der CommandRef mag ich gerade nicht raussuchen ;) )
Fauler Mensch! ;)
https://fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil
ZitatFalls ein Komma nicht als Trennzeichen zwischen FHEM-Befehlen gelten soll, so muss der FHEM-Ausdruck zusätzlich in runde Klammern gesetzt werden: ...((set lamp1,lamp2 on),set switch on)
Das hatte ich nicht gesehen, danke (für ihn) :)
Wollte hier nochmal Rückmeldung geben und habe gleich noch eine Frage.
Also es klappt bisher alles wunderbar. Wenn man auf WEG klickt am Tablet und es sind noch Fenster geöffnet, dann informiert mich eine Stimme über Sonos, dass noch Fenster geöffnet sind.
Die andere Frage die ich derzeit habe ist folgende:
Wir stellen regelmäßig unsere Fenster zum lüften auf. Allerdings vergessen wir auch hin und wieder ein Fenster im oberen Stock zu schließen.
Wie könnte ich es denn realisieren, dass mich eine Sprachausgabe nach 20 Minuten erinnert, dass noch Fenster geöffnet sind? Also quasi ein Timer, der beginnt zu laufen, sobald ein Fenster geöffnet wird.
Danke
Gruss
Dennis
Mit dem Attribut wait. Das ? muss dann allerdings weg.