From 67d2144fc21bc8c9cd80f80973f4f54f4f0e2e6d Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 14 Apr 2020 10:38:13 +0200 Subject: [PATCH] Support decoding openWB status --- provider/config.go | 2 ++ provider/openwb.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 provider/openwb.go diff --git a/provider/config.go b/provider/config.go index ad2f4c35b..8cc248072 100644 --- a/provider/config.go +++ b/provider/config.go @@ -114,6 +114,8 @@ func NewStringGetterFromConfig(log *api.Logger, config Config) (res StringGetter if pc.Cache > 0 { res = NewCached(res, pc.Cache).StringGetter() } + case "openwb": + res = openWBStatusFromConfig(log, config.Other) default: log.FATAL.Fatalf("invalid provider type %s", config.Type) } diff --git a/provider/openwb.go b/provider/openwb.go new file mode 100644 index 000000000..0391991e2 --- /dev/null +++ b/provider/openwb.go @@ -0,0 +1,53 @@ +package provider + +import ( + "time" + + "github.com/andig/evcc/api" +) + +// openWBConfig is the specific mqtt getter/setter configuration +type openWBConfig struct { + PlugStat, ChargeStat string + Timeout time.Duration +} + +type openWBStatusProvider struct { + plugStat, chargeStat BoolGetter +} + +func openWBStatusFromConfig(log *api.Logger, other map[string]interface{}) (res StringGetter) { + if MQTT == nil { + log.FATAL.Fatal("mqtt not configured") + } + + var pc openWBConfig + api.DecodeOther(log, other, &pc) + + o := &openWBStatusProvider{ + plugStat: MQTT.BoolGetter(pc.PlugStat, pc.Timeout), + chargeStat: MQTT.BoolGetter(pc.ChargeStat, pc.Timeout), + } + + return o.stringGetter +} + +func (o *openWBStatusProvider) stringGetter() (string, error) { + charging, err := o.chargeStat() + if err != nil { + return "", err + } + if charging { + return string(api.StatusC), nil + } + + plugged, err := o.plugStat() + if err != nil { + return "", err + } + if plugged { + return string(api.StatusB), nil + } + + return string(api.StatusA), nil +}