Skip to content

Commit 4afe071

Browse files
author
David Sapir
committed
Add HvacOperationModeType to usecase types
1 parent fe2b702 commit 4afe071

File tree

6 files changed

+82
-77
lines changed

6 files changed

+82
-77
lines changed

usecases/api/ca_cdt.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,33 @@ package api
33
import (
44
"github.com/enbility/eebus-go/api"
55
spineapi "github.com/enbility/spine-go/api"
6-
"github.com/enbility/spine-go/model"
76
)
87

98
type CaCDTInterface interface {
109
api.UseCaseInterface
1110

1211
// Scenario 1
1312

14-
// Return the current setpoints data
13+
// Return the setpoints.
1514
//
1615
// parameters:
1716
// - entity: the entity to get the setpoints data from
1817
//
1918
// return values:
20-
// - setpoints: A map of the setpoints for supported modes
19+
// - setpoints: A list of setpoints
2120
//
2221
// possible errors:
2322
// - ErrDataNotAvailable if no such limit is (yet) available
2423
// - and others
2524
Setpoints(entity spineapi.EntityRemoteInterface) ([]Setpoint, error)
2625

27-
// Return the constraints for the setpoints
26+
// Return the constraints for the setpoints.
2827
//
2928
// parameters:
3029
// - entity: the entity to get the setpoints constraints from
3130
//
3231
// return values:
33-
// - setpointConstraints: A map of the constraints for supported modes
32+
// - setpointConstraints: A list of setpoint constraints
3433
//
3534
// possible errors:
3635
// - ErrDataNotAvailable if no such limit is (yet) available
@@ -42,6 +41,6 @@ type CaCDTInterface interface {
4241
// parameters:
4342
// - entity: the entity to write the setpoint to
4443
// - mode: the mode to write the setpoint for
45-
// - degC: the temperature setpoint value to write
46-
WriteSetpoint(entity spineapi.EntityRemoteInterface, mode model.HvacOperationModeTypeType, degC float64) error
44+
// - temperature: the temperature setpoint value to write
45+
WriteSetpoint(entity spineapi.EntityRemoteInterface, mode HvacOperationModeType, temperature float64) error
4746
}

usecases/api/types.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ const (
1717
EVChargeStateTypeFinished EVChargeStateType = "finished"
1818
)
1919

20+
type HvacOperationModeType string
21+
22+
const (
23+
HvacOperationModeTypeAuto HvacOperationModeType = "auto"
24+
HvacOperationModeTypeOn HvacOperationModeType = "on"
25+
HvacOperationModeTypeOff HvacOperationModeType = "off"
26+
HvacOperationModeTypeEco HvacOperationModeType = "eco"
27+
)
28+
2029
// Defines a phase specific limit data set
2130
type LoadLimitsPhase struct {
2231
Phase model.ElectricalConnectionPhaseNameType // the phase

usecases/ca/cdt/events.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,61 @@ func (e *CDT) HandleEvent(payload spineapi.EventPayload) {
3434

3535
case *model.SetpointListDataType:
3636
e.EventCB(payload.Ski, payload.Device, payload.Entity, DataUpdateSetpoints)
37+
38+
case *model.HvacSystemFunctionSetpointRelationListDataType,
39+
*model.HvacOperationModeDescriptionListDataType:
40+
e.mapSetpointsToOperationModes(payload)
41+
}
42+
}
43+
44+
// mapSetpointsToOperationModes maps setpoints to operation modes.
45+
func (e *CDT) mapSetpointsToOperationModes(payload spineapi.EventPayload) {
46+
hvac, err := client.NewHvac(e.LocalEntity, payload.Entity)
47+
if err != nil {
48+
logging.Log().Debug(err)
49+
return
50+
}
51+
52+
// Get the DHW system function.
53+
filter := model.HvacSystemFunctionDescriptionDataType{
54+
SystemFunctionType: util.Ptr(model.HvacSystemFunctionTypeTypeDhw),
55+
}
56+
functions, _ := hvac.GetHvacSystemFunctionDescriptionsForFilter(filter)
57+
if len(functions) != 1 {
58+
logging.Log().Error("Shuold be exactly one DHW system function")
59+
return
60+
}
61+
62+
dhwFunctionId := *functions[0].SystemFunctionId
63+
64+
relations, _ := hvac.GetHvacSystemFunctionSetpointRelationsForSystemFunctionId(dhwFunctionId)
65+
descriptions, _ := hvac.GetHvacOperationModeDescriptions()
66+
if len(relations) == 0 || len(descriptions) == 0 {
67+
return
68+
}
69+
70+
modeForModeId := make(map[model.HvacOperationModeIdType]model.HvacOperationModeTypeType)
71+
for _, description := range descriptions {
72+
modeForModeId[*description.OperationModeId] = *description.OperationModeType
73+
}
74+
75+
// Map the setpoints to their respective operation modes.
76+
for _, relation := range relations {
77+
if mode, found := modeForModeId[*relation.OperationModeId]; found {
78+
if len(relation.SetpointId) == 0 {
79+
// Only the 'Off' operation mode can have no setpoint associated with it.
80+
if mode != model.HvacOperationModeTypeTypeOff {
81+
logging.Log().Errorf("Operation mode '%s' has no setpoints", mode)
82+
}
83+
} else if len(relation.SetpointId) == 1 {
84+
// Store the unique setpoint for the operation mode.
85+
e.setpointIdForMode[mode] = relation.SetpointId[0]
86+
} else if mode != model.HvacOperationModeTypeTypeAuto {
87+
// Only the 'Auto' operation mode can have multiple setpoints (1 to 4).
88+
// Since 'Auto' mode is not user-controllable, we do not store the setpoints.
89+
logging.Log().Errorf("Operation mode '%s' has multiple setpoints", mode)
90+
}
91+
}
3792
}
3893
}
3994

usecases/ca/cdt/public.go

Lines changed: 4 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"github.com/enbility/eebus-go/features/client"
66
usecasesapi "github.com/enbility/eebus-go/usecases/api"
77
"github.com/enbility/ship-go/logging"
8-
"github.com/enbility/ship-go/util"
98
spineapi "github.com/enbility/spine-go/api"
109
"github.com/enbility/spine-go/model"
1110
)
@@ -128,64 +127,6 @@ func (e *CDT) SetpointConstraints(entity spineapi.EntityRemoteInterface) ([]usec
128127
return setpointConstraints, nil
129128
}
130129

131-
// mapSetpointsToOperationModes maps setpoints to their respective operation modes.
132-
func (e *CDT) mapSetpointsToModes(entity spineapi.EntityRemoteInterface) error {
133-
hvac, err := client.NewHvac(e.LocalEntity, entity)
134-
if err != nil {
135-
return err
136-
}
137-
138-
// Get the DHW system functionId for the DHW system function.
139-
filter := model.HvacSystemFunctionDescriptionDataType{
140-
SystemFunctionType: util.Ptr(model.HvacSystemFunctionTypeTypeDhw),
141-
}
142-
functions, _ := hvac.GetHvacSystemFunctionDescriptionsForFilter(filter)
143-
if len(functions) == 0 {
144-
return api.ErrDataNotAvailable
145-
}
146-
147-
functionId := *functions[0].SystemFunctionId
148-
149-
// Get the relations between operation modes and setpoints for the DHW system function.
150-
relations, _ := hvac.GetHvacSystemFunctionSetpointRelationsForSystemFunctionId(functionId)
151-
if len(relations) == 0 {
152-
return api.ErrDataNotAvailable
153-
}
154-
155-
// Get the operation mode descriptions for the operation modes in the relations.
156-
descriptions, _ := hvac.GetHvacOperationModeDescriptions()
157-
if len(descriptions) == 0 {
158-
return api.ErrDataNotAvailable
159-
}
160-
161-
// Create a mapping to get the operation mode descriptions by operation mode ID.
162-
modeDescriptions := make(map[model.HvacOperationModeIdType]model.HvacOperationModeTypeType)
163-
for _, description := range descriptions {
164-
modeDescriptions[*description.OperationModeId] = *description.OperationModeType
165-
}
166-
167-
// Map the setpoints to their respective operation modes.
168-
for _, relation := range relations {
169-
if mode, found := modeDescriptions[*relation.OperationModeId]; found {
170-
if len(relation.SetpointId) == 0 {
171-
// Only the 'Off' operation mode can have no setpoint associated with it.
172-
if mode != model.HvacOperationModeTypeTypeOff {
173-
logging.Log().Errorf("Operation mode '%s' has no setpoints", mode)
174-
}
175-
} else if len(relation.SetpointId) == 1 {
176-
// Unique 1:1 mapping of operation mode to setpoint.
177-
e.modes[mode] = relation.SetpointId[0]
178-
} else {
179-
if mode != model.HvacOperationModeTypeTypeAuto {
180-
logging.Log().Errorf("Operation mode '%s' has multiple setpoints", mode)
181-
}
182-
}
183-
}
184-
}
185-
186-
return nil
187-
}
188-
189130
// WriteSetpoint sets the temperature setpoint for a specific operation mode.
190131
//
191132
// Possible errors:
@@ -194,21 +135,21 @@ func (e *CDT) mapSetpointsToModes(entity spineapi.EntityRemoteInterface) error {
194135
// - Other errors: Any other errors encountered during the process.
195136
func (e *CDT) WriteSetpoint(
196137
entity spineapi.EntityRemoteInterface,
197-
mode model.HvacOperationModeTypeType,
138+
mode usecasesapi.HvacOperationModeType,
198139
temperature float64,
199140
) error {
200-
if mode == model.HvacOperationModeTypeTypeAuto {
141+
if model.HvacOperationModeTypeType(mode) == model.HvacOperationModeTypeTypeAuto {
201142
// 'Auto' mode is controlled by a timetable, meaning the current setpoint
202143
// for the HVAC system function changes according to the timetable.
203144
// Only the 'Off', 'On', and 'Eco' modes can be directly controlled by a setpoint.
204145
return nil
205146
}
206147

207-
if len(e.modes) == 0 && e.mapSetpointsToModes(entity) != nil {
148+
if len(e.setpointIdForMode) == 0 {
208149
return api.ErrDataNotAvailable
209150
}
210151

211-
setpointId, found := e.modes[mode]
152+
setpointId, found := e.setpointIdForMode[model.HvacOperationModeTypeType(mode)]
212153
if !found {
213154
return api.ErrDataNotAvailable
214155
}

usecases/ca/cdt/public_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cdt
22

33
import (
4+
"github.com/enbility/eebus-go/usecases/api"
45
"github.com/enbility/ship-go/util"
56
"github.com/enbility/spine-go/model"
67
"github.com/stretchr/testify/assert"
@@ -137,7 +138,7 @@ func (s *CaCDTSuite) Test_SetpointConstraints() {
137138
// Test_WriteSetpoint verifies the functionality of writing a setpoint to a remote entity.
138139
func (s *CaCDTSuite) Test_WriteSetpoint() {
139140
// Test case: No setpoints available for mock remote entity
140-
err := s.sut.WriteSetpoint(s.mockRemoteEntity, model.HvacOperationModeTypeTypeOn, 35.0)
141+
err := s.sut.WriteSetpoint(s.mockRemoteEntity, api.HvacOperationModeTypeOn, 35.0)
141142
assert.NotNil(s.T(), err)
142143

143144
// Create a setpoint
@@ -169,15 +170,15 @@ func (s *CaCDTSuite) Test_WriteSetpoint() {
169170
assert.Nil(s.T(), fErr)
170171

171172
// Test case: No mapping of operation modes to setpoints available
172-
err = s.sut.WriteSetpoint(s.cdtEntity, model.HvacOperationModeTypeTypeOn, 35.0)
173+
err = s.sut.WriteSetpoint(s.cdtEntity, api.HvacOperationModeTypeOn, 35.0)
173174
assert.NotNil(s.T(), err)
174175

175176
// Create a mapping of operation modes to setpoints
176-
s.sut.modes = map[model.HvacOperationModeTypeType]model.SetpointIdType{
177+
s.sut.setpointIdForMode = map[model.HvacOperationModeTypeType]model.SetpointIdType{
177178
model.HvacOperationModeTypeTypeOn: 1,
178179
}
179180

180181
// Test case: Setpoint and operation mode mapping available - the write should succeed
181-
err = s.sut.WriteSetpoint(s.cdtEntity, model.HvacOperationModeTypeTypeOn, 35.0)
182+
err = s.sut.WriteSetpoint(s.cdtEntity, api.HvacOperationModeTypeOn, 35.0)
182183
assert.Nil(s.T(), err)
183184
}

usecases/ca/cdt/usecase.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
type CDT struct {
1313
*usecase.UseCaseBase
1414

15-
modes map[model.HvacOperationModeTypeType]model.SetpointIdType
15+
setpointIdForMode map[model.HvacOperationModeTypeType]model.SetpointIdType
1616
}
1717

1818
var _ ucapi.CaCDTInterface = (*CDT)(nil)
@@ -53,8 +53,8 @@ func NewCDT(
5353
)
5454

5555
uc := &CDT{
56-
UseCaseBase: usecase,
57-
modes: make(map[model.HvacOperationModeTypeType]model.SetpointIdType),
56+
UseCaseBase: usecase,
57+
setpointIdForMode: make(map[model.HvacOperationModeTypeType]model.SetpointIdType),
5858
}
5959

6060
_ = spine.Events.Subscribe(uc)

0 commit comments

Comments
 (0)