DetailView aktualisiert nicht bei Betätigung CmdIcon

Begonnen von docm, 18 November 2017, 09:52:33

Vorheriges Thema - Nächstes Thema

docm

Guten Morgen,
ich nutze FHEM als intelligente Steuerung in einem KNX System. Jetzt habe ich mir ein Device zur Steuerung der Raumtemperatur angelegt gemäß folgender Raw-Definition:

defmod Wohnen.HVAC KNX 4/1/0:dpt9.001:temp.soll 4/1/1:dpt1:temp.verschiebung 4/1/2:dpt9.001:temp.ist 4/1/3:dpt5:hvac.vorwahl 4/1/4:dpt5:hvac.status
attr Wohnen.HVAC IODev myTUL
attr Wohnen.HVAC cmdIcon up:control_arrow_up down:control_arrow_down Tag:status_available Nacht:status_night Frost:frost
attr Wohnen.HVAC event-on-update-reading .*get$
attr Wohnen.HVAC eventMap {usr=>{'up'=>'on g2','down'=>'off g2','^Sollwert.(.*)$'=>'".sprintf("value %.2f g1",$1)."','^Tag'=>'".sprintf("value %i g4",(ReadingsNum($dev,"hvac.vorwahl-get",1)==4 ? 4: 1))."','^Nacht'=> '".sprintf("value %i g4",(ReadingsNum($dev,"hvac.vorwahl-get",1)==4 ? 4: 3))."','Frost'=>'value 4 g4'}, fw=>{'^Sollwert.(.*)$'=>'Sollwert','^Tag'=>'Tag','^Nacht'=>'Nacht'}}
attr Wohnen.HVAC group HVAC
attr Wohnen.HVAC room EG.Wohnen,KNX
attr Wohnen.HVAC stateCmd {$state = sprintf("%s", ReadingsVal($name,"temp.soll-get","undef"))}
attr Wohnen.HVAC webCmd up:down:Tag:Nacht:Frost

setstate Wohnen.HVAC 23.50 °;C
setstate Wohnen.HVAC 2017-11-17 22:27:02 hvac.status-get 2
setstate Wohnen.HVAC 2017-11-17 22:27:02 hvac.vorwahl-get 2
setstate Wohnen.HVAC 2017-11-17 23:20:07 hvac.vorwahl-set 1
setstate Wohnen.HVAC 2017-11-17 22:27:02 last-sender 0/0/2
setstate Wohnen.HVAC 2017-11-17 23:20:07 state 23.50 °;C
setstate Wohnen.HVAC 2017-11-17 22:27:02 temp.ist-get 24.80 °;C
setstate Wohnen.HVAC 2017-11-17 22:27:02 temp.soll-get 23.50 °;C
setstate Wohnen.HVAC 2017-11-17 22:27:02 temp.soll-set 21.00 °;C
setstate Wohnen.HVAC 2017-11-17 22:27:02 temp.verschiebung-get on
setstate Wohnen.HVAC 2017-11-17 23:17:51 temp.verschiebung-set on

Von der Gerätefunktion her, ist alles in Ordnung, nur werden im WEB Frontend (Firefox 56.0.2 auf Win10-64bit) die Readings nicht automatisch aktualisiert, es fehlt wohl ein Page Refresh. Wenn ich ein CmdIcon betätige, passiert im WEB erstmal gar nichts. Erst wenn ich den Refresh-Button im Browser betätige, werden die aktuellen Werte dargestellt.
Habe ich etwas falsch konfiguriert / vergessen? Kann man das Problem umgehen, indem man manuell (z.B. im Code der EventMap) einen Refresh auslöst?
Mit anderen KNX Devices, z.B. Lampe an/aus funktioniert alles bestens.
Wäre super, wenn mir jemand weiterhelfen kann.
Viele Grüße
Andreas

rudolfkoenig

Ich kenne KNX nicht, und will auch nicht eine Testinstallation erstellen, brauche also mehr Details.
Kannst du bitte einen Mitschnitt der JavaScript-Console hier anhaengen?

docm

Hallo Rudolph,
danke für die schnelle Rückmeldung. Ich denke es ist kein spezielles knx Thema. Möglicherweise besteht ein Zusammenhang mit der EventMap, die cmdIcons enthalten cmds, die dann über die EventMap gemapt werden.
JS Konsole: Was meinst du konkret? Gibt es im FHEM ein spezielles Tool (konnte dazu nichts finden) oder die Browser Konsole des Firefox?
Habe mal die Ausgabe der Firefox-Konsole angehängt.
Ein manueller Reload der Seite im Browser erzeugt folgende Log-Ausgaben:

11:50:34.428 FW_queryValue:{ReadingsVal("Wohnen.HVAC","Frost","")}  fhemweb.js:402
11:50:34.435 FW_queryValue:{AttrVal("Wohnen.HVAC","room","")}  fhemweb.js:402
11:50:34.518 Inform-channel opened (HTTP) with filter Wohnen.HVAC  fhemweb.js:402
11:50:34.550 Rcvd:   fhemweb.js:402       

Bei Klick auf Icon "up":

12:02:00.116 FW_cmd:/fhem?cmd.Wohnen.HVAC=set Wohnen.HVAC up&fwcsrf=csrf_125400347813056&XHR=1  fhemweb.js:402

Bei Klick auf Icon "down"

12:03:59.231 FW_cmd:/fhem?cmd.Wohnen.HVAC=set Wohnen.HVAC down&fwcsrf=csrf_125400347813056&XHR=1  fhemweb.js:402

Bei Klick auf Icon "Tag":

12:06:22.677 FW_cmd:/fhem?cmd.Wohnen.HVAC=set Wohnen.HVAC Tag&fwcsrf=csrf_125400347813056&XHR=1  fhemweb.js:402

Bei Klick auf Icon "Nacht":

11:59:47.893 FW_cmd:/fhem?cmd.Wohnen.HVAC=set Wohnen.HVAC Nacht&fwcsrf=csrf_125400347813056&XHR=1  fhemweb.js:402

Bei Klick auf Icon "Frost":

11:54:08.279 FW_cmd:/fhem?cmd.Wohnen.HVAC=set Wohnen.HVAC Frost&fwcsrf=csrf_125400347813056&XHR=1  fhemweb.js:402       

Der Screen aktualisiert sich in keinem dieser Fälle.

Viele Grüße
Andreas


rudolfkoenig

ZitatHallo Rudolph,
s/ph/f/;

JS Konsole: ich meinte die aus dem Browser, und wenn da nicht mehr kommt, dann wird sich auch nichts aktualisieren.
Kannst du bitte noch in einem zweiten Browser-Fenster den FHEM-Event-Monitor starten, und berichten, was bei einem Klick da angezeigt wird?

Wie es laufen sollte:
- beim Knopfdruck wird ein Befehl zum FHEM geschickt, ohne die Seite neu zu laden (wg. XHR=1)
- Ueber die vorher geoeffnete longpoll Verbindung (siehe "Inform-channel opened.. with filter Wohnen.HVAC") werden alle Events, die dieses Geraet betreffen, an dem Browser geschickt, und diese Events sieht man auch in der JS-Konsole.
- JavaScript in fhemweb.js sucht beim Empfang eines Events auf der Seite nach HTML-Elemente mit passenden ID, und ersetzt deren Inhalt.
- Damit werden z.Zt.. nur bereits angezeigte Readings aktualisiert bzw. deren Zeitstempel aktualisert, und der Status des Geraetes gesetzt. Attribute und Internal Values werden nicht geaendert, auch werden keine neuen Readings auf der Seite angezeigt. Fuer all das braucht man ein Reload der Seite.

docm

#4
Hallo Rudolf,
aufgrund des Attributs

attr Wohnen.HVAC event-on-update-reading .*get$

wird gar kein Event erzeugt. Events werden nur ausgelöst, wenn Nachrichten vom knx Bus kommen. 
Habs gerade noch einmal probiert: Kein Event beim Klick, wie erwartet.

Nun ist das aber genau die Ursache! Ich habe eben probeweise den event-on-update-reading Filter entfernt und nun führt ein Klick auch zur Änderung der Anzeige.
Der Schlüssel liegt also darin, dass FHEMWEB auf Events reagiert, somit verändert ein setreading() die Anzeige nicht, sondern erst das dadurch erzeugte Event triggert den Seiten-Refresh.

Danke für deine Erläuterung. Hat mir sehr gut weiter geholfen.
Nun muss ich halt mit den zusätzlichen Events leben. Wollte die aus Performancegründen weg haben, denn jedes Event wird ja gegen sämtliche NOTIFYs gematcht. Ist aber kein Drama. Hier noch der JS Consoledump. Jetzt funktioniert die Aktualisierung.


14:28:53.481 FW_cmd:/fhem?cmd.Wohnen.HVAC=set Wohnen.HVAC Tag&fwcsrf=csrf_125400347813056&XHR=1  fhemweb.js:402
14:28:53.587 Console Rcvd: 2017-11-18 14:28:55 KNX Wohnen.HVAC hvac.vorwahl-set: 1<br>
2017-11-18 14:28:55 KNX Wohnen.HVAC 23.50 &deg;C<br> fhemweb.js:402
14:28:53.589 Rcvd: ["Wohnen.HVAC","23.50 &deg;C","<div id=\u0022Wohnen.HVAC\u0022  title=\u002223.50 &deg;C\u0022 class=\u0022col2\u0022><a href=\u0022...(248)  fhemweb.js:402
14:28:53.592 Rcvd: ["Wohnen.HVAC-hvac.vorwahl-set","1","1"]  fhemweb.js:402
14:28:53.593 Rcvd: ["Wohnen.HVAC-hvac.vorwahl-set-ts","2017-11-18 14:28:55","2017-11-18 14:28:55"]  fhemweb.js:402
14:28:53.595 Rcvd: ["Wohnen.HVAC-state","23.50 &deg;C","23.50 &deg;C"]  fhemweb.js:402
14:28:53.596 Rcvd: ["Wohnen.HVAC-state-ts","2017-11-18 14:28:55","2017-11-18 14:28:55"]  fhemweb.js:402


Viele Grüße
Andreas

docm

Hallo nochmals,
gibt es eigentlich eine Möglichkeit, FHEMWEB mitzuteilen, dass ein Device in der Darstellung komplett aktualisiert werden muss? Das würde interessante neue Möglichkeiten eröffnen, z.B. cmdIcons dynamisch ändern...
Eine Idee dazu:
- Das Device sendet einen speziellen Event
- Longpoll sendet an Browser
- Javascript prüft, ob das betroffene Device auf der aktuellen Seite dargestellt wird.
- Falls ja wird ein Refresh der Seite vom Webserver abgerufen
Der Event könnte z.B. über die Zuweisung eines Wertes an ein spezielles Reading ausgelöst werden, z.B. setreading("MyDevice","WebRefresh",1)
Was meinst du dazu?
Gruß
Andreas


rudolfkoenig

Zitatgibt es eigentlich eine Möglichkeit, FHEMWEB mitzuteilen, dass ein Device in der Darstellung komplett aktualisiert werden muss?
Ja, mehrere, fuer den Endanwender ist "trigger WEB JS:location.reload()" am einfachsten.

ZitatWas meinst du dazu?
Das es viel Aufwand (und traffic) fuer wenig Nutzen ist. Oder ich habe den Anwendungsfall noch nicht erkannt.
Ich bin immer noch der Ansicht, dass die event-on-*  Attribute nur in den seltensten Faellen ihre Berechtigung haben.

docm

Danke für den Tipp mit location.reload(). Ich werde es ausprobieren.
Ein konkreter Anwendungsfall:
Ich definiere mir mit attr cmdIcon eine Bedienleiste aus mehreren Icons um zwischen verschiedenen Zuständen eines Devices umschalten zu können. Beispiel: Raumtemperatursteuerung. Zustände Komfort, Nachtabsenkung, Frostschutz. => 3 Icons zur Umschaltung zwischen 3 Zuständen
Den jeweils gewählten Zustand möchte ich über blaue Farbe des zugehörigen Icons signalisieren.

Eine Lösung mittels devStateIcon gefällt mir nicht, weil dann noch ein 4. Icon ins Spiel kommt, wo ich mit 3 eigentlich alles zeigen könnte. Außerdem möchte ich im State noch die aktuelle Solltemperatur als Text anzeigen.

Mein aktueller Lösungsansatz:
Bei Klick auf ein Icon wird
1. das entsprechende Reading gesetzt (kein Problem)
2. das Attribut cmdIcon neu gesetzt mit @blue bei dem richtigen Icon (kleines Perl-Skript, auch kein Problem)
3. die Seite neu geladen, damit die neue Färbung auch dargestellt wird (der Teil fehlte mir noch)

Vielleicht bin ich auch mit dem Neusetzen des Attributs auf dem Holzweg. Irgendwo im Forum las ich einen Hinweis auf ReadingsGroup. Die Doku zu ReadingsGroup habe ich gelesen, aber nicht verstanden. Es scheint ein extrem mächtiges Werkzeug mit sehr vielen Möglichkeiten zu sein. Aber die Doku ist dünn und für Try&Error fehlt mir die Zeit.

Für Anregungen bin ich auf alle Fälle dankbar.
Viele Grüße
Andreas

docm

location.reload() hat funktioniert. Super!

Ein Nebeneffekt tritt auf, weiß nicht ob das ein Problem geben kann.
Im Eventlog taucht ein Eintrag auf, der nicht der normalen Formatierung entspricht

2017-11-19 22:36:41 Global global ATTR Wohnen.HVAC cmdIcon up:control_arrow_up down:control_arrow_down Tag:status_available Nacht:status_night Frost:frost@blue
#FHEMWEB:WEB_192.168.178.45_52903< 2017-11-19 22:36:41 KNX Wohnen.HVAC 23.50 °C

Die erste Zeile ist normal, hier wird das cmdIcon Attribut neu gesetzt.
Die zweite Zeile startet mit einer abweichend formatierten Ausgabe aufgrund des location.reload() direkt dahinter in derselben Zeile das nächste Event.

Hier noch das Perl-Script, das ich zur Farbumschaltung verwende. Man kann es bestimmt eleganter lösen, aber ich bin in Perl noch relativ am Anfang.

{
  my $auswahl = ReadingsNum($NAME,"hvac.vorwahl-set",4); #1, 3, 4; Der Wert 2 wird nicht verwendet
  if ($auswahl==1)
  {
    fhem( "attr $NAME cmdIcon up:control_arrow_up down:control_arrow_down Tag:status_available\@blue Nacht:status_night Frost:frost");
  }
  elsif ($auswahl==3)
  {
    fhem( "attr $NAME cmdIcon up:control_arrow_up down:control_arrow_down Tag:status_available Nacht:status_night\@blue Frost:frost");
  }
  else
  {
    fhem( "attr $NAME cmdIcon up:control_arrow_up down:control_arrow_down Tag:status_available Nacht:status_night Frost:frost\@blue");
  }
  fhem("trigger WEB JS:location.reload()");
}