ziggs/main.go

193 lines
4.1 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"
"fmt"
2023-01-15 12:56:04 +00:00
"io"
2022-02-17 20:41:13 +00:00
"os"
2023-01-15 12:56:04 +00:00
"strings"
2022-02-17 20:41:13 +00:00
"time"
2022-02-13 00:31:19 +00:00
2023-01-15 12:56:04 +00:00
"git.tcp.direct/kayos/common/squish"
"github.com/amimof/huego"
"github.com/manifoldco/promptui"
2022-02-16 14:10:25 +00:00
"github.com/rs/zerolog"
2022-09-26 15:25:21 +00:00
"git.tcp.direct/kayos/ziggs/internal/cli"
2022-07-29 10:44:08 +00:00
"git.tcp.direct/kayos/ziggs/internal/common"
2023-01-15 12:56:04 +00:00
"git.tcp.direct/kayos/ziggs/internal/config"
2022-07-31 08:23:26 +00:00
"git.tcp.direct/kayos/ziggs/internal/data"
2022-07-29 10:44:08 +00:00
"git.tcp.direct/kayos/ziggs/internal/ziggy"
2022-02-16 14:10:25 +00:00
)
var (
log *zerolog.Logger
2022-02-13 00:31:19 +00:00
)
const banner = "H4sIAAAAAAACA5OONja2NjHIfTSl59GUBjCaIB1tkAvCCtLIkmtwyjRQLmOQyyUdbYnukhmoeg2NwSyYsiagoDmIqYCkDFkSQ8caShROwe5oqGaYPHZXg2W34JZqoIYU0DkAuowN3c4BAAA="
2023-01-15 12:56:04 +00:00
2022-02-17 20:41:13 +00:00
func init() {
2023-01-15 12:56:04 +00:00
bnr, _ := squish.UnpackStr(banner)
_, _ = io.Copy(os.Stdout, strings.NewReader(bnr))
compileTime, Version := common.Version()
if Version == "" {
Version = "DEVEL"
}
if compileTime == "" {
compileTime = time.Now().Format(time.RFC3339)
}
config.Init()
log = config.StartLogger()
log.Trace().Msg("Logger started")
2023-01-15 12:59:05 +00:00
index := len(Version)
if len(Version) > 18 {
index = 18
}
log.Info().Str("version", Version[:index]).Send()
log.Info().Str("built", compileTime).Send()
2022-03-04 05:36:52 +00:00
if len(os.Args) < 1 {
return
}
2022-02-13 00:31:19 +00:00
}
2022-07-09 00:09:49 +00:00
func TurnAll(Known []*ziggy.Bridge, mode ziggy.ToggleMode) {
2022-02-17 20:41:13 +00:00
for _, bridge := range Known {
for _, l := range ziggy.GetLightMap() {
go func(l *ziggy.HueLight) {
log.Debug().
2022-02-17 20:41:13 +00:00
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))
2022-09-26 15:25:21 +00:00
err := ziggy.Assert(ctx, l, mode)
if err != nil {
log.Error().Err(err).Msg("failed to assert state")
}
2022-02-17 20:41:13 +00:00
defer cancel()
}(l)
}
2022-02-13 00:31:19 +00:00
}
}
2022-07-09 00:09:49 +00:00
func FindLights(ctx context.Context, c *ziggy.Bridge) error {
2022-02-17 20:41:13 +00:00
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-07-09 00:09:49 +00:00
func getNewSensors(known *ziggy.Bridge) {
2022-07-08 12:37:21 +00:00
go known.FindSensors()
Sensors, err := known.GetNewSensors()
if err != nil {
log.Fatal().Err(err).Msg("failed to get sensors")
}
if Sensors == nil {
log.Fatal().Caller(1).Msg("nil")
}
for len(Sensors.Sensors) < 1 {
2022-07-08 12:37:21 +00:00
Sensors, err = known.GetNewSensors()
if err != nil {
log.Error().Err(err).Msg("")
}
time.Sleep(2 * time.Second)
}
go log.Debug().Interface("sensors", Sensors).Msg("")
selSensor(Sensors.Sensors)
}
func selSensor(Sensors []*huego.Sensor) huego.Sensor {
p := promptui.Select{
Label: "Sensors",
Items: Sensors,
CursorPos: 0,
HideHelp: false,
HideSelected: false,
2022-07-09 00:09:49 +00:00
Pointer: common.ZiggsPointer,
}
i, s, e := p.Run()
if e != nil {
log.Error().Err(e).Msg("")
}
fmt.Printf("\nselected [%d] %s\n", i, s)
return *Sensors[i]
}
2022-02-17 20:41:13 +00:00
func main() {
2022-07-09 00:09:49 +00:00
var Known []*ziggy.Bridge
2022-03-04 05:36:52 +00:00
var err error
2022-07-09 00:09:49 +00:00
Known, err = ziggy.Setup()
2022-02-16 14:10:25 +00:00
2022-03-04 05:36:52 +00:00
if err != nil {
log.Fatal().Err(err).Msg("failed to get bridges")
2022-02-16 14:10:25 +00:00
}
2022-07-31 08:23:26 +00:00
data.Start()
defer data.Close()
2022-09-26 17:10:17 +00:00
if len(os.Args) < 2 {
cli.StartCLI()
}
2022-02-17 20:41:13 +00:00
for _, arg := range os.Args {
switch arg {
2022-03-04 05:36:52 +00:00
case "discover":
2022-02-17 20:41:13 +00:00
case "on":
log.Debug().Msg("turning all " + arg)
2022-07-09 00:09:49 +00:00
TurnAll(Known, ziggy.ToggleOn)
2022-02-17 20:41:13 +00:00
case "off":
log.Debug().Msg("turning all " + arg)
2022-07-09 00:09:49 +00:00
TurnAll(Known, ziggy.ToggleOff)
2022-02-17 20:41:13 +00:00
case "rainbow":
log.Debug().Msg("turning all " + arg)
2022-07-09 00:09:49 +00:00
TurnAll(Known, ziggy.ToggleRainbow)
2022-02-17 20:41:13 +00:00
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
}
case "shell":
2022-09-26 15:25:21 +00:00
cli.StartCLI()
case "newsensor":
getNewSensors(Known[0])
case "sensors":
sens, err := Known[0].GetSensors()
if err != nil {
2022-09-26 15:25:21 +00:00
log.Fatal().Err(err).Msg("-")
}
var sensptr []*huego.Sensor
for _, s := range sens {
sensptr = append(sensptr, &s)
}
selSensor(sensptr)
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
}