Skip to content

Commit

Permalink
Templates: simplify rendering of instances
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed Sep 25, 2022
1 parent a194c23 commit 8ca9195
Show file tree
Hide file tree
Showing 12 changed files with 107 additions and 139 deletions.
33 changes: 5 additions & 28 deletions charger/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,20 @@ package charger

import (
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/templates"
"gopkg.in/yaml.v3"
)

func init() {
registry.Add("template", NewChargerFromTemplateConfig)
}

func NewChargerFromTemplateConfig(other map[string]interface{}) (api.Charger, error) {
var cc struct {
Template string
Other map[string]interface{} `mapstructure:",remain"`
}

if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}

tmpl, err := templates.ByName(cc.Template, templates.Charger)
if err != nil {
return nil, err
}

b, _, err := tmpl.RenderResult(templates.TemplateRenderModeInstance, other)
if err != nil {
return nil, err
}

var instance struct {
Type string
Other map[string]interface{} `yaml:",inline"`
}
instance, err := templates.RenderInstance(templates.Charger, other)

if err := yaml.Unmarshal(b, &instance); err != nil {
return nil, err
var res api.Charger
if err == nil {
res, err = NewFromConfig(instance.Type, instance.Other)
}

return NewFromConfig(instance.Type, instance.Other)
return res, err
}
23 changes: 15 additions & 8 deletions cmd/configure/configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"text/template"

"github.com/Masterminds/sprig/v3"
"github.com/evcc-io/evcc/util/templates"
)

type device struct {
Expand Down Expand Up @@ -52,9 +53,10 @@ type Configure struct {
// e.g. a PV meter to site.PVs
func (c *Configure) AddDevice(d device, category DeviceCategory) {
switch DeviceCategories[category].class {
case DeviceClassCharger:
case templates.Charger:
c.config.Chargers = append(c.config.Chargers, d)
case DeviceClassMeter:

case templates.Meter:
c.config.Meters = append(c.config.Meters, d)
switch DeviceCategories[category].categoryFilter {
case DeviceCategoryGridMeter:
Expand All @@ -64,22 +66,27 @@ func (c *Configure) AddDevice(d device, category DeviceCategory) {
case DeviceCategoryBatteryMeter:
c.config.Site.Batteries = append(c.config.Site.Batteries, d.Name)
}
case DeviceClassVehicle:

case templates.Vehicle:
c.config.Vehicles = append(c.config.Vehicles, d)

default:
panic("invalid class for category: " + category)
}
}

// DevicesOfClass returns all configured devices of a given DeviceClass
func (c *Configure) DevicesOfClass(class DeviceClass) []device {
func (c *Configure) DevicesOfClass(class templates.Class) []device {
switch class {
case DeviceClassCharger:
case templates.Charger:
return c.config.Chargers
case DeviceClassMeter:
case templates.Meter:
return c.config.Meters
case DeviceClassVehicle:
case templates.Vehicle:
return c.config.Vehicles
default:
panic("invalid class: " + class)
}
return nil
}

// AddLoadpoint adds a loadpoint to the configuration
Expand Down
19 changes: 11 additions & 8 deletions cmd/configure/devicetest.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,18 @@ func (d *DeviceTest) Test() (DeviceTestResult, error) {
}

switch DeviceCategories[d.DeviceCategory].class {
case DeviceClassCharger:
case templates.Charger:
return d.testCharger(v)
case DeviceClassMeter:

case templates.Meter:
return d.testMeter(d.DeviceCategory, v)
case DeviceClassVehicle:

case templates.Vehicle:
return d.testVehicle(v)
}

return DeviceTestResultInvalid, errors.New("testDevice not implemented for this device class")
default:
panic("invalid class for category: " + d.DeviceCategory)
}
}

// configure creates a configured device from a template so we can test it
Expand All @@ -66,11 +69,11 @@ func (d *DeviceTest) configure() (interface{}, error) {
var v interface{}

switch DeviceCategories[d.DeviceCategory].class {
case DeviceClassMeter:
case templates.Meter:
v, err = meter.NewFromConfig(instance.Type, instance.Other)
case DeviceClassCharger:
case templates.Charger:
v, err = charger.NewFromConfig(instance.Type, instance.Other)
case DeviceClassVehicle:
case templates.Vehicle:
v, err = vehicle.NewFromConfig(instance.Type, instance.Other)
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/configure/flow.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func (c *CmdConfigure) configureLinkedTypes(templateItem templates.Template) {
}
}

linkedTemplateItem, err := templates.ByName(linkedTemplate.Template, string(DeviceClassMeter))
linkedTemplateItem, err := templates.ByName(templates.Meter, linkedTemplate.Template)
if err != nil {
fmt.Println("Error: " + err.Error())
return
Expand Down
2 changes: 1 addition & 1 deletion cmd/configure/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ func (c *CmdConfigure) configureMQTT(templateItem templates.Template) (map[strin
// fetchElements returns template items of a given class
func (c *CmdConfigure) fetchElements(deviceCategory DeviceCategory) []templates.Template {
var items []templates.Template
for _, tmpl := range templates.ByClass(DeviceCategories[deviceCategory].class.String()) {
for _, tmpl := range templates.ByClass(DeviceCategories[deviceCategory].class) {
if len(tmpl.Params) == 0 {
continue
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/configure/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ func (c *CmdConfigure) configureLoadpoints() {
}
}

vehicles := c.configuration.DevicesOfClass(DeviceClassVehicle)
vehicles := c.configuration.DevicesOfClass(templates.Vehicle)
if len(vehicles) == 1 {
loadpoint.Vehicles = append(loadpoint.Vehicles, vehicles[0].Name)
} else if len(vehicles) > 1 {
Expand Down
30 changes: 10 additions & 20 deletions cmd/configure/types.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package configure

import "github.com/evcc-io/evcc/util/templates"

const (
DefaultConfigFilename string = "evcc.yaml"
)
Expand All @@ -10,18 +12,6 @@ func (u UsageChoice) String() string {
return string(u)
}

type DeviceClass string

func (c DeviceClass) String() string {
return string(c)
}

const (
DeviceClassCharger DeviceClass = "charger"
DeviceClassMeter DeviceClass = "meter"
DeviceClassVehicle DeviceClass = "vehicle"
)

type DeviceCategory string

func (c DeviceCategory) String() string {
Expand Down Expand Up @@ -49,40 +39,40 @@ const (

type DeviceCategoryData struct {
title, article, additional string
class DeviceClass
class templates.Class
categoryFilter DeviceCategory
defaultName string
}

var DeviceCategories = map[DeviceCategory]DeviceCategoryData{
DeviceCategoryCharger: {
class: DeviceClassCharger,
class: templates.Charger,
defaultName: defaultNameCharger,
},
DeviceCategoryGuidedSetup: {
class: DeviceClassMeter,
class: templates.Meter,
},
DeviceCategoryGridMeter: {
class: DeviceClassMeter,
class: templates.Meter,
categoryFilter: DeviceCategoryGridMeter,
defaultName: defaultNameGridMeter,
},
DeviceCategoryPVMeter: {
class: DeviceClassMeter,
class: templates.Meter,
categoryFilter: DeviceCategoryPVMeter,
defaultName: defaultNamePVMeter,
},
DeviceCategoryBatteryMeter: {
class: DeviceClassMeter,
class: templates.Meter,
categoryFilter: DeviceCategoryBatteryMeter,
defaultName: defaultNameBatteryMeter,
},
DeviceCategoryVehicle: {
class: DeviceClassVehicle,
class: templates.Vehicle,
defaultName: defaultNameVehicle,
},
DeviceCategoryChargeMeter: {
class: DeviceClassMeter,
class: templates.Meter,
categoryFilter: DeviceCategoryChargeMeter,
defaultName: defaultNameChargeMeter,
},
Expand Down
33 changes: 5 additions & 28 deletions meter/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,20 @@ package meter

import (
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/templates"
"gopkg.in/yaml.v3"
)

func init() {
registry.Add("template", NewMeterFromTemplateConfig)
}

func NewMeterFromTemplateConfig(other map[string]interface{}) (api.Meter, error) {
var cc struct {
Template string
Other map[string]interface{} `mapstructure:",remain"`
}

if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}

tmpl, err := templates.ByName(cc.Template, templates.Meter)
if err != nil {
return nil, err
}

b, _, err := tmpl.RenderResult(templates.TemplateRenderModeInstance, other)
if err != nil {
return nil, err
}

var instance struct {
Type string
Other map[string]interface{} `yaml:",inline"`
}
instance, err := templates.RenderInstance(templates.Meter, other)

if err := yaml.Unmarshal(b, &instance); err != nil {
return nil, err
var res api.Meter
if err == nil {
res, err = NewFromConfig(instance.Type, instance.Other)
}

return NewFromConfig(instance.Type, instance.Other)
return res, err
}
17 changes: 9 additions & 8 deletions util/templates/generate/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"path"
"sort"
Expand All @@ -21,7 +20,7 @@ const (
//go:generate go run generate.go

func main() {
for _, class := range []string{templates.Meter, templates.Charger, templates.Vehicle} {
for _, class := range []templates.Class{templates.Meter, templates.Charger, templates.Vehicle} {
path := fmt.Sprintf("%s/%s", docsPath, class)
_, err := os.Stat(path)
if os.IsNotExist(err) {
Expand All @@ -43,7 +42,7 @@ func main() {
}
}

func generateClass(class string) error {
func generateClass(class templates.Class) error {
for _, tmpl := range templates.ByClass(class) {
if err := tmpl.Validate(); err != nil {
return err
Expand All @@ -62,7 +61,7 @@ func generateClass(class string) error {
return nil
}

func writeTemplate(class string, index int, product templates.Product, tmpl templates.Template) error {
func writeTemplate(class templates.Class, index int, product templates.Product, tmpl templates.Template) error {
values := tmpl.Defaults(templates.TemplateRenderModeDocs)

b, err := tmpl.RenderDocumentation(product, values, "de")
Expand All @@ -78,7 +77,7 @@ func writeTemplate(class string, index int, product templates.Product, tmpl temp
}

func clearDir(dir string) error {
names, err := ioutil.ReadDir(dir)
names, err := os.ReadDir(dir)
if err != nil {
return err
}
Expand Down Expand Up @@ -154,8 +153,10 @@ func generateBrandJSON() error {
Vehicles: sortedKeys(vehicles),
}

file, _ := json.MarshalIndent(brands, "", " ")
error := ioutil.WriteFile(websitePath+"/brands.json", file, 0o644)
file, err := json.MarshalIndent(brands, "", " ")
if err == nil {
err = os.WriteFile(websitePath+"/brands.json", file, 0o644)
}

return error
return err
}
Loading

0 comments on commit 8ca9195

Please sign in to comment.