From f7af0bbe6ae24a0e223adbcd548c0e76ee64259f Mon Sep 17 00:00:00 2001 From: premultiply <4681172+premultiply@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:19:07 +0200 Subject: [PATCH] Daheimladen: fix hardware check (#32079) --- charger/daheimladen.go | 43 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/charger/daheimladen.go b/charger/daheimladen.go index 75ba90cef..7e2b8420b 100644 --- a/charger/daheimladen.go +++ b/charger/daheimladen.go @@ -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