Hallo,
ich habe so ca. 12x Fälle, bei denen ich den gesamten Scrren neu aufbaue, weil sich z.B. eine Darstellung auf Grund einer Benutzeraktion (z.B. Umschaltung Ansicht von normal auf Fachmann) oder dynamisch auf Grund von Werteänderungen eines Gerätes (z.B. Sonos) sich die Darstellung ändert.
Das mache ich mit:
fhem("trigger WEB.* JS:location.reload(true)");
Da ich eine WEB, WEBtablet und eine WEBphone - Instanz habe ist oben der Wildcard hinter dem WEB.
Nun werden alle offene Browser-Instanzen auf allen Geräten aktualisiert, egal ob sie überhaupt die entsprechende Raum-Seite anzeigen oder nicht. Das führt leider manchmal zu ungewünschten Effekten: Wenn z.B. gerade in einem Browser-Fenster eine fhem-Datei editiert wird, sind die Änderungen nach dem zwangsweisen Refresh (reload) der Seite weg. Mist, Arbeit von 30 Minuten futsch.
Weitere Nachteile auf Grund des Reloads:
a) zusätzliche Last, da der an alle Instanzen geht. Und da scheinen in fhem auch noch jene vorhanden zu sein, deren PCs aktuell nicht erreichbar sind
b) Der Fokus springt wieder auf den Anfang der Seite.
Nun meine Frage:
Besteht die Möglichkeit, den Aufruf
fhem("trigger WEB.* JS:location.reload(true)");
so zu modifizieren, dass nur die Browser einen "reload" ausführen, die gerade auch die betroffene Raumansicht anzeigen?
Oder könnte man das ev. irgendwie so erweitern?
Die Information, welches Browserfenster welche Raumansicht anzeigt, muss ja intern in fhem schon vorhanden sein, da ansonsten ja longpoll nicht funktionieren könnte.
Elektrolurch
Hallo Elektrolurch,
ganz so einfach geht das leider nicht. Man muss ja unterscheiden zwischen Verbindungen, die aufgebaut werden um die Seite zu laden (z.B. Raumübersicht, Floorplan, etc.) und longpoll-Verbindungen. Die Verbindungen um eine Seite zu laden werden aufgemacht, der Content wird übertragen und anschließend direkt wieder zugemacht. Hier merkt sich FHEM den Raum nur für die Dauer in der der HTML-Output erzeugt wird. Bei longpoll-Verbindungen gibt es aktuell keine Zuordnung zu der Seite auf der diese Verbindung geöffnet wurde. Man sieht lediglich den Devspec-Filter und kann daraus ableiten ob es sich um eine Detail-Seite oder Raumübersicht oder sonstiges handelt.
Ein list <name> auf eine longpoll-Verbindungsdefinition sieht folgendermaßen aus:
Internals:
Authenticated 0
BUF
FD 42
FW_ID 962
LASTACCESS 1454619162
NAME WEB_192.168.179.27_54119
NR 961
NTFY_ORDER WEB_192.168.179.27_54119
PEER 192.168.179.27
PORT 54119
SNAME WEB
SSL
STATE Connected
TEMPORARY 1
TYPE FHEMWEB
canAsyncOutput 1
Inform:
filter room=Wohnzimmer
fmt JSON
since 1454619159
type status
Devices:
#FHEMWEB:WEB 1
AV_Receiver 1
BD_Player 1
CD_Player 1
Fenster_Wohnzimmer 1
Fensterstellung_Wohnzimmer 1
Fernbedienung_Wohnzimmer 1
Gesamtes_Wohnzimmer_Licht 1
Jalousie_Wohnzimmer 1
LED_Decke 1
LED_Filmeregal 1
LED_Serienregal 1
LED_TV_Board 1
Licht_Wohnzimmer 1
Lichtschalter_Wohnzimmer 1
Stellantrieb_Wohnzimmer_Ventil 1
TV 1
TV_RS232 1
TV_Steckdose 1
Temperatur_Wohnzimmer 1
Ventilstellung_Wohnzimmer 1
Wandschalter_Wohnzimmer 1
Wandthermostat_Wohnzimmer_Sensor 1
iPhone 1
panStamp_Shield 1
Attributes:
room hidden
Hier kann man anhand des Filters "room=Wohnzimmer" erkennen, das diese Longpollverbindung eine Raumübersicht über den Raum "Wohnzimmer" sein muss. Leider kann man danach mit einer devspec nicht wirklich filtern, da der Wert eine Ebene weiter verschachtelt ist.
Gruß
Markus
ZitatBesteht die Möglichkeit, den Aufruf
fhem("trigger WEB.* JS:location.reload(true)");
so zu modifizieren, dass nur die Browser einen "reload" ausführen, die gerade auch die betroffene Raumansicht anzeigen?
Fuer diese Zwecke will ich die Alternative FW_directNotify vorantreiben, da sie keine Events generiert, und dadurch FHEM weniger belastet. Eine vergleichbare Schreibweise lautet hier:
{ FW_directNotify("#FHEMWEB:WEB", "location.reload('true')", "") }
Sie ist nicht ganz equivalent, weil hier nur Verbindungen ueber WEB betroffen sind.
Ich habe FW_directNotify mit einem optionalen ersten Parameter erweitert (Parameter muss mit FILTER= beginnen), hoffentlich deckt das unser Problemfall ab:
{ FW_directNotify("FILTER=room=XXX", "#FHEMWEB:WEB", "location.reload('true')", "") }
Um alle WEB.* Instanzen zu treffen, muss man eine Schleife bauen:
{ map { FW_directNotify("FILTER=room=XXX", "#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("WEB.*") }
Hallo,
super. ich denke, dass das genau die Lösung ist, die ich gesucht habe.
Vermutlich geht die Änderung aber erst morgen nach dem update.
Habe das in eine sub gesteckt, so dass Anpassungen nur an zentraler Stelle zu machen sind:
sub RefreshScreen($)
{
my ($room) = @_;
if(!defined($room))
{
fhem("trigger WEB.* JS:location.reload(true)");
}
else
{
map { FW_directNotify("FILTER=room=$room", "#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("WEB.*");
}
return undef;
} # end sub RefreshScreen
#####################
Heute wird da jedenfalls noch kein reload ausgelöst.
Elektrolurch
Ja, gibts morgen via update. Dann funktioniert es.
Gruß
Markus
Hallo Markus,
gerade mit PC (mehreren Fenstern) und iPhone getestet:
1. Funktioniert genauso, wie es soll.
Es werden nur die Fenster aktualisiert, die auch den entsprechenden Raum gerade darstellen.
2. Gegenüber vorher sehr viel schneller.
Also: Ein richtiger Fortschritt.
Leider habe ich keinen Zugang zum wiki, aber das ist schon eine fundamentale Verbesserung, die einem größeren Nutzerkreis zugänglich sein solte.
Noch eine Frage:
devspec2array liefert
WEB
WEB_192.168.1.4_53509
WEB_192.168.1.4_53580
WEB_192.168.1.4_53581
WEB_192.168.1.4_53582
WEB_192.168.1.4_53583
WEBphone
WEBtablet
WEBtablet_192.168.1.59_49376
Macht es Sinn, das event nur an die Instanzen mit IP-Adresse zuzustellen und WEB,WEBtablet und WEBphone zu ignorieren?
dann könnte das devspec2array in der map - Anweisung z.B. so aussehen:
devspec2array("WEB.*_192.168")
Gruß und vielen Dank
Elektrolurch
:-[
ZitatMacht es Sinn, das event nur an die Instanzen mit IP-Adresse zuzustellen und WEB,WEBtablet und WEBphone zu ignorieren?
FW_directNotify schickt nur der longpoll-Instanzen diese Daten, siehe "list TYPE=FHEMWEB inform"
Hallo Elektrolurch,
super, das es funktioniert.
Ich würde Dir als devspec empfehlen: devspec2array("WEB.*_\d+")
Damit ist der IP-Range unerheblich. Ist aber wiederrum abhängig, wie die FHEMWEB-Instanzen benannt sind.
Gruß
Markus
ZitatIch würde Dir als devspec empfehlen: devspec2array("WEB.*_\d+")
Das duerfte nicht funktionieren. FW_directNotify sucht alle FHEMWEB Instanzen mit einem {inform}{devices}{FHEMWEB:WEB} Eintrag, das sind nur die longpoll Verbindungen. Wenn man es Geschwindigkeitsoptimiert haben will, dann verwendet man devspec2array("WEB,WEBtablet,WEBphone"), das duerfte aber selbst auf einem RPi nur <1ms ausmachen.
Kann mir jemand ein Beispiel geben, wie man diese Funktion RefreshScreen() nutzt?
Ich würde gerne bei einer Readingsgroup wenn ein Button gedrückt wird dies ausführen, da der Button Atribute setzt die ich in der Readingsgroup auslese.
Gebe ich z.B. {RefreshScreen()} oben in die Zeile ein geht alles wie gewünscht, nur wie kann ich dies einem Button anhängen.
attr my_rg commands {'Knopf' => 'trigger WEB.* JS:location.reload(true)'}
Elektrolurch
Vielen Dank so hatte ich es auch schon versucht, nur leider ohne erfolg.
Hier mal meine RG
define RG_Rollos readingsGroup <Rolladen>,<Status>,<Hoch>,<Mittelposition>,<Runter>,<Timer Hoch>,<Hoch Auto>,<Timer Runter>,<Runter Auto> Status_Ro_.*:state,<{RolloUpDown($DEVICE,"up")}>,<{RolloUpDown($DEVICE,"zpos")}>,<{RolloUpDown($DEVICE,"down")}>,nextUpdate@{MygetRolloTimer($DEVICE,'up')},?!disable@{MygetRolloTimer($DEVICE,'up')},nextUpdate@{MygetRolloTimer($DEVICE,'down')},?!disable@{MygetRolloTimer($DEVICE,'down')}
attr RG_Rollos DbLogExclude .*
attr RG_Rollos alias Übersicht Rolläden
attr RG_Rollos commands { 'disable' => 'trigger WEB.* JS:location.reload(true)' }
attr RG_Rollos mapping %ALIAS
attr RG_Rollos notime 1
attr RG_Rollos room Haus
attr RG_Rollos valueFormat { RollovalueFormat($DEVICE,$READING,$VALUE);; }
attr RG_Rollos valueIcon %VALUE
bei einem klick auf disable sehe ich in der Console das folgendes ausgeführt wird FW_cmd:/fhem?XHR=1&cmd=trigger WEB.* JS:location.reload(true)
aber die Seite wird nicht erneut geladen. Gebe ich dies oben in die command ein geht es.
Hallo,
ich greife mal das Thema auf, weil es dem Prinzip "gleich" ist.
Zitat von: rudolfkoenig am 05 Februar 2016, 12:05:58
Fuer diese Zwecke will ich die Alternative FW_directNotify vorantreiben, da sie keine Events generiert, und dadurch FHEM weniger belastet. Eine vergleichbare Schreibweise lautet hier:
{ FW_directNotify("#FHEMWEB:WEB", "location.reload('true')", "") }
Sie ist nicht ganz equivalent, weil hier nur Verbindungen ueber WEB betroffen sind.
Ich habe FW_directNotify mit einem optionalen ersten Parameter erweitert (Parameter muss mit FILTER= beginnen), hoffentlich deckt das unser Problemfall ab:
{ FW_directNotify("FILTER=room=XXX", "#FHEMWEB:WEB", "location.reload('true')", "") }
Ist vorgesehen, das
{ FW_directNotify("FILTER=detail=XXX", "#FHEMWEB:WEB", "location.reload('true')", "") }
möglich wäre um den Filter auf die Detailansicht anzusetzen? Wenn ja, wie muss ich dies richtig niederschreiben?
Grund dafür, das ich den Inhalt in der Detailansicht refreshen möchte.
MfG
FILTER=XXX in FW_directNotify beschraenkt die Suche nach Browser-Verbindungen, die filter=XXX gesetzt haben.
Die Detailseite fuer Geraet Y setzt filter=Y, und mW ist das nur hier der Fall, aber eine Garantie fuer die Detailseite ist das nicht.
Siehe auch "list TYPE=FHEMWEB inform":w_127.0.0.1_57848 devices=HASH(0x7fed7462ba60) filter=m2c fmt=JSON since=1567014001 type=status
Hallo,
danke deiner Antwort Rudi. Meine Frage ist aber meines Erachtens nicht richtig beantwortet.
Wenn ich den Filter auf room= setze, so klappt es. (Funktion bei Raumansicht) Ist vorgesehen, den Filter auf die Detailseite zu erweitern ODER wie setze ich den Filter auf die Detailseite?
Bei einem Test, das ich room= durch detail= .... ersetze, klappt es NICHT.
Ausschlaggebend ist ja die Browserurl.
Funktioniert es nicht, weil die Filteroptionen nur für room= zugelassen ist oder weil das passende Parameter falsch ist oder vielleicht intern etwas noch hakt?
Mfg
Gesendet von iPhone mit Tapatalk Pro
ZitatBei einem Test, das ich room= durch detail= .... ersetze, klappt es NICHT.
Ich empfehle meinen Beitrag nochmal zu lesen, ich habe da nichts von detail= geschrieben.
Danke für deine Antwort.
Ich denke nach Einsicht tief ins System und erneutem lesen deines Post, den Weg gefunden zu haben. Es ist ja etwas tricki wenn das ,,Gebilde wenig dokumentiert ist und man nicht aufs einzelne Detail / Variable achtet".
Ich verifiziere es noch an einem anderen System.
Gesendet von iPhone mit Tapatalk Pro
Hi,
der Beitrag ist zwar schon sehr alt, aber nachdem ich jetzt auch einige Zeit mich durch den code gewühlt habe,
denke ich hab eine Lösung:
FW_directNotify("FILTER=" . $FW_detail, '#FHEMWEB:' . $FW_wname, 'FW_errmsg("das ist ein Test",5000)', "");
..getested innerhalb einer XX_Get sub... bei diesem konkreten Modul gibts kein "get" auf der room-seite.
Verwendet wird das statt der "üblichen" Methode: return "Das ist ein Test"; in der XX_Get Funktion.
l.g. erwin