MQTT Value Transformations "Wert"* 0,0196
-
- Beiträge: 4
- Registriert: 27. Okt 2023 16:34
MQTT Value Transformations "Wert"* 0,0196
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!
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!
-
- Beiträge: 296
- Registriert: 22. Sep 2018 10:38
Re: MQTT Value Transformations "Wert"* 0,0196
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:
Dann hast du als Ergebnis allerdings Kommazahlen. Falls du Ganzzahlen benötigst, müsstest du noch folgendes ergänzen:
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
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
- udo1toni
- Beiträge: 15244
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: MQTT Value Transformations "Wert"* 0,0196
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:
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:
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.
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 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
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
-
- Beiträge: 489
- Registriert: 30. Apr 2021 13:13
Re: MQTT Value Transformations "Wert"* 0,0196
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

Danke
Zuletzt geändert von Harka am 1. Nov 2023 11:02, insgesamt 2-mal geändert.
-
- Beiträge: 296
- Registriert: 22. Sep 2018 10:38
Re: MQTT Value Transformations "Wert"* 0,0196
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]"
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
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX
- udo1toni
- Beiträge: 15244
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: MQTT Value Transformations "Wert"* 0,0196
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
-
- Beiträge: 4
- Registriert: 27. Okt 2023 16:34
Re: MQTT Value Transformations "Wert"* 0,0196
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!!
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!!
- udo1toni
- Beiträge: 15244
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: MQTT Value Transformations "Wert"* 0,0196
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
-
- Beiträge: 296
- Registriert: 22. Sep 2018 10:38
Re: MQTT Value Transformations "Wert"* 0,0196
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.
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
-
- Beiträge: 4
- Registriert: 27. Okt 2023 16:34
Re: MQTT Value Transformations "Wert"* 0,0196
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.
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.