Ocpp: add disconnect required status (#15659)
This commit is contained in:
parent
f8b7f77a9f
commit
d03705e1a6
11 changed files with 107 additions and 33 deletions
|
|
@ -6,4 +6,5 @@ type Reason int
|
|||
const (
|
||||
ReasonUnknown Reason = iota
|
||||
ReasonWaitingForAuthorization
|
||||
ReasonDisconnectRequired
|
||||
)
|
||||
|
|
|
|||
|
|
@ -7,11 +7,11 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
const _ReasonName = "unknownwaitingforauthorization"
|
||||
const _ReasonName = "unknownwaitingforauthorizationdisconnectrequired"
|
||||
|
||||
var _ReasonIndex = [...]uint8{0, 7, 30}
|
||||
var _ReasonIndex = [...]uint8{0, 7, 30, 48}
|
||||
|
||||
const _ReasonLowerName = "unknownwaitingforauthorization"
|
||||
const _ReasonLowerName = "unknownwaitingforauthorizationdisconnectrequired"
|
||||
|
||||
func (i Reason) String() string {
|
||||
if i < 0 || i >= Reason(len(_ReasonIndex)-1) {
|
||||
|
|
@ -26,20 +26,24 @@ func _ReasonNoOp() {
|
|||
var x [1]struct{}
|
||||
_ = x[ReasonUnknown-(0)]
|
||||
_ = x[ReasonWaitingForAuthorization-(1)]
|
||||
_ = x[ReasonDisconnectRequired-(2)]
|
||||
}
|
||||
|
||||
var _ReasonValues = []Reason{ReasonUnknown, ReasonWaitingForAuthorization}
|
||||
var _ReasonValues = []Reason{ReasonUnknown, ReasonWaitingForAuthorization, ReasonDisconnectRequired}
|
||||
|
||||
var _ReasonNameToValueMap = map[string]Reason{
|
||||
_ReasonName[0:7]: ReasonUnknown,
|
||||
_ReasonLowerName[0:7]: ReasonUnknown,
|
||||
_ReasonName[7:30]: ReasonWaitingForAuthorization,
|
||||
_ReasonLowerName[7:30]: ReasonWaitingForAuthorization,
|
||||
_ReasonName[0:7]: ReasonUnknown,
|
||||
_ReasonLowerName[0:7]: ReasonUnknown,
|
||||
_ReasonName[7:30]: ReasonWaitingForAuthorization,
|
||||
_ReasonLowerName[7:30]: ReasonWaitingForAuthorization,
|
||||
_ReasonName[30:48]: ReasonDisconnectRequired,
|
||||
_ReasonLowerName[30:48]: ReasonDisconnectRequired,
|
||||
}
|
||||
|
||||
var _ReasonNames = []string{
|
||||
_ReasonName[0:7],
|
||||
_ReasonName[7:30],
|
||||
_ReasonName[30:48],
|
||||
}
|
||||
|
||||
// ReasonString retrieves an enum value from the enum constants string name.
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ export default {
|
|||
sessionSolarPercentage: Number,
|
||||
|
||||
// charger
|
||||
chargerAwaitingAuthorization: Boolean,
|
||||
chargerStatusReason: String,
|
||||
chargerFeatureIntegratedDevice: Boolean,
|
||||
chargerFeatureHeating: Boolean,
|
||||
chargerIcon: String,
|
||||
|
|
|
|||
21
assets/js/components/MaterialIcon/Reconnect.vue
Normal file
21
assets/js/components/MaterialIcon/Reconnect.vue
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<template>
|
||||
<svg :style="svgStyle" viewBox="0 0 32 32">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M5.505,24.609c-0.595,-0.935 -0.94,-2.041 -0.94,-3.222c-0,-1.632 0.661,-3.198 1.831,-4.336l1.995,-1.994c0.52,-0.521 1.364,-0.521 1.885,0l0.391,0.391l1.724,-1.724c0.52,-0.52 1.365,-0.52 1.885,-0c0.52,0.52 0.52,1.365 0,1.885l-1.724,1.724l2.115,2.115l1.724,-1.724c0.52,-0.52 1.365,-0.52 1.885,-0c0.52,0.52 0.52,1.365 0,1.885l-1.724,1.724l0.391,0.391c0.521,0.521 0.521,1.365 -0,1.885c-0,0 -1.994,1.995 -1.994,1.995c-1.138,1.17 -2.704,1.831 -4.336,1.831c-1.181,0 -2.287,-0.345 -3.222,-0.94l-2.448,2.448c-0.521,0.52 -1.365,0.52 -1.886,-0c-0.52,-0.521 -0.52,-1.365 0,-1.886l2.448,-2.448Zm4.219,-6.333l-0.391,-0.39l-1.057,1.057c-0.005,0.005 -0.01,0.01 -0.015,0.015c-0.658,0.637 -1.03,1.514 -1.03,2.429c0,0.797 0.282,1.533 0.75,2.114c0.106,0.059 0.205,0.133 0.295,0.223c0.09,0.09 0.164,0.189 0.223,0.295c0.581,0.468 1.317,0.75 2.114,0.75c0.915,-0 1.792,-0.372 2.429,-1.03c0.005,-0.005 0.01,-0.01 0.015,-0.015c0,-0 1.057,-1.057 1.057,-1.057l-4.39,-4.391Zm14.885,-12.771l2.448,-2.448c0.521,-0.52 1.365,-0.52 1.886,0c0.52,0.521 0.52,1.365 -0,1.886l-2.448,2.448c0.595,0.935 0.94,2.041 0.94,3.222c0,1.632 -0.661,3.198 -1.831,4.336l-1.995,1.994c-0.52,0.521 -1.364,0.521 -1.885,-0l-6.667,-6.667c-0.521,-0.521 -0.521,-1.365 0,-1.885c0,-0 1.994,-1.995 1.994,-1.995c1.138,-1.17 2.704,-1.831 4.336,-1.831c1.181,-0 2.287,0.345 3.222,0.94Zm-0.59,2.994c-0.106,-0.059 -0.205,-0.133 -0.295,-0.223c-0.09,-0.09 -0.164,-0.189 -0.223,-0.295c-0.581,-0.468 -1.317,-0.75 -2.114,-0.75c-0.915,0 -1.792,0.372 -2.429,1.03c-0.005,0.005 -0.01,0.01 -0.015,0.015c-0,0 -1.057,1.057 -1.057,1.057l4.781,4.781l1.057,-1.057c0.005,-0.005 0.01,-0.01 0.015,-0.015c0.658,-0.637 1.03,-1.514 1.03,-2.429c-0,-0.797 -0.282,-1.533 -0.75,-2.114Z"
|
||||
/>
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M25.333,20l0.781,-0l-0.39,-0.391c-0.52,-0.52 -0.52,-1.365 -0,-1.885c0.52,-0.52 1.365,-0.52 1.885,-0l2.667,2.667c0.387,0.386 0.492,0.962 0.289,1.453c-0.066,0.161 -0.164,0.308 -0.289,0.432l-2.667,2.667c-0.52,0.52 -1.365,0.52 -1.885,-0c-0.52,-0.521 -0.52,-1.365 -0,-1.886l0.39,-0.39l-0.781,-0c-1.463,-0 -2.666,1.203 -2.666,2.666c-0,1.463 1.203,2.667 2.666,2.667c0.656,-0 1.289,-0.242 1.778,-0.679c0.549,-0.491 1.392,-0.444 1.883,0.105c0.49,0.548 0.443,1.392 -0.105,1.882c-0.978,0.875 -2.244,1.359 -3.556,1.359c-2.926,-0 -5.333,-2.408 -5.333,-5.334c-0,-2.925 2.408,-5.333 5.333,-5.333Z"
|
||||
/>
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import icon from "../../mixins/icon";
|
||||
|
||||
export default {
|
||||
name: "Reconnect",
|
||||
mixins: [icon],
|
||||
};
|
||||
</script>
|
||||
|
|
@ -107,7 +107,7 @@ export default {
|
|||
integratedDevice: Boolean,
|
||||
limitEnergy: Number,
|
||||
mode: String,
|
||||
chargerAwaitingAuthorization: Boolean,
|
||||
chargerStatusReason: String,
|
||||
phaseAction: String,
|
||||
phaseRemainingInterpolated: Number,
|
||||
planActive: Boolean,
|
||||
|
|
|
|||
|
|
@ -84,6 +84,15 @@
|
|||
>
|
||||
<RfidWaitIcon />
|
||||
</div>
|
||||
<div
|
||||
v-if="disconnectRequiredVisible"
|
||||
ref="disconnectRequired"
|
||||
class="entry text-warning"
|
||||
data-bs-toggle="tooltip"
|
||||
data-testid="vehicle-status-disconnect-required"
|
||||
>
|
||||
<ReconnectIcon />
|
||||
</div>
|
||||
|
||||
<!-- smart cost -->
|
||||
<button
|
||||
|
|
@ -148,31 +157,36 @@ import DynamicPriceIcon from "./MaterialIcon/DynamicPrice.vue";
|
|||
import { DEFAULT_LOCALE } from "../i18n";
|
||||
import formatter from "../mixins/formatter";
|
||||
import { CO2_TYPE } from "../units";
|
||||
import PlanStartIcon from "./MaterialIcon/PlanStart.vue";
|
||||
import PlanEndIcon from "./MaterialIcon/PlanEnd.vue";
|
||||
import RfidWaitIcon from "./MaterialIcon/RfidWait.vue";
|
||||
import ClimaterIcon from "./MaterialIcon/Climater.vue";
|
||||
import VehicleLimitReachedIcon from "./MaterialIcon/VehicleLimitReached.vue";
|
||||
import VehicleLimitWarningIcon from "./MaterialIcon/VehicleLimitWarning.vue";
|
||||
import VehicleLimitIcon from "./MaterialIcon/VehicleLimit.vue";
|
||||
import VehicleMinSocIcon from "./MaterialIcon/VehicleMinSoc.vue";
|
||||
import PlanEndIcon from "./MaterialIcon/PlanEnd.vue";
|
||||
import PlanStartIcon from "./MaterialIcon/PlanStart.vue";
|
||||
import ReconnectIcon from "./MaterialIcon/Reconnect.vue";
|
||||
import RfidWaitIcon from "./MaterialIcon/RfidWait.vue";
|
||||
import SunDownIcon from "./MaterialIcon/SunDown.vue";
|
||||
import SunUpIcon from "./MaterialIcon/SunUp.vue";
|
||||
import Tooltip from "bootstrap/js/dist/tooltip";
|
||||
import VehicleLimitIcon from "./MaterialIcon/VehicleLimit.vue";
|
||||
import VehicleLimitReachedIcon from "./MaterialIcon/VehicleLimitReached.vue";
|
||||
import VehicleLimitWarningIcon from "./MaterialIcon/VehicleLimitWarning.vue";
|
||||
import VehicleMinSocIcon from "./MaterialIcon/VehicleMinSoc.vue";
|
||||
import WelcomeIcon from "./MaterialIcon/Welcome.vue";
|
||||
|
||||
const REASON_AUTH = "waitingforauthorization";
|
||||
const REASON_DISCONNECT = "disconnectrequired";
|
||||
|
||||
export default {
|
||||
name: "VehicleStatus",
|
||||
components: {
|
||||
DynamicPriceIcon,
|
||||
PlanStartIcon,
|
||||
PlanEndIcon,
|
||||
RfidWaitIcon,
|
||||
ClimaterIcon,
|
||||
VehicleLimitIcon,
|
||||
VehicleMinSocIcon,
|
||||
DynamicPriceIcon,
|
||||
PlanEndIcon,
|
||||
PlanStartIcon,
|
||||
ReconnectIcon,
|
||||
RfidWaitIcon,
|
||||
SunDownIcon,
|
||||
SunUpIcon,
|
||||
VehicleLimitIcon,
|
||||
VehicleMinSocIcon,
|
||||
WelcomeIcon,
|
||||
},
|
||||
mixins: [formatter],
|
||||
|
|
@ -180,7 +194,7 @@ export default {
|
|||
vehicleSoc: Number,
|
||||
charging: Boolean,
|
||||
chargingPlanDisabled: Boolean,
|
||||
chargerAwaitingAuthorization: Boolean,
|
||||
chargerStatusReason: String,
|
||||
connected: Boolean,
|
||||
currency: String,
|
||||
effectiveLimitSoc: Number,
|
||||
|
|
@ -222,6 +236,7 @@ export default {
|
|||
smartCostTooltip: null,
|
||||
vehicleLimitTooltip: null,
|
||||
awaitingAuthorizationTooltip: null,
|
||||
disconnectRequiredTooltip: null,
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -235,6 +250,7 @@ export default {
|
|||
this.updateSmartCostTooltip();
|
||||
this.updateVehicleLimitTooltip();
|
||||
this.updateAwaitingAuthorizationTooltip();
|
||||
this.updateDisconnectRequiredTooltip();
|
||||
},
|
||||
watch: {
|
||||
planActiveTooltipContent() {
|
||||
|
|
@ -267,6 +283,9 @@ export default {
|
|||
awaitingAuthorizationTooltipContent() {
|
||||
this.$nextTick(this.updateAwaitingAuthorizationTooltip);
|
||||
},
|
||||
disconnectRequiredTooltipContent() {
|
||||
this.$nextTick(this.updateDisconnectRequiredTooltip);
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
phaseTimerActive() {
|
||||
|
|
@ -307,7 +326,7 @@ export default {
|
|||
return this.connected && this.vehicleLimitSoc > 0 && this.vehicleLimitSoc < limit;
|
||||
},
|
||||
awaitingAuthorizationVisible() {
|
||||
return this.chargerAwaitingAuthorization;
|
||||
return this.chargerStatusReason === REASON_AUTH;
|
||||
},
|
||||
awaitingAuthorizationTooltipContent() {
|
||||
if (!this.awaitingAuthorizationVisible) {
|
||||
|
|
@ -315,6 +334,15 @@ export default {
|
|||
}
|
||||
return this.$t("main.vehicleStatus.awaitingAuthorization");
|
||||
},
|
||||
disconnectRequiredVisible() {
|
||||
return this.chargerStatusReason === REASON_DISCONNECT;
|
||||
},
|
||||
disconnectRequiredTooltipContent() {
|
||||
if (!this.disconnectRequiredVisible) {
|
||||
return "";
|
||||
}
|
||||
return this.$t("main.vehicleStatus.disconnectRequired");
|
||||
},
|
||||
vehicleLimitTooltipContent() {
|
||||
if (!this.vehicleLimitVisible) {
|
||||
return "";
|
||||
|
|
@ -584,6 +612,13 @@ export default {
|
|||
this.$refs.awaitingAuthorization
|
||||
);
|
||||
},
|
||||
updateDisconnectRequiredTooltip() {
|
||||
this.updateTooltip(
|
||||
this.disconnectRequiredTooltip,
|
||||
this.disconnectRequiredTooltipContent,
|
||||
this.$refs.disconnectRequired
|
||||
);
|
||||
},
|
||||
updateTooltip: function (instance, content, ref, hoverOnly = false) {
|
||||
if (!content || !ref) {
|
||||
if (instance) {
|
||||
|
|
|
|||
|
|
@ -342,9 +342,20 @@ var _ api.StatusReasoner = (*OCPP)(nil)
|
|||
|
||||
func (c *OCPP) StatusReason() (api.Reason, error) {
|
||||
var res api.Reason
|
||||
if c.conn.NeedsAuthentication() {
|
||||
res = api.ReasonWaitingForAuthorization
|
||||
|
||||
s, err := c.conn.Status()
|
||||
if err != nil {
|
||||
return res, err
|
||||
}
|
||||
|
||||
switch {
|
||||
case c.conn.NeedsAuthentication():
|
||||
res = api.ReasonWaitingForAuthorization
|
||||
|
||||
case s == core.ChargePointStatusFinishing:
|
||||
res = api.ReasonDisconnectRequired
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,11 +17,11 @@ const (
|
|||
PhasesEnabled = "phasesEnabled" // enabled phases (1/3)
|
||||
PhasesActive = "phasesActive" // active phases as used by vehicle (1/2/3)
|
||||
|
||||
ChargerIcon = "chargerIcon" // charger icon for ui
|
||||
ChargerFeature = "chargerFeature" // charger feature
|
||||
ChargerPhysicalPhases = "chargerPhysicalPhases" // charger phases
|
||||
ChargerPhases1p3p = "chargerPhases1p3p" // phase switcher (1p3p chargers)
|
||||
ChargerAwaitingAuthorization = "chargerAwaitingAuthorization" // charger awaiting authorization
|
||||
ChargerIcon = "chargerIcon" // charger icon for ui
|
||||
ChargerFeature = "chargerFeature" // charger feature
|
||||
ChargerPhysicalPhases = "chargerPhysicalPhases" // charger phases
|
||||
ChargerPhases1p3p = "chargerPhases1p3p" // phase switcher (1p3p chargers)
|
||||
ChargerStatusReason = "chargerStatusReason" // either awaiting authorization or disconnect required
|
||||
|
||||
// loadpoint status
|
||||
Enabled = "enabled" // loadpoint enabled
|
||||
|
|
|
|||
|
|
@ -1676,7 +1676,7 @@ func (lp *Loadpoint) Update(sitePower float64, rates api.Rates, batteryBuffered,
|
|||
|
||||
if sr, ok := lp.charger.(api.StatusReasoner); ok && lp.GetStatus() == api.StatusB {
|
||||
if r, err := sr.StatusReason(); err == nil {
|
||||
lp.publish(keys.ChargerAwaitingAuthorization, r == api.ReasonWaitingForAuthorization)
|
||||
lp.publish(keys.ChargerStatusReason, r)
|
||||
} else {
|
||||
lp.log.ERROR.Printf("charger status reason: %v", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -541,6 +541,7 @@ cleanEnergyNextStart = "Saubere Energie in {duration}."
|
|||
cleanEnergySet = "CO₂-Limit gesetzt."
|
||||
climating = "Vorklimatisierung erkannt."
|
||||
connected = "Verbunden."
|
||||
disconnectRequired = "Vorgang abgebrochen. Erneut verbinden."
|
||||
disconnected = "Nicht verbunden."
|
||||
finished = "Abgeschlossen."
|
||||
minCharge = "Mindestladung bis {soc}."
|
||||
|
|
|
|||
|
|
@ -539,6 +539,7 @@ cleanEnergyNextStart = "Clean energy in {duration}."
|
|||
cleanEnergySet = "CO₂ limit set."
|
||||
climating = "Pre-conditioning detected."
|
||||
connected = "Connected."
|
||||
disconnectRequired = "Session terminated. Please reconnect."
|
||||
disconnected = "Disconnected."
|
||||
finished = "Finished."
|
||||
minCharge = "Minimum charging to {soc}."
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue