From 6e8761ebba429c8dee080e47a819b060bc7aeaba Mon Sep 17 00:00:00 2001 From: premultiply <4681172+premultiply@users.noreply.github.com> Date: Sun, 23 Mar 2025 11:33:03 +0100 Subject: [PATCH] Add Huawei SCharger-7KS-S0 / 22KT-S0 (#19001) --- charger/ocpp.go | 14 ++++---------- charger/ocpp/cp_setup.go | 7 ++++++- charger/ocpp_test.go | 8 ++++---- templates/definition/charger/ocpp-huawei.yaml | 12 ++++++++++++ 4 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 templates/definition/charger/ocpp-huawei.yaml diff --git a/charger/ocpp.go b/charger/ocpp.go index 9abd476f7..dd12922d3 100644 --- a/charger/ocpp.go +++ b/charger/ocpp.go @@ -71,6 +71,7 @@ func NewOCPPFromConfig(ctx context.Context, other map[string]interface{}) (api.C AutoStart bool // TODO deprecated NoStop bool // TODO deprecated + ForcePowerCtrl bool StackLevelZero *bool RemoteStart bool }{ @@ -88,7 +89,7 @@ func NewOCPPFromConfig(ctx context.Context, other map[string]interface{}) (api.C c, err := NewOCPP(ctx, cc.StationId, cc.Connector, cc.IdTag, cc.MeterValues, cc.MeterInterval, - stackLevelZero, cc.RemoteStart, + cc.ForcePowerCtrl, stackLevelZero, cc.RemoteStart, cc.ConnectTimeout) if err != nil { return c, err @@ -142,7 +143,7 @@ func NewOCPPFromConfig(ctx context.Context, other map[string]interface{}) (api.C func NewOCPP(ctx context.Context, id string, connector int, idTag string, meterValues string, meterInterval time.Duration, - stackLevelZero, remoteStart bool, + forcePowerCtrl, stackLevelZero, remoteStart bool, connectTimeout time.Duration, ) (*OCPP, error) { log := util.NewLogger(fmt.Sprintf("%s-%d", lo.CoalesceOrEmpty(id, "ocpp"), connector)) @@ -162,7 +163,7 @@ func NewOCPP(ctx context.Context, case <-cp.HasConnected(): } - return cp.Setup(ctx, meterValues, meterInterval) + return cp.Setup(ctx, meterValues, meterInterval, forcePowerCtrl) }, ) if err != nil { @@ -315,13 +316,6 @@ func (c *OCPP) createTxDefaultChargingProfile(current float64) *types.ChargingPr period := types.NewChargingSchedulePeriod(0, current) if c.cp.ChargingRateUnit == types.ChargingRateUnitWatts { - // get (expectedly) active phases from loadpoint - if c.lp != nil { - phases = c.lp.GetPhases() - } - if phases == 0 { - phases = 3 - } period = types.NewChargingSchedulePeriod(0, math.Trunc(230.0*current*float64(phases))) } else { // OCPP assumes phases == 3 if not set diff --git a/charger/ocpp/cp_setup.go b/charger/ocpp/cp_setup.go index f9652d237..fbc6389c8 100644 --- a/charger/ocpp/cp_setup.go +++ b/charger/ocpp/cp_setup.go @@ -13,7 +13,7 @@ import ( "github.com/samber/lo" ) -func (cp *CP) Setup(ctx context.Context, meterValues string, meterInterval time.Duration) error { +func (cp *CP) Setup(ctx context.Context, meterValues string, meterInterval time.Duration, forcePowerCtrl bool) error { if err := cp.ChangeAvailabilityRequest(0, core.AvailabilityTypeOperative); err != nil { cp.log.DEBUG.Printf("failed configuring availability: %v", err) } @@ -159,6 +159,11 @@ func (cp *CP) Setup(ctx context.Context, meterValues string, meterInterval time. cp.log.DEBUG.Printf("failed configuring %s: %v", KeyWebSocketPingInterval, err) } + if forcePowerCtrl { + cp.ChargingRateUnit = types.ChargingRateUnitWatts + cp.PhaseSwitching = true // assume phase switching is available for power-based charging + } + return nil } diff --git a/charger/ocpp_test.go b/charger/ocpp_test.go index 4dbc72bde..79753515b 100644 --- a/charger/ocpp_test.go +++ b/charger/ocpp_test.go @@ -113,7 +113,7 @@ func (suite *ocppTestSuite) TestConnect() { suite.Require().True(cp1.IsConnected()) // 1st charge point- local - c1, err := NewOCPP(context.TODO(), "test-1", 1, "", "", 0, false, true, ocppTestConnectTimeout) + c1, err := NewOCPP(context.TODO(), "test-1", 1, "", "", 0, false, false, true, ocppTestConnectTimeout) suite.Require().NoError(err) // status and meter values @@ -162,7 +162,7 @@ func (suite *ocppTestSuite) TestConnect() { suite.Require().True(cp2.IsConnected()) // 2nd charge point - local - c2, err := NewOCPP(context.TODO(), "test-2", 1, "", "", 0, false, true, ocppTestConnectTimeout) + c2, err := NewOCPP(context.TODO(), "test-2", 1, "", "", 0, false, false, true, ocppTestConnectTimeout) suite.Require().NoError(err) { @@ -204,7 +204,7 @@ func (suite *ocppTestSuite) TestAutoStart() { suite.Require().True(cp1.IsConnected()) // 1st charge point- local - c1, err := NewOCPP(context.TODO(), "test-3", 1, "", "", 0, false, false, ocppTestConnectTimeout) + c1, err := NewOCPP(context.TODO(), "test-3", 1, "", "", 0, false, false, false, ocppTestConnectTimeout) suite.Require().NoError(err) // status and meter values @@ -251,7 +251,7 @@ func (suite *ocppTestSuite) TestTimeout() { }) // 1st charge point- local - _, err := NewOCPP(context.TODO(), "test-4", 1, "", "", 0, false, false, ocppTestConnectTimeout) + _, err := NewOCPP(context.TODO(), "test-4", 1, "", "", 0, false, false, false, ocppTestConnectTimeout) suite.Require().NoError(err) } diff --git a/templates/definition/charger/ocpp-huawei.yaml b/templates/definition/charger/ocpp-huawei.yaml new file mode 100644 index 000000000..ef59da998 --- /dev/null +++ b/templates/definition/charger/ocpp-huawei.yaml @@ -0,0 +1,12 @@ +template: ocpp-huawei +products: + - brand: Huawei + description: + generic: SCharger-7KS-S0 / 22KT-S0 +requirements: + evcc: ["sponsorship", "skiptest"] +params: + - preset: ocpp +render: | + {{ include "ocpp" . }} + forcepowerctrl: true