Fehler in FHEMWEB: Vorselektion von Auswahllisten geht manchmal nicht

Begonnen von Elektrolurch, 14 März 2015, 12:47:36

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,

ich habe jetzt mehrere Tage gebraucht, um die Systematik des Fehlers zu erkennnen:

Beispiel:

ein dummy hat eine setList Werteliste:Error,0,1,2,3,4,5

Der Wert der Werteliste (reading) sei bspw. 3
Die Anzeige des dummys und seine Werteliste (Auswahlliste erfolgt über eine readingsGroup (commands {'Werteliste' => 'Werteliste:'}).
Auf der Weboberfläche ist die Auswahlliste bei "3" vorselektiert.

Wird nun mit
readingsSingleUpdate($hash,'Werteliste','4',1)
ein neuer Wert gesetzt, so funktioniert das immer nur dann,

wenn der neue Wert HINTER dem alten Wert in der Werteliste liegt.

Liegt der neue Wert VOR dem alten Wert in der Werteliste (z.B. 2 oder 1), so wird der erste Wert in der Werteliste auf der Weboberfläche angezeigt, also der  Text "Error".


Im reading steht der korrekte Wert und nach Drücken von F5 wird dann auch der richtige Wert angezeigt.

Da ich einige sehr dynamische readingsGroups für die Einstellung von Heizungsprogrammen und der Rolladensteuerung gebaut habe, die auf Interaktion des Nutzers sich dynamisch ändern, ist der Fehler etwas unschön und stört WAF. :-)

Wenn  mir jemand sagen  kann, wo in der 01_fhemweb.pm die Vorselektion der Auswahlliste vorgenommen wird, kann ich ja selber mal versuchen, den Fehler zu finden.
Die Routine scheint unter den o.g. Bedingungen 0 als Position des Menüwertes (Auswahllistenposition) zurückzuliefern.
Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Warum gehst du von einem Fehler in FHEMWEB und nicht anderswo aus?
Ich kann in einem auf FHEMWEB und dummy vereinfachten Beispiel kein Problem entdecken:
fhem> define dx dummy
fhem> attr dx webCmd state
fhem> attr dx setList state:Error,0,1,2,3,4,5
fhem> set dx 2
fhem> set dx 1

Elektrolurch

Hallo Rudi,

der dummy ist bei mir in einer readingsGroup eingebunden. Habe noch eine andere Konstellation und da ist es exakt das selbe:

Sobald der neue ausgewählte Wert oberhalb des alten liegt, wird der oberste Wert in der Liste selektiert (also Error). In der anderen Richtung funktioniert es ja einwandfrei.
Sehr strange, aber eindeutig reproduzierbar.
Wo steht der Code in der fhemweb für die Menüliste?

Das Setzen erfolgt aus perl heraus mit readingsSingleUpdate.

Ich versuche mal ein Beispiel zu bauen und schau mal, ob es da einen Unterschied zwischen dem dummy direkt und der Repräsentation in der readingsGroup gibt.
Denke zwar nicht, da Andre ja an dieser Stelle sagt, er würde die fhemweb-Mechanismen aufrufen und ich in dem
attr rg commands {'Werteliste' => 'Werteliste:'}
auch nur auf setList verweise und keine eigene Menüliste definiere...


Wir  hatten ja da schon mal an dieser Stelle einen Bug, dass man "0" nicht setzen konnte....

Elektrolurch

configDB und Windows befreite Zone!

Elektrolurch

Hallo Rudi,

ich hänge mal zwei Dateien an:

1. die 99_myUtilstestlist.pm mit reload laden, für das notify
2. mit include die 00_Utilstestlist.cfg laden
3. auf die Seite testlist wechseln

Das "master" Menü sendet seine Werte per notify an die slave1 und slave2 readings von d2. Sobald ein niedriger Wert aus master ausgewählt wird, erscheint zwar dieser in slave1, aber das Menü slave2 springt auf den ersten Eintrag "error".

Ganz einfaches Beispiel... :-)

Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

ZitatGanz einfaches Beispiel... :-)

Nicht einfach genug fuer mich, ich verstehe nicht was da passieren soll, und wenn, dann warum.
readingsGroup ist nicht meine Spezialitaet, und es muss es auch nicht werden.
Bau ein Beispiel ohne, und dann koennen wir darueber reden, ob in FHEMWEB ein Problem gibt, und ob ich was fixen muss.
Wenn es ein readingsGroup Problem ist, dann muss andre dran.

Elektrolurch

Hallo Rudi,

dann noch Mal Mund gerecht und ohne readingsGroup:

1. das perl-Modul laden
2. die 00_utils_TestList.cfg mit include laden
3. setreading d1 master 5
damit ein Wert im reading "master" von d1  steht.
4. attr d1,d2 room testlist2
Nun sind nur hier die zwei dummys d1,d2 im Raum testlist2 zu sehen.
5. Nun das Menü von master z.B. auf 6 stellen. Der slave2 wird per notify und readingsBulkUpdate auch auf 6 gestellt.
6. Das gleiche mit 7 -> funktioniert auch.
7. Nun den master auf einen kleineren Wert stellen, z.B. 2 -> und siehe da der slave2 zeigt nicht zwei, sondern den ersten Menüeintrag "Error" an.
Drückt man nun F5 auf der Tastatur (oben die Reihe), dann wird der Bildschirm aktualisiert und siehe da -> der slave2 hat nun auch den Wert  -> das reading wurde korrekt gesetzt aber das Menü nicht!!!!2.


Die einzige Funktion, die da aufgerufen wird im notify ist "readingsBulkUpdate" und die gehört meines Wissens nicht zum Modul 33_readingsGroup.

Danke im voraus.


Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Zitatattr d1,d2 room testlist2
Damit kann ich nichts anfangen, dann habe ich zwei Raeume (testlist+testlist2), wo ich hin und herwechseln muss, d.h. longpoll kommt nicht zum Zuge.

Ich habe mal "attr d1,d2 room testlist" verwendet, damit alles auf einmal zu sehen ist.
Hier kann ich master auf beliebige Werte in beliebiger Reihenfolge setzen, und slave Status und Dropdown, d2 dropdown und d1 status werden gesetzt. d1 dropdown bleibt ungeaendert, ist aber kein Wunder, da es an dem d1-master Reading haengt, und der wird nicht geaendert, sondern nur der Status. Mit "setreading d1 master 3" laesst sich das d1 Dropdown aber auch aendern.
Mit F5 faengt Firefox an zu reden, das war aber bestimmt nicht gemeint. Getestet mit Firefox und Chrome.

-> viel Zeit verbracht, und weiss immer noch nicht, was kaputt sein soll.

Elektrolurch

#7
Zitat
attr d1,d2 room testlist2
Damit kann ich nichts anfangen, dann habe ich zwei Raeume (testlist+testlist2), wo ich hin und herwechseln muss, d.h. longpoll kommt nicht zum Zuge.

Die readingsGroup spielt ja hier auch keine Rolle, man kann d auch getrost löschen, der Fehler tritt rein bei den beiden dummys auf. Hin- und her wechseln war auch nicht gemeint.
Zitat:
Hier kann ich master auf beliebige Werte in beliebiger Reihenfolge setzen, und slave Status und Dropdown, d2 dropdown und d1 status werden gesetzt.

Das Setzen von Master bitte per Dropdown. Und wenn dann ein kleinerer Eintrag ausgewählt wird, wird beim slave der oberste Eintrag angezeigt "Error" und nicht der neue Wert.

Zitat:
d1 dropdown bleibt ungeaendert, ist aber kein Wunder, da es an dem d1-master Reading haengt, und der wird nicht geaendert, sondern nur der Status. Mit "setreading d1 master 3" laesst sich das d1 Dropdown aber auch aendern.

Das war auch unerheblich, da fehlt im notify ein
setreading d1 master $val.

Mit:
trigger d1 start

Wird im Abstand von 8 Sekunden master von d1 gesetzt und hochgezählt, dann geht es wieder abwärts und dann zeigt d2 slave "Error" an.
Dann muss man auch nicht d1 master - dropdown betätigen.


Zitat:
Mit F5 faengt Firefox an zu reden, das war aber bestimmt nicht gemeint. Getestet mit Firefox und Chrome.

F5 zeigt ja nur, dass das reading korrekt gesetzt wurde, aber das Menü nicht den korrekten Wert beim ersten readingsBulkUpdate anzeigt.
(Bei mir ist es der aktuelle Firefox)

Zitat:
-> viel Zeit verbracht, und weiss immer noch nicht, was kaputt sein soll.

Hintergrund:

Ich habe eine GUI gebaut, mit der man für ein oder alle Thermostate und für einen oder alle Werktage, bzw. Wochenende die Absenk- und Komfortzeiten setzen kann.
Werden mehrere ausgewählt, so wird überprüft, ob alle Zeiten übereinstimmen, dann wird dieser Wert angezeigt, wenn nicht, dann einen "-". Der ist bei mir der oberste Menüeintrag.
Die Interaktion ist also: Thermostat oder Wochentag auswählen und dann werden die vier dropdowns für die Schaltzeiten per readingsBulkUpdate automatisch befüllt.
Irgendwann ist mir aufgefallen, dass die Anzeige nicht plausibel ist und ich habe auch viel Zeit investiert, um den Fehler in meiner SW zu finden.
Nun habe ich durch systgematisches Testen herausgefunden, siehe  mein Beispiel oben, dass die Auswahl durch Setzen eines Wertes  des dropdowns immer dann nicht funktioniert, wenn der einzustellende Wert vor dem angezeigten Wert liegt.

Es muss einen Unterschied geben, ob readingsBulkUpdate den Wert in einem dropdown aktualisiert (hier der Fehler), oder ob die Seite komplett neu aufgebaut wird (dann ist die Anzeige korrekt).


Ich finde es schade, wenn immer so getan wird, als wäre das Humbucg, was andere Leute zu Fehlern schreiben...
Ich habe ja das Ergebnis hier konkret auf dem Bildschirm.

Wir hatten genau an der Ecke schon mal eine lange Diskussion, über das Setzen des Wertes "0" in einem dropdown.
Das ging nämlich auch nicht... if($val) -> if(defined($val)... oder so ähnlich war damals die Ursache.


Also noch mal meine Bitte: wo wird das dropdown von readingsBulkUpdate aus genau gesetzt? Dann schaue ich mir den Code mal selbst an... mich interessiert, wie die Berechnung des korrekten Listeneintrags für das dropdown erfolgt...



Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

ZitatDas Setzen von Master bitte per Dropdown. Und wenn dann ein kleinerer Eintrag ausgewählt wird, wird beim slave der oberste Eintrag angezeigt "Error" und nicht der neue Wert.
Habs genauso gemacht, mit dem master-dropdown Wert geaendert, slave passt sich an, egal welchen Wert ich in welcher Reihenfolge aendere.

ZitatWird im Abstand von 8 Sekunden master von d1 gesetzt und hochgezählt, dann geht es wieder abwärts und dann zeigt d2 slave "Error" an.
Bei mir zaehlt es von 1 bis 7 und dann bis 1. Wird alles perfekt im Browser angezeigt.


ZitatF5 zeigt ja nur, dass das reading korrekt gesetzt wurde,
Ich sags mal deutlicher: Ich habe kein Windows, bei mir tut F5 was ganz komisches. Du meinst vmtl. Seite neu laden, das tut F5 bei mir nicht.


ZitatIch finde es schade, wenn immer so getan wird, als wäre das Humbucg, was andere Leute zu Fehlern schreiben...
Das habe ich nie gesagt oder gemeint. Allerdings finde ich doof, wen man meint, dass ich (oder wer auch immer) aus ein paar hingeschmissenen Brocken das durchaus komplizierte System, was jemand aufgebaut hat, erraten kann. Kein FHEM Entwickler kennt FHEM mit allen Modulen so genau, dass man aus solchen Bruchstuecken das Problem raten kann. In diesem Fall liegt das Problem vmtl. auch anderswo, also ein zusaetzliches Modul, JavaScript, Browser, OS.

ZitatAlso noch mal meine Bitte: wo wird das dropdown von readingsBulkUpdate aus genau gesetzt? Dann schaue ich mir den Code mal selbst an... mich interessiert, wie die Berechnung des korrekten Listeneintrags für das dropdown erfolgt...
Generell funktioniert longpoll so:
- es wird ein Event generiert (mit readingsBeginUpdate+N*readingsBulkUpdate+readingsEndUpdate). Das Ergebnis sieht man auch im EventMonitor bzw. inform timer.
- FHEMWEB prueft, ob eine longpoll Verbindung zum Browser gibt, der an diesem Geraet interessiert ist (das haengt vom im Browser angezeigten Raum ab)
- wenn ja, dann schickt es das Event an dem Browser, das Event kann man in der JS-Console sehen (wichtig). Es werden mehrere Zeilen pro Event (Name/Status + Name/Timestamp + Kombi-Events aus Name+Reading/Wert) gesendet.
- in fhemweb.js / FW_doUpdate() wird gepueft, ob es ein HTML Element mit informId=<Quelle> gibt, wenn ja, dann wird dessen setValueFn aufgerufen.
- die fuer Dropdown zustaendige setValueFn wird in fhemweb.js/FW_createSelect() definiert, sie prueft nur, ob das Argument in der Auswahlliste ist, und wenn ja, dann setzt sie es.