Templates: render template-specific modbus defaults in instance mode (#29852)

This commit is contained in:
premultiply 2026-05-22 21:43:03 +02:00 • committed by GitHub
parent e63196e4ba
commit 14b422da85
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 78 additions and 5 deletions

View file

@ -93,13 +93,13 @@ func (t *Template) ModbusValues(renderMode int, values map[string]any) {
}
if defaultValue != "" {
// for modbus params the default value is carried
// using the parameter default, not the value
// TODO figure out why that's necessary
// apply the template-specific default to both the render values
// (so RenderModeInstance YAML reflects it) and the param definition
// (so the Config UI surfaces it as default). The earlier guard above
// ensures user-supplied values are not overwritten.
values[p.Name] = defaultValue
if renderMode == RenderModeInstance {
t.SetParamDefault(p.Name, defaultValue)
} else {
values[p.Name] = defaultValue
}
}
}

View file

@ -0,0 +1,73 @@
package templates
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
var renderModeNames = map[int]string{
RenderModeInstance: "instance",
RenderModeDocs: "docs",
RenderModeUnitTest: "unittest",
}
// TestModbusTemplateDefaultID verifies that a template-specific modbus id
// (e.g. Wallbe/Phoenix controllers using id 255) is rendered into the resulting
// instance config when the user did not supply an explicit id. See #29804.
func TestModbusTemplateDefaultID(t *testing.T) {
for _, mode := range []int{RenderModeInstance, RenderModeDocs, RenderModeUnitTest} {
t.Run(renderModeNames[mode], func(t *testing.T) {
tmpl, err := ByName(Charger, "phoenix-ev-eth")
require.NoError(t, err)
_, values, err := tmpl.RenderResult(mode, map[string]any{
"host": "192.168.0.8",
"port": 502,
})
require.NoError(t, err)
assert.Equal(t, "255", values["id"], "template-specific modbus id must be applied")
})
}
}
// TestModbusTemplateUserIDOverridesTemplate ensures a user-supplied id wins
// over the template default in all render modes.
func TestModbusTemplateUserIDOverridesTemplate(t *testing.T) {
for _, mode := range []int{RenderModeInstance, RenderModeDocs, RenderModeUnitTest} {
t.Run(renderModeNames[mode], func(t *testing.T) {
tmpl, err := ByName(Charger, "phoenix-ev-eth")
require.NoError(t, err)
_, values, err := tmpl.RenderResult(mode, map[string]any{
"host": "192.168.0.8",
"port": 502,
"id": 42,
})
require.NoError(t, err)
assert.Equal(t, "42", values["id"], "user-supplied modbus id must not be overwritten")
})
}
}
// TestWallbeTemplateCoveredByPhoenix verifies the BC migration: a config that
// still references the removed `wallbe` templates is transparently routed to
// the phoenix-ev-eth template via the `covers:` directive, while still
// producing the Wallbe controller's modbus slave id 255.
func TestWallbeTemplateCoveredByPhoenix(t *testing.T) {
for _, name := range []string{"wallbe", "wallbe-meter", "wallbe-pre2019", "wallbe-pre2019-meter"} {
t.Run(name, func(t *testing.T) {
tmpl, err := ByName(Charger, name)
require.NoError(t, err)
assert.Equal(t, "phoenix-ev-eth", tmpl.Template)
_, values, err := tmpl.RenderResult(RenderModeInstance, map[string]any{
"host": "192.168.0.8",
"port": 502,
})
require.NoError(t, err)
assert.Equal(t, "255", values["id"])
})
}
}