From 5cf124af503c964a6e9170854a58cc53625e8d11 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 24 Aug 2024 13:31:09 +0200 Subject: [PATCH] Add charger authorization api (#15399) --- api/api.go | 4 + api/reason.go | 9 + api/reason_enumer.go | 78 + assets/js/components/Loadpoint.vue | 1 + .../js/components/MaterialIcon/RfidWait.vue | 21 + assets/js/components/Vehicle.vue | 1 + assets/js/components/VehicleStatus.vue | 33 + charger/keba-modbus.go | 18 +- charger/keba-modbus_decorators.go | 1610 ++++++++++++++++- charger/ocpp.go | 10 + core/keys/loadpoint.go | 9 +- core/loadpoint.go | 8 + i18n/de.toml | 1 + i18n/en.toml | 1 + 14 files changed, 1733 insertions(+), 71 deletions(-) create mode 100644 api/reason.go create mode 100644 api/reason_enumer.go create mode 100644 assets/js/components/MaterialIcon/RfidWait.vue diff --git a/api/api.go b/api/api.go index c7dcafb39..d6b8a0acc 100644 --- a/api/api.go +++ b/api/api.go @@ -49,6 +49,10 @@ type ChargeState interface { Status() (ChargeStatus, error) } +type StatusReasoner interface { + StatusReason() (Reason, error) +} + // CurrentController provides settings charging maximum charging current type CurrentController interface { MaxCurrent(current int64) error diff --git a/api/reason.go b/api/reason.go new file mode 100644 index 000000000..46fbd7525 --- /dev/null +++ b/api/reason.go @@ -0,0 +1,9 @@ +package api + +type Reason int + +//go:generate enumer -type Reason -trimprefix Reason -transform=lower +const ( + ReasonUnknown Reason = iota + ReasonWaitingForAuthorization +) diff --git a/api/reason_enumer.go b/api/reason_enumer.go new file mode 100644 index 000000000..b2d441de5 --- /dev/null +++ b/api/reason_enumer.go @@ -0,0 +1,78 @@ +// Code generated by "enumer -type Reason -trimprefix Reason -transform=lower"; DO NOT EDIT. + +package api + +import ( + "fmt" + "strings" +) + +const _ReasonName = "unknownwaitingforauthorization" + +var _ReasonIndex = [...]uint8{0, 7, 30} + +const _ReasonLowerName = "unknownwaitingforauthorization" + +func (i Reason) String() string { + if i < 0 || i >= Reason(len(_ReasonIndex)-1) { + return fmt.Sprintf("Reason(%d)", i) + } + return _ReasonName[_ReasonIndex[i]:_ReasonIndex[i+1]] +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _ReasonNoOp() { + var x [1]struct{} + _ = x[ReasonUnknown-(0)] + _ = x[ReasonWaitingForAuthorization-(1)] +} + +var _ReasonValues = []Reason{ReasonUnknown, ReasonWaitingForAuthorization} + +var _ReasonNameToValueMap = map[string]Reason{ + _ReasonName[0:7]: ReasonUnknown, + _ReasonLowerName[0:7]: ReasonUnknown, + _ReasonName[7:30]: ReasonWaitingForAuthorization, + _ReasonLowerName[7:30]: ReasonWaitingForAuthorization, +} + +var _ReasonNames = []string{ + _ReasonName[0:7], + _ReasonName[7:30], +} + +// ReasonString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func ReasonString(s string) (Reason, error) { + if val, ok := _ReasonNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _ReasonNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to Reason values", s) +} + +// ReasonValues returns all values of the enum +func ReasonValues() []Reason { + return _ReasonValues +} + +// ReasonStrings returns a slice of all String values of the enum +func ReasonStrings() []string { + strs := make([]string, len(_ReasonNames)) + copy(strs, _ReasonNames) + return strs +} + +// IsAReason returns "true" if the value is listed in the enum definition. "false" otherwise +func (i Reason) IsAReason() bool { + for _, v := range _ReasonValues { + if i == v { + return true + } + } + return false +} diff --git a/assets/js/components/Loadpoint.vue b/assets/js/components/Loadpoint.vue index 82499a1b8..88aacd002 100644 --- a/assets/js/components/Loadpoint.vue +++ b/assets/js/components/Loadpoint.vue @@ -141,6 +141,7 @@ export default { sessionSolarPercentage: Number, // charger + chargerAwaitingAuthorization: Boolean, chargerFeatureIntegratedDevice: Boolean, chargerFeatureHeating: Boolean, chargerIcon: String, diff --git a/assets/js/components/MaterialIcon/RfidWait.vue b/assets/js/components/MaterialIcon/RfidWait.vue new file mode 100644 index 000000000..4d4a91fcb --- /dev/null +++ b/assets/js/components/MaterialIcon/RfidWait.vue @@ -0,0 +1,21 @@ + + + diff --git a/assets/js/components/Vehicle.vue b/assets/js/components/Vehicle.vue index cb0308161..15c549751 100644 --- a/assets/js/components/Vehicle.vue +++ b/assets/js/components/Vehicle.vue @@ -107,6 +107,7 @@ export default { integratedDevice: Boolean, limitEnergy: Number, mode: String, + chargerAwaitingAuthorization: Boolean, phaseAction: String, phaseRemainingInterpolated: Number, planActive: Boolean, diff --git a/assets/js/components/VehicleStatus.vue b/assets/js/components/VehicleStatus.vue index 40d204766..b139c8ff7 100644 --- a/assets/js/components/VehicleStatus.vue +++ b/assets/js/components/VehicleStatus.vue @@ -75,6 +75,15 @@ > +
+ +