longpollfilter für FLOORPLAN manipulieren

Begonnen von nesges, 30 Januar 2015, 15:47:04

Vorheriges Thema - Nächstes Thema

nesges

Update: longpollfilter wurde mittlerweile im Floorplan angepasst, sodass die hier gezeigte Methode nur noch benötigt wird, wenn tatsächlich auf einen Raum (oder ein anderes Attribut) gefiltert werden soll. Näher Infos zur Floorplan-Änderung unter http://forum.fhem.de/index.php/topic,33057.0.html.



Um die Last durch longpoll in Floorplans zu mindern habe ich testweise folgendes gebaut. Eine Datei www/filter/50_Wohnzimmer.js:
$(function() {
    $("body").attr("longpollfilter", "room=50%20Wohnzimmer");
});


Damit wird das Attribut longpollfilter, das von fhemweb.js gelesen wird, auf einen Raum gesetzt. Im Beispiel heisst der Raum "50 Wohnzimmer" (urlencoded). Das Javascript-File wird in den Floorplan eingebunden (ich liste nur die wesentlichen Attribute):

define WOHNZIMMER FLOORPLAN
attr WOHNZIMMER JavaScripts filter/50_Wohnzimmer.js


und die Definitionen der auf dem Floorplan angezeigten Devices werden angepasst:

define R_W_XBMC readingsGroup W_XBMC:state
attr R_W_XBMC fp_WOHNZIMMER 30,54,0,
attr R_W_XBMC room 50 Wohnzimmer
attr R_W_XBMC group hidden


Wichtig: Dran denken, dass Devices, die bisher evtl. im Raum "hidden" untergebracht waren, verschoben werden müssen. Dazu bietet sich die Verwendung einer hiddengroup (attr WEB hiddengroup hidden) oder weiterer hiddenrooms an.

In der Javascript-Console hört man jetzt weitest gehend Grillenzirpen, die longpoll-Updates funktionieren aber weiterhin. Ist diese Lösung noch im Sinne der Erfinder, oder begebe ich mich damit auf zu dünnes Eis?

justme1968

#1
ich denke es ist besser

dem floorplan modul einen kleinen patch zu verpassen das den filter automatisch auffp_$FP_name=.+setzt.

dann wären ohne handarbeit automatisch alle devices die auf einem bestimmten floorplan zu sehen sind im filter enthalten.

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

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

justme1968

versuch mal in 95_FLOORPLAN.pm die zeile 428 so zu ändern:FW_pO "</head>\n<body name=\"$title\" longpollfilter=\"fp_$FP_name=.+\" $gen $lp $csrf>";und schau ob der filter dann passend gesetzt wird.

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

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

nesges

Wird zwar übernommen und auf der JS-Console angezeigt:

16:26:14.757 Longpoll with filter fp_LCARS_R_BUERO_HEIZUNG=.+

Aber es kommen keine longpoll-Events mehr an.

justme1968

geht es wenn du den fp_... filter in dein js file steckst?
oder wenn du umgekehrt room=50%20Wohnzimmer in zeile 428 einbaust?

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

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

nesges

Ich hab grade mal alle Fälle durchgespielt:

room= in Javascript:
18:08:00.714 Longpoll with filter room=50%20Wohnzimmer
Filter ok, nur Events von Devices im room.

Standard (kein Javascript, keine Änderung am Floorplan):
18:08:20.578 Longpoll with filter .*;iconPath=LCARS_R_WOHNZIMMER_LICHT
Events von allen Devices

room= in 95_FLOORPLAN.pm:
18:09:34.529 Longpoll with filter room=50%20Wohnzimmer
Filter ok

fp_LCARS_R_WOHNZIMMER_LICHT=.+ in Javascript:
18:12:57.391 Longpoll with filter fp_LCARS_R_WOHNZIMMER_LICHT=.+
Keine Events

Also gleiches Ergebnis, wenn ich den fp_-Filter direkt ins Javascript setze. Ich nehme an, der Filter wird von fhemweb.js so einfach nicht akzeptiert, aber durch fhemweb.js bin ich noch nicht durchgestiegen. Offenbar ist mit dem iconPath-Filter ein Extra für die Floorplans vorgesehen, allerdings bemerke ich keine Wirkung. In dem Fall kommen auch Events von Devices die weder im gleichen Raum, noch auf dem Floorplan sind. Ist das evtl. ein Bug? Ich hätte jetzt vermutet, dass das ".*;" darin einfach zu viel ist, aber wenn ich den Filter ohne ".*;" ins Javascript-File übernehme:

18:18:27.944 Longpoll with filter iconPath=LCARS_R_WOHNZIMMER_LICHT

kommen wieder keine Events an. Das ist jetzt aber Stochern im Dunkeln - ne Doku zum longpollfilter hab ich nicht gefunden. Gibt's da evtl. was?

justme1968

der filter gibt an von welchen devices die events durch gelassen werden. der filter wird auf fhemweb bzw. perl seite angewendet. die js seite verbindet sind zu fhemweb und sendet den filter zum abonnieren der events.

.* heisst für alle devices
room=... heisst nur für devices in einem bestimmten room. das ist passend für das normale fhemweb frontend.
fp_LCARS_R_WOHNZIMMER_LICHT=.+ heisst alle devices bei denen das fp_LCARS_R_WOHNZIMMER_LICHT etwas enthält

das eigentliche problem ist vielleicht ein ganz anderes. das + ist ein reserviertes zeichen und muss eventuell maskiert werden.

versuch mal die zeile so zu ändern:FW_pO "</head>\n<body name=\"$title\" longpollfilter=\"fp_$FP_name=.%2B\" $gen $lp $csrf>";oderFW_pO "</head>\n<body name=\"$title\" longpollfilter=\"fp_$FP_name=..*\" $gen $lp $csrf>";

du kannst auch beide versionen noch mal mit js testen.

wenn du auf fhem seite verbose 5 setzt müsstest du sehen was vom browser ankommt und worauf der filter gesetzt wird.

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

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

nesges

Danke für die Erläuterung, das klingt logisch. Bin jetzt leider nicht mehr daheim, teste und melde mich mit morgen dazu.

nesges

Zitat von: justme1968 am 30 Januar 2015, 18:44:47
das eigentliche problem ist vielleicht ein ganz anderes. das + ist ein reserviertes zeichen und muss eventuell maskiert werden.

Genau das war's. Zeile 428ff:
  my $FP_name_uri=$FP_name;
  $FP_name_uri =~ s/:/%3/g;
  FW_pO "</head>\n<body name=\"$title\" longpollfilter=\"fp_$FP_name_uri=.%2B\" $gen $lp $csrf>";


Das funktioniert bestens. Herrliche Ruhe in der JS-Console, aber die richtigen Events kommen an :) Dann ist nur noch die Frage ob der ursprüngliche Filter ein Bug ist, oder ob wir ein Feature übersehen. Vielen Dank soweit!

PS: Da Device-Namen nur [A-Za-z0-9.:_] enthalten dürfen, reicht die Substitution des Doppelpunkts um eine Abhängigkeit von URI::Escape zu vermeiden.

justme1968

kannst du noch mal die ..* version probieren?

wenn alles geht und ulim das hier sieht scheckt er es bestimmt ein.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

nesges

Die ..* Variante hatte ich gestern auch probiert, funktioniert genauso gut.
Ich hatte gestern Nacht noch nen Hinweis auf unsere Diskussion im Frontend-Forum gepostet, UliM prüft schon :-)