in fhemweb sichtbare devices finden

Begonnen von justme1968, 07 Februar 2014, 12:56:00

Vorheriges Thema - Nächstes Thema

justme1968

zur abwechslung mal ein neuer thread statt einen der beiden alten weiter verwenden :).

noch mal zum hintergrund: ich versuche eine übersicht über die gerade in wen frontend angezeigten devices zu bekommen.

die anwendung dafür war anfangs nur die optimierung der readingGroup um die notifys vorzeitig abzubrechen wenn die in frage kommende readingsGroup gerade nicht angezeigt wird. ein zweiter anwendungsfall wäre beim eingeschränkten web zugriff nur die devices zu schalten die auch gerade sichtbar sind und so die url manipulation zu unterbinden.

da es leider inzwischen nicht mehr möglich ist in der FW_summaryFn und FW_detailFn die aktuelle temporäre fhemweb instanz zu merken und später zur auswertung zu verwenden habe ich vor auf etwas in dieser art auszuweichen:sub
FW_visibleDevices(;$)
{
  my($FW_wname) = @_;

  my %devices = ();
  foreach my $d (sort keys %defs) {
    next if( !defined($defs{$d}) );
    my $h = $defs{$d};
    next if( !$h->{TEMPORARY} );
    next if( $h->{TYPE} ne "FHEMWEB" );
    next if( defined($FW_wname) && $h->{SNAME} ne $FW_wname );

    next if( !defined( $h->{inform} ) );

    @devices{ keys %{$h->{inform}->{devices}} } = values %{$h->{inform}->{devices}};
  }
}


genau diese liste könnte man in FW_fC an Analyze.* weitergeben und dann im devspec2array von CommandSet verwenden um alles was nicht sichtbar ist (also auch hiddenroom/hiddengroup) zu verbieten.

für diesen zweiten fall sollte es keinerlei performance probleme geben. das zusammensuchen würde ja nur direkt bei einem interaktiven set für eine bestimmte fhemweb instanz ausgeführt und auch nur wenn es hiddenroom/hiddengroup gibt.

im ersten fall um die notifys zu optimieren ist es aber nicht sinnvoll das zusammensuchen der sichtbaren devices immer wieder zu machen. hier wäre es optimal das nur zu tun wenn sich an der inform liste irgendetwas ändert und das ergebnis zu cachen. hier reicht auch eine einzige globale übersicht.

hast du eine idee wie man das vernünftig hin bekommt?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Verstehe ich dich richtig, du willst eine globale Variable mit allen informs zusammen?
Ich haette nichts dagegen. Vielleicht sollte FW_wname in FW_visibleDevices optional sein.

justme1968

ja. für die optimierung der notifys wären alle informs (instanz übergreifend) zusammen perfekt.

das FW_wname ist doch optional. eben genau für den zweiten einsatz zweck beim eingeschränkten web zugriff. da interessieren mich genau die informs die zu einer bestimmten fhemweb instanz gehören. hier übergebe ich den namen und kann dann alle devices ausschließen die in dieser instanz gerade nicht sichtbar sind also auch die mit hiddenroom/hiddengroup versteckten. hier muss auch nichts global oder gecached sein.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Habe deine Funktion eingebaut, mit einem return %devices; zum Schluss (ohne habe ich mich unwohl gefuehlt).
Die globale Variable heisst %FW_visibleDeviceHash, und wird bei inform Anforderungen angepasst.
Da es noch von niemandem verwendet wird, sollte es auch nicht stoeren.

justme1968

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

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

justme1968

ich hab gerade noch ein kleines problem bemerkt: wenn man das browser fenster schließt (d.h. eine der temporären web instanzen beendet wird) wird %FW_visibleDeviceHash nicht neu gefüllt.

das gleiche gilt wenn man in den event monitor wechselt. ich hab aber noch nicht geschaut ob es eventuell daran liegt das der event monitor ein inform auf alle devices aktiviert.

wenn man zwischen räumen wächselt funktioniert alles.

falls du auf die schnelle weisst wie du das mit dem schließen fixen kannst wäre es schon :) ansonsten such ich und schick dir einen patch.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Ich habe in FW_Undef auch FW_visibleDevices aufgerufen. Ist etwas teuer, da FF & co beim Seitenaufbau gerne 6 Verbindungen aufmachen, die dann alle auf einem Schlag geschlossen werden, und damit diese Funktion 5-mal unnoetig aufgerufen wird. Es faellt mir aber nichts wirklich elegantes dazu ein.

justme1968

könnte man es an der longpoll verbindung fest machen und so die temporären verbdinungen beim seitenaufbau von der 'echten' verbindung unterscheiden?

d.h. das FW_visibleDevices im FW_Undef nur nur aufrufen wenn der longpoll type für diese connection raw war.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Gute Idee, habs eingebaut, scheint zu funktionieren.