diff options
-rw-r--r-- | colortemp.go | 27 | ||||
-rw-r--r-- | main.go | 82 |
2 files changed, 57 insertions, 52 deletions
diff --git a/colortemp.go b/colortemp.go index d621043..051ca54 100644 --- a/colortemp.go +++ b/colortemp.go @@ -1,7 +1,10 @@ package main import ( + "math" "time" + + hue "github.com/benburwell/gohue" ) type ColorTemperature uint @@ -9,3 +12,27 @@ type ColorTemperature uint func getDesiredColorTemperature(at time.Time) ColorTemperature { return 1800 } + +// Translate a desired color temperature in Kelvins to a value comprehensible +// by a Hue luminaire. According to Hue documentation, the value 153 +// corresponds to 6500K, and 500 corresponds to 2000K. Using these known +// values, we'll create a mapping between spaces, and additionally limit the +// resulting value by the range that the luminaire supports. +// +// 153 <=> 6500K +// 500 <=> 2000K +// ============= +// 347 4500 +func translateCtForLight(ct ColorTemperature, light hue.Light) uint16 { + divisor := 12.968 + scaled := float64(ct) / divisor + inverted := 500 - scaled + 153 + min := float64(light.Capabilities.Control.CT.Min) + max := float64(light.Capabilities.Control.CT.Max) + return uint16(math.Max(min, math.Min(max, inverted))) +} + +// Determine whether there is a non-zero color temperature range for the given light +func supportsColorTemp(l hue.Light) bool { + return l.Capabilities.Control.CT.Max > l.Capabilities.Control.CT.Min +} @@ -2,7 +2,6 @@ package main import ( "log" - "math" "os" "time" @@ -17,60 +16,39 @@ func main() { log.Fatalf("Error finding bridges: %s\n", err.Error()) } log.Printf("Found %d bridge(s)\n", len(bridges)) + desiredColorTemp := getDesiredColorTemperature(time.Now()) for _, bridge := range bridges { log.Printf("Bridge: %s\n", bridge.IPAddress) - //username, err := bridge.CreateUser(username) - //if err != nil { - // panic("Could not create user on bridge") - //} - //fmt.Printf("Made user %s for bridge %s\n", username, bridge.IPAddress) - err = bridge.Login(os.Getenv("HUE_LOGIN")) - if err != nil { - log.Fatalf("Could not log in to bridge: %s", err.Error()) - } - log.Println("Logged in to bridge") - lights, err := bridge.GetAllLights() - if err != nil { - log.Fatalf("Error getting lights: %s\n", err.Error()) - } - log.Printf("Found %d lights\n", len(lights)) - for _, light := range lights { - log.Printf("Light %d: %s (%s)\n", light.Index, light.Name, light.Type) - if supportsColorTemp(light) { - log.Printf(" CT range: %d-%d\n", light.Capabilities.Control.CT.Min, light.Capabilities.Control.CT.Max) - if light.Index == 8 { - newCt := translateCtForLight(getDesiredColorTemperature(time.Now()), light) - log.Printf(" Setting CT to %d\n", newCt) - light.SetState(hue.LightState{ - On: light.State.On, - CT: newCt, - }) - } - } - } + updateBridge(bridge, desiredColorTemp) } } -// Determine whether there is a non-zero color temperature range for the given light -func supportsColorTemp(l hue.Light) bool { - return l.Capabilities.Control.CT.Max > l.Capabilities.Control.CT.Min -} - -// Translate a desired color temperature in Kelvins to a value comprehensible -// by a Hue luminaire. According to Hue documentation, the value 153 -// corresponds to 6500K, and 500 corresponds to 2000K. Using these known -// values, we'll create a mapping between spaces, and additionally limit the -// resulting value by the range that the luminaire supports. -// -// 153 <=> 6500K -// 500 <=> 2000K -// ============= -// 347 4500 -func translateCtForLight(ct ColorTemperature, light hue.Light) uint16 { - divisor := 12.968 - scaled := float64(ct) / divisor - inverted := 500 - scaled + 153 - min := float64(light.Capabilities.Control.CT.Min) - max := float64(light.Capabilities.Control.CT.Max) - return uint16(math.Max(min, math.Min(max, inverted))) +func updateBridge(bridge hue.Bridge, desiredColorTemp ColorTemperature) { + //username, err := bridge.CreateUser(username) + //if err != nil { + // panic("Could not create user on bridge") + //} + //fmt.Printf("Made user %s for bridge %s\n", username, bridge.IPAddress) + err := bridge.Login(os.Getenv("HUE_LOGIN")) + if err != nil { + log.Fatalf("Could not log in to bridge: %s", err.Error()) + } + log.Println("Logged in to bridge") + lights, err := bridge.GetAllLights() + if err != nil { + log.Fatalf("Error getting lights: %s\n", err.Error()) + } + log.Printf("Found %d lights\n", len(lights)) + for _, light := range lights { + log.Printf("Light %d: %s (%s)\n", light.Index, light.Name, light.Type) + if supportsColorTemp(light) { + log.Printf(" CT range: %d-%d\n", light.Capabilities.Control.CT.Min, light.Capabilities.Control.CT.Max) + newCt := translateCtForLight(desiredColorTemp, light) + log.Printf(" Setting CT to %d\n", newCt) + light.SetState(hue.LightState{ + On: light.State.On, + CT: newCt, + }) + } + } } |