widgetOverride für webCmd

Begonnen von Manul, 09 Juli 2017, 09:35:20

Vorheriges Thema - Nächstes Thema

Manul

Ich habe für eine device ein userReading angelegt, das sich durch ein cmdAlias per "set <device> <userReading> <value>" auf bestimmte, festgelegte Werte setzen lässt. Jetzt hätte ich in der Übersicht gerne eine Dropdown-Auswahl für diese Werte.

Mein Versuch war, den Namen des Readings in das webCmd der device und einen Eintrag der Form "<userReading>:<value1>,<value2...>" ins widgetOverride aufzunehmen. Das führte nicht zum Erfolg.

Nach Lektüre des FHEMWEB-Quelltextes glaube ich zu verstehen, warum das so ist: In FW_makeDeviceLine wird FW_widgetOverride nur für $allSets aufgerufen, nicht aber für $cmdlist. Das würde auch nichts bringen, da $cmdlist colon separated ist und FW_widgetOverride lediglich zusätzliche commands zufügen würde. $allSets enthält die sets, die durch mein cmdAlias möglich werden, natürlich nicht.

Ich habe keine Möglichkeit gefunden, mein gewünschtes Ergebnis trotzdem zu erreichen. Hat jemand eine Idee?

rudolfkoenig

Ein Problem ist, das cmdAlias generisch ist, und es ist nicht einfach abzuleiten, fuer welches Geraet es welche zusaetzlich Sachen (set/get/attr/etc) zur Verfuegung stellt.

Meine naechste Idee war, zur Liste der Befehle in FHEMWEB die aus widgetOverride extrahierten hinzuzufuegen, leider wird widgetOverride fuer set, get, und attr verwendet, und ueberall das Gleiche hinzuzufuegen ist verwirrend.

Falls jemand einen guten Vorschlag hierfuer findet, bin ich offen es zu implementieren.

justme1968

keine idee um es sauber und allgemeingültig zu implementieren, aber ein unsauberer workaround: leg mit cmdalias nicht ein neues kommando an sondern biege eines der vorhandenen die du nicht (oft) brauchst um. dann kannst du in webCmd verwenden. unter welchem namen es erscheint kannst du mit eventMap anpassen.

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Manul

Zitat von: rudolfkoenig am 09 Juli 2017, 11:32:59
Ein Problem ist, das cmdAlias generisch ist, und es ist nicht einfach abzuleiten, fuer welches Geraet es welche zusaetzlich Sachen (set/get/attr/etc) zur Verfuegung stellt.

Meine naechste Idee war, zur Liste der Befehle in FHEMWEB die aus widgetOverride extrahierten hinzuzufuegen, leider wird widgetOverride fuer set, get, und attr verwendet, und ueberall das Gleiche hinzuzufuegen ist verwirrend.

Falls jemand einen guten Vorschlag hierfuer findet, bin ich offen es zu implementieren.

Wie gesagt habe ich heute morgen mal im Sourcecode geschaut und auf Anhieb keine Lösung gefunden. Ich empfinde die Variablenbezeichnungen teilweise als etwas kryptisch, zumindest für mich ist der Sourcecode nur schwer zu überschauen.

Prinzipiell sehe ich bis jetzt 2 Lösungsmöglichkeiten: Entweder man wendet widgetOverride prinzipiell auf alle webCmds an, d.h., wenn ein angegebenes webCmd einen Schlüssel in widgetOverride hat, wird dieses widget angewendet. Oder man erlaubt eine Möglichkeit, die Funktionen getAllSets usw. explizit zu ergänzen. Was davon einfacher umzusetzen ist, sehe ich nicht auf Anhieb. Wenn eine der Varianten akzeptabel wäre, könnte ich mich aber gerne mal dran versuchen.

Zitat von: justme1968 am 09 Juli 2017, 11:51:22
keine idee um es sauber und allgemeingültig zu implementieren, aber ein unsauberer workaround: leg mit cmdalias nicht ein neues kommando an sondern biege eines der vorhandenen die du nicht (oft) brauchst um. dann kannst du in webCmd verwenden. unter welchem namen es erscheint kannst du mit eventMap anpassen.

Keine schlechte Idee, danke für den Tip! Wenn ich keine ganz saubere Lösung finde, komme ich darauf zurück. Frage dazu: Gäbe es eine Möglichkeit, aus dem umgebogenen Cmd auf das originale zuzugreifen?

justme1968

#4
auch das geht. aber eher unsauber. du kannst ein bestehendes kommando mit
parametern verwenden und die normalen durch reichen und nur deine ergänzten anders behandeln.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Manul

Zitat von: justme1968 am 09 Juli 2017, 13:52:43
auch das geht. aber eher h sauber. du kannst ein bestehendes kommando mit
parametern verwenden und die normalen durch reichen und nur deine ergänzten anders behandeln.

"h sauber"="unsauber"?

Wie würde das denn gehen?

Manul

Diese Lösung für Variante 1


--- 01_FHEMWEB.pm.dist  2017-07-13 07:34:21.835687267 +0200
+++ 01_FHEMWEB.pm       2017-07-13 07:52:54.188237786 +0200
@@ -1698,7 +1698,8 @@
     foreach my $cmd (split(":", $cmdlist)) {
       my $htmlTxt;
       my @c = split(' ', $cmd);   # @c==0 if $cmd==" ";
-      if(int(@c) && $allSets && $allSets =~ m/\b$c[0]:([^ ]*)/) {
+      my $tempSets = join(" ",$allSets,FW_widgetOverride($d,$cmd));
+      if(int(@c) && $tempSets && $tempSets =~ m/\b$c[0]:([^ ]*)/) {
         my $values = $1;
         foreach my $fn (sort keys %{$data{webCmdFn}}) {
           no strict "refs";


scheint für mich zu funktionieren. Hab ich was übersehen?

rudolfkoenig

Die Idee ist gut, ich habe eine weniger CPU-intensive Variante eingebaut, getestet und eingecheckt.

Bitte um Feedback.

Manul