Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: clean-up api charging status #17989

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 15 additions & 24 deletions api/chargemodestatus.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,48 +27,39 @@ type ChargeStatus string

// Charging states
const (
StatusNone ChargeStatus = ""
StatusA ChargeStatus = "A" // Fzg. angeschlossen: nein Laden aktiv: nein Ladestation betriebsbereit, Fahrzeug getrennt
StatusB ChargeStatus = "B" // Fzg. angeschlossen: ja Laden aktiv: nein Fahrzeug verbunden, Netzspannung liegt nicht an
StatusC ChargeStatus = "C" // Fzg. angeschlossen: ja Laden aktiv: ja Fahrzeug lädt, Netzspannung liegt an
StatusE ChargeStatus = "E" // Fzg. angeschlossen: ja Laden aktiv: nein Fehler Fahrzeug / Kabel (CP-Kurzschluss, 0V)
StatusUnknown ChargeStatus = ""
StatusDisconnected ChargeStatus = "A" // No vehicle connected
StatusConnected ChargeStatus = "B" // Vehicle connected, no charging
StatusCharging ChargeStatus = "C" // Vehicle charging
)

var StatusEasA = map[ChargeStatus]ChargeStatus{StatusE: StatusA}

// ChargeStatusString converts a string to ChargeStatus
// ChargeStatusString converts from IEC 62196 string to ChargeStatus
func ChargeStatusString(status string) (ChargeStatus, error) {
s := strings.ToUpper(strings.Trim(status, "\x00 "))

if len(s) == 0 {
return StatusNone, fmt.Errorf("invalid status: %s", status)
return StatusUnknown, fmt.Errorf("invalid status: %s", status)
}

switch s1 := s[:1]; s1 {
case "A", "B":
return ChargeStatus(s1), nil
case "A":
return StatusDisconnected, nil

case "B":
return StatusConnected, nil

case "C", "D":
if s == "C1" || s == "D1" {
return StatusB, nil
return StatusConnected, nil
}
return StatusC, nil
return StatusCharging, nil

case "E", "F":
return ChargeStatus(s1), fmt.Errorf("invalid status: %s", s)
return StatusUnknown, fmt.Errorf("error status: %s", s)
premultiply marked this conversation as resolved.
Show resolved Hide resolved

default:
return StatusNone, fmt.Errorf("invalid status: %s", status)
}
}

// ChargeStatusStringWithMapping converts a string to ChargeStatus. In case of error, mapping is applied.
func ChargeStatusStringWithMapping(s string, m map[ChargeStatus]ChargeStatus) (ChargeStatus, error) {
status, err := ChargeStatusString(s)
if mappedStatus, ok := m[status]; ok && err != nil {
return mappedStatus, nil
return StatusUnknown, fmt.Errorf("invalid status: %s", status)
}
return status, err
}

// String implements Stringer
Expand Down
2 changes: 1 addition & 1 deletion charger/_blueprint.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func NewBlueprint(uri string, cache time.Duration) (api.Charger, error) {

// Status implements the api.Charger interface
func (wb *Blueprint) Status() (api.ChargeStatus, error) {
return api.StatusNone, api.ErrNotAvailable
return api.StatusUnknown, api.ErrNotAvailable
}

// Enabled implements the api.Charger interface
Expand Down
20 changes: 10 additions & 10 deletions charger/abb.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,31 +110,31 @@ func (wb *ABB) status() (byte, error) {
func (wb *ABB) Status() (api.ChargeStatus, error) {
s, err := wb.status()
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

switch s {
case 0: // State A: Idle
return api.StatusA, nil
return api.StatusDisconnected, nil
case 1: // State B1: EV Plug in, pending authorization
return api.StatusB, nil
return api.StatusConnected, nil
case 2: // State B2: EV Plug in, EVSE ready for charging(PWM)
return api.StatusB, nil
return api.StatusConnected, nil
case 3: // State C1: EV Ready for charge, S2 closed(no PWM)
return api.StatusB, nil
return api.StatusConnected, nil
case 4: // State C2: Charging Contact closed, energy delivering
return api.StatusC, nil
return api.StatusCharging, nil
case 5: // Other: Session stopped
b, err := wb.conn.ReadHoldingRegisters(abbRegSocketLock, 2)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}
if binary.BigEndian.Uint32(b) >= 0x0101 {
return api.StatusB, nil
return api.StatusConnected, nil
}
return api.StatusA, nil
return api.StatusDisconnected, nil
default: // Other
return api.StatusNone, fmt.Errorf("invalid status: %0x", s)
return api.StatusUnknown, fmt.Errorf("invalid status: %0x", s)
}
}

Expand Down
4 changes: 2 additions & 2 deletions charger/abl-em4.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ func (wb *AblEm4) getCurrent() (uint16, error) {
func (wb *AblEm4) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadHoldingRegisters(wb.base+abl4RegStatus, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

r := rune(b[1]>>4-0x0A) + 'A'
Expand All @@ -140,7 +140,7 @@ func (wb *AblEm4) Status() (api.ChargeStatus, error) {
status = string(r)
}

return api.StatusNone, fmt.Errorf("invalid status: %s", status)
return api.StatusUnknown, fmt.Errorf("invalid status: %s", status)
}
}

Expand Down
4 changes: 2 additions & 2 deletions charger/abl.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ func (wb *ABLeMH) get(reg, count uint16) ([]byte, error) {
func (wb *ABLeMH) Status() (api.ChargeStatus, error) {
b, err := wb.get(ablRegStatus, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

r := rune(b[1]>>4-0x0A) + 'A'
Expand All @@ -168,7 +168,7 @@ func (wb *ABLeMH) Status() (api.ChargeStatus, error) {
status = string(r)
}

return api.StatusNone, fmt.Errorf("invalid status: %s", status)
return api.StatusUnknown, fmt.Errorf("invalid status: %s", status)
}
}

Expand Down
5 changes: 3 additions & 2 deletions charger/alfen.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"context"
"encoding/binary"
"math"
"strings"
"sync"
"time"

Expand Down Expand Up @@ -134,10 +135,10 @@ func (wb *Alfen) heartbeat(ctx context.Context) {
func (wb *Alfen) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadHoldingRegisters(alfenRegStatus, 5)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

return api.ChargeStatusStringWithMapping(string(b), api.StatusEasA)
return api.ChargeStatusString(strings.Replace(string(b), "E", "A", 1))
}

// Enabled implements the api.Charger interface
Expand Down
10 changes: 5 additions & 5 deletions charger/alphatec.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,18 +113,18 @@ func (wb *Alphatec) getCurrent() (uint16, error) {
func (wb *Alphatec) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadHoldingRegisters(alphatecRegStatus, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

switch u := binary.BigEndian.Uint16(b); u {
case 1:
return api.StatusA, nil
return api.StatusDisconnected, nil
case 2, 8:
return api.StatusB, nil
return api.StatusConnected, nil
case 3:
return api.StatusC, nil
return api.StatusCharging, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %d", u)
return api.StatusUnknown, fmt.Errorf("invalid status: %d", u)
}
}

Expand Down
16 changes: 8 additions & 8 deletions charger/amperfied.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func (wb *Amperfied) set(reg, val uint16) error {
func (wb *Amperfied) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadInputRegisters(ampRegChargingState, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

sb := binary.BigEndian.Uint16(b)
Expand All @@ -155,33 +155,33 @@ func (wb *Amperfied) Status() (api.ChargeStatus, error) {

switch sb {
case 2, 3:
return api.StatusA, nil
return api.StatusDisconnected, nil
case 4, 5:
return api.StatusB, nil
return api.StatusConnected, nil
case 6, 7:
return api.StatusC, nil
return api.StatusCharging, nil
case 10:
// ensure RemoteLock is disabled after wake-up
b, err := wb.conn.ReadHoldingRegisters(ampRegRemoteLock, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

// unlock
if binary.BigEndian.Uint16(b) != 1 {
if err := wb.set(ampRegRemoteLock, 1); err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}
}

// keep status B2 during wakeup
if wb.wakeup {
return api.StatusB, nil
return api.StatusConnected, nil
}

fallthrough
default:
return api.StatusNone, fmt.Errorf("invalid status: %d", sb)
return api.StatusUnknown, fmt.Errorf("invalid status: %d", sb)
}
}

Expand Down
10 changes: 5 additions & 5 deletions charger/bender.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,18 +154,18 @@ func NewBenderCC(uri string, id uint8) (api.Charger, error) {
func (wb *BenderCC) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadHoldingRegisters(bendRegChargePointState, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

switch s := binary.BigEndian.Uint16(b); s {
case 1:
return api.StatusA, nil
return api.StatusDisconnected, nil
case 2:
return api.StatusB, nil
return api.StatusConnected, nil
case 3, 4:
return api.StatusC, nil
return api.StatusCharging, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %d", s)
return api.StatusUnknown, fmt.Errorf("invalid status: %d", s)
}
}

Expand Down
10 changes: 5 additions & 5 deletions charger/cfos.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,18 +104,18 @@ func NewCfosPowerBrain(uri string, id uint8) (api.Charger, error) {
func (wb *CfosPowerBrain) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadHoldingRegisters(cfosRegStatus, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

switch b[1] {
case 0: // warten
return api.StatusA, nil
return api.StatusDisconnected, nil
case 1: // Fahrzeug erkannt
return api.StatusB, nil
return api.StatusConnected, nil
case 2: // laden
return api.StatusC, nil
return api.StatusCharging, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %d", b[1])
return api.StatusUnknown, fmt.Errorf("invalid status: %d", b[1])
}
}

Expand Down
2 changes: 1 addition & 1 deletion charger/charger.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ func NewConfigurable(
func (m *Charger) Status() (api.ChargeStatus, error) {
s, err := m.statusG()
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

return api.ChargeStatusString(s)
Expand Down
8 changes: 4 additions & 4 deletions charger/connectiq.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,14 +92,14 @@ func (wb *ConnectIq) status() (connectiq.ChargeStatus, error) {
func (wb *ConnectIq) Status() (api.ChargeStatus, error) {
resp, err := wb.status()

res := api.StatusNone
res := api.StatusUnknown
switch resp.Status {
case "ready":
res = api.StatusA
res = api.StatusDisconnected
case "ev":
res = api.StatusB
res = api.StatusConnected
case "charging":
res = api.StatusC
res = api.StatusCharging
default:
if err == nil {
err = fmt.Errorf("invalid status: %s", resp.Status)
Expand Down
10 changes: 5 additions & 5 deletions charger/dadapower.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,18 +103,18 @@ func (wb *Dadapower) heartbeat(ctx context.Context) {
func (wb *Dadapower) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadInputRegisters(dadapowerRegPlugState+wb.regOffset, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

switch status := binary.BigEndian.Uint16(b); status {
case 0x0A: // ready
return api.StatusA, nil
return api.StatusDisconnected, nil
case 0x0B: // EV is present
return api.StatusB, nil
return api.StatusConnected, nil
case 0x0C: // charging
return api.StatusC, nil
return api.StatusCharging, nil
default:
return api.StatusNone, fmt.Errorf("invalid status: %d", status)
return api.StatusUnknown, fmt.Errorf("invalid status: %d", status)
}
}

Expand Down
18 changes: 9 additions & 9 deletions charger/daheimladen-mb.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,30 +160,30 @@ func utf16BytesToString(b []byte, o binary.ByteOrder) string {
func (wb *DaheimLadenMB) Status() (api.ChargeStatus, error) {
b, err := wb.conn.ReadHoldingRegisters(dlRegChargingState, 1)
if err != nil {
return api.StatusNone, err
return api.StatusUnknown, err
}

s := binary.BigEndian.Uint16(b)

switch s {
case 1: // Standby (A)
return api.StatusA, nil
return api.StatusDisconnected, nil
case 2: // Connect (B1)
return api.StatusB, nil
return api.StatusConnected, nil
case 3: // Start-up State (B2)
return api.StatusB, nil
return api.StatusConnected, nil
case 4: // Charging (C)
enabled, err := wb.Enabled()
if !enabled {
return api.StatusB, err
return api.StatusConnected, err
}
return api.StatusC, nil
return api.StatusCharging, nil
case 5: // Start-UP Fail (B2)
return api.StatusB, nil
return api.StatusConnected, nil
case 6: // Session Terminated by EVSE
return api.StatusB, nil
return api.StatusConnected, nil
default: // Other
return api.StatusNone, fmt.Errorf("invalid status: %d", s)
return api.StatusUnknown, fmt.Errorf("invalid status: %d", s)
}
}

Expand Down
Loading
Loading