summaryFn und STATE longpoll für FW_atPageEnd devices

Begonnen von justme1968, 04 Mai 2014, 17:08:08

Vorheriges Thema - Nächstes Thema

justme1968

ich bin mal wieder am summaryFn thema und dem (unnötigen) mehrfach aufruf insbesondere für devices bei denen FW_atPageEnd gesetzt ist.

zum hintergrund: ich bin gerade an einem device das im prinzip ein konfigurierbarer event monitor ist der sich als normales device überall verwenden lässt. die idee dazu kommt aus diesem thread: http://forum.fhem.de/index.php/topic,23148.msg165046.html#msg165046

um nicht für jedes event immer wieder mehrfache events zu erzeugen und nicht jedes mal den ganzen inhalt zu aktualisieren sondern auch im frontend nur die zusätzlichen zeilen anzuhängen arbeitet das ganze im prinzip wie der event monitor und wird per longpoll mit den zusätzlichen zeilen versorgt die dann per js vor den bisherigen Inhalt gehängt werden.

das ganze funktioniert im prinzip. jedenfalls so lange das device nicht in einer gruppe ist. da erscheint plötzlich die erste zeile doppelt. beim genauer nachschauen habe ich dann bemerkt das es scheinbar zufall ist das es im nicht-gruppe fall funktioniert. bzw. das es hier eine race condition gibt.

das triggern meines longpoll eintrags führt dazu das über FW_Notify, FW_devState und FW_summaryFn die summaryFn meines moduls aufgerufen wird die dann per longpoll und STATE die komplette tabelle mit allen zeilen überschreibt und danach kommt erst meine eine zeile die davor gehängt wird -> die erste zeile ist doppelt.

die komplette kette läuft auch ab wenn das device nicht in einer gruppe ist. dann greift aber das update nicht weil informId nicht gesetzt ist. -> es schaut alles ok aus.

in beiden fällen wird aber FW_summaryFn aufgerufen (ich glaube sogar zwei mal) und das ganze per socket zum browser geschickt. alles völlig überflüssig. kein atEnd hat ein icon. deshalb schlage ich vor den aufruf von FW_devState und das pushen von STATE in der FW_Notify für alle atEnd devices weg zu lassen. ich habe bei meinen ersten tests keine nebeneffekte bemerkt. die atEnd devices haben wie gesagt kein icon:
--- /Users/andre/fhem-code/fhem/FHEM/01_FHEMWEB.pm 2014-05-01 17:23:15.000000000 +0200
+++ 01_FHEMWEB.pm 2014-05-04 17:03:40.000000000 +0200
@@ -2142,9 +2142,11 @@
       FW_readIcons($h->{iconPath});
     }

-    my ($allSet, $cmdlist, $txt) = FW_devState($dn, "", \%extPage);
-    ($FW_wname, $FW_ME, $FW_ss, $FW_tp, $FW_subdir) = @old;
-    push @data, "$dn<<$dev->{STATE}<<$txt";
+    if( !$modules{$defs{$dn}{TYPE}}{FW_atPageEnd} ) {
+      my ($allSet, $cmdlist, $txt) = FW_devState($dn, "", \%extPage);
+      ($FW_wname, $FW_ME, $FW_ss, $FW_tp, $FW_subdir) = @old;
+      push @data, "$dn<<$dev->{STATE}<<$txt";
+    }

     #Add READINGS
     if($events) {    # It gets deleted sometimes (?)


oder alternativ eine möglichkeit wie ich das für bestimmte device abschalten kann. z.b. wenn $hash->{STATE} nicht gesetzt ist.

das das unterschiedliche verhalten (mit und ohne gruppen Zugehörigkeit) bis jetzt noch nicht aufgefallen ist zeigt denke ich auch das das ergebnis des FW_devState aufrufs für die atEnds nicht weiter verwendet wird und der aufruf eigentlich überflüssig ist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Habs eingecheckt, schauen wir mal, ob es Nebeneffekte hat :)