func ToggleLight(light common.Light) { power, _ := light.GetPower() light.SetPower(!power) }
func GetHKLight(light common.Light) *HKLight { hkLight, found := lights[light.ID()] if found { return hkLight } label, _ := light.GetLabel() log.Printf("[INFO] Creating New HKLight for %s", label) info := model.Info{ Name: label, Manufacturer: "LIFX", } lightBulb := accessory.NewLightBulb(info) power, _ := light.GetPower() lightBulb.SetOn(power) color, _ := light.GetColor() hue, saturation, brightness := ConvertLIFXColor(color) lightBulb.SetBrightness(int(brightness)) lightBulb.SetSaturation(saturation) lightBulb.SetHue(hue) transport, err := hap.NewIPTransport(pin, lightBulb.Accessory) if err != nil { log.Fatal(err) } go func() { transport.Start() }() hkLight = &HKLight{lightBulb.Accessory, nil, transport, lightBulb} lights[light.ID()] = hkLight lightBulb.OnIdentify(func() { timeout := 1 * time.Second for i := 0; i < 4; i++ { ToggleLight(light) time.Sleep(timeout) } }) lightBulb.OnStateChanged(func(power bool) { log.Printf("[INFO] Changed State for %s", label) light.SetPower(power) }) updateColor := func(light common.Light) { // HAP: [0...360] // LIFX: [0...MAX_UINT16] hue := lightBulb.GetHue() // HAP: [0...100] // LIFX: [0...MAX_UINT16] saturation := lightBulb.GetSaturation() // HAP: [0...100] // LIFX: [0...MAX_UINT16] brightness := lightBulb.GetBrightness() // [HSBKKelvinMin..HSBKKelvinMax] kelvin := HSBKKelvinDefault lifxHue := math.MaxUint16 * float64(hue) / float64(characteristic.MaxHue) lifxSaturation := math.MaxUint16 * float64(saturation) / float64(characteristic.MaxSaturation) lifxBrightness := math.MaxUint16 * float64(brightness) / float64(characteristic.MaxBrightness) color := common.Color{ uint16(lifxHue), uint16(lifxSaturation), uint16(lifxBrightness), kelvin, } light.SetColor(color, 500*time.Millisecond) } lightBulb.OnHueChanged(func(value float64) { log.Printf("[INFO] Changed Hue for %s to %d", label, value) updateColor(light) }) lightBulb.OnSaturationChanged(func(value float64) { log.Printf("[INFO] Changed Saturation for %s to %d", label, value) updateColor(light) }) lightBulb.OnBrightnessChanged(func(value int) { log.Printf("[INFO] Changed Brightness for %s to %d", label, value) updateColor(light) }) return hkLight }
func toggleLight(light common.Light) { turnedOn, _ := light.GetPower() light.SetPower(!turnedOn) }
func handleNewLight(light common.Light) (err error) { id := light.ID() _, exists := lights[id] if exists { log.Debugf("A light with the ID '%s' has already been added", id) return nil } subscription, err := light.NewSubscription() if err != nil { log.WithField(`error`, err).Error(`Subscribing to light events`) return err } label, _ := light.GetLabel() log.Infof("Adding light [%s]", label) info := model.Info{ Name: label, Manufacturer: "LIFX", } haLight := accessory.NewLightBulb(info) lights[id] = lightMeta{ light: light, subscription: subscription, haLight: haLight, } // Get the initial state of the light and communicate it via HomeKit updateHaPowerState(light, haLight) updateHaColors(light, haLight) events := subscription.Events() go func() { for { select { case event := <-events: switch event := event.(type) { case common.EventUpdateColor: log.Infof("Light: %s, Event: Update Color", id) updateHaColors(light, haLight) case common.EventUpdateLabel: // TODO: Find out how to update the name of a homekit device log.Infof("Light: %s, Event: Update Label", id) case common.EventUpdatePower: log.Infof("Light: %s, Event: Update Power", id) updateHaPowerState(light, haLight) default: log.Debugf("Unhandled event on light: %+v", event) continue } } } }() haLight.OnIdentify(func() { timeout := 1 * time.Second for i := 0; i < 4; i++ { toggleLight(light) time.Sleep(timeout) } }) haLight.OnStateChanged(func(on bool) { go func() { light.SetPower(on) }() }) haLight.OnBrightnessChanged(func(value int) { go func() { updateLightColors(light, haLight) }() }) haLight.OnSaturationChanged(func(value float64) { go func() { updateLightColors(light, haLight) }() }) haLight.OnHueChanged(func(value float64) { go func() { updateLightColors(light, haLight) }() }) transport, err := hap.NewIPTransport(pin, haLight.Accessory) if err != nil { log.Fatal(err) } go func() { transport.Start() }() return nil }
func GetHKLight(light common.Light) *HKLight { hkLight, found := lights[light.ID()] if found { return hkLight } label, _ := light.GetLabel() log.Debug.Printf("Creating New HKLight for %s", label) info := accessory.Info{ Name: label, Manufacturer: "LIFX", } acc := accessory.NewLightbulb(info) power, _ := light.GetPower() acc.Lightbulb.On.SetValue(power) color, _ := light.GetColor() hue, saturation, brightness := ConvertLIFXColor(color) acc.Lightbulb.Brightness.SetValue(int(brightness)) acc.Lightbulb.Saturation.SetValue(saturation) acc.Lightbulb.Hue.SetValue(hue) config := hc.Config{Pin: pin} transport, err := hc.NewIPTransport(config, acc.Accessory) if err != nil { log.Info.Panic(err) } go func() { transport.Start() }() hkLight = &HKLight{acc, transport, nil} lights[light.ID()] = hkLight acc.OnIdentify(func() { timeout := 1 * time.Second for i := 0; i < 4; i++ { ToggleLight(light) time.Sleep(timeout) } }) acc.Lightbulb.On.OnValueRemoteUpdate(func(power bool) { log.Debug.Printf("Changed State for %s", label) light.SetPowerDuration(power, transitionDuration) }) updateColor := func(light common.Light) { currentPower, _ := light.GetPower() // HAP: [0...360] // LIFX: [0...MAX_UINT16] hue := acc.Lightbulb.Hue.GetValue() // HAP: [0...100] // LIFX: [0...MAX_UINT16] saturation := acc.Lightbulb.Saturation.GetValue() // HAP: [0...100] // LIFX: [0...MAX_UINT16] brightness := acc.Lightbulb.Brightness.GetValue() // [HSBKKelvinMin..HSBKKelvinMax] kelvin := HSBKKelvinDefault lifxHue := math.MaxUint16 * float64(hue) / float64(HueMax) lifxSaturation := math.MaxUint16 * float64(saturation) / float64(SaturationMax) lifxBrightness := math.MaxUint16 * float64(brightness) / float64(BrightnessMax) color := common.Color{ uint16(lifxHue), uint16(lifxSaturation), uint16(lifxBrightness), kelvin, } light.SetColor(color, transitionDuration) if brightness > 0 && !currentPower { log.Debug.Printf("Color changed for %s, turning on power.", label) light.SetPowerDuration(true, transitionDuration) } else if brightness == 0 && currentPower { log.Debug.Printf("Color changed for %s, but brightness = 0 turning off power.", label) light.SetPower(false) } } acc.Lightbulb.Hue.OnValueRemoteUpdate(func(value float64) { log.Debug.Printf("Changed Hue for %s to %f", label, value) updateColor(light) }) acc.Lightbulb.Saturation.OnValueRemoteUpdate(func(value float64) { log.Debug.Printf("Changed Saturation for %s to %f", label, value) updateColor(light) }) acc.Lightbulb.Brightness.OnValueRemoteUpdate(func(value int) { log.Debug.Printf("Changed Brightness for %s to %d", label, value) updateColor(light) }) return hkLight }