From 91be66cc34345a2fadf69231e2927f401c3ba852 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 31 Dec 2022 15:13:33 +0100 Subject: [PATCH] chore: move phase setters to separate file (#5634) --- core/loadpoint.go | 34 ++-------------------------------- core/loadpoint_phases.go | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/core/loadpoint.go b/core/loadpoint.go index 017ed17a0..beb80ff8b 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -1300,36 +1300,6 @@ func (lp *Loadpoint) scalePhasesIfAvailable(phases int) error { return nil } -// setConfiguredPhases sets the default phase configuration -func (lp *Loadpoint) setConfiguredPhases(phases int) { - lp.Lock() - defer lp.Unlock() - - lp.ConfiguredPhases = phases - - // publish 1p3p capability and phase configuration - if _, ok := lp.charger.(api.PhaseSwitcher); ok { - lp.publish(phasesConfigured, lp.ConfiguredPhases) - } else { - lp.publish(phasesConfigured, nil) - } -} - -// setPhases sets the number of enabled phases without modifying the charger -func (lp *Loadpoint) setPhases(phases int) { - if lp.GetPhases() != phases { - lp.Lock() - lp.phases = phases - lp.Unlock() - - // reset timer to disabled state - lp.resetPhaseTimer() - - // measure phases after switching - lp.resetMeasuredPhases() - } -} - // scalePhases adjusts the number of active phases and returns the appropriate charging current. // Returns api.ErrNotAvailable if api.PhaseSwitcher is not available. func (lp *Loadpoint) scalePhases(phases int) error { @@ -1639,7 +1609,7 @@ func (lp *Loadpoint) updateChargeCurrents() { lp.measuredPhases = phases lp.Unlock() - lp.log.DEBUG.Printf("detected phases: %dp", phases) + lp.log.DEBUG.Printf("detected active phases: %dp", phases) lp.publish(phasesActive, phases) } } @@ -1676,7 +1646,7 @@ func (lp *Loadpoint) updateChargeVoltages() { } if phases >= 1 { - lp.log.DEBUG.Printf("detected phases: %dp", phases) + lp.log.DEBUG.Printf("detected connected phases: %dp", phases) lp.setPhases(phases) } } diff --git a/core/loadpoint_phases.go b/core/loadpoint_phases.go index 2eb217a02..346513aee 100644 --- a/core/loadpoint_phases.go +++ b/core/loadpoint_phases.go @@ -6,6 +6,36 @@ import ( "github.com/evcc-io/evcc/api" ) +// setConfiguredPhases sets the default phase configuration +func (lp *Loadpoint) setConfiguredPhases(phases int) { + lp.Lock() + defer lp.Unlock() + + lp.ConfiguredPhases = phases + + // publish 1p3p capability and phase configuration + if _, ok := lp.charger.(api.PhaseSwitcher); ok { + lp.publish(phasesConfigured, lp.ConfiguredPhases) + } else { + lp.publish(phasesConfigured, nil) + } +} + +// setPhases sets the number of enabled phases without modifying the charger +func (lp *Loadpoint) setPhases(phases int) { + if lp.GetPhases() != phases { + lp.Lock() + lp.phases = phases + lp.Unlock() + + // reset timer to disabled state + lp.resetPhaseTimer() + + // measure phases after switching + lp.resetMeasuredPhases() + } +} + // resetMeasuredPhases resets measured phases to unknown on vehicle disconnect, phase switch or phase api call func (lp *Loadpoint) resetMeasuredPhases() { lp.Lock() @@ -49,7 +79,14 @@ func (lp *Loadpoint) activePhases() int { vehicle := lp.getVehiclePhases() measured := lp.getMeasuredPhases() - return min(expect(vehicle), expect(physical), expect(measured)) + active := min(expect(vehicle), expect(physical), expect(measured)) + + // sanity check - we should not assume less active phases than actually measured + if measured > 0 && active < measured { + lp.log.WARN.Printf("phase mismatch between %dp measured for %dp vehicle and %dp charger", measured, vehicle, physical) + } + + return active } // maxActivePhases returns the maximum number of active phases for the meter.