Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UI - Einzeilig - Bedienung von Raum legt kein Reading an #11

Open
HomeAutoUser opened this issue Aug 10, 2019 · 28 comments
Open

UI - Einzeilig - Bedienung von Raum legt kein Reading an #11

HomeAutoUser opened this issue Aug 10, 2019 · 28 comments
Assignees
Labels
bug Something isn't working

Comments

@HomeAutoUser
Copy link
Collaborator

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.

@HomeAutoUser HomeAutoUser added the bug Something isn't working label Aug 10, 2019
@bismosa
Copy link
Collaborator

bismosa commented Aug 10, 2019

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

@HomeAutoUser
Copy link
Collaborator Author

Hallo,
ich drückte mich vielleicht ein wenig Informationsbehaftet aus :-D

  • stell das UI bitte auf einzeilig mal
  • schau vorher welche Readings vorhanden sind bzw. wie Ihre Zeitstempel sind
  • wechselst du in die Raumansicht und drückst einen Kanal zur Steuerung
  • wechselst in die Detailansicht und überprüfst die Readings nach dem Zeitstempel

Nun sollte der soeben gedrückte Kanal nicht aktualisiert sein oder das Reading fehlt wenn der Kanal noch nicht als Reading existent war.

Gruß

@bismosa
Copy link
Collaborator

bismosa commented Aug 10, 2019

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

@bismosa
Copy link
Collaborator

bismosa commented Aug 10, 2019

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: #10

Gruß
Bismosa

@bismosa bismosa mentioned this issue Aug 20, 2019
@HomeAutoUser
Copy link
Collaborator Author

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ö :-)

@HomeAutoUser
Copy link
Collaborator Author

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 :-)

@bismosa
Copy link
Collaborator

bismosa commented Aug 25, 2019

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

@HomeAutoUser
Copy link
Collaborator Author

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.

@bismosa
Copy link
Collaborator

bismosa commented Aug 25, 2019

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...

@HomeAutoUser
Copy link
Collaborator Author

@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

@bismosa
Copy link
Collaborator

bismosa commented Aug 26, 2019

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

@bismosa
Copy link
Collaborator

bismosa commented Aug 26, 2019

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

@HomeAutoUser
Copy link
Collaborator Author

@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 ;-)

@bismosa
Copy link
Collaborator

bismosa commented Aug 26, 2019

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

@HomeAutoUser
Copy link
Collaborator Author

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.

@bismosa
Copy link
Collaborator

bismosa commented Aug 26, 2019

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

HomeAutoUser added a commit that referenced this issue Aug 28, 2019
@HomeAutoUser
Copy link
Collaborator Author

@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.

26e6e4a

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

@bismosa
Copy link
Collaborator

bismosa commented Aug 29, 2019

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:

  • Sind mehrere Devices im Raum ist das Flackern durch das neuladen der Seite sehr auffällig
  • 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)
  • 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...

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

@HomeAutoUser
Copy link
Collaborator Author

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.

@bismosa
Copy link
Collaborator

bismosa commented Aug 29, 2019

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

@bismosa
Copy link
Collaborator

bismosa commented Aug 30, 2019

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... 30d75e4
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:

  • Wenn die Auswahl verändert wird, wird dies in allen geöffneten Tabs aktualisiert.
  • Es wird nicht die ganze Seite neu geladen, sondern nur der eigene HTML-Code
  • es wird auf eine externe JavaScript-Datei verzichtet

Nachteile:

  • Nach dem setzen der Auswahl kommt es zu einer kleinen Verzögerung bis der HTML-Code neu generiert und ausgetauscht wird. Muss mal getestet werden, wie lange das wirklich dauert. Ich habe es nicht geschafft nach einer neuen Auswahl einen Button zu betätigen, der noch nicht aktuell war.

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

@HomeAutoUser
Copy link
Collaborator Author

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

@bismosa
Copy link
Collaborator

bismosa commented Aug 30, 2019

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

@bismosa
Copy link
Collaborator

bismosa commented Aug 30, 2019

Hallo!

Wollte das doch mal eben auf meinem Produktivem FHEM testen...und siehe da...eine Zeile hatte ich vergessen anzupassen...

Siehe: b16e77e

Gruß
Bismosa

@HomeAutoUser
Copy link
Collaborator Author

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.

@bismosa
Copy link
Collaborator

bismosa commented Aug 30, 2019

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

HomeAutoUser added a commit that referenced this issue Aug 31, 2019
@HomeAutoUser
Copy link
Collaborator Author

Eigentlich sollte das #15 (comment) hier her :-D

@bismosa
Copy link
Collaborator

bismosa commented Sep 2, 2019

Eigentlich sollte das #15 (comment)
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Development

No branches or pull requests

2 participants