Skip to content

Commit a6dd1f6

Browse files
committed
Simplify service configuration and add voltage
1 parent aa55019 commit a6dd1f6

File tree

7 files changed

+76
-63
lines changed

7 files changed

+76
-63
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ Use `SetLogger` on `Service` to set the logger which needs to conform to the `lo
241241
Example:
242242

243243
```go
244-
h.myService = service.NewEEBUSService(serviceDescription, h)
244+
configuration = service.NewConfiguration(...)
245+
h.myService = service.NewEEBUSService(configuration, h)
245246
h.myService.SetLogging(h)
246247
```

cmd/evse/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ func (h *evse) run() {
6060
log.Fatal(err)
6161
}
6262

63-
serviceDescription, err := service.NewServiceDescription(
63+
configuration, err := service.NewConfiguration(
6464
"Demo", "Demo", "EVSE", "234567890",
65-
model.DeviceTypeTypeChargingStation, port, certificate)
65+
model.DeviceTypeTypeChargingStation, port, certificate, 230)
6666
if err != nil {
6767
log.Fatal(err)
6868
}
69-
serviceDescription.SetAlternateIdentifier("Demo-EVSE-234567890")
69+
configuration.SetAlternateIdentifier("Demo-EVSE-234567890")
7070

71-
h.myService = service.NewEEBUSService(serviceDescription, h)
71+
h.myService = service.NewEEBUSService(configuration, h)
7272
h.myService.SetLogging(h)
7373

7474
if err = h.myService.Setup(); err != nil {

cmd/hems/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ func (h *hems) run() {
6060
log.Fatal(err)
6161
}
6262

63-
serviceDescription, err := service.NewServiceDescription(
63+
configuration, err := service.NewConfiguration(
6464
"Demo", "Demo", "HEMS", "123456789",
65-
model.DeviceTypeTypeEnergyManagementSystem, port, certificate)
65+
model.DeviceTypeTypeEnergyManagementSystem, port, certificate, 230)
6666
if err != nil {
6767
log.Fatal(err)
6868
}
69-
serviceDescription.SetAlternateIdentifier("Demo-HEMS-123456789")
69+
configuration.SetAlternateIdentifier("Demo-HEMS-123456789")
7070

71-
h.myService = service.NewEEBUSService(serviceDescription, h)
71+
h.myService = service.NewEEBUSService(configuration, h)
7272
h.myService.SetLogging(h)
7373

7474
if err = h.myService.Setup(); err != nil {

service/hub.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ type connectionsHub struct {
6565
connectionAttemptCounter map[string]int
6666
connectionAttemptRunning map[string]bool
6767

68-
serviceDescription *ServiceDescription
69-
localService *ServiceDetails
68+
configuration *Configuration
69+
localService *ServiceDetails
7070

7171
serviceProvider serviceProvider
7272

@@ -88,21 +88,21 @@ type connectionsHub struct {
8888
muxMdns sync.Mutex
8989
}
9090

91-
func newConnectionsHub(serviceProvider serviceProvider, spineLocalDevice *spine.DeviceLocalImpl, serviceDescription *ServiceDescription, localService *ServiceDetails) (*connectionsHub, error) {
91+
func newConnectionsHub(serviceProvider serviceProvider, spineLocalDevice *spine.DeviceLocalImpl, configuration *Configuration, localService *ServiceDetails) (*connectionsHub, error) {
9292
hub := &connectionsHub{
9393
connections: make(map[string]*ship.ShipConnection),
9494
connectionAttemptCounter: make(map[string]int),
9595
connectionAttemptRunning: make(map[string]bool),
9696
pairedServices: make([]ServiceDetails, 0),
9797
serviceProvider: serviceProvider,
9898
spineLocalDevice: spineLocalDevice,
99-
serviceDescription: serviceDescription,
99+
configuration: configuration,
100100
localService: localService,
101101
}
102102

103103
localService.SKI = util.NormalizeSKI(localService.SKI)
104104

105-
mdns, err := newMDNS(localService.SKI, serviceDescription)
105+
mdns, err := newMDNS(localService.SKI, configuration)
106106
if err != nil {
107107
return nil, err
108108
}
@@ -251,14 +251,14 @@ func (h *connectionsHub) isSkiConnected(ski string) bool {
251251

252252
// start the ship websocket server
253253
func (h *connectionsHub) startWebsocketServer() error {
254-
addr := fmt.Sprintf(":%d", h.serviceDescription.port)
254+
addr := fmt.Sprintf(":%d", h.configuration.port)
255255
logging.Log.Debug("starting websocket server on", addr)
256256

257257
h.httpServer = &http.Server{
258258
Addr: addr,
259259
Handler: h,
260260
TLSConfig: &tls.Config{
261-
Certificates: []tls.Certificate{h.serviceDescription.certificate},
261+
Certificates: []tls.Certificate{h.configuration.certificate},
262262
ClientAuth: tls.RequireAnyClientCert, // SHIP 9: Client authentication is required
263263
CipherSuites: ciperSuites,
264264
VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
@@ -372,7 +372,7 @@ func (h *connectionsHub) connectFoundService(remoteService *ServiceDetails, host
372372
Proxy: http.ProxyFromEnvironment,
373373
HandshakeTimeout: 5 * time.Second,
374374
TLSClientConfig: &tls.Config{
375-
Certificates: []tls.Certificate{h.serviceDescription.certificate},
375+
Certificates: []tls.Certificate{h.configuration.certificate},
376376
InsecureSkipVerify: true,
377377
CipherSuites: ciperSuites,
378378
},

service/mdns.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ type MdnsSearch interface {
3434
}
3535

3636
type mdns struct {
37-
serviceDescription *ServiceDescription
38-
ski string
37+
configuration *Configuration
38+
ski string
3939

4040
isAnnounced bool
4141
isSearchingServices bool
@@ -58,12 +58,12 @@ type mdns struct {
5858
mux sync.Mutex
5959
}
6060

61-
func newMDNS(ski string, serviceDescription *ServiceDescription) (*mdns, error) {
61+
func newMDNS(ski string, configuration *Configuration) (*mdns, error) {
6262
m := &mdns{
63-
ski: ski,
64-
serviceDescription: serviceDescription,
65-
entries: make(map[string]MdnsEntry),
66-
cancelChan: make(chan bool),
63+
ski: ski,
64+
configuration: configuration,
65+
entries: make(map[string]MdnsEntry),
66+
cancelChan: make(chan bool),
6767
}
6868

6969
if av, err := m.setupAvahi(); err == nil {
@@ -112,10 +112,10 @@ func (m *mdns) interfaces() ([]net.Interface, []int32, error) {
112112
var ifaces []net.Interface
113113
var ifaceIndexes []int32
114114

115-
if len(m.serviceDescription.interfaces) > 0 {
116-
ifaces = make([]net.Interface, len(m.serviceDescription.interfaces))
117-
ifaceIndexes = make([]int32, len(m.serviceDescription.interfaces))
118-
for i, ifaceName := range m.serviceDescription.interfaces {
115+
if len(m.configuration.interfaces) > 0 {
116+
ifaces = make([]net.Interface, len(m.configuration.interfaces))
117+
ifaceIndexes = make([]int32, len(m.configuration.interfaces))
118+
for i, ifaceName := range m.configuration.interfaces {
119119
iface, err := net.InterfaceByName(ifaceName)
120120
if err != nil {
121121
return nil, nil, err
@@ -146,26 +146,26 @@ func (m *mdns) Announce() error {
146146
return err
147147
}
148148

149-
serviceIdentifier := m.serviceDescription.Identifier()
149+
serviceIdentifier := m.configuration.Identifier()
150150

151151
txt := []string{ // SHIP 7.3.2
152152
"txtvers=1",
153153
"path=" + shipWebsocketPath,
154154
"id=" + serviceIdentifier,
155155
"ski=" + m.ski,
156-
"brand=" + m.serviceDescription.deviceBrand,
157-
"model=" + m.serviceDescription.deviceModel,
158-
"type=" + string(m.serviceDescription.deviceType),
159-
"register=" + fmt.Sprintf("%v", m.serviceDescription.registerAutoAccept),
156+
"brand=" + m.configuration.deviceBrand,
157+
"model=" + m.configuration.deviceModel,
158+
"type=" + string(m.configuration.deviceType),
159+
"register=" + fmt.Sprintf("%v", m.configuration.registerAutoAccept),
160160
}
161161

162162
logging.Log.Debug("mdns: announce")
163163

164-
serviceName := m.serviceDescription.MdnsServiceName()
164+
serviceName := m.configuration.MdnsServiceName()
165165

166166
if m.av == nil {
167167
// use Zeroconf library if avahi is not available
168-
mDNSServer, err := zeroconf.Register(serviceName, shipZeroConfServiceType, shipZeroConfDomain, m.serviceDescription.port, txt, ifaces)
168+
mDNSServer, err := zeroconf.Register(serviceName, shipZeroConfServiceType, shipZeroConfDomain, m.configuration.port, txt, ifaces)
169169
if err == nil {
170170
m.zc = mDNSServer
171171

@@ -188,7 +188,7 @@ func (m *mdns) Announce() error {
188188
}
189189

190190
for _, iface := range ifaceIndexes {
191-
err = entryGroup.AddService(iface, avahi.ProtoUnspec, 0, serviceName, shipZeroConfServiceType, shipZeroConfDomain, "", uint16(m.serviceDescription.port), btxt)
191+
err = entryGroup.AddService(iface, avahi.ProtoUnspec, 0, serviceName, shipZeroConfServiceType, shipZeroConfDomain, "", uint16(m.configuration.port), btxt)
192192
if err != nil {
193193
return err
194194
}

service/service.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ type EEBUSServiceHandler interface {
2929
// A service is the central element of an EEBUS service
3030
// including its websocket server and a zeroconf service.
3131
type EEBUSService struct {
32-
ServiceDescription *ServiceDescription
32+
Configuration *Configuration
3333

3434
// The local service details
3535
LocalService *ServiceDetails
@@ -46,10 +46,10 @@ type EEBUSService struct {
4646
}
4747

4848
// creates a new EEBUS service
49-
func NewEEBUSService(ServiceDescription *ServiceDescription, serviceHandler EEBUSServiceHandler) *EEBUSService {
49+
func NewEEBUSService(configuration *Configuration, serviceHandler EEBUSServiceHandler) *EEBUSService {
5050
return &EEBUSService{
51-
ServiceDescription: ServiceDescription,
52-
serviceHandler: serviceHandler,
51+
Configuration: configuration,
52+
serviceHandler: serviceHandler,
5353
}
5454
}
5555

@@ -81,11 +81,11 @@ func (s *EEBUSService) SetLogging(logger logging.Logging) {
8181

8282
// Starts the service by initializeing mDNS and the server.
8383
func (s *EEBUSService) Setup() error {
84-
if s.ServiceDescription.port == 0 {
85-
s.ServiceDescription.port = defaultPort
84+
if s.Configuration.port == 0 {
85+
s.Configuration.port = defaultPort
8686
}
8787

88-
sd := s.ServiceDescription
88+
sd := s.Configuration
8989

9090
leaf, err := x509.ParseCertificate(sd.certificate.Certificate[0])
9191
if err != nil {
@@ -155,7 +155,7 @@ func (s *EEBUSService) Setup() error {
155155
s.spineLocalDevice.AddEntity(entity)
156156

157157
// Setup connections hub with mDNS and websocket connection handling
158-
hub, err := newConnectionsHub(s, s.spineLocalDevice, s.ServiceDescription, s.LocalService)
158+
hub, err := newConnectionsHub(s, s.spineLocalDevice, s.Configuration, s.LocalService)
159159
if err != nil {
160160
return err
161161
}

service/types.go

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type ServiceDetails struct {
3434
}
3535

3636
// defines requires meta information about this service
37-
type ServiceDescription struct {
37+
type Configuration struct {
3838
// The vendors IANA PEN, optional but highly recommended.
3939
// If not set, brand will be used instead
4040
// Used for the Device Address: SPINE - Protocol Specification 7.1.1.2
@@ -90,93 +90,100 @@ type ServiceDescription struct {
9090
// the spec defines that this should have a timeout and be activate
9191
// e.g via a physical button
9292
registerAutoAccept bool
93+
94+
// The sites grid voltage
95+
// This is useful when e.g. power values are not available and therefor
96+
// need to be calculated using the current values
97+
voltage float64
9398
}
9499

95-
// Setup a ServiceDescription with the required parameters
96-
func NewServiceDescription(
100+
// Setup a Configuration with the required parameters
101+
func NewConfiguration(
97102
vendorCode,
98103
deviceBrand,
99104
deviceModel,
100105
serialNumber string,
101106
deviceType model.DeviceTypeType,
102107
port int,
103108
certificate tls.Certificate,
104-
) (*ServiceDescription, error) {
105-
serviceDescription := &ServiceDescription{
109+
voltage float64,
110+
) (*Configuration, error) {
111+
configuration := &Configuration{
106112
certificate: certificate,
107113
port: port,
114+
voltage: voltage,
108115
}
109116

110117
isRequired := "is required"
111118

112119
if len(vendorCode) == 0 {
113120
return nil, fmt.Errorf("vendorCode %s", isRequired)
114121
} else {
115-
serviceDescription.vendorCode = vendorCode
122+
configuration.vendorCode = vendorCode
116123
}
117124
if len(deviceBrand) == 0 {
118125
return nil, fmt.Errorf("brand %s", isRequired)
119126
} else {
120-
serviceDescription.deviceBrand = deviceBrand
127+
configuration.deviceBrand = deviceBrand
121128
}
122129
if len(deviceModel) == 0 {
123130
return nil, fmt.Errorf("model %s", isRequired)
124131
} else {
125-
serviceDescription.deviceModel = deviceModel
132+
configuration.deviceModel = deviceModel
126133
}
127134
if len(serialNumber) == 0 {
128135
return nil, fmt.Errorf("serialNumber %s", isRequired)
129136
} else {
130-
serviceDescription.deviceSerialNumber = serialNumber
137+
configuration.deviceSerialNumber = serialNumber
131138
}
132139
if len(deviceType) == 0 {
133140
return nil, fmt.Errorf("deviceType %s", isRequired)
134141
} else {
135-
serviceDescription.deviceType = deviceType
142+
configuration.deviceType = deviceType
136143
}
137144

138145
// set default
139-
serviceDescription.featureSet = model.NetworkManagementFeatureSetTypeSmart
146+
configuration.featureSet = model.NetworkManagementFeatureSetTypeSmart
140147

141-
return serviceDescription, nil
148+
return configuration, nil
142149
}
143150

144151
// define an alternative mDNS and SHIP identifier
145152
// usually this is only used when no deviceCode is available or identical to the brand
146153
// if this is not set, generated identifier is used
147-
func (s *ServiceDescription) SetAlternateIdentifier(identifier string) {
154+
func (s *Configuration) SetAlternateIdentifier(identifier string) {
148155
s.alternateIdentifier = identifier
149156
}
150157

151158
// define an alternative mDNS service name
152159
// this is normally not needed or used
153-
func (s *ServiceDescription) SetAlternateMdnsServiceName(name string) {
160+
func (s *Configuration) SetAlternateMdnsServiceName(name string) {
154161
s.alternateMdnsServiceName = name
155162
}
156163

157164
// define which network interfaces should be considered instead of all existing
158165
// expects a list of network interface names
159-
func (s *ServiceDescription) SetInterfaces(ifaces []string) {
166+
func (s *Configuration) SetInterfaces(ifaces []string) {
160167
s.interfaces = ifaces
161168
}
162169

163170
// define wether this service should announce auto accept
164171
// TODO: this needs to be redesigned!
165-
func (s *ServiceDescription) SetRegisterAutoAccept(auto bool) {
172+
func (s *Configuration) SetRegisterAutoAccept(auto bool) {
166173
s.registerAutoAccept = auto
167174
}
168175

169176
// generates a standard identifier used for mDNS ID and SHIP ID
170177
// Brand-Model-SerialNumber
171-
func (s *ServiceDescription) generateIdentifier() string {
178+
func (s *Configuration) generateIdentifier() string {
172179
return fmt.Sprintf("%s-%s-%s", s.deviceBrand, s.deviceModel, s.deviceSerialNumber)
173180
}
174181

175182
// return the identifier to be used for mDNS and SHIP ID
176183
// returns in this order:
177184
// - alternateIdentifier
178185
// - generateIdentifier
179-
func (s *ServiceDescription) Identifier() string {
186+
func (s *Configuration) Identifier() string {
180187
// SHIP identifier is identical to the mDNS ID
181188
if len(s.alternateIdentifier) > 0 {
182189
return s.alternateIdentifier
@@ -189,11 +196,16 @@ func (s *ServiceDescription) Identifier() string {
189196
// returns in this order:
190197
// - alternateMdnsServiceName
191198
// - generateIdentifier
192-
func (s *ServiceDescription) MdnsServiceName() string {
199+
func (s *Configuration) MdnsServiceName() string {
193200
// SHIP identifier is identical to the mDNS ID
194201
if len(s.alternateMdnsServiceName) > 0 {
195202
return s.alternateMdnsServiceName
196203
}
197204

198205
return s.generateIdentifier()
199206
}
207+
208+
// return the sites predefined grid voltage
209+
func (s *Configuration) Voltage() float64 {
210+
return s.voltage
211+
}

0 commit comments

Comments
 (0)