MQTT --> RGB aus 3 channels

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Oekel
Beiträge: 142
Registriert: 28. Aug 2021 10:34
Answers: 0

MQTT --> RGB aus 3 channels

Beitrag von Oekel »

Schon seltsam,

nun arbeite ich seit Jahren mit MQTT, aber habe mich noch nie an Farben probiert.
Daher auch gleich ein paar Anfängerfragen für ein neues Generic Item:

Code: Alles auswählen

  - id: zwave_node03_colour
    channelTypeUID: mqtt:colorRGB
    label: RGB
    description: ""
    configuration:
      commandTopic: zwave/testNode3/color/endpoint_0/currentColor/set
      colorMode: RGB
      transformationPatternOut: '{"red":%1$d,"green":%2$d,"blue"%3$d}'
      stateTopic: zwave/testNode3/color/endpoint_0/currentColor
      transformationPattern: JSONPATH:$.red,JSONPATH:$.green,JSONPATH:$.blue
Bildschirmfoto 2024-03-04 um 18.30.07.png
Sieht das halbwegs passend aus? (eher nicht, da das MainUI-Model "null" anzeigt ;)
Und wo genau kann ich diese, sofern es richtig konfiguriert ist, überhaupt "ansteuern".

LG
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: MQTT --> RGB aus 3 channels

Beitrag von udo1toni »

Ja, kein Wunder, denn so geht das leider nicht.
Das TransformationPattern kann EINE Transformation ausführen. Wahlweise kann man auch mehrere Transformations miteinander verketten, wobei die ankommenden Werte dann von links nach rechts alle Transformations durchlaufen. Du musst hier stattdessen mit einer Script Transformation arbeiten, z.B. mit JavaScript. ein passendes Script sähe z.B. so aus:

Code: Alles auswählen

(function(i) {
    var rgb = JSON.parse(i)

    return rgb.red+","+rgb.green+","+rgb.blue
})(input)
Wahlweise kannst Du das auch als Inline Script angeben - es ist ja kurz genug:

Code: Alles auswählen

transformationPattern: JS:|var rgb = JSON.parse(input) rgb.red+","+rgb.green+","+rgb.blue
ungetestet.
rgb wird das empfangene JSON zugewiesen, anschließend wird aus drei JSON Values ein String gebildet. Da der String das letzte Statement im Code ist, sollte dieser an das Item geschickt werden.

Es muss JavaScript Scripting installiert sein (die Scripting Engine kümmert sich auch um die Script Transformations).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Oekel
Beiträge: 142
Registriert: 28. Aug 2021 10:34
Answers: 0

Re: MQTT --> RGB aus 3 channels

Beitrag von Oekel »

Code: Alles auswählen

transformationPattern: JS:|var rgb = JSON.parse(input); var result = rgb.red+","+rgb.green+","+rgb.blue; result
So funktionert die eine Richtung.

Die andere Leider nicht, egal in welcher Weise ich es escape, es kommt nur
200, 100, 10
beim MQTT-Broker an.

Daher die Frage: Welchen Unterschied gibt es zwischen formatBeforePublish und transformationPatternOut?

Code: Alles auswählen

formatBeforePublish: '{"red":%1$d, "green":%2$d, "blue":%3$d}'
(funktioniert)

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

Re: MQTT --> RGB aus 3 channels

Beitrag von udo1toni »

Ah, das hatte ich übersehen... transformationPatternOut ist das exakte Gegenstück zu transformationPattern, d.h. man kann dort einen Transformation Service angeben, der gesendete Daten manipuliert. Sinnvoll ist hier gewöhnlich etwas wie ein Script, Scale oder ein Mapping.
Um die gesendeten Werte zu formatieren, also z.B. eine bestimmte Anzahl Nachkommastellen zu erzwingen oder auch Werte innerhalb eines fixen Strings einzusetzen (so wie in Deinem Fall), musst Du tatsächlich formatBeforePublish verwenden. Beim Color Channel kommt halt erschwerend noch hinzu, dass hier drei separate Werte verwendet werden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten