evcc-io/cmd/vehicle.go

129 lines
3.1 KiB
Go

package cmd
import (
"strconv"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util/config"
"github.com/spf13/cobra"
)
// vehicleCmd represents the vehicle command
var vehicleCmd = &cobra.Command{
Use: "vehicle [name]",
Short: "Query configured vehicles",
Args: cobra.MaximumNArgs(1),
Run: runVehicle,
}
func init() {
rootCmd.AddCommand(vehicleCmd)
vehicleCmd.Flags().Int64P(flagCurrent, "i", 0, flagCurrentDescription)
vehicleCmd.Flags().BoolP(flagStart, "a", false, flagStartDescription)
vehicleCmd.Flags().BoolP(flagStop, "o", false, flagStopDescription)
vehicleCmd.Flags().BoolP(flagWakeup, "w", false, flagWakeupDescription)
vehicleCmd.Flags().Bool(flagDiagnose, false, flagDiagnoseDescription)
vehicleCmd.Flags().Bool(flagCloud, false, flagCloudDescription)
}
func runVehicle(cmd *cobra.Command, args []string) {
// load config
if err := loadConfigFile(&conf, !cmd.Flag(flagIgnoreDatabase).Changed); err != nil {
fatal(err)
}
// setup environment
if err := configureEnvironment(cmd, &conf); err != nil {
fatal(err)
}
// use cloud
if cmd.Flags().Lookup(flagCloud).Changed {
for _, conf := range conf.Vehicles {
conf.Other["cloud"] = "true"
}
}
if err := configureVehicles(conf.Vehicles, args...); err != nil {
fatal(err)
}
vehicles := config.Vehicles().Devices()
var flagUsed bool
for _, v := range config.Instances(vehicles) {
if flag := cmd.Flags().Lookup(flagCurrent); flag.Changed {
flagUsed = true
f, err := strconv.ParseFloat(flag.Value.String(), 64)
if err != nil {
log.ERROR.Println("max current:", err)
} else {
if vv, ok := v.(api.ChargerEx); ok {
if err := vv.MaxCurrentMillis(f); err != nil {
log.ERROR.Println("max current:", err)
}
} else if vv, ok := v.(api.CurrentController); ok {
if err := vv.MaxCurrent(int64(f)); err != nil {
log.ERROR.Println("max current:", err)
}
} else {
log.ERROR.Println("max current: not implemented")
}
}
}
if cmd.Flags().Lookup(flagWakeup).Changed {
flagUsed = true
if vv, ok := v.(api.Resurrector); ok {
if err := vv.WakeUp(); err != nil {
log.ERROR.Println("wakeup:", err)
}
} else {
log.ERROR.Println("wakeup: not implemented")
}
}
if cmd.Flags().Lookup(flagStart).Changed {
flagUsed = true
if vv, ok := v.(api.ChargeController); ok {
if err := vv.ChargeEnable(true); err != nil {
log.ERROR.Println("start charge:", err)
}
} else {
log.ERROR.Println("start charge: not implemented")
}
}
if cmd.Flags().Lookup(flagStop).Changed {
flagUsed = true
if vv, ok := v.(api.ChargeController); ok {
if err := vv.ChargeEnable(false); err != nil {
log.ERROR.Println("stop charge:", err)
}
} else {
log.ERROR.Println("stop charge: not implemented")
}
}
}
if !flagUsed {
d := dumper{len: len(vehicles)}
flag := cmd.Flags().Lookup(flagDiagnose).Changed
for _, dev := range vehicles {
v := dev.Instance()
d.DumpWithHeader(dev.Config().Name, v)
if flag {
d.DumpDiagnosis(v)
}
}
}
// wait for shutdown
<-shutdownDoneC()
}