trigger WEB.* JS:location.reload(true)

Begonnen von Elektrolurch, 04 Februar 2016, 17:24:33

Vorheriges Thema - Nächstes Thema

Elektrolurch

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
configDB und Windows befreite Zone!

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

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.*") }

Elektrolurch

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

configDB und Windows befreite Zone!

Markus Bloch

Ja, gibts morgen via update. Dann funktioniert es.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Elektrolurch

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
:-[
configDB und Windows befreite Zone!

rudolfkoenig

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"

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

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.

DrJJ

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.

Elektrolurch

attr my_rg commands {'Knopf' => 'trigger WEB.* JS:location.reload(true)'}

Elektrolurch
configDB und Windows befreite Zone!

DrJJ

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.

HomeAuto_User

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
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

rudolfkoenig

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

HomeAuto_User

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
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

rudolfkoenig

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.

HomeAuto_User

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
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...