132 lines
2.4 KiB
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)
|
|
//}
|
|
}
|
|
|
|
}
|