Skip to content

Commit

Permalink
Merge branch 'dev' into feature/jsonrpc2
Browse files Browse the repository at this point in the history
  • Loading branch information
DerAndereAndi committed Dec 10, 2024
2 parents 7adf380 + 1edb43f commit 3306bd0
Show file tree
Hide file tree
Showing 33 changed files with 566 additions and 84 deletions.
3 changes: 3 additions & 0 deletions api/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ var ErrMetadataNotAvailable = errors.New("meta data not available")
// ErrDataNotAvailable indicates that no data set is yet available
var ErrDataNotAvailable = errors.New("data not available")

// ErrDataInvalid indicates that the currently available data is not valid and should be ignored
var ErrDataInvalid = errors.New("data not valid")

// ErrDataForMetadataKeyNotFound indicates that no data item is found for the given key
var ErrDataForMetadataKeyNotFound = errors.New("data for key not found")

Expand Down
8 changes: 6 additions & 2 deletions examples/remote/ucs.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,12 @@ func (r *Remote) PropagateEvent(
) {
params := make(map[string]interface{}, 2)
params["ski"] = ski
params["device"] = device.Address()
params["entity"] = entity.Address()
if device != nil {
params["device"] = device.Address()
}
if entity != nil {
params["entity"] = entity.Address()
}
for _, conn := range r.connections {
_ = conn.Notify(context.Background(), string(event), params)
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.22.0

require (
github.com/enbility/ship-go v0.0.0-20241118145930-d68708c5f1c0
github.com/enbility/spine-go v0.0.0-20241118145803-0589320ceced
github.com/enbility/spine-go v0.0.0-20241209160856-1aed917e83e7
github.com/stretchr/testify v1.9.0
golang.org/x/exp/jsonrpc2 v0.0.0-20240909161429-701f63a606c0
)
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ github.com/enbility/go-avahi v0.0.0-20240909195612-d5de6b280d7a h1:foChWb8lhzqa6
github.com/enbility/go-avahi v0.0.0-20240909195612-d5de6b280d7a/go.mod h1:H64mhYcAQUGUUnVqMdZQf93kPecH4M79xwH95Lddt3U=
github.com/enbility/ship-go v0.0.0-20241118145930-d68708c5f1c0 h1:Z8j/N4DgUL8T8mINkHdq0bUbKcWtwDpno0bsKOGahPo=
github.com/enbility/ship-go v0.0.0-20241118145930-d68708c5f1c0/go.mod h1:JJp8EQcJhUhTpZ2LSEU4rpdaM3E2n08tswWFWtmm/wU=
github.com/enbility/spine-go v0.0.0-20241118145803-0589320ceced h1:Z2WrJ+ku7lPZqJ+uzqvIqdMpXqvAZRB3J3xW592pDXI=
github.com/enbility/spine-go v0.0.0-20241118145803-0589320ceced/go.mod h1:ZoI9TaJO/So/677uknrli8sc6iryD7wC5iWhVIre+MI=
github.com/enbility/spine-go v0.0.0-20241209160856-1aed917e83e7 h1:Pq1L3U/aoSg8qQj4CfSEUCh9fxgB3G/skUNQI32zQeg=
github.com/enbility/spine-go v0.0.0-20241209160856-1aed917e83e7/go.mod h1:ZoI9TaJO/So/677uknrli8sc6iryD7wC5iWhVIre+MI=
github.com/enbility/zeroconf/v2 v2.0.0-20240920094356-be1cae74fda6 h1:XOYvxKtT1oxT37w/5oEiRLuPbm9FuJPt3fiYhX0h8Po=
github.com/enbility/zeroconf/v2 v2.0.0-20240920094356-be1cae74fda6/go.mod h1:BszP9qFV14mPXgyIREbgIdQtWxbAj3OKqvK02HihMoM=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
Expand Down
7 changes: 7 additions & 0 deletions service/service_hub.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,18 @@ import (
var _ shipapi.HubReaderInterface = (*Service)(nil)

// report a connection to a SKI
//
// is triggered whenever a SHIP connected was successful completed
func (s *Service) RemoteSKIConnected(ski string) {
s.serviceHandler.RemoteSKIConnected(s, ski)
}

// report a disconnection to a SKI
//
// is triggered whenever a SHIP connect was closed, is also triggered when the SHIP
// process wasn't successfully completed
//
// NOTE: The connection may not have been reported as connected before!
func (s *Service) RemoteSKIDisconnected(ski string) {
if s.spineLocalDevice != nil {
s.spineLocalDevice.RemoveRemoteDeviceConnection(ski)
Expand Down
2 changes: 1 addition & 1 deletion usecases/cem/cevc/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (e *CEVC) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.evConnected(payload.Entity)
return
}
Expand Down
4 changes: 2 additions & 2 deletions usecases/cem/evcc/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ func (e *EVCC) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.evConnected(payload)
return
} else if internal.IsEntityDisconnected(payload) {
} else if internal.IsEntityRemoved(payload) {
e.evDisconnected(payload)
return
}
Expand Down
2 changes: 1 addition & 1 deletion usecases/cem/evcem/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (e *EVCEM) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.evConnected(payload.Entity)
return
}
Expand Down
4 changes: 2 additions & 2 deletions usecases/cem/evsecc/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ func (e *EVSECC) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.evseConnected(payload)
return
} else if internal.IsEntityDisconnected(payload) {
} else if internal.IsEntityRemoved(payload) {
e.evseDisconnected(payload)
return
}
Expand Down
2 changes: 1 addition & 1 deletion usecases/cem/evsoc/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func (e *EVSOC) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.evConnected(payload.Entity)
return
}
Expand Down
2 changes: 1 addition & 1 deletion usecases/cem/opev/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (e *OPEV) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.evConnected(payload.Entity)
return
}
Expand Down
32 changes: 24 additions & 8 deletions usecases/cem/opev/public.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,38 @@ func (e *OPEV) CurrentLimits(entity spineapi.EntityRemoteInterface) ([]float64,
return nil, nil, nil, err
}

meas, err := client.NewMeasurement(e.LocalEntity, entity)
lc, err := client.NewLoadControl(e.LocalEntity, entity)
if err != nil {
return nil, nil, nil, err
}

filter := model.MeasurementDescriptionDataType{
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent),
filter := model.LoadControlLimitDescriptionDataType {
LimitType: util.Ptr(model.LoadControlLimitTypeTypeMaxValueLimit),
LimitCategory: util.Ptr(model.LoadControlCategoryTypeObligation),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeOverloadProtection),
}
measDesc, err := meas.GetDescriptionsForFilter(filter)

limitDescs, err := lc.GetLimitDescriptionsForFilter(filter)
if err != nil {
return nil, nil, nil, err
}
if len(limitDescs) == 0 {
return nil, nil, nil, api.ErrDataNotAvailable
}

return ec.GetPhaseCurrentLimits(measDesc)
measDescs := make([]model.MeasurementDescriptionDataType, 0)
for _, ld := range limitDescs {
measId := ld.MeasurementId
if measId == nil {
return nil, nil, nil, api.ErrDataNotAvailable
}
md := model.MeasurementDescriptionDataType{
MeasurementId: measId,
}
measDescs = append(measDescs, md)
}
return ec.GetPhaseCurrentLimits(measDescs)
}

// return the current loadcontrol obligation limits
Expand All @@ -69,6 +84,7 @@ func (e *OPEV) LoadControlLimits(entity spineapi.EntityRemoteInterface) (
filter := model.LoadControlLimitDescriptionDataType{
LimitType: util.Ptr(model.LoadControlLimitTypeTypeMaxValueLimit),
LimitCategory: util.Ptr(model.LoadControlCategoryTypeObligation),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeOverloadProtection),
}
return internal.LoadControlLimits(e.LocalEntity, entity, filter)
Expand Down
46 changes: 38 additions & 8 deletions usecases/cem/opev/public_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,51 @@ func (s *CemOPEVSuite) Test_Public() {
_, _, _, err = s.sut.CurrentLimits(s.evEntity)
assert.NotNil(s.T(), err)

lc := s.evEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeLoadControl, model.RoleTypeServer)
assert.NotNil(s.T(), lc)

meas := s.evEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeMeasurement, model.RoleTypeServer)
assert.NotNil(s.T(), meas)

mData := &model.MeasurementDescriptionListDataType{
MeasurementDescriptionData: []model.MeasurementDescriptionDataType{
lData := &model.LoadControlLimitDescriptionListDataType{
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
},
}

_,errT := lc.UpdateData(true, model.FunctionTypeLoadControlLimitDescriptionListData, lData, nil, nil)
assert.Nil(s.T(), errT)

_, _, _, err = s.sut.CurrentLimits(s.evEntity)
assert.NotNil(s.T(), err)

lData = &model.LoadControlLimitDescriptionListDataType{
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
{
LimitId: util.Ptr(model.LoadControlLimitIdType(0)),
LimitCategory: util.Ptr(model.LoadControlCategoryTypeObligation),
LimitType: util.Ptr(model.LoadControlLimitTypeTypeMaxValueLimit),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeOverloadProtection),
},
},
}

_,errT = lc.UpdateData(true, model.FunctionTypeLoadControlLimitDescriptionListData, lData, nil, nil)
assert.Nil(s.T(), errT)

_, _, _, err = s.sut.CurrentLimits(s.evEntity)
assert.NotNil(s.T(), err)

lData = &model.LoadControlLimitDescriptionListDataType{
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
{
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent),
LimitId: util.Ptr(model.LoadControlLimitIdType(0)),
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
},
},
}
_, errT := meas.UpdateData(true, model.FunctionTypeMeasurementDescriptionListData, mData, nil, nil)

_,errT = lc.UpdateData(true, model.FunctionTypeLoadControlLimitDescriptionListData, lData, &model.FilterType{}, nil)
assert.Nil(s.T(), errT)

_, _, _, err = s.sut.CurrentLimits(s.evEntity)
Expand Down
32 changes: 24 additions & 8 deletions usecases/cem/oscev/public.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,38 @@ func (e *OSCEV) CurrentLimits(entity spineapi.EntityRemoteInterface) ([]float64,
return nil, nil, nil, err
}

meas, err := client.NewMeasurement(e.LocalEntity, entity)
lc, err := client.NewLoadControl(e.LocalEntity, entity)
if err != nil {
return nil, nil, nil, err
}

filter := model.MeasurementDescriptionDataType{
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent),
filter := model.LoadControlLimitDescriptionDataType {
LimitType: util.Ptr(model.LoadControlLimitTypeTypeMaxValueLimit),
LimitCategory: util.Ptr(model.LoadControlCategoryTypeRecommendation),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeSelfConsumption),
}
measDesc, err := meas.GetDescriptionsForFilter(filter)

limitDescs, err := lc.GetLimitDescriptionsForFilter(filter)
if err != nil {
return nil, nil, nil, err
}
if len(limitDescs) == 0 {
return nil, nil, nil, api.ErrDataNotAvailable
}

return ec.GetPhaseCurrentLimits(measDesc)
measDescs := make([]model.MeasurementDescriptionDataType, 0)
for _, ld := range limitDescs {
measId := ld.MeasurementId
if measId == nil {
return nil, nil, nil, api.ErrDataNotAvailable
}
md := model.MeasurementDescriptionDataType{
MeasurementId: measId,
}
measDescs = append(measDescs, md)
}
return ec.GetPhaseCurrentLimits(measDescs)
}

// return the current loadcontrol recommendation limits
Expand All @@ -65,6 +80,7 @@ func (e *OSCEV) LoadControlLimits(entity spineapi.EntityRemoteInterface) (
filter := model.LoadControlLimitDescriptionDataType{
LimitType: util.Ptr(model.LoadControlLimitTypeTypeMaxValueLimit),
LimitCategory: util.Ptr(model.LoadControlCategoryTypeRecommendation),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeSelfConsumption),
}
return internal.LoadControlLimits(e.LocalEntity, entity, filter)
Expand Down
46 changes: 38 additions & 8 deletions usecases/cem/oscev/public_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,51 @@ func (s *CemOSCEVSuite) Test_Public() {
_, _, _, err = s.sut.CurrentLimits(s.evEntity)
assert.NotNil(s.T(), err)

lc := s.evEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeLoadControl, model.RoleTypeServer)
assert.NotNil(s.T(), lc)

meas := s.evEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeMeasurement, model.RoleTypeServer)
assert.NotNil(s.T(), meas)

mData := &model.MeasurementDescriptionListDataType{
MeasurementDescriptionData: []model.MeasurementDescriptionDataType{
lData := &model.LoadControlLimitDescriptionListDataType{
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
},
}

_,errT := lc.UpdateData(true, model.FunctionTypeLoadControlLimitDescriptionListData, lData, nil, nil)
assert.Nil(s.T(), errT)

_, _, _, err = s.sut.CurrentLimits(s.evEntity)
assert.NotNil(s.T(), err)

lData = &model.LoadControlLimitDescriptionListDataType{
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
{
LimitId: util.Ptr(model.LoadControlLimitIdType(0)),
LimitCategory: util.Ptr(model.LoadControlCategoryTypeRecommendation),
LimitType: util.Ptr(model.LoadControlLimitTypeTypeMaxValueLimit),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeSelfConsumption),
},
},
}

_,errT = lc.UpdateData(true, model.FunctionTypeLoadControlLimitDescriptionListData, lData, nil, nil)
assert.Nil(s.T(), errT)

_, _, _, err = s.sut.CurrentLimits(s.evEntity)
assert.NotNil(s.T(), err)

lData = &model.LoadControlLimitDescriptionListDataType{
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
{
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent),
LimitId: util.Ptr(model.LoadControlLimitIdType(0)),
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
},
},
}
_, errT := meas.UpdateData(true, model.FunctionTypeMeasurementDescriptionListData, mData, nil, nil)

_,errT = lc.UpdateData(true, model.FunctionTypeLoadControlLimitDescriptionListData, lData, &model.FilterType{}, nil)
assert.Nil(s.T(), errT)

_, _, _, err = s.sut.CurrentLimits(s.evEntity)
Expand Down
2 changes: 1 addition & 1 deletion usecases/cem/vabd/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (e *VABD) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.inverterConnected(payload.Entity)
return
}
Expand Down
2 changes: 1 addition & 1 deletion usecases/cem/vapd/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (e *VAPD) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.inverterConnected(payload.Entity)
return
}
Expand Down
2 changes: 1 addition & 1 deletion usecases/eg/lpc/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func (e *LPC) HandleEvent(payload spineapi.EventPayload) {
if !e.IsCompatibleEntityType(payload.Entity) {
return
}
if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.connected(payload.Entity)
return
}
Expand Down
2 changes: 1 addition & 1 deletion usecases/eg/lpp/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func (e *LPP) HandleEvent(payload spineapi.EventPayload) {
return
}

if internal.IsEntityConnected(payload) {
if internal.IsEntityAdded(payload) {
e.connected(payload.Entity)
return
}
Expand Down
Loading

0 comments on commit 3306bd0

Please sign in to comment.