From e767cf0fbcb700fd2216654e5b2ede92279c6e5e Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 4 Jan 2021 14:41:45 +0100 Subject: [PATCH] Switch into demo mode when config file not available --- cmd/charger.go | 5 ++- cmd/demo.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/dump.go | 5 ++- cmd/meter.go | 5 ++- cmd/root.go | 7 ++++- cmd/setup.go | 6 ++-- cmd/vehicle.go | 5 ++- 7 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 cmd/demo.go diff --git a/cmd/charger.go b/cmd/charger.go index 9a8594be2..0a86ef50a 100644 --- a/cmd/charger.go +++ b/cmd/charger.go @@ -24,7 +24,10 @@ func runCharger(cmd *cobra.Command, args []string) { log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit) // load config - conf := loadConfigFile(cfgFile) + conf, err := loadConfigFile(cfgFile) + if err != nil { + log.FATAL.Fatal(err) + } // setup mqtt if conf.Mqtt.Broker != "" { diff --git a/cmd/demo.go b/cmd/demo.go new file mode 100644 index 000000000..29e09d44e --- /dev/null +++ b/cmd/demo.go @@ -0,0 +1,84 @@ +package cmd + +import ( + "github.com/spf13/viper" + "gopkg.in/yaml.v3" +) + +const demoYaml = ` +log: info + +meters: +- name: grid + type: default + power: + type: js + script: "1200" +- name: pv + type: default + power: + type: js + script: "6400" +- name: battery + type: default + power: + type: js + script: "200" + soc: + type: js + script: "30" + +chargers: +- name: demo + type: default + enable: + type: js + script: "true" + enabled: + type: js + script: "true" + status: + type: js + script: "'B'" + maxcurrent: + type: js + script: "6" + +vehicles: +- name: demo + title: e-Golf + type: default + charge: + type: js + script: "63" + +site: + title: Demo + meters: + grid: grid + pv: pv + battery: battery + +loadpoints: +- title: Carport + charger: demo + vehicle: demo +` + +func demoConfig() (conf config) { + demo := map[string]interface{}{} + + if err := yaml.Unmarshal([]byte(demoYaml), &demo); err != nil { + log.FATAL.Fatalf("failed decoding demo config: %+v", err) + } + + for k, v := range demo { + viper.Set(k, v) + } + + if err := viper.UnmarshalExact(&conf); err != nil { + log.FATAL.Fatalf("failed loading demo config: %v", err) + } + + return conf +} diff --git a/cmd/dump.go b/cmd/dump.go index 0ec76bc31..45c481fa3 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -26,7 +26,10 @@ func runDump(cmd *cobra.Command, args []string) { log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit) // load config - conf := loadConfigFile(cfgFile) + conf, err := loadConfigFile(cfgFile) + if err != nil { + log.FATAL.Fatal(err) + } // setup mqtt if conf.Mqtt.Broker != "" { diff --git a/cmd/meter.go b/cmd/meter.go index d8d7f2a5b..73c67d5eb 100644 --- a/cmd/meter.go +++ b/cmd/meter.go @@ -24,7 +24,10 @@ func runMeter(cmd *cobra.Command, args []string) { log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit) // load config - conf := loadConfigFile(cfgFile) + conf, err := loadConfigFile(cfgFile) + if err != nil { + log.FATAL.Fatal(err) + } // setup mqtt if conf.Mqtt.Broker != "" { diff --git a/cmd/root.go b/cmd/root.go index 9c3a74fb3..4f7c2c79e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -142,7 +142,12 @@ func run(cmd *cobra.Command, args []string) { log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit) // load config and re-configure logging after reading config file - conf := loadConfigFile(cfgFile) + conf, err := loadConfigFile(cfgFile) + if err != nil { + log.ERROR.Println("missing evcc config - switching into demo mode") + conf = demoConfig() + } + util.LogLevel(viper.GetString("log"), viper.GetStringMapString("levels")) uri := viper.GetString("uri") diff --git a/cmd/setup.go b/cmd/setup.go index 9060fbbfd..9d3a3f5c4 100644 --- a/cmd/setup.go +++ b/cmd/setup.go @@ -131,15 +131,15 @@ func configureLoadPoints(conf config, cp *ConfigProvider) (loadPoints []*core.Lo return loadPoints, nil } -func loadConfigFile(cfgFile string) (conf config) { +func loadConfigFile(cfgFile string) (conf config, err error) { if cfgFile != "" { log.INFO.Println("using config file", cfgFile) if err := viper.UnmarshalExact(&conf); err != nil { log.FATAL.Fatalf("failed parsing config file %s: %v", cfgFile, err) } } else { - log.FATAL.Fatal("missing evcc config") + err = errors.New("missing evcc config") } - return conf + return conf, err } diff --git a/cmd/vehicle.go b/cmd/vehicle.go index 5c07f6da4..d9d00b90a 100644 --- a/cmd/vehicle.go +++ b/cmd/vehicle.go @@ -24,7 +24,10 @@ func runVehicle(cmd *cobra.Command, args []string) { log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit) // load config - conf := loadConfigFile(cfgFile) + conf, err := loadConfigFile(cfgFile) + if err != nil { + log.FATAL.Fatal(err) + } // setup mqtt if conf.Mqtt.Broker != "" {