MQTT Value Transformations "Wert"* 0,0196

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

BorisK
Beiträge: 4
Registriert: 27. Okt 2023 16:34
Answers: 0

MQTT Value Transformations "Wert"* 0,0196

Beitrag von BorisK »

Hallo!
Ich habe per Mqtt einen Bewegungsmelder in OH4, der mir einen als Wert für die Verbindungsqualität einen Zahlenwert von 0 bis 255 liefert. Der ist allerdings für das dynamische Icon (ich möchte das mit den vier Balken nutzen) nicht zu gebrauchen. Der Wert muß durch 0,0196 dividiert werden, um auf 0-4 normalisiert zu werden. Jetzt bin ich nach Stunden der Recherche darauf gestoßen, dass ich "Incoming Value Transformnation" dafür nutzen kann (ja, ich weiß, es gibt noch andere Wege). Nur: wie mache ich das dann? Wie lautet der Befehl, den ich dann da eintragen muß?

Oder gibt es einen noch einfacheren Weg dazu? Ich bin ziemlicher Neuling in der Materie...

Besten Dank für die Hilfe!

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von nw378 »

Was du ganz simpel machen kannst: leg ein zweites Number Item an und eine Regel, die jedesmal, wenn dein mqtt feuert, den modifizierten Wert in Item B speichert.

So in etwas:

Code: Alles auswählen

rule „mqtt umrechnen“
  when Item mqtt_item changed then 
  item_b.postUpdate((mqtt_item.state as Number) *0.0196)
end
Dann hast du als Ergebnis allerdings Kommazahlen. Falls du Ganzzahlen benötigst, müsstest du noch folgendes ergänzen:

Code: Alles auswählen

rule „mqtt umrechnen“
  when Item mqtt_item changed then 
  var int x = Math::round(mqtt_item.state as Number) *0.0196))
  item_b.postUpdate(x)
end
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von udo1toni »

Herzlich willkommen im openHAB Forum!

Zunächst mal: Du willst nicht durch 0,0196 dividieren, sondern allenfalls mit diesem Wert multiplizieren. (um auf einen Wert 0-4 zu kommen)
Vermutlich ist es einfacher, durch 64 zu teilen, nachdem Du z.B. 32 addiert hast :)

openHAB sieht keine direkte Möglichkeit vor, einen erfassten Messwert mit einem bestimmten Faktor zu beaufschlagen.
Es gibt verschiedene Möglichkeiten, mit dem Problem umzugehen. Die Möglichkeit eines zweiten Items hat nw378 ja schon erläutert, es geht aber auch anders.
Die einfachste Möglichkeit ist dabei vermutlich die SCALE Transformation.
Du musst den Transformation Service zunächst installieren, wie andere Addons auch.
Anschließend kannst Du innerhalb des Links (das ist die Verbindung zwischen Channel und Item, NICHT die Channel Konfiguration!) das Profile SCALE aktivieren. Du musst einen Dateinamen angeben, z.B. quality.scale wäre ein sinnvoller Dateiname.
Zusätzlich musst Du diese Datei noch anlegen, und zwar im Verzeichnis $OPENHAB_CONF/transform/ (auf einem Pi mit openHABian Installation wäre das z.B. /etc/openhab/transform/)
Die Datei bekommt dann folgenden Inhalt:

Code: Alles auswählen

[..60]=0
]60..100]=1
]100..140]=2
]140..200]=3
]200..]=4
Die Werte sind nur als Beispiel gedacht, Du kannst die Werte "beliebig" setzen.
Die Schreibweise bedeutet:
[.. -> alle Werte unterhalb
]60 -> alle Werte oberhalb 60 (60 gehört nicht mit zu den Werten)
60] -> alle Werte bis 60 (60 wird mit eingeschlossen)
..] -> alle Werte oberhalb
Die Tabelle wird grundsätzlich von oben nach unten abgearbeitet, der erste Wert, der matcht, wird verwendet. Es ist also wichtig, die Werte in aufsteigender (oder alternativ in absteigender) Reihenfolge anzugeben und darauf zu achten, dass es weder Überlappungen der Wertebereiche noch Lücken gibt.
Konkret werden die Werte 0 bis 60 als 0 gewertet, 61 bis 100 ergibt 1, 101 bis 140 ergibt 2, 141 bis 200 ergibt 3, alles über 200 ergibt 4.
Mit Scale kannst Du also sehr gut steuern, wie sich die Anzeige verhalten soll.

Weiterhin kannst Du auch jede installierte Scriptsprache nutzen, um den Wert per Script zu transformieren. Das Script schreibst Du dazu direkt in das betreffende Feld, z.B. als DSL:

Code: Alles auswählen

var output = ((input + 32) / 64).intValue
output
Wahlweise kannst Du diese Transformations auch direkt im Channel verwenden, dort gibst Du dann den zu verwendenden Transformation Service an (z.B. SCALE:quality.scale oder DSL:quality.dsl (dann stünde der Code in der Datei quality.dsl im transform-Verzeichnis), alternativ kannst Du den Code auch dort inline verwenden, DSL:|((input + 32) / 64).intValue

Die Dateinamen müssen immer mit der korrekten Endung abgeschlossen werden, im Fall von SCALE ist das .scale (nicht .Scale oder sonst eine alternative Schreibweise), für eine DSL Script Transformation wäre .dsl die korrekte Endung. Da die DSL als einzige Script Sprache direkt installiert ist, wird sie auch als einzige direkt als Option angeboten und kann direkt verwendet werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von Harka »

udo1toni hat geschrieben: 1. Nov 2023 10:16 ...
Zusätzlich musst Du diese Datei noch anlegen, und zwar im Verzeichnis $OPENHAB_CONF/transform/ (auf einem Pi mit openHABian Installation wäre das z.B. /etc/openhab/transform/)
Wer die Datei lieber über die UI anlegt - das geht über die Settings/Transformation. Musste Udos SCALE-Lösung gleich mal nachbauen weil sie mir besser gefällt als eine Berechnung in einer Javascript-Transformation :D
Danke
Zuletzt geändert von Harka am 1. Nov 2023 11:02, insgesamt 2-mal geändert.

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von nw378 »

Harka hat geschrieben: 1. Nov 2023 10:41
udo1toni hat geschrieben: 1. Nov 2023 10:16 ...
Zusätzlich musst Du diese Datei noch anlegen, und zwar im Verzeichnis $OPENHAB_CONF/transform/ (auf einem Pi mit openHABian Installation wäre das z.B. /etc/openhab/transform/)
Wer die Datei lieber über die UI anlegt - das geht über die Settings/Transformation. Musste Udos Lösung gleich mal nachbauen :D
Danke

Mit dem von Udo beschriebenen Vorgehen lassen sich auch andere Skalierungen umsetzen; je Wert Ausgabe eines Textes - z.B. Windstärken auf der Beaufort-Skala.

.sitemap

Code: Alles auswählen

Text item=Wind_ms label="Windstärke [SCALE(bft_ms_de.scale):%s]"
bft_ms_de.scale

Code: Alles auswählen

[..0.5[ = Windstille
[0.5..2.1[ = leiser Zug
[2.1..3.6[ = leichte Brise
[3.6..5.7[ = schwache Brise
[5.7..8.2[ = mäßige Brise
[8.2..11.3[ = frische Brise
[11.3..14.4[ = starker Wind
[14.4..17.5[ = steifer Wind
[17.5..21.1[ = stürmischer Wind
[21.1..24.7[ = Sturm
[24.7..28.5[ = schwerer Sturm
[28.5..32.7[ = orkanartiger Sturm
[32.7 ..] = Orkan
sorry for offtopic
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von udo1toni »

Harka hat geschrieben: 1. Nov 2023 10:41 Wer die Datei lieber über die UI anlegt - das geht über die Settings/Transformation.
Stimmt auffallend... Wichtig: man sollte die Scale Definition dann zuerst anlegen, denn über die UI nutzt man statt eines Dateinamens die UID der Scale Definition, die wird dann als Auswahl angeboten, wenn man im Link SCALE wählt und ins Optionsfeld klickt...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

BorisK
Beiträge: 4
Registriert: 27. Okt 2023 16:34
Answers: 0

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von BorisK »

Wie geil, wie geil!
Hat alles so geklappt, wie ihr es beschrieben habt! Ich hab zwar etwas suchen müssen, bis ich die Scale Option gefunden hab, aber dann war alles super.
Er zeigt mir zwar noch gerade bei einem Wert von 0 vom Sensor alle 4 Balken an, aber ich vermute mal, das liegt daran, dass der Sensor noch nicht wieder (wirklich) einen Wert geschickt hat.

Vielen Dank!!

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von udo1toni »

Und das Item ist vom Typ Number? wenn es den Wert 0 hat, muss die SCALE Transformation sofort funktionieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von nw378 »

Und noch eine Frage, @BorisK:

wendest du die SCALE Transformation auch wirklich auf den Wert des Items, also auf .state an?

In meinem Wind-Beispiel oben habe ich die Transformation auf das Label, also die Ausgabe, angewandt.
Für das dynamische Icon relevant ist m. W. aber der .state-Wert.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

BorisK
Beiträge: 4
Registriert: 27. Okt 2023 16:34
Answers: 0

Re: MQTT Value Transformations "Wert"* 0,0196

Beitrag von BorisK »

Hallo!

Ich habe gerade nochmal geschaut: es ist wirklich als Nummer deklariert und ja, ich wende es auf die Scale Funktion an.
Komisch ist auch, dass ein gesendeter Level mit dem Wert 1 richtig übersetzt wird und der gleiche Wert von einem anderen Sensor falsch bzw gar nicht. Beide sind als Nummern deklariert und benutzen die Scale funktion.

Antworten