Skip to content

Commit

Permalink
SolarMax: add battery discharge control (#16110)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored Sep 14, 2024
1 parent b9c6d27 commit 78b7bfd
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 0 deletions.
45 changes: 45 additions & 0 deletions provider/error.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package provider

import (
"fmt"

"github.com/evcc-io/evcc/util"
)

type errorProvider struct {
err error
}

func init() {
registry.Add("error", NewErrorFromConfig)
}

// NewErrorFromConfig creates error provider
func NewErrorFromConfig(other map[string]interface{}) (Provider, error) {
var cc struct {
Error string
}

if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}

err := knownErrors([]byte(cc.Error))
if err == nil {
return nil, fmt.Errorf("unknown error: %s", cc.Error)
}

o := &errorProvider{
err: err,
}

return o, nil
}

var _ SetIntProvider = (*errorProvider)(nil)

func (o *errorProvider) IntSetter(param string) (func(int64) error, error) {
return func(int64) error {
return o.err
}, nil
}
46 changes: 46 additions & 0 deletions provider/random.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package provider

import (
"math"
"math/rand/v2"

"github.com/evcc-io/evcc/util"
)

type randomProvider struct {
set Config
}

func init() {
registry.Add("random", NewRandomFromConfig)
}

// NewRandomFromConfig creates random provider
func NewRandomFromConfig(other map[string]interface{}) (Provider, error) {
var cc struct {
Set Config
}

if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}

o := &randomProvider{
set: cc.Set,
}

return o, nil
}

var _ SetIntProvider = (*randomProvider)(nil)

func (o *randomProvider) IntSetter(param string) (func(int64) error, error) {
set, err := NewIntSetterFromConfig(param, o.set)
if err != nil {
return nil, err
}

return func(int64) error {
return set(rand.Int64N(math.MaxInt64-1) + 1)
}, nil
}
72 changes: 72 additions & 0 deletions templates/definition/meter/solarmax-maxstorage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,77 @@ render: |
address: 122 # Batterie Soc
type: input
decode: int16
batterymode:
source: watchdog
timeout: {{ .watchdog }}
reset: 1 # reset watchdog on normal
set:
source: switch
switch:
- case: 1 # normal
set:
source: sequence
set:
- source: const
value: 7000
set:
source: modbus
{{- include "modbus" . | indent 12 }}
register:
address: 140
type: writemultiple
decode: int16
- source: const
value: 7000
set:
source: modbus
{{- include "modbus" . | indent 12 }}
register:
address: 141
type: writemultiple
decode: int16
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 12 }}
register:
address: 142
type: writemultiple
decode: int16
- case: 2 # hold
set:
source: sequence
set:
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 12 }}
register:
address: 140
type: writemultiple
decode: int16
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 12 }}
register:
address: 141
type: writemultiple
decode: int16
- source: random
set:
source: modbus
{{- include "modbus" . | indent 12 }}
register:
address: 142
type: writemultiple
decode: int16
- case: 3 # charge (not implemented)
set:
source: error
error: ErrNotImplemented
capacity: {{ .capacity }} # kWh
{{- end }}

0 comments on commit 78b7bfd

Please sign in to comment.