Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
premultiply committed Sep 11, 2024
1 parent 9ee0592 commit b8d9203
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 78 deletions.
125 changes: 82 additions & 43 deletions charger/delta.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ import (

// Delta charger implementation
type Delta struct {
log *util.Logger
conn *modbus.Connection
lp loadpoint.API
mu sync.Mutex
curr float64
base uint16
enabled bool
isSmart bool
log *util.Logger
conn *modbus.Connection
lp loadpoint.API
mu sync.Mutex
curr float64
base uint16
enabled bool
statusG func() (api.ChargeStatus, error)
statusReasonG func() (api.Reason, error)
}

const (
Expand Down Expand Up @@ -102,12 +103,14 @@ func NewDelta(uri, device, comset string, baudrate int, proto modbus.Protocol, s

wb.base = connector * 1000

var statusReasonG func() (api.Reason, error)
// used limited (converted?) status register
wb.statusG = wb.statusOCPP
wb.statusReasonG = wb.statusReasonOCPP

// check for smart register set
// check if native status register is available
if _, err := wb.conn.ReadInputRegisters(wb.base+deltaRegEvseChargerState, 1); err == nil {
wb.isSmart = true
statusReasonG = wb.statusReason
wb.statusG = wb.statusDelta
wb.statusReasonG = wb.statusReasonDelta
}

b, err := wb.conn.ReadHoldingRegisters(deltaRegCommunicationTimeoutEnabled, 1)
Expand All @@ -125,11 +128,9 @@ func NewDelta(uri, device, comset string, baudrate int, proto modbus.Protocol, s
}
}

return decorateDelta(wb, statusReasonG), nil
return wb, nil
}

//go:generate go run ../cmd/tools/decorate.go -f decorateDelta -b *Delta -r api.Charger -t "api.StatusReasoner,StatusReason,func() (api.Reason, error)"

func (wb *Delta) heartbeat(timeout time.Duration) {
for range time.Tick(timeout) {
wb.mu.Lock()
Expand All @@ -145,7 +146,52 @@ func (wb *Delta) heartbeat(timeout time.Duration) {
}

// Status implements the api.Charger interface
func (wb *Delta) Status() (api.ChargeStatus, error) {
func (wb *Delta) statusDelta() (api.ChargeStatus, error) {
b, err := wb.conn.ReadInputRegisters(wb.base+deltaRegEvseChargerState, 1)
if err != nil {
return api.StatusNone, err
}

// 0: Charging process not started (no vehicle connected)
// 1: Connected, waiting for release (by RFID or local)
// 2: Charging process starts
// 3: Charging
// 4: Suspended (loading paused)
// 5: Charging process successfully completed (vehicle still plugged in)
// 6: Charging process completed by user (vehicle still plugged in)
// 7: Charging ended with error (vehicle still connected)

switch s := encoding.Uint16(b); s {
case 0, 1, 2:
return api.StatusA, nil
case 3:
return api.StatusC, nil
case 4, 5, 6, 7:
return api.StatusB, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %0x", s)
}
}

// statusReason implements the api.StatusReasoner interface
func (wb *Delta) statusReasonDelta() (api.Reason, error) {
b, err := wb.conn.ReadInputRegisters(wb.base+deltaRegEvseChargerState, 1)
if err != nil {
return api.ReasonUnknown, err
}

switch encoding.Uint16(b) {
case 1:
return api.ReasonWaitingForAuthorization, nil
case 7:
return api.ReasonDisconnectRequired, nil
}

return api.ReasonUnknown, nil
}

// Status implements the api.Charger interface
func (wb *Delta) statusOCPP() (api.ChargeStatus, error) {
b, err := wb.conn.ReadInputRegisters(wb.base+deltaRegEvseState, 1)
if err != nil {
return api.StatusNone, err
Expand All @@ -162,56 +208,49 @@ func (wb *Delta) Status() (api.ChargeStatus, error) {
// 8: Not ready
// 9: Faulted

if wb.isSmart {
return wb.statusSmart(encoding.Uint16(b))
}

return wb.statusBasic(encoding.Uint16(b))
}

func (wb *Delta) statusBasic(s uint16) (api.ChargeStatus, error) {
switch s {
case 0, 1, 2, 3:
return api.StatusA, nil
case 5, 6, 7, 9:
return api.StatusB, nil
case 4:
return api.StatusC, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %0x", s)
}
}

func (wb *Delta) statusSmart(s uint16) (api.ChargeStatus, error) {
switch s {
switch s := encoding.Uint16(b); s {
case 0, 1, 2:
return api.StatusA, nil
case 3, 5, 6, 7, 9:
return api.StatusB, nil
case 3: // not used correctly by protocol conversion
return api.StatusA, nil
case 4:
return api.StatusC, nil
case 5, 6, 7:
return api.StatusB, nil
case 9: // not used correctly by protocol conversion
return api.StatusB, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %0x", s)
}
}

// statusReason implements the api.StatusReasoner interface
func (wb *Delta) statusReason() (api.Reason, error) {
func (wb *Delta) statusReasonOCPP() (api.Reason, error) {
b, err := wb.conn.ReadInputRegisters(wb.base+deltaRegEvseState, 1)
if err != nil {
return api.ReasonUnknown, err
}

switch s := encoding.Uint16(b); s {
switch encoding.Uint16(b) {
case 3:
return api.ReasonWaitingForAuthorization, nil
case 5:
case 5, 9:
return api.ReasonDisconnectRequired, nil
}

return api.ReasonUnknown, nil
}

func (wb *Delta) Status() (api.ChargeStatus, error) {
return wb.statusG()
}

var _ api.StatusReasoner = (*Delta)(nil)

func (wb *Delta) StatusReason() (api.Reason, error) {
return wb.statusReasonG()
}

// Enabled implements the api.Charger interface
func (wb *Delta) Enabled() (bool, error) {
b, err := wb.conn.ReadHoldingRegisters(wb.base+deltaRegEvseChargingPowerLimit, 2)
Expand Down
35 changes: 0 additions & 35 deletions charger/delta_decorators.go

This file was deleted.

0 comments on commit b8d9203

Please sign in to comment.