@@ -83,22 +83,23 @@ type AdapterConfig struct {
8383
8484// DeviceConfig describes a single device's configuration
8585type DeviceConfig struct {
86- Type string
87- ID uint8
88- Name string
89- Adapter string
86+ Type string
87+ ID uint8
88+ SubDevice int
89+ Name string
90+ Adapter string
9091}
9192
9293// DeviceConfigHandler creates map of meter managers from given configuration
9394type DeviceConfigHandler struct {
9495 DefaultDevice string
95- Managers map [string ]meters.Manager
96+ Managers map [string ]* meters.Manager
9697}
9798
9899// NewDeviceConfigHandler creates a configuration handler
99100func NewDeviceConfigHandler () * DeviceConfigHandler {
100101 conf := & DeviceConfigHandler {
101- Managers : make (map [string ]meters.Manager ),
102+ Managers : make (map [string ]* meters.Manager ),
102103 }
103104 return conf
104105}
@@ -130,7 +131,7 @@ func createConnection(device string, rtu bool, baudrate int, comset string) (res
130131}
131132
132133// ConnectionManager returns connection manager from cache or creates new connection wrapped by manager
133- func (conf * DeviceConfigHandler ) ConnectionManager (connSpec string , rtu bool , baudrate int , comset string ) meters.Manager {
134+ func (conf * DeviceConfigHandler ) ConnectionManager (connSpec string , rtu bool , baudrate int , comset string ) * meters.Manager {
134135 manager , ok := conf .Managers [connSpec ]
135136 if ! ok {
136137 conn := createConnection (connSpec , rtu , baudrate , comset )
@@ -142,8 +143,9 @@ func (conf *DeviceConfigHandler) ConnectionManager(connSpec string, rtu bool, ba
142143}
143144
144145func (conf * DeviceConfigHandler ) createDeviceForManager (
145- manager meters.Manager ,
146+ manager * meters.Manager ,
146147 meterType string ,
148+ subdevice int ,
147149) meters.Device {
148150 var meter meters.Device
149151 meterType = strings .ToUpper (meterType )
@@ -159,8 +161,12 @@ func (conf *DeviceConfigHandler) createDeviceForManager(
159161
160162 sort .SearchStrings (sunspecTypes , meterType )
161163 if isSunspec {
162- meter = sunspec .NewDevice (meterType )
164+ meter = sunspec .NewDevice (meterType , subdevice )
163165 } else {
166+ if subdevice > 0 {
167+ log .Fatalf ("Invalid subdevice number for device %s: %d" , meterType , subdevice )
168+ }
169+
164170 var err error
165171 meter , err = rs485 .NewDevice (meterType )
166172 if err != nil {
@@ -189,7 +195,7 @@ func (conf *DeviceConfigHandler) CreateDevice(devConf DeviceConfig) {
189195 if ! ok {
190196 log .Fatalf ("Missing adapter configuration for device %v" , devConf )
191197 }
192- meter := conf .createDeviceForManager (manager , devConf .Type )
198+ meter := conf .createDeviceForManager (manager , devConf .Type , devConf . SubDevice )
193199
194200 if err := manager .Add (devConf .ID , meter ); err != nil {
195201 log .Fatalf ("Error adding device %v: %v." , devConf , err )
@@ -224,7 +230,19 @@ func (conf *DeviceConfigHandler) CreateDeviceFromSpec(deviceDef string) {
224230 log .Fatalf ("Cannot parse device definition- meter type empty: %s. See -h for help." , meterDef )
225231 }
226232
227- id , err := strconv .Atoi (devID )
233+ var subdevice int
234+ devIDSplit := strings .SplitN (devID , "." , 2 )
235+ if len (devIDSplit ) == 2 {
236+ var err error
237+ subdevice , err = strconv .Atoi (devIDSplit [1 ])
238+ if err != nil {
239+ log .Fatalf ("Error parsing device id %s: %v. See -h for help." , devID , err )
240+ }
241+ } else if len (devIDSplit ) > 2 {
242+ log .Fatalf ("Error parsing device id %s. See -h for help." , devID )
243+ }
244+
245+ id , err := strconv .Atoi (devIDSplit [0 ])
228246 if err != nil {
229247 log .Fatalf ("Error parsing device id %s: %v. See -h for help." , devID , err )
230248 }
@@ -233,7 +251,7 @@ func (conf *DeviceConfigHandler) CreateDeviceFromSpec(deviceDef string) {
233251 // have been created of the --rtu flag was specified. We'll not re-check this here.
234252 manager := conf .ConnectionManager (connSpec , false , 0 , "" )
235253
236- meter := conf .createDeviceForManager (manager , meterType )
254+ meter := conf .createDeviceForManager (manager , meterType , subdevice )
237255 if err := manager .Add (uint8 (id ), meter ); err != nil {
238256 log .Fatalf ("Error adding device %s: %v. See -h for help." , meterDef , err )
239257 }
0 commit comments