Skip to content

Commit

Permalink
Make energy readings optional (#91)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed May 2, 2020
1 parent 4cb76bd commit b930f78
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 20 deletions.
6 changes: 3 additions & 3 deletions README.md
Expand Up @@ -203,8 +203,8 @@ Meters provide data about power and energy consumption. Available meter implemen
model: sdm
uri: rs485.fritz.box:23
id: 2
power: PowerL1
energy: Export
power: Power # reading as understood by MBMD, leave empty for power default value
energy: Export # optional reading for total energy values, specify for charge meter
```

- `sma`: SMA Home Manager and SMA Energy Meter. Power reading is configured out of the box but can be customizied if necessary. To obtain energy readings define the desired Obis code (Import Energy: "1:1.8.0", Export Energy: "1:2.8.0"):
Expand All @@ -214,7 +214,7 @@ Meters provide data about power and energy consumption. Available meter implemen
type: sdm
uri: 192.168.1.4
power: # leave empty for mixed import/export energy
energy: # leave empty to disable or chose obis 1:1.8.0/1:2.8.0
energy: # leave empty to disable or choose obis 1:1.8.0/1:2.8.0
```

- `default`: default meter implementation where meter readings- `power` and `energy` are configured using [plugin](#plugins)
Expand Down
37 changes: 21 additions & 16 deletions meter/modbus.go
Expand Up @@ -81,24 +81,24 @@ func NewModbusFromConfig(log *util.Logger, other map[string]interface{}) api.Met
}
}

// energy reading
if cc.Energy == "" {
cc.Energy = "Sum"
}

energyM, err := meters.MeasurementString(cc.Energy)
if err != nil {
log.FATAL.Fatalf("invalid measurement for energy: %s", cc.Energy)
}
// decorate energy reading
if cc.Energy != "" {
energyM, err := meters.MeasurementString(cc.Energy)
if err != nil {
log.FATAL.Fatalf("invalid measurement for energy: %s", cc.Energy)
}

// for RS485 check if producer supports the measurement
m.opEnergy = rs485.Operation{IEC61850: energyM}
if dev, ok := device.(*rs485.RS485); ok {
m.opEnergy = modbus.RS485FindDeviceOp(dev, energyM)
// for RS485 check if producer supports the measurement
m.opEnergy = rs485.Operation{IEC61850: energyM}
if dev, ok := device.(*rs485.RS485); ok {
m.opEnergy = modbus.RS485FindDeviceOp(dev, energyM)

if m.opEnergy.IEC61850 == 0 {
log.FATAL.Fatalf("unsupported measurement for energy: %s", cc.Energy)
if m.opEnergy.IEC61850 == 0 {
log.FATAL.Fatalf("unsupported measurement for energy: %s", cc.Energy)
}
}

return &ModbusEnergy{m}
}

return m
Expand Down Expand Up @@ -131,7 +131,12 @@ func (m *Modbus) CurrentPower() (float64, error) {
return m.floatGetter(m.opPower)
}

// ModbusEnergy decorates Modbus with api.MeterEnergy interface
type ModbusEnergy struct {
*Modbus
}

// TotalEnergy implements the Meter.TotalEnergy interface
func (m *Modbus) TotalEnergy() (float64, error) {
func (m *ModbusEnergy) TotalEnergy() (float64, error) {
return m.floatGetter(m.opEnergy)
}
3 changes: 2 additions & 1 deletion provider/modbus.go
Expand Up @@ -19,6 +19,7 @@ type Modbus struct {
op rs485.Operation
}

// ModbusSettings combine physical modbus configuration and MBMD model
type ModbusSettings struct {
Model string
modbus.Connection `mapstructure:",squash"`
Expand Down Expand Up @@ -49,7 +50,7 @@ func NewModbusFromConfig(log *util.Logger, typ string, other map[string]interfac
conn.Slave(cc.ID)
err = device.Initialize(conn.ModbusClient())

// silence Kostal implementation errors
// silence KOSTAL implementation errors
if _, partial := err.(meters.SunSpecPartiallyInitialized); partial {
err = nil
}
Expand Down

0 comments on commit b930f78

Please sign in to comment.