Allow decorating powerless switch charger with separate meter (#2472)

This commit is contained in:
andig 2022-02-03 08:59:57 +01:00 • committed by GitHub
parent acc581b903
commit bec8cb202b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 11 deletions

View file

@ -139,10 +139,10 @@ func (c *FritzDECT) CurrentPower() (float64, error) {
return power, err
}
var _ api.ChargeRater = (*FritzDECT)(nil)
var _ api.MeterEnergy = (*FritzDECT)(nil)
// ChargedEnergy implements the api.ChargeRater interface
func (c *FritzDECT) ChargedEnergy() (float64, error) {
// TotalEnergy implements the api.MeterEnergy interface
func (c *FritzDECT) TotalEnergy() (float64, error) {
// fetch basicdevicestats
resp, err := c.fritzdect.ExecCmd("getbasicdevicestats")
if err != nil {

View file

@ -125,10 +125,10 @@ func (c *Tasmota) CurrentPower() (float64, error) {
return power, err
}
var _ api.ChargeRater = (*Tasmota)(nil)
var _ api.MeterEnergy = (*Tasmota)(nil)
// ChargedEnergy implements the api.ChargeRater interface
func (c *Tasmota) ChargedEnergy() (float64, error) {
// TotalEnergy implements the api.MeterEnergy interface
func (c *Tasmota) TotalEnergy() (float64, error) {
var resp tasmota.StatusSNSResponse
err := c.GetJSON(c.cmdUri("Status 8"), &resp)

View file

@ -134,10 +134,10 @@ func (c *TPLink) CurrentPower() (float64, error) {
return power, nil
}
var _ api.ChargeRater = (*TPLink)(nil)
var _ api.MeterEnergy = (*TPLink)(nil)
// ChargedEnergy implements the api.ChargeRater interface
func (c *TPLink) ChargedEnergy() (float64, error) {
// TotalEnergy implements the api.MeterEnergy interface
func (c *TPLink) TotalEnergy() (float64, error) {
var resp tplink.DayStatResponse
year, month, day := time.Now().Date()
cmd := fmt.Sprintf(`{"emeter":{"get_daystat":{"day":%v,"month":%v,"year":%v}}}`, day, int(month), year)

View file

@ -302,12 +302,16 @@ func (lp *LoadPoint) requestUpdate() {
// configureChargerType ensures that chargeMeter, Rate and Timer can use charger capabilities
func (lp *LoadPoint) configureChargerType(charger api.Charger) {
var integrated bool
// ensure charge meter exists
if lp.chargeMeter == nil {
integrated = true
if mt, ok := charger.(api.Meter); ok {
lp.chargeMeter = mt
} else {
mt := &wrapper.ChargeMeter{}
mt := new(wrapper.ChargeMeter)
_ = lp.bus.Subscribe(evChargeCurrent, lp.evChargeCurrentWrappedMeterHandler)
_ = lp.bus.Subscribe(evChargeStop, func() { mt.SetPower(0) })
lp.chargeMeter = mt
@ -315,7 +319,9 @@ func (lp *LoadPoint) configureChargerType(charger api.Charger) {
}
// ensure charge rater exists
if rt, ok := charger.(api.ChargeRater); ok {
// measurement are obtained from separate charge meter if defined
// (https://github.com/evcc-io/evcc/issues/2469)
if rt, ok := charger.(api.ChargeRater); ok && integrated {
lp.chargeRater = rt
} else {
rt := wrapper.NewChargeRater(lp.log, lp.chargeMeter)