2022-02-13 00:31:19 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2022-02-16 14:10:25 +00:00
|
|
|
"context"
|
2022-02-17 20:41:13 +00:00
|
|
|
"os"
|
|
|
|
"time"
|
2022-02-13 00:31:19 +00:00
|
|
|
|
2022-02-16 14:10:25 +00:00
|
|
|
"github.com/rs/zerolog"
|
|
|
|
|
|
|
|
"git.tcp.direct/kayos/ziggs/config"
|
2022-02-17 20:41:13 +00:00
|
|
|
"git.tcp.direct/kayos/ziggs/interactive"
|
|
|
|
"git.tcp.direct/kayos/ziggs/lights"
|
2022-02-16 14:10:25 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
log *zerolog.Logger
|
2022-02-13 00:31:19 +00:00
|
|
|
)
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
func init() {
|
|
|
|
config.Init()
|
|
|
|
log = config.StartLogger()
|
|
|
|
log.Info().Msg("Logger started")
|
2022-02-13 00:31:19 +00:00
|
|
|
}
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
func TurnAll(Known []*lights.Controller, mode lights.ToggleMode) {
|
|
|
|
for _, bridge := range Known {
|
|
|
|
for _, l := range bridge.HueLights {
|
|
|
|
go func(l *lights.HueLight) {
|
|
|
|
l.Log().Debug().
|
|
|
|
Str("caller", bridge.Host).
|
|
|
|
Str("type", l.ProductName).
|
|
|
|
Bool("on", l.IsOn()).Msg(l.ModelID)
|
|
|
|
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
|
|
|
|
lights.Assert(ctx, l, mode)
|
|
|
|
defer cancel()
|
|
|
|
}(l)
|
|
|
|
}
|
2022-02-13 00:31:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
func AggressiveStart() (Known []*lights.Controller) {
|
|
|
|
for {
|
|
|
|
Known, err := lights.Setup()
|
2022-02-16 14:10:25 +00:00
|
|
|
if err != nil {
|
2022-02-17 20:41:13 +00:00
|
|
|
log.Warn().Int("count", len(Known)).
|
|
|
|
Msgf("%s", err.Error())
|
2022-02-16 14:10:25 +00:00
|
|
|
continue
|
|
|
|
}
|
2022-02-17 20:41:13 +00:00
|
|
|
if len(Known) > 0 {
|
|
|
|
return Known
|
|
|
|
}
|
2022-02-13 00:31:19 +00:00
|
|
|
}
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
func FindLights(ctx context.Context, c *lights.Controller) error {
|
|
|
|
log.Trace().Msg("looking for lights...")
|
|
|
|
resp, err := c.FindLights()
|
|
|
|
if err != nil {
|
|
|
|
c.Log().Fatal().Err(err).Msg("FUBAR")
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
2022-02-17 20:41:13 +00:00
|
|
|
for str, inter := range resp.Success {
|
|
|
|
c.Log().Trace().Interface(str, inter).Msg(" ")
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
2022-02-17 20:41:13 +00:00
|
|
|
var count = 0
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-ctx.Done():
|
|
|
|
return context.Canceled
|
|
|
|
default:
|
|
|
|
ls, err := c.GetLights()
|
|
|
|
if err != nil {
|
|
|
|
c.Log().Warn().Err(err).Msg(" ")
|
|
|
|
}
|
|
|
|
if len(ls) > count {
|
|
|
|
count = len(ls)
|
|
|
|
return nil
|
|
|
|
}
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
func main() {
|
|
|
|
Known := AggressiveStart()
|
2022-02-16 14:10:25 +00:00
|
|
|
|
|
|
|
if len(Known) == 0 {
|
2022-02-17 20:41:13 +00:00
|
|
|
panic("")
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
for _, arg := range os.Args {
|
|
|
|
switch arg {
|
|
|
|
case "on":
|
|
|
|
log.Debug().Msg("turning all " + arg)
|
|
|
|
TurnAll(Known, lights.ToggleOn)
|
|
|
|
case "off":
|
|
|
|
log.Debug().Msg("turning all " + arg)
|
|
|
|
TurnAll(Known, lights.ToggleOff)
|
|
|
|
case "rainbow":
|
|
|
|
log.Debug().Msg("turning all " + arg)
|
|
|
|
TurnAll(Known, lights.ToggleRainbow)
|
|
|
|
case "scan":
|
|
|
|
log.Debug().Msg("executing " + arg)
|
|
|
|
if len(os.Args) < 2 {
|
|
|
|
for _, k := range Known {
|
|
|
|
ctx := context.TODO()
|
|
|
|
FindLights(ctx, k)
|
|
|
|
}
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
2022-02-17 20:41:13 +00:00
|
|
|
default:
|
|
|
|
interactive.StartCLI(Known)
|
2022-02-16 14:10:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-17 20:41:13 +00:00
|
|
|
done := make(chan struct{}, 1)
|
|
|
|
<-done
|
2022-02-13 00:31:19 +00:00
|
|
|
}
|