Ocpp: handle trigger responses (#15220)

This commit is contained in:
andig 2024-08-04 00:18:58 +02:00 • committed by GitHub
parent 71eabc228f
commit f3be63f2d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 49 additions and 24 deletions

View file

@ -330,15 +330,7 @@ func (c *OCPP) configure(key, val string) error {
// wait waits for a CP roundtrip with timeout
func (c *OCPP) wait(err error, rc chan error) error {
if err == nil {
select {
case err = <-rc:
close(rc)
case <-time.After(c.timeout):
err = api.ErrTimeout
}
}
return err
return ocpp.Wait(err, rc, c.timeout)
}
// Status implements the api.Charger interface

View file

@ -68,8 +68,8 @@ func (conn *Connector) IdTag() string {
return conn.idTag
}
func (conn *Connector) TriggerMessageRequest(feature remotetrigger.MessageTrigger, f ...func(request *remotetrigger.TriggerMessageRequest)) {
Instance().TriggerMessageRequest(conn.cp.ID(), feature, func(request *remotetrigger.TriggerMessageRequest) {
func (conn *Connector) TriggerMessageRequest(feature remotetrigger.MessageTrigger, f ...func(request *remotetrigger.TriggerMessageRequest)) error {
return Instance().TriggerMessageRequest(conn.cp.ID(), feature, func(request *remotetrigger.TriggerMessageRequest) {
request.ConnectorId = &conn.id
for _, f := range f {
f(request)

View file

@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"sync"
"time"
"github.com/evcc-io/evcc/util"
ocpp16 "github.com/lorenzodonini/ocpp-go/ocpp1.6"
@ -13,7 +14,8 @@ type CS struct {
mu sync.Mutex
log *util.Logger
ocpp16.CentralSystem
cps map[string]*CP
cps map[string]*CP
timeout time.Duration
}
// Register registers a charge point with the central system.

View file

@ -1,6 +1,8 @@
package ocpp
import (
"errors"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/core"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/firmware"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/remotetrigger"
@ -8,24 +10,32 @@ import (
// cs actions
func (cs *CS) TriggerResetRequest(id string, resetType core.ResetType) {
if err := cs.Reset(id, func(request *core.ResetConfirmation, err error) {
func (cs *CS) TriggerResetRequest(id string, resetType core.ResetType) error {
rc := make(chan error, 1)
err := cs.Reset(id, func(request *core.ResetConfirmation, err error) {
if err == nil && request != nil && request.Status != core.ResetStatusAccepted {
cs.log.ERROR.Printf("TriggerReset for %s: %+v", id, request.Status)
err = errors.New(string(request.Status))
}
}, resetType); err != nil {
cs.log.ERROR.Printf("send TriggerReset for %s failed: %v", id, err)
}
rc <- err
}, resetType)
return Wait(err, rc, cs.timeout)
}
func (cs *CS) TriggerMessageRequest(id string, requestedMessage remotetrigger.MessageTrigger, props ...func(request *remotetrigger.TriggerMessageRequest)) {
if err := cs.TriggerMessage(id, func(request *remotetrigger.TriggerMessageConfirmation, err error) {
func (cs *CS) TriggerMessageRequest(id string, requestedMessage remotetrigger.MessageTrigger, props ...func(request *remotetrigger.TriggerMessageRequest)) error {
rc := make(chan error, 1)
err := cs.TriggerMessage(id, func(request *remotetrigger.TriggerMessageConfirmation, err error) {
if err == nil && request != nil && request.Status != remotetrigger.TriggerMessageStatusAccepted {
cs.log.ERROR.Printf("TriggerMessage %s for %s: %+v", requestedMessage, id, request.Status)
err = errors.New(string(request.Status))
}
}, requestedMessage, props...); err != nil {
cs.log.ERROR.Printf("send TriggerMessage %s for %s failed: %v", requestedMessage, id, err)
}
rc <- err
}, requestedMessage, props...)
return Wait(err, rc, cs.timeout)
}
// cp actions

20
charger/ocpp/helper.go Normal file
View file

@ -0,0 +1,20 @@
package ocpp
import (
"time"
"github.com/evcc-io/evcc/api"
)
// Wait waits for a CP roundtrip with timeout
func Wait(err error, rc chan error, timeout time.Duration) error {
if err == nil {
select {
case err = <-rc:
close(rc)
case <-time.After(timeout):
err = api.ErrTimeout
}
}
return err
}

View file

@ -49,6 +49,7 @@ func Instance() *CS {
log: log,
cps: make(map[string]*CP),
CentralSystem: cs,
timeout: 30 * time.Second,
}
ocppj.SetLogger(instance)