evcc-io/util/templates/init.go
Andreas Linde a52f52b406
Template enhancements (#2274)
- Only add SMA HEMS Setup, if required values exist (e.g. machine-id). Also asks the user if this should be added
- New templates: Alfen, PC Electric Garo, go-e V3 (moved into separate template), Tasmota meter, Huawei inverter with Sdongle
- Updated templates: SolarEdge Inverter, Sunspec
- New capabilities can be assigned: 1p3p, RFID
- Added group information instead of `generic` flag. Used e.g. for marking power plugs or generic devices
- Requirement description text can now be markdown text (required for documentation page)
- Replaced `description` with product list, separating brand from description (required for documentation page)
- Generate newly structured documentation yaml files
- Fix https://github.com/evcc-io/evcc/issues/2385
2022-01-23 15:21:13 +01:00

92 lines
1.6 KiB
Go

package templates
import (
"fmt"
"io/fs"
"path"
"github.com/evcc-io/evcc/templates/definition"
"gopkg.in/yaml.v3"
)
var (
templates = make(map[string][]Template)
configDefaults = ConfigDefaults{}
)
const (
Charger = "charger"
Meter = "meter"
Vehicle = "vehicle"
)
func loadTemplates(class string) {
configDefaults.LoadDefaults()
if templates[class] != nil {
return
}
err := fs.WalkDir(definition.YamlTemplates, ".", func(filepath string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
b, err := fs.ReadFile(definition.YamlTemplates, filepath)
if err != nil {
return err
}
var definition TemplateDefinition
if err = yaml.Unmarshal(b, &definition); err != nil {
return fmt.Errorf("reading template '%s' failed: %w", filepath, err)
}
tmpl := Template{
TemplateDefinition: definition,
ConfigDefaults: configDefaults,
}
if err = tmpl.ResolvePresets(); err != nil {
return err
}
if err = tmpl.ResolveGroup(); err != nil {
return err
}
if err = tmpl.UpdateParamsWithDefaults(); err != nil {
return err
}
if err = tmpl.Validate(); err != nil {
return err
}
path := path.Dir(filepath)
templates[path] = append(templates[path], tmpl)
return nil
})
if err != nil {
panic(err)
}
}
func ByClass(class string) []Template {
loadTemplates(class)
return templates[class]
}
func ByTemplate(t, class string) (Template, error) {
loadTemplates(class)
for _, tmpl := range templates[class] {
if tmpl.Template == t {
return tmpl, nil
}
}
return Template{}, fmt.Errorf("template not found: %s", t)
}