DOIF verursacht sehr viele freezes [gelöst]

Begonnen von WhyTea, 01 August 2023, 16:38:54

Vorheriges Thema - Nächstes Thema

WhyTea

Hallo
Da ich aktuell aus einem anderen Grund in meinem Fhem auf fehlersuche bin, bin ich hier rüber gestolpert.
Ich nutze freezemon und dort ist mir aufgefallen das eines meiner DOIFs sehr viele freezes verursacht.
2023-07-30 [Log]: s:12:07:37 e:12:07:39 f:2.802 d:tmr-DOIF_SleepTrigger(di.hyperion_schalter) Device    Count    Time
di.hyperion_schalter    428    1185.151

Natürlich sehe ich das nicht als Fhleverhalten sondern als Fehler meinerseits wobei das DOIF ansonsten genau das tut was es soll.

Hier ist die definition des DOIFs:

defmod di.hyperion_schalter DOIF (([EG_WZ_AV_Receiver:state] eq "on") and ([?WOL_Shutdown_hyperion:state] eq "off"))\
                                ({Log 3, "AV_Receiver ist an: Hyperion gestartet"}, set WOL_Shutdown_hyperion on)\
                            DOELSEIF (([EG_WZ_AV_Receiver:state] eq "off") and ([?WOL_Shutdown_hyperion:state] eq "on"))\
                                ({Log 3, "AV_Receiver ist seit 5 Minuten aus: Hyperion ausgeschaltet"}, set WOL_Shutdown_hyperion off)
attr di.hyperion_schalter DbLogExclude .*
attr di.hyperion_schalter cmdpause 180:180
attr di.hyperion_schalter room Erdgeschoss->Wohnzimmer
attr di.hyperion_schalter wait 0:300

setstate di.hyperion_schalter cmd_1
setstate di.hyperion_schalter 2023-08-01 16:35:26 Device EG_WZ_AV_Receiver
setstate di.hyperion_schalter 2023-08-01 15:50:13 cmd 1
setstate di.hyperion_schalter 2023-08-01 15:50:13 cmd_event EG_WZ_AV_Receiver
setstate di.hyperion_schalter 2023-08-01 15:50:13 cmd_nr 1
setstate di.hyperion_schalter 2023-08-01 16:35:26 e_EG_WZ_AV_Receiver_state on
setstate di.hyperion_schalter 2022-09-22 12:06:42 e_WOL_Shutdown_hyperion_STATE off
setstate di.hyperion_schalter 2023-06-06 08:52:23 e_WOL_Shutdown_hyperion_state off
setstate di.hyperion_schalter 2023-06-06 08:53:31 mode enabled
setstate di.hyperion_schalter 2023-08-01 15:50:13 state cmd_1
setstate di.hyperion_schalter 2023-08-01 12:31:01 wait_timer no timer

und ein list:
Internals:
   CFGFN      /var/fhem/FHEM/EG_Wohnzimmer.cfg
   DEF        (([EG_WZ_AV_Receiver:state] eq "on") and ([?WOL_Shutdown_hyperion:state] eq "off"))
                                ({Log 3, "AV_Receiver ist an: Hyperion gestartet"}, set WOL_Shutdown_hyperion on)
                            DOELSEIF (([EG_WZ_AV_Receiver:state] eq "off") and ([?WOL_Shutdown_hyperion:state] eq "on"))
                                ({Log 3, "AV_Receiver ist seit 5 Minuten aus: Hyperion ausgeschaltet"}, set WOL_Shutdown_hyperion off)
   FUUID      632c0cf9-f33f-a5a6-d914-b4fcb0219f0cb9a8
   MODEL      FHEM
   NAME       di.hyperion_schalter
   NOTIFYDEV  EG_WZ_AV_Receiver,global
   NR         704
   NTFY_ORDER 50-di.hyperion_schalter
   STATE      cmd_1
   TYPE       DOIF
   VERSION    27740 2023-07-10 09:31:11
   eventCount 125
   READINGS:
     2023-08-01 16:33:46   Device          EG_WZ_AV_Receiver
     2023-08-01 15:50:13   cmd             1
     2023-08-01 15:50:13   cmd_event       EG_WZ_AV_Receiver
     2023-08-01 15:50:13   cmd_nr          1
     2023-08-01 16:33:46   e_EG_WZ_AV_Receiver_state on
     2022-09-22 12:06:42   e_WOL_Shutdown_hyperion_STATE off
     2023-06-06 08:52:23   e_WOL_Shutdown_hyperion_state off
     2023-06-06 08:53:31   mode            enabled
     2023-08-01 15:50:13   state           cmd_1
     2023-08-01 12:31:01   wait_timer      no timer
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       EG_WZ_AV_Receiver:
         0:
           state      ^EG_WZ_AV_Receiver$:^state:
         1:
           state      ^EG_WZ_AV_Receiver$:^state:
   attr:
     cmdState:
     cmdpause:
       180
       180
     wait:
       0:
         0
       1:
         300
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'EG_WZ_AV_Receiver','state') eq "on") and (::ReadingValDoIf($hash,'WOL_Shutdown_hyperion','state') eq "off")
     1          (::ReadingValDoIf($hash,'EG_WZ_AV_Receiver','state') eq "off") and (::ReadingValDoIf($hash,'WOL_Shutdown_hyperion','state') eq "on")
   devices:
   do:
     0:
       0          {Log 3, "AV_Receiver ist an: Hyperion gestartet"}, set WOL_Shutdown_hyperion on
     1:
       0          {Log 3, "AV_Receiver ist seit 5 Minuten aus: Hyperion ausgeschaltet"}, set WOL_Shutdown_hyperion off
     2:
   helper:
     NOTIFYDEV  EG_WZ_AV_Receiver,global
     event      power: on,on,volumeStraight: -45,volume: 36,mute: off,input: hdmi1,inputName: FireTV,straight: on,enhancer: on,dsp: 5chstereo,3dCinemaDsp: auto,adaptiveDrc: auto,sleep: off,direct: off
     globalinit 1
     last_timer 0
     sleepdevice EG_WZ_AV_Receiver
     sleepsubtimer -1
     sleeptimer -1
     timerdev   EG_WZ_AV_Receiver
     timerevent power: on,on,volumeStraight: -45,volume: 36,mute: off,input: hdmi1,inputName: FireTV,straight: on,enhancer: on,dsp: 5chstereo,3dCinemaDsp: auto,adaptiveDrc: auto,sleep: off,direct: off
     triggerDev EG_WZ_AV_Receiver
     bm:
       DOIF_Get:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        01.08. 16:24:49
         max        6.81877136230469e-05
         tot        7.31945037841797e-05
         mAr:
           HASH(0x558c3918f1c0)
           di.hyperion_schalter
           ?
       DOIF_Notify:
         cnt        87740
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        31.07. 14:40:54
         max        0.103195905685425
         tot        51.3594393730164
         mAr:
           HASH(0x558c3918f1c0)
           HASH(0x558c38f9bcb0)
       DOIF_Set:
         cnt        331
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        31.07. 11:36:36
         max        0.000372171401977539
         tot        0.0158450603485107
         mAr:
           HASH(0x558c3918f1c0)
           di.hyperion_schalter
           ?
     timerevents:
       power: on
       on
       volumeStraight: -45
       volume: 36
       mute: off
       input: hdmi1
       inputName: FireTV
       straight: on
       enhancer: on
       dsp: 5chstereo
       3dCinemaDsp: auto
       adaptiveDrc: auto
       sleep: off
       direct: off
     timereventsState:
       power: on
       state: on
       volumeStraight: -45
       volume: 36
       mute: off
       input: hdmi1
       inputName: FireTV
       straight: on
       enhancer: on
       dsp: 5chstereo
       3dCinemaDsp: auto
       adaptiveDrc: auto
       sleep: off
       direct: off
     triggerEvents:
       power: on
       on
       volumeStraight: -45
       volume: 36
       mute: off
       input: hdmi1
       inputName: FireTV
       straight: on
       enhancer: on
       dsp: 5chstereo
       3dCinemaDsp: auto
       adaptiveDrc: auto
       sleep: off
       direct: off
     triggerEventsState:
       power: on
       state: on
       volumeStraight: -45
       volume: 36
       mute: off
       input: hdmi1
       inputName: FireTV
       straight: on
       enhancer: on
       dsp: 5chstereo
       3dCinemaDsp: auto
       adaptiveDrc: auto
       sleep: off
       direct: off
   internals:
   perlblock:
   readings:
     all         EG_WZ_AV_Receiver:state
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   cmdpause   180:180
   room       Erdgeschoss->Wohnzimmer
   wait       0:300

Ich würde mich über Optimierungsvorschläge sehr freuen!

Gruß und Danke
Daniel

Damian

Dann nimm erstmal den set WOL_Shutdown_hyperion-Befehl jeweils raus und schaue noch mal. Wenn es besser aussieht, dann weißt du schon mal woher es kommt, sonst kannst du weiter abspecken.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WhyTea

Verstehe ich das dann richtig, dass das DOIF erst beendet ist wenn alle ausgelösten Befehle beendet sind? Und so lange wird Fhem blockiert?

So ein WOL dauert ja nun mal. Das Gegenteil dauert ja sogar noch länger sprich per ssh ein shutdown ausgelöst wird.

Damian

Zitat von: WhyTea am 02 August 2023, 11:51:47Verstehe ich das dann richtig, dass das DOIF erst beendet ist wenn alle ausgelösten Befehle beendet sind? Und so lange wird Fhem blockiert?

So ein WOL dauert ja nun mal. Das Gegenteil dauert ja sogar noch länger sprich per ssh ein shutdown ausgelöst wird.

So ist das. FHEM ist single-threaded. Wenn WOL keinen Fork macht, dann muss das Modul warten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WhyTea

Vielen Dank! Damit erklärt sich alles und ich muss damit leben.  ;)