Skip to content

Commit

Permalink
Add Relay HEMS for analog interface (#15116)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored Jul 28, 2024
1 parent 1d5a068 commit f6b4b42
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 5 deletions.
4 changes: 3 additions & 1 deletion core/circuit/circuit.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,9 @@ func (c *Circuit) setParent(parent api.Circuit) error {

// Wrap wraps circuit with parent, keeping the original meter
func (c *Circuit) Wrap(parent api.Circuit) error {
parent.(*Circuit).meter = c.meter
if c.meter != nil {
parent.(*Circuit).meter = c.meter
}
return c.setParent(parent)
}

Expand Down
3 changes: 3 additions & 0 deletions hems/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/evcc-io/evcc/core/site"
"github.com/evcc-io/evcc/hems/eebus"
"github.com/evcc-io/evcc/hems/relay"
"github.com/evcc-io/evcc/hems/semp"
"github.com/evcc-io/evcc/server"
)
Expand All @@ -22,6 +23,8 @@ func NewFromConfig(typ string, other map[string]interface{}, site site.API, http
return semp.New(other, site, httpd)
case "eebus":
return eebus.New(other, site)
case "relay":
return relay.New(other, site)
default:
return nil, errors.New("unknown hems: " + typ)
}
Expand Down
5 changes: 1 addition & 4 deletions hems/eebus/eebus.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,6 @@ func New(other map[string]interface{}, site site.API) (*EEBus, error) {
if root == nil {
return nil, errors.New("hems requires load management- please configure root circuit")
}
if !root.HasMeter() {
return nil, errors.New("hems requires root circuit to have meter")
}

// create new root circuit for LPC
lpc, err := circuit.New(util.NewLogger("lpc"), "eebus", 0, 0, nil, time.Minute)
Expand All @@ -67,7 +64,7 @@ func New(other map[string]interface{}, site site.API) (*EEBus, error) {
return NewEEBus(cc.Ski, lpc)
}

// NewEEBus creates EEBus charger
// NewEEBus creates EEBus HEMS
func NewEEBus(ski string, root api.Circuit) (*EEBus, error) {
if eebus.Instance == nil {
return nil, errors.New("eebus not configured")
Expand Down
94 changes: 94 additions & 0 deletions hems/relay/steuerbox.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package relay

import (
"errors"
"time"

"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/circuit"
"github.com/evcc-io/evcc/core/site"
"github.com/evcc-io/evcc/provider"
"github.com/evcc-io/evcc/util"
)

type Relay struct {
log *util.Logger

root api.Circuit
limit func() (bool, error)
maxPower float64
}

// New creates an Relay HEMS from generic config
func New(other map[string]interface{}, site site.API) (*Relay, error) {
var cc struct {
MaxPower float64
Limit provider.Config
}

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

// get root circuit
root := circuit.Root()
if root == nil {
return nil, errors.New("hems requires load management- please configure root circuit")
}

// create new root circuit for LPC
lpc, err := circuit.New(util.NewLogger("lpc"), "relay", 0, 0, nil, time.Minute)
if err != nil {
return nil, err
}

// wrap old root with new pc parent
if err := root.Wrap(lpc); err != nil {
return nil, err
}
site.SetCircuit(lpc)

// limit getter
limitG, err := provider.NewBoolGetterFromConfig(cc.Limit)
if err != nil {
return nil, err
}

return NewRelay(lpc, limitG, cc.MaxPower)
}

// NewRelay creates Relay HEMS
func NewRelay(root api.Circuit, limit func() (bool, error), maxPower float64) (*Relay, error) {
c := &Relay{
log: util.NewLogger("relay"),
root: root,
maxPower: maxPower,
limit: limit,
}

return c, nil
}

func (c *Relay) Run() {
for range time.Tick(10 * time.Second) {
if err := c.run(); err != nil {
c.log.ERROR.Println(err)
}
}
}

func (c *Relay) run() error {
limit, err := c.limit()
if err != nil {
return err
}

var power float64
if limit {
power = c.maxPower
}

c.root.SetMaxPower(power)

return nil
}

0 comments on commit f6b4b42

Please sign in to comment.