Make energy readings optional (#91)

This commit is contained in:
andig 2020-05-02 13:00:03 +02:00 • committed by GitHub
parent 4cb76bdcf2
commit b930f78549
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 22 deletions

View file

@ -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"):
@ -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)

View file

@ -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)
}
// 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)
// 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)
if m.opEnergy.IEC61850 == 0 {
log.FATAL.Fatalf("unsupported measurement for energy: %s", cc.Energy)
}
}
return &ModbusEnergy{m}
}
return m
@ -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)
}

View file

@ -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"`
@ -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
}