Werteliste und Slider kein Refresh der kompletten Seite

Begonnen von Hoschiq, 19 August 2014, 23:08:30

Vorheriges Thema - Nächstes Thema

marvin78

Ich kann das Verhalten ebenfalls bestätigen. Sobald man mit der Werteliste (Dropdown) ein set macht, das nicht auf state abzielt, funktioniert es nicht. Wie justme1968 schon schreibt, wird das entsprechende Kommando nicht in den set Befehl mitgenommen. Schaut man sich das ganze in der Javascript-Konsole an, findet man in den Parametern den set Befehl ohne das entsprechende Kommando.

rudolfkoenig

Ich habe den letzten FHEMWEB/dropdown Patch wieder ausgebaut, und es fuer den sofortigen update bereitgestellt.

Falls die hier erwaehnten Problemfaelle in einem neuen Patch beruecksichtigt werden, dann werde ich es wieder einspielen.

Hoschiq

Ich werde mir das fehlerhafte Verhalten einmal anschauen..


@justme1968 wenn man den Beispiel Dummy (siehe unten) nimmt und in der Befehlszeile den Befehl
"set d reading 1" ausführt wird der state des dummies auf "reading 1" gesetzt. Ist das in diesem Fall das gewünschte Verhalten?

Sollen readings des Devices aktualisiert werden so muss ja laut doku setreadings verwendet werden.
Die Frage ist nun, muss die Werteliste immer den Befehl "set" verwenden oder auch einmal setreadings?

define dummy d
attr d setList reading:1,2,3
attr d webCmd reading

Anbei eine Testversion, die den set Befehl verwendet und auch andere Readings als state unterstützt, diese muss in 01_FHEMWEB.pm eingebaut werden und ersetzt die dortige Funktion FW_dropdownFn. Bitte einmal testen.

FW_dropdownFn()
{
  my ($FW_wname, $d, $FW_room, $cmd, $values) = @_;

  return "" if($cmd =~ m/ /);   # webCmd temp 30 should generate a link
  my @tv = split(",", $values);
  # Hack: eventmap (translation only) should not result in a
  # dropdown.  eventMap/webCmd/etc handling must be cleaned up.
  if(@tv > 1) {
    my $txt;
    if($cmd eq "desired-temp" || $cmd eq "desiredTemperature") {
      $txt = ReadingsVal($d, $cmd, 20);
      $txt =~ s/ .*//;        # Cut off Celsius
      $txt = sprintf("%2.1f", int(2*$txt)/2) if($txt =~ m/[0-9.-]/);
    } else {
      $txt = ReadingsVal($d, $cmd, Value($d));
      $txt =~ s/$cmd //;
    }

    my $fpname = $FW_wname;
    $fpname =~ s/.*floorplan\/(\w+)$/$1/;  #allow usage of attr fp_setbutton
my $readng;
    if ($cmd eq "state" ){
         $readng = "";
    } else {
         $readng = "$cmd"." ";
    }
    my $fwsel;
        $fwsel = ($cmd eq "state" ? "" : "$cmd ") .
              FW_select("$d-$cmd","val.$d", \@tv, $txt,"dropdown","FW_cmd('$FW_ME?XHR=1&cmd.$d=set $d $readng '+ this.options[this.selectedIndex].value+ ' &room=$FW_room')");
     return "<td colspan='2'>".
      "$fwsel</td>";
  }
  return undef;
}

justme1968

@Hoschiq:

du musst hier tatsächlich zwischen dummys und 'echten' devices unterscheiden.

ein echtes device hat normalerweise ein zum reading passendes set kommando und dieses soll ausgeführt werden. der dummy hat dieses passende set kommando nicht deshalb landet der komplette string in state. das verhalten ist also erst mal korrekt. setreading wäre für die normalen devices verkehrt.

nur wenn es sich wirklich um einen dummy handelt (oder eventuell auch für devices die kein passendes set anbieten) ist setreading das richtige. ersteres sollte meiner meinung nach passieren, zu letzterem hat rudi sicher was zu sagen.

gruss
  andre

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

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

karl0123

Wenn ich das richtig sehe, geht es aber hier doch gar nicht um das Setzen von readings. Ein erweiterter set Befehl mit einem Kommando setzt nicht notwendigerweise ein reading auf einen Wert. Das Kommando muss in einem Device ja nicht einmal als reading existieren.

justme1968

deswegen habe ich ja geschrieben das zwischen dummy und 'echtem' device unterschieden werden muss. für das device ist das set mit kommando richtig. für den dummy ist das setreading richtig.

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

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

rudolfkoenig

Dass fuer dummy ein setreading verwendet werden soll, sehe ich nicht.
Set bleibt set, keine Ausnahmen fuer manche Geraete, war bisher auch nicht der Fall.

justme1968

dann gibt es (weiterhin) leider keine möglichkeit in einem dummy per frontend mehr als state zu setzen.

das ist schade...
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

justme1968

#23
wenn man dem dummy schon mit setList 'kommandos' oder widgets zu einem anderen reading als state zuordnen kann sollte das auch mit setreading auf dieses reading gehen.

bei einem dummy sollte setreading statt set berwenset werden wenn das kommando in der setList ist.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Hoschiq

Der oben gepostete Patch unterstützt das Verhalten, wie es Rudi vorschlägt, also ausschließlich set.

Ich hätte noch eine alternativen Vorschlag bzgl. set und setreading.
Man könnte um unabhängig von Devices bzw. Dummies zu bleiben die Definition von setList erweitern.

Beispiel:


setList state:1,2,3,4
setList test:1,2,3,4
setList test:1,2,3,4:r


Die erste Definition zielt auf state ab und ist wie gewohnt. Es wird der set Befehl verwendet.
Die zweite Definition setzt mit set den Wert von test bei einem echtem Device. Es wird der set Befehl verwendet.
In der dritten Definition wird durch das angehängte :r definiert, dass es sich um ein Dummy reading oder um ein userReading eines echten Devices handelt. Hier wird setreading verwendet.

Somit könnte die Werteliste sehr universell eingesetzt werden, ohne spezielle Devices zu unterscheiden. Allein die Definition entscheidet über den abgesetzen Befehl.
Das müsste dann aber auch bei slider und time nachgezogen werde.

justme1968

mal sehen ob rudi überhaupt bereit ist dazu.

es vom device abhängig zu machen hätte den vorteil das es keine zweideutigkeiten beim parsen gibt.

wenn es explizit hingeschrieben wird würde ich es lieber vorne beim reading/commando namen sehen. z. b. <name>[,r]:...

da , im reading namen Bucht erlaubt ist wäre es ohne konfliktpotential.

und ja. die anderen widgets sollten dann nachgezogen werden. also slider, time, test, colorpicker und die dials die hoffentlich noch kommen.

ich fände es ein sehr nützliches feature.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Elektrolurch

Hallo,

da das Thema setList hier nun doch ausführlicher diskutiert wurde, möchte ich auf einen Bug hinweisen:

attr Test myreading:aus,0,1,2,23
attr Test webCmd myreading

Setzt man bei dem dummy mit setreading Test myreading <Wert>

Wird an der Weboberfläche das durch entsprechende Vorauswahl des passenden Menüeintrages auch visualisiert.

Nur nicht für den Wert "0".

Dies scheint bisklang nicht aufgefalen zu sein, da meist "0" in setList der oberste Wert ist.

Hat mich einige Nerven gekostet, weil ich zuerst den Fehler in meinem Code gesucht habe.
Ich denke, dass da beim Menü-Widget so eine Abfrage wie if($value... drin steht und damit "0" als Wert rausfällt.
Konte die Stelle aber in der fhemweb nicht finden, das war mir dann doch zu komplex...

Gruß

Elektrolurch
configDB und Windows befreite Zone!

karl0123

0 wird wohl nicht aktualisiert, weil es in Perl dem Wert False entspricht!?

justme1968

eher weil irgendwo eine bedingung falsch geprüft wird. vermutlich ein if($value) das eigentlich if(defined($value) && $value ne "") heißen muss.

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

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

Elektrolurch

Ich wollte es ja finden, bis zur Abarbeitung  von webCmd und den Verzweigungen bzgl. slider,menü usw. bin ich noch gekommen, danach habe ich nur Bahnhof verstanden. Es muss ja die Stelle sein, an der der Wert des readings in die Web-Oberfläche abgebildet wird....
configDB und Windows befreite Zone!