diff --git a/assets/js/components/ChargingPlan.vue b/assets/js/components/ChargingPlan.vue
index edb2d804f..7fb993577 100644
--- a/assets/js/components/ChargingPlan.vue
+++ b/assets/js/components/ChargingPlan.vue
@@ -15,7 +15,7 @@
{{ targetTimeLabel() }}
@@ -125,7 +125,7 @@ export default {
planActive: Boolean,
planEnergy: Number,
planTime: String,
- planOverrun: Boolean,
+ planTimeUnreachable: Boolean,
rangePerSoc: Number,
smartCostLimit: Number,
smartCostType: String,
@@ -146,7 +146,7 @@ export default {
},
computed: {
buttonColor: function () {
- if (this.planOverrun) {
+ if (this.planTimeUnreachable) {
return "text-warning";
}
if (!this.enabled) {
diff --git a/assets/js/components/ChargingPlanWarnings.vue b/assets/js/components/ChargingPlanWarnings.vue
index 5b4936015..bdb0cbc9f 100644
--- a/assets/js/components/ChargingPlanWarnings.vue
+++ b/assets/js/components/ChargingPlanWarnings.vue
@@ -78,10 +78,8 @@ export default {
if (planTime && this.endTime) {
const dateWanted = new Date(planTime);
const dateEstimated = new Date(this.endTime);
- // account for rounding errors
- dateWanted.setSeconds(60);
- dateEstimated.setSeconds(0);
- return dateWanted < dateEstimated;
+ // 1 minute tolerance
+ return dateEstimated - dateWanted > 60 * 1e3;
}
return false;
},
diff --git a/assets/js/components/Loadpoint.vue b/assets/js/components/Loadpoint.vue
index 2a685bb8d..e8374af87 100644
--- a/assets/js/components/Loadpoint.vue
+++ b/assets/js/components/Loadpoint.vue
@@ -151,7 +151,7 @@ export default {
vehicles: Array,
planActive: Boolean,
planProjectedStart: String,
- planOverrun: Boolean,
+ planOverrun: Number,
planEnergy: Number,
planTime: String,
effectivePlanTime: String,
@@ -241,6 +241,10 @@ export default {
const features = this.vehicle?.features || [];
return features.includes("Offline") && features.includes("Retryable");
},
+ planTimeUnreachable: function () {
+ // 1 minute tolerance
+ return this.planOverrun > 60;
+ },
socBasedCharging: function () {
return this.vehicleHasSoc || this.vehicleSoc > 0;
},
diff --git a/assets/js/components/Vehicle.vue b/assets/js/components/Vehicle.vue
index 9e9520d74..4a199ea4a 100644
--- a/assets/js/components/Vehicle.vue
+++ b/assets/js/components/Vehicle.vue
@@ -106,7 +106,7 @@ export default {
planEnergy: Number,
planProjectedStart: String,
planTime: String,
- planOverrun: Boolean,
+ planTimeUnreachable: Boolean,
pvAction: String,
pvRemainingInterpolated: Number,
smartCostActive: Boolean,
diff --git a/assets/js/components/VehicleSoc.vue b/assets/js/components/VehicleSoc.vue
index 831bb9816..dd6dccd5b 100644
--- a/assets/js/components/VehicleSoc.vue
+++ b/assets/js/components/VehicleSoc.vue
@@ -43,7 +43,7 @@
class="plan-marker"
data-bs-toggle="tooltip"
:class="{
- 'plan-marker--warning': planOverrun,
+ 'plan-marker--warning': planTimeUnreachable,
'plan-marker--error': planMarkerUnreachable,
}"
:style="{ left: `${planMarkerPosition}%` }"
@@ -91,7 +91,7 @@ export default {
effectiveLimitSoc: Number,
limitEnergy: Number,
planEnergy: Number,
- planOverrun: Boolean,
+ planTimeUnreachable: Boolean,
chargedEnergy: Number,
socBasedCharging: Boolean,
socBasedPlanning: Boolean,
diff --git a/core/loadpoint_plan.go b/core/loadpoint_plan.go
index 23f81f0ed..70cc0c0ee 100644
--- a/core/loadpoint_plan.go
+++ b/core/loadpoint_plan.go
@@ -88,7 +88,7 @@ func (lp *Loadpoint) plannerActive() (active bool) {
}()
var planStart time.Time
- var planOverrun bool
+ var planOverrun time.Duration
defer func() {
lp.publish(keys.PlanProjectedStart, planStart)
lp.publish(keys.PlanOverrun, planOverrun)
@@ -125,7 +125,7 @@ func (lp *Loadpoint) plannerActive() (active bool) {
var overrun string
if excessDuration := requiredDuration - lp.clock.Until(planTime); excessDuration > 0 {
overrun = fmt.Sprintf("overruns by %v, ", excessDuration.Round(time.Second))
- planOverrun = true
+ planOverrun = excessDuration
}
planStart = planner.Start(plan)