From b2025383054ec9be63e892a54e0482cc9c8f1b83 Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 29 Aug 2024 20:00:42 +0200 Subject: [PATCH] Ocpp: add StackLevelZero option for ABB (#15801) --- charger/ocpp.go | 43 ++++++++++++---------- charger/ocpp_test.go | 6 +-- templates/definition/charger/ocpp-abb.yaml | 12 ++++++ 3 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 templates/definition/charger/ocpp-abb.yaml diff --git a/charger/ocpp.go b/charger/ocpp.go index c387463e59..baf4f76ec0 100644 --- a/charger/ocpp.go +++ b/charger/ocpp.go @@ -31,6 +31,7 @@ type OCPP struct { meterValuesSample string timeout time.Duration phaseSwitching bool + stackLevelZero bool remoteStart bool hasRemoteTriggerFeature bool chargingRateUnit types.ChargingRateUnitType @@ -64,27 +65,26 @@ func NewOCPPFromConfig(other map[string]interface{}) (api.Charger, error) { ChargingRateUnit string // TODO deprecated AutoStart bool // TODO deprecated NoStop bool // TODO deprecated + StackLevelZero *bool RemoteStart bool }{ - Connector: 1, - IdTag: defaultIdTag, - MeterInterval: 10 * time.Second, - ConnectTimeout: ocppConnectTimeout, - Timeout: ocppTimeout, - ChargingRateUnit: "A", + Connector: 1, + IdTag: defaultIdTag, + MeterInterval: 10 * time.Second, + ConnectTimeout: ocppConnectTimeout, + Timeout: ocppTimeout, } if err := util.DecodeOther(other, &cc); err != nil { return nil, err } - boot := cc.BootNotification != nil && *cc.BootNotification - noConfig := cc.GetConfiguration != nil && !*cc.GetConfiguration + stackLevelZero := cc.StackLevelZero != nil && *cc.StackLevelZero c, err := NewOCPP(cc.StationId, cc.Connector, cc.IdTag, cc.MeterValues, cc.MeterInterval, - boot, noConfig, cc.RemoteStart, - cc.ConnectTimeout, cc.Timeout, cc.ChargingRateUnit) + stackLevelZero, cc.RemoteStart, + cc.ConnectTimeout, cc.Timeout) if err != nil { return c, err } @@ -132,9 +132,8 @@ func NewOCPPFromConfig(other map[string]interface{}) (api.Charger, error) { // NewOCPP creates OCPP charger func NewOCPP(id string, connector int, idtag string, meterValues string, meterInterval time.Duration, - boot, noConfig, remoteStart bool, + stackLevelZero, remoteStart bool, connectTimeout, timeout time.Duration, - chargingRateUnit string, ) (*OCPP, error) { unit := "ocpp" if id != "" { @@ -160,12 +159,13 @@ func NewOCPP(id string, connector int, idtag string, } c := &OCPP{ - log: log, - conn: conn, - idtag: idtag, - remoteStart: remoteStart, + log: log, + conn: conn, + idtag: idtag, + remoteStart: remoteStart, + stackLevelZero: stackLevelZero, - chargingRateUnit: types.ChargingRateUnitType(chargingRateUnit), + chargingRateUnit: "A", hasRemoteTriggerFeature: true, // assume remote trigger feature is available timeout: timeout, } @@ -591,9 +591,8 @@ func (c *OCPP) createTxDefaultChargingProfile(current float64) *types.ChargingPr period.NumberPhases = &phases } - return &types.ChargingProfile{ + res := &types.ChargingProfile{ ChargingProfileId: c.chargingProfileId, - StackLevel: c.stackLevel, ChargingProfilePurpose: types.ChargingProfilePurposeTxDefaultProfile, ChargingProfileKind: types.ChargingProfileKindAbsolute, ChargingSchedule: &types.ChargingSchedule{ @@ -602,6 +601,12 @@ func (c *OCPP) createTxDefaultChargingProfile(current float64) *types.ChargingPr ChargingSchedulePeriod: []types.ChargingSchedulePeriod{period}, }, } + + if !c.stackLevelZero { + res.StackLevel = c.stackLevel + } + + return res } // MaxCurrent implements the api.Charger interface diff --git a/charger/ocpp_test.go b/charger/ocpp_test.go index 2903b839f8..ebf9838923 100644 --- a/charger/ocpp_test.go +++ b/charger/ocpp_test.go @@ -96,7 +96,7 @@ func (suite *ocppTestSuite) TestConnect() { suite.Require().True(cp1.IsConnected()) // 1st charge point- local - c1, err := NewOCPP("test-1", 1, "", "", 0, false, false, true, ocppTestConnectTimeout, ocppTestTimeout, "A") + c1, err := NewOCPP("test-1", 1, "", "", 0, false, true, ocppTestConnectTimeout, ocppTestTimeout) suite.Require().NoError(err) // status and meter values @@ -145,7 +145,7 @@ func (suite *ocppTestSuite) TestConnect() { suite.Require().True(cp2.IsConnected()) // 2nd charge point - local - c2, err := NewOCPP("test-2", 1, "", "", 0, false, false, true, ocppTestConnectTimeout, ocppTestTimeout, "A") + c2, err := NewOCPP("test-2", 1, "", "", 0, false, true, ocppTestConnectTimeout, ocppTestTimeout) suite.Require().NoError(err) { @@ -187,7 +187,7 @@ func (suite *ocppTestSuite) TestAutoStart() { suite.Require().True(cp1.IsConnected()) // 1st charge point- local - c1, err := NewOCPP("test-3", 1, "", "", 0, false, false, false, ocppTestConnectTimeout, ocppTestTimeout, "A") + c1, err := NewOCPP("test-3", 1, "", "", 0, false, false, ocppTestConnectTimeout, ocppTestTimeout) suite.Require().NoError(err) // status and meter values diff --git a/templates/definition/charger/ocpp-abb.yaml b/templates/definition/charger/ocpp-abb.yaml new file mode 100644 index 0000000000..078c94f870 --- /dev/null +++ b/templates/definition/charger/ocpp-abb.yaml @@ -0,0 +1,12 @@ +template: ocpp-abb +products: + - brand: ABB + description: + generic: TerraAC +requirements: + evcc: ["sponsorship"] +params: + - preset: ocpp +render: | + {{ include "ocpp" . }} + stacklevelzero: true