diff --git a/charger/smaevcharger.go b/charger/smaevcharger.go index 5b7ef852d..4f6d24b95 100644 --- a/charger/smaevcharger.go +++ b/charger/smaevcharger.go @@ -236,15 +236,22 @@ var _ api.MeterEnergy = (*Smaevcharger)(nil) // TotalEnergy implements the api.MeterEnergy interface func (wb *Smaevcharger) TotalEnergy() (float64, error) { - val, err := wb.getMeasurement("Measurement.Metering.GridMs.TotWhIn") - return val / 1e3, err + res, err := wb.getMeasurement("Measurement.Metering.GridMs.TotWhIn") + if se := new(smaevcharger.ErrUnknownMeasurement); errors.As(err, &se) { + res, err = wb.getMeasurement("Measurement.Metering.GridMs.TotWhIn.ChaSta") + } + return res / 1e3, err } var _ api.Meter = (*Smaevcharger)(nil) // CurrentPower implements the api.Meter interface func (wb *Smaevcharger) CurrentPower() (float64, error) { - return wb.getMeasurement("Measurement.Metering.GridMs.TotWIn") + res, err := wb.getMeasurement("Measurement.Metering.GridMs.TotWIn") + if se := new(smaevcharger.ErrUnknownMeasurement); errors.As(err, &se) { + res, err = wb.getMeasurement("Measurement.Metering.GridMs.TotWIn.ChaSta") + } + return res, err } var _ api.ChargeRater = (*Smaevcharger)(nil) @@ -252,6 +259,9 @@ var _ api.ChargeRater = (*Smaevcharger)(nil) // ChargedEnergy implements the api.ChargeRater interface func (wb *Smaevcharger) ChargedEnergy() (float64, error) { res, err := wb.getMeasurement("Measurement.ChaSess.WhIn") + if se := new(smaevcharger.ErrUnknownMeasurement); errors.As(err, &se) { + res, err = wb.getMeasurement("Measurement.Metering.GridMs.TotWhIn.ChaSta") + } return res / 1e3, err } @@ -317,7 +327,7 @@ func (wb *Smaevcharger) getMeasurement(id string) (float64, error) { } } - return 0, fmt.Errorf("unknown measurement: %s", id) + return 0, &smaevcharger.ErrUnknownMeasurement{Measurement: id} } func (wb *Smaevcharger) getParameter(id string) (string, error) { diff --git a/charger/smaevcharger/types.go b/charger/smaevcharger/types.go index a9f3394cc..fd0462b77 100644 --- a/charger/smaevcharger/types.go +++ b/charger/smaevcharger/types.go @@ -26,6 +26,14 @@ const ( ChargerManualLockDisabled = "5172" ) +type ErrUnknownMeasurement struct { + Measurement string +} + +func (e *ErrUnknownMeasurement) Error() string { + return "unknown measurement: " + e.Measurement +} + // Measurements Data json Response structure type Measurements struct { ChannelId string `json:"channelId"` diff --git a/templates/definition/charger/smaevcharger.yaml b/templates/definition/charger/smaevcharger.yaml index 4e0a196f5..52839a220 100644 --- a/templates/definition/charger/smaevcharger.yaml +++ b/templates/definition/charger/smaevcharger.yaml @@ -2,7 +2,7 @@ template: smaevcharger products: - brand: SMA description: - generic: EV Charger + generic: EV Charger, eCharger capabilities: ["mA"] requirements: evcc: ["sponsorship"] diff --git a/util/decoder.go b/util/decoder.go index e6b806a62..04fd62661 100644 --- a/util/decoder.go +++ b/util/decoder.go @@ -47,10 +47,10 @@ func NewConfigError(err error) error { return &ConfigError{err} } -func (e *ConfigError) Error() string { +func (e ConfigError) Error() string { return e.err.Error() } -func (e *ConfigError) Unwrap() error { +func (e ConfigError) Unwrap() error { return e.err }