NEWS
[Gelöst] Probleme beim Umrechnen einer Zahl
-
Guten Abend zusammen,
ich bin neu hier im Forum und auch neu was den ioBroker bzw. das Scripten in Java angeht.
Bei meinem Vorhaben geht es darum eine per SNMP ausgelesene Temperatur welche im Format (2560) geliefert wird in das Format 25.60 umzuwandeln.
Mir ist schon klar, dass man die Zahl einfach durch 100 Teilen muss, aber das funktioniert ja auch schon mal so weit.
Ich habe vor, jedesmal wenn per SNMP eine andere Temperatur geliefert wird soll diese umgerechnet werden und in ein neues Feld geschrieben werden.
Wenn ich mein Script ohne die "on" Funktion ausführe dann geht alles soweit. Nur mit dem Automatismus will es nicht funktionieren.
Hat von euch jemand eine Idee?
Bitte nicht über meinen Code lachen … hab leider bis jetzt 0 Ahnung davon.
var Temp = getState("snmp.0.192_168.178.119.Temperatur").val; var Ergebnis; Ergebnis = Temp / 100; on({id: "snmp.0.192_168_178_119.Temperatur", change: 'ne'}, function (data) { setState("javascript.0.Temperatur",parseFloat(Ergebnis)); log('Temperatur wurde geändert'); });
-
Der erste Teil
var Temp = getState("snmp.0.192_168.178.119.Temperatur").val; var Ergebnis; Ergebnis = Temp / 100;
wird nur einmal bei Skriptstart ausgeführt.
An die anonyme Callback-Funktion von on() wird ein Parameter (data) übergeben, der nirgends ausgewertet wird.
So kann das Skript aussehen:
const idTemp = "snmp.0.192_168.178.119.Temperatur"; // Datenpunkt-ID ist eine Konstante var Temp = getState(idTemp).val; // Deklaration globale Variable und Initialisierung für Skriptstart function calcTemp() { // Umrechnen und in Datenpunkt schreiben setState("javascript.0.Temperatur", parseFloat(Temp) / 100, true); // parseFloat nur erforderlich, wenn Temp ein String ist } calcTemp(); // Aufruf bei Skriptstart on(idTemp, function(data) { // Triggern bei Wertänderung und Übergabe des Datenpunkt-Objektes an lokale Variable data Temp = data.state.val; // Wert des auslösenden Datenpunktes calcTemp(); log('Temperatur wurde geändert'); });
-
Der erste Teil
var Temp = getState("snmp.0.192_168.178.119.Temperatur").val; var Ergebnis; Ergebnis = Temp / 100;
wird nur einmal bei Skriptstart ausgeführt.
An die anonyme Callback-Funktion von on() wird ein Parameter (data) übergeben, der nirgends ausgewertet wird.
So kann das Skript aussehen:
const idTemp = "snmp.0.192_168.178.119.Temperatur"; // Datenpunkt-ID ist eine Konstante var Temp = getState(idTemp).val; // Deklaration globale Variable und Initialisierung für Skriptstart function calcTemp() { // Umrechnen und in Datenpunkt schreiben setState("javascript.0.Temperatur", parseFloat(Temp) / 100, true); // parseFloat nur erforderlich, wenn Temp ein String ist } calcTemp(); // Aufruf bei Skriptstart on(idTemp, function(data) { // Triggern bei Wertänderung und Übergabe des Datenpunkt-Objektes an lokale Variable data Temp = data.state.val; // Wert des auslösenden Datenpunktes calcTemp(); log('Temperatur wurde geändert'); }); ```` `
Vielen Dank für die schnelle Antwort
Leider bekomme ich auch wieder nur den Eintrag im Log angezeigt. Im Feld "javascript.0.Temperatur" wird leider nichts eingetragen.
Außerdem zeigt das Log diese Meldung an: 06:59:25.018 [warn] javascript.0 at script.js.common.calcTemp:3:12
-
Im Feld "javascript.0.Temperatur" wird leider nichts eingetragen. `
Was meinst Du mit Feld ?"javascript.0.Temperatur" muss ein existierender Datenpunkt vom Typ "Zahl" sein, der z.B. im Reiter "Objekte" http://www.iobroker.net/docu/?page_id=5495&lang=de#6hinzufuegen wurde.
@mh84:Außerdem zeigt das Log diese Meldung an: 06:59:25.018 [warn] javascript.0 at script.js.common.calcTemp:3:12 `
Dann existiert der Datenpunkt "snmp.0.192_168.178.119.Temperatur" nicht. Vermutlich ist die richtige ID "snmp.0.192_168_178_119.Temperatur" ? -
Im Feld "javascript.0.Temperatur" wird leider nichts eingetragen. `
Was meinst Du mit Feld ?"javascript.0.Temperatur" muss ein existierender Datenpunkt vom Typ "Zahl" sein, der z.B. im Reiter "Objekte" http://www.iobroker.net/docu/?page_id=5495&lang=de#6hinzufuegen wurde.
@mh84:Außerdem zeigt das Log diese Meldung an: 06:59:25.018 [warn] javascript.0 at script.js.common.calcTemp:3:12
Dann existiert der Datenpunkt "snmp.0.192_168.178.119.Temperatur" nicht. Vermutlich ist die richtige ID "snmp.0.192_168_178_119.Temperatur" ?
Du hattest Recht. Da hat sich wohl ein Tippfehler eingeschlichen Es funktioniert nun ohne Probleme.
Vielen Dank für deine Hilfe.
Wenn ich noch andere Temperaturen so umrechnen will, mache ich das dann auch in diesem Script oder sollte ich für jede Umrechnung ein eigenes Script verwenden?
-
Wenn ich noch andere Temperaturen so umrechnen will, mache ich das dann auch in diesem Script oder sollte ich für jede Umrechnung ein eigenes Script verwenden? `
Das ist Geschmackssache. Wenn man mehrere kleine Skripte verwendet, muss man sich weniger Gedanken um Variablennamen machen, denn man kann die gleichen Namen wieder verwenden (Copy & paste). Es müssen häufig nur die Datenpunkt-IDs geändert werden, weshalb ich sie am Skriptanfang deklariere und zuweise. Beispiel:const idSrc = "snmp.0.192_168_178_119.Temperatur"; const idDst = "javascript.0.Temperatur";
Markiere bitte das Thema als gelöst (im Betreff des ersten Beitrags).