Seite 1 von 1

MQTT --> RGB aus 3 channels

Verfasst: 4. Mär 2024 18:31
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

Re: MQTT --> RGB aus 3 channels

Verfasst: 4. Mär 2024 20:50
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).

Re: MQTT --> RGB aus 3 channels

Verfasst: 5. Mär 2024 12:25
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)

Re: MQTT --> RGB aus 3 channels

Verfasst: 5. Mär 2024 16:19
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.