Skip to content

Commit

Permalink
E3dc: re-add capacity parameter (#13740)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed May 4, 2024
1 parent 8327ddb commit 3b85f16
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 69 deletions.
72 changes: 6 additions & 66 deletions meter/e3dc.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package meter
import (
"errors"
"net"
"slices"
"strconv"
"sync"
"time"
Expand All @@ -19,7 +18,6 @@ import (
)

type E3dc struct {
capacity float64
dischargeLimit uint32
usage templates.Usage // TODO check if we really want to depend on templates
conn *rscp.Client
Expand All @@ -33,12 +31,13 @@ func init() {

func NewE3dcFromConfig(other map[string]interface{}) (api.Meter, error) {
cc := struct {
capacity `mapstructure:",squash"`
Usage templates.Usage
Uri string
User string
Password string
Key string
Battery uint16 // battery id
_ uint16 `mapstructure:"battery"` // deprecated
DischargeLimit uint32
Timeout time.Duration
}{
Expand Down Expand Up @@ -67,12 +66,12 @@ func NewE3dcFromConfig(other map[string]interface{}) (api.Meter, error) {
ReceiveTimeout: cc.Timeout,
}

return NewE3dc(cfg, cc.Usage, cc.Battery, cc.DischargeLimit)
return NewE3dc(cfg, cc.Usage, cc.DischargeLimit, cc.capacity.Decorator())
}

var e3dcOnce sync.Once

func NewE3dc(cfg rscp.ClientConfig, usage templates.Usage, batteryId uint16, dischargeLimit uint32) (api.Meter, error) {
func NewE3dc(cfg rscp.ClientConfig, usage templates.Usage, dischargeLimit uint32, capacity func() float64) (api.Meter, error) {
e3dcOnce.Do(func() {
log := util.NewLogger("e3dc")
rscp.Log.SetLevel(logrus.DebugLevel)
Expand All @@ -92,51 +91,15 @@ func NewE3dc(cfg rscp.ClientConfig, usage templates.Usage, batteryId uint16, dis

// decorate api.BatterySoc
var (
batterySoc func() (float64, error)
batteryCapacity func() float64
batterySoc func() (float64, error)
batteryMode func(api.BatteryMode) error
)

if usage == templates.UsageBattery {
batteryCapacity = capacity
batterySoc = m.batterySoc
batteryCapacity = m.batteryCapacity
batteryMode = m.setBatteryMode

res, err := m.conn.Send(rscp.Message{
Tag: rscp.BAT_REQ_DATA,
DataType: rscp.Container,
Value: []rscp.Message{
{
Tag: rscp.BAT_INDEX,
DataType: rscp.UInt16,
Value: batteryId,
},
{
Tag: rscp.BAT_REQ_SPECIFICATION,
DataType: rscp.None,
},
},
})
if err != nil {
return nil, err
}

batSpec, err := rscpContains(res, rscp.BAT_SPECIFICATION)
if err != nil {
return nil, err
}

batCap, err := rscpContains(&batSpec, rscp.BAT_SPECIFIED_CAPACITY)
if err != nil {
return nil, err
}

cap, err := rscpValue(batCap, cast.ToFloat64E)
if err != nil {
return nil, err
}

m.capacity = cap / 1e3
}

return decorateE3dc(m, batteryCapacity, batterySoc, batteryMode), nil
Expand Down Expand Up @@ -184,10 +147,6 @@ func (m *E3dc) CurrentPower() (float64, error) {
}
}

func (m *E3dc) batteryCapacity() float64 {
return m.capacity
}

func (m *E3dc) batterySoc() (float64, error) {
res, err := m.conn.Send(*rscp.NewMessage(rscp.EMS_REQ_BAT_SOC, nil))
if err != nil {
Expand Down Expand Up @@ -257,25 +216,6 @@ func rscpError(msg ...rscp.Message) error {
return errors.Join(errs...)
}

func rscpContains(msg *rscp.Message, tag rscp.Tag) (rscp.Message, error) {
var zero rscp.Message

slice, ok := msg.Value.([]rscp.Message)
if !ok {
return zero, errors.New("not a slice looking for " + tag.String())
}

idx := slices.IndexFunc(slice, func(m rscp.Message) bool {
return m.Tag == tag
})
if idx < 0 {
return zero, errors.New("missing " + tag.String())
}

res := slice[idx]
return res, rscpError(res)
}

func rscpValue[T any](msg rscp.Message, fun func(any) (T, error)) (T, error) {
var zero T
if err := rscpError(msg); err != nil {
Expand Down
9 changes: 6 additions & 3 deletions templates/definition/meter/e3dc-rscp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ params:
- name: password
- name: key
- name: battery
type: number
advanced: true
deprecated: true
- name: dischargelimit
description:
de: Entladelimit in W
Expand All @@ -34,12 +33,16 @@ params:
en: Limits discharge power in 'Hold' battery mode
type: number
advanced: true
- name: capacity
advanced: true
render: |
type: e3dc-rscp
usage: {{ .usage }}
uri: {{ .host }}:{{ .port }}
user: {{ .user }}
password: {{ .password }}
key: {{ .key }}
battery: {{ .battery }}
{{- if eq .usage "battery" }}
dischargelimit: {{ .dischargelimit }}
capacity: {{ .capacity }} # kWh
{{- end }}

0 comments on commit 3b85f16

Please sign in to comment.