package discovery import ( "encoding/json" "fmt" "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 `json:",omitempty"` LastSync time.Time `json:",omitempty"` LastIP *huego.Bridge `json:",omitempty"` } func DiscoverAndConnectFromConfig(appName string) (*huego.Bridge, error) { data := make(map[string]UserInfo) u, err := user.Current() if err != nil { return nil, err } filename := filepath.Join(u.HomeDir, ".config/hue-barak") _, err = os.Stat(filename) if err == nil { f, err := os.Open(filename) if err != nil { return nil, err } err = json.NewDecoder(f).Decode(&data) if err != nil { return nil, err } f.Close() } ui, ok := data[appName] 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, err } fmt.Println("Please press the Hue Bridge button, then press Enter") fmt.Scanln() user, err := b.CreateUser(appName) if err != nil { return nil, err } data[appName] = UserInfo{User: user} b = b.Login(user) 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() { b, err := DiscoverAndConnectFromConfig("barak-hue-test") if err != nil { panic(err) } rules, err := b.GetRules() if err != nil { panic(err) } for i, r := range rules { fmt.Println(i, r.ID, r.Name) //for _, act := range r.Actions { //fmt.Printf("\t%#v\n", act) //} } testRule := huego.Rule{Actions: rules[0].Actions} t, _ := json.Marshal(testRule) fmt.Println(string(t)) l, err := b.GetGroups() if err != nil { panic(err) } for i, r := range l { fmt.Println(i, r.ID, r.Name, r.IsOn()) //for _, s := range r.Lights { //fmt.Printf("\t%s\n", s) //} } s, err := b.GetSensors() if err != nil { panic(err) } for i, r := range s { fmt.Println(i, r.ID, r.Name) //for _, s := range r.Lights { //fmt.Printf("\t%s\n", s) //} } }