diff --git a/charger/versicharge.go b/charger/versicharge.go index ad411207e..edac81d64 100644 --- a/charger/versicharge.go +++ b/charger/versicharge.go @@ -38,9 +38,8 @@ const ( versiRegMeterType = 30 // 1 RO UINT16 versiRegErrorCode = 1600 // 1 RO INT16 versiRegTemp = 1602 // 1 RO INT16 - versiRegChargeStatus = 1601 // 1 RO INT16 - versiRegPause = 1629 // 1 RW UNIT16 - versiRegMaxCurrent = 1633 // 1 RW UNIT16 + versiRegChargeStatus = 1599 // 1 RO INT16 (EVSE Status) + versiRegMaxCurrent = 1633 // 1 RW UNIT16 -> Seit FW2.128 Pause an -> MaxCurrent = 0 versiRegCurrents = 1647 // 3 RO UINT16 versiRegVoltages = 1651 // 3 RO UINT16 versiRegPowers = 1662 // 3 RO UINT16 @@ -51,7 +50,8 @@ const ( // It uses Modbus TCP to communicate with the wallbox at id 2 (default). type Versicharge struct { - conn *modbus.Connection + conn *modbus.Connection + current uint16 } func init() { @@ -99,38 +99,27 @@ func (wb *Versicharge) Status() (api.ChargeStatus, error) { return api.StatusNone, err } - s := binary.BigEndian.Uint16(b) - - switch s { - case 1: // Available - return api.StatusA, nil - case 2, 5: // Preparing, Suspended EV, Suspended EVSE - return api.StatusB, nil - case 3, 4: // Charging - return api.StatusC, nil - default: - return api.StatusNone, fmt.Errorf("invalid status: %d", s) - } + return api.ChargeStatusString(string(b)) } // Enabled implements the api.Charger interface func (wb *Versicharge) Enabled() (bool, error) { - b, err := wb.conn.ReadHoldingRegisters(versiRegPause, 1) + b, err := wb.conn.ReadHoldingRegisters(versiRegMaxCurrent, 1) if err != nil { return false, err } - return binary.BigEndian.Uint16(b) == 2, nil + return binary.BigEndian.Uint16(b) != 0, nil } // Enable implements the api.Charger interface func (wb *Versicharge) Enable(enable bool) error { - var u uint16 = 1 + var u uint16 = 0 if enable { - u = 2 + u = wb.current } - _, err := wb.conn.WriteSingleRegister(versiRegPause, u) + _, err := wb.conn.WriteSingleRegister(versiRegMaxCurrent, u) return err } @@ -142,6 +131,9 @@ func (wb *Versicharge) MaxCurrent(current int64) error { } _, err := wb.conn.WriteSingleRegister(versiRegMaxCurrent, uint16(current)) + if err == nil { + wb.current = uint16(current) + } return err }