diff --git a/xaal.go b/xaal.go index 83dd7f0c021e88e443287c726becc3a10accd598..6828b6a07340f1311b6e96921d7f1524b4ca92d8 100644 --- a/xaal.go +++ b/xaal.go @@ -5,7 +5,6 @@ import ( "log/slog" "math" - "github.com/davecgh/go-spew/spew" "github.com/lucasb-eyer/go-colorful" "gitlab.imt-atlantique.fr/xaal/code/go/core/schemas" "gitlab.imt-atlantique.fr/xaal/code/go/core/uuid" @@ -242,7 +241,7 @@ func NewLamp(addr uuid.UUID, zDev *Z2MDevice, expose *Expose) XAALDeviceInterfac dev.AddMethod("set_brightness", dev.setBrightness) } if expose.GetFeature("color_temp") != nil { - // All bulb w/ color temp are dimmer + dev.DevType = "lamp.dimmer" dev.AddAttribute("white_temperature", 0) dev.AddMethod("set_white_temperature", dev.setWhiteTemperature) } @@ -254,11 +253,18 @@ func NewLamp(addr uuid.UUID, zDev *Z2MDevice, expose *Expose) XAALDeviceInterfac dev.AddMethod("set_hsv", dev.setHSV) dev.AddMethod("set_mode", dev.setMode) } - dev.setup(zDev) return dev } +func (dev *Lamp) getMode() string { + mode := dev.GetAttribute("mode") + if mode != nil { + return mode.Value.(string) + } + return "white" +} + func (dev *Lamp) update(payload map[string]interface{}) { // state state, exists := payload["state"].(string) @@ -271,12 +277,8 @@ func (dev *Lamp) update(payload map[string]interface{}) { light.SetValue(false) } } - // brightness - brightness, exists := payload["brightness"].(float64) - if exists { - brightness = brightness / 255 * 100 - dev.GetAttribute("brightness").SetValue(int(brightness)) - } + + // color_mode color_mode, exists := payload["color_mode"].(string) if exists { mode := dev.GetAttribute("mode") @@ -291,26 +293,39 @@ func (dev *Lamp) update(payload map[string]interface{}) { } } - // color - color, exists := payload["color"].(map[string]interface{}) + // brightness + brightness, exists := payload["brightness"].(float64) if exists { - x, _ := color["x"].(float64) - y, _ := color["y"].(float64) - brigthness, _ := payload["brightness"].(float64) - value := xyToColor(x, y, brigthness) - slog.Warn("color", "color", value.Hex(), "x", x, "y", y, "tmp", brigthness) - hue, sat, val := value.Hsv() - hue = roundToDecimal(hue, 1) - sat = roundToDecimal(sat, 3) - val = roundToDecimal(val, 3) - dev.GetAttribute("hsv").SetValue([]float64{hue, sat, val}) + brightness = brightness / 255 * 100 + dev.GetAttribute("brightness").SetValue(int(brightness)) } + // color_temp - color_temp, exists := payload["color_temp"].(float64) - if exists { - // Mired = 1,000,000 / Temperature in Kelvin - color_temp = 1000000 / color_temp - dev.GetAttribute("white_temperature").SetValue(int(color_temp)) + if dev.getMode() == "white" { + // color_temp change when we are in color mode (looks like a z2m bug) + color_temp, exists := payload["color_temp"].(float64) + if exists { + // Mired = 1,000,000 / Temperature in Kelvin + color_temp = 1000000 / color_temp + dev.GetAttribute("white_temperature").SetValue(int(color_temp)) + } + } + + // colors + if dev.getMode() == "color" { + color, exists := payload["color"].(map[string]interface{}) + if exists { + x, _ := color["x"].(float64) + y, _ := color["y"].(float64) + brigthness, _ := payload["brightness"].(float64) + value := xyToColor(x, y, brigthness) + slog.Debug("color", "color", value.Hex(), "x", x, "y", y, "tmp", brigthness) + hue, sat, val := value.Hsv() + hue = roundToDecimal(hue, 1) + sat = roundToDecimal(sat, 3) + val = roundToDecimal(val, 3) + dev.GetAttribute("hsv").SetValue([]float64{hue, sat, val}) + } } } @@ -361,7 +376,28 @@ func (dev *Lamp) setHSV(body xaal.MessageBody) *xaal.MessageBody { } func (dev *Lamp) setMode(body xaal.MessageBody) *xaal.MessageBody { - spew.Dump(body) + value, exist := body["mode"].(string) + if exist { + // for a unknown reason, we are unable to set the color_mode + // z2m doesn't give an error, but the color_mode doesn't change + // so we set old color or temperature + switch value { + case "color": + // dev.Z2MDevice.Set(`{"color_mode": "xy"}`) + hsv := dev.GetAttribute("hsv").Value.([]float64) + color := colorful.Hsv(hsv[0], hsv[1], hsv[2]) + dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex())) + case "white": + // dev.Z2MDevice.Set(`{"color_mode": "color_temp"}`) + value := dev.GetAttribute("white_temperature").Value.(int) + // if booted in color mode, while_temperature is 0 => divide crash + if value == 0 { + value = 3000 + } + value = 1000000 / value + dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, value)) + } + } return nil }