Seite 1 von 1

Numerische Werte formatieren

Verfasst: 12. Jan 2024 15:23
von manes
ich habe ein numerisches Item, das ich über StateDiscription Pattern so formatiert habe, wie ich es schön finde. Leider scheint diese Formatvorgabe aber nicht übrall zu wirken. Wenn ich ein Widget damit baue, dann bekomme ich noch viele Nachkommastellen mit angezeigt auf dem Bildschirm. Wenn ich die Werte in einer Rule abfrage und dann an Telegram verschicke, sind es ebenso viele Nachkommastellen, die dann angezeigt werden. Wie kann man sowas formatieren, das es generell immer nur die Nachkommastellen werden, die man haben möchte? In meinem Fall statt 16, eben nur eine.

Re: Numerische Werte formatieren

Verfasst: 12. Jan 2024 18:03
von udo1toni
Du musst im Widget auf den displayState zugreifen, dann wird das Pattern berücksichtigt.

Re: Numerische Werte formatieren

Verfasst: 12. Jan 2024 18:21
von manes
Danke, das war es ...

Re: Numerische Werte formatieren

Verfasst: 12. Jan 2024 19:24
von manes
war es doch nicht ganz. Wenn ich in der Rule mit Javascript abfrage, dann ist displayState nicht bekannt.

Re: Numerische Werte formatieren

Verfasst: 12. Jan 2024 23:06
von udo1toni
In einer Rule kannst Du den Status ja problemlos nach Wunsch formatieren.

Re: Numerische Werte formatieren

Verfasst: 13. Jan 2024 08:44
von manes
Danke für die klare und knappe Aussage. Nur hilft sie mir nicht weiter, weil.... Wie macht man sowas? ;-)

Code: Alles auswählen

var telegramAction = actions.get("telegram","telegram:telegramBot:XXXXXXXXXXXXX");
var nAlterzaehlerstand = itemRegistry.getItem('gasverbrauch').getState();
var nAltertagstand = itemRegistry.getItem('gasverbrauchtag').getState();

if (itemRegistry.getItem('MQTT_Stromzahler_Gas_Zahler').getState() == 'ON'){
   var nNeuerzaehlerstand = nAlterzaehlerstand + .1;
  var nNeuertagstand = nAltertagstand + .1;
  events.sendCommand('gasverbrauch',nNeuerzaehlerstand);
  events.sendCommand('gasverbrauchtag',nNeuertagstand);
  telegramAction.sendTelegram("alter/neuer Wert " + nAlterzaehlerstand + "/" + nNeuerzaehlerstand);
}
telegramAction.sendTelegram("Gaszähler sendet " + itemRegistry.getItem('MQTT_Stromzahler_Gas_Zahler').getState());

Re: Numerische Werte formatieren

Verfasst: 13. Jan 2024 09:13
von Harka
Moin,
wenn es das Nashorn (dein veraltetes Javascript) frisst

Code: Alles auswählen

itemRegistry.getItem('MQTT_Stromzahler_Gas_Zahler').getState().toFixed(1)
ansonsten runden ( Math.round(x) ggf. mit *10 und /10 )

Re: Numerische Werte formatieren

Verfasst: 13. Jan 2024 13:00
von udo1toni
Ja, Punkt 1 wäre runden auf eine Stelle:

Code: Alles auswählen

var nNeuerzaehlerstand = Math.round(nAlterzaehlerstand*10)/10 + .1;
Das Andere wäre die Darstellung:

Code: Alles auswählen

String.format("%.1f",myString)
liefert den Wert mit einer Nachkommastelle. Funktioniert natürlich nur, wenn der Wert als String vorliegt oder sich so interpretieren lässt - eine verwendete Variable muss als Objekt angelegt sein, bzw. sie darf kein Primitive sein.

Ein weiterer Punkt: sendCommand() sendet einen Befehl. Ich gehe stark davon aus, dass der Zählerstand openHAB nicht mehr verlässt und auch keine Rule getriggert werden soll. Mithin wäre postUpdate() hier korrekt.
Hintergrund: sendCommand() sendet einen Befehl, das Item generiert daraufhin auf dem Eventbus ein Event received command. openHAB errechnet außerdem den wahrscheinlichen neuen Status und sendet direkt noch ein postUpdate() hinterher, welches dann tatsächlich den Status des Items setzt (und seinerseits noch das Event received update und gegebenenfalls changed triggert). Man kann dieses autoupdate auch ausschalten (Item Metadaten autoupdate=false) und sollte das grundsätzlich bei allen Items tun, bei denen man einen echten Status vom Channel bekommt.