From 7b01721ff37c4ae893d26122e30bd670b686624f Mon Sep 17 00:00:00 2001 From: StefanSchoof <4662023+StefanSchoof@users.noreply.github.com> Date: Sat, 7 Sep 2024 14:13:27 +0200 Subject: [PATCH 1/4] Vzlogger: add phase values (#15935) --- templates/definition/meter/vzlogger.yaml | 81 ++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/templates/definition/meter/vzlogger.yaml b/templates/definition/meter/vzlogger.yaml index 31e82cc0d..e7148baef 100644 --- a/templates/definition/meter/vzlogger.yaml +++ b/templates/definition/meter/vzlogger.yaml @@ -20,6 +20,51 @@ params: help: de: Multipliziere Rohwert mit diesem Faktor en: Multiply by this value + - name: l1currentuuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Strom in Phase 1 (OBIS Code 31.7.0) + en: The vzlogger channel uuid for current on phase 1 (OBIS Code 31.7.0) + - name: l2currentuuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Strom in Phase 2 (OBIS Code 51.7.0) + en: The vzlogger channel uuid for current on phase 2 (OBIS Code 51.7.0) + - name: l3currentuuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Strom in Phase 3 (OBIS Code 71.7.0) + en: The vzlogger channel uuid for current on phase 3 (OBIS Code 71.7.0) + - name: l1poweruuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Leistung in Phase 1 (OBIS Code 16.7.0) + en: The vzlogger channel uuid for power on phase 1 (OBIS Code 16.7.0) + - name: l2poweruuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Leistung in Phase 2 (OBIS Code 36.7.0) + en: The vzlogger channel uuid for power on phase 2 (OBIS Code 36.7.0) + - name: l3poweruuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Leistung in Phase 3 (OBIS Code 56.7.0) + en: The vzlogger channel uuid for power on phase 3 (OBIS Code 56.7.0) + - name: l1voltageuuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Spannung in Phase 1 (OBIS Code 32.7.0) + en: The vzlogger channel uuid for voltage on phase 1 (OBIS Code 32.7.0) + - name: l2voltageuuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Spannung in Phase 2 (OBIS Code 52.7.0) + en: The vzlogger channel uuid for voltage on phase 2 (OBIS Code 52.7.0) + - name: l3voltageuuid + advanced: true + description: + de: Die vzlogger Kanal uuid für Spannung in Phase 3 (OBIS Code 72.7.0) + en: The vzlogger channel uuid for voltage on phase 3 (OBIS Code 72.7.0) render: | type: custom power: # power reading @@ -29,3 +74,39 @@ render: | {{- if .scale }} scale: {{ .scale }} {{- end }} + {{ if and .l1currentuuid .l2currentuuid .l3currentuuid -}} + currents: + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l1currentuuid) }}) | .tuples[0][1] + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l2currentuuid) }}) | .tuples[0][1] + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l3currentuuid) }}) | .tuples[0][1] + {{ end -}} + {{ if and .l1poweruuid .l2poweruuid .l3poweruuid -}} + powers: + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l1poweruuid) }}) | .tuples[0][1] + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l2poweruuid) }}) | .tuples[0][1] + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l3poweruuid) }}) | .tuples[0][1] + {{ end -}} + {{ if and .l1voltageuuid .l2voltageuuid .l3voltageuuid -}} + voltages: + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l1voltageuuid) }}) | .tuples[0][1] + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l2voltageuuid) }}) | .tuples[0][1] + - source: http + uri: http://{{ .host }}:{{ .port }}/ + jq: .data[] | select(.uuid=={{ quote (trimAll "'" .l3voltageuuid) }}) | .tuples[0][1] + {{ end -}} From cf7547e3df8387095f78c187c1048cbb1d85cb85 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 7 Sep 2024 14:17:19 +0200 Subject: [PATCH 2/4] Ocpp: allow "disable" to override meter value sample (#15925) --- charger/ocpp/cp_setup.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/charger/ocpp/cp_setup.go b/charger/ocpp/cp_setup.go index d21b27b2d..637b8b536 100644 --- a/charger/ocpp/cp_setup.go +++ b/charger/ocpp/cp_setup.go @@ -19,7 +19,6 @@ func (cp *CP) Setup(meterValues string, meterInterval time.Duration) error { cp.log.DEBUG.Printf("failed configuring availability: %v", err) } - var meterValuesSampledData string meterValuesSampledDataMaxLength := len(strings.Split(desiredMeasurands, ",")) resp, err := cp.GetConfiguration() @@ -58,7 +57,7 @@ func (cp *CP) Setup(meterValues string, meterInterval time.Duration) error { if opt.Readonly { meterValuesSampledDataMaxLength = 0 } - meterValuesSampledData = *opt.Value + cp.meterValuesSample = *opt.Value case KeyMeterValuesSampledDataMaxLength: if val, err := strconv.Atoi(*opt.Value); err == nil { @@ -113,13 +112,13 @@ func (cp *CP) Setup(meterValues string, meterInterval time.Duration) error { // configure measurands if meterValues != "" { - if err := cp.configure(KeyMeterValuesSampledData, meterValues); err == nil { - meterValuesSampledData = meterValues + if err := cp.configure(KeyMeterValuesSampledData, meterValues); err == nil || meterValues == "disable" { + cp.meterValuesSample = meterValues + } else { + cp.log.WARN.Printf("failed configuring %s: %v", KeyMeterValuesSampledData, err) } } - cp.meterValuesSample = meterValuesSampledData - // trigger initial meter values if cp.HasRemoteTriggerFeature { if err := Instance().TriggerMessageRequest(cp.ID(), core.MeterValuesFeatureName); err == nil { @@ -135,13 +134,13 @@ func (cp *CP) Setup(meterValues string, meterInterval time.Duration) error { // configure sample rate if meterInterval > 0 { if err := cp.configure(KeyMeterValueSampleInterval, strconv.Itoa(int(meterInterval.Seconds()))); err != nil { - cp.log.WARN.Printf("failed configuring MeterValueSampleInterval: %v", err) + cp.log.WARN.Printf("failed configuring %s: %v", KeyMeterValueSampleInterval, err) } } // configure websocket ping interval if err := cp.configure(KeyWebSocketPingInterval, "30"); err != nil { - cp.log.DEBUG.Printf("failed configuring WebSocketPingInterval: %v", err) + cp.log.DEBUG.Printf("failed configuring %s: %v", KeyWebSocketPingInterval, err) } return nil From 8dd0238a60609a7869a2916f9222eaaf7111fe9f Mon Sep 17 00:00:00 2001 From: premultiply <4681172+premultiply@users.noreply.github.com> Date: Sat, 7 Sep 2024 14:19:58 +0200 Subject: [PATCH 3/4] Ocpp: always send confirmation (#15945) --- charger/ocpp/cp_core.go | 57 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/charger/ocpp/cp_core.go b/charger/ocpp/cp_core.go index ddb6dcb8a..6b7054b94 100644 --- a/charger/ocpp/cp_core.go +++ b/charger/ocpp/cp_core.go @@ -46,18 +46,6 @@ func (cp *CP) FirmwareStatusNotification(request *firmware.FirmwareStatusNotific return new(firmware.FirmwareStatusNotificationConfirmation), nil } -func (cp *CP) StatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) { - if request == nil { - return nil, ErrInvalidRequest - } - - if conn := cp.connectorByID(request.ConnectorId); conn != nil { - return conn.StatusNotification(request) - } - - return new(core.StatusNotificationConfirmation), nil -} - func (cp *CP) DataTransfer(request *core.DataTransferRequest) (*core.DataTransferConfirmation, error) { res := &core.DataTransferConfirmation{ Status: core.DataTransferStatusAccepted, @@ -74,6 +62,18 @@ func (cp *CP) Heartbeat(request *core.HeartbeatRequest) (*core.HeartbeatConfirma return res, nil } +func (cp *CP) StatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) { + if request == nil { + return nil, ErrInvalidRequest + } + + if conn := cp.connectorByID(request.ConnectorId); conn != nil { + return conn.StatusNotification(request) + } + + return new(core.StatusNotificationConfirmation), nil +} + func (cp *CP) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) { if request == nil { return nil, ErrInvalidRequest @@ -85,12 +85,11 @@ func (cp *CP) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesCo default: } - conn := cp.connectorByID(request.ConnectorId) - if conn == nil { - return nil, ErrInvalidConnector + if conn := cp.connectorByID(request.ConnectorId); conn != nil { + conn.MeterValues(request) } - return conn.MeterValues(request) + return new(core.MeterValuesConfirmation), nil } func (cp *CP) StartTransaction(request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) { @@ -98,12 +97,11 @@ func (cp *CP) StartTransaction(request *core.StartTransactionRequest) (*core.Sta return nil, ErrInvalidRequest } - conn := cp.connectorByID(request.ConnectorId) - if conn == nil { - return nil, ErrInvalidConnector + if conn := cp.connectorByID(request.ConnectorId); conn != nil { + return conn.StartTransaction(request) } - return conn.StartTransaction(request) + return new(core.StartTransactionConfirmation), nil } func (cp *CP) StopTransaction(request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) { @@ -111,16 +109,15 @@ func (cp *CP) StopTransaction(request *core.StopTransactionRequest) (*core.StopT return nil, ErrInvalidRequest } - conn := cp.connectorByTransactionID(request.TransactionId) - if conn == nil { - res := &core.StopTransactionConfirmation{ - IdTagInfo: &types.IdTagInfo{ - Status: types.AuthorizationStatusAccepted, // accept old pending stop message during startup - }, - } - - return res, nil + if conn := cp.connectorByTransactionID(request.TransactionId); conn != nil { + return conn.StopTransaction(request) } - return conn.StopTransaction(request) + res := &core.StopTransactionConfirmation{ + IdTagInfo: &types.IdTagInfo{ + Status: types.AuthorizationStatusAccepted, // accept old pending stop message during startup + }, + } + + return res, nil } From f2337a08961d76e215015bb4a87a6912583e4231 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 7 Sep 2024 14:22:46 +0200 Subject: [PATCH 4/4] Revert "Ocpp: always send confirmation (#15945)" This reverts commit 8dd0238a60609a7869a2916f9222eaaf7111fe9f. --- charger/ocpp/cp_core.go | 57 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/charger/ocpp/cp_core.go b/charger/ocpp/cp_core.go index 6b7054b94..ddb6dcb8a 100644 --- a/charger/ocpp/cp_core.go +++ b/charger/ocpp/cp_core.go @@ -46,6 +46,18 @@ func (cp *CP) FirmwareStatusNotification(request *firmware.FirmwareStatusNotific return new(firmware.FirmwareStatusNotificationConfirmation), nil } +func (cp *CP) StatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) { + if request == nil { + return nil, ErrInvalidRequest + } + + if conn := cp.connectorByID(request.ConnectorId); conn != nil { + return conn.StatusNotification(request) + } + + return new(core.StatusNotificationConfirmation), nil +} + func (cp *CP) DataTransfer(request *core.DataTransferRequest) (*core.DataTransferConfirmation, error) { res := &core.DataTransferConfirmation{ Status: core.DataTransferStatusAccepted, @@ -62,18 +74,6 @@ func (cp *CP) Heartbeat(request *core.HeartbeatRequest) (*core.HeartbeatConfirma return res, nil } -func (cp *CP) StatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) { - if request == nil { - return nil, ErrInvalidRequest - } - - if conn := cp.connectorByID(request.ConnectorId); conn != nil { - return conn.StatusNotification(request) - } - - return new(core.StatusNotificationConfirmation), nil -} - func (cp *CP) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) { if request == nil { return nil, ErrInvalidRequest @@ -85,11 +85,12 @@ func (cp *CP) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesCo default: } - if conn := cp.connectorByID(request.ConnectorId); conn != nil { - conn.MeterValues(request) + conn := cp.connectorByID(request.ConnectorId) + if conn == nil { + return nil, ErrInvalidConnector } - return new(core.MeterValuesConfirmation), nil + return conn.MeterValues(request) } func (cp *CP) StartTransaction(request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) { @@ -97,11 +98,12 @@ func (cp *CP) StartTransaction(request *core.StartTransactionRequest) (*core.Sta return nil, ErrInvalidRequest } - if conn := cp.connectorByID(request.ConnectorId); conn != nil { - return conn.StartTransaction(request) + conn := cp.connectorByID(request.ConnectorId) + if conn == nil { + return nil, ErrInvalidConnector } - return new(core.StartTransactionConfirmation), nil + return conn.StartTransaction(request) } func (cp *CP) StopTransaction(request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) { @@ -109,15 +111,16 @@ func (cp *CP) StopTransaction(request *core.StopTransactionRequest) (*core.StopT return nil, ErrInvalidRequest } - if conn := cp.connectorByTransactionID(request.TransactionId); conn != nil { - return conn.StopTransaction(request) + conn := cp.connectorByTransactionID(request.TransactionId) + if conn == nil { + res := &core.StopTransactionConfirmation{ + IdTagInfo: &types.IdTagInfo{ + Status: types.AuthorizationStatusAccepted, // accept old pending stop message during startup + }, + } + + return res, nil } - res := &core.StopTransactionConfirmation{ - IdTagInfo: &types.IdTagInfo{ - Status: types.AuthorizationStatusAccepted, // accept old pending stop message during startup - }, - } - - return res, nil + return conn.StopTransaction(request) }