hue/discovery/main.go

132 lines
2.4 KiB
Go

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)
//}
}
}