Seite 1 von 1

Number Werte umwandeln ohne Rule?

Verfasst: 11. Jan 2023 11:07
von Maggi
Hallo mal wieder :-)

ich habe etwas gebastelt um einen Temperatursensor über Modbus ins Openhab zu bekommen.
Die Temperaturwerte werden allerdings als 3 stellige Zahl gelesen und müssen noch mit einem Faktor 0.1 multipliziert bzw. in meinem Fall durch den Divisor 10 geteilt werden, damit die Temperatur richtig mit Kommastelle angezeigt wird.

Dazu habe ich folgende JS Transformation genommen, da ich auf eine Regel verzichten wollte.

Code: Alles auswählen

(function(i) {
    return parseFloat(i) / 10;
})(input)
Das Ganze natürlich auch im ITEM richtig eingetragen, damit das Transformation Script verwendet wird.
Jetzt wird der Wert welcher z.B. als 223 ausgelesen auch als 22.3 angezeigt. Allerdings bekomme ich es nicht hin, dass hinter dem Wert noch ein °C steht. Besser wäre auch noch wenn die Temperatur mit einem Komma anstelle eines Punktes angezeigt wird.

Hat da jemand eine Idee?

Re: Number Werte umwandeln ohne Rule?

Verfasst: 11. Jan 2023 14:27
von violine21
Maggi hat geschrieben: 11. Jan 2023 11:07 ...
Das Ganze natürlich auch im ITEM richtig eingetragen, damit das Transformation Script verwendet wird.
Jetzt wird der Wert welcher z.B. als 223 ausgelesen auch als 22.3 angezeigt. Allerdings bekomme ich es nicht hin, dass hinter dem Wert noch ein °C steht. Besser wäre auch noch wenn die Temperatur mit einem Komma anstelle eines Punktes angezeigt wird.

Hat da jemand eine Idee?
Hallo,
hast du das Item in der UI angelegt oder Textbasiert?
UI:
Add Metadata -> State Description -> Pattern -> %s °C

Textbasiert:
Item-Datei -> (Beispiel von mir)

Code: Alles auswählen

String    VartaKapazitaetString      "Varta Kapazitaet [%s kWh]"       {channel="modbus:data:2598039d22:bc18fb2bf4:string" [profile="transform:JS", function="wert_x0,01.js"]}

Re: Number Werte umwandeln ohne Rule?

Verfasst: 11. Jan 2023 19:16
von Maggi
Ich hab bei mir noch OH2.5 im Einsatz und mache alles Textbasiert.

Mit deinem Beispiel als String funktioniert es, dass die Temperatur mit °C angezeigt wird. Als Number leider nicht.

Code: Alles auswählen

String Temp     "ModbusTemperatur [%s °C]"   (Temperatur) { channel="modbus:data:a798f0d4:string" [profile="transform:JS", function="divideBy10.js"]}
Vorher mit einem Number Item hat es nicht geklappt. Hatte es wie folgt gemacht.

Code: Alles auswählen

Number Temp	 "ModbusTemperatur [JS(divideBy10.js):%.0f ]"   (Temperatur) { channel="modbus:data:a798f0d4:number" }
Danke nochmal.

Re: Number Werte umwandeln ohne Rule?

Verfasst: 11. Jan 2023 23:06
von violine21
Ah, OH 2.5.
Dann probier mal folgende JS-Transformation:

Code: Alles auswählen

(function(i) {
    i = i / 100;
    s = i.toString();
    return (s.replace(".", ","));    
})(input)
Dann ist der Punkt durch ein Komma ersetzt.Die Einheit kannst du wie gehabt erzeugen.
Ich bin jetzt kein Java-Script-Experte aber mir war so, das das Ergebnis aus einer JS-Transformation ein String ist.
Zum Rechnen musst du in einer Rule ggf. wieder nach Float wandeln.

Evtl. hat jemand noch eine fachlich bessere Idee?

Re: Number Werte umwandeln ohne Rule?

Verfasst: 12. Jan 2023 03:32
von udo1toni
Arbeite nicht gegen das System, sondern mit dem System.

Punkt 1: Eine Dezimalzahl wird in openHAB Basic UI immer mit einem . dargestellt.
Punkt 2: Eine Zahl ist eine Zahl und sollte im System auch als Number Item genutzt werden.

Voraussetzung, dass Du die Zahl als Zahl zuweisen kannst, ist aber, dass der Channel auch vom Typ Number ist.

Unter openHAB3 kannst Du die Main UI nutzen, dort wird im deutschen Sprachraum das Komma als Dezimaltrenner genutzt.
Die Einheit kann einfach über das Label hinzugefügt werden, in der bekannten Form

Code: Alles auswählen

"Temperatur[%.1f°C]"
für eine Darstellung der Zahl mit einer Nachkommastelle.
Die Zuweisung zur JS Transformation geschieht als String, genau wie das Ergebnis immer ein String ist. Spielt aber keine Rolle, denn openHAB ist schlau genug, einen String, der eine Zahl enthält, auch als Zahl zuzuweisen. Der Dezimaltrenner muss aber ein Punkt sein, sonst ist es keine gültige Zahl mehr.

Re: Number Werte umwandeln ohne Rule?

Verfasst: 12. Jan 2023 11:45
von violine21
Hallo Udo,
ja, ich verstehe, was du meinst und im Normalfall mache ich das auch so.
Wie sieht es aber bei dem vom TE geschilderten Fall aus? Solche Situationen habe ich bei mir auch.
Beispiel:
Ich bekomme über MODBUS einen Wert. Ich lege ein Item vom Typ Number an. Jetzt ist der gesendete Wert 587. Der eigentliche Wert wäre
entweder 5870 Wh oder 5,87 kWh. Ich bediene mich einer Transformation:

Code: Alles auswählen

{channel="modbus:data:2598039d22:bc18fb2bf4:string" [profile="transform:JS", function="wert_x0,01.js"]}

Code: Alles auswählen

(function(i) {
    return (parseFloat(i) / 100);
})(input)
Der entstandene Wert ist ein String mit einem Punkt als Trenner. Das kann die Main UI nicht korrigieren, das mache ich per replace im JS.
Nicht schön aber ich weiss keinen anderen Weg.
Hast du einen Tip?

Nachtrag:
%.2fkWh fügt 2 Kommastellen an. Das Ergebnis ist 587,00kWh.

Re: Number Werte umwandeln ohne Rule?

Verfasst: 12. Jan 2023 16:46
von udo1toni
Nein, der Punkt ist der korrekte Dezimaltrenner, den darfst Du nicht durch ein Komma ersetzen. Intern arbeitet openHAB ausschließlich mit dem Punkt als Dezimaltrenner, was auch immer Du anzeigen lässt. Und ja, JS liefert immer ein String Objekt zurück, aber nein, deshalb musst Du kein String Item zum weiterverarbeiten angeben, openHAB kann sehr wohl den String in ein Number Item rein schreiben (solange der String ausschließlich eine gültige Dezimalzahl darstellt).
Sollte das wegen irgendwelcher Besonderheiten des Bindings nicht funktionieren, bleibt nur der Weg über eine Rule, in welcher dann explizit per Float.parseFloat(stringItem.state) eine passende Float-Zahl generiert wird. Dann kannst Du allerdings die Umrechnung auch gleich in der Rule abfrühstücken.