From e6356c8b3b5a72c5764d44338d63d01b5ae402ac Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 12 Nov 2024 16:00:12 +0100 Subject: [PATCH] Mqtt: allow nil/null/none/- as empty values --- server/mqtt.go | 2 +- server/mqtt_setter.go | 29 ++++++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/server/mqtt.go b/server/mqtt.go index 27063b0eec..d9f4f6920b 100644 --- a/server/mqtt.go +++ b/server/mqtt.go @@ -220,7 +220,7 @@ func (m *MQTT) listenLoadpointSetters(topic string, site site.API, lp loadpoint. }}, {"vehicle", func(payload string) error { // https://github.com/evcc-io/evcc/issues/11184 empty payload is swallowed by listener - if payload == "-" { + if isEmpty(payload) { lp.SetVehicle(nil) return nil } diff --git a/server/mqtt_setter.go b/server/mqtt_setter.go index ee6214d21d..8541260b6f 100644 --- a/server/mqtt_setter.go +++ b/server/mqtt_setter.go @@ -1,6 +1,7 @@ package server import ( + "slices" "strconv" "time" @@ -13,6 +14,10 @@ type setter struct { fun func(string) error } +func isEmpty(payload string) bool { + return slices.Contains([]string{"-", "nil", "null", "none"}, payload) +} + func setterFunc[T any](conv func(string) (T, error), set func(T) error) func(string) error { return func(payload string) error { val, err := conv(payload) @@ -23,20 +28,26 @@ func setterFunc[T any](conv func(string) (T, error), set func(T) error) func(str } } +// ptrSetter updates pointer api +func ptrSetter[T any](conv func(string) (T, error), set func(*T) error) func(string) error { + return func(payload string) error { + var val *T + v, err := conv(payload) + if err == nil { + val = &v + } else if !isEmpty(payload) { + return err + } + return set(val) + } +} + func floatSetter(set func(float64) error) func(string) error { return setterFunc(parseFloat, set) } func floatPtrSetter(set func(*float64) error) func(string) error { - return func(s string) error { - var val *float64 - if f, err := parseFloat(s); err == nil { - val = &f - } else if s != "" { - return err - } - return set(val) - } + return ptrSetter(parseFloat, set) } func intSetter(set func(int) error) func(string) error {