From 210d0d7ce2bce7b08019e3416fc335849db47263 Mon Sep 17 00:00:00 2001 From: andig Date: Wed, 5 May 2021 21:42:33 +0200 Subject: [PATCH] Rename default plugin and plugin type key (#927) --- README.md | 56 ++++++++++++++++---------------- go.mod | 4 +-- go.sum | 10 +++--- internal/charger/charger.go | 12 ++++--- internal/charger/config.go | 2 +- internal/charger/nrgble_linux.go | 24 +++++++------- internal/const.go | 4 +++ internal/meter/config.go | 2 +- internal/meter/meter.go | 6 ++-- internal/vehicle/config.go | 2 +- internal/vehicle/id/provider.go | 2 +- internal/vehicle/vehicle.go | 6 ++-- provider/config.go | 38 ++++++++++++++-------- 13 files changed, 92 insertions(+), 76 deletions(-) create mode 100644 internal/const.go diff --git a/README.md b/README.md index 5805a648d..936c67d6c 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ EVCC is an extensible EV Charge Controller with PV integration implemented in [G - simple and clean user interface - multiple [chargers](#charger): - Wallbe, Phoenix (includes ESL Walli), go-eCharger, NRGkick (direct Bluetooth or via Connect device), SimpleEVSE, EVSEWifi, KEBA/BMW, openWB, Mobile Charger Connect and any other charger using scripting - - Smart-Home outlets: FritzDECT, Tasmota, TP-Link + - Smart-Home outlets: FritzDECT, Tasmota, TP-Link - multiple [meters](#meter): ModBus (Eastron SDM, MPM3PM, SBC ALE3 and many more), Discovergy (using HTTP plugin), SMA Sunny Home Manager and Energy Meter, KOSTAL Smart Energy Meter (KSEM, EMxx), any Sunspec-compatible inverter or home battery devices (Fronius, SMA, SolarEdge, KOSTAL, STECA, E3DC, ...), Tesla PowerWall - wide support of vendor-specific [vehicles](#vehicle) interfaces (remote charge, battery and preconditioning status): Audi, BMW, Ford, Hyundai, Kia, Nissan, Niu, Porsche, Renault, Seat, Skoda, Tesla, Volkswagen, Volvo and any other connected vehicle using scripting - [plugins](#plugins) for integrating with hardware devices and home automation: Modbus (meters and grid inverters), HTTP, MQTT, Javascript, WebSockets and shell scripts @@ -168,7 +168,7 @@ In general, due to the minimum value of 5% for signalling the EV duty cycle, the ### Charger -Charger is responsible for handling EV state and adjusting charge current. +Charger is responsible for handling EV state and adjusting charge current. Available charger implementations are: - `evsewifi`: chargers with SimpleEVSE controllers using [EVSE-WiFi](https://www.evse-wifi.de/) @@ -184,7 +184,7 @@ Available charger implementations are: - `simpleevse`: chargers with SimpleEVSE controllers connected via ModBus (e.g. OpenWB Wallbox, Easy Wallbox B163, ...) - `wallbe`: Wallbe Eco chargers (see [Preparation](#wallbe-preparation-)). For older Wallbe boxes (pre 2019) with Phoenix EV-CC-AC1-M3-CBC-RCM-ETH controllers make sure to set `legacy: true` to enable correct current configuration. - `warp`: Tinkerforge Warp/ Warp Pro charger -- `default`: default charger implementation using configurable [plugins](#plugins) for integrating any type of charger +- `custom`: default charger implementation using configurable [plugins](#plugins) for integrating any type of charger Smart-Home outlet charger implementations: - `fritzdect`: Fritz!DECT 200/210 outlets @@ -235,7 +235,7 @@ Available meter implementations are: - `openwb`: OpenWB meters. Use `usage` to choose meter type: `grid`/`pv`/`battery`. - `sma`: SMA Home Manager 2.0 and SMA Energy Meter. Power reading is configured out of the box but can be customized if necessary. To obtain specific energy readings define the desired Obis code (Import Energy: "1:1.8.0", Export Energy: "1:2.8.0"). - `tesla`: Tesla PowerWall meter. Use `usage` to choose meter type: `grid`/`pv`/`battery`. -- `default`: default meter implementation where meter readings- `power`, `energy`, per-phase `currents` and battery `soc` are configured using [plugins](#plugins) +- `custom`: default meter implementation where meter readings- `power`, `energy`, per-phase `currents` and battery `soc` are configured using [plugins](#plugins) Configuration examples are documented at [andig/evcc-config#meters](https://github.com/andig/evcc-config#meters) @@ -261,7 +261,7 @@ Available vehicle remote interface implementations are: - `vw`: Volkswagen (eGolf, eUp) - `id`: Volkswagen (ID.3, ID.4) - `volvo`: Volvo -- `default`: default vehicle implementation using configurable [plugins](#plugins) for integrating any type of vehicle +- `custom`: default vehicle implementation using configurable [plugins](#plugins) for integrating any type of vehicle Configuration examples are documented at [andig/evcc-config#vehicles](https://github.com/andig/evcc-config#vehicles) @@ -281,7 +281,7 @@ to the left makes **Min+PV** behave as described above. Pushing completely to th ## Plugins -Plugins are used to integrate various devices and external data sources with EVCC. Plugins can be used in combination with a `default` type meter, charger or vehicle. +Plugins are used to integrate various devices and external data sources with EVCC. Plugins can be used in combination with a `custom` type meter, charger or vehicle. Plugins support both _read_ and _write_ access. When using plugins for _write_ access, the actual data is provided as variable in form of `${var[:format]}`. If `format` is omitted, data is formatted according to the default Go `%v` [format](https://golang.org/pkg/fmt/). The variable is replaced with the actual data before the plugin is executed. @@ -296,7 +296,7 @@ The meter configuration consists of the actual physical connection and the value If the device is physically connected using an RS485 adapter, `device` and serial configuration `baudrate`, `comset` must be specified: ```yaml -type: modbus +source: modbus device: /dev/ttyUSB0 baudrate: 9600 comset: "8N1" @@ -305,7 +305,7 @@ comset: "8N1" If the device is a grid inverter or a Modbus meter connected via TCP, `uri` must be specified: ```yaml -type: modbus +source: modbus uri: 192.168.0.11:502 id: 1 # modbus slave id ``` @@ -313,7 +313,7 @@ id: 1 # modbus slave id If the device is a Modbus RTU device connected using an RS485/Ethernet adapter, set `rtu: true`. The serial configuration must be done directly on the adapter. Example: ```yaml -type: modbus +source: modbus uri: 192.168.0.10:502 id: 3 # modbus slave id rtu: true @@ -321,10 +321,10 @@ rtu: true #### Logical connection -The meter device type `meter` and the device's slave id `id` are always required: +The device's type `model` and the device's slave id `id` are always required: ```yaml -type: ... +source: modbus uri/device/id: ... model: sdm value: Power @@ -357,11 +357,11 @@ In case of SunSpec-compatible inverters, values can also be configured in the fo If the Modbus device is not supported by MBMD, the Modbus register can also be manually configured: ```yaml -type: ... +source: modbus uri/device/id: ... register: address: 40070 - type: holding # holding or input + source: holding # holding or input decode: int32 # int16|32|64, uint16|32|64, float32|64 and u|int32s + float32s scale: -1 # floating point factor applied to result, e.g. for kW to W conversion ``` @@ -377,7 +377,7 @@ The `mqtt` plugin allows to read values from MQTT topics. This is particularly u Sample configuration: ```yaml -type: mqtt +source: mqtt topic: mbmd/sdm1-1/Power timeout: 30s # don't accept values older than timeout scale: 0.001 # floating point factor applied to result, e.g. for Wh to kWh conversion @@ -386,7 +386,7 @@ scale: 0.001 # floating point factor applied to result, e.g. for Wh to kWh conve Sample write configuration: ```yaml -type: mqtt +source: mqtt topic: mbmd/charger/maxcurrent payload: ${var:%d} ``` @@ -400,7 +400,7 @@ The `http` plugin executes HTTP requests to read or update data. Includes the ab Sample read configuration: ```yaml -type: http +source: http uri: https://volkszaehler/api/data/.json?from=now method: GET # default HTTP method headers: @@ -428,7 +428,7 @@ The `websocket` plugin implements a web socket listener. Includes the ability to Sample configuration (read only): ```yaml -type: http +source: http uri: ws:///socket jq: .data | select(.uuid=="") .tuples[0][1] # parse message json scale: 0.001 # floating point factor applied to result, e.g. for Wh to kWh conversion @@ -440,7 +440,7 @@ timeout: 30s # error if no update received in 30 seconds EVCC includes a bundled Javascript interpreter with Underscore.js library installed. The `js` plugin is able to execute Javascript code from the `script` tag. Useful for quick prototyping: ```yaml -type: js +source: js script: | var res = 500; 2 * res; // returns 1000 @@ -450,9 +450,9 @@ When using the `js` plugin for writing, the value to write is handed to the scri ```yaml charger: -- type: generic +- type: custom maxcurrent: - type: js + source: js script: | console.log(maxcurrent); ``` @@ -464,7 +464,7 @@ The `script` plugin executes external scripts to read or update data. This plugi Sample read configuration: ```yaml -type: script +source: script cmd: /bin/bash -c "cat /dev/urandom" timeout: 5s ``` @@ -472,7 +472,7 @@ timeout: 5s Sample write configuration: ```yaml -type: script +source: script cmd: /home/user/my-script.sh ${enable:%b} # format boolean enable as 0/1 timeout: 5s ``` @@ -482,11 +482,11 @@ timeout: 5s The `calc` plugin allows calculating the sum of other plugins: ```yaml -type: calc +source: calc add: -- type: ... +- source: ... ... -- type: ... +- source: ... ... ``` @@ -499,12 +499,12 @@ The `combined` status plugin is used to convert a mixed boolean status of plugge Sample configuration (read only): ```yaml -type: combined +source: combined plugged: - type: mqtt + source: mqtt topic: openWB/lp/1/boolPlugStat charging: - type: mqtt + source: mqtt topic: openWB/lp/1/boolChargeStat ``` diff --git a/go.mod b/go.mod index 448bdc9eb..f564e742c 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,7 @@ go 1.16 require ( github.com/PuerkitoBio/goquery v1.6.1 - github.com/andig/evcc-config v0.0.0-20210426054204-3450b327d1e5 - github.com/andig/gosunspec v0.0.0-20210401131709-cd89d66b502d // indirect - github.com/andybalholm/cascadia v1.2.0 // indirect + github.com/andig/evcc-config v0.0.0-20210505193639-b12d8515d6f1 github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef github.com/avast/retry-go v3.0.0+incompatible github.com/benbjohnson/clock v1.1.0 diff --git a/go.sum b/go.sum index bccedd910..865f4a425 100644 --- a/go.sum +++ b/go.sum @@ -50,15 +50,13 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= github.com/andig/evcc v0.0.0-20200727161511-d58eb15f2dc9/go.mod h1:8HONEC6cC2s4k0u3QL7GIjrYOZYTOKiiXybw0FIJL0A= -github.com/andig/evcc-config v0.0.0-20210426054204-3450b327d1e5 h1:enGdw9V+3CvgeHHSKtU8Eu56/odljAoINywXoyZs+54= -github.com/andig/evcc-config v0.0.0-20210426054204-3450b327d1e5/go.mod h1:nsZ9UY8liEWaNZV5MFdp7TCAHP6de3RUIsBBPk5ixsA= +github.com/andig/evcc-config v0.0.0-20210505193639-b12d8515d6f1 h1:8y3a0rJ/7BQZqnCQjzPjrlTUCHiTyY0Ybf2LX33ffAQ= +github.com/andig/evcc-config v0.0.0-20210505193639-b12d8515d6f1/go.mod h1:nsZ9UY8liEWaNZV5MFdp7TCAHP6de3RUIsBBPk5ixsA= github.com/andig/gosunspec v0.0.0-20200429133549-3cf6a82fed9c/go.mod h1:YkshK8WMzYn1iXAZzHUO75gIqhMSan2ctgBVtBkRIyA= +github.com/andig/gosunspec v0.0.0-20201103081418-ec9af6feefde h1:QgUO3swXFjTXjqT+EA1k7XZbTxtl8AenEckO0UF3Dfw= github.com/andig/gosunspec v0.0.0-20201103081418-ec9af6feefde/go.mod h1:YkshK8WMzYn1iXAZzHUO75gIqhMSan2ctgBVtBkRIyA= -github.com/andig/gosunspec v0.0.0-20210401131709-cd89d66b502d h1:AyTgrMKSEy030uAfY6nGhq5yE2ONvu3pl1sLECVS3ec= -github.com/andig/gosunspec v0.0.0-20210401131709-cd89d66b502d/go.mod h1:YkshK8WMzYn1iXAZzHUO75gIqhMSan2ctgBVtBkRIyA= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/andybalholm/cascadia v1.2.0 h1:vuRCkM5Ozh/BfmsaTm26kbjm0mIOM3yS5Ek/F5h18aE= -github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= diff --git a/internal/charger/charger.go b/internal/charger/charger.go index 6900272e0..1137757f2 100644 --- a/internal/charger/charger.go +++ b/internal/charger/charger.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/andig/evcc/api" + "github.com/andig/evcc/internal" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" ) @@ -18,6 +19,7 @@ type Charger struct { func init() { registry.Add("default", NewConfigurableFromConfig) + registry.Add(internal.Custom, NewConfigurableFromConfig) } // NewConfigurableFromConfig creates a new configurable charger @@ -28,13 +30,13 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Charger, error } for k, v := range map[string]string{ - "status": cc.Status.Type, - "enable": cc.Enable.Type, - "enabled": cc.Enabled.Type, - "maxcurrent": cc.MaxCurrent.Type, + "status": cc.Status.PluginType(), + "enable": cc.Enable.PluginType(), + "enabled": cc.Enabled.PluginType(), + "maxcurrent": cc.MaxCurrent.PluginType(), } { if v == "" { - return nil, fmt.Errorf("default charger config: %s required", k) + return nil, fmt.Errorf("missing plugin configuration: %s", k) } } diff --git a/internal/charger/config.go b/internal/charger/config.go index 1ef526b89..a3b8f3cb9 100644 --- a/internal/charger/config.go +++ b/internal/charger/config.go @@ -31,7 +31,7 @@ func NewFromConfig(typ string, other map[string]interface{}) (v api.Charger, err factory, err := registry.Get(strings.ToLower(typ)) if err == nil { if v, err = factory(other); err != nil { - err = fmt.Errorf("cannot create type '%s': %w", typ, err) + err = fmt.Errorf("cannot create charger '%s': %w", typ, err) } } else { err = fmt.Errorf("invalid charger type: %s", typ) diff --git a/internal/charger/nrgble_linux.go b/internal/charger/nrgble_linux.go index 1fbf0b4d5..9149aae74 100644 --- a/internal/charger/nrgble_linux.go +++ b/internal/charger/nrgble_linux.go @@ -28,7 +28,7 @@ type NRGKickBLE struct { agent *agent.SimpleAgent dev *device.Device1 device string - macaddress string + mac string pin int pauseCharging bool current int @@ -40,7 +40,7 @@ func init() { // NewNRGKickBLEFromConfig creates a NRGKickBLE charger from generic config func NewNRGKickBLEFromConfig(other map[string]interface{}) (api.Charger, error) { - cc := struct{ Device, MacAddress, PIN string }{ + cc := struct{ Device, Mac, PIN string }{ Device: "hci0", } if err := util.DecodeOther(other, &cc); err != nil { @@ -53,11 +53,11 @@ func NewNRGKickBLEFromConfig(other map[string]interface{}) (api.Charger, error) return nil, fmt.Errorf("invalid pin: %s", cc.PIN) } - return NewNRGKickBLE(cc.Device, cc.MacAddress, pin) + return NewNRGKickBLE(cc.Device, cc.Mac, pin) } // NewNRGKickBLE creates NRGKickBLE charger -func NewNRGKickBLE(device, macaddress string, pin int) (*NRGKickBLE, error) { +func NewNRGKickBLE(device, mac string, pin int) (*NRGKickBLE, error) { logger := util.NewLogger("nrg-bt") // set LE mode @@ -103,20 +103,20 @@ func NewNRGKickBLE(device, macaddress string, pin int) (*NRGKickBLE, error) { } nrg := &NRGKickBLE{ - log: logger, - timer: time.NewTimer(1), - device: device, - macaddress: macaddress, - pin: pin, - adapter: adapt, - agent: ag, + log: logger, + timer: time.NewTimer(1), + device: device, + mac: mac, + pin: pin, + adapter: adapt, + agent: ag, } return nrg, nil } func (nrg *NRGKickBLE) connect() (*device.Device1, error) { - dev, err := nrgble.FindDevice(nrg.adapter, nrg.macaddress, nrgTimeout) + dev, err := nrgble.FindDevice(nrg.adapter, nrg.mac, nrgTimeout) if err != nil { return nil, fmt.Errorf("find device: %s", err) } diff --git a/internal/const.go b/internal/const.go new file mode 100644 index 000000000..659a02b7b --- /dev/null +++ b/internal/const.go @@ -0,0 +1,4 @@ +package internal + +// Custom plugin type +const Custom = "custom" diff --git a/internal/meter/config.go b/internal/meter/config.go index cb029558c..5b079217f 100644 --- a/internal/meter/config.go +++ b/internal/meter/config.go @@ -31,7 +31,7 @@ func NewFromConfig(typ string, other map[string]interface{}) (v api.Meter, err e factory, err := registry.Get(strings.ToLower(typ)) if err == nil { if v, err = factory(other); err != nil { - err = fmt.Errorf("cannot create type '%s': %w", typ, err) + err = fmt.Errorf("cannot create meter '%s': %w", typ, err) } } else { err = fmt.Errorf("invalid meter type: %s", typ) diff --git a/internal/meter/meter.go b/internal/meter/meter.go index 4fe725ac5..11751fbea 100644 --- a/internal/meter/meter.go +++ b/internal/meter/meter.go @@ -5,12 +5,14 @@ import ( "fmt" "github.com/andig/evcc/api" + "github.com/andig/evcc/internal" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" ) func init() { registry.Add("default", NewConfigurableFromConfig) + registry.Add(internal.Custom, NewConfigurableFromConfig) } //go:generate go run ../../cmd/tools/decorate.go -p meter -f decorateMeter -b api.Meter -o meter_decorators -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.Battery,SoC,func() (float64, error)" @@ -28,9 +30,9 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Meter, error) return nil, err } - for k, v := range map[string]string{"power": cc.Power.Type} { + for k, v := range map[string]string{"power": cc.Power.PluginType()} { if v == "" { - return nil, fmt.Errorf("default meter config: %s required", k) + return nil, fmt.Errorf("missing plugin configuration: %s", k) } } diff --git a/internal/vehicle/config.go b/internal/vehicle/config.go index fab533309..c6bb15d2c 100644 --- a/internal/vehicle/config.go +++ b/internal/vehicle/config.go @@ -34,7 +34,7 @@ func NewFromConfig(typ string, other map[string]interface{}) (v api.Vehicle, err factory, err := registry.Get(strings.ToLower(typ)) if err == nil { if v, err = factory(other); err != nil { - err = fmt.Errorf("cannot create type '%s': %w", typ, err) + err = fmt.Errorf("cannot create vehicle '%s': %w", typ, err) } } else { err = fmt.Errorf("invalid vehicle type: %s", typ) diff --git a/internal/vehicle/id/provider.go b/internal/vehicle/id/provider.go index d80b8f48a..5473a0a3d 100644 --- a/internal/vehicle/id/provider.go +++ b/internal/vehicle/id/provider.go @@ -100,7 +100,7 @@ func (v *Provider) Climater() (active bool, outsideTemp float64, targetTemp floa targetTemp = res.Data.ClimatisationSettings.TargetTemperatureC - // TODO: not available; use target temp to avoid wrong heating/cooling display + // TODO not available; use target temp to avoid wrong heating/cooling display outsideTemp = targetTemp return active, outsideTemp, targetTemp, nil diff --git a/internal/vehicle/vehicle.go b/internal/vehicle/vehicle.go index c1f6d411f..cf2af2c92 100644 --- a/internal/vehicle/vehicle.go +++ b/internal/vehicle/vehicle.go @@ -5,6 +5,7 @@ import ( "time" "github.com/andig/evcc/api" + "github.com/andig/evcc/internal" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" ) @@ -36,6 +37,7 @@ type Vehicle struct { func init() { registry.Add("default", NewConfigurableFromConfig) + registry.Add(internal.Custom, NewConfigurableFromConfig) } // NewConfigurableFromConfig creates a new Vehicle @@ -55,9 +57,9 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Vehicle, error return nil, err } - for k, v := range map[string]string{"charge": cc.Charge.Type} { + for k, v := range map[string]string{"charge": cc.Charge.PluginType()} { if v == "" { - return nil, fmt.Errorf("default vehicle config: %s required", k) + return nil, fmt.Errorf("missing plugin configuration: %s", k) } } diff --git a/provider/config.go b/provider/config.go index 93df47a0f..1e92b0a10 100644 --- a/provider/config.go +++ b/provider/config.go @@ -48,13 +48,23 @@ var registry providerRegistry = make(map[string]func(map[string]interface{}) (In // Config is the general provider config type Config struct { - Type string - Other map[string]interface{} `mapstructure:",remain"` + Source string + Type string // TODO remove deprecated + Other map[string]interface{} `mapstructure:",remain"` +} + +// PluginType returns the plugin type in a legacy-aware way +func (c Config) PluginType() string { + typ := c.Source + if typ == "" { + typ = c.Type + } + return strings.ToLower(typ) } // NewIntGetterFromConfig creates a IntGetter from config func NewIntGetterFromConfig(config Config) (res func() (int64, error), err error) { - factory, err := registry.Get(strings.ToLower(config.Type)) + factory, err := registry.Get(config.PluginType()) if err == nil { var provider IntProvider provider, err = factory(config.Other) @@ -65,7 +75,7 @@ func NewIntGetterFromConfig(config Config) (res func() (int64, error), err error } if err == nil && res == nil { - err = fmt.Errorf("invalid plugin type: %s", config.Type) + err = fmt.Errorf("invalid plugin type: %s", config.PluginType()) } return @@ -73,7 +83,7 @@ func NewIntGetterFromConfig(config Config) (res func() (int64, error), err error // NewFloatGetterFromConfig creates a FloatGetter from config func NewFloatGetterFromConfig(config Config) (res func() (float64, error), err error) { - factory, err := registry.Get(config.Type) + factory, err := registry.Get(config.PluginType()) if err == nil { var provider IntProvider provider, err = factory(config.Other) @@ -84,7 +94,7 @@ func NewFloatGetterFromConfig(config Config) (res func() (float64, error), err e } if err == nil && res == nil { - err = fmt.Errorf("invalid plugin type: %s", config.Type) + err = fmt.Errorf("invalid plugin type: %s", config.PluginType()) } return @@ -92,7 +102,7 @@ func NewFloatGetterFromConfig(config Config) (res func() (float64, error), err e // NewStringGetterFromConfig creates a StringGetter from config func NewStringGetterFromConfig(config Config) (res func() (string, error), err error) { - switch typ := strings.ToLower(config.Type); typ { + switch typ := config.PluginType(); typ { case "combined", "openwb": res, err = NewOpenWBStatusProviderFromConfig(config.Other) @@ -109,7 +119,7 @@ func NewStringGetterFromConfig(config Config) (res func() (string, error), err e } if err == nil && res == nil { - err = fmt.Errorf("invalid plugin type: %s", config.Type) + err = fmt.Errorf("invalid plugin type: %s", config.PluginType()) } } @@ -118,7 +128,7 @@ func NewStringGetterFromConfig(config Config) (res func() (string, error), err e // NewBoolGetterFromConfig creates a BoolGetter from config func NewBoolGetterFromConfig(config Config) (res func() (bool, error), err error) { - factory, err := registry.Get(strings.ToLower(config.Type)) + factory, err := registry.Get(config.PluginType()) if err == nil { var provider IntProvider provider, err = factory(config.Other) @@ -129,7 +139,7 @@ func NewBoolGetterFromConfig(config Config) (res func() (bool, error), err error } if err == nil && res == nil { - err = fmt.Errorf("invalid plugin type: %s", config.Type) + err = fmt.Errorf("invalid plugin type: %s", config.PluginType()) } return @@ -137,7 +147,7 @@ func NewBoolGetterFromConfig(config Config) (res func() (bool, error), err error // NewIntSetterFromConfig creates a IntSetter from config func NewIntSetterFromConfig(param string, config Config) (res func(int64) error, err error) { - factory, err := registry.Get(strings.ToLower(config.Type)) + factory, err := registry.Get(config.PluginType()) if err == nil { var provider IntProvider provider, err = factory(config.Other) @@ -148,7 +158,7 @@ func NewIntSetterFromConfig(param string, config Config) (res func(int64) error, } if err == nil && res == nil { - err = fmt.Errorf("invalid plugin type: %s", config.Type) + err = fmt.Errorf("invalid plugin type: %s", config.PluginType()) } return @@ -156,7 +166,7 @@ func NewIntSetterFromConfig(param string, config Config) (res func(int64) error, // NewBoolSetterFromConfig creates a BoolSetter from config func NewBoolSetterFromConfig(param string, config Config) (res func(bool) error, err error) { - factory, err := registry.Get(strings.ToLower(config.Type)) + factory, err := registry.Get(config.PluginType()) if err == nil { var provider IntProvider provider, err = factory(config.Other) @@ -167,7 +177,7 @@ func NewBoolSetterFromConfig(param string, config Config) (res func(bool) error, } if err == nil && res == nil { - err = fmt.Errorf("invalid plugin type: %s", config.Type) + err = fmt.Errorf("invalid plugin type: %s", config.PluginType()) } return