literally had to make these changes before I could turn my hallway light back on :^)
This commit is contained in:
parent
eeea125396
commit
7a33b30802
@ -261,7 +261,7 @@ func getHist() []string {
|
||||
func StartCLI() {
|
||||
log = config.GetLogger()
|
||||
processBridges()
|
||||
grpmap, err := getGroupMap()
|
||||
grpmap, err := ziggy.GetGroupMap()
|
||||
if err != nil {
|
||||
log.Fatal().Err(err).Msg("error getting group map")
|
||||
}
|
||||
|
@ -36,13 +36,10 @@ var bridgeCMD = map[string]reactor{
|
||||
}
|
||||
|
||||
func cmdLights(br *ziggy.Bridge, args []string) error {
|
||||
if len(br.HueLights) == 0 {
|
||||
return errors.New("no lights found")
|
||||
}
|
||||
for _, l := range br.HueLights {
|
||||
log.Info().Str("caller", l.Name).
|
||||
for name, l := range ziggy.GetLightMap() {
|
||||
log.Info().
|
||||
Int("ID", l.ID).Str("type", l.ProductName).
|
||||
Str("model", l.ModelID).Bool("on", l.IsOn()).Msgf("%v", l.State)
|
||||
Str("model", l.ModelID).Bool("on", l.IsOn()).Msgf("[+] %s", name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@ -156,7 +153,8 @@ func cmdSet(bridge *ziggy.Bridge, args []string) error {
|
||||
)
|
||||
|
||||
var (
|
||||
groupmap map[string]*huego.Group
|
||||
groupMap map[string]*huego.Group
|
||||
lightMap map[string]*huego.Light
|
||||
actions []action
|
||||
currentState *huego.State
|
||||
argHead = -1
|
||||
@ -170,9 +168,9 @@ func cmdSet(bridge *ziggy.Bridge, args []string) error {
|
||||
}
|
||||
log.Trace().Int("argHead", argHead).Msg(args[argHead])
|
||||
switch args[argHead] {
|
||||
case "group", "g", "grp":
|
||||
case "group", "g":
|
||||
var err error
|
||||
groupmap, err = getGroupMap()
|
||||
groupMap, err = ziggy.GetGroupMap()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -180,7 +178,7 @@ func cmdSet(bridge *ziggy.Bridge, args []string) error {
|
||||
return errors.New("no group specified")
|
||||
}
|
||||
argHead++
|
||||
g, ok := groupmap[strings.TrimSpace(args[argHead])]
|
||||
g, ok := groupMap[strings.TrimSpace(args[argHead])]
|
||||
if !ok {
|
||||
return fmt.Errorf("group %s not found (argHead: %d)", args[argHead], argHead)
|
||||
}
|
||||
@ -188,6 +186,21 @@ func cmdSet(bridge *ziggy.Bridge, args []string) error {
|
||||
args[argHead], argHead,
|
||||
)
|
||||
target = g
|
||||
case "light", "l":
|
||||
lightMap = ziggy.GetLightMap()
|
||||
if len(args) <= argHead-1 {
|
||||
return errors.New("no light specified")
|
||||
}
|
||||
argHead++
|
||||
l, ok := lightMap[strings.TrimSpace(args[argHead])]
|
||||
if !ok {
|
||||
return fmt.Errorf("light %s not found (argHead: %d)", args[argHead], argHead)
|
||||
}
|
||||
if extraDebug {
|
||||
log.Trace().Str("group", l.Name).Msgf("found light %s via args[%d]",
|
||||
args[argHead], argHead)
|
||||
}
|
||||
target = l
|
||||
case "on":
|
||||
actions = append(actions, target.On)
|
||||
case "off":
|
||||
@ -339,33 +352,8 @@ func cmdSet(bridge *ziggy.Bridge, args []string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func getGroupMap() (map[string]*huego.Group, error) {
|
||||
var groupmap = make(map[string]*huego.Group)
|
||||
for _, br := range ziggy.Lucifer.Bridges {
|
||||
gs, err := br.GetGroups()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, g := range gs {
|
||||
grp, gerr := br.GetGroup(i)
|
||||
if gerr != nil {
|
||||
log.Warn().Msgf("[%s] %w", g.Name, gerr)
|
||||
continue
|
||||
}
|
||||
var count = 1
|
||||
groupName := g.Name
|
||||
for _, ok := groupmap[groupName]; ok; _, ok = groupmap[groupName] {
|
||||
groupName = fmt.Sprintf("%s_%d", g.Name, count)
|
||||
}
|
||||
groupmap[groupName] = grp
|
||||
}
|
||||
|
||||
}
|
||||
return groupmap, nil
|
||||
}
|
||||
|
||||
func cmdGroups(br *ziggy.Bridge, args []string) error {
|
||||
groupmap, err := getGroupMap()
|
||||
groupmap, err := ziggy.GetGroupMap()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -101,9 +101,19 @@ func init() {
|
||||
{Suggest: cli.Suggest{Text: "light", Description: "target light"}},
|
||||
}
|
||||
for _, sug := range suggestions[1] {
|
||||
sug.requires = map[int][]string{0: {"set", "s"}}
|
||||
sug.requires = map[int][]string{0: {"delete", "del", "set", "s"}}
|
||||
sug.root = false
|
||||
}
|
||||
delCompletion := []completion{
|
||||
{Suggest: cli.Suggest{Text: "scene", Description: "target scene"}},
|
||||
{Suggest: cli.Suggest{Text: "schedule", Description: "target schedule"}},
|
||||
{Suggest: cli.Suggest{Text: "sensor", Description: "target sensor"}},
|
||||
}
|
||||
for _, sug := range delCompletion {
|
||||
sug.requires = map[int][]string{0: {"delete", "del"}}
|
||||
sug.root = false
|
||||
}
|
||||
suggestions[1] = append(suggestions[1], delCompletion...)
|
||||
}
|
||||
|
||||
func processGroups(grps map[string]*huego.Group) {
|
||||
@ -119,7 +129,7 @@ func processGroups(grps map[string]*huego.Group) {
|
||||
Description: "Group" + suffix,
|
||||
},
|
||||
requires: map[int][]string{
|
||||
0: {"set", "s"},
|
||||
0: {"set", "s", "delete", "del"},
|
||||
1: {"group", "g"},
|
||||
},
|
||||
root: false,
|
||||
@ -128,7 +138,7 @@ func processGroups(grps map[string]*huego.Group) {
|
||||
}
|
||||
|
||||
func processLights() {
|
||||
for lt, l := range ziggy.Lucifer.Lights {
|
||||
for lt, l := range ziggy.GetLightMap() {
|
||||
suffix := ""
|
||||
if l.Type != "" {
|
||||
suffix = " (" + l.Type + ")"
|
||||
@ -140,7 +150,7 @@ func processLights() {
|
||||
Description: "Light" + suffix,
|
||||
},
|
||||
requires: map[int][]string{
|
||||
0: {"set", "s"},
|
||||
0: {"set", "s", "delete", "del"},
|
||||
1: {"light", "l"},
|
||||
},
|
||||
root: false,
|
||||
|
@ -33,7 +33,7 @@ func cpuLoad(ctx context.Context) (chan int, error) {
|
||||
func CPULoadGradient(ctx context.Context, colors ...string) (chan colorful.Color, error) {
|
||||
grad, err := colorgrad.NewGradient().
|
||||
HtmlColors(colors...).
|
||||
Domain(0, 80).
|
||||
Domain(0, 100).
|
||||
Build()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -44,7 +44,7 @@ var Lucifer = Meta{
|
||||
type Bridge struct {
|
||||
config *config.KnownBridge
|
||||
Info *huego.Config
|
||||
HueLights []*HueLight
|
||||
HueLights []*huego.Light
|
||||
*huego.Bridge
|
||||
*sync.RWMutex
|
||||
}
|
||||
@ -58,18 +58,22 @@ func (c *Bridge) Log() *zerolog.Logger {
|
||||
}
|
||||
|
||||
type HueLight struct {
|
||||
huego.Light
|
||||
l huego.Light
|
||||
controller *Bridge
|
||||
}
|
||||
|
||||
func (hl *HueLight) Log() *zerolog.Logger {
|
||||
l := log.With().
|
||||
Int("caller", hl.ID).
|
||||
Str("name", hl.Name).
|
||||
Bool("on", hl.IsOn()).Logger()
|
||||
Int("caller", hl.l.ID).
|
||||
Str("name", hl.l.Name).
|
||||
Bool("on", hl.l.IsOn()).Logger()
|
||||
return &l
|
||||
}
|
||||
|
||||
func (hl *HueLight) GetPtr() (*huego.Light, error) {
|
||||
return hl.controller.GetLight(hl.l.ID)
|
||||
}
|
||||
|
||||
func getProxiedBridge(cridge *config.KnownBridge) *huego.Bridge {
|
||||
cridge.Proxy = strings.TrimPrefix(cridge.Proxy, "socks5://")
|
||||
newTransport := http.DefaultTransport.(*http.Transport).Clone()
|
||||
@ -125,12 +129,12 @@ const (
|
||||
Toggle
|
||||
)
|
||||
|
||||
type lCall func(light *HueLight) (checkFunc, error)
|
||||
type checkFunc func(light *HueLight) bool
|
||||
type lCall func(light *huego.Light) (checkFunc, error)
|
||||
type checkFunc func(light *huego.Light) bool
|
||||
|
||||
var lightCallbacks = map[ToggleMode]lCall{
|
||||
ToggleOn: func(light *HueLight) (checkFunc, error) {
|
||||
return func(light *HueLight) bool {
|
||||
ToggleOn: func(light *huego.Light) (checkFunc, error) {
|
||||
return func(light *huego.Light) bool {
|
||||
light.State = &huego.State{
|
||||
On: true,
|
||||
Bri: 100,
|
||||
@ -144,8 +148,8 @@ var lightCallbacks = map[ToggleMode]lCall{
|
||||
},
|
||||
light.On()
|
||||
},
|
||||
ToggleOff: func(light *HueLight) (checkFunc, error) {
|
||||
return func(light *HueLight) bool {
|
||||
ToggleOff: func(light *huego.Light) (checkFunc, error) {
|
||||
return func(light *huego.Light) bool {
|
||||
light.State = &huego.State{
|
||||
On: false,
|
||||
Bri: 100,
|
||||
@ -159,8 +163,8 @@ var lightCallbacks = map[ToggleMode]lCall{
|
||||
},
|
||||
light.Off()
|
||||
},
|
||||
/* ToggleDim: func(light *HueLight) (checkFunc, error) {
|
||||
return func(light *HueLight) bool {
|
||||
/* ToggleDim: func(light *huego.Light) (checkFunc, error) {
|
||||
return func(light *huego.Light) bool {
|
||||
if !light.IsOn() {
|
||||
return false
|
||||
}
|
||||
@ -168,8 +172,8 @@ var lightCallbacks = map[ToggleMode]lCall{
|
||||
},
|
||||
light.On()
|
||||
},*/
|
||||
ToggleRainbow: func(light *HueLight) (checkFunc, error) {
|
||||
return func(light *HueLight) bool {
|
||||
ToggleRainbow: func(light *huego.Light) (checkFunc, error) {
|
||||
return func(light *huego.Light) bool {
|
||||
if !light.IsOn() {
|
||||
return false
|
||||
}
|
||||
@ -179,12 +183,17 @@ var lightCallbacks = map[ToggleMode]lCall{
|
||||
},
|
||||
}
|
||||
|
||||
func Assert(ctx context.Context, l *HueLight, mode ToggleMode) error {
|
||||
func Assert(ctx context.Context, l *huego.Light, mode ToggleMode) error {
|
||||
act, ok := lightCallbacks[mode]
|
||||
if !ok {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
/* l, err := lo.GetPtr()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*/
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
@ -203,13 +212,13 @@ func Assert(ctx context.Context, l *HueLight, mode ToggleMode) error {
|
||||
}
|
||||
}
|
||||
|
||||
func toggle(l *HueLight, mode ToggleMode) error {
|
||||
on := func(l *HueLight) error {
|
||||
l.Log().Trace().Msg("turning light on...")
|
||||
func toggle(l *huego.Light, mode ToggleMode) error {
|
||||
on := func(l *huego.Light) error {
|
||||
log.Trace().Msg("turning light on...")
|
||||
return l.On()
|
||||
}
|
||||
off := func(l *HueLight) error {
|
||||
l.Log().Trace().Msg("turning light off...")
|
||||
off := func(l *huego.Light) error {
|
||||
log.Trace().Msg("turning light off...")
|
||||
return l.Off()
|
||||
}
|
||||
var err error
|
||||
@ -230,11 +239,11 @@ func toggle(l *HueLight, mode ToggleMode) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func ToggleLights(Lights []*HueLight, mode ToggleMode) {
|
||||
func ToggleLights(Lights []*huego.Light, mode ToggleMode) {
|
||||
for _, l := range Lights {
|
||||
err := toggle(l, mode)
|
||||
if err != nil {
|
||||
l.Log().Error().Err(err).Bool("On", l.IsOn()).Msg("failed to toggle light")
|
||||
log.Error().Err(err).Bool("On", l.IsOn()).Msg("failed to toggle light")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -250,19 +259,19 @@ func (c *Bridge) getLights() error {
|
||||
c.Log().Info().Msgf("Found %d lights", len(l))
|
||||
for _, light := range l {
|
||||
newlight := &HueLight{
|
||||
Light: light,
|
||||
l: light,
|
||||
controller: c,
|
||||
}
|
||||
newlight.Log().Trace().Msg("+")
|
||||
c.HueLights = append(c.HueLights, newlight)
|
||||
log.Trace().Interface("new light", newlight.l).Msg("+")
|
||||
c.HueLights = append(c.HueLights, &newlight.l)
|
||||
Lucifer.Lock()
|
||||
Lucifer.Lights[light.UniqueID] = newlight
|
||||
Lucifer.Lights[light.Name] = newlight
|
||||
Lucifer.Unlock()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Bridge) Lights() []*HueLight {
|
||||
func (c *Bridge) Lights() []*huego.Light {
|
||||
if len(c.HueLights) > 0 {
|
||||
return c.HueLights
|
||||
}
|
||||
|
@ -1,7 +1,51 @@
|
||||
package ziggy
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/amimof/huego"
|
||||
)
|
||||
|
||||
// Multiplex is all of the lights (all of the lights).
|
||||
// I'll see myself out.
|
||||
type Multiplex struct {
|
||||
bridges []*Bridge
|
||||
}
|
||||
|
||||
func GetGroupMap() (map[string]*huego.Group, error) {
|
||||
var groupmap = make(map[string]*huego.Group)
|
||||
for _, br := range Lucifer.Bridges {
|
||||
gs, err := br.GetGroups()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, g := range gs {
|
||||
grp, gerr := br.GetGroup(i)
|
||||
if gerr != nil {
|
||||
log.Warn().Msgf("[%s] %w", g.Name, gerr)
|
||||
continue
|
||||
}
|
||||
var count = 1
|
||||
groupName := g.Name
|
||||
for _, ok := groupmap[groupName]; ok; _, ok = groupmap[groupName] {
|
||||
groupName = fmt.Sprintf("%s_%d", g.Name, count)
|
||||
}
|
||||
groupmap[groupName] = grp
|
||||
}
|
||||
|
||||
}
|
||||
return groupmap, nil
|
||||
}
|
||||
|
||||
func GetLightMap() map[string]*huego.Light {
|
||||
var lightMap = make(map[string]*huego.Light)
|
||||
for _, l := range Lucifer.Lights {
|
||||
realLight, err := l.GetPtr()
|
||||
if err != nil {
|
||||
l.Log().Warn().Err(err).Msg("failed to get light pointer")
|
||||
continue
|
||||
}
|
||||
lightMap[realLight.Name] = realLight
|
||||
}
|
||||
return lightMap
|
||||
}
|
||||
|
6
main.go
6
main.go
@ -32,9 +32,9 @@ func init() {
|
||||
|
||||
func TurnAll(Known []*ziggy.Bridge, mode ziggy.ToggleMode) {
|
||||
for _, bridge := range Known {
|
||||
for _, l := range bridge.HueLights {
|
||||
go func(l *ziggy.HueLight) {
|
||||
l.Log().Debug().
|
||||
for _, l := range ziggy.GetLightMap() {
|
||||
go func(l *huego.Light) {
|
||||
log.Debug().
|
||||
Str("caller", bridge.Host).
|
||||
Str("type", l.ProductName).
|
||||
Bool("on", l.IsOn()).Msg(l.ModelID)
|
||||
|
Loading…
Reference in New Issue
Block a user