diff --git a/cmd/setup.go b/cmd/setup.go index 9f3fe21c0..fa5cebd1a 100644 --- a/cmd/setup.go +++ b/cmd/setup.go @@ -90,7 +90,12 @@ func loadConfig(conf config) *core.Site { } func configureSite(conf map[string]interface{}, cp *ConfigProvider, loadPoints []*core.LoadPoint) *core.Site { - return core.NewSiteFromConfig(log, cp, conf, loadPoints) + site, err := core.NewSiteFromConfig(log, cp, conf, loadPoints) + if err != nil { + log.FATAL.Fatal(err) + } + + return site } func configureLoadPoints(conf config, cp *ConfigProvider) (loadPoints []*core.LoadPoint) { @@ -108,7 +113,10 @@ func configureLoadPoints(conf config, cp *ConfigProvider) (loadPoints []*core.Lo for id, lpc := range lpc { log := util.NewLogger("lp-" + strconv.Itoa(id+1)) - lp := core.NewLoadPointFromConfig(log, cp, lpc) + lp, err := core.NewLoadPointFromConfig(log, cp, lpc) + if err != nil { + log.FATAL.Fatal(err) + } loadPoints = append(loadPoints, lp) } diff --git a/core/loadpoint.go b/core/loadpoint.go index c01337d5d..3c17d08e7 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -1,6 +1,7 @@ package core import ( + "errors" "fmt" "math" "sort" @@ -90,10 +91,10 @@ type LoadPoint struct { } // NewLoadPointFromConfig creates a new loadpoint -func NewLoadPointFromConfig(log *util.Logger, cp configProvider, other map[string]interface{}) *LoadPoint { +func NewLoadPointFromConfig(log *util.Logger, cp configProvider, other map[string]interface{}) (*LoadPoint, error) { lp := NewLoadPoint(log) if err := util.DecodeOther(other, &lp); err != nil { - log.FATAL.Fatal(err) + return nil, err } // set sane defaults @@ -118,7 +119,7 @@ func NewLoadPointFromConfig(log *util.Logger, cp configProvider, other map[strin } if lp.ChargerRef == "" { - lp.log.FATAL.Fatal("missing charger") + return nil, errors.New("missing charger") } charger := cp.Charger(lp.ChargerRef) lp.configureChargerType(charger) @@ -135,7 +136,7 @@ func NewLoadPointFromConfig(log *util.Logger, cp configProvider, other map[strin HandlerConfig: lp.HandlerConfig, } - return lp + return lp, nil } // NewLoadPoint creates a LoadPoint with sane defaults diff --git a/core/site.go b/core/site.go index 946120ab5..a82fa0f01 100644 --- a/core/site.go +++ b/core/site.go @@ -1,6 +1,7 @@ package core import ( + "errors" "fmt" "time" @@ -57,10 +58,10 @@ func NewSiteFromConfig( cp configProvider, other map[string]interface{}, loadpoints []*LoadPoint, -) *Site { +) (*Site, error) { site := NewSite() if err := util.DecodeOther(other, &site); err != nil { - log.FATAL.Fatal(err) + return nil, err } Voltage = site.Voltage @@ -68,10 +69,10 @@ func NewSiteFromConfig( // configure meter from references // if site.Meters.PVMeterRef == "" && site.Meters.GridMeterRef == "" { - // site.log.FATAL.Fatal("missing either pv or grid meter") + // nil, errors.New("missing either pv or grid meter") // } if site.Meters.GridMeterRef == "" { - site.log.FATAL.Fatal("missing grid meter") + return nil, errors.New("missing grid meter") } if site.Meters.GridMeterRef != "" { site.gridMeter = cp.Meter(site.Meters.GridMeterRef) @@ -83,7 +84,7 @@ func NewSiteFromConfig( site.batteryMeter = cp.Meter(site.Meters.BatteryMeterRef) } - return site + return site, nil } // NewSite creates a Site with sane defaults diff --git a/meter/modbus.go b/meter/modbus.go index 45c40994b..7153250cb 100644 --- a/meter/modbus.go +++ b/meter/modbus.go @@ -2,6 +2,7 @@ package meter import ( "errors" + "fmt" "github.com/andig/evcc/api" "github.com/andig/evcc/util" @@ -84,14 +85,14 @@ func NewModbusFromConfig(other map[string]interface{}) (api.Meter, error) { } if err := modbus.ParseOperation(device, cc.Power, &m.opPower); err != nil { - log.FATAL.Fatalf("invalid measurement for power: %s", cc.Power) + return nil, fmt.Errorf("invalid measurement for power: %s", cc.Power) } // decorate energy reading var totalEnergy func() (float64, error) if cc.Energy != "" { if err := modbus.ParseOperation(device, cc.Energy, &m.opEnergy); err != nil { - log.FATAL.Fatalf("invalid measurement for energy: %s", cc.Power) + return nil, fmt.Errorf("invalid measurement for energy: %s", cc.Power) } totalEnergy = m.totalEnergy diff --git a/meter/sma.go b/meter/sma.go index ae7ec1970..b6e1db331 100644 --- a/meter/sma.go +++ b/meter/sma.go @@ -67,7 +67,11 @@ func NewSMA(uri, serial, power, energy string) (api.Meter, error) { } if sma.Instance == nil { - sma.Instance = sma.New(log) + instance, err := sma.New(log) + if err != nil { + return nil, err + } + sma.Instance = instance } // we only need to subscribe to one of the two possible identifiers diff --git a/meter/sma/listener.go b/meter/sma/listener.go index aeed317d2..b216ce04a 100644 --- a/meter/sma/listener.go +++ b/meter/sma/listener.go @@ -96,21 +96,21 @@ type Listener struct { } // New creates a Listener -func New(log *util.Logger) *Listener { +func New(log *util.Logger) (*Listener, error) { // Parse the string address gaddr, err := net.ResolveUDPAddr("udp4", multicastAddr) if err != nil { - log.FATAL.Fatalf("error resolving udp address: %s", err) + return nil, fmt.Errorf("error resolving udp address: %s", err) } // Open up a connection conn, err := net.ListenMulticastUDP("udp4", nil, gaddr) if err != nil { - log.FATAL.Fatalf("error opening connecting: %s", err) + return nil, fmt.Errorf("error opening connecting: %s", err) } if err := conn.SetReadBuffer(udpBufferSize); err != nil { - log.FATAL.Fatalf("error setting read buffer: %s", err) + return nil, fmt.Errorf("error setting read buffer: %s", err) } l := &Listener{ @@ -120,7 +120,7 @@ func New(log *util.Logger) *Listener { go l.listen() - return l + return l, nil } // processMessage converts a SMA multicast data package into Telegram diff --git a/provider/modbus.go b/provider/modbus.go index 38274e449..cd398bbe4 100644 --- a/provider/modbus.go +++ b/provider/modbus.go @@ -78,7 +78,7 @@ func NewModbusFromConfig(other map[string]interface{}) (*Modbus, error) { // register configured if cc.Register.Decode != "" { if op.MBMD, err = modbus.RegisterOperation(cc.Register); err != nil { - log.TRACE.Fatal(err) + return nil, err } }