Ocpp: handle trigger responses (#15220)
This commit is contained in:
parent
71eabc228f
commit
f3be63f2d1
6 changed files with 49 additions and 24 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
20
charger/ocpp/helper.go
Normal 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
|
||||
}
|
||||
|
|
@ -49,6 +49,7 @@ func Instance() *CS {
|
|||
log: log,
|
||||
cps: make(map[string]*CP),
|
||||
CentralSystem: cs,
|
||||
timeout: 30 * time.Second,
|
||||
}
|
||||
|
||||
ocppj.SetLogger(instance)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue