NEWS
Objekte von Typ number in Binding auf Gleichheit in prüfen
-
In einem Blockly-Script speichere ich nach einer Logik einen Wert der ursprünglich von einem Adapter stammt in ein User Objekt um (von 20 Werten bestimme ich den min Wert)
Die Speicherung mache ich mit Aktualisieren und/oder Steuern.
Die Werte sind bestätigt.Wenn ich in einer Binding folgende Logik bei Hintergrund Farbe eintrage
{h1: Wert_von_Adapter; h2: Wert_von_Sript; h1==h2?"color1":"color2"}
funktioniert nicht!
Wenn ich die Abfrage ändere und statt == auf > und/oder < abfrage wird die Hintergrundfarbe richtig angezeigt.
Also meine Frage
Wie muss ich einen Adapter Wert umspeichern damit ich auf Gleichheit abfragen kann.In der Objektdefinition kann ich keinen Unterschied erkennen. Ist die interne Speicherung abweichend?
-
@franzda
Sind beide DP definitiv vom gleichen Typ?@franzda sagte in Objekte von Typ number in Binding auf Gleichheit in prüfen:
Ist die interne Speicherung abweichend?
Sind das Fließkommazahlen?
Dann wäre das schon fast normal. Bin jetzt kein JS-Experte und weiß daher nicht, wie das in JS intern gehandhabt wird. Aber in fast allen Sprachen müssen für die interne Speicherung von Fließkommazahlen einige Klimmzüge gemacht werden. Abweichungen an der x-ten Nachkommastelle sind da fast die Regel.
Man könnte für den Wert aus dem Adapter einen Alis einrichten und den Wert über die Konvertierungsfunktion auf eine bestimmte Anzahl Nachkommastellen abschneiden.
Das Gleiche macht man im Script für den berechnetet Wert. -
@codierknecht said in Objekte von Typ number in Binding auf Gleichheit in prüfen:
Sind das Fließkommazahlen?
Ja das ist absolut richtig. Fließkomma ist immer ein Thema.
Jedoch ich speichere die Werte lediglich um somit müsste nach meinem Verständniss die Abfrage funktionieren."Ungleichheit" entsteht nach Operationen (soweit ich das sehe)
-
Jedoch ich speichere die Werte lediglich um somit müsste nach meinem Verständniss die Abfrage funktionieren.
Ich wäre mit da jedenfalls nicht zu 100% sicher.
Kannst Du das mal testweise mit einem kleinen Stückchen JS prüfen und Dir im Log mal die Gleichheit (als Boolean) und die Differenz der beiden Werte ausgeben lassen?console.log('Gleichheit: ' + (getState('alias.0.klima.x').val == getState('alias.0.klima.y').val)); console.log('Differenz: ' + (getState('alias.0.klima.x').val - getState('alias.0.klima.y').val));
Man könnte für den Wert aus dem Adapter einen Alias einrichten und den Wert über die Konvertierungsfunktion auf eine bestimmte Anzahl Nachkommastellen abschneiden.
Das Gleiche macht man im Script für den berechnetet Wert.Versuch macht klug
-
@codierknecht said in Objekte von Typ number in Binding auf Gleichheit in prüfen:
console.log('Gleichheit: ' + (getState('alias.0.klima.x').val == getState('alias.0.klima.y').val)); console.log('Differenz: ' + (getState('alias.0.klima.x').val - getState('alias.0.klima.y').val));
Ja die Werte sind abweichend wie ich in meiner Frage auch angenommen habe. Verstehe aber nicht Warum.
Ich habe die Logik auch in JS laufen Lassen. Das gleiche Ergebnis. Die Abweichung entsteht also insetState("0_userdata.0.König.mine10"/*mine10*/, getState("tankerkoenig.0.stations.cheapest.e10.feed").val, true);
javascript.0 2023-01-22 20:25:11.871 warn script.js.common.iobroker1.Tankstelle.König.GleichheitAbfrageJS: Differenz: -0.020000000000000018 javascript.0 2023-01-22 20:25:11.871 warn script.js.common.iobroker1.Tankstelle.König.GleichheitAbfrageJS: Gleichheit: false javascript.0 2023-01-22 20:25:11.871 warn script.js.common.iobroker1.Tankstelle.König.GleichheitAbfrageJS: Gleichheit
on({id: [].concat(['0_userdata.0.König.test']), change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; console.warn('Gleichheit'); console.warn('Gleichheit: ' + (getState('0_userdata.0.König.mine10').val == getState('tankerkoenig.0.stations.4.e10.feed').val)); console.warn('Differenz: ' + (getState('0_userdata.0.König.mine10').val - getState('tankerkoenig.0.stations.4.e10.feed').val)); });
-
@franzda
Wieviele Nachkommastellen sind denn relevant?Ich kenne mich mit den Bindings nicht wirklich aus, aber vielleicht funzt ja sowas:
{h1: Wert_von_Adapter; h2: Wert_von_Sript; trunc(h1*100)/100==trunc(h2*100)/100?"color1":"color2"}
oder vielleicht auch so:
{h1: trunc(Wert_von_Adapter*100)/100; h2: trunc(Wert_von_Sript*100)/100; h1==h2?"color1":"color2"}
-
@codierknecht
Kommando zurück.Mir ist eingefallen, dass ich schonmal ein Problem hatte dasbolded text nach Neustart sich aufgelöst hatte.
Ich habe eben Raspi neu gestartet und browser cashe gelöscht.Es sieht so aus das jetzt alles klar ist.
Prüfe nochmal und melde mich neu wenn doch nicht.Danke für Deine schnelle Hilfe
H