Änderung für Slider mit Steps mit Kommastellen

Begonnen von Hachener, 14 September 2014, 13:26:50

Vorheriges Thema - Nächstes Thema

Hachener

Hallo,

ich weiß nicht ob das hier hin gehört aber ich habe bei mir die fhemweb_slider.js so verändert, dass Slider zumindest im Firefox auch Steps mit Nachkommastellen können. Vielleicht kann es einer gebrauchen.

Zeile 81  von   

   val = Math.floor(Math.floor(val/stp)*stp);

in

   val = Math.floor(val/stp)*stp;

Gruß, Thorsten

Jakl

Danke Thorsten für die Info. Genau danach habe ich gesucht!

Eine Frage an die Owner/Entwickler des Moduls, kann man das nicht grundsätzlich einbauen? Dann würden Ganz und Fließkommazahlen funktionieren?

rudolfkoenig

Koennte man, mache ich aber nicht, weil dann der FS20 dimmer nicht mehr funktioniert.

Jakl

Hallo rudolfkoenig,

vielen Dank für die Info. Aber man kann doch prüfen, ob es ein Integer oder Float ist und dementsprechend den gewünschten Weg einschlagen??

Z.B. sowas:

function isInt(n) {
   return n % 1 === 0;
}

if(isInt(stp)) {
  val = Math.floor(Math.floor(val/stp)*stp);
}
else
{
  val = Math.floor(val/stp)*stp;
}       



Obwohl das doch noch nicht mal nötig sein dürfte. Ich kenne die Problematik mit FS20 Dimmern nicht, aber die Funktion Math.Floor ist doch nur nötig, wenn die Variable stp ein Float ist und ich dringend einen Integer als Ergebnis benötige. Da es für FS20 Dimmer anscheinend nur Integer sein dürfen, ist derjenige doch selber Schuld, der ein Float als stp setzt. Oder?

Gruß,
Jakl

rudolfkoenig

ZitatIch kenne die Problematik mit FS20 Dimmern nicht

Soso, aber trotzdem Loesungswege vorschlagen. FS20 will folgende Werte haben:
06 12 18 25 31 37 43 50 56 62 68 75 81 87 93 100

Jakl

Zitat von: rudolfkoenig am 16 Oktober 2014, 16:25:49
Soso, aber trotzdem Loesungswege vorschlagen. FS20 will folgende Werte haben:
06 12 18 25 31 37 43 50 56 62 68 75 81 87 93 100

Nein, ich schlage keinen Lösungsweg für FS20 Dimmer vor, da hab ich kein Gerät. Jedoch möchte ich den Slider, wie vlt. auch andere User, auch für andere Geräte benutzen, die Fließkommazahlen benötigen.

Ich habe in folgenden Modulen eine Änderung gemacht, gedebuggt und getestet.
01_FHEMWEB.pm

sub
FW_sliderFn($$$$$)
{
  my ($FW_wname, $d, $FW_room, $cmd, $values) = @_;
  my @numvalues = split(",", $values); # To get settings like min,stp,max,flaot. z.B. 1,0.5,10,1
  return undef if (@numvalues < 4 and @numvalues > 5);
  return "" if($cmd =~ m/ /);   # webCmd pct 30 should generate a link
  my $min = $numvalues[1];
  my $stp = $numvalues[2];
  my $max = $numvalues[3];
  my $float = @numvalues == 5 ? $numvalues[4] : 0;
  my $srf = $FW_room ? "&room=$FW_room" : "";
  my $cv = ReadingsVal($d, $cmd, Value($d));
  my $id = ($cmd eq "state") ? "" : "-$cmd";
  $cmd = "" if($cmd eq "state");
  $cv =~ s/.*?([.\-\d]+).*/$1/; # get first number
  $cv = 0 if($cv !~ m/\d/);
  return "<td colspan='2'>".
           "<div class='slider' id='slider.$d$id' min='$min' stp='$stp' ".
                 "max='$max' float='$float' cmd='$FW_ME?cmd=set $d $cmd %$srf'>".
             "<div class='handle'>$min</div>".
           "</div>".
           "<script type=\"text/javascript\">".
             "FW_sliderCreate(document.getElementById('slider.$d$id'),'$cv');".
           "</script>".
         "</td>";
}


Und in fhemweb_slider.js

function
FW_sliderCreate(slider, curr)
{
  var sh = slider.firstChild;
  var lastX=-1, offX=0, maxX=0, val;
  var min = parseFloat(slider.getAttribute("min"));
  var stp = parseFloat(slider.getAttribute("stp"));
  var max = parseFloat(slider.getAttribute("max"));
  var isfloat = slider.getAttribute("float");
.
.
.
    function
    mouseMove(e)
    {
      var diff = e.clientX-lastX; lastX = e.clientX;
      offX += diff;
      if(offX < 0) offX = 0;
      if(offX > maxX) offX = maxX;
      val = min+(offX/maxX * (max-min));
  if(isfloat == "1")
  {
val = Math.floor(val/stp)*stp;
  }
  else
  {
val = Math.floor(Math.floor(val/stp)*stp);
  }   


Die Funktionalität für bestehende Installationen, egal ob FS20 Dimmer oder nicht, ist unverändert. Jedoch kann ein Benutzer, der einen Dummy mit Fließkommazahlen verwenden will, dies durch einen zusätzlichen Parameter in der slider Definition auch machen.
Durch attr XYZ setList state:slider,0,0.5,10,1 würden die halben Schritte auch als solche angezeigt. Ohne das ',1' am Ende oder mit einem anderen Wert, wäre das alte Verhalten wieder da.

So, Entschuldigung für den eventuell verbesserungswürdigen Code in Perl und JavaScript, das waren meine ersten Zeilen Code in diesen Sprachen. Ich bin normalerweise in anderen Sprachen unterwegs.

Wäre schön, wenn das in die offizielle Version einfliessen könnte.
Viele Grüße,
Jakl

rudolfkoenig

Kriege ich bitte das Ganze als diff -u, und die Dokumentation in FHEMWEB bitte auch nicht vergessen.

Jakl

Hallo,

ich hoffe, das ist so wie gewünscht.
Gruß,
Jakl


--- 01_FHEMWEB_orig.pm  2014-10-21 20:23:51.089174879 +0200
+++ 01_FHEMWEB.pm       2014-10-21 20:23:51.069174605 +0200
@@ -2438,10 +2438,13 @@
FW_sliderFn($$$$$)
{
   my ($FW_wname, $d, $FW_room, $cmd, $values) = @_;
-
-  return undef if($values !~ m/^slider,(.*),(.*),(.*)$/);
+  my @numvalues = split(",", $values); # To get settings like min,stp,max,flaot. z.B. 1,0.5,10,1
+  return undef if (@numvalues < 4 and @numvalues > 5);
   return "" if($cmd =~ m/ /);   # webCmd pct 30 should generate a link
-  my ($min,$stp, $max) = ($1, $2, $3);
+  my $min = $numvalues[1];
+  my $stp = $numvalues[2];
+  my $max = $numvalues[3];
+  my $float = @numvalues == 5 ? $numvalues[4] : 0;
   my $srf = $FW_room ? "&room=$FW_room" : "";
   my $cv = ReadingsVal($d, $cmd, Value($d));
   my $id = ($cmd eq "state") ? "" : "-$cmd";
@@ -2450,7 +2453,7 @@
   $cv = 0 if($cv !~ m/\d/);
   return "<td colspan='2'>".
            "<div class='slider' id='slider.$d$id' min='$min' stp='$stp' ".
-                 "max='$max' cmd='$FW_ME?cmd=set $d $cmd %$srf'>".
+                 "max='$max' float='$float' cmd='$FW_ME?cmd=set $d $cmd %$srf'>".
              "<div class='handle'>$min</div>".
            "</div>".
            "<script type=\"text/javascript\">".



--- fhemweb_slider.js   2014-10-21 20:23:51.109175154 +0200
+++ fhemweb_slider_orig.js      2014-10-21 20:23:57.509263092 +0200
@@ -36,7 +36,6 @@
   var min = parseFloat(slider.getAttribute("min"));
   var stp = parseFloat(slider.getAttribute("stp"));
   var max = parseFloat(slider.getAttribute("max"));
-  var isfloat = slider.getAttribute("float");
   var cmd = slider.getAttribute("cmd");

   function
@@ -79,14 +78,7 @@
       if(offX < 0) offX = 0;
       if(offX > maxX) offX = maxX;
       val = min+(offX/maxX * (max-min));
-         if(isfloat == "1")
-         {
-               val = Math.floor(val/stp)*stp;
-         }
-         else
-         {
-               val = Math.floor(Math.floor(val/stp)*stp);
-         }
+      val = Math.floor(Math.floor(val/stp)*stp);
       sh.innerHTML = val;
       sh.setAttribute('style', 'left:'+offX+'px;');
       if(cmd && cmd.substring(0,3) == "js:") {


rudolfkoenig

ich hoffe, das ist so wie gewünscht.
Teilweise.
- Format ist richtig (diff -u)
- der zweite diff ist "verkehrt-herum".
- Einrueckung passt nicht zum Rest
- Doku fehlt
- Manches wird nicht behandelt, z.Bsp. falls der slider im Javascript gebaut wird, im Detail-Fenster

Ich habe das alles nachgeholt, die Aenderungen minimiert, etwas getestet und eingecheckt.

Markus Bloch

Hallo zusammen,

ich glaube dass bei dieser Änderung sich ein Fehler eingeschlichen hat. Ich habe die aktuelle und vorherige Version von FHEMWEB verglichen und folgendes festgestellt.

Ich habe bei mir einen AV-Receiver der 2 slider via webcmd definiert hat. Bisher sah das immer so aus wie in "FHEMWEB r6611.png"

Im HTML Quellcode war folgendes zu sehen:

<td colspan='2'><div class='slider' id='slider.AV_Receiver-volume' min='0' stp='1' max='100' cmd='/fhem?cmd=set AV_Receiver volume %&room=Wohnzimmer'><div class='handle'>0</div></div><script type="text/javascript">FW_sliderCreate(document.getElementById('slider.AV_Receiver-volume'),'36');</script></td>


<td colspan='2'><div class='slider' id='slider.AV_Receiver-volumeStraight' min='-80' stp='1' max='16' cmd='/fhem?cmd=set AV_Receiver volumeStraight %&room=Wohnzimmer'><div class='handle'>-80</div></div><script type="text/javascript">FW_sliderCreate(document.getElementById('slider.AV_Receiver-volumeStraight'),'-45.5');</script></td>


Zwei Slider, alles gut.

Mit der aktuellen Version r6804 sieht das jedoch anders aus (siehe FHEMWEB r6804-png). Im HTML sieht das ganze folgendermaßen aus:

<td colspan='2'><div class='slider' id='slider.AV_Receiver-volume' min='0' stp='1' max='100' cmd='/fhem?cmd=set AV_Receiver volume %&room=Wohnzimmer' flt='0'><div class='handle'>0</div></div><script type="text/javascript">FW_sliderCreate(document.getElementById('slider.AV_Receiver-volume'),'36');</script></td>

<td colspan='2'><form method="post"><input type="hidden" name="arg.AV_Receiver" value="volumeStraight"/><input type="hidden" name="dev.AV_Receiver" value="AV_Receiver"/><input type="hidden" name="room" value="Wohnzimmer"/>volumeStraight&nbsp;<select onchange="submit()" id="AV_Receiver-volumeStraight" informId="AV_Receiver-volumeStraight" name="val.AV_Receiver" class="dropdown"><option value='slider'>slider</option>
<option value='-80'>-80</option>
<option value='1'>1</option>
<option value='16'>16</option>
</select><input type="hidden" name="cmd.AV_Receiver" value="set"/></form></td>


Die Usage-Meldung des zugrunde liegenden Moduls YAMAHA_AVR ist in beiden Fällen gleich:

Unknown argument ?, choose one of on:noArg off:noArg volumeStraight:slider,-80,1,16 volume:slider,0,1,100 volumeUp volumeDown input:audio,av1,av2 .........

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Prinzipiell funktionieren aber mehrere Slider, wie man das auf meinem Widget-Testsheet (dummy2) sehen kann.
Ich brauche etwas (am besten mit dummies), was ich nachstellen kann.

Markus Bloch

z.B. so:

define test dummy
attr test setList command1:slider,0,1,100 command2:slider,-10,1,16
attr test webCmd command1:command2


Sobald ein Slider einen negativen Berreich hat, funktioniert er nicht mehr in der Raum-Übersicht. In der Detail-Ansicht aber funktioniert er.

Wenn man den Slider in einen positiven Bereich bringt (z.B. "0,1,16") funktioniert er.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig


M_I_B

... is zwar schon wat älter, aber genau darum gehts ...

In der Raumansicht funktioniert das weder mit positiv/negativ wie im Beispiel, noch mit zwei positiven Werten; bei mir zumindest nicht.

define doppeltest dummy
attr doppeltest setList command1:slider,0,1,100 command2:slider,10,1,16
attr doppeltest webCmd command1:command2


Bewege ich Slider 2 von 10 > 16, wird zwar command2 auf 16 gesetzt, der Slider flutscht aber sofort wieder auf 10 zurück. Selbiges macht Slider 1... Bewege ich den von 0 auf 44, wird cvommand1 auf 44 gesetzt, der Slider springt aber sofort zurück auf 1, manchmal 2

rudolfkoenig

Ja stimmt, update von mehreren widgets in einer Reihe funktioniert nicht zuverlaessig.
Immerhin wird es etwas besser, wenn die Befehle kein Ziffer enthalten also commandA,commandB.