Werteliste und Slider kein Refresh der kompletten Seite

Begonnen von Hoschiq, 19 August 2014, 23:08:30

Vorheriges Thema - Nächstes Thema

Hoschiq

Anbei ein Patch für Slider und Time.

Dieser Patch fügt die folgende Funktionalität zu Slider und Time hinzu.

Ist Longpoll eingeschaltet, so wird ein Get zur Aktualisierung in FHEM verwendet.
Ist Longpoll ausgeschaltet, so wird die Seite neu geladen und die Werte werden per Post übermittelt.
Hierbei habe ich statt document.location window.location verwendet, da document.location veraltet ist.

Mit der Funktion addcsrf wird beim Post sichergestellt, dass bei aktiviertem csrfToken dieses angehangen wird. Innerhalb der Funktion FW_cmd wird dies ebenfalls aufgerufen.

Hier der Patch für Time, ist in der Funktion FW_timeCreate(el,cmd) einzubauen.

Es wird ersetzt:

if(cmd)
FW_cmd(cmd.replace('%',v)+"&XHR=1");


durch



if(cmd){
     if(typeof FW_pollConn != "undefined"){
        FW_cmd(cmd.replace('%',v)+"&XHR=1");
     }else {
       window.location = addcsrf(cmd.replace('%',v));
     }
    }


Hier der Patch für Slider.
In der Funktion mouseMove(e) wird


if(cmd.substring(0,3) != "js:")
if(typeof val != "undefined")
FW_cmd(cmd.replace('%',val)+"&XHR=1");


durch:



if(cmd) {
if(cmd.substring(0,3) != "js:")
  if(typeof val != "undefined"){
if(typeof FW_pollConn != "undefined"){
FW_cmd(cmd.replace('%',value)+"&XHR=1");
}else{
window.location = addcsrf(cmd.replace('%',value));
}
}
} else {
if(typeof val != "undefined")
slider.nextSibling.setAttribute('value', val);
}


ersetzt.

@Rudi, im Patch für das Dropdown, wird innerhalb von der Javascript Funktion FW_cmd "csrfToken" verwendet, sofern ich die Funktion richtig interpretiere.

Um die Funktionalität (longpoll ein aus) auch im Dropdown zu verwenden habe ich mir die 01_FHEMWEB.pm angeschaut.

Dort wird z.B. so auf longpoll geprüft.

if(AttrVal($FW_wname, "longpoll", 1)

denke dass das so richtig ist und auch im Floorplan funktionieren könnte?

Testet bitte das Dropdown ohne Reload der Seite..


UliM

Hi,
ist das eingecheckt?
Ich hab heut ine update gemacht. Nach Werteänderung über slider wird auf dem iPad nach wie vor die Seite nicht mehr neu geladen.
Sehr lästig.
Wäre schön wenn das alsbald wieder funktionieren würde.
Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

rudolfkoenig

@UliM: vermutlich nicht, weiss aber nicht genau, was du mit "das" meinst, manches habe ich eingecheckt, und manches nicht.

@Hoschiq: sorry, dass es bei mir so lange gedauert hat.
ZitatIst Longpoll eingeschaltet, so wird ein Get zur Aktualisierung in FHEM verwendet.
Ist Longpoll ausgeschaltet, so wird die Seite neu geladen und die Werte werden per Post übermittelt.
Kannst du mir bitte sagen, wieso das notwendig ist? Inzwischen habe ich FW_cmd auf POST umgestellt, aendert das was?

Und koenntest du auch fuer den "alten" dropdown einen aktuellen und kompletten Patch bereitstellen, da ich nicht mehr sicher bin, was alles reingehoert und was nicht. Wenn moeglich, haette ich gerne den Patch als "diff -u" Output, damit ich das nicht manuell anwenden muss.

Hoschiq

@rudi - die Patches ermöglichen ein Aktualisieren er Seiteninhalte ohne Reload der Seite wenn longpoll eingeschaltet ist.
Ist longpoll ausgeschaltet, so wird die Seite neu geladen und dadurch die Werte der Seite nach der Änderung akualisiert.
Ich zitiere dich mal aus diesem Thread, wozu das gut sein soll.
ZitatBin etwas unsicher. Der Befehl wird doch abgeschickt, und wer longpoll deaktiviert hat, der erwartet nicht, dass Aenderungen sofort angezeigt werden. Allerdings ist der Zusatzaufwand minimal, und evtl. hilft das Diskussionen zu vermeiden.

Ein Umstellen von FW_cmd auf POST ändert nichts am Seitenreload Problem.

Wie erkenne ich im Modul 01_FHEMWEB.pm ob longpoll aktiviert ist? Das fehlt mir noch für den Dropdown Patch.

Ich versuche die Patches in den nächsten Tagen zur Verfügung zu stellen.





rudolfkoenig

Danke fuer den Hinweis. Ich meine jetzt, dass der (minimale) Zusatzaufwand nicht gerechtfertigt ist.
Wer JavaScript nicht haben will, soll JavaScript abschalten.

ZitatWie erkenne ich im Modul 01_FHEMWEB.pm ob longpoll aktiviert ist?
AttrVal($FW_wname, "longpoll", 1)

UliM

Hi Hoshiq,
bis wann ist denn mit nem fix zu rechnen?
Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Hoschiq

Hallo,

hier die Patches für fhemweb_slider und fhemweb_time.

### Eclipse Workspace Patch 1.0
#P fhem
Index: www/pgm2/fhemweb_slider.js
===================================================================
--- www/pgm2/fhemweb_slider.js (revision 6816)
+++ www/pgm2/fhemweb_slider.js (working copy)
@@ -96,8 +96,14 @@
       document.ontouchmove = oldFn3; document.ontouchend = oldFn4;
       if(cmd) {
         if(cmd.substring(0,3) != "js:")
-          if(typeof val != "undefined")
-            FW_cmd(cmd.replace('%',val)+"&XHR=1");
+          if(typeof val != "undefined"){
+          if(typeof FW_pollConn != "undefined"){
+            FW_cmd(cmd.replace('%',val)+"&XHR=1");
+         }
+         else{
+           window.location = addcsrf(cmd.replace('%',val));
+         }
+          }   
       } else {
         if(typeof val != "undefined")
           slider.nextSibling.setAttribute('value', val);


### Eclipse Workspace Patch 1.0
#P fhem
Index: www/pgm2/fhemweb_time.js
===================================================================
--- www/pgm2/fhemweb_time.js (revision 6816)
+++ www/pgm2/fhemweb_time.js (working copy)
@@ -19,8 +19,14 @@

   if(brOff > 0) {
     par.innerHTML = par.innerHTML.substring(0, brOff).replace('"-"','"+"');
-    if(cmd)
-      FW_cmd(cmd.replace('%',v)+"&XHR=1");
+    if(cmd){
+      if(typeof FW_pollConn != "undefined"){
+        FW_cmd(cmd.replace('%',v)+"&XHR=1");
+      }
+      else{
+        window.location = addcsrf(cmd.replace('%',v));
+      }
+    }
     return;
   }


Am Dropdown arbeite ich noch, da  im Floorplan die Erkennung ob Longpoll an noch nicht richtig funktioniert.

rudolfkoenig


Hoschiq

Hallo,

hier der Patch für das Dropdown ohne reload.
Ein TODO ist noch offen, das Ermitteln des Webinstanz-Namens im Floorplan.
Aktuell wird im Floorplan immer ein Reload der Seite durchgeführt.

### Eclipse Workspace Patch 1.0
#P fhem
Index: FHEM/01_FHEMWEB.pm
===================================================================
--- FHEM/01_FHEMWEB.pm (revision 6947)
+++ FHEM/01_FHEMWEB.pm (working copy)
@@ -2509,17 +2509,28 @@

     my $fpname = $FW_wname;
     $fpname =~ s/.*floorplan\/(\w+)$/$1/;  #allow usage of attr fp_setbutton
+
+ my $readng;
+    if ($cmd eq "state" ){
+       $readng = "";
+    } else {
+       $readng = "$cmd"." ";
+    }
+
+ # TODO in case of running in a floorplan split $FW_wname to get name of webInstance.
+ # Actually in floorplan the dropdown will refresh the page always independently from
+ # setting in corresponding web instance, cause statement if( AttrVal($FW_wname, "longpoll", 0) == 1) will always fail.
+  
+ if( AttrVal($FW_wname, "longpoll", 0) == 1) {
+        $selFunct = "FW_cmd('$FW_ME?XHR=1&cmd.$d=set $d $readng '+ this.options[this.selectedIndex].value+ ' &room=$FW_room')";
+       } else {
+        $selFunct = "window.location = addcsrf('$FW_ME?cmd.$d=set $d $readng '+ this.options[this.selectedIndex].value+ ' &room=$FW_room')";
+       }
     my $fwsel;
-    $fwsel = ($cmd eq "state" ? "" : "$cmd ") .
-             FW_select("$d-$cmd","val.$d", \@tv, $txt,"dropdown","submit()").
-             FW_hidden("cmd.$d", "set");
-    $fwsel .= FW_hidden("fwcsrf", $defs{$FW_wname}{CSRFTOKEN}) if($FW_CSRF);
-
-    return "<td colspan='2'><form method=\"$FW_formmethod\">".
-      FW_hidden("arg.$d", $cmd) .
-      FW_hidden("dev.$d", $d) .
-      ($FW_room ? FW_hidden("room", $FW_room) : "") .
-      "$fwsel</form></td>";
+       $fwsel = ($cmd eq "state" ? "" : "$cmd&nbsp;") .
+              FW_select("$d-$cmd","val.$d", \@tv, $txt,"dropdown","$selFunct");
+    return "<td colspan='2'>" .
+ "$fwsel</td>"; 
   }
   return undef;
}

UliM

Das deckt sich nicht mit meine. Beobachtungen. Aktuell wird in FP Hariri. Reload durchgeführt.
Ärgerlich dass das nun so defekt in den neuen Release geht.
Was ist den. Eigentlich der Anlass Fürsorge Veränderung gewesen?
In floorplan.pm wird die Webinstanz ermittelt, man müsste also nur abschreiben?
Gruß Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

rudolfkoenig

@Hoschiq: ich warte mit dem Einchecken, bis UliM auch zufrieden ist.
@UliM: bitte Reschtschreibkorrektur abschalten, ich verstehe nicht wirklich, was du meinst.

Hoschiq

Hallo Ulli,

es geht darum, dass das Dropdwon nur ein Reload durchführen soll, wenn longpoll aktiviert ist.

Das klappt in FHEMWEB + Dashboard auch.
Im Floorplan wird bei Verwendung von Dropdown allerdings nicht der Name der Webinstanz, sondern noch der komplette Pfad mit floorplan/fp_name übergeben.

Im Dropdown wird geprüft, ob in der webistanz longpoll aktiviert ist. Schlägt die Prüfung fehl, so wird als Fallback das aktuelle Verhalten umgesetzt sprich Reload der Seite, vorher eben submit des Form.

Das Dropdown ist nun außerdem kein Form mehr, was wohl in einigen Fällen bei Schachtelung Probleme machte.

Es fehlt nur das Zerlegen der Pfades um an die Webinstanz zu kommen.


Im Dashboard erfolgt der Aufruf so:

foreach my $fn (sort keys %{$data{webCmdFn}}) {
no strict "refs";
$htmlTxt = &{$data{webCmdFn}{$fn}}($FW_wname, $d, $FW_room, $cmd, $values);


Im Floorplan wird noch was angehangen:

$FW_ME = "$FW_ME/floorplan/$FP_name";
            foreach my $fn (sort keys %{$data{webCmdFn}}) {
my $FW_room = ""; ##needed to be able to reuse code from FHEMWEB
              no strict "refs";
              my $htmlTxt = &{$data{webCmdFn}{$fn}}("$FW_ME", $d, $FW_room, $cmd, $values);


$FW_ME = "$FW_ME/floorplan/$FP_name"; kommt im Dropdown als interne Variable $FW_wname an.


Es ist also keine Verschlechterung der aktuellen Funktion zu erwarten im Floorplan.

VG

UliM

Hi,
Sorry für die Rechtschreib"korrekturen".
Aus meiner persönlichen Sicht hatte ich nie ein Problem mit Seiten-Neuladen nach Dropdown-Menü-Auswahl, habe aber sehr wohl ein Problem, wenn genau das nicht passiert.
Da hat sicher jeder ein anderes setup und damit andere Prios.

Wenn ich in floorplan was nachziehen soll/muss schick mir bitte nen Patch.
Aktuell beobachte ich, dass ohne eine Änderung meinerseits etwas nicht mehr tut, was vorher ging - das find ich doof :)
Lässt sich das wieder richten?
LG Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Hoschiq

Hallo Uli,

es gab auch keine Probleme mit dem Reload beim Dropdown. Nur ist ein Reload der Seite bei längeren Seiten oder z.B. im Dashboard unschön,
da man entweder wieder an die Stelle der Änderung Scrollen muss oder im Dashboard den Tab erneut öffnen muss.

Es ist eine Verbesserung, dahingehend, dass sich das Dropdown nun wie Slider, Time und z.B. das Ein- Ausschalten von Aktoren verhält.
ZitatDas Patch ermöglicht ein Aktualisieren er Seiteninhalte ohne Reload der Seite wenn longpoll eingeschaltet ist.
Ist longpoll ausgeschaltet, so wird die Seite neu geladen und dadurch die Werte der Seite nach der Änderung akualisiert.

Im Floorplan wird beim Dropdown allerdings unabhängig von longpoll immer ein Reload der Seite durchgeführt.


ZitatAktuell beobachte ich, dass ohne eine Änderung meinerseits etwas nicht mehr tut, was vorher ging - das find ich doof :)
Lässt sich das wieder richten?
Damit kann ich leider nicht viel anfangen, da ich nicht weiß was (welche Elemente oder Funktionen) bei dir nicht mehr funktioniert.
Falls es Slider und Time waren kannst du ein Update machen, da hat Rudi das Patch eingespielt.

Ich habe für die die es einmal testen wollen die geänderte FHEMWEB Datei angehangen.


VG

UliM

Hi,
mit aktuellem update-Stand sehe ich kein page-refresh nach slider.
Internals:
   NAME       wakeupChange
   NR         282
   STATE      06:25
   TYPE       dummy
   Readings:
     2014-11-13 21:58:10   state           06:25
Attributes:
   fp_Grundriss 492,828,2,Wakeup
   fp_PlotsPage 640,201,2,
   group      Wohnung
   icon       time_timer
   room       Wohnung,Schlafzimmer
   setList    state:time
   webCmd     state

Nach Änderung des Wertes erfolgt zwar (vmtl. llongpoll) eine Aktualisierung der Anzeige des state dieses device, aber die Startzeit des via notify abhängigen device
define a_heizStart at *06:05 set ez_FHT desired-temp 21.5;set hzg_SollTemp 21.5
wird nicht mit ihrem neuen Wert angezeigt.
Nach einem reload durch erneutes klicken auf denselben flooaplan-namen erscheint dann sehr wohl die aktualiserte Startzeit,
Zuvor wurde die aktualiserte Zeit auf letzterem device sofort refreshed - ich gehe daher davon aus, dass kein refresh der ganzen Seite stattfindet.
Gruß, Uli



RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.