Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fehler in ProofAndSetValue bei Gleitkommawerten #1058

Closed
jp112sdl opened this issue Jan 5, 2021 · 127 comments
Closed

Fehler in ProofAndSetValue bei Gleitkommawerten #1058

jp112sdl opened this issue Jan 5, 2021 · 127 comments
Labels
⚓ upstream issue This is a bug/issue for/in upstream software (OCCU, etc.) 🐛 bug-report Something isn't working 🏷️ WebUI This refs the WebUI component 🙏 help wanted Extra attention is needed

Comments

@jp112sdl
Copy link
Contributor

jp112sdl commented Jan 5, 2021

Describe the bug
Wenn ein Geräteparameter als min / max Grenze einen Gleitkommawert besitzt, der nicht auf .0 endet, kommt es zu Problemen in der WebUI.

Ich habe 3 Konsolenmeldungen eingebaut.

An denen kann man gut sehen, dass die Eingabe in einem Feld, das eigentlich Float zulässt (Wertebereich 0.00 - 7.00) funktioniert - auch wenn in den "float is not allowed"-Zweig eingestiegen wird.

Die Eingabe in einem anderen Feld (0.50 - 15.50) ist kaum bis schwer möglich.

  • Beim Löschen des letzten Zeichens werden sofort alle Dezimalstellen entfernt.
  • Entfernt man dazu noch die Ganzzahl, erscheint "NaN".
  • Eine erneute Eingabe einer Gleitkommazahl ist nicht oder nur schwer (per Copy&Paste) möglich
    • jede Eingabe eines "." wird sofort entfernt (sieht man in dem Screencast glaub ich nicht, weil es zu schnell passiert).

Das Problem betrifft nicht nur den Rollladenaktor

System information:

  • RaspberryMatic Version: 3.55.5.20201226
  • Used Hardware: Pi3b
  • Used HomeMatic RF-Module: RPI RF MOD

Additional context
...

@jens-maus
Copy link
Owner

In der Tat ist diese ganze ProofAndSetValue Methode/Funktion kompletter Müll IMHO :) Schon beim letzten Fix hätte ich das ganze am liebsten auf den Müll geworfen und hätte es komplett neu geschrieben. Aber das würde zuviele Änderungen reinbringen die dann sicherlich niemals zum originalen CCU3 Image zurückwandern würden.

Trotzdem gebe ich die Hoffnung nicht auf das wir vielleicht im Rahmen von RaspberryMatic hier die Funktion zumindest zu repariert bekommen das man sie bedienen kann. Wenn du also einen PR bzw. Änderungsvorschlag hast dann bitte her damit und wir schauen das wir da zumindest eine kleine Verbesserung reinbringen können.

@jens-maus jens-maus added 🐛 bug-report Something isn't working 🏷️ WebUI This refs the WebUI component labels Jan 5, 2021
@jp112sdl
Copy link
Contributor Author

jp112sdl commented Jan 5, 2021

und hätte es komplett neu geschrieben

Aber was ist an der Methode, wie sie die ganzen Jahre bis zu 3.55 eingebaut war, verkehrt?
Mir erschließt sich auch nicht, warum eQ-3 da dran rum gebaut hat.

Wenn du also einen PR bzw. Änderungsvorschlag hast dann bitte her damit und wir schauen das wir da zumindest eine kleine Verbesserung reinbringen können.

Ich möchte eigentlich auch mal wieder was anderes machen, als nur WebUI bauen/fixen.

In der Hoffnung, dass eQ-3 bald eine neue, reparierte CCU FW Version raus bringt, verwende ich erstmal weiter die alte abgehangene ProofAndSetValue.

@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 6, 2021

Bin nun heute auch drüber gestolpert.
Meine "Fenster Auf" Temperatur in den IP-Gruppen setze ich immer auf "krumme" Werte wie z.B. 10.5°C.
Das ist momentan über die WebUI nicht möglich da immer "abgerundet" wird. In diesem Beispiel auf 10°C.

@libertyx82
Copy link
Contributor

Hab auch das Problem, kann die Hysterese bei der DV eines HM-TC-IT-WM-W-EU mit einem HM-LC-Sw1-FM nicht mehr auf einen Gleitkommawert setzten.

@libertyx82
Copy link
Contributor

libertyx82 commented Jan 18, 2021

Ich was mal so frei und hab das eQ-3 gemeldet.

vielen Dank für Ihre Nachricht.

Das Verhalten können wir nachstellen und wird in einem zukünftigen Update behoben.
Als Workaround können wir Ihnen derzeit nur empfehlen die CCU3 auf die vorherige Firmware downzugraden und die notwendigen Einstellungen dort vorzunehmen.

@jens-maus jens-maus added 🙏 help wanted Extra attention is needed ⚓ upstream issue This is a bug/issue for/in upstream software (OCCU, etc.) labels Jan 18, 2021
@jens-maus
Copy link
Owner

jens-maus commented Jan 18, 2021

@jp112sdl

In der Hoffnung, dass eQ-3 bald eine neue, reparierte CCU FW Version raus bringt, verwende ich erstmal weiter die alte abgehangene ProofAndSetValue.

Kannst du nochmal exakt die Version von ProofAndSetValue() hier zeigen die du verwendest und die keinerlei Probleme bei Gleit- und Integerwerten macht? Dann könnte ich die vorrübergehend auch wieder einbauen bis eQ3 reagiert hat.

@jp112sdl
Copy link
Contributor Author

jp112sdl commented Jan 18, 2021

aus 3.53.30

ProofAndSetValue = function(srcid, dstid, min, max, dstValueFactor, event)
{
  // Falls das Tasten-Event nicht mit ¸bergeben wurde ....
  var keyCode = 0,
    finalVal;

  if (event) {
    keyCode = event.keyCode;
  }

  var ok = true;
    
  if (! min) min = 0;
  if (! max) max = 100;
  if (! dstValueFactor) dstValueFactor = 0.01;//dstValue = value/100
  
  value = $F(srcid);
  
  //replace , by .
  var idx = value.indexOf(',');
  if (idx >= 0)
  {
    var tokens = value.split(",");
    
    value = "";
    if (tokens[0]) value += tokens[0];
    value += '.';
    if (tokens[1]) value += tokens[1];

    $(srcid).value = value;
  }

  //User is already editing?
  if (value.charAt(value.length-1) == '.') return;

  if (! value)
  {
    //alert("Keine Zahl.");
    //value = 0;
    //$(dstid).value = min;
    finalVal = min;
    ok = false;
  }
  else if (isNaN(value))
  {
    //alert("Keine Zahl.");
    //value = min;
    finalVal = min;
    ok = false;
  }
  else if (value < min)
  {
    //alert("Der kleinste Wert ist 0.");
    //value = min;
    finalVal = min;
    ok = false;
  }
  else if (value > max)
  {
    //alert("Der grˆflte Wert ist 100.");
    //value = max;
    finalVal = max;
    ok = false;
  }

  if (ok)
  {
    //$(srcid).style.backgroundColor = "white"; // problem with firefox 69.0.3 (64-bit)
    $(srcid).style.backgroundColor = "#fffffe";
    $(dstid).value = value * dstValueFactor;
    $(srcid).setAttribute("valvalid", "true");
    // Cursortasten abfangen, ansonsten springt der Cursor im Texteingabefeld
    // beim IE (Version 8 u. 9) mit jedem Druck auf eine Cursortaste ans Ende des Wertes.
    // Man kann nicht mittels Cursor-Links nach links wandern, da der Cursor immer ans Ende springt.
    // [HM-1293]
    if ((keyCode) < 37 && (keyCode > 40) ) {    
      $(srcid).value = value;
    }
  }
  else
  {
    $(srcid).setAttribute("valvalid", "false");
    $(srcid).style.backgroundColor = "red";
    $(dstid).value = finalVal * dstValueFactor;
    window.setTimeout(function(){$(srcid).style.backgroundColor = "white";},1000);
  }
};

@jp112sdl
Copy link
Contributor Author

Aber scheint ja nicht mehr lange zu dauern, bis die neue Version kommt
https://homematic-forum.de/forum/viewtopic.php?f=60&t=63496&p=636843#p636842

@jens-maus
Copy link
Owner

@jp112sdl Ja, halt die Augen mal auf das eq3 OCCU repo in den nächsten Tagen, würde ich sagen :)

@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 18, 2021

Hab mal die von @jp112sdl gepostete ProofAndSetValue auf eine aktuelle Nightly losgelassen.
So richtig das gelbe vom Ei ist das hier bei mir aber auch nicht.
Um beim Beispiel meiner "Fenster-Auf" - Temperatur innerhalb eine IP-Heizgruppe zu bleiben.

Angegebener Wertebereich ist (5.00 - 30.00).

  • Eingabe von 5 führt zu 5 und nach übernehmen zu 5.0
  • Eingabe von 5.0 führt zu 30 und nach übernehmen zu 30.0
  • Alle Werte > 5 führen zu 30 und nach übernehmen zu 30.0

Da klemmt es wohl noch an anderer Stelle.

@jp112sdl
Copy link
Contributor Author

Da klemmt es wohl noch an anderer Stelle.

BrowserCa... Ach nee, war ja nicht mehr.

Ja wie gesagt, das ist die Funktion so wie sie bisher erfolgreich zum Einsatz kam.
Bei mir läuft sie wie'n Bienchen (aber halt auch HmIP-frei).

Vielleicht wurde für HmIP aber auch noch an anderen Stellen was umgebaut, so dass für diese Geräte die alte Funktion nicht mehr geht.

@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 18, 2021

Bei mir läuft sie wie'n Bienchen (aber halt auch HmIP-frei).

Ja, bei einer HM-Heizgruppe lässt sich der Wert wie gewünscht einstellen.

Das gute ist ja, man braucht gar keine HmIP-Geräte um eine IP-Heizgruppe anzulegen. <--- "wink mit dem Zaunpfahl" ;-)

@jp112sdl
Copy link
Contributor Author

Das gute ist ja, man braucht gar keine HmIP-Geräte um eine IP-Heizgruppe anzulegen. <--- "wink mit dem Zaunpfahl" ;-)

Da wird
ProofAndSetValue(this.id, this.id, '5.0', '30.0', 1)
aufgerufen.

Bei HM Geräten sind es 2 verschiedene IDs.

Aber ich würd jetzt hier eh nix mehr fummeln. Vertane Zeit. Kommt ja eh ein Fix.

@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 18, 2021

Sag bloß du hast eine IP-Gruppe angelegt? :-D

Ich denke auch wir warten auf einen "offiziellen" Fix.

@jens-maus
Copy link
Owner

Ich denke auch wir warten auf einen "offiziellen" Fix.

Zuviel würde ich von dem "Fix" jetzt aber ehrlich gesagt nicht erwarten...

@jp112sdl
Copy link
Contributor Author

Zuviel würde ich von dem "Fix" jetzt aber ehrlich gesagt nicht erwarten...

Erschreckende Einschätzung.
Aber deine Worte sagen genau das aus - wie man den Eindruck hat - mit wie viel "Liebe" an der CCU FW entwickelt wird.

Nachdem sich so viele Nutzer beschwert haben, sollte zumindest die vorherige Funktionalität (meinetwegen auch inkl. HmIP ^^) wiederhergestellt werden.

Warten wir mal ab.

@jp112sdl
Copy link
Contributor Author

Wirst du denn nun noch eine 3.55.5.2021xxxx rausbringen und den Fix aus 3.55.10 (webui.js, ic_deviceparameters.cgi) hier einbauen?

Oder gibt es gleich eine 3.55.10.2021xxxx?

@jens-maus
Copy link
Owner

Es wird dann gleich eine 3.55.10.xxxxx geben.

@jens-maus
Copy link
Owner

Ohne das jetzt aber genauer angeschaut zu haben scheint es mir so zu sein das hier immer noch probleme geben wird, denn die "neue" ProofAndSetValue() der 3.55.10 scheint in großen teilen der aktuellen in den Testversionen gleich zu sein. Mal sehen.

jens-maus added a commit that referenced this issue Jan 20, 2021
0098-WebUI-Fix-ProofAndSetValue and 0103-WebUI-Fix-function.fn because
they have been integrated into the official 3.55.10 version.
This refs #1058, #1039
@jens-maus
Copy link
Owner

So, das Update zur OCCU 3.55.10 is durch. Bitte dann mal das problem mit dem nächsten Snapshot noch einmal genauer testen und berichten ob es nun dadurch behoben ist. Die Änderungen durch eQ3 sehen zwar zu 99% gleich aus mit denen hier, aber es könnte natürlich eine gewisse Abhängigkeit geben die trotzdem nun das korrekte Editieren der Geräteparameter zulässt. Ansonsten müssten wir hierfür wieder einen entsprechenden WebUI Patch nachliefern, versteht sich.

@jens-maus jens-maus added this to the next release milestone Jan 20, 2021
@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 20, 2021

CCU3 3.55.10
Naja, meine Fenster-Auf Temperatur darf ich weiterhin nicht auf x.5 setzen.
Des Weiteren darf ich keine (bei der IP-Gruppeneinstellung Kanal:3 TFK) Eventverzögerung >= 1Minute aus der "Vorauswahl" einstellen da ich damit nur noch per "Abbrechen" aus dem Bereich rauskomme. (Muss nicht zwingend mit ProofAndSetValue() ) zusammenhängen.
Vielleicht sollte ich es eher als Feature statt als Bug sehen.

@jp112sdl
Copy link
Contributor Author

(Muss nicht zwingend mit ProofAndSetValue() ) zusammenhängen.
Vielleicht sollte ich es eher als Feature statt als Bug sehen.

Ja, ist wenn dann ein neues 🥚
Die Auswahlgeschichte kommt von setDelayShortValues aus der /www/config/easymodes/etc/hmip_helper.tcl.
Kommt ein Fehler in der Browserkonsole?

Was sich bei der 3.55.10 geändert hat, sieht man z.B. hier:
eq-3/occu@bbcbe2d

Bildschirmfoto 2021-01-20 um 17 27 58

@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 20, 2021

Kommt ein Fehler in der Browserkonsole?

Einer? ;-)
Bekomme das nicht sauber rauskopiert. Sieht ungefähr so aus.

Uncaught TypeError: Cannot read                webui.js?_version_=2.0pre1:37693
property 'defaultSelected' of undefined
    at IsDirty (webui.js?_version_=2.0pre1:37693)
    at AreParametersDirty (webui.js?_version_=2.0pre1:40315)
    at SaveDeviceParameters (webui.js?_version_=2.0pre1:40210)
    at HTMLDivElement.onclick (index.htm?sid=@HJDV1pMktj@:1)

Aber wir müssen das hier nicht unbedingt weiter verfolgen. Mit dem "Workaround" geht es ja.

Da ich ja gerade eine blitzsaubere CCU3 aktiv habe könnte ich ja mal den Erstkontakt mit eQ-3 wagen...
oder für @jens-maus ein neues Ticket aufmachen.

@jp112sdl
Copy link
Contributor Author

Interessant ist auch, dass man Temperaturen, beim Thermostat direkt gesetzt, auf .5 oder .0 gerundet bekommt (nach dem Übertragen zum Gerät) - so wie es sein soll:
(z.B. in Zeitabschnitten von Temperaturprofilen)
Bildschirmfoto 2021-03-11 um 21 45 58

aber in einer Gruppe ist jeder Dezimalwert bei der Temperatur erlaubt. 🥴
Bildschirmfoto 2021-03-11 um 21 44 31

Keine Ahnung, ob das hier mit diesem Issue direkt was zu tun hat.
Thermostate (die Hardware selbst) können jedenfalls nur 0,5er Schritte.

Ich glaub da liegt noch jede Menge mehr im Argen.

@MichaelN0815
Copy link
Contributor

Das zeigt nur wie fehlerhaft die Funktion angelegt wurde. Man müsste die Anzahl der Nachkommastellen und die Rundungsregeln übergeben. Ohne diesen input wird es immer kleine Fehler geben. Das würde aber einen gravierenden Umbau nötig machen, der ja eher nicht gewünscht wird. Also besser die Fehler minimieren. Ich kann morgen mal meine oben skizzierte Idee ausprobieren und vorstellen, wenn das gewünscht ist.

@theimo1221
Copy link
Contributor

Das zeigt nur wie fehlerhaft die Funktion angelegt wurde. Man müsste die Anzahl der Nachkommastellen und die Rundungsregeln übergeben. Ohne diesen input wird es immer kleine Fehler geben. Das würde aber einen gravierenden Umbau nötig machen, der ja eher nicht gewünscht wird. Also besser die Fehler minimieren. Ich kann morgen mal meine oben skizzierte Idee ausprobieren und vorstellen, wenn das gewünscht ist.

Du kannst gerne ein Beispiel erstellen, persönlich weiß ich aber nicht, wie du basierend auf "falsch getrimmten" Min/Max Werten dennoch die korrekte Anzahl Nachkommastellen erkennen möchtest.

Solange die Aufrufe an ProofAndSetValue einheitlich sind, ist die Übergabe der Anzahl Nachkommastellen anhand der Nachkommastellen von Min/Max durchaus legitim. Somit dürfte ein Geradeziehen der Aufrufe dies beheben.

@MichaelN0815
Copy link
Contributor

MichaelN0815 commented Mar 12, 2021

Also ich habe den SourceCode der Original CCU FW 3.57.4 im Pfad www nach ProofAndSetValue durchsucht. Daraus ergeben sich folgende Fundstellen:

www\config\easymodes\BLIND\BLIND.tcl
www\config\easymodes\BLIND\KEY.tcl
www\config\easymodes\BLIND\VIRTUAL_KEY.tcl
www\config\easymodes\cc_rt_dev_master.tcl
www\config\easymodes\EnterFreeValue.tcl
www\config\easymodes\etc\hmipChannelConfigDialogs.tcl
www\config\easymodes\etc\profile_cond_x_ch_master.tcl
www\config\easymodes\etc\uiElements.tcl
www\config\easymodes\hm-cc-vg-1_master.tcl
www\config\easymodes\hmip\alpha-ip-rbga_1_master.tcl
www\config\easymodes\hmip\hmip-etrv_1_master.tcl
www\config\easymodes\hmip\hmip-etrv-b_1_master.tcl
www\config\easymodes\hmip\hmip-etrv-b1_1_master.tcl
www\config\easymodes\hmip\hmip-etrv-c_1_master.tcl
www\config\easymodes\hmip\hmip-etrv-c-2_1_master.tcl
www\config\easymodes\hmip\MOTIONDETECTOR_TRANSCEIVER.tcl
www\config\easymodes\hmip\PRESENCEDETECTOR_TRANSCEIVER.tcl
www\config\easymodes\HMW_BLIND\INPUT_OUTPUT_0.tcl
www\config\easymodes\HMW_BLIND\INPUT_OUTPUT_1.tcl
www\config\easymodes\HMW_BLIND\KEY_0.tcl
www\config\easymodes\HMW_BLIND\KEY_1.tcl
www\config\easymodes\HMW_BLIND\VIRTUAL_KEY_1.tcl
www\config\easymodes\js\CapacitiveFillingLevelSensor.js
www\config\easymodes\powermeter_iec_ch1_master.tcl
www\config\easymodes\powermeter_iec_ch2_master.tcl
www\config\easymodes\powermeter_iec_dev_master.tcl
www\config\easymodes\powermeter_igl_ch_master.tcl
www\config\easymodes\powermeter_v2_iec_ch1_master.tcl
www\config\easymodes\powermeter_v2_iec_ch2_master.tcl
www\config\easymodes\powermeter_v2_iec_dev_master.tcl
www\config\easymodes\tc_it_dev_master.tcl
www\config\easymodes\wa_od_ch_master.tcl
www\config\ic_common.tcl
www\config\ic_deviceparameters.cgi
www\webui\webui.js

Typische Aufrufe sind:

append HTML_PARAMS(separate_$prn) "<input type=\"text\" id=\"separate_${special_input_id}_$prn\_3_temp\" name=\"SHORT_ON_LEVEL\" value=\"[format %.1f [expr $ps(SHORT_ON_LEVEL) * 100]]\" onblur=\"ProofAndSetValue('separate_${special_input_id}_$prn\_3_temp', 'separate_${special_input_id}_$prn\_3', parseInt(0), parseInt(100), parseFloat(0.01));\" onmouseup=\"ProofAndSetValue('separate_${special_input_id}_$prn\_3_temp', 'separate_${special_input_id}_$prn\_3', parseInt(0), parseInt(100), parseFloat(0.01));\" onblur=\"ProofAndSetValue('separate_${special_input_id}_$prn\_3_temp', 'separate_${special_input_id}_$prn\_3', parseInt(0), parseInt(100), parseFloat(0.01));\" />\%"
set s "<input id=$elemId type=\"text\" size=\"5\" value=$value name=\"$param\" onblur=\"ProofAndSetValue(this.id, this.id, '[getMinValue $param]', '[getMaxValue $param]', 1)\"/>"
append HTML_PARAMS(separate_$profile) "<input id=\"usrDefBrightness_$profile\" type=\"text\" size=\"5\" onblur=\"ProofAndSetValue(this.id,this.id,$minLux,$maxLux,1);\"/>
append s "<td class='$class'><input id=$elemId type=\"text\" size=\"5\" value=$value name=$param onblur='ProofAndSetValue(this.id, this.id, [getMinValue $param], [getMaxValue $param], 1);'>&nbsp;[getUnit $param]&nbsp;[getMinMaxValueDescr $param]</td>"
set s "<input id=$elemId type=\"text\" size=\"5\" value=$value name=\"$param\" onblur=\"ProofAndSetValue(this.id, this.id, '[getMinValue $param]', '[getMaxValue $param]', 1)\"/>"

Sehr häufig erfolgt die Übergabe also nicht als String, sondern als (Ganz)Zahl. Ob das in all diesen Fällen korrekt ist, kann ich nicht prüfen. Notfalls müsste man überall ' ergänzen...

Ich habe nur eine einzige Stelle gefunden, wo versucht wird Fließkommazahlen als Zahl zu übergeben:

www\config\ic_common.tcl
Zeile 1344 append s " onkeyup=\" ProofAndSetValue('$input_idval', '${idval}', parseFloat($min), parseFloat($max), parseFloat([expr 1 / $factor]));\" /></td>"

Diese Stelle muss also auf jeden Fall korrigiert werden.
Ich hoffe ich konnte mit dieser Fleißarbeit etwas helfen.

@MichaelN0815
Copy link
Contributor

MichaelN0815 commented Mar 12, 2021

Hier ist meine Lösung mit einem Workaround für "falsch" als Zahl übergebene Limits. Die Anzahl der Nachkommastellen wird dann anhand des eingegebenen Werts ermittelt. Damit ist zumindest eine Rückwärtskompatibilität sichergestellt. Den von @jp112sdl beschriebene automatisch Rundung auf .0 / .5 kann ich allerdings nicht nachvollziehen. Wird da überhaupt ProofAndSetValue aufgerufen?

ProofAndSetValue-2021-03-12-a.js.txt

Ich bekomm das leider nicht ordentlich formatiert hier rein... Änderung in fett

ProofAndSetValue = function(srcid, dstid, min, max, dstValueFactor, event)
{
var srcElm = $(srcid);
var dstElm = $(dstid);

// feststellen ob String oder Zahl übergeben wurde
var LimitIsNumber = false;
if (typeof min === "number") LimitIsNumber = true;

// Falls das Tasten-Event nicht mit uebergeben wurde ....
/*
var keyCode = 0,
finalVal;

if (event) {
keyCode = event.keyCode;
}
*/

var ok = true;

if (! min) min = 0;
if (! max) max = 100;
if (! dstValueFactor) dstValueFactor = 0.01;//dstValue = value/100

var value = $F(srcid);

//replace , by .
if (value.indexOf(',') >= 0)
{
var tokens = value.split(",");

value = "";
if (tokens[0]) value += tokens[0];
value += '.';
if (tokens[1]) value += tokens[1];
srcElm.value = value;

}

var parsedValue;
var parsedMin = parseFloat(min);
var parsedMax = parseFloat(max);

var minSplit = min.toString().split(".");
var maxSplit = max.toString().split(".");
var valSplit = value.toString().split(".");
var digits = 0;

if(minSplit.length === 2) {
digits = Math.max(digits, minSplit[1].length);
}
if(maxSplit.length === 2) {
digits = Math.max(digits, maxSplit[1].length);
}
if(LimitIsNumber) {
// wenn Limits als Zahl uebergeben wurde, dann Eingabe fuer Nachkommastellen auswerten
if(valSplit.length === 2) {
digits = Math.max(digits, valSplit[1].length);
}
}

// Check if float is allowed
try {
if (digits == 0) {
min = parseInt(min);
max = parseInt(max);
value = Math.round(parseFloat(value));
} else {
min = parseFloat(min).toFixed(digits);
max = parseFloat(max).toFixed(digits);
var roundFactor = Math.pow(10, digits);
value = Math.round(parseFloat(value) * roundFactor) / roundFactor;
}
parsedValue = parseFloat(value);
} catch(e) {conInfo(e);}

// !0 would result in true so explicitly check if it is not 0
if (!value && value !== 0)
{
finalVal = parsedMin;
ok = false;
}
else if (isNaN(value))
{
finalVal = parsedMin;
ok = false;
}
else if (parsedValue < parsedMin)
{
finalVal = parsedMin;
ok = false;
}
else if (parsedValue > parsedMax)
{
finalVal = parsedMax;
ok = false;
}

if (ok)
{
srcElm.style.backgroundColor = "#fffffe";
dstElm.value = (parsedValue * dstValueFactor).toFixed(digits);
srcElm.value = dstElm.value;
srcElm.setAttribute("valvalid", "true");
}
else
{
srcElm.setAttribute("valvalid", "false");
srcElm.style.backgroundColor = "red";
dstElm.value = (finalVal * dstValueFactor).toFixed(digits);
srcElm.value = dstElm.value;
window.setTimeout(function(){srcElm.style.backgroundColor = "white";},1000);
}
};

@Baxxy13
Copy link
Contributor

Baxxy13 commented Mar 12, 2021

Diese Stelle muss also auf jeden Fall korrigiert werden.

Habe ich hier mal probiert. Bei mir war es Zeile 1433 in der /www/config/ic_common.tcl

append s "  onblur=\" ProofAndSetValue('$input_idval', '${idval}', parseFloat($min), parseFloat($max), parseFloat([expr 1 / $factor]));\" /></td>"

geändert in...

append s "  onblur=\" ProofAndSetValue('$input_idval', '${idval}', '$min', '$max', parseFloat([expr 1 / $factor]));\" /></td>"

Das "repariert" zumindest alle betroffenen Stellen des oben beschriebenen CUxD-Thermostates inklusive korrekter Rundung auf die Nachkommastelle.

Müsste man mal gucken ob das vielleicht "die EINE Stelle" ist die korrigiert werden muss.

@jens-maus
Copy link
Owner

Hier ist meine Lösung mit einem Workaround für "falsch" als Zahl übergebene Limits. Die Anzahl der Nachkommastellen wird dann anhand des eingegebenen Werts ermittelt. Damit ist zumindest eine Rückwärtskompatibilität sichergestellt. Den von @jp112sdl beschriebene automatisch Rundung auf .0 / .5 kann ich allerdings nicht nachvollziehen. Wird da überhaupt ProofAndSetValue aufgerufen?
[...]
Ich bekomm das leider nicht ordentlich formatiert hier rein... Änderung in fett
[...]

Tut mir leid wenn das vielleicht wieder etwas ablehnend rüberkommt. Aber für sowas gibt es das "diff" bzw. "patch" format. Schau es dir an und dann bereite deinen vorgeschlagenen änderungen entsprechend vor und präsentiere die so. Dieses unformatierte Kauderwelsch kann man sich wirklich nicht antun. Und noch besser: Mach einen PullRequest!

@MichaelN0815
Copy link
Contributor

Sorry aber dann bin ich raus. Die Zeit auch noch einen Github Lehrgang zu machen habe ich dann doch nicht.

@jp112sdl
Copy link
Contributor Author

diff und patch sind GNU-Tools.

Die Zeit auch noch einen Github Lehrgang zu machen habe ich dann doch nicht.

Kann dich zwar verstehen, Jens aber auch... Denn ich kann den Spaghetti-Haufen auch nicht überblicken.

@jens-maus
Copy link
Owner

Sorry aber dann bin ich raus. Die Zeit auch noch einen Github Lehrgang zu machen habe ich dann doch nicht.

Wenn du dir diese Zeit nicht nimmst oder die Zeit gerne für etwas anderes nutzen willst, dann bist du (so hart es klingt) hier in der Tat leider am falschen Platz. Nur durch geordnetes Vorgehen hier auf GitHub und in diesem Issue Ticket kommt man hier weiter. Andere bringen die Zeit auch auf um das Handwerkszeug zu erlernen das man braucht um gemeinschaftlich zu arbeiten.

@MichaelN0815
Copy link
Contributor

Kein Problem. Ihr macht die Spielregeln und ich entscheide ob ich mitspielen will. Das ist in Ordnung für mich.

@theimo1221
Copy link
Contributor

Die Anzahl der Nachkommastellen wird dann anhand des eingegebenen Werts ermittelt

Sorry @MichaelN0815 aber das stellt für mich definitiv keine Lösung dar.
ProofAndSetValue soll eine Eingabe (welche ggf. von einem "unwissenden" Anwender kommt) passend validieren, formatieren und falls nötig auf die gegebenen Grenzen limitieren.
Dies inkludiert ein korrektes Runden und/oder verhindern von zu vielen Nachkommastellen. Nachgelagerte Logiken und Funktionen verlassen sich darauf.

Folglich ist es sehr riskant einfach eine Eingabe von 5.75 zu erlauben, nur weil der Anwender es eingibt.

@MichaelN0815
Copy link
Contributor

MichaelN0815 commented Mar 13, 2021

In der ic_common.tcl habe ich übrigens auch den Grund gefunden, warum mein Cuxd-Device 0,001 und x,001 als Limits an die Funktion übergibt:

append s " onblur=\" ProofAndSetValue('$input_idval', '${idval}', [expr $min + 0.001], [expr $max + 0.001], parseFloat([expr 1 / $factor]));\" /></td>"

Macht das irgendeinen Sinn? Oder sollte man das korrigieren zu:

append s " onblur=\" ProofAndSetValue('$input_idval', '${idval}', '$min', '$max', parseFloat([expr 1 / $factor]));\" /></td>"

EDIT: dieser Quatsch steht nur in der OCCU 3.57.4 drin. Das sollte/muss EQ-3 korrigieren.

@MichaelN0815
Copy link
Contributor

Lt. https://homematic-forum.de/forum/viewtopic.php?f=65&t=66446&start=120#p653562
gibt es ein Problem bei der Eingabe des Wert für die Ventilstörungsposition beim HM-CC-RT-DN

Der Defaultwert ist 15%. Wenn man versucht ihn z.B. auf 12% zu ändern steht nach der Fehlermeldung da 12.0% Was nicht axeptiert wird.

Aufruf der Funktion erfolgt mit:
<input id="separate_DEVICE_32" type="text" size="5" value="15" name="VALVE_ERROR_RUN_POSITION" onblur="ProofAndSetValue(this.id, this.id, '0.0', '100.0', 1)" style="background-color: rgb(255, 255, 254);" valvalid="true">

Die Funktion macht also was von ihr erwartet wird. Wieso da Nachkommastellen übergeben werden, wenn gar keine zulässig sind, kann ich nicht beurteilen.
Festgestellt wurde es unter RaspberryMatic 3.57.4.20210320

HM-CC-RT-DN scheint für die "VALVE_ERROR_RUN_POSITION" einen Integerwert zu erwarten. Der Aufruf erfolgt vermutlich in der /www/config/easymodes/cc_rt_dev_master.tcl

Der Programmierer wollte aber wohl wirklich float haben:
# Limit float to 2 decimal places

HM-Sec-Win: Kraft für den Kippantrieb, jede eingegebene Zahl entweder zu "0" oder zu "1".
Quelle: https://homematic-forum.de/forum/viewtopic.php?f=65&t=66446&p=653795#p653783

<input type="text" name="__PULL_FORCE" value="100.0" id="separate_CHANNEL_1_4_temp" onblur=" ProofAndSetValue('separate_CHANNEL_1_4_temp', 'separate_CHANNEL_1_4', parseFloat(0.0), parseFloat(100.0), parseFloat(0));" valvalid="true" style="background-color: rgb(255, 255, 254);">

Der Faktor wird mit 0 übergeben!

@Baxxy13
Copy link
Contributor

Baxxy13 commented Apr 27, 2021

Der Faktor wird mit 0 übergeben!

Des Rätsels Lösung ist am Anfang der Funktion versteckt:
if (! dstValueFactor) dstValueFactor = 0.01;//dstValue = value/100
somit beträgt der Faktor 0.01.

Mit Thiemos's Testfunktion sowie der ProofAndSetValue aus der RM 3.57.5.20210424 sehe ich einen korrekten Wert bei der Übergabe.
(Eingabe von 23 führt zum Funktions-Übergabewert von 0.23 und Funktions-Anzeigewert von 23
Leider scheint das Gerät inzwischen defekt zu sein.

@MichaelN0815
Copy link
Contributor

Des Rätsels Lösung ist am Anfang der Funktion versteckt:

Ja, das habe ich mittlerweileauch herausgefunden.irgendwo im anderen Thread

@jp112sdl
Copy link
Contributor Author

Und das bleibt so: https://homematic-forum.de/forum/viewtopic.php?p=659447#p659435 ?
Oder soll das hier noch weiter behandelt werden (new Issue?)

@MichaelN0815
Copy link
Contributor

Was übergibst du denn da an Limits, das so viele digits dabei raus kommen?

@Baxxy13
Copy link
Contributor

Baxxy13 commented Apr 27, 2021

Sieht man auf Seite 1 des Threads.
Es wird Min: 0.000000 und Max: 655.200000 übergeben. Durch die Übergabe als String werden die Nachkommastellen natürlich beibehalten.

Deshalb schrieb ich da auch:

Die Limits sollten die korrekte Anzahl an Nachkommastellen, passend zu den "Fähigkeiten" des Aktors / Sensors haben.

@jens-maus hat ja auch bei einigen Aufrufen die Nachkommastellen optimiert.
Link

@jp112sdl
Copy link
Contributor Author

Ich hab keinen Plan.

Hier sind es 2 Stellen bzw. 1 Stelle
https://github.com/jp112sdl/JP-HB-Devices-addon/blob/dbaef9aa20a247ec8bc9b8365f071daf0fedd971/src/addon/firmware/rftypes/hb-uni-sen-current.xml#L114

getMinValue macht gar nichts explizit mit Kommastellen
https://github.com/jp112sdl/JP-HB-Devices-addon/blob/master/src/addon/www/config/easymodes/HB-UNI-Sen-CURRENT_ch_master.tcl#L7-L12

Wenn es jemanden stört, soll er dann bei meinem Addon einen PR machen.

Hat ja dann hier nix zu suchen.

@jens-maus
Copy link
Owner

getMinValue macht gar nichts explizit mit Kommastellen
https://github.com/jp112sdl/JP-HB-Devices-addon/blob/master/src/addon/www/config/easymodes/HB-UNI-Sen-CURRENT_ch_master.tcl#L7-L12

Genau das solltest du ändern. Schau dir mal meine folgenden Änderungen von gestern an:

https://github.com/jens-maus/RaspberryMatic/blob/master/buildroot-external/patches/occu/0119-WebUI-Fix-ProofAndSetValue.patch#L7-L13

D.h. du solltest da definitiv die Floating Point precision von getMinValue/getMaxValue so anpassen, das es dann nur die anzahl von nachkommastellen zurückgibt die der aktor auch verträgt, oder eben keine damit es ein integer wird wenn ProofAndSetValue() aufgerufen wird. Das hat selbst eQ3 an einigen Stellen versäumt, deshalb ja auch das WirrWarr das ich gerade selbst versuche zu entzwirren - deshalb die Commits bzgl. 0119-WebUI-Fix-ProofAndSetValue.patch der letzten Tage. Und mehr wird da definitiv noch kommen, so wie es aussieht.

@jp112sdl
Copy link
Contributor Author

Wo ich mir grad andere Hobbies gesucht hab... Na dann warte ich mal auf das was da noch kommt und schaue es mir im nächsten Winter an ^^

Funktion ist ja gegeben 👍

@jens-maus
Copy link
Owner

Da es hier seit geraumer Zeit sehr ruhig geworden ist und in den aktuellen RaspberryMatic Versionen wohl keinen nennenswerten Probleme mehr mit der "ProofAndSetValue" Funktion mehr gibt und auch in aktuellen Testversionen sich keine neue Probleme mehr aufgetan haben, beachte ich dieses Problem erst einmal als gelöst. Falls wieder erwarten es wieder Probleme mit der ProofAndSetValue Funktion geben sollte, dann bitte am besten dazu ein neues separates Ticket aufmachen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⚓ upstream issue This is a bug/issue for/in upstream software (OCCU, etc.) 🐛 bug-report Something isn't working 🏷️ WebUI This refs the WebUI component 🙏 help wanted Extra attention is needed
Projects
Development

No branches or pull requests

7 participants