NEWS
Frage: alias Konvertierungsfunktion
-
Hallo,
sicher eine leicht zu beantwortende Frage:
Kann ich in der Konvertierungsfunktion bei den alias-Datenpunkten zusätzlich zu "/1000" (Umrechnung in kWh) auch eine Rundungsfunktion (runden auf 2 Stellen nach dem Komma) nutzen?
Wenn ja, bitte wie...Besten Dank
vG Peter
-
@pi-ter
(val / 1000).toFixed(2)
-
Lieber Codierknecht:
you made my day, vielen vielen DankVG Peter
P.S.
Hast Du eine Quelle für mich, wo ich für solche und auch json-Dinge nachschlagen kann?P.P.S: Wieso kommt zunächst die rote Warnung, dass das Ergebnis keine Zahl (number) ist? Das hat mich zunächst echt irritiert.
-
-
@codierknecht sagte: (val / 1000).toFixed(2)
toFixed(2) wandelt in einen String.
@Pi-ter Runden einer Zahl:
Math.round(val / 10) / 100
-
@paul53 sagte in Frage: alias Konvertierungsfunktion:
in einen String
Gehen sollte natürlich auch
parseFloat((val / 1000).toFixed(2))
Wobei Deine Lösung vermutlich etwas weniger Ressourcen frisst
Finde ich persönlich aber besser lesbar. Muss man ja auch erstmal drauf kommen, dass Dein(val /10)
das eigentliche(val / 1000)
ersetzt, um das Komma um 2 Stellen zu verschieben bevor gerundet wird. -
@codierknecht sagte: Finde ich persönlich aber besser lesbar.
Ja, für Leute, denen Mathematik ein Greul ist.
-
Hi,
ich kämpe auch mal wieder mit einem Alias. Um mein Rollläden einheitlich steuern zu können, möchte ich in den Alias jeweils true für geschlossen, false für geöffnet und stop für stop haben. Im einigen originalen Datenpunkten ist aber up=geöffnet, down=geschlossen und stop=stop. Was muss ich im Alias bei read und write eintragen, damit ich im Alias-Datenpunkt dann eben entweder true/false/stop habe und auch mit true/false/stop den Rollladen steuern kann?
Gruss, Jürgen
-
@pi-ter sagte in Frage: alias Konvertierungsfunktion:
keine Zahl (number)
toFixed wandelt Zahl in string um.
Wenn du wieder number willst dann den erstellten String wieder wandeln.
parseFloat((val / 1000).toFixed(2))
müsste funktionieren.
Nachtrag:
ist ja doppelt.
war ja oben schon alles. -
@wildbill sagte: true/false/stop den Rollladen steuern kann?
Das macht keinen Sinn, denn false und true sind boolesche Werte und "stop" ist ein String. Eine Read-Konvertierung könnte so aussehen:
val == 'up' ? 'hoch' : val == 'down' ? 'runter' : val
Write:
val == 'hoch' ? 'up' : val == 'runter' ? 'down' : val
-
@paul53 Hm, da muss ich dann mal probieren. Ich hatte es bislang per Script so in eigene Datenpunkte vom Typ mixed gewandelt, damit ich in VIS mit einem "valuelist HTML styla"-Widget den Status anzeigen und mit "Radiobuttons on/off" steuern konnte.
Dein Vorschlag so angepasst"read": "val == 'up' ? '0' : val == 'down' ? '1' : val", "write": "val == '0' ? 'up' : val == '1' ? 'down' : val"
schreibt wenigstens schonmal Nullen und Einsen passend in den Alias und steuert auch den originalen Datenpunkt wie gewollt. Dann werde ich wohl mal bei den Widgets schauen, was ich da ändern kann.
Dank Dir.Gruss, Jürgen
EDIT: Muss gar nix ändern, funktioniert wie gewollt.
-
@codierknecht said in Frage: alias Konvertierungsfunktion:
Wobei Deine Lösung vermutlich etwas weniger Ressourcen frisst
Ich habs gerade mal verglichen. Bei 100.000 Konvertierungen ist die Math.round()-Variante meist um 30ms schneller als die parseFloat()-Variante - auf meinem Pi4.
17:10:06.158 info javascript.0 (6125) script.js.common.Testen.Performance: -899 17:10:06.389 info javascript.0 (6125) script.js.common.Testen.Performance: 37 17:10:06.609 info javascript.0 (6125) script.js.common.Testen.Performance: 30 17:10:06.830 info javascript.0 (6125) script.js.common.Testen.Performance: 29 17:10:07.049 info javascript.0 (6125) script.js.common.Testen.Performance: 1029 17:10:07.269 info javascript.0 (6125) script.js.common.Testen.Performance: 29 17:10:07.487 info javascript.0 (6125) script.js.common.Testen.Performance: 29 17:10:07.707 info javascript.0 (6125) script.js.common.Testen.Performance: 30 17:10:07.923 info javascript.0 (6125) script.js.common.Testen.Performance: 28 17:10:08.141 info javascript.0 (6125) script.js.common.Testen.Performance: -973
Die Liste zeigt insgesamt 10 Versuche. Es wird die Dauer der Versuche mit parseFloat() von der Dauer mit Math.round() abgezogen.
Das ist das Script:
let loops:number = 100000; for (let j=0; j<10; j++) { // Erster Versuch let start=new Date().getMilliseconds(); for (let i=0; i<loops; i++) { parseFloat((i / 1000).toFixed(2)); } let end=new Date().getMilliseconds(); let duration=end-start; // Zweiter Versuch start=new Date().getMilliseconds(); for (let i=0; i<loops; i++) { Math.round(i / 10) / 100 } end=new Date().getMilliseconds(); let duration2=end-start; console.log(duration - duration2); }