Daheimladen: fix hardware check (#32079)
This commit is contained in:
parent
b6a9977ebb
commit
f7af0bbe6a
1 changed files with 35 additions and 8 deletions
|
|
@ -21,12 +21,14 @@ import (
|
|||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/evcc-io/evcc/api"
|
||||
"github.com/evcc-io/evcc/api/implement"
|
||||
"github.com/evcc-io/evcc/util"
|
||||
"github.com/evcc-io/evcc/util/modbus"
|
||||
"github.com/evcc-io/evcc/util/sponsor"
|
||||
)
|
||||
|
||||
// DaheimLaden charger implementation
|
||||
|
|
@ -41,10 +43,13 @@ type DaheimLaden struct {
|
|||
const (
|
||||
dlRegChargingState = 0 // Uint16 RO ENUM
|
||||
dlRegConnectorState = 2 // Uint16 RO ENUM
|
||||
dlRegErrorCode = 4 // Uint16 RO ENUM
|
||||
dlRegCurrents = 6 // 3xUint16 plus placeholder RO 0.1A
|
||||
dlRegActivePower = 12 // Uint32 RO 1W
|
||||
dlRegPowers = 16 // 3xUint32 plus placeholder RO 1W
|
||||
dlRegTotalEnergy = 28 // Uint32 RO 0.1KWh
|
||||
dlRegEvseMaxCurrent = 32 // Uint16 RO 0.1A
|
||||
dlRegEvseMinCurrent = 34 // Uint16 RO 0.1A
|
||||
dlRegCableMaxCurrent = 36 // Uint16 RO 0.1A
|
||||
dlRegStationId = 38 // Chr[16] RO UTF16
|
||||
dlRegCardId = 54 // Chr[16] RO UTF16
|
||||
|
|
@ -92,14 +97,6 @@ func NewDaheimLaden(ctx context.Context, uri string, id uint8, phases bool) (api
|
|||
return nil, err
|
||||
}
|
||||
|
||||
c, err := conn.ReadHoldingRegisters(dlRegStationId, 16)
|
||||
if s, _ := utf16BEBytesAsString(c); err != nil || s == "" || s == "heidelbridge" {
|
||||
if s == "heidelbridge" {
|
||||
return nil, fmt.Errorf("heidelbridge detected: %w", api.ErrSponsorRequired)
|
||||
}
|
||||
return nil, api.ErrSponsorRequired
|
||||
}
|
||||
|
||||
log := util.NewLogger("daheimladen")
|
||||
conn.Logger(log.TRACE)
|
||||
|
||||
|
|
@ -111,6 +108,12 @@ func NewDaheimLaden(ctx context.Context, uri string, id uint8, phases bool) (api
|
|||
phases: 3, // assume 3p
|
||||
}
|
||||
|
||||
if !sponsor.IsAuthorized() {
|
||||
if err := wb.checkStation(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// get initial state from charger
|
||||
curr, err := wb.getCurrent()
|
||||
if err != nil {
|
||||
|
|
@ -357,6 +360,30 @@ func (wb *DaheimLaden) getPhases() (int, error) {
|
|||
return int(wb.phases), nil
|
||||
}
|
||||
|
||||
func (wb *DaheimLaden) checkStation() error {
|
||||
b, err := wb.conn.ReadHoldingRegisters(dlRegEvseMaxCurrent, 22)
|
||||
if err != nil {
|
||||
return api.ErrSponsorRequired
|
||||
}
|
||||
// station id starts (dlRegStationId-dlRegEvseMaxCurrent) registers into the block
|
||||
s, err := utf16BEBytesAsString(b[2*(dlRegStationId-dlRegEvseMaxCurrent):])
|
||||
if err != nil || s == "" {
|
||||
return api.ErrSponsorRequired
|
||||
}
|
||||
|
||||
for _, r := range s {
|
||||
if r < 0x20 || r > 0x7e {
|
||||
return api.ErrSponsorRequired
|
||||
}
|
||||
}
|
||||
|
||||
if strings.Contains(strings.ToLower(s), "heidelbridge") {
|
||||
return api.ErrSponsorRequired
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ api.Diagnosis = (*DaheimLaden)(nil)
|
||||
|
||||
// Diagnose implements the api.Diagnosis interface
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue