From c50304bbcdd180a1429020e3f71d84294bca63c2 Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Thu, 7 Sep 2023 11:27:56 -0700 Subject: [PATCH] Update discovery, go mod, and make a simple commandline control --- cmd/huecmd/main.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ discovery/main.go | 38 +++++++++++++++------ go.mod | 12 +++++++ go.sum | 22 ++++++++++++ main.go | 4 +-- 5 files changed, 162 insertions(+), 12 deletions(-) create mode 100644 cmd/huecmd/main.go create mode 100644 go.mod create mode 100644 go.sum diff --git a/cmd/huecmd/main.go b/cmd/huecmd/main.go new file mode 100644 index 0000000..2f3f025 --- /dev/null +++ b/cmd/huecmd/main.go @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "log" + "strconv" + + "git.barakmich.com/barak/hue/discovery" + "github.com/amimof/huego" + "github.com/spf13/pflag" +) + +var ( + group = pflag.String("group", "", "Select a light group") + light = pflag.String("light", "", "Select an individual light") + listAllScenes = pflag.Bool("list-all-scenes", false, "List all scenes") + listScenes = pflag.Bool("list-scenes", false, "List all scenes") + scene = pflag.String("scene", "", "Set a scene") +) + +func main() { + pflag.Parse() + bridge, err := discovery.DiscoverAndConnectFromConfig("barak-hue-test") + if err != nil { + log.Fatalln("Couldn't connect to hue bridge:", err) + } + if *listAllScenes { + scenes, _ := bridge.GetScenes() + fmt.Println(scenes[0].Group) + return + } + if *group != "" { + err := groupMain(bridge) + if err != nil { + log.Fatalln(err) + } else { + return + } + } + if *light != "" { + err := lightMain(bridge) + if err != nil { + log.Fatalln(err) + } else { + return + } + } + log.Fatalln("Need to specify at least one of --group or --light") +} + +func groupMain(bridge *huego.Bridge) error { + groups, err := bridge.GetGroups() + if err != nil { + return err + } + var g huego.Group + found := false + for _, x := range groups { + if x.Name == *group { + found = true + g = x + break + } + } + if !found { + return fmt.Errorf("Couldn't find group named \"%s\"", *group) + } + switch { + case *listScenes: + scenes, err := bridge.GetScenes() + if err != nil { + return err + } + for _, s := range scenes { + if s.Group == strconv.Itoa(g.ID) { + fmt.Println(s.Name) + } + } + case *scene != "": + scenes, err := bridge.GetScenes() + if err != nil { + return err + } + for _, s := range scenes { + if s.Group == strconv.Itoa(g.ID) { + if s.Name == *scene { + return g.Scene(s.ID) + } + } + } + + } + return nil +} + +func lightMain(bridge *huego.Bridge) error { + return nil +} diff --git a/discovery/main.go b/discovery/main.go index a66782e..f1a26a3 100644 --- a/discovery/main.go +++ b/discovery/main.go @@ -6,13 +6,16 @@ import ( "os" "os/user" "path/filepath" + "time" "github.com/amimof/huego" ) // UserInfo is the saved data struture of a Hue app connection type UserInfo struct { - User string + User string `json:",omitempty"` + LastSync time.Time `json:",omitempty"` + LastIP *huego.Bridge `json:",omitempty"` } func DiscoverAndConnectFromConfig(appName string) (*huego.Bridge, error) { @@ -40,14 +43,27 @@ func DiscoverAndConnectFromConfig(appName string) (*huego.Bridge, error) { if !ok { ui = UserInfo{} } + + if ui.LastIP != nil && ui.LastSync.After(time.Now().Add(-(time.Hour * 24 * 30))) { + newb := ui.LastIP.Login(ui.User) + return newb, nil + } + b, err := huego.Discover() if err != nil { return nil, err } if ui.User != "" { + data[appName] = UserInfo{ + User: ui.User, + LastSync: time.Now(), + LastIP: b, + } + err := saveData(data, filename) newb := b.Login(ui.User) - return newb, nil + return newb, err } + fmt.Println("Please press the Hue Bridge button, then press Enter") fmt.Scanln() user, err := b.CreateUser(appName) @@ -57,18 +73,20 @@ func DiscoverAndConnectFromConfig(appName string) (*huego.Bridge, error) { data[appName] = UserInfo{User: user} b = b.Login(user) - - f, err := os.Create(filename) - defer f.Close() - if err != nil { - return nil, err - } - err = json.NewEncoder(f).Encode(data) + err = saveData(data, filename) return b, err } +func saveData(data map[string]UserInfo, filename string) error { + f, err := os.Create(filename) + defer f.Close() + if err != nil { + return err + } + return json.NewEncoder(f).Encode(data) +} + func main() { - fmt.Println("vim-go") b, err := DiscoverAndConnectFromConfig("barak-hue-test") if err != nil { panic(err) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1297e39 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module git.barakmich.com/barak/hue + +go 1.17 + +require ( + github.com/amimof/huego v1.2.0 + github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e + github.com/lucasb-eyer/go-colorful v1.2.0 + github.com/maruel/temperature v1.0.0 +) + +require github.com/spf13/pflag v1.0.5 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..843e585 --- /dev/null +++ b/go.sum @@ -0,0 +1,22 @@ +github.com/amimof/huego v1.2.0 h1:hdJontFo4YKKumKlc/+fXFHQeON0bWqmiHds7JhNfvs= +github.com/amimof/huego v1.2.0/go.mod h1:z1Sy7Rrdzmb+XsGHVEhODrRJRDq4RCFW7trCI5cKmeA= +github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e h1:wSQCJiig/QkoUnpvelSPbLiZNWvh2yMqQTQvIQqSUkU= +github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e/go.mod h1:5G2EjwzgZUPnnReoKvPWVneT8APYbyKkihDVAHUi0II= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA= +github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/maruel/temperature v1.0.0 h1:78FX+YkXHH7iBSNcZBqRW3TN6gLOHlhYvjqvdP/aQ5Q= +github.com/maruel/temperature v1.0.0/go.mod h1:vIWWv/2SYBsJV65/FQAidxWQly41yYLUTaTzGDJEQWc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go index d89abb3..161d5c2 100644 --- a/main.go +++ b/main.go @@ -131,7 +131,7 @@ func main() { var all huego.Group found := false for _, x := range groups { - if x.Name == "All Colors" { + if x.Name == "Dining Room" { found = true all = x break @@ -150,5 +150,5 @@ func main() { panic(err) } } - runChristmas(lightaddr) + runSnowAmbiance(lightaddr) }