Open HomeAutoUser opened 5 years ago
Hallo,
ich kann das nicht richtig nachstellen...ode habe das noch nicht richtig verstanden.
1.) Wenn ich die UI auf einzeilig setze: Kein Reading DDSelected vorhanden. Dies wird erst nach dem ersten ändern in der DropDown-Liste gesetzt -> Würde ich als BUG verstehen.
2.) Wenn ich nun in der Room-Ansicht (oder auch in der Detail-Ansicht...bei mir ist das verhalten gleich) den Kanal auswähle, wird nur das Reading DDSelected gesetzt. Erst wenn ein Befehl ausgeführt wird, wird das Reading Channel verändert. So sollte es auch eigentlich sein...Das Reading Channel gibt ja nur den letzten Sende bzw. Empfangskanal wieder.
Gruß Bismosa
Hallo, ich drückte mich vielleicht ein wenig Informationsbehaftet aus :-D
Nun sollte der soeben gedrückte Kanal nicht aktualisiert sein oder das Reading fehlt wenn der Kanal noch nicht als Reading existent war.
Gruß
Hallo,
ich habe mal folgendes ergänzt:
if ($DDSelected eq ''){
readingsSingleUpdate($hash, "DDSelected", 1, 1);
$DDSelected = 1;
}
Hier ein größerer Auszug. Müsste in der Zeile 1217 sein...
if ($DDSelected eq ''){
readingsSingleUpdate($hash, "DDSelected", 1, 1);
$DDSelected = 1;
}
foreach my $rownr (1..$Channels) {
if ($DDSelected eq "$rownr"){
$html.= "<option selected value=".($rownr).">".($ChName[$rownr-1])."</option>";
} else {
$html.= "<option value=".($rownr).">".($ChName[$rownr-1])."</option>";
}
}
Dann wird, wenn kein Reading vorhanden ist, dieses erst angelegt und ggf. der erste Eintrag ausgewählt.
Ist es das?
Gruß Bismosa
Hallo!
Jetzt habe ich den Fehler wohl gefunden. Eine Lösung ist mir aber noch nicht bekannt. Ich habe das mal nachgestellt und hier eine Frage gestellt: https://forum.fhem.de/index.php/topic,102944.0.html
Dies liegt definitiv an der Änderung: https://github.com/HomeAutoUser/Jaro/issues/10
Gruß Bismosa
Hallo @bismosa, ich habe hier https://github.com/HomeAutoUser/Jaro/tree/fix_UI mal den aktuellen Branch gesetzt um hier die fixes für das UI anzugehen.
Die Aktualisierung von dem Kanal sollte kein Problem sein, das habe ich wo anders umgesetzt. Also würde ich diesen Faden für die bisherigen UI Sachen nutzen um die Struktur nicht durcheinader zu wirbeln. Der Vorteil, wenn wir dann den Fix beheben, wird der Faden als angeschlossen markiert.
Auf gehts, Pö a Pö :-)
Hier nach der Stelle
my $changecmd = "cmd.$name=setreading $name DDSelected "; ## this line set DDSelected to value after change in web
$html.= "<select name=\"val.$name\" onchange=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$changecmd ' + this.options[this.selectedIndex].value)\">";
muss ein Reload der Browserseite passieren dann geht es. Bisher muss ich nur noch die Stelle finden wo ich dazwischen komme. An dieser Stelle geht es nicht direkt.
Das kannst du reproduzieren indem du den Kanal mal wechselst, dann F5 drückst im Browser und dann das Kommando absetzt. So kommt immer das Richtige Kommano mit dem richtigen Kanal.
Wir sind dran :-)
Hallo!
ja. Genau das ist es. Ein reload (aber bitte nicht der ganzen Seite, das habe ich schon probiert und lastet mein FHEM für mehrere Sekunden aus, wenn viele Browserfenster geöffnet sind) muss passieren, sobald das reading "DDSelected" geändert wird.
Ein Reload der ganzen Seite lässt sich erzwingen mit
FW_directNotify($filter, $fhemweb_instance, $javascript, "");
bzw.
FW_directNotify("FILTER=room=XXX", "#FHEMWEB:WEB", "location.reload('true')", "")
Aber das ist wirklich nicht schön bei vielen offenen Browserfenstern...
Soll wohl besser machbar sein mit einer separaten JavaScript Datei...und sich dort um die Aktualisierung kümmern.
Oder man baut das Kommando um. Man setzt das Reading, aber bei der Auswertung der Buttons wird auf das Reading geachtet...
Gruß Bismosa
Um ein Reload kommen wir nicht drum herum. Ich teste mal und kenne das Problem der mehreren Fenster weil ich es aktuell wo anders. Es gibt die Möglichkeit nur das aktive tab zu aktualisieren.
Oder halt per JavaScript und den betreffenden Bereich aktualisieren...so wie es auch bisher (vor der Modifizierung) per LongPoll erfolgte und auch in allen anderen Devices funktioniert.... Aber wie auch schon im FHEM-Forum geschrieben...das ist neuland für mich...und ich hatte bisher noch keine Zeit und Gelegenheit mich da einzuarbeiten :(
Oder alternativ -> Den einen Sonderfall ignorieren und weiterhin im summaryFn die Anzeige machen. So hatte es ja auch sehr gut funktioniert. Es gibt dann halt die Darstellungsprobleme bei einzelnen Usern...
@bismosa , gibt es ne Variante, das wir hinter dem Kommando
$html.= "<select name=\"val.$name\" onchange=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$changecmd ' + this.options[this.selectedIndex].value)\">";
mal das eingefügt bekommten?
fhem("trigger WEB.* JS:location.reload(true)");
Ich finde nur nicht den Faden um den Syntax zu beseitigen :-D
Hallo!
Nein, das habe ich auch nicht geschafft mit in der Zeile einzufügen. Ich habe mal zum verdeutlichen/Testen einige Demos vorbereitet... 1.) So haben wir es bisher. Stark vereinfacht mit einem DropDown und einem Button: 99_Test_01-Wie jetzt.pm.txt Der Effekt ist logischerweise der gleiche...aber eine einfache Grundlage zum testen :)
2.) Mit einem Reload: 99_Test_02-Reload.pm.txt Hier habe ich den Setreading-Befehl im Dropdown auf einen "hidden" set-Befehl verändert. Hier wird dann auch das Reload angestossen. Das funktioniert nur in der Raumansicht. Solange man in der Detailansicht ist, funktioniert dies nicht. Ich bin auch dagegen. Wenn man etwas mehr im Raum (z.B. noch ein paar SVG-Statistiken) und dann ggf. noch mehrere Tabs offen hat ist (zumindest bei meinem Raspberry) FHEM für einige Zeit blockiert und mit dem neu Laden der kompletten Seiten beschäftigt!
3.) Mit einer Änderung in den Buttons: 99_Test_03-ohneAktualisierung.pm.txt
Hier braucht dann nicht mehr der Kanal mit dem Button verknüpft werden. Hier wird das Reading beim Ausführen des Befehls übernommen.
4.) Oder so wie andere es machen...mit einer externen JavaScript-Datei und einem Austausch nur des betreffenden HTMLs. Also eine eigene ID setzten und dann mittels document.getElementById("element1").innerHTML = Neues HTML ... Zitat von rudolfkoenig aus dem Forum:
Das erzeugte HTML muss die Aktualisierung in diesem Fall selbst uebernehmen. Das kann (soweit ich es sehe) nur durch Verwendung von fhemweb_widgets erfolgen, wo updateLine (Beispiel dafuer ist fhemweb_readingsGroup.js oder fhemweb_readigsHistory.js, updateLine ist aber unerwuenscht/deprecated) oder updateDevs (Beispiel dafuer ist svg.js) aufgerufen wird.
Aber das habe ich auch alles noch nicht verstanden...
Gruß Bismosa
Hallo!
Ich habe nochmal ein wenig "rumgespielt". Ich habe mal versucht den entsprechenden JavaScript Code ins HTML mit einzubauen und die Funktion denn mit neuem HTML-Code aufzurufen. Leider ist es mir nicht gelungen. Ich konnte bisher nur Text ersetzen. 99_Test_04-JavaScript.pm.txt
Gruß Bismosa
@bismosa
sehe ich das richtig, das hier
Hier sollte eigentlich der geänderte HTML-Code erscheinen....
dann das Erscheinungsbild hinein soll mit den aktuellen Werten?
Ich sehe bei dem hin und her momentan noch nicht durch ;-)
Hallo! Ja...so ist es. Aber auch das wäre wohl eher eine gebastelte Lösung. Wie gesagt andere machen das mit einer externen Javascript Datei... Sorry für das Chaos.
Gruß Bismosa
Das ist doch kein Chaos. Lieber einmal mehr gefragt und erläutert als "dumm" nichts wissen :-) Ne externe Datei .... Ich kann mir nicht vorstellen das ALLE das so lösen. Es muss noch internas geben die man nicht richtig erklärt. Ich selbst benötige das ja schon bei 2 Modulen.
Das könnte ich mir auch nicht vorstellen. Entweder man löst es wie wir es vorher hatten oder halt wenn benötigt selbst. Auch im FHEM Forum habe ich keinen Hinweis auf DIE Lösung bekommen. Und alle Module die ich mir angeschaut habe sind auch für mich als Laien fürchterlich kompliziert zu verstehen. Als Beispiel hatte ich z.b. den Sonos-Player zur rate gezogen...oder auch readingsgroup. Es gibt leider nicht viele UI-Beispiele...ich hätte da gerne mehr bedienmöglichkeiten...ich mag viele Knöpfe und wenig Einstellungen per Texteingabe :)
Gruß Bismosa
@bismosa Guten Abend, da ich in der Sache sehr Aktiv war in einem anderen Modul, nun bitte teste es mal :-) Ich bin der Meinung nun geht der richtige Channel wenn du Ihn bedienst.
https://github.com/HomeAutoUser/SD_Keeloq__old_Jaro/commit/26e6e4a71dda31ed3182ba3c88eb8e90f79a7ff5
Teste mal bitte diese Variante https://github.com/HomeAutoUser/SD_Keeloq__old_Jaro/tree/fix_UI ob wir diese kleine Sache behoben haben ;-) ?
Mein Test verlief aus der Raumansicht und Detailansicht jeweils mit den dem geänderten Channel + Befehl.
LG Marco
Hallo! Ich habe das gerade mal getestet. Es funktioniert, aber begeistert bin ich um ehrlich zu sein nicht. Bitte nicht böse sein :) Ist vielleicht auch eine persönliche Meinung...nutzen würde ich den einzeiligen Modus vermutlich nie. Meine Kritikpunkte an dieser Lösung:
Sorry...ich würde auch gerne "die" Lösung präsentieren und nicht einfach nur rummeckern... :)
Ich glaube ich würde vorerst die letzte Änderung wieder rückgängig machen bis eine "optimalere" Lösung gefunden wurde...
Gruß Bismosa
Hallo,
Sind mehrere Devices im Raum ist das Flackern durch das neuladen der Seite sehr auffällig
Da könnte man die Zeit verkürzen.
Sind mehrere Tabs geöffnet und die Auswahl wird verändert wird dies nur in dem einen Tab aktualisiert. Die anderen Senden noch den "alten" eingestellten Kanal (jedoch immer das, was angezeigt wird) Wenn dann ein manueller Reload der Seite ausgeführt wird, wird der neu eingestellte Kanal verwendet...
Das ist aber normal zum Teil. Ein Weg wäre, das man beim Klick auf das aktive Fenster ein Refresh vorab machen kann. Leider gibt es dafür bisher keine FHEM Umsetzung mit der Aktualisierung wie du selbst mitbekommen hast.
Schlimmer noch, wenn ein oder mehrere SVG-Logs enthalten sind. Dann muss man nach jedem umschalten warten, bis die Seite neu angezeigt wird (Ich habe im gleichen Raum auch noch 2 SVG-Anzeigen)
Überall wo SVGs drin sind, werden bei einem Neuladen aktualisiert und je größer / mehr svg Daten, desto länger benötigt das. Es ist ein normales Verhalten.
Ich werde nochmal weiter testen. Mich stört der Weg bisher nicht und finde es eigentlich als Lösungsansatz recht gut.
Hallo!
Sorry. Bitte meine "Kritik" nicht falsch verstehen. Ich habe großen Respekt vor Deiner Arbeit!
Das ist aber normal zum Teil. Ein Weg wäre, das man beim Klick auf das aktive Fenster ein Refresh vorab machen kann. Leider gibt es dafür bisher keine FHEM Umsetzung mit der Aktualisierung wie du selbst mitbekommen hast.
Doch. Das gibt es in FHEM. Nennt sich Longpoll. Bei der vorherigen Variante über "FW_summaryFn" lief es ja auch problemlos. Bei einer Änderung der Auswahl wurde sofort in allen geöffneten Tabs diese Auswahl übernommen. In der "FW_summaryFn" wird bei der Änderung der "eigene" HTML-Code ausgetauscht. Nicht die ganze Seite neu geladen. Daher brauchen dann z.B. SVGs nicht neu geladen werden. Genauer gesagt bei jeder Statusänderung wird der HTML-Code ausgetauscht.
So funktioniert es ja auch in allen Geräten, die z.B. die Glühbirne bei Statusänderung anzeigen.
Readingsgroup funktioniert ja auch nicht über die "FW_summaryFn" sondern hier wurde es auch in der "FW_detailFn" gelöst (jedoch leider mit einer externen JS Datei).
Wen ich die Tage die Zeit dazu finde, werde ich mir das nochmal genauer anschauen und ausprobieren...irgendwie muss sich das doch lösen lassen...
Gruß Bismosa
Hallo! So...ich saß nun die ganze Nacht da dran...mich wurmt dieses Problem. Ich will ja auch nicht nur kritisieren ohne mich selbst damit zu beschäftigen :)
Ich habe nun mal eine Lösung gebastelt, die sogar funktioniert. Ob das die "optimale" Lösung ist, weiß ich allerdings nicht. Ich habe mal einen Pull-Request erstellt... https://github.com/HomeAutoUser/SD_Keeloq__old_Jaro/pull/15/commits/30d75e4904a975403b2c9b0f737011e12a794905 Hier sind auch viele Kommentare von mir drin mit meinen Erkenntnissen.
Was nun passiert: Bei Änderung der Auswahl wird nicht nur das Reading gesetzt, sondern auch ein Befehl zum aktualisieren des HTML. Dies wird mit der Funktion "FW_directNotify" umgesetzt. Wenn das JavaScript auf der Seite vorhanden ist, wird der HTML-Code neu geladen und der Part auf der Seite ersetzt. Vorteile:
Nachteile:
Hier gibt es bestimmt auch noch ein bisschen was zu optimieren. Ich habe nur keine Idee, wie wir neuen HTML-Code direkt ans JavaScript geben könnten.
Eine ganz andere Idee wäre noch, wenn man nicht das komplette HTML ersetzt, sondern im JavaScript nur die Befehle verändert, wenn die Auswahl geändert wurde. Das Spart die Abfrage.
Ich habe leider keine Zeit mich damit jetzt weiter auseinander zu setzen. Ich bin am Wochenende und vermutlich Anfang der Woche unterwegs. danach geht es weiter :)
Was meinst du dazu?
Gruß Bismosa
Hallo,
ich schaue es mir an und danke ebenso für deinen Willen das zu lösen. Ich bin selbst dran dort einen Weg zu suchen. Aktuell werde ich noch neu gewonnene Erkenntnisse später daheim testen. Wir finden einen optimalen Weg denke ich. „Daumen hoch“
Gruß Marco
Hallo! Manchmal dauert es halt etwas länger, bis eine Lösung gefunden wird. :)
Mein Wille das zu lösen ist ja nicht ganz uneigennützig...ich habe auch noch 2 andere Module, bei denen ich das gleiche Problem habe...
Schönes Wochenende
Gruß Bismosa
Hallo!
Wollte das doch mal eben auf meinem Produktivem FHEM testen...und siehe da...eine Zeile hatte ich vergessen anzupassen...
Gruß Bismosa
Hallo Bismosa, so einfach geht es nicht. Der Token muss mit eingearbeitet werden.
FHEMWEB WEB CSRF error: ne csrf_507447449257198 for client WEB_192.168.2.4_60633 / command get SD_Keeloq_9AF000 html. For details see the csrfToken FHEMWEB attribute.
Ich versuchte die Variable $FW_CSRF abzugreifen aber in unserem Code ist diese immer noch leer. Wo anders habe ich diese im Einsatz und da ist diese gefüllt ohne großes kund tun.
Gruß
PS: Mich lässt die Codeflut immer noch ein wenig Buachschmerzen aufkommen und überlege nach einem anderen Weg.
Ja...es ist viel geworden...und wie ich finde sehr verwirrend. Was besseres ist mir nicht eingefallen...oder hat nicht funktioniert.
Mist...ich benötige den token nicht...daher hat der weg bei mir schon geklappt.
Gruß Bismosa
Eigentlich sollte das https://github.com/HomeAutoUser/SD_Keeloq__old_Jaro/pull/15#issuecomment-526816650 hier her :-D
Eigentlich sollte das https://github.com/HomeAutoUser/SD_Keeloq__old_Jaro/pull/15#issuecomment-526894502 hier her. Sorry. Hier nochmal:
Hallo! Eigentlich könnte es mir ja egal sein...ich werde die einzeilige Variante vermutlich nie selbst nutzen. Ich denke aber das auch diese Variante gerne benutzt werden wird...deswegen ist mir das dann doch nicht so egal :) Wenn es als einziges Device im Raum ist, ist der Reload bei mir ebenfalls schnell. Wenn ich das im gleichen Raum habe wie auch meine anderen 4 Fernbedienungen (mit mehrzeilig) ist der Reload schon deutlich spürbar. Wenn ich dann noch mein SVG im Raum habe ist der Reload mit über 3sek. nervig.
Ich hatte da auch noch eine Idee, die ich jetzt mal ausprobiert habe. Mal als Diskussionsgrundlage.
18
Hier wird jetzt bei der Änderung der Auswahl nur noch der Wert im Reading gemerkt, aber keine Weitere Aktion ausgeführt. Wenn man einen Button betätigt, wird per JavaScript der FHEM Befehl abgesetzt...dabei wird vorher der Kanal aus dem Optionsfeld hinzugefügt. Damit entfällt der Reload. Bei einem SeitenReload wird der zuletzt eingestellte Kanal wieder übernommen...und in anderen Fenstern bleibt es bei der Einstellung, die auch zumindest in meinem Test problemlos funktionierte.
Lässt sich bestimmt noch verbessern. Kann ich Anfang der Woche mal probieren. Ist von Unterwegs nicht so einfach :)
Gruß Bismosa
Hallo, @bismosa ich habe etwas beim Testen mitbekommen und einen Fix offen gelegt. Wenn du das UI auf einzeilig setzt und aus der Roomansicht (nicht Detailansicht wenn du das Device anklickst) das Device bedienst, wird DDselect gesetzt aber das Reading vom Kanal nicht.