OH3, MQTT und Color

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
radioactiveman
Beiträge: 8
Registriert: 27. Dez 2020 16:18
Answers: 0

OH3, MQTT und Color

Beitrag 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?

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

Re: OH3, MQTT und Color

Beitrag 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.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

radioactiveman
Beiträge: 8
Registriert: 27. Dez 2020 16:18
Answers: 0

Re: OH3, MQTT und Color

Beitrag 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"

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: OH3, MQTT und Color

Beitrag 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Servus

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: OH3, MQTT und Color

Beitrag 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
Servus

rom69
Beiträge: 1
Registriert: 3. Apr 2018 00:06
Answers: 0

Re: OH3, MQTT und Color

Beitrag 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

Antworten