Skip to content

Commit

Permalink
Merge branch 'master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
dniakamal committed Sep 23, 2024
2 parents 2d51e96 + fa5af2d commit d74b0be
Show file tree
Hide file tree
Showing 26 changed files with 607 additions and 405 deletions.
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,5 @@ patch-asn1::

upgrade::
$(shell go list -u -f '{{if (and (not (or .Main .Indirect)) .Update)}}{{.Path}}{{end}}' -m all | xargs go get)
go get modernc.org/sqlite@latest
go mod tidy
10 changes: 4 additions & 6 deletions charger/eebus.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,8 @@ func (c *EEBus) UseCaseEvent(device spineapi.DeviceRemoteInterface, entity spine
c.ev = nil

case evcem.DataUpdateCurrentPerPhase:
// if there was a limit change before this measurement, set its update time to zero, as we got what we needed
if !c.limitUpdated.IsZero() {
c.limitUpdated = time.Time{}
}
// acknowledge limit change
c.limitUpdated = time.Time{}
}
}

Expand Down Expand Up @@ -574,14 +572,14 @@ func (c *EEBus) currents() (float64, float64, float64, error) {
}

c.mux.Lock()
lu := c.limitUpdated
ts := c.limitUpdated
c.mux.Unlock()

// if the last limit update is not zero (meaning no measurement was provided yet)
// only consider this an error, if the last limit update is older than 15 seconds
// this covers the case where this function may be called shortly after setting a limit
// but too short for a measurement can even be received
if d := time.Now().Sub(lu); d > 15*time.Second && !lu.IsZero() {
if d := time.Now().Sub(ts); d > 15*time.Second && !ts.IsZero() {
return 0, 0, 0, api.ErrNotAvailable
}

Expand Down
46 changes: 19 additions & 27 deletions charger/ocpp.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,34 +120,26 @@ func NewOCPP(id string, connector int, idTag string,
stackLevelZero, remoteStart bool,
connectTimeout time.Duration,
) (*OCPP, error) {
unit := "ocpp"
if id != "" {
unit = id
}
unit = fmt.Sprintf("%s-%d", unit, connector)

log := util.NewLogger(unit)

cp, err := ocpp.Instance().ChargepointByID(id)
if err != nil {
cp = ocpp.NewChargePoint(log, id)
log := util.NewLogger(fmt.Sprintf("%s-%d", lo.CoalesceOrEmpty(id, "ocpp"), connector))

// should not error
if err := ocpp.Instance().Register(id, cp); err != nil {
return nil, err
}

log.DEBUG.Printf("waiting for chargepoint: %v", connectTimeout)
cp, err := ocpp.Instance().RegisterChargepoint(id,
func() *ocpp.CP {
return ocpp.NewChargePoint(log, id)
},
func(cp *ocpp.CP) error {
log.DEBUG.Printf("waiting for chargepoint: %v", connectTimeout)

select {
case <-time.After(connectTimeout):
return nil, api.ErrTimeout
case <-cp.HasConnected():
}
select {
case <-time.After(connectTimeout):
return api.ErrTimeout
case <-cp.HasConnected():
}

if err := cp.Setup(meterValues, meterInterval); err != nil {
return nil, err
}
return cp.Setup(meterValues, meterInterval)
},
)
if err != nil {
return nil, err
}

if cp.NumberOfConnectors > 0 && connector > cp.NumberOfConnectors {
Expand Down Expand Up @@ -290,7 +282,7 @@ func (c *OCPP) Enable(enable bool) error {

// setCurrent sets the TxDefaultChargingProfile with given current
func (c *OCPP) setCurrent(current float64) error {
err := c.conn.SetChargingProfile(c.createTxDefaultChargingProfile(math.Trunc(10*current) / 10))
err := c.conn.SetChargingProfileRequest(c.createTxDefaultChargingProfile(math.Trunc(10*current) / 10))
if err != nil {
err = fmt.Errorf("set charging profile: %w", err)
}
Expand Down Expand Up @@ -381,7 +373,7 @@ func (c *OCPP) Diagnose() {
}

fmt.Printf("\tConfiguration:\n")
if resp, err := c.cp.GetConfiguration(); err == nil {
if resp, err := c.cp.GetConfigurationRequest(); err == nil {
// sort configuration keys for printing
slices.SortFunc(resp.ConfigurationKey, func(i, j core.ConfigurationKey) int {
return cmp.Compare(i.Key, j.Key)
Expand Down
37 changes: 2 additions & 35 deletions charger/ocpp/connector.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package ocpp

import (
"errors"
"fmt"
"strconv"
"strings"
Expand All @@ -12,7 +11,6 @@ import (
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/core"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/remotetrigger"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/types"
)

Expand Down Expand Up @@ -66,40 +64,9 @@ func (conn *Connector) IdTag() string {
return conn.idTag
}

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)
}
})
}

func (conn *Connector) remoteStartTransactionRequest() {
rc := make(chan error, 1)
err := Instance().RemoteStartTransaction(conn.cp.ID(), func(resp *core.RemoteStartTransactionConfirmation, err error) {
if err == nil && resp != nil && resp.Status != types.RemoteStartStopStatusAccepted {
err = errors.New(string(resp.Status))
}

rc <- err
}, conn.remoteIdTag, func(request *core.RemoteStartTransactionRequest) {
connector := conn.id
request.ConnectorId = &connector
})

if err := wait(err, rc); err != nil {
conn.log.ERROR.Printf("failed to start remote transaction: %v", err)
}
}

func (conn *Connector) SetChargingProfile(profile *types.ChargingProfile) error {
return Instance().SetChargingProfileRequest(conn.cp.ID(), conn.id, profile)
}

// getScheduleLimit queries the current or power limit the charge point is currently set to offer
func (conn *Connector) GetScheduleLimit(duration int) (float64, error) {
schedule, err := Instance().GetCompositeScheduleRequest(conn.cp.ID(), conn.id, duration)
schedule, err := conn.cp.GetCompositeScheduleRequest(conn.id, duration)
if err != nil {
return 0, err
}
Expand Down Expand Up @@ -219,7 +186,7 @@ func (conn *Connector) GetMaxCurrent() (float64, error) {

if m, ok := conn.measurements[types.MeasurandCurrentOffered]; ok {
f, err := strconv.ParseFloat(m.Value, 64)
return scale(f, m.Unit) / 1e3, err
return scale(f, m.Unit), err
}

return 0, api.ErrNotAvailable
Expand Down
12 changes: 6 additions & 6 deletions charger/ocpp/connector_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func (conn *Connector) timestampValid(t time.Time) bool {
return !t.Before(conn.status.Timestamp.Time)
}

func (conn *Connector) StatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) {
func (conn *Connector) OnStatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) {
conn.mu.Lock()
defer conn.mu.Unlock()

Expand All @@ -39,7 +39,7 @@ func (conn *Connector) StatusNotification(request *core.StatusNotificationReques

if conn.isWaitingForAuth() {
if conn.remoteIdTag != "" {
conn.remoteStartTransactionRequest()
conn.RemoteStartTransactionRequest(conn.remoteIdTag)
} else {
conn.log.DEBUG.Printf("waiting for local authentication")
}
Expand All @@ -56,7 +56,7 @@ func getSampleKey(s types.SampledValue) types.Measurand {
return s.Measurand
}

func (conn *Connector) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) {
func (conn *Connector) OnMeterValues(request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) {
conn.mu.Lock()
defer conn.mu.Unlock()

Expand Down Expand Up @@ -87,11 +87,11 @@ func (conn *Connector) MeterValues(request *core.MeterValuesRequest) (*core.Mete
return new(core.MeterValuesConfirmation), nil
}

func (conn *Connector) StartTransaction(request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) {
func (conn *Connector) OnStartTransaction(request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) {
conn.mu.Lock()
defer conn.mu.Unlock()

conn.txnId = instance.NewTransactionID()
conn.txnId = int(instance.txnId.Add(1))
conn.idTag = request.IdTag

res := &core.StartTransactionConfirmation{
Expand Down Expand Up @@ -124,7 +124,7 @@ func (conn *Connector) assumeMeterStopped() {
}
}

func (conn *Connector) StopTransaction(request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) {
func (conn *Connector) OnStopTransaction(request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) {
conn.mu.Lock()
defer conn.mu.Unlock()

Expand Down
28 changes: 28 additions & 0 deletions charger/ocpp/connector_requests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ocpp

import (
"github.com/lorenzodonini/ocpp-go/ocpp1.6/core"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/remotetrigger"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/smartcharging"
"github.com/lorenzodonini/ocpp-go/ocpp1.6/types"
)

func (conn *Connector) ChangeAvailabilityRequest(availabilityType core.AvailabilityType) error {
return conn.cp.ChangeAvailabilityRequest(conn.id, availabilityType)
}

func (conn *Connector) GetCompositeScheduleRequest(duration int) (*smartcharging.GetCompositeScheduleConfirmation, error) {
return conn.cp.GetCompositeScheduleRequest(conn.id, duration)
}

func (conn *Connector) RemoteStartTransactionRequest(idTag string) error {
return conn.cp.RemoteStartTransactionRequest(conn.id, idTag)
}

func (conn *Connector) SetChargingProfileRequest(profile *types.ChargingProfile) error {
return conn.cp.SetChargingProfileRequest(conn.id, profile)
}

func (conn *Connector) TriggerMessageRequest(requestedMessage remotetrigger.MessageTrigger) error {
return conn.cp.TriggerMessageRequest(conn.id, requestedMessage)
}
5 changes: 3 additions & 2 deletions charger/ocpp/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const (
KeyMaxChargingProfilesInstalled = "MaxChargingProfilesInstalled"

// Vendor specific keys
KeyAlfenPlugAndChargeIdentifier = "PlugAndChargeIdentifier"
KeyEvBoxSupportedMeasurands = "evb_SupportedMeasurands"
KeyAlfenPlugAndChargeIdentifier = "PlugAndChargeIdentifier"
KeyChargeAmpsPhaseSwitchingSupported = "ACPhaseSwitchingSupported"
KeyEvBoxSupportedMeasurands = "evb_SupportedMeasurands"
)
55 changes: 10 additions & 45 deletions charger/ocpp/cp_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ 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/types"
)

Expand All @@ -14,20 +13,10 @@ var (
ErrInvalidTransaction = errors.New("invalid transaction")
)

func (cp *CP) Authorize(request *core.AuthorizeRequest) (*core.AuthorizeConfirmation, error) {
res := &core.AuthorizeConfirmation{
IdTagInfo: &types.IdTagInfo{
Status: types.AuthorizationStatusAccepted,
},
}

return res, nil
}

func (cp *CP) BootNotification(request *core.BootNotificationRequest) (*core.BootNotificationConfirmation, error) {
func (cp *CP) OnBootNotification(request *core.BootNotificationRequest) (*core.BootNotificationConfirmation, error) {
res := &core.BootNotificationConfirmation{
CurrentTime: types.Now(),
Interval: 60,
Interval: int(Timeout.Seconds()),
Status: core.RegistrationStatusAccepted,
}

Expand All @@ -38,43 +27,19 @@ func (cp *CP) BootNotification(request *core.BootNotificationRequest) (*core.Boo
return res, nil
}

func (cp *CP) DiagnosticStatusNotification(request *firmware.DiagnosticsStatusNotificationRequest) (*firmware.DiagnosticsStatusNotificationConfirmation, error) {
return new(firmware.DiagnosticsStatusNotificationConfirmation), nil
}

func (cp *CP) FirmwareStatusNotification(request *firmware.FirmwareStatusNotificationRequest) (*firmware.FirmwareStatusNotificationConfirmation, error) {
return new(firmware.FirmwareStatusNotificationConfirmation), nil
}

func (cp *CP) StatusNotification(request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) {
func (cp *CP) OnStatusNotification(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 conn.OnStatusNotification(request)
}

return new(core.StatusNotificationConfirmation), nil
}

func (cp *CP) DataTransfer(request *core.DataTransferRequest) (*core.DataTransferConfirmation, error) {
res := &core.DataTransferConfirmation{
Status: core.DataTransferStatusAccepted,
}

return res, nil
}

func (cp *CP) Heartbeat(request *core.HeartbeatRequest) (*core.HeartbeatConfirmation, error) {
res := &core.HeartbeatConfirmation{
CurrentTime: types.Now(),
}

return res, nil
}

func (cp *CP) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) {
func (cp *CP) OnMeterValues(request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) {
if request == nil {
return nil, ErrInvalidRequest
}
Expand All @@ -86,19 +51,19 @@ func (cp *CP) MeterValues(request *core.MeterValuesRequest) (*core.MeterValuesCo
}

if conn := cp.connectorByID(request.ConnectorId); conn != nil {
conn.MeterValues(request)
conn.OnMeterValues(request)
}

return new(core.MeterValuesConfirmation), nil
}

func (cp *CP) StartTransaction(request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) {
func (cp *CP) OnStartTransaction(request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) {
if request == nil {
return nil, ErrInvalidRequest
}

if conn := cp.connectorByID(request.ConnectorId); conn != nil {
return conn.StartTransaction(request)
return conn.OnStartTransaction(request)
}

res := &core.StartTransactionConfirmation{
Expand All @@ -110,13 +75,13 @@ func (cp *CP) StartTransaction(request *core.StartTransactionRequest) (*core.Sta
return res, nil
}

func (cp *CP) StopTransaction(request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) {
func (cp *CP) OnStopTransaction(request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) {
if request == nil {
return nil, ErrInvalidRequest
}

if conn := cp.connectorByTransactionID(request.TransactionId); conn != nil {
return conn.StopTransaction(request)
return conn.OnStopTransaction(request)
}

res := &core.StopTransactionConfirmation{
Expand Down
Loading

0 comments on commit d74b0be

Please sign in to comment.