Zigbee2MQTT color_x/y -> RGB #demnächst obsolet

Begonnen von KernSani, 01 Februar 2019, 00:26:22

Vorheriges Thema - Nächstes Thema

Steffen

Hallo,

Ich habe meine Hue Bulb genau wie beschrieben definiert, aber beim Colorpicker bekomme ich nur Blau, egal was ich darin auswähle.

Woran könnte das liegen?


Internals:
   CFGFN     
   DEF        9290012573A 0x0017880100b29eea HueLampZigBee
   FRIENDLYNAME HueLampZigBee
   FUUID      5e1f0487-f33f-b82c-9d30-2409572a3decf94a
   IODev      mqtt
   MODEL      9290012573A
   NAME       HueLampZigBee
   NOTIFYDEV  9290012573A 0x0017880100b29eea HueLampZigBee
   NR         18788
   SID        0x0017880100b29eea
   STATE      ON
   TYPE       XiaomiMQTTDevice
   READINGS:
     2020-01-15 13:44:01   brightness      255
     2020-01-15 13:44:01   color           FFBB52
     2020-01-15 13:43:54   color-x         0.505624025055233
     2020-01-15 13:43:54   color-y         0.415207746862562
     2020-01-15 13:43:54   color_temp      454
     2020-01-15 13:44:01   state           ON
     2020-01-15 13:44:01   transmission-state incoming publish received
   message_ids:
   subscribe:
     zigbee2mqtt/HueLampZigBee
     xiaomi/0x0017880100b29eea/#
   subscribeExpr:
     ^zigbee2mqtt\/HueLampZigBee$
     ^xiaomi\/0x0017880100b29eea.*$
   subscribeQos:
     xiaomi/0x0017880100b29eea/# 0
     zigbee2mqtt/HueLampZigBee 0
Attributes:
   IODev      mqtt
   devStateIcon {return ".*:light_light_dim_100@#".ReadingsVal($name,"color","FFFFF").":toggle"}
   room       XiaomiMQTTDevice
   stateFormat state
   userReadings color {cieToRgb(ReadingsVal($name,"color-x",0),ReadingsVal($name,"color-y",0),ReadingsVal($name,"brightness",254))}
   webCmd     toggle:on:off:brightness:color:color_temp
   widgetOverride brightness:colorpicker,BRI,0,15,255 color:colorpicker,RGB color_temp:colorpicker,CT,250,1,454

Mfg Steffen

PatBreitMe

Hey dank euch für die Mühe, das hat mich jetzt echt weiter gebracht.

Habe auch eine GL-C-008 und hab das Ding echt schon verflucht. Habe ihn aber jetzt am laufen per MQTT_Server über eine cc2531.
Hab ihn auch mit attrTemplate zigbee2mqtt_light_rgbcct_rgb und zigbee2mqtt_light_rgbcct_hex probiert und es funktionieren bei mir beiden module.

Soweit so gut.
Jetzt habe ich nur noch ein Problem mit dem Homebridgemapping und zwar würde ich es gerne über Homebridge per iPhone Steuern.

Vom der Homebridge bekomme ich Werte für ON/OFF brightness und color_temp das funktioniert auch. Problem ist eigentlich nur die Farbe.

Die Farbe kommt aus der Homebridge als Wert in "Hue" der GL-C-008 hätte aber gerne den Farbwert als im Format hex. Jetzt habe ich schon mit dem Colormodul rumgerechnet aber ich komme nicht weiter.
Habe auch schon ein Dummy angelegt, welches von der Homebridge beschrieben wird, dann von Hue in hex umgerechnet und versucht es auf das Device zu schieben, jedoch ohne Erfolg.

Komisch ist auch das ich als Reading den Farbwert in color_x und color_y vom GL-C-008 zurückbekomme.

Also habe ich eine Wert in HUE muss ihn in HEX schicken und bekomme ihn als COLOR_XY zurück.


defmod MQTT2_zigbee_0x00124b001f7a9af3 MQTT2_DEVICE zigbee_0x00124b001f7a9af3
attr MQTT2_zigbee_0x00124b001f7a9af3 IODev MQTT2_SERVER
attr MQTT2_zigbee_0x00124b001f7a9af3 devStateIcon {zigbee2mqtt_devStateIcon255($name)}
attr MQTT2_zigbee_0x00124b001f7a9af3 genericDeviceType light
attr MQTT2_zigbee_0x00124b001f7a9af3 homebridgeMapping
clear
On=state,valueOn=ON,valueOff=OFF,cmdOn=ON,cmdOff=OFF
Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true
Hue=hue,cmd=hue,minStep=10
Saturation=sat,cmd=sat,minStep=10
StatusActive=state,valueOn=opened,valueOff=disconnected
attr MQTT2_zigbee_0x00124b001f7a9af3 model zigbee2mqtt_light_rgbcct_rgb
attr MQTT2_zigbee_0x00124b001f7a9af3 readingList zigbee2mqtt/0x00124b001f7a9af3:.* { json2nameValue($EVENT) }
attr MQTT2_zigbee_0x00124b001f7a9af3 room Homekit,MQTT2_DEVICE
attr MQTT2_zigbee_0x00124b001f7a9af3 setList on:noArg zigbee2mqtt/0x00124b001f7a9af3/set {"state":"ON"}\
  off:noArg zigbee2mqtt/0x00124b001f7a9af3/set {"state":"OFF"}\
  brightness:colorpicker,BRI,0,5,255 zigbee2mqtt/0x00124b001f7a9af3/set {"state":"on","$EVTPART0":"$EVTPART1"}\
  color_temp:colorpicker,CT,154,2,500 zigbee2mqtt/0x00124b001f7a9af3/set {"$EVTPART0":"$EVTPART1"}\
  color:colorpicker,RGB {"zigbee2mqtt/0x00124b001f7a9af3/set ".zigbee2mqtt_RGB2JSON($EVTPART1)}
attr MQTT2_zigbee_0x00124b001f7a9af3 stateFormat {lc ReadingsVal($name,"state",0)}
attr MQTT2_zigbee_0x00124b001f7a9af3 webCmd on:off:brightness:color_temp:color

setstate MQTT2_zigbee_0x00124b001f7a9af3 on
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-08 22:47:14 associatedWith MQTT2_GeneralBridge
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-14 20:28:51 brightness 100
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-14 20:28:51 color_temp 2500
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-14 20:28:51 color_x 0.1378
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-14 20:28:51 color_y 0.0788
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-09 00:27:26 hue 120
setstate MQTT2_zigbee_0x00124b001f7a9af3 2020-04-14 20:28:51 state ON





wires.io

#17
Gibt es eine Lösung dafür? Ich versuche verzweifelt eine Osram AA69697 / Classic A60 RGBW, die via zigbee2mqtt angebunden ist, per homebridgemapping zu steuern.

An/aus, Helligkeit und Farbtemperatur (ColorTemperature) sind kein Problem, bei Farbe (Hue) beiße ich mir die Zähne aus.

Über die FHEM Oberfläche lässt sich die Farbe setzen, in der Home App bekomme ich nicht mal die Farbauswahl angezeigt.

Als Readings habe ich ebenfalls color_x und color_y.

Hier der Teil, der funktioniert:


defmod MQTT2_zigbee_0x8418260000ca3599 MQTT2_DEVICE zigbee_0x8418260000ca3599
attr MQTT2_zigbee_0x8418260000ca3599 IODev myBroker
attr MQTT2_zigbee_0x8418260000ca3599 devStateIcon {zigbee2mqtt_devStateIcon255($name)}
attr MQTT2_zigbee_0x8418260000ca3599 devicetopic zigbee2mqtt/0x8418260000ca3599
attr MQTT2_zigbee_0x8418260000ca3599 genericDeviceType light
attr MQTT2_zigbee_0x8418260000ca3599 homebridgeMapping On=state_,valueOff=off,cmdOff=off,cmdOn=on\
Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true\
ColorTemperature=color_temp,minValue=140,maxValue=500,factor=1.0,minStep=1,cmd=color_temp
attr MQTT2_zigbee_0x8418260000ca3599 model zigbee2mqtt_light_rgbcct_hex
attr MQTT2_zigbee_0x8418260000ca3599 readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/0x8418260000ca3599/availability:.* availability
attr MQTT2_zigbee_0x8418260000ca3599 room Homekit,MQTT
attr MQTT2_zigbee_0x8418260000ca3599 setList on:noArg $DEVICETOPIC/set {"state":"ON"}\
off:noArg $DEVICETOPIC/set {"state":"OFF"}\
brightness:colorpicker,BRI,0,5,255 $DEVICETOPIC/set {"state":"on","$EVTPART0":"$EVTPART1"}\
color_temp:colorpicker,CT,140,2,500 $DEVICETOPIC/set {"$EVTPART0":"$EVTPART1"}
attr MQTT2_zigbee_0x8418260000ca3599 stateFormat {lc ReadingsVal($name,"state",0)}
attr MQTT2_zigbee_0x8418260000ca3599 userReadings state_ {if(ReadingsVal("MQTT2_zigbee_0x8418260000ca3599","availability","") eq "offline") {return "off"} elsif(ReadingsVal("MQTT2_zigbee_0x8418260000ca3599","state","") eq "ON") {return "on"} elsif(ReadingsVal("MQTT2_zigbee_0x8418260000ca3599","state","") eq "OFF") {return "off"} elsif(ReadingsVal("MQTT2_zigbee_0x8418260000ca3599","state","") eq "on") {return "on"} elsif(ReadingsVal("MQTT2_zigbee_0x8418260000ca3599","state","") eq "off") {return "off"}}
attr MQTT2_zigbee_0x8418260000ca3599 verbose 0
attr MQTT2_zigbee_0x8418260000ca3599 webCmd toggle:on:off:brightness:color_temp




wires.io

Vielen Dank und sorry für das Cross-Posting hier und auf Github!

In der verlinkten Lösung wird die Umrechnung beschrieben, aber wie sieht das homebridgemapping aus?

Wenn ich
Hue=hue,maxValue=360,factor=1.0,minStep=1,cmd=hue
eintrage, erscheint in der Home App nicht einmal die Farbauswahl, sondern der Slider für den Schalter ist rot eingefärbt.

Hättest Du da noch einen Tipp?

wires.io

Etwa so?


define myhue set MQTT2_zigbee_0x8418260000ca3599_.* hue .* AS {

my $R = (-1.023 * $EVTPART2) + (3*1023);
my $WW = (-0.12775 * $EVTPART2) + (1406.25);
my $RGB = ( 0.25575* $EVTPART2 ) - 767.25 ;

if ($R > 1023) {$R = 1023};
if ($WW > 1023) {$WW = 1023};
if ($RGB > 1023) {$RGB = 1023};

if ($R < 0) {$R = $RGB};
if ($WW < 0) {$WW = 0};
if ($RGB < 0) {$RGB = 0};
$R = int($R);
$WW = int($WW);
$RGB = int($RGB);

fhem("set $EVTPART0 raw $R,$RGB,$RGB,$WW,$WW");
}


Hue=hue,maxValue=360,factor=1.0,minStep=1,cmd=myhue

wires.io

Ich habe etwas weiter getüftelt und bin jetzt hier:

userReadings hex:color_y.* {Color::xyY2hex(ReadingsVal($name,"color_x",0),ReadingsVal($name,"color_y",0),ReadingsVal($name,"brightness",254))}, @hsv {Color::hex2hsv(ReadingsVal($name,"hex",""))}

homebridgemapping Hue=$hsv[0],maxValue=360,factor=360.0,minStep=1,cmd=hex

Der erste Teil "hex" bildet nun den Hex Farbwert in FHEM ab. Der zweite Teil sollte diesen in einen HSV Wert für Homekit umrechnen. Wenn ich das richtig verstehe, gibt die Funktion hex2hsv ein Array zurück.
1. In den Readings wird immer nur der hsv Wert 1 angezeigt und nicht das ganze Array. Warum?
2. Für das homebridgemapping müsste mir erste Arraywert reichen, der sich zwischen 0 und 1 bewegen sollte. Leider tut sich da aber immer noch nichts.

Wo liegt/liegen der/die Denkfehler?

wires.io

Zitat von: wires.io am 02 Dezember 2020, 15:00:39
Über die FHEM Oberfläche lässt sich die Farbe setzen, in der Home App bekomme ich nicht mal die Farbauswahl angezeigt.
Neue Erkenntnis: Der "Farbauswahlkreis" wird in der Home App nur angezeigt, wenn im homebridgemapping Saturation gesetzt ist.

wires.io

#23
Hier der aktuelle Stand, wo die Farbeinstellung nun funktioniert.

Sehr strange: Die Readings color_saturation und color_hue sind erst zur "Laufzeit" aufgetaucht, nachdem ich in der Home App rumgefummelt habe.

defmod MQTT2_zigbee_0x8418260000cae7ab MQTT2_DEVICE zigbee_0x8418260000cae7ab
attr MQTT2_zigbee_0x8418260000cae7ab IODev myBroker
attr MQTT2_zigbee_0x8418260000cae7ab devStateIcon {zigbee2mqtt_devStateIcon255($name)}
attr MQTT2_zigbee_0x8418260000cae7ab devicetopic zigbee2mqtt/0x8418260000cae7ab
attr MQTT2_zigbee_0x8418260000cae7ab genericDeviceType light
attr MQTT2_zigbee_0x8418260000cae7ab homebridgeMapping clear\
On=state_,valueOff=off,cmdOff=off,cmdOn=on\
Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true\
ColorTemperature=color_temp,minValue=140,maxValue=500,factor=1.0,minStep=1,cmd=color_temp\
Saturation=saturation::color_saturation\
Hue=hue::color_hue
attr MQTT2_zigbee_0x8418260000cae7ab readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/0x8418260000cae7ab/availability:.* availability
attr MQTT2_zigbee_0x8418260000cae7ab room Homekit,MQTT2_DEVICE
attr MQTT2_zigbee_0x8418260000cae7ab setList on:noArg $DEVICETOPIC/set {"state":"ON"}\
off:noArg $DEVICETOPIC/set {"state":"OFF"}\
brightness:colorpicker,BRI,0,5,255 $DEVICETOPIC/set {"state":"on","$EVTPART0":$EVTPART1}\
color_temp:colorpicker,CT,140,2,500 $DEVICETOPIC/set {"$EVTPART0":$EVTPART1}\
hex:colorpicker,HEX,0,15,255 $DEVICETOPIC/set {"color":{"$EVTPART0":"#$EVTPART1"}}\
hue $DEVICETOPIC/set {"color":{"$EVTPART0":$EVTPART1}}\
saturation $DEVICETOPIC/set {"color":{"$EVTPART0":$EVTPART1}}\

attr MQTT2_zigbee_0x8418260000cae7ab stateFormat {lc ReadingsVal($name,"state",0)}
attr MQTT2_zigbee_0x8418260000cae7ab userReadings state_ {if(ReadingsVal($name,"availability","") eq "offline") {return "off"} elsif(ReadingsVal($name,"state","") eq "ON") {return "on"} elsif(ReadingsVal($name,"state","") eq "OFF") {return "off"} elsif(ReadingsVal($name,"state","") eq "on") {return "on"} elsif(ReadingsVal($name,"state","") eq "off") {return "off"}}, hex:color_y.* {Color::xyY2hex(ReadingsVal($name,"color_x",0),ReadingsVal($name,"color_y",0),ReadingsVal($name,"brightness",254))}, rgb:color_y.* {Color::xyY2rgb(ReadingsVal($name,"color_x",0),ReadingsVal($name,"color_y",0),ReadingsVal($name,"brightness",254))}, hue {my ($hue,$sat,$val) = Color::hex2hsv(ReadingsVal($name,"hex",""));; $hue}, sat {my ($hue,$sat,$val) = Color::hex2hsv(ReadingsVal($name,"hex",""));; $sat}, val {my ($hue,$sat,$val) = Color::hex2hsv(ReadingsVal($name,"hex",""));; $val}
attr MQTT2_zigbee_0x8418260000cae7ab verbose 0
attr MQTT2_zigbee_0x8418260000cae7ab webCmd toggle:on:off:brightness:color_temp:hex

setstate MQTT2_zigbee_0x8418260000cae7ab off
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-03 11:15:51 associatedWith MQTT2_zigbee
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-03 11:14:57 attrTemplateVersion 20200904
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:27 availability online
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 brightness 254
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 color_hue 0.6361111111111111
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 color_saturation 0.6
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 color_temp 370
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 color_x 0.3805
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 color_y 0.3769
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 hex FFEC9D
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 hue 0.133333333333333
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 linkquality 18
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 rgb 0.617600968190623
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 sat 0.384313725490196
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 state OFF
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 state_ off
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 update_available false
setstate MQTT2_zigbee_0x8418260000cae7ab 2020-12-17 13:03:49 val 1


Beta-User

Hmm, lese hier schon eine Weile mit und hatte immer den Eindruck, das geht in die falsche Richtung, weil erst mal an dem Homebridgemapping rumgeschraubt wurde und dann noch kompliziert rumgerechnet, aber das sieht jetzt schon besser aus ;) .

Vielleicht grundsätzlich: wenn irgend möglich, sollte man als erstes versuchen, den Hin- und Rückweg für die Dinge passend zu machen, die sowieso schon "da" sind, bevor man rechnet.

Ergo sollte man erst mal dafür sorgen, dass das, was zurückkommt, dann auch "gute" Readingnamen bekommt. Geht hier wohl mit jsonMap, das muss man aber aktivieren:

attr MQTT2_zigbee_0x8418260000cae7ab readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }\
[...]
attr MQTT2_zigbee_0x8418260000cae7ab jsonMap color_hue:hue color_saturation:saturation

Kann natürlich sein, dass dann die Wertebereiche nicht passen, da wäre dann aber die Frage, auf welcher Seite man es fixt. M.E. einfacher ist die Sendeseite bzw. dann nur das HomebridgeMapping.

In der setList könnte man dann auch passende widgets hinterlegen.

Ob dann der hex-Setter noch Sinn macht, wäre die Frage?

Auf userReadings "state_" müßte man eigentlich verzichten können, es sollte möglich sein, "state" zu setzen und das auf "availability:.offline" zu triggern?

Falls die Voraussetzungen etwas "entschlackt" werden können (mAW.: es ohne Anpassung der Color.pm geht), kann ich das (samt homebridgeMapping) gerne dann in attrTemplate für alle verwursteln...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

wires.io

#25
Habe mein Posting oben leicht geändert. Die Farbeinstellung funktioniert dank Anpassung des homebrigdemapping nun. Habe dabei minValue, maxValue und factor rausgenommen. Ich schaue mir Deine Vorschläge an und optimiere / entschlacke.

wires.io

Habe nun anhand einer anderen LED etwas entschlackt.

Das hier habe ich noch nicht umgesetzt:

Zitat von: Beta-User am 17 Dezember 2020, 13:42:51
Auf userReadings "state_" müßte man eigentlich verzichten können, es sollte möglich sein, "state" zu setzen und das auf "availability:.offline" zu triggern?

Der state soll ja nicht nur von der availability abhängen, sondern auch davon, ob per Home App ein- bzw. ausgeschaltet wird. availability soll nur greifen, wenn per Wandschalter physikalisch ausgeschaltet wird. Deshalb der Umweg über die userReadings. Geht das eleganter?

Beta-User

Schon über einen userReadings-Eintrag, aber eben _direkt nach "state"_ (mit sehr eingeschränktem trigger; das ganze darf nur reagieren, wenn das "ofline" kommt).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files