diff --git a/assets/js/components/Loadpoint.vue b/assets/js/components/Loadpoint.vue
index b601113eb..5602d9f27 100644
--- a/assets/js/components/Loadpoint.vue
+++ b/assets/js/components/Loadpoint.vue
@@ -182,8 +182,6 @@ export default {
phaseRemaining: Number,
pvRemaining: Number,
pvAction: String,
- guardRemaining: Number,
- guardAction: String,
smartCostLimit: Number,
smartCostType: String,
smartCostActive: Boolean,
@@ -196,7 +194,6 @@ export default {
tickerHandler: null,
phaseRemainingInterpolated: this.phaseRemaining,
pvRemainingInterpolated: this.pvRemaining,
- guardRemainingInterpolated: this.guardRemaining,
chargeDurationInterpolated: this.chargeDuration,
chargeRemainingDurationInterpolated: this.chargeRemainingDuration,
};
@@ -252,9 +249,6 @@ export default {
pvRemaining() {
this.pvRemainingInterpolated = this.pvRemaining;
},
- guardRemaining() {
- this.guardRemainingInterpolated = this.guardRemaining;
- },
chargeDuration() {
this.chargeDurationInterpolated = this.chargeDuration;
},
@@ -276,9 +270,6 @@ export default {
if (this.pvRemainingInterpolated > 0) {
this.pvRemainingInterpolated--;
}
- if (this.guardRemainingInterpolated > 0) {
- this.guardRemainingInterpolated--;
- }
if (this.chargeDurationInterpolated > 0 && this.charging) {
this.chargeDurationInterpolated++;
}
diff --git a/assets/js/components/Vehicle.story.vue b/assets/js/components/Vehicle.story.vue
index b3a7f67a0..04b4e7765 100644
--- a/assets/js/components/Vehicle.story.vue
+++ b/assets/js/components/Vehicle.story.vue
@@ -108,9 +108,6 @@ const hoursFromNow = function (hours) {
:pvRemainingInterpolated="155"
/>
-
-
-
{
{ remaining: "1:30\u202Fm" }
);
});
- test("show guard timer if it exists", () => {
- expectStatus(
- {
- connected: true,
- guardAction: "enable",
- guardRemainingInterpolated: 90,
- },
- "guard",
- { remaining: "1:30\u202Fm" }
- );
- });
- test("don't show guard timer if another timer exists", () => {
- expectStatus(
- {
- connected: true,
- charging: true,
- pvAction: "disable",
- pvRemainingInterpolated: 30,
- guardAction: "enable",
- guardRemainingInterpolated: 90,
- },
- "pvDisable",
- { remaining: "30\u202Fs" }
- );
- });
- test("show guard timer if charging and no other timer exists", () => {
- expectStatus(
- {
- connected: true,
- charging: true,
- guardAction: "enable",
- guardRemainingInterpolated: 90,
- },
- "guard",
- { remaining: "1:30\u202Fm" }
- );
- });
});
describe("vehicle target soc", () => {
diff --git a/assets/js/components/VehicleStatus.vue b/assets/js/components/VehicleStatus.vue
index c0399790d..9f4c72583 100644
--- a/assets/js/components/VehicleStatus.vue
+++ b/assets/js/components/VehicleStatus.vue
@@ -25,8 +25,6 @@ export default {
phaseRemainingInterpolated: Number,
pvAction: String,
pvRemainingInterpolated: Number,
- guardAction: String,
- guardRemainingInterpolated: Number,
targetChargeDisabled: Boolean,
vehicleClimaterActive: Boolean,
smartCostLimit: Number,
@@ -48,9 +46,6 @@ export default {
this.pvRemainingInterpolated > 0 && ["enable", "disable"].includes(this.pvAction)
);
},
- guardTimerActive() {
- return this.guardRemainingInterpolated > 0 && this.guardAction === "enable";
- },
message: function () {
const t = (key, data) => {
if (this.heating) {
@@ -128,12 +123,6 @@ export default {
});
}
- if (this.guardTimerActive) {
- return t("guard", {
- remaining: this.fmtDuration(this.guardRemainingInterpolated),
- });
- }
-
if (this.charging) {
return t("charging");
}
diff --git a/core/loadpoint.go b/core/loadpoint.go
index d19ff444f..d16ac59e7 100644
--- a/core/loadpoint.go
+++ b/core/loadpoint.go
@@ -43,9 +43,6 @@ const (
pvEnable = "enable"
pvDisable = "disable"
- guardTimer = "guard"
- guardEnable = "enable"
-
phaseTimer = "phase"
phaseScale1p = "scale1p"
phaseScale3p = "scale3p"
@@ -55,9 +52,8 @@ const (
minActiveCurrent = 1.0 // minimum current at which a phase is treated as active
minActiveVoltage = 207 // minimum voltage at which a phase is treated as active
- guardGracePeriod = 60 * time.Second // allow out of sync during this timespan
- phaseSwitchCommandTimeout = 30 * time.Second // do not sync charger enabled/disabled state during this timespan
- phaseSwitchDuration = 60 * time.Second // do not measure phases during this timespan
+ chargerSwitchDuration = 60 * time.Second // allow out of sync during this timespan
+ phaseSwitchDuration = 60 * time.Second // allow out of sync and do not measure phases during this timespan
)
// elapsed is the time an expired timer will be set to
@@ -116,12 +112,12 @@ type Loadpoint struct {
MeterRef string `mapstructure:"meter"` // Charge meter reference
Soc SocConfig
Enable, Disable ThresholdConfig
- GuardDuration time.Duration // charger enable/disable minimum holding time
// TODO deprecated
- ConfiguredPhases_ int `mapstructure:"phases"`
- MinCurrent_ float64 `mapstructure:"minCurrent"`
- MaxCurrent_ float64 `mapstructure:"maxCurrent"`
+ GuardDuration_ time.Duration `mapstructure:"guardduration"` // charger enable/disable minimum holding time
+ ConfiguredPhases_ int `mapstructure:"phases"`
+ MinCurrent_ float64 `mapstructure:"minCurrent"`
+ MaxCurrent_ float64 `mapstructure:"maxCurrent"`
minCurrent float64 // PV mode: start current Min+PV mode: min current
maxCurrent float64 // Max allowed current. Physically ensured by the charger
@@ -134,9 +130,9 @@ type Loadpoint struct {
phases int // Charger enabled phases, guarded by mutex
measuredPhases int // Charger physically measured phases
chargeCurrent float64 // Charger current limit
- guardUpdated time.Time // Charger enabled/disabled timestamp
socUpdated time.Time // Soc updated timestamp (poll: connected)
vehicleDetect time.Time // Vehicle connected timestamp
+ chargerSwitched time.Time // Charger enabled/disabled timestamp
phasesSwitched time.Time // Phase switch timestamp
vehicleDetectTicker *clock.Ticker
vehicleIdentifier string
@@ -295,7 +291,6 @@ func NewLoadpoint(log *util.Logger, settings *Settings) *Loadpoint {
},
Enable: ThresholdConfig{Delay: time.Minute, Threshold: 0}, // t, W
Disable: ThresholdConfig{Delay: 3 * time.Minute, Threshold: 0}, // t, W
- GuardDuration: 5 * time.Minute,
sessionEnergy: NewEnergyMetrics(),
progress: NewProgress(0, 10), // soc progress indicator
coordinator: coordinator.NewDummy(), // dummy vehicle coordinator
@@ -600,7 +595,6 @@ func (lp *Loadpoint) Prepare(uiChan chan<- util.Param, pushChan chan<- push.Even
lp.publish(keys.PhasesActive, lp.ActivePhases())
lp.publishTimer(phaseTimer, 0, timerInactive)
lp.publishTimer(pvTimer, 0, timerInactive)
- lp.publishTimer(guardTimer, 0, timerInactive)
if phases := lp.getChargerPhysicalPhases(); phases != 0 {
lp.publish(keys.ChargerPhysicalPhases, phases)
@@ -641,7 +635,6 @@ func (lp *Loadpoint) Prepare(uiChan chan<- util.Param, pushChan chan<- push.Even
// read initial charger state to prevent immediately disabling charger
if enabled, err := lp.charger.Enabled(); err == nil {
if lp.enabled = enabled; enabled {
- lp.guardUpdated = lp.clock.Now()
// set defined current for use by pv mode
_ = lp.setLimit(lp.effectiveMinCurrent(), false)
}
@@ -662,7 +655,7 @@ func (lp *Loadpoint) syncCharger() error {
return err
}
- if lp.guardGracePeriodElapsed() {
+ if lp.chargerUpdateCompleted() {
defer func() {
lp.enabled = enabled
lp.publish(keys.Enabled, lp.enabled)
@@ -672,11 +665,10 @@ func (lp *Loadpoint) syncCharger() error {
if !enabled && lp.charging() {
lp.log.WARN.Println("charger logic error: disabled but charging")
enabled = true // treat as enabled when charging
- if lp.guardGracePeriodElapsed() {
+ if lp.chargerUpdateCompleted() {
if err := lp.charger.Enable(true); err != nil { // also enable charger to correct internal state
return err
}
- lp.elapseGuard()
lp.elapsePVTimer()
return nil
}
@@ -693,10 +685,9 @@ func (lp *Loadpoint) syncCharger() error {
// smallest adjustment most PWM-Controllers can do is: 100%÷256×0,6A = 0.234A
if math.Abs(lp.chargeCurrent-current) > 0.23 {
- if lp.guardGracePeriodElapsed() {
+ if lp.chargerUpdateCompleted() {
lp.log.WARN.Printf("charger logic error: current mismatch (got %.3gA, expected %.3gA)", current, lp.chargeCurrent)
}
-
lp.chargeCurrent = current
lp.bus.Publish(evChargeCurrent, lp.chargeCurrent)
}
@@ -705,13 +696,9 @@ func (lp *Loadpoint) syncCharger() error {
return nil
}
- if enabled || lp.phaseSwitchCommandTimeoutElapsed() {
- // ignore disabled state if vehicle was disconnected ^(lp.enabled && ^lp.connected)
- if lp.guardGracePeriodElapsed() && lp.phaseSwitchCompleted() && (enabled || lp.connected()) {
- lp.log.WARN.Printf("charger out of sync: expected %vd, got %vd", status[lp.enabled], status[enabled])
- lp.elapseGuard()
- }
- return nil
+ // ignore disabled state if vehicle was disconnected ^(lp.enabled && ^lp.connected)
+ if lp.chargerUpdateCompleted() && lp.phaseSwitchCompleted() && (enabled || lp.connected()) {
+ lp.log.WARN.Printf("charger out of sync: expected %vd, got %vd", status[lp.enabled], status[enabled])
}
return nil
@@ -752,12 +739,6 @@ func (lp *Loadpoint) setLimit(chargeCurrent float64, force bool) error {
lp.bus.Publish(evChargeCurrent, chargeCurrent)
}
- if lp.clock.Since(lp.guardUpdated).Truncate(time.Second) < lp.GuardDuration && !force {
- lp.publishTimer(guardTimer, lp.GuardDuration, guardEnable)
- return nil
- }
- lp.elapseGuard()
-
// set enabled/disabled
if enabled := chargeCurrent >= lp.effectiveMinCurrent(); enabled != lp.enabled {
if err := lp.charger.Enable(enabled); err != nil {
@@ -777,7 +758,7 @@ func (lp *Loadpoint) setLimit(chargeCurrent float64, force bool) error {
lp.log.DEBUG.Printf("charger %s", status[enabled])
lp.enabled = enabled
lp.publish(keys.Enabled, lp.enabled)
- lp.guardUpdated = lp.clock.Now()
+ lp.chargerSwitched = lp.clock.Now()
lp.bus.Publish(evChargeCurrent, chargeCurrent)
@@ -968,8 +949,6 @@ func (lp *Loadpoint) elapsePVTimer() {
lp.pvTimer = elapsed
lp.publishTimer(pvTimer, 0, timerInactive)
-
- lp.elapseGuard()
}
// resetPVTimer resets the pv enable/disable timer to disabled state
@@ -1061,7 +1040,7 @@ func (lp *Loadpoint) pvScalePhases(sitePower, minCurrent, maxCurrent float64) bo
// - https://github.com/evcc-io/evcc/issues/2613
measuredPhases := lp.getMeasuredPhases()
if phases > 0 && phases < measuredPhases {
- if lp.guardGracePeriodElapsed() {
+ if lp.chargerUpdateCompleted() {
lp.log.WARN.Printf("ignoring inconsistent phases: %dp < %dp observed active", phases, measuredPhases)
}
lp.resetMeasuredPhases()
@@ -1140,9 +1119,6 @@ func (lp *Loadpoint) publishTimer(name string, delay time.Duration, action strin
if name == phaseTimer {
timer = lp.phaseTimer
}
- if name == guardTimer {
- timer = lp.guardUpdated
- }
remaining := delay - lp.clock.Since(timer)
if remaining < 0 {
@@ -1472,14 +1448,6 @@ func (lp *Loadpoint) publishSocAndRange() {
}
}
-func (lp *Loadpoint) elapseGuard() {
- if lp.guardUpdated != elapsed {
- lp.log.DEBUG.Print("charger: guard elapse")
- lp.guardUpdated = elapsed
- lp.publishTimer(guardTimer, 0, timerInactive)
- }
-}
-
// addTask adds a single task to the queue
func (lp *Loadpoint) addTask(task func()) {
// test guard
@@ -1515,17 +1483,12 @@ func (lp *Loadpoint) stopWakeUpTimer() {
lp.wakeUpTimer.Stop()
}
-// guardGracePeriodElapsed checks if last guard update is within guard grace period
-func (lp *Loadpoint) guardGracePeriodElapsed() bool {
- return time.Since(lp.guardUpdated) > guardGracePeriod
+// chargerUpdateCompleted returns true if enable command should be already processed by the charger (so we can try to sync charger and loadpoint)
+func (lp *Loadpoint) chargerUpdateCompleted() bool {
+ return time.Since(lp.chargerSwitched) > chargerSwitchDuration
}
-// phaseSwitchCommandTimeoutElapsed returns true if phase switch command should be already processed by the charger
-func (lp *Loadpoint) phaseSwitchCommandTimeoutElapsed() bool {
- return time.Since(lp.phasesSwitched) > phaseSwitchCommandTimeout
-}
-
-// phaseSwitchCompleted returns true if phase switch has completed
+// phaseSwitchCompleted returns true if phase switch command should be already processed by the charger (so we can try to sync charger and loadpoint and are able to measure currents)
func (lp *Loadpoint) phaseSwitchCompleted() bool {
return time.Since(lp.phasesSwitched) > phaseSwitchDuration
}
diff --git a/core/loadpoint_test.go b/core/loadpoint_test.go
index 53c9b8a87..ecd6e4721 100644
--- a/core/loadpoint_test.go
+++ b/core/loadpoint_test.go
@@ -696,131 +696,6 @@ func TestSocPoll(t *testing.T) {
}
}
-// test guard timer is properly published during disable cycle
-func TestGuardPublish(t *testing.T) {
- ctrl := gomock.NewController(t)
- defer ctrl.Finish()
- clock := clock.NewMock()
- charger := api.NewMockCharger(ctrl)
- rater := api.NewMockChargeRater(ctrl)
- startPointInTime := clock.Now()
-
- lp := &Loadpoint{
- log: util.NewLogger("foo"),
- bus: evbus.New(),
- clock: clock,
- charger: charger,
- chargeMeter: &Null{}, // silence nil panics
- chargeRater: rater,
- chargeTimer: &Null{}, // silence nil panics
- guardUpdated: startPointInTime,
- pvTimer: time.Time{},
- wakeUpTimer: NewTimer(),
- sessionEnergy: NewEnergyMetrics(),
- minCurrent: minA,
- maxCurrent: maxA,
- chargeCurrent: maxA,
- status: api.StatusC,
- mode: api.ModePV,
- enabled: true,
- Disable: ThresholdConfig{Delay: 2 * time.Minute, Threshold: 0}, // t, W
- GuardDuration: 3 * time.Minute,
- }
-
- util.LogLevel("DEBUG", nil)
-
- attachListeners(t, lp)
- // attach cache for verifying values
- _, expectCache := cacheExpecter(t, lp)
-
- rater.EXPECT().ChargedEnergy().AnyTimes()
- charger.EXPECT().Enabled().DoAndReturn(func() (bool, error) { return lp.enabled, nil }).AnyTimes() // just follow the loadpoint
- charger.EXPECT().Status().Return(api.StatusC, nil).Times(4)
- charger.EXPECT().Enable(false).Return(nil)
-
- tc := []struct {
- step string
- guardUpdates time.Time
- guardTimerRemaining time.Duration
- }{
- {"kick off pv disable timer", startPointInTime, 3 * time.Minute},
- {"continue pv disable timer", startPointInTime, 2 * time.Minute},
- {"disable charger prevented by guard", startPointInTime, 1 * time.Minute},
- {"guard elapse, publish new guard time", startPointInTime.Add(3 * time.Minute), time.Duration(0)},
- }
-
- for _, tc := range tc {
- t.Logf("%+v", tc)
- lp.Update(15000, false, false, false, 0, nil, nil)
- assert.Equal(t, tc.guardUpdates, lp.guardUpdated)
- expectCache(guardTimer+"Remaining", tc.guardTimerRemaining)
- clock.Add(time.Minute)
- }
-}
-
-// test guard timer is properly published if charger disable sequence is aborted
-func TestGuardPublishOnDisableAbort(t *testing.T) {
- ctrl := gomock.NewController(t)
- defer ctrl.Finish()
- clock := clock.NewMock()
- charger := api.NewMockCharger(ctrl)
- rater := api.NewMockChargeRater(ctrl)
- startPointInTime := clock.Now()
-
- lp := &Loadpoint{
- log: util.NewLogger("foo"),
- bus: evbus.New(),
- clock: clock,
- charger: charger,
- chargeMeter: &Null{}, // silence nil panics
- chargeRater: rater,
- chargeTimer: &Null{}, // silence nil panics
- guardUpdated: startPointInTime,
- pvTimer: time.Time{},
- wakeUpTimer: NewTimer(),
- sessionEnergy: NewEnergyMetrics(),
- minCurrent: minA,
- maxCurrent: maxA,
- chargeCurrent: maxA,
- status: api.StatusC,
- mode: api.ModePV,
- enabled: true,
- Disable: ThresholdConfig{Delay: 2 * time.Minute, Threshold: 0}, // t, W
- GuardDuration: 4 * time.Minute,
- }
-
- util.LogLevel("DEBUG", nil)
-
- attachListeners(t, lp)
- // attach cache for verifying values
- _, expectCache := cacheExpecter(t, lp)
-
- rater.EXPECT().ChargedEnergy().AnyTimes()
- charger.EXPECT().Enabled().DoAndReturn(func() (bool, error) { return lp.enabled, nil }).AnyTimes() // just follow the loadpoint
- charger.EXPECT().Status().Return(api.StatusC, nil).Times(5)
-
- tc := []struct {
- step string
- sitePower float64
- guardUpdated time.Time
- guardTimerRemaining time.Duration
- }{
- {"kick off pv disable timer", 15000, startPointInTime, 4 * time.Minute},
- {"continue pv disable timer", 15000, startPointInTime, 3 * time.Minute},
- {"disable charger prevented by guard", 15000, startPointInTime, 2 * time.Minute},
- {"disable charger reset, pv power is back", -1, startPointInTime, 1 * time.Minute},
- {"guard elapsed, publish new guard time", -1, elapsed, time.Duration(0)},
- }
-
- for _, tc := range tc {
- t.Logf("%+v", tc)
- lp.Update(tc.sitePower, false, false, false, 0, nil, nil)
- assert.Equal(t, tc.guardUpdated, lp.guardUpdated)
- expectCache(guardTimer+"Remaining", tc.guardTimerRemaining)
- clock.Add(time.Minute)
- }
-}
-
// test PV hysteresis after phase switch down, depending on remaining energy
func TestPVHysteresisAfterPhaseSwitch(t *testing.T) {
const dt = time.Minute
diff --git a/evcc.dist.yaml b/evcc.dist.yaml
index 2ba2a2b87..6dc052bfe 100644
--- a/evcc.dist.yaml
+++ b/evcc.dist.yaml
@@ -138,7 +138,6 @@ loadpoints:
disable: # pv mode disable behavior
delay: 3m # threshold must be exceeded for this long
threshold: 0 # maximum import power (W)
- guardDuration: 5m # switch charger contactor not more often than this (default 5m)
# tariffs are the fixed or variable tariffs
tariffs:
diff --git a/i18n/ca.toml b/i18n/ca.toml
index 290b558f7..493ed9ae8 100644
--- a/i18n/ca.toml
+++ b/i18n/ca.toml
@@ -241,7 +241,6 @@ cleanEnergyCharging = "Energia neta disponible. Carregant..."
climating = "Precondicionament detectat."
connected = "Connectat."
disconnected = "Desconnectat."
-guard = "Protecció de commutació activa durant {remaining}"
minCharge = "Càrrega mínima fins a {soc}%."
pvDisable = "Excedent insuficient. Pausa en {remaining}..."
pvEnable = "Excedent disponible. Començar en {remaining}..."
diff --git a/i18n/da.toml b/i18n/da.toml
index d79c61910..03279c64f 100644
--- a/i18n/da.toml
+++ b/i18n/da.toml
@@ -370,7 +370,6 @@ cleanEnergyCharging = "Oplader med CO2 neutral energi: {co2} (limit {limit})"
climating = "Forkonditionering registreret."
connected = "Forbundet."
disconnected = "Afbrudt."
-guard = "Switching-beskyttelse er aktiv i {remaining}…"
minCharge = "Minimum opladning til {soc} %."
pvDisable = "Ikke nok overskud. Pause i {remaining}..."
pvEnable = "Overskud tilgængeligt. Starter om {remaining}..."
diff --git a/i18n/de.toml b/i18n/de.toml
index 67e6e7432..b5e5f69f7 100644
--- a/i18n/de.toml
+++ b/i18n/de.toml
@@ -362,7 +362,6 @@ cleanEnergyCharging = "Lade saubere Energie: {co2} (Grenze {limit})"
climating = "Vorklimatisierung erkannt."
connected = "Verbunden."
disconnected = "Nicht verbunden."
-guard = "Schaltschutz aktiv für {remaining}."
minCharge = "Mindestladung bis {soc}%."
pvDisable = "Zu wenig Überschuss. Pausiere in {remaining} …"
pvEnable = "Überschuss verfügbar. Starte in {remaining} …"
diff --git a/i18n/en.toml b/i18n/en.toml
index 8abf3e5a7..f48addfe7 100644
--- a/i18n/en.toml
+++ b/i18n/en.toml
@@ -359,7 +359,6 @@ cleanEnergyCharging = "Charging clean energy: {co2} (limit {limit})"
climating = "Pre-conditioning detected."
connected = "Connected."
disconnected = "Disconnected."
-guard = "Switching protection active for {remaining}."
minCharge = "Minimum charging to {soc}%."
pvDisable = "Not enough surplus. Pausing in {remaining}…"
pvEnable = "Surplus available. Starting in {remaining}…"
diff --git a/i18n/es.toml b/i18n/es.toml
index 2e24754f2..bc9590ed6 100644
--- a/i18n/es.toml
+++ b/i18n/es.toml
@@ -375,9 +375,6 @@ cleanEnergyCharging = "Cargando con energía limpia: {co2} (límite {limit})"
climating = "Preacondicionamiento detectado."
connected = "Conectado."
disconnected = "Desconectado."
-guard = "Cambiando la protección activa para {remaining}"
-guardDisable = "Pausando en {remaining}..."
-guardEnable = "Comenzando en {remaining}..."
minCharge = "Carga mínima hasta {soc}%."
pvDisable = "Excedente insuficiente. Pausa en {remaining}..."
pvEnable = "Excedente disponibile. Empezar en {remaining}..."
diff --git a/i18n/fi.toml b/i18n/fi.toml
index 6ce62616a..98e6b1bf5 100644
--- a/i18n/fi.toml
+++ b/i18n/fi.toml
@@ -293,7 +293,6 @@ cleanEnergyCharging = "Lataa puhdasta energiaa: {co2} (limit {limit})"
climating = "Esilämmitys/-viilennys havaittu."
connected = "Yhdistetty."
disconnected = "Irroitettu."
-guard = "Suojaus aktiivinen: {remaining}…"
minCharge = "Ladataan minimissään {soc}%."
pvDisable = "Ei tarpeeksi ylijäämää. Tauko {remaining}…"
pvEnable = "Ylijäämää saatavilla. Aloitus {remaining}…"
diff --git a/i18n/fr.toml b/i18n/fr.toml
index 9b3c61032..9d5b59fc0 100644
--- a/i18n/fr.toml
+++ b/i18n/fr.toml
@@ -321,7 +321,6 @@ cleanEnergyCharging = "En charge avec énergie propre : {co2} (limit < {limit}
climating = "Pré-conditionnement détecté."
connected = "Connecté."
disconnected = "Déconnecté."
-guard = "Protection de commutation active pour {remaining}..."
minCharge = "Charge minimale jusqu'à {soc}%."
pvDisable = "Pas assez de surplus. Pause dans {remaining}…"
pvEnable = "Surplus disponible. Démarre dans {remaining}…"
diff --git a/i18n/hr.toml b/i18n/hr.toml
index 54aef691a..de8cacc7a 100644
--- a/i18n/hr.toml
+++ b/i18n/hr.toml
@@ -323,7 +323,6 @@ cleanEnergyCharging = "Napajanje čistom energijom: {co2} (ograničenje {limit})
climating = "Otkriveno predkondicioniranje."
connected = "Povezano."
disconnected = "Nepovezano."
-guard = "Promjena zaštite aktivna za {remaining}."
minCharge = "Minimalno napajanje do {soc} %."
pvDisable = "Nema dovoljno viška. Zaustavlja se za {remaining} …"
pvEnable = "Dostupan je višak. Počinje za {remaining} …"
diff --git a/i18n/lt.toml b/i18n/lt.toml
index d6cd6c7e1..e56750e84 100644
--- a/i18n/lt.toml
+++ b/i18n/lt.toml
@@ -375,9 +375,6 @@ cleanEnergyCharging = "Įkraunama švaria energija: {co2} (limitas {limit})"
climating = "Aptiktas išankstinis kondicionavimas."
connected = "Prijungtas."
disconnected = "Neprijungtas."
-guard = "Per dažno junginėjimo apsauga {remaining}…"
-guardDisable = "Pauzė už {remaining}…"
-guardEnable = "Pradedam už {remaining}…"
minCharge = "Minimalus įkrovimas iki {soc}%."
pvDisable = "Trūksta saulės. Pauzė už {remaining}..."
pvEnable = "Saulės užtenka, įkrovimas už {remaining}..."
diff --git a/i18n/nl.toml b/i18n/nl.toml
index b10a38911..fd4715d10 100644
--- a/i18n/nl.toml
+++ b/i18n/nl.toml
@@ -372,7 +372,6 @@ cleanEnergyCharging = "Laden actief met schone energie. {co2} (limit {limit})"
climating = "Voor-conditionering gedetecteerd."
connected = "Verbonden."
disconnected = "Niet verbonden."
-guard = "Schakelbeveiliging actief voor {remaining}."
minCharge = "Minimaal opladen naar {soc}%."
pvDisable = "Onvoldoende PV overschot beschikbaar. Pauzeren over {remaining}..."
pvEnable = "Voldoende PV overschot beschikbaar. Starten over {remaining}..."
diff --git a/i18n/no.toml b/i18n/no.toml
index 60c92d4ee..0fb657ae5 100644
--- a/i18n/no.toml
+++ b/i18n/no.toml
@@ -284,7 +284,6 @@ cleanEnergyCharging = "Ren energi tilgjengelig. Lader …"
climating = "Klimaanlegg på forhånd oppdaget."
connected = "Tilkoblet."
disconnected = "Frakoblet."
-guard = "Bryterbeskyttelse aktiv i {remaining} …"
minCharge = "Minimumslading til {soc}%."
pvDisable = "Ikke nok overskudd. Pause i {remaining}..."
pvEnable = "Overskudd tilgjengelig. Starter om {remaining}..."
diff --git a/i18n/pl.toml b/i18n/pl.toml
index 8123c8c2e..e8bec426d 100644
--- a/i18n/pl.toml
+++ b/i18n/pl.toml
@@ -322,7 +322,6 @@ cleanEnergyCharging = "Ładowanie czystą energią: {co2} (ograniczenie {limit})
climating = "Wykryto wstępne przygotowanie"
connected = "Połączony."
disconnected = "Rozłączony."
-guard = "Ochrona przełączania aktywna {remaining}…"
minCharge = "Minimalne ładowanie do {soc}%."
pvDisable = "Za mało nadwyżki. Pauza po {remaining}..."
pvEnable = "Dostępna nadwyżka. Począwszy po {remaining}..."
diff --git a/i18n/pt.toml b/i18n/pt.toml
index 15f3d569b..0b9f5372c 100644
--- a/i18n/pt.toml
+++ b/i18n/pt.toml
@@ -323,9 +323,6 @@ cleanEnergyCharging = "Carregando energia limpa: {co2} (limit {limit})"
climating = "Pré-condicionamento detectado."
connected = "Ligado."
disconnected = "Não conectado."
-guard = "Proteção de ligação ativa para {remaining}."
-guardDisable = "Pausar em {remaining}…"
-guardEnable = "Iniciando em {remaining}..."
minCharge = "Carga mínima até {soc}%"
pvDisable = "Excesso insuficiente. Pausa em {remaining}..."
pvEnable = "Excesso disponível. Carga em {remaining}..."
diff --git a/i18n/sv.toml b/i18n/sv.toml
index f2019e81c..418a8a9ab 100644
--- a/i18n/sv.toml
+++ b/i18n/sv.toml
@@ -370,7 +370,6 @@ cleanEnergyCharging = "Laddar grön energi: {co2} (gräns {limit})"
climating = "Förvärmning identifierad."
connected = "Inkopplad."
disconnected = "Frånkopplad."
-guard = "Brytarskydd aktivt i {remaining}…"
minCharge = "Minimiladdning till {soc}%."
pvDisable = "Inte tillräckligt med överskott. Pausar i {remaining}..."
pvEnable = "Överskott tillgängligt. Börjar om {remaining}..."
diff --git a/i18n/uk.toml b/i18n/uk.toml
index 493261c8f..49b2e4052 100644
--- a/i18n/uk.toml
+++ b/i18n/uk.toml
@@ -281,9 +281,6 @@ cleanEnergyCharging = "Чиста енергія доступна. Зарядж
climating = "Виявлено попередню підготовку."
connected = "Підключено."
disconnected = "Відключено."
-guard = "Захист від перемикання активовано для {remaining}."
-guardDisable = "Пауза через {remaining}…"
-guardEnable = "Початок через {remaining}…"
minCharge = "Мінімальна зарядка до {soc}%."
pvDisable = "Недостатньо надлишку. Пауза через {remaining}…"
pvEnable = "Надлишок доступний. Початок через {remaining}…"