FHEM teils unfassbar langsam

Begonnen von FHEM-Tester, 02 Juli 2025, 13:12:09

Vorheriges Thema - Nächstes Thema

FHEM-Tester

Hallo liebe FHEM Gemeinde,

ich bin schon länger dabei herauszufinden wieso mein FHEM teils so ultra langsam ist. Wirklich etwas gefunden habe ich trotz Freezemon & apptime noch nicht :-(

Allerdings ist mir aufgefallen, daß FHEMWEB bei meinem FHEM warum auch immer z.B. devStateIcon 6x aufruft, während es die Seite aufbauen will. Das ist natürlich schon mal ziemlich suboptimal, denn teils habe ich da viel Code drin und wenn das 6x aufgerufen wird, dann erklärt sich natürlich warum das zumindest teils sehr langsam ist.

Ich habe daraufhin ein nacktes FHEM aufgesetzt (wo das Problem nicht auftritt) und habe nach und nach Module mit eingebaut, was ich in meinem produktiven FHEM auch habe, kann das Problem im neu aufgesetzten FHEM jedoch nicht reproduzieren.

Bevor ich nun noch weitere Wochen Zeit investiere dachte ich mir, ich könnte ja auch mal hier fragen. Evtl. hat irgendjemand irgendeine Idee oder Hinweis was hier schief läuft.

Ich habe in fhem.pl und 01_FHEMWEB.pm ein paar Debug Zeilen eingebaut damit man sieht was passiert.

Hier ein Beispiel Device (ganz simples dummy)

define dummy_TEST dummy
attr dummy_TEST devStateIcon {\
    Log3 $name, 3, "$name: DEBUG> devStateIcon Aufruf";;\
\
    return ("<div>return devStateIcon</div>", 'noFhemwebLink');;\
}
attr dummy_TEST event-on-update-reading .*
attr dummy_TEST setExtensionsEvent 1
attr dummy_TEST stateFormat {\
    Log3 $name, 3, "$name: DEBUG> stateFormat Aufruf";;\
\
    return 'stateFormat';;\
}
attr dummy_TEST useSetExtensions 1
attr dummy_TEST verbose 4
#  FUUID      66194367-f33f-3b48-b587-2da684cfdb11f94a
#  FVERSION  98_dummy.pm:0.256060/2022-02-01
#  NAME      dummy_TEST
#  NR        54
#  STATE      stateFormat
#  TYPE      dummy
#  READINGS:
#    2025-06-28 19:34:33  state          off
#
setstate dummy_TEST stateFormat
setstate dummy_TEST 2025-06-28 19:34:33 state off


hier der Debug Auszug wo das Problem nicht auftritt:

2025.07.02 11:09:53 1: DEBUG> DoSet called by FW_fC:2901
2025.07.02 11:09:53 1: DEBUG>            Cmd: attr dummy_TEST verbose 4
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> CallFn called by CommandAttr:3263
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:09:53 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:09:53 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> FW_doDetail called by FW_answerCall:1225
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> FW_makeDeviceLine -> FW_devState
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> FW_devState called by FW_makeDeviceLine:1982
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:09:54 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> getAllSets called by FW_doDetail:1624
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:09:54 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993
2025.07.02 11:09:54 1: DEBUG> DoSet called by AnalyzeCommandChain:1136
2025.07.02 11:09:54 1: DEBUG>            Cmd: {AttrVal("dummy_TEST","room","")}
2025.07.02 11:09:54 1: DEBUG> calledFromChain: ACC


und hier der Debug Auszug von meinem produktiven FHEM wo das Problem existiert:

2025.07.02 11:10:43 1: DEBUG> DoSet called by FW_fC:2901
2025.07.02 11:10:43 1: DEBUG>            Cmd: attr dummy_TEST verbose 4
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by CommandAttr:3263
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:43 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:43 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:43 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:43 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:43 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify called by CallFn:4067
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_devState called by FW_Notify:3356
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:43 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:  allSet:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: cmdlist:
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState:    txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data    $h->{fmt}: JSON
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $dn: dummy_TEST
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data $dev->{STATE}: no definition
2025.07.02 11:10:43 0: dummy_TEST: DEBUG> FW_Notify -> FW_devState: push @data          $txt: <div id="dummy_TEST"  title="stateFormat" class="col2"><div>return devStateIcon</div></div>
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> FW_doDetail called by FW_answerCall:1225
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> FW_makeDeviceLine -> FW_devState
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> FW_devState called by FW_makeDeviceLine:1982
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> getAllSets called by FW_devState:3485
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> FHEMWEB state: stateFormat
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> foreach my state split newline ...
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> Attr devStateIcon exists ...
2025.07.02 11:10:44 3: dummy_TEST: DEBUG> devStateIcon Aufruf
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> getAllSets called by FW_doDetail:1624
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> CommandSet called by getAllSets:2969
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> DoSet called by CommandSet:2046
2025.07.02 11:10:44 0: dummy_TEST: DEBUG> CallFn called by DoSet:1993 with $n: SetFn
2025.07.02 11:10:46 1: DEBUG> DoSet called by AnalyzeCommandChain:1136
2025.07.02 11:10:46 1: DEBUG>            Cmd: {AttrVal("dummy_TEST","room","")}
2025.07.02 11:10:46 1: DEBUG> calledFromChain: ACC

Anstelle von "FW_doDetail called by FW_answerCall:1225" passiert 5x hintereinander warum auch immer "FW_Notify called by CallFn:4067" bis es dann auch final bei "FW_doDetail called by FW_answerCall:1225" landet.

Hat irgendjemand eine Idee, Hinweis etc.?

Was ich gerade oben im kleinen Log sehe, bei einem nackten FHEM wird warum auch immer auch 2x devStateIcon aufgerufen - Naja, alles besser als 7x ;-)

Vielen Dank!

betateilchen

Zitat von: FHEM-Tester am 02 Juli 2025, 13:12:09Allerdings ist mir aufgefallen, daß FHEMWEB bei meinem FHEM warum auch immer z.B. devStateIcon 6x aufruft, während es die Seite aufbauen will. Das ist natürlich schon mal ziemlich suboptimal, denn teils habe ich da viel Code drin und wenn das 6x aufgerufen wird, dann erklärt sich natürlich warum das zumindest teils sehr langsam ist.

Hast Du mal getestet, wie sich die Performance verändert, wenn Du den Code aus dem Attribut in die 99_myUtils.pm auslagerst und in devStateIcon dann nur noch diese Funktion aufrufst?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Würde tippen, dass es nicht an "irgendeinem Modul" liegt, sondern schlicht an der Zahl der Events - bzw. konkreter: der Event-loops, die zu verarbeiten sind - liegt...
Einfach mal eine Zeitlang den Event-Monitor anstarren und schauen, ob das einzelne oder Stapel-Events sind; ganz typische Verursacher sind MQTT(2)-Devices, die unglaublich viele Readings "ständig" aktualisieren, und das über sehr viele Topics (und nicht als Paket per JSON) ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

FHEM-Tester

Hallo betateilchen,

Zitat von: betateilchen am 02 Juli 2025, 13:42:22
Zitat von: FHEM-Tester am 02 Juli 2025, 13:12:09Allerdings ist mir aufgefallen, daß FHEMWEB bei meinem FHEM warum auch immer z.B. devStateIcon 6x aufruft, während es die Seite aufbauen will. Das ist natürlich schon mal ziemlich suboptimal, denn teils habe ich da viel Code drin und wenn das 6x aufgerufen wird, dann erklärt sich natürlich warum das zumindest teils sehr langsam ist.

Hast Du mal getestet, wie sich die Performance verändert, wenn Du den Code aus dem Attribut in die 99_myUtils.pm auslagerst und in devStateIcon dann nur noch diese Funktion aufrufst?
ja, habe ich soeben mal getestet - Ändert weder etwas an der Performance noch an den 6 Durchläufen :-(

rudolfkoenig

Bei mir kommt die Zeile "dummy_TEST: DEBUG> devStateIcon Aufruf" nur einmal je Raum oder Detail-Aufruf, wenn ich das obige Beispiel bei mir einpflege.

devStateIcon wird nur dann ausgewertet, falls gerade ein Browser die betroffene Raeume oder Details anzeigt.
Gibt es auch Probleme bei der Anzeige von "fremden" Raeumen?

Ich wuerde als Naechstes auch pruefen, ob das Problem an der CPU Auslastung liegt (z.Bsp. wegen den vielen Events, s.o.), oder an "leise" blockierenden Aufrufen.

FHEM-Tester

Hallo Beta-User,

Zitat von: Beta-User am 02 Juli 2025, 14:02:40Würde tippen, dass es nicht an "irgendeinem Modul" liegt, sondern schlicht an der Zahl der Events - bzw. konkreter: der Event-loops, die zu verarbeiten sind - liegt...
Einfach mal eine Zeitlang den Event-Monitor anstarren und schauen, ob das einzelne oder Stapel-Events sind; ganz typische Verursacher sind MQTT(2)-Devices, die unglaublich viele Readings "ständig" aktualisieren, und das über sehr viele Topics (und nicht als Paket per JSON) ;) .
hmm, dann wäre es aber, denke ich, ein krasser Design-Fehler, wenn sowas die ganzen Durchläufe verursachen würde ;-)

Aber ich habe es eben auch mal getestet so daß MQTT komplett ruhig ist. Die x Durchläufe bleiben, es werden auch nie weniger und auch nie mehr. Vom Gefühl her würde ich sagen marginal schneller aber eigentlich kein Wow-Effekt. Die Anzahl ändert sich ebenso wenig, wenn ich alles abschalte.

FHEM-Tester

#6
Hallo Rudolf,

Zitat von: rudolfkoenig am 02 Juli 2025, 15:05:44Bei mir kommt die Zeile "dummy_TEST: DEBUG> devStateIcon Aufruf" nur einmal je Raum oder Detail-Aufruf, wenn ich das obige Beispiel bei mir einpflege.

devStateIcon wird nur dann ausgewertet, falls gerade ein Browser die betroffene Raeume oder Details anzeigt.
Gibt es auch Probleme bei der Anzeige von "fremden" Raeumen?

Ich wuerde als Naechstes auch pruefen, ob das Problem an der CPU Auslastung liegt (z.Bsp. wegen den vielen Events, s.o.), oder an "leise" blockierenden Aufrufen.
ok, mein Fehler - Habe mich missverständlich ausgedrückt und nicht explizit drauf hingewiesen:

2025.07.02 11:09:53 1: DEBUG> DoSet called by FW_fC:2901
2025.07.02 11:09:53 1: DEBUG>             Cmd: attr dummy_TEST verbose 4
Dabei tritt das bei mir auf - Bei "nacktem" FHEM 2x, bei meinem Prod-FHEM 7x bzw. EGAL bei was attr, verbose ist nun nur ein Beispiel.

Die Probleme gibt es in jedem Raum oder was meinst Du genau mit "fremden" Räumen?

Beta-User

Zitat von: FHEM-Tester am 02 Juli 2025, 15:07:18Aber ich habe es eben auch mal getestet so daß MQTT komplett ruhig ist. Die x Durchläufe bleiben, es werden auch nie weniger und auch nie mehr. Vom Gefühl her würde ich sagen marginal schneller aber eigentlich kein Wow-Effekt. Die Anzahl ändert sich ebenso wenig, wenn ich alles abschalte.
Hmmm, nach etwas Nachdenken: Der devStateIcon-Code wird mehrfach aufgerufen, wenn stateFormat mehrzeilig ist.

@Rudi:
Das macht eigentlich wenig Sinn, wenn devStateIcon seinerseits Perl ist, oder? Dann ist der Wunsch des Users abschließend evaluiert, wenn das einmalig durch ist. Falls diese Auffassung korrekt ist, müßte FW_dev2image() noch eine weitere Info zurückgeben, damit man die "Mehrzeiler-Schleife" direkt nach dem ersten Durchlauf beendet?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

rudolfkoenig

ZitatHmmm, nach etwas Nachdenken: Der devStateIcon-Code wird mehrfach aufgerufen, wenn stateFormat mehrzeilig ist.
Genauer: devStateIcon wird mehrfach ausgewertet fuer jeden moeglichen Wert (on/off/toggle/etc) in einem mehrzeiligen webCmd.

Fuer die Anzeige ist nur eine einmalige Auswertung notwendig.
Falls ich mich irren sollte: ich brauche Demo.