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.