Seite 1 von 1

OH3, MQTT und Color

Verfasst: 22. Jan 2021 21:09
von radioactiveman
Ich binde per OpenHAB 3 gerade eine Hue Go per zigbee2MQTT ein. Scheitere allerdings an der Übergabe der Farbwerte über den color_xy-Channel.

Ich habe gelesen, dass zur Aufteilung in drei Werte für MQTT bisher eine JavaScript-Transformation notwendig war. Ist dem mit OH3 auch noch so oder gibt es da ggf. ein Bordmittel, das ich verwenden kann?

Re: OH3, MQTT und Color

Verfasst: 22. Jan 2021 22:34
von udo1toni
JavaScript ist ein Bordmittel. Wichtig ist halt, dass der Fabwert als xy übertragen wird. openHAB arbeitet intern mit HSB und verwendet dieses Format gewöhnlich auch nach außen.

Re: OH3, MQTT und Color

Verfasst: 23. Jan 2021 19:41
von radioactiveman
Ich kriege es nicht hin. JS Transformation in OH3 installiert, diesem Beispiel aus OH2 folgend https://community.openhab.org/t/zigbee2 ... l/72129/32

JS Transformation file HSBtoRGB.js

Code: Alles auswählen

(function (x) {
    if (x=="ON" || x=="INCREASE") {
        return '{"state":"ON"}'
    } else if (x=="OFF" || x=="DECREASE") {
        return '{"state":"OFF"}'
    } else {
        var tex = x.split(',');
        s = parseInt(tex[1]);
        v = parseInt(tex[2]);
        h = parseInt(tex[0]);
    
        h=(!h ? 0 : h/360.0);
        s=(!s ? 0 : s/100.0);
        v=(!v ? 0 : v/100.0);

        i = Math.floor(h * 6);
        f = h * 6 - i;
        p = v * (1 - s);
        q = v * (1 - f * s);
        t = v * (1 - (1 - f) * s);
        switch (i % 6) {
            case 0: r = v, g = t, b = p; break;
            case 1: r = q, g = v, b = p; break;
            case 2: r = p, g = v, b = t; break;
            case 3: r = p, g = q, b = v; break;
            case 4: r = t, g = p, b = v; break;
            case 5: r = v, g = p, b = q; break;
        }
        return '{"brightness":'+ Math.round(v * 255)+',"color":{"rgb":"'+ Math.round(r * 255)+','+ Math.round(g * 255)+','+Math.round(b * 255)+'"}}'
    }
})(input)
Thing HueGo1

Code: Alles auswählen

UID: mqtt:topic:HueGo1
label: Hue Go 1
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:OH_MQTT
channels:
  - id: state
    channelTypeUID: mqtt:switch
    label: Status
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/Hue_Go1/set/state
      stateTopic: zigbee2mqtt/Hue_Go1/state
      postCommand: true
  - id: HueGo1_Brightness
    channelTypeUID: mqtt:dimmer
    label: Helligkeit
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/Hue_Go1/set/brightness
      min: 0
      stateTopic: zigbee2mqtt/Hue_Go1/brightness
      max: 253.98
      off: disabled
      on: enabled
  - id: HueGo1_ColorTemp
    channelTypeUID: mqtt:dimmer
    label: Farbtemperatur
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/Hue_Go1/set/color_temp
      min: 100
      stateTopic: zigbee2mqtt/Hue_Go1/color_temp
      max: 499.96
  - id: HueGo1_ColorHSB
    channelTypeUID: mqtt:color
    label: Farbe
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/Hue_Go1/set
      transformationPatternOut: JS:HSBtoRGB.js
      stateTopic: zigbee2mqtt/Hue_Go1/dumb
      onBrightness: 70
Status, Helligkeit und Farbtemperatur haben gestern funktioniert. Wenn ich jetzt indes meine versuchte Channel-Version der Farbe (inkl. verlinktem Item) hinzufüge, schaltet das Thing auf
"Status:
OFFLINE
CONFIGURATION_ERROR
Remove and recreate: mqtt:topic:HueGo1:HueGo1_Color"

Re: OH3, MQTT und Color

Verfasst: 20. Mär 2021 14:37
von Quautiputzli
Hallo,
ich möchte mich hier anschließen, weil ich auch eine Lampe über xy steuern möchte.

Ich habe ein Lampe die ich über zigbee2mqtt über xy steuern möchte. Dazu hab ich natürlich ein mqtt-Thing angelegt, und einen Channel color mit xy angelgt.
OH-xy.png

Code: Alles auswählen

UID: mqtt:topic:broker:gf_office_light
label: Licht Büro
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:broker
location: Office
channels:
  - id: Office_Light_HSB
    channelTypeUID: mqtt:color
    label: Licht Büro HSB
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/GF_Office_Light/set
      colorMode: HSB
      formatBeforePublish: '{"color":{"hsb":"%1$d,%2$d,%3$d"}}'
      stateTopic: zigbee2mqtt/GF_Office_Light
      transformationPattern: JSONPATH:$.brightness
      onBrightness: 100
  - id: Office_Light_xy
    channelTypeUID: mqtt:color
    label: Licht Büro xy
    description: ""
    configuration:
      formatBeforePublish: '{"color":{"x":%s,"y":"%s"},"brightness":"%s"}'
      commandTopic: zigbee2mqtt/GF_Office_Light/set
      colorMode: XYY
      stateTopic: zigbee2mqtt/GF_Office_Light
      off: '{"state": "OFF"}'
      onBrightness: 100
      on: '{"state": "ON"}'
  - id: Office_Light_str
    channelTypeUID: mqtt:string
    label: Licht Büro Text
    description: ""
    configuration:
      formatBeforePublish: '{"effect":"%s"}'
      commandTopic: zigbee2mqtt/GF_Office_Light/set
      stateTopic: zigbee2mqtt/GF_Office_Light
  - id: Office_Light_rgb
    channelTypeUID: mqtt:color
    label: Licht Büro rgb
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/GF_Office_Light/set
      colorMode: RGB
      formatBeforePublish: '{"color":{"rgb":"%1$d,%2$d,%3$d"}}'
      off: '{"state": "OFF"}'
      onBrightness: 100
      on: '{"state": "ON"}'
So wie es aussieht, ist die Umrechnung nach xy bereits in OH3 enthalten. Auf jeden Fall passen die Farben, wenn man sie am Colorpicker einstellt. Nur die Helligkeit passt nicht ganz, da man sie nur von 0-100 einstellen kann. Die Lampe erwartet aber 254 als Maximum.

Ist es denn möglich nur den brightness Wert umzurechnen? Man müsste den ja nur mit 2,55 muliplizieren.

Re: OH3, MQTT und Color

Verfasst: 22. Mär 2021 06:48
von Quautiputzli
Hallo,
Ich hab das noch nicht so hinbekommen, dass ich den brightness-wert umrechne wenn er gemeinsam mit dem xy kommt.

Ich habe nun als Workaround erstmal noch einen extra Dimmer Channel für Brightness angelegt. Diesen Wert konnte ich mit JavaScript umrechnen:

Code: Alles auswählen

(function(x) {
     var result = "";
     result=x*2.54;
     return result;
})(input)
Damit komme ich nun auf die volle Helligkeit. Leider werden nun jetzt bei jeder Änderung der Helligkeit bzw. ein- und ausschalten beide Channels ausgeführt, also der Dimmer für Brightness und xy oder rgb (hab beides probiert) dadurch ändert sich dann z.B. die Farbtemperatur ein wenig.

Ich würde gerne mit den JavaScript bevor ich den String "{"color":{"x":%s,"y":"%s"},"brightness":"%s"}" sende, nur den brightness Wert umrechnen.
Mit diesem abgeändertet JavaScript

Code: Alles auswählen

(function(x,y,z) {
     var result = "";
     result=z*2.54;
     return result;
})(input)
kann ich zumindest schonmal auf den dritten Wert selectieren, und diesen umrechnen, es wird aber dann auch nur der Dritte Wert ausgegeben. Wer kennt sich mit diesem JavaScript aus, kann man das so hinbekommen, dass es funktioniert, also z.B. von
0.3,0.3,100
auf
0.3,0.3,254
dann könnte ich das alles in den xy Channel packen.

Danke und Servus

Re: OH3, MQTT und Color

Verfasst: 27. Mär 2021 13:25
von rom69
Hallo,
ich habe das so gelöst, funktioniert mit colorpicker für Farbe und Helligkeit. Einen separaten Dimmer für Helligkeit benötigt man nicht:

Code: Alles auswählen

channels:
  - id: color
    channelTypeUID: mqtt:color
    label: Color
    description: null
    configuration:
      retained: false
      postCommand: false
      transformationPatternOut: JS:bright-zigbee-out.js
      formatBeforePublish: "%s"
      commandTopic: zig2mqtt/LivingClosetLedBulbIkea/set
      colorMode: XYY
      stateTopic: zig2mqtt/LivingClosetLedBulbIkea
      transformationPattern: JS:bright-zigbee-in.js
      off: "0"
      onBrightness: 100
      on: "1"
Das sind die zugehörigen transform Skripte:
bright-zigbee-in.js:

Code: Alles auswählen

(function(color){
  var data = JSON.parse(color);
  var bright = Number(data.brightness) / 2.54;
  return data.color.x.toString() + "," + data.color.y.toString() + "," + bright.toFixed(0);
})(input)
bright-zigbee-out.js:

Code: Alles auswählen

(function(color){
  var bright = Number(color.split(",")[2]) * 2.54;
  return '{"color":{"x":"' + color.split(",")[0] + '","y":"' + color.split(",")[1] + '"},"brightness":"' + bright.toFixed(0) + '"}';
})(input)
Viele Grüsse
rom69