Daheimladen: fix hardware check (#32079)

This commit is contained in:
premultiply 2026-07-23 13:19:07 +02:00 • committed by GitHub
parent b6a9977ebb
commit f7af0bbe6a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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