aboutsummaryrefslogtreecommitdiff
path: root/light.go
diff options
context:
space:
mode:
Diffstat (limited to 'light.go')
-rw-r--r--light.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/light.go b/light.go
new file mode 100644
index 0000000..7c0fda2
--- /dev/null
+++ b/light.go
@@ -0,0 +1,88 @@
+package hue
+
+import (
+ "fmt"
+ "os"
+ "net/http"
+ "io/ioutil"
+ "encoding/json"
+ "strings"
+ "errors"
+)
+
+type Light struct {
+ State struct {
+ On bool `json:"on"`
+ Bri int `json:"bri"`
+ hue int `json:"hue"`
+ sat int `json:"sat"`
+ effect string `json:"effect"`
+ xy []string `json:"xy"` // TODO: what is this?
+ ct int `json:"ct"` // TODO: what is this?
+ alert string `json:"alert"`
+ colormode string `json:"colormode"`
+ reachable bool `json:"reachable"`
+ } `json:"state"`
+ Type string `json:"type"`
+ Name string `json:"name"`
+ ModelID string `json:"modelid"`
+ ManufacturerName string `json:"manufacturername"`
+ UniqueID string `json:"uniqueid"`
+ SWVersion string `json:"swversion"`
+}
+
+
+
+//http://192.168.1.128/api/319b36233bd2328f3e40731b23479207/lights/
+
+// GetAllLights retreives the state of all lights that the bridge is aware of.
+func GetAllLights(bridge *Bridge) []Light {
+ // Loop through all light indicies to see if they exist
+ // and parse their values. Supports 100 lights.
+ var lights []Light
+ for index := 1; index < 101; index++ {
+ response, err := http.Get(
+ fmt.Sprintf("http://%s/api/%s/lights/%d", bridge.IPAddress, bridge.Username, index))
+ if err != nil {
+ trace("", err)
+ os.Exit(1)
+ } else if response.StatusCode != 200 {
+ trace(fmt.Sprintf("Bridge status error %d", response.StatusCode), nil)
+ os.Exit(1)
+ }
+
+ // Read the response
+ body, err := ioutil.ReadAll(response.Body)
+ defer response.Body.Close()
+ if err != nil {
+ trace("", err)
+ os.Exit(1)
+ }
+ if strings.Contains(string(body), "not available") {
+ // Handle end of searchable lights
+ fmt.Printf("\n\n%d lights found.\n\n", index)
+ break
+ }
+
+ // Parse and load the response into the light array
+ data := Light{}
+ err = json.Unmarshal(body, &data)
+ if err != nil {
+ trace("", err)
+ os.Exit(1)
+ }
+ lights = append(lights, data)
+ }
+ return lights
+}
+
+// GetLight will return a light struct containing data on a given name.
+func GetLight(bridge *Bridge, name string) (Light, error) {
+ lights := GetAllLights(bridge)
+ for index := 0; index < len(lights); index++ {
+ if lights[index].Name == name {
+ return lights[index], nil
+ }
+ }
+ return Light{}, errors.New("Light not found.")
+}