Feat: dump n' load
This commit is contained in:
parent
6ad6e08664
commit
a85f4f692d
@ -2,12 +2,15 @@ package cli
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/amimof/huego"
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
|
||||||
"git.tcp.direct/kayos/ziggs/internal/ziggy"
|
"git.tcp.direct/kayos/ziggs/internal/ziggy"
|
||||||
@ -177,7 +180,7 @@ func cmdDelete(br *ziggy.Bridge, args []string) error {
|
|||||||
return strings.ToLower(input) == "y"
|
return strings.ToLower(input) == "y"
|
||||||
}
|
}
|
||||||
switch args[0] {
|
switch args[0] {
|
||||||
case "light":
|
case "light", "l":
|
||||||
t, err := br.FindLight(args[1])
|
t, err := br.FindLight(args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -185,7 +188,7 @@ func cmdDelete(br *ziggy.Bridge, args []string) error {
|
|||||||
if confirm() {
|
if confirm() {
|
||||||
return br.DeleteLight(t.ID)
|
return br.DeleteLight(t.ID)
|
||||||
}
|
}
|
||||||
case "group":
|
case "group", "g":
|
||||||
t, err := br.FindGroup(args[1])
|
t, err := br.FindGroup(args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -250,6 +253,98 @@ func cmdRename(br *ziggy.Bridge, args []string) error {
|
|||||||
return target.Rename(args[2])
|
return target.Rename(args[2])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cmdDump exports a target object to a JSON file
|
||||||
|
func cmdDump(br *ziggy.Bridge, args []string) error {
|
||||||
|
if len(args) < 2 && args[0] != "all" {
|
||||||
|
return errors.New("not enough arguments")
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
target interface{}
|
||||||
|
name string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
switch args[0] {
|
||||||
|
case "light", "l":
|
||||||
|
target, err = br.FindLight(args[1])
|
||||||
|
name = target.(*huego.Light).Name
|
||||||
|
case "group", "g":
|
||||||
|
target, err = br.FindGroup(args[1])
|
||||||
|
name = target.(*huego.Group).Name
|
||||||
|
case "schedule":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
case "rule":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
case "sensor":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
case "bridge", "all":
|
||||||
|
target = br
|
||||||
|
name = br.Info.Name
|
||||||
|
default:
|
||||||
|
return errors.New("invalid target type")
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if js, err := json.Marshal(target); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
return os.WriteFile(name, js, 0o666)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// cmdLoad imports a target JSON object and attempts to apply it to an existing object
|
||||||
|
func cmdLoad(br *ziggy.Bridge, args []string) error {
|
||||||
|
if len(args) < 1 {
|
||||||
|
return errors.New("not enough arguments")
|
||||||
|
}
|
||||||
|
js, err := os.ReadFile(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch args[0] {
|
||||||
|
case "light", "l":
|
||||||
|
target, err := br.FindLight(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var l *huego.Light
|
||||||
|
if err := json.Unmarshal(js, &l); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if resp, err := br.UpdateLight(target.ID, *l); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
log.Info().Msgf("%v", resp)
|
||||||
|
}
|
||||||
|
case "group", "g":
|
||||||
|
target, err := br.FindGroup(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var g *huego.Group
|
||||||
|
if err := json.Unmarshal(js, &g); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if resp, err := br.UpdateGroup(target.ID, *g); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
log.Info().Msgf("%v", resp)
|
||||||
|
}
|
||||||
|
case "schedule":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
case "rule":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
case "sensor":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
case "bridge":
|
||||||
|
return errors.New("not implemented")
|
||||||
|
default:
|
||||||
|
return errors.New("invalid target type")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func cmdAdopt(br *ziggy.Bridge, args []string) error {
|
func cmdAdopt(br *ziggy.Bridge, args []string) error {
|
||||||
resp, err := br.FindLights()
|
resp, err := br.FindLights()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -80,6 +80,8 @@ func init() {
|
|||||||
Commands["scan"] = newZiggsCommand(cmdScan, "scan for bridges/lights/sensors", "search", "find")
|
Commands["scan"] = newZiggsCommand(cmdScan, "scan for bridges/lights/sensors", "search", "find")
|
||||||
Commands["rename"] = newZiggsCommand(cmdRename, "rename object in bridge", "mv")
|
Commands["rename"] = newZiggsCommand(cmdRename, "rename object in bridge", "mv")
|
||||||
Commands["adopt"] = newZiggsCommand(cmdAdopt, "adopt new lights to the bridge")
|
Commands["adopt"] = newZiggsCommand(cmdAdopt, "adopt new lights to the bridge")
|
||||||
|
Commands["dump"] = newZiggsCommand(cmdDump, "dump target object JSON to a file")
|
||||||
|
Commands["load"] = newZiggsCommand(cmdLoad, "load JSON from a file into the bridge")
|
||||||
Commands["set"] = newZiggsCommand(cmdSet, "update object properties in bridge", "update")
|
Commands["set"] = newZiggsCommand(cmdSet, "update object properties in bridge", "update")
|
||||||
initCompletion()
|
initCompletion()
|
||||||
}
|
}
|
||||||
@ -97,6 +99,10 @@ func initCompletion() {
|
|||||||
{Suggest: cli.Suggest{Text: "create"}, inner: Commands["create"]},
|
{Suggest: cli.Suggest{Text: "create"}, inner: Commands["create"]},
|
||||||
{Suggest: cli.Suggest{Text: "delete"}, inner: Commands["delete"]},
|
{Suggest: cli.Suggest{Text: "delete"}, inner: Commands["delete"]},
|
||||||
{Suggest: cli.Suggest{Text: "scan"}, inner: Commands["scan"]},
|
{Suggest: cli.Suggest{Text: "scan"}, inner: Commands["scan"]},
|
||||||
|
{Suggest: cli.Suggest{Text: "rename"}, inner: Commands["rename"]},
|
||||||
|
{Suggest: cli.Suggest{Text: "adopt"}, inner: Commands["adopt"]},
|
||||||
|
{Suggest: cli.Suggest{Text: "dump"}, inner: Commands["dump"]},
|
||||||
|
{Suggest: cli.Suggest{Text: "load"}, inner: Commands["load"]},
|
||||||
{Suggest: cli.Suggest{Text: "use", Description: "select bridge to perform actions on"}},
|
{Suggest: cli.Suggest{Text: "use", Description: "select bridge to perform actions on"}},
|
||||||
{Suggest: cli.Suggest{Text: "clear", Description: "clear screen"}},
|
{Suggest: cli.Suggest{Text: "clear", Description: "clear screen"}},
|
||||||
{Suggest: cli.Suggest{Text: "exit", Description: "exit ziggs"}},
|
{Suggest: cli.Suggest{Text: "exit", Description: "exit ziggs"}},
|
||||||
@ -125,7 +131,7 @@ func initCompletion() {
|
|||||||
{Suggest: cli.Suggest{Text: "light", Description: "target light"}},
|
{Suggest: cli.Suggest{Text: "light", Description: "target light"}},
|
||||||
}
|
}
|
||||||
for _, sug := range suggestions[1] {
|
for _, sug := range suggestions[1] {
|
||||||
sug.requires = map[int][]string{0: {"delete", "del", "set", "s"}}
|
sug.requires = map[int][]string{0: {"delete", "del", "set", "s", "rename", "mv", "dump", "load"}}
|
||||||
sug.root = false
|
sug.root = false
|
||||||
}
|
}
|
||||||
delCompletion := []*completion{
|
delCompletion := []*completion{
|
||||||
|
@ -42,7 +42,6 @@ type Bridge struct {
|
|||||||
config *config.KnownBridge
|
config *config.KnownBridge
|
||||||
Info *huego.Config
|
Info *huego.Config
|
||||||
log *zerolog.Logger
|
log *zerolog.Logger
|
||||||
debuglog *zerolog.Logger
|
|
||||||
HueLights []*huego.Light
|
HueLights []*huego.Light
|
||||||
*huego.Bridge
|
*huego.Bridge
|
||||||
*sync.RWMutex
|
*sync.RWMutex
|
||||||
|
Loading…
Reference in New Issue
Block a user