[Gelöst] - Auslösen nur bei passendem Ereignis oder bei jedem Ereignis?

Begonnen von OdfFhem, 17 März 2018, 07:47:29

Vorheriges Thema - Nächstes Thema

OdfFhem

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

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Frank_Huber

Oder einfach DOELSE () draus machen.

Mit dem Handy online, daher kurz gefasst...


OdfFhem

@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?

OdfFhem

@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?

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

OdfFhem


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


CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

OdfFhem

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.