ziggs/main.go

116 lines
2.2 KiB
Go
Raw Normal View History

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
}