Werteliste von dropdown - Menu (Auswahlliste) aktualisieren

Begonnen von Elektrolurch, 07 September 2015, 11:44:48

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,

ich habe ein Modul in Entwicklung, bei dem verschiedene readings über dropdown - Menus (Auswahllisten) (in einer readingsGroup) dargestellt werden.
Jetzt hängen die Wertelisten der dropdown-Menues vom Zustand des devices ab, so z.B.

a)
$sets{Sender} = 'kein,extern'; oder
b)
$sets{Sender} = 'kein,extern,ARD,ZDF,SWF';

Das hinterlegte reading 'Sender' beim device kann ich ja mit
readingsSingleUpdate($hash,'Sender',$neuer_sender,1);

aktualisieren.

Das %sets wird beim device dazu verwendet, um auf
set devicename ?
die Listen zu generieren, d.h. ändere ich wie oben von a) nach b), so wird das Auswahlmenu mit der neuen Werteliste erst nach dem kompletten Refresh des Screens aktualisiert.

Gibt es in fhem eine Mehtode, nur die Werteliste, vergleichbar mit der Aktualisierung des Wertes über readingsSingleUpdate, durchzuführen, ohne dass der ganze Screen neu aufgebaut werden muss?


Der Auszug aus der html-Seite sieht so aus:
<div class='fhemWidget' informId='SonosCC_rg1-SonosCC.Sender' cmd='Sender' reading='Sender' dev='SonosCC' arg='extern,kein,Amsterdam#Funk#Channel,Antenne#Bayern,B5#aktuell,Bayern#2,Bayern#3,Deutschlandfunk,NRJ#Energy#München,Radio#Gong,Top#FM,Österreich#1,Радио#Шансон' current='ANTENNE BAYERN'></div></div>

readingsSingleUpdate ändert wohl den Wert in "current", es müsste doch auch möglich sein, den Wert in "arg=" zu ändern?

Jemand einen Tipp?
Möglichst ohne Java, dass kann ich nämlich nicht :-(

Falls es  so eine Methode noch nicht geben sollte, wäre das dann mein Ergänzungsvorschlag (Wunschliste)
Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

ZitatGibt es in fhem eine Mehtode, nur die Werteliste, vergleichbar mit der Aktualisierung des Wertes über readingsSingleUpdate, durchzuführen, ohne dass der ganze Screen neu aufgebaut werden muss?

Nein. Du kannst aber vom Modul ein reload der Seite anstossen, Stichwort ist "trigger WEB JS:location.reload(true)", bzw. FW_directNotify


ZitatMöglichst ohne Java, dass kann ich nämlich nicht :-(
Brauchst du auch nicht, Java gibts im FHEM Umfeld kaum, ich kenne nur ein Schnittstellenprojekt von 2(?) Studenten. Du brauchst JavaScript, das hat aber mit Java nicht viel zu tun.

Elektrolurch

Hallo Rudi,
danke für die rasche Antwort. Mit dem triggern der ganzen seite hatte ich schon mal herumgespielt.
1. Dauert es zum Teil recht lange und
2. habe ich gelegentlich einen merkwürdigen Seiteneffekt. Wenn ich zwei Browser-Fenster offen habe und das updaten des im Vordergund befindlichen Fenster über fhem anstosse, dann springt das Fenster dahinter nach vorne und hat den Fokus.

Ein update der Wertelisten über longpoll wäre da schon schöner. Lässt sich so eine Funktion nicht bauen? Sie müsste doch analog wie readingsSingleUpdate funktionieren, nur dass sie nicht "current" sondern "arg" - Werte ändert, oder sehe ich das zu simpel?

Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Der Browser hat beim Abholen der Seite die Menge der moeglichen Werte bekommen (set X ?), und stellt diese dar (dropdown/slider/etc). readingsSingleUpdate aendert ein Wert, und sagt dem Browser Bescheid, voraufhin der Browser anhand des Namens ein HTML-DOM-Element sucht, und hier setValueFn mit dem Wert aufruft.

Du benoetigst eine JS-Funktion RenewDropdown, was ein "set name ?" absetzt, und mit dem Ergebnis das bisherige Select umbaut. Diese Funktion koennte man aus dem FHEM-Modul per FW_directNotify('name', 'JS:RenewDropdown("name")') aufrufen. Ist vermutlich nicht die didaktisch optimale erste Aufgabe, um JS zu lernen.

Elektrolurch

Eigentlich müsste es doch so eine Art Standardlösung dafür bereits geben. Jedes Modul, welches selbst Elemente auf dem Screen aktualisiert, ohne die Standardmechanismen von fhem zu nutzen, müsste dass doch so aufbauen. Ich denke da z.B. an readingsGroup, readingsHistory oder FBCallist...

Als Anwendungsfall für die dynamische Aktualisierung von Wertelisten sehe ich z.B. auch Anwendungen, bei denen man durch einen Baum navigieren möchte (z.B. Suchfunktion für Sonos-Player auf Basis des vorhandenen Bestandes).
"Zweistufige" Menues habe ich z.B. bei der Programmierung der Raumthermostate, bzw. der Rolladensteuerung (Wochentag, Uhrzeit, die Folgeuhrzeit ist immer größer, als die vorangegangene Uhrzeit und die Werteliste wird so dynamisch eingestellt, so dass keine Fehleingaben erfolgen können).

Vielleicht liest ja hier jemand mit, den das Thema interessiert und der die Aktualisierung per JS von Screeninhalten schon mal programmiert hat...

Unten herausfallen müsste eine Funktion:

readingsOptionListUpdate($hash,<reading>,<Optionlist>);

Und die Optionlist wäre genau das, was man im setList - Attribut angeben kann.

Elektrolurch
configDB und Windows befreite Zone!