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() }}
{{ targetSocLabel }}
@@ -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)