Hallo,
die ursprüngliche Idee war, dass beim Ausschalten von TV1 auch evtl. eingeschaltete TV-Lampen ausgeschaltet werden; klingt einfach und ist es ja eigentlich auch. Um dies zu realisieren, habe ich ein DOIF angelegt - funktioniert auch ohne wenn und aber. Irgendwann sollte das DOIF ergänzt werden, so dass die TV-Lampen nur dann ausgeschaltet werden, wenn TV1 nach dem Ausschalten nicht innerhalb eines bestimmten Zeitraums wieder eingeschaltet wird. Folglich habe ich das DOIF erweitert - den aktuellen Zustand sieht man unten.
Grundsätzlich funktioniert auch dieses veränderte DOIF tadellos. Da ich einen FileLog für dieses DOIF führe, ist mir allerdings aufgefallen, dass der DOELSEIF-Zweig unerwartet häufig ausgelöst wird - z.B. bei einem Kanalwechsel oder einer Änderung der Lautstärke von TV1.
Vom bisherigen Verständnis her hätte ich erwartet, dass Zweig2 nur ausgelöst werden kann, wenn es ein Ereignis zum power-Reading gibt.
Tatsächlich scheint aber jedes Ereignis von TV1 zu einer Auslösung zu führen. Klar, bei einem Kanalwechsel ist natürlich TV1 eingeschaltet, aber das war TV1 davor ja auch schon.
Im Event-Monitor gibt es übrigens auch kein Event zum power-Reading, da via Attribut Events bei TV1 nur bei Änderung eines Zustandes ausgelöst werden.
Ist meine Annahme/Verständnis falsch (vermutlich ja) und wenn ja, welchen zusätzliche Bedingung müsste man in Zweig 2 einbinden, um das unerwünschte Auslösen zu unterbinden?
Internals:
DEF ([TV1:power] eq "off" and ([?HUEDevice9:state] ne "off" or [?HUEDevice10:onoff] == 1))(set HUEDevice9 off)(set HUEDevice10 off)
DOELSEIF ([TV1:power] eq "on")()
NAME DOIF_stopTV1
NR 381
NTFY_ORDER 50-DOIF_stopTV1
STATE Keine Aktion notwendig
TYPE DOIF
READINGS:
2018-03-17 01:43:37 Device TV1
2018-03-17 01:43:37 cmd 2
2018-03-17 01:43:37 cmd_event TV1
2018-03-17 01:43:37 cmd_nr 2
2018-03-17 01:43:37 e_TV1_power off
2018-03-13 03:46:47 mode enabled
2018-03-17 01:43:37 state Keine Aktion notwendig
2018-03-16 15:29:04 wait_timer no timer
Regex:
condition:
0 ReadingValDoIf($hash,'TV1','power') eq "off" and (ReadingValDoIf($hash,'HUEDevice9','state') ne "off" or ReadingValDoIf($hash,'HUEDevice10','onoff') == 1)
1 ReadingValDoIf($hash,'TV1','power') eq "on"
devices:
0 TV1
1 TV1
all TV1
do:
0:
0 set HUEDevice9 off
1 set HUEDevice10 off
1:
0
2:
helper:
DOIF_Readings_events
DOIF_eventas
event power: off,off
globalinit 1
last_timer 0
sleepdevice TV1
sleepsubtimer -1
sleeptimer -1
timerdev TV1
timerevent ci_durationSec: -,ci_tripletStr: -,ci_startDateTime: -,channel: -,channelId: -,currentTitle: -,input: -
triggerDev TV1
timerevents:
ci_durationSec: -
ci_tripletStr: -
ci_startDateTime: -
channel: -
channelId: -
currentTitle: -
input: -
timereventsState:
ci_durationSec: -
ci_tripletStr: -
ci_startDateTime: -
channel: -
channelId: -
currentTitle: -
input: -
triggerEvents:
power: off
off
triggerEventsState:
power: off
state: off
internals:
itimer:
readings:
0 TV1:power
1 TV1:power
all TV1:power
trigger:
uiState:
uiTable:
Attributes:
cmdState TV-Lampen ausschalten|Keine Aktion notwendig
do always
room Multimedia
wait 120,0:0
Deine Bedingung für das DOIF ist nicht Ereignis sondern Zustands basiert. Meine Vermutung ist das power alle paar Minuten als Event kommt. Das muss vom DOIF aufgefangen und dann der Zustand überprüft werden.
Eventuell fehlt event-on-change-reading beim TV Device.
Oder einfach DOELSE () draus machen.
Mit dem Handy online, daher kurz gefasst...
@CoolTux
Das Attribut event-on-change-reading bei TV1 wird bereits verwendet; daher hatte ich in #0 geschrieben:
Zitat
Im Event-Monitor gibt es übrigens auch kein Event zum power-Reading, da via Attribut Events bei TV1 nur bei Änderung eines Zustandes ausgelöst werden.
Bislang dachte ich:
- [...] enthält z.B. ein Reading, zu dem es aktuell ein Ereignis gibt
- [?...] enthält z.B. ein Reading, dass nur ausgewertet wird - unabhängig von einem Ereignis und egal ob geändert oder nicht
Wie müsste die Bedingung zum power-Reading denn lauten, um dieses ereignisbasiert zu definieren?
@Frank_Huber
Bei einem DOELSE würde ich doch die Bedingung verlieren, dass die TV-Lampen nur bei "unmittelbarem" Wiedereinschalten des TV nicht ausgeschaltet werden.
Sie würden dann bei jedem Folgeereignis (z.B. auch dem kompletten Abschalten des TV - also stromlos machen --> presence-Reading) nicht mehr ausgeschaltet.
Und ein Logeintrag würde doch durch DOELSE auch nicht verhindert, oder?
Gib mal bitte ein list vom TV
Aber ich behaupte Mal das Verhalten ist normal, ist bestimmt nur noch keiner auf die Idee gekommen ein DOIF so zu loggen. ;D
Internals:
CHANGED
CHANNELCOUNT 50
DEF 192.168.179.81
INTERVAL 45
NAME TV1
NR 228
STATE absent
TYPE BRAVIA
generation
model
name
READINGS:
2018-01-31 14:33:04 area DEU
2018-03-14 19:28:59 authCookie 1234567890123456789012345678901234567890123
2018-03-14 19:28:59 authExpires Mi., 28 März 2018 18:28:56 GMT+00:00
2018-01-31 14:32:47 authMaxAge 1209600
2018-03-17 01:43:37 channel -
2018-03-17 01:43:37 channelId -
2018-03-17 01:43:37 ci_durationSec -
2018-03-17 01:43:37 ci_startDateTime -
2018-03-17 01:43:37 ci_tripletStr -
2018-01-31 14:33:04 country XEU
2018-03-04 09:03:36 currentMedia -
2018-03-17 01:43:37 currentTitle -
2018-01-31 14:33:04 generation 3.9.0
2018-03-17 01:43:37 input -
2018-01-31 14:33:04 language ger
2018-01-31 14:33:04 macAddr 11:22:33:44:55:66
2018-01-31 14:33:04 model KD-43X8309C
2018-03-13 19:33:05 mute off
2018-01-31 14:33:04 name BRAVIA
2018-03-17 01:43:37 power off
2018-03-17 08:49:50 presence absent
2018-01-31 14:32:32 registrationUUID 08148c17be56c3c973ac711234567890
2018-02-06 19:02:47 requestFormat json
2018-03-17 08:49:50 state absent
2018-03-16 21:35:21 uri tv:dvbs?trip=1.1107.17500&srvName=SAT.1
2018-03-16 23:43:37 volume 12
helper:
ADDRESS 192.168.179.81
AVAILABLE 0
HEADER X-CERS-DEVICE-ID: fhem_remote
lastInput tv:dvbs
PORT:
IRCC 80
SERVICE 80
UPNP 52323
device:
appPreset:
500px:
uri com.sony.dtv.sonyselect-e20c74d9c4c824d97dfa921dfa107f966bd3947f
..........
watchmi#Themenkanäle:
uri com.sony.dtv.ceb-5128
channelPreset:
0003:
id 0003
name RTL#Television
uri tv:dvbs?trip=1.1089.12003&srvName=RTL Television
........
7454:
id 7454
name INFO#TECHNIQUE
uri tv:dvbs?trip=1.1098.9204&srvName=INFO TECHNIQUE
inputPreset:
AV#1:
uri extInput:scart?port=1
..................
TV#/#DVB-T:
uri tv:dvbt
Attributes:
devStateIcon on:rc_GREEN:off off:rc_YELLOW:on absent:rc_STOP:on
event-on-change-reading .*
group TV
icon it_television
room Multimedia
webCmd volume:channelUp:channelDown
Sieht okay aus. Eventuell kann Damian noch was dazu sagen.
Das DOIF Modul reagiert bei der Angabe von Readings der Art [<device>:<reading>] auf alle Events von <device>.
Das kann man mit https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent auf Events des Readings beschränken.
Dieses Verhalten soll zukünftig standardmäßig gesetzt sein https://forum.fhem.de/index.php/topic,82523.0.html
War mir doch gleich so. Danke Dir.
Vielen Dank schon mal für die Aufklärung.
Das Attribut ist wohl bei der Fülle der Informationen zum DOIF "durchgerutscht".
Ich habe es jetzt mal gesetzt und werde das Logging-Verhalten beobachten.