Custom vehicle: add limitsoc (#13100)

This commit is contained in:
andig 2024-03-24 12:29:06 +01:00 • committed by GitHub
parent 432959935b
commit be18545837
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 3461 additions and 248 deletions

View file

@ -158,8 +158,7 @@ type CurrentLimiter interface {
// SocLimiter returns the soc limit
type SocLimiter interface {
// TODO rename LimitSoc
TargetSoc() (float64, error)
GetLimitSoc() (int64, error)
}
// ChargeController allows to start/stop the charging session on the vehicle side

View file

@ -135,7 +135,7 @@ export default {
vehicle: Object,
capacity: Number,
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
},
data: function () {
return {

View file

@ -60,7 +60,7 @@ export default {
mode: String,
capacity: Number,
vehicle: Object,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
},
emits: ["plan-removed", "plan-updated"],
data: function () {

View file

@ -44,7 +44,7 @@ export default {
mode: String,
tariff: Object,
plan: Object,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
},
computed: {
endTime: function () {
@ -93,7 +93,7 @@ export default {
},
targetIsAboveVehicleLimit: function () {
if (this.socBasedPlanning) {
return this.effectivePlanSoc > (this.vehicleTargetSoc || 100);
return this.effectivePlanSoc > (this.vehicleLimitSoc || 100);
}
return false;
},
@ -104,7 +104,7 @@ export default {
return this.fmtKWh(this.limitEnergy * 1e3);
},
vehicleLimitFmt: function () {
return this.fmtSoc(this.vehicleTargetSoc);
return this.fmtSoc(this.vehicleLimitSoc);
},
goalFmt: function () {
if (this.socBasedPlanning) {

View file

@ -147,7 +147,7 @@ export default {
vehicleSoc: Number,
vehicleName: String,
vehicleIcon: String,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
vehicles: Array,
planActive: Boolean,
planProjectedStart: String,

View file

@ -82,10 +82,10 @@ const hoursFromNow = function (hours) {
/>
</Variant>
<Variant title="vehicle limit">
<Vehicle v-bind="state" enabled charging :vehicleTargetSoc="80" />
<Vehicle v-bind="state" enabled charging :vehicleLimitSoc="80" />
</Variant>
<Variant title="vehicle limit reached">
<Vehicle v-bind="state" enabled :vehicleTargetSoc="80" :vehicleSoc="80" />
<Vehicle v-bind="state" enabled :vehicleLimitSoc="80" :vehicleSoc="80" />
</Variant>
<Variant title="target charge planned">
<Vehicle v-bind="state" :targetTime="hoursFromNow(34)" mode="pv" />

View file

@ -122,7 +122,7 @@ export default {
vehicleRange: Number,
vehicles: Array,
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
vehicleNotReachable: Boolean,
},
emits: ["limit-soc-updated", "limit-energy-updated", "change-vehicle", "remove-vehicle"],

View file

@ -20,13 +20,13 @@
:style="{ width: `${remainingSocWidth}%`, ...transition }"
></div>
<div
v-show="vehicleTargetSoc"
ref="vehicleTargetSoc"
v-show="vehicleLimitSoc"
ref="vehicleLimitSoc"
class="vehicle-limit-soc"
data-bs-toggle="tooltip"
title=" "
:class="{ 'vehicle-limit-soc--active': vehicleTargetSocActive }"
:style="{ left: `${vehicleTargetSoc}%` }"
:class="{ 'vehicle-limit-soc--active': vehicleLimitSocActive }"
:style="{ left: `${vehicleLimitSoc}%` }"
/>
<div
v-show="energyLimitMarkerPosition"
@ -82,7 +82,7 @@ export default {
props: {
connected: Boolean,
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
enabled: Boolean,
charging: Boolean,
heating: Boolean,
@ -131,8 +131,8 @@ export default {
maxEnergy: function () {
return Math.max(this.planEnergy, this.limitEnergy, this.chargedEnergy / 1e3);
},
vehicleTargetSocActive: function () {
return this.vehicleTargetSoc > 0 && this.vehicleTargetSoc > this.vehicleSoc;
vehicleLimitSocActive: function () {
return this.vehicleLimitSoc > 0 && this.vehicleLimitSoc > this.vehicleSoc;
},
planMarkerPosition: function () {
if (this.socBasedPlanning) {
@ -153,7 +153,7 @@ export default {
},
planMarkerUnreachable: function () {
if (this.socBasedPlanning) {
const vehicleLimit = this.vehicleTargetSoc || 100;
const vehicleLimit = this.vehicleLimitSoc || 100;
return this.effectivePlanSoc > vehicleLimit;
}
return false;
@ -177,7 +177,7 @@ export default {
return true;
},
sliderActive: function () {
const isBelowVehicleLimit = this.visibleLimitSoc <= (this.vehicleTargetSoc || 100);
const isBelowVehicleLimit = this.visibleLimitSoc <= (this.vehicleLimitSoc || 100);
const isAbovePlanLimit = this.visibleLimitSoc >= (this.effectivePlanSoc || 0);
return isBelowVehicleLimit && isAbovePlanLimit;
},
@ -199,7 +199,7 @@ export default {
return this.minSoc - this.vehicleSoc;
}
const limit = Math.min(
this.vehicleTargetSoc || 100,
this.vehicleLimitSoc || 100,
Math.max(this.visibleLimitSoc, this.effectivePlanSoc || 0)
);
if (limit > this.vehicleSoc) {
@ -219,7 +219,7 @@ export default {
effectiveLimitSoc: function () {
this.selectedLimitSoc = this.effectiveLimitSoc;
},
vehicleTargetSoc: function () {
vehicleLimitSoc: function () {
this.updateTooltip();
},
},
@ -256,10 +256,10 @@ export default {
},
updateTooltip: function () {
if (!this.tooltip) {
this.tooltip = new Tooltip(this.$refs.vehicleTargetSoc);
this.tooltip = new Tooltip(this.$refs.vehicleLimitSoc);
}
const soc = this.vehicleTargetSoc;
const content = this.$t("main.vehicleSoc.vehicleTarget", { soc });
const soc = this.vehicleLimitSoc;
const content = this.$t("main.vehicleSoc.vehicleLimit", { soc });
this.tooltip.setContent({ ".tooltip-inner": content });
},
},

View file

@ -152,10 +152,10 @@ describe("vehicle target soc", () => {
{
connected: true,
enabled: true,
vehicleTargetSoc: 70,
vehicleLimitSoc: 70,
vehicleSoc: 70,
},
"vehicleTargetReached",
"vehicleLimitReached",
{ soc: 70 }
);
});
@ -164,10 +164,10 @@ describe("vehicle target soc", () => {
{
connected: true,
enabled: true,
vehicleTargetSoc: 70,
vehicleLimitSoc: 70,
vehicleSoc: 69,
},
"vehicleTargetReached",
"vehicleLimitReached",
{ soc: 70 }
);
});

View file

@ -12,7 +12,7 @@ export default {
mixins: [formatter],
props: {
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
minSoc: Number,
enabled: Boolean,
connected: Boolean,
@ -105,8 +105,8 @@ export default {
}
if (this.enabled && !this.charging) {
if (this.vehicleTargetSoc > 0 && this.vehicleSoc >= this.vehicleTargetSoc - 1) {
return t("vehicleTargetReached", { soc: this.vehicleTargetSoc });
if (this.vehicleLimitSoc > 0 && this.vehicleSoc >= this.vehicleLimitSoc - 1) {
return t("vehicleLimitReached", { soc: this.vehicleLimitSoc });
}
return t("waitForVehicle");
}

View file

@ -183,10 +183,10 @@ func (d *dumper) Dump(name string, v interface{}) {
}
if v, ok := v.(api.SocLimiter); ok {
if targetSoc, err := v.TargetSoc(); err != nil {
fmt.Fprintf(w, "Target Soc:\t%v\n", err)
if limitSoc, err := v.GetLimitSoc(); err != nil {
fmt.Fprintf(w, "Limit Soc:\t%v\n", err)
} else {
fmt.Fprintf(w, "Target Soc:\t%.0f%%\n", targetSoc)
fmt.Fprintf(w, "Limit Soc:\t%d%%\n", limitSoc)
}
}

View file

@ -72,6 +72,6 @@ const (
VehicleOdometer = "vehicleOdometer" // vehicle odometer
VehicleRange = "vehicleRange" // vehicle range
VehicleSoc = "vehicleSoc" // vehicle soc
VehicleTargetSoc = "vehicleTargetSoc" // vehicle api soc limit
VehicleLimitSoc = "vehicleLimitSoc" // vehicle api soc limit
VehicleClimaterActive = "vehicleClimaterActive" // vehicle climater active
)

View file

@ -1424,19 +1424,19 @@ func (lp *Loadpoint) publishSocAndRange() {
// vehicle target soc
// TODO take vehicle api limits into account
targetSoc := 100
apiLimitSoc := 100
if vs, ok := lp.GetVehicle().(api.SocLimiter); ok {
if limit, err := vs.TargetSoc(); err == nil {
targetSoc = int(math.Trunc(limit))
lp.log.DEBUG.Printf("vehicle soc limit: %.0f%%", limit)
lp.publish(keys.VehicleTargetSoc, limit)
if limit, err := vs.GetLimitSoc(); err == nil {
apiLimitSoc = int(limit)
lp.log.DEBUG.Printf("vehicle soc limit: %d%%", limit)
lp.publish(keys.VehicleLimitSoc, limit)
} else if !errors.Is(err, api.ErrNotAvailable) {
lp.log.ERROR.Printf("vehicle soc limit: %v", err)
}
}
// use minimum of vehicle and loadpoint
limitSoc := min(targetSoc, lp.effectiveLimitSoc())
limitSoc := min(apiLimitSoc, lp.effectiveLimitSoc())
var d time.Duration
if lp.charging() {

View file

@ -191,7 +191,7 @@ func (lp *Loadpoint) unpublishVehicle() {
lp.publish(keys.VehicleClimaterActive, nil)
lp.publish(keys.VehicleSoc, 0.0)
lp.publish(keys.VehicleRange, int64(0))
lp.publish(keys.VehicleTargetSoc, 0.0)
lp.publish(keys.VehicleLimitSoc, 0.0)
lp.setRemainingEnergy(0)
lp.setRemainingDuration(0)

View file

@ -221,7 +221,7 @@ charging = "carregant"
connected = "connectat"
disconnected = "desconnectat"
ready = "preparat"
vehicleTarget = "límit de vehicle: {soc}%"
vehicleLimit = "límit de vehicle: {soc}%"
[main.vehicleStatus]
charging = "Carregant..."
@ -239,7 +239,7 @@ targetChargeActive = "Càrrega objectiu activa..."
targetChargePlanned = "La càrrega objectiu comença a {time}."
targetChargeWaitForVehicle = "Càrrega objectiu llesta. Esperar vehicle."
unknown = ""
vehicleTargetReached = "Límit de vehicle {soc}% assolit."
vehicleLimitReached = "Límit de vehicle {soc}% assolit."
waitForVehicle = "A punt per carregar. Esperant vehicle."
[notifications]

View file

@ -352,7 +352,7 @@ charging = "nabíjení"
connected = "připojeno"
disconnected = "odpojeno"
ready = "připraveno"
vehicleTarget = "Limit vozidla: {soc}%"
vehicleLimit = "Limit vozidla: {soc}%"
[main.vehicleStatus]
charging = "Nabíjení..."
@ -370,7 +370,7 @@ targetChargeActive = "Nabíjení na cílovou hodnotu aktivní..."
targetChargePlanned = "Nabíjení na cílovou hodnotu začne v {time}."
targetChargeWaitForVehicle = "Cílové nabíjení připraveno. Čekám na vozidlo..."
unknown = ""
vehicleTargetReached = "Limit vozidla {soc}% dosažen."
vehicleLimitReached = "Limit vozidla {soc}% dosažen."
waitForVehicle = "Připraveno. Čekám na vozidlo..."
[notifications]

View file

@ -356,7 +356,7 @@ charging = "opladning"
connected = "forbundet"
disconnected = "afbrudt"
ready = "parat"
vehicleTarget = "Køretøjsgrænse: {soc}%"
vehicleLimit = "Køretøjsgrænse: {soc}%"
[main.vehicleStatus]
charging = "Oplader..."
@ -374,7 +374,7 @@ targetChargeActive = "Målladning aktiv..."
targetChargePlanned = "Målopladning starter kl. {time}."
targetChargeWaitForVehicle = "Målladning klar. Venter på køretøj..."
unknown = ""
vehicleTargetReached = "Køretøjsgrænsen {soc} % nået."
vehicleLimitReached = "Køretøjsgrænsen {soc} % nået."
waitForVehicle = "Parat. Venter på køretøj ..."
[notifications]

View file

@ -346,7 +346,7 @@ charging = "lädt"
connected = "verbunden"
disconnected = "getrennt"
ready = "bereit"
vehicleTarget = "Fahrzeuglimit: {soc}%"
vehicleLimit = "Fahrzeuglimit: {soc}%"
[main.vehicleStatus]
charging = "Ladevorgang aktiv …"
@ -364,7 +364,7 @@ targetChargeActive = "Zielladen aktiv …"
targetChargePlanned = "Zielladen geplant. Ladung startet {time} Uhr."
targetChargeWaitForVehicle = "Zielladen bereit. Warte auf Fahrzeug …"
unknown = ""
vehicleTargetReached = "Fahrzeuglimit {soc}% erreicht."
vehicleLimitReached = "Fahrzeuglimit {soc}% erreicht."
waitForVehicle = "Ladebereit. Warte auf Fahrzeug …"
[notifications]

View file

@ -343,7 +343,7 @@ charging = "charging"
connected = "connected"
disconnected = "disconnected"
ready = "ready"
vehicleTarget = "Vehicle limit: {soc}%"
vehicleLimit = "Vehicle limit: {soc}%"
[main.vehicleStatus]
charging = "Charging…"
@ -361,7 +361,7 @@ targetChargeActive = "Target charge active…"
targetChargePlanned = "Target charging starts at {time}."
targetChargeWaitForVehicle = "Target charge ready. Waiting for vehicle…"
unknown = ""
vehicleTargetReached = "Vehicle limit {soc}% reached."
vehicleLimitReached = "Vehicle limit {soc}% reached."
waitForVehicle = "Ready. Waiting for vehicle…"
[notifications]

View file

@ -361,7 +361,7 @@ charging = "cargando"
connected = "conectado"
disconnected = "desconectado"
ready = "preparado"
vehicleTarget = "límite de vehículo: {soc}%"
vehicleLimit = "límite de vehículo: {soc}%"
[main.vehicleStatus]
charging = "Cargando ..."
@ -379,7 +379,7 @@ targetChargeActive = "Carga objetivo activa..."
targetChargePlanned = "La carga objetivo empieza en {time}."
targetChargeWaitForVehicle = "Carga de destino lista. Esperar vehículo."
unknown = ""
vehicleTargetReached = "Límite de vehículo {soc}% alcanzado."
vehicleLimitReached = "Límite de vehículo {soc}% alcanzado."
waitForVehicle = "Listo para cargar. Esperando vehículo."
[notifications]

View file

@ -273,7 +273,7 @@ charging = "lataa"
connected = "yhdistetty"
disconnected = "irroitettu"
ready = "valmis"
vehicleTarget = "Ajoneuvon raja {soc}%"
vehicleLimit = "Ajoneuvon raja {soc}%"
[main.vehicleStatus]
charging = "Lataa…"
@ -291,7 +291,7 @@ targetChargeActive = "Lataaminen käynnissä…"
targetChargePlanned = "Lataaminen alkaa {time}."
targetChargeWaitForVehicle = "Tavoite lataus valmis. Odotetaan ajoneuvoa…"
unknown = ""
vehicleTargetReached = "Ajoneuvon raja {soc}% saavutettu."
vehicleLimitReached = "Ajoneuvon raja {soc}% saavutettu."
waitForVehicle = "Valmiina. Odotetaan ajoneuvoa…"
[notifications]

View file

@ -358,7 +358,7 @@ charging = "en charge"
connected = "connecté"
disconnected = "déconnecté"
ready = "prêt"
vehicleTarget = "Limite du véhicule : {soc}%"
vehicleLimit = "Limite du véhicule : {soc}%"
[main.vehicleStatus]
charging = "En charge..."
@ -376,7 +376,7 @@ targetChargeActive = "Charge cible active..."
targetChargePlanned = "La charge cible démarre à {time}."
targetChargeWaitForVehicle = "Charge cible prête. Attente du véhicule..."
unknown = ""
vehicleTargetReached = "Limite de véhicule {soc}% atteinte."
vehicleLimitReached = "Limite de véhicule {soc}% atteinte."
waitForVehicle = "Prêt à charger. Attente du véhicule…"
[notifications]

View file

@ -303,7 +303,7 @@ charging = "napajanje"
connected = "povezano"
disconnected = "odspojeno"
ready = "spremno"
vehicleTarget = "Ograničenje vozila: {soc} %"
vehicleLimit = "Ograničenje vozila: {soc} %"
[main.vehicleStatus]
charging = "Napajanje …"
@ -321,7 +321,7 @@ targetChargeActive = "Ciljano napajanje je aktivno …"
targetChargePlanned = "Ciljano napajanje počinje u {time}."
targetChargeWaitForVehicle = "Ciljano napajanje je spremno. Čeka se na vozilo …"
unknown = ""
vehicleTargetReached = "Ograničenje vozila od {soc} % dosegnuto."
vehicleLimitReached = "Ograničenje vozila od {soc} % dosegnuto."
waitForVehicle = "Spremno. Čeka se na vozilo …"
[notifications]

View file

@ -178,7 +178,7 @@ charging = "In carica"
connected = "collegato"
disconnected = "disconnesso"
ready = "pronto"
vehicleTarget = "Limite veicolo: {soc}%"
vehicleLimit = "Limite veicolo: {soc}%"
[main.vehicleStatus]
charging = "In carica..."
@ -193,7 +193,7 @@ targetChargeActive = "Carica target attiva..."
targetChargePlanned = "Il target di ricarica inizia alle {time}."
targetChargeWaitForVehicle = "Carica target pronta. In attesa del veicolo..."
unknown = ""
vehicleTargetReached = "Limite del veicolo {soc}% raggiunto."
vehicleLimitReached = "Limite del veicolo {soc}% raggiunto."
waitForVehicle = "Pronto. In attesa del veicolo..."
[notifications]

View file

@ -169,7 +169,7 @@ charging = "oplueden"
connected = "verbonne"
disconnected = "deconnectéiert"
ready = "bereet"
vehicleTarget = "Gefier Limite: {soc}%"
vehicleLimit = "Gefier Limite: {soc}%"
[main.vehicleStatus]
charging = "Laden ..."
@ -184,7 +184,7 @@ targetChargeActive = "Zilladung aktiv ..."
targetChargePlanned = "Zilladung fänkt um {time} un."
targetChargeWaitForVehicle = "Ziel Charge prett. Waart op Gefier ..."
unknown = ""
vehicleTargetReached = "Gefier Limit {soc}% erreecht."
vehicleLimitReached = "Gefier Limit {soc}% erreecht."
waitForVehicle = "Prett. Waart op Gefier ..."
[notifications]

View file

@ -361,7 +361,7 @@ charging = "vyksta įkrovimas"
connected = "automobilis prijungtas"
disconnected = "neprijungtas"
ready = "leidžiama įkrauti"
vehicleTarget = "Automobilyje nustatytas limitas: {soc}%"
vehicleLimit = "Automobilyje nustatytas limitas: {soc}%"
[main.vehicleStatus]
charging = "Įkraunama..."
@ -379,7 +379,7 @@ targetChargeActive = "Planinis įkrovimas aktyvuotas..."
targetChargePlanned = "Planinis įkrovimas prasidės {time}."
targetChargeWaitForVehicle = "Planinis įkrovimas leidžiamas. Laukiama automobilio signalo..."
unknown = ""
vehicleTargetReached = "Automobilyje nustatytas limitas {soc}% pasiektas."
vehicleLimitReached = "Automobilyje nustatytas limitas {soc}% pasiektas."
waitForVehicle = "Paruošta. Laukiama automobilio..."
[notifications]

View file

@ -358,7 +358,7 @@ charging = "laden"
connected = "aangesloten"
disconnected = "niet aangesloten"
ready = "klaar"
vehicleTarget = "Voertuiglimiet: {soc}%"
vehicleLimit = "Voertuiglimiet: {soc}%"
[main.vehicleStatus]
charging = "Opladen..."
@ -376,7 +376,7 @@ targetChargeActive = "Doelladen actief..."
targetChargePlanned = "Doelladen begint om {time}."
targetChargeWaitForVehicle = "Doellading gereed. Wachten op voertuig..."
unknown = ""
vehicleTargetReached = "Voertuiglimiet {soc}% bereikt."
vehicleLimitReached = "Voertuiglimiet {soc}% bereikt."
waitForVehicle = "Klaar. Wachten op voertuig..."
[notifications]

View file

@ -264,7 +264,7 @@ charging = "lader"
connected = "tilkoblet"
disconnected = "frakoblet"
ready = "klar"
vehicleTarget = "Kjøretøygrense: {soc}%"
vehicleLimit = "Kjøretøygrense: {soc}%"
[main.vehicleStatus]
charging = "Lading..."
@ -282,7 +282,7 @@ targetChargeActive = "Målladning aktiv ..."
targetChargePlanned = "Mållading starter på {time}."
targetChargeWaitForVehicle = "Mållading klar. Venter på kjøretøy..."
unknown = "ukjent"
vehicleTargetReached = "Kjøretøygrense på {soc}% nådd."
vehicleLimitReached = "Kjøretøygrense på {soc}% nådd."
waitForVehicle = "Klar. Venter på kjøretøy..."
[notifications]

View file

@ -359,7 +359,7 @@ charging = "ładuje się"
connected = "połączony"
disconnected = "odłączony"
ready = "gotowy"
vehicleTarget = "Limit pojazdu: {soc}%"
vehicleLimit = "Limit pojazdu: {soc}%"
[main.vehicleStatus]
charging = "Ładuje się..."
@ -377,7 +377,7 @@ targetChargeActive = "Zaplanowane ładowanie aktywno..."
targetChargePlanned = "Zaplanowane ładowanie zacznie się {time}."
targetChargeWaitForVehicle = "Zaplanowane ładowanie. Czekajem na pojazd..."
unknown = ""
vehicleTargetReached = "Osiągnięto limit pojazdu {soc}%."
vehicleLimitReached = "Osiągnięto limit pojazdu {soc}%."
waitForVehicle = "Gotowe. Czekam na pojazd..."
[notifications]

View file

@ -303,7 +303,7 @@ charging = "carregando"
connected = "ligado"
disconnected = "separado"
ready = "esperando"
vehicleTarget = "Limite de veículo: {soc}%"
vehicleLimit = "Limite de veículo: {soc}%"
[main.vehicleStatus]
charging = "Carregando..."
@ -321,7 +321,7 @@ targetChargeActive = "Carga programada ativa..."
targetChargePlanned = "Carga programada começa {time}."
targetChargeWaitForVehicle = "Carga programada pronta. Esperando pelo veículo..."
unknown = ""
vehicleTargetReached = "Limite de veículo {soc}% atingido."
vehicleLimitReached = "Limite de veículo {soc}% atingido."
waitForVehicle = "Pronto. Esperando pelo veículo..."
[notifications]

View file

@ -348,7 +348,7 @@ charging = "încarcă"
connected = "conectat"
disconnected = "deconectat"
ready = "pregătit"
vehicleTarget = "Limită vehicul: {soc}%"
vehicleLimit = "Limită vehicul: {soc}%"
[main.vehicleStatus]
charging = "Încarcă…"
@ -367,7 +367,7 @@ targetChargeActive = "Încarcare țintă activă…"
targetChargePlanned = "Încărcarea pornește la {time}."
targetChargeWaitForVehicle = "Încărcare terminată. Aștept după vehicul…"
unknown = ""
vehicleTargetReached = "Limita {soc}% a fost atinsă."
vehicleLimitReached = "Limita {soc}% a fost atinsă."
waitForVehicle = "Pregătit. Aștept după vehicul…"
[notifications]

View file

@ -348,7 +348,7 @@ charging = "polnjenje"
connected = "povezan"
disconnected = "odklopljen"
ready = "pripravljen"
vehicleTarget = "Omejitev vozila: {soc}%"
vehicleLimit = "Omejitev vozila: {soc}%"
[main.vehicleStatus]
charging = "Polnjenje…"
@ -367,7 +367,7 @@ targetChargeActive = "Ciljno polnjenje je aktivno..."
targetChargePlanned = "Ciljno polnjenje se začne ob {time}."
targetChargeWaitForVehicle = "Ciljno polnjenje je pripravljeno. Čakam na vozilo ..."
unknown = ""
vehicleTargetReached = "Omejitev vozila {soc}% dosežena."
vehicleLimitReached = "Omejitev vozila {soc}% dosežena."
waitForVehicle = "Pripravljen. Čakam na vozilo..."
[notifications]

View file

@ -355,7 +355,7 @@ charging = "laddar"
connected = "ansluten"
disconnected = "frånkopplad"
ready = "redo"
vehicleTarget = "Fordonsgräns: {soc}%"
vehicleLimit = "Fordonsgräns: {soc}%"
[main.vehicleStatus]
charging = "Laddar..."
@ -373,7 +373,7 @@ targetChargeActive = "Målladdning aktiv..."
targetChargePlanned = "Målladdning startar {time}."
targetChargeWaitForVehicle = "Laddare beredd. Väntar på fordon..."
unknown = ""
vehicleTargetReached = "Fordonsgränsen {soc}% nådd."
vehicleLimitReached = "Fordonsgränsen {soc}% nådd."
waitForVehicle = "Redo. Väntar på fordon..."
[notifications]

View file

@ -326,7 +326,7 @@ charging = "зарядка"
connected = "підключено"
disconnected = "відключено"
ready = "готовий"
vehicleTarget = "Ліміт транспортного засобу: {soc}%"
vehicleLimit = "Ліміт транспортного засобу: {soc}%"
[main.vehicleStatus]
charging = "Зарядка…"
@ -344,7 +344,7 @@ targetChargeActive = "Запланований заряд активний…"
targetChargePlanned = "Запланована зарядка починається о {time}."
targetChargeWaitForVehicle = "Запланований заряд готовий. В очікуванні транспортного засобу..."
unknown = ""
vehicleTargetReached = "Ліміт транспортного засобу {soc}% досягнуто."
vehicleLimitReached = "Ліміт транспортного засобу {soc}% досягнуто."
waitForVehicle = "Готовий. В очікуванні транспортного засобу..."
[notifications]

View file

@ -271,7 +271,7 @@ charging = "充电中"
connected = "已连接"
disconnected = "已断开"
ready = "就绪"
vehicleTarget = "车辆限制: {soc}%"
vehicleLimit = "车辆限制: {soc}%"
[main.vehicleStatus]
charging = "充电中…"
@ -290,7 +290,7 @@ targetChargeActive = "目标充电激活…"
targetChargePlanned = "目标充电从 {time}开始."
targetChargeWaitForVehicle = "目标充电准备就绪. 等车…"
unknown = ""
vehicleTargetReached = "达到车辆限制 {soc}% ."
vehicleLimitReached = "达到车辆限制 {soc}% ."
waitForVehicle = "准备好了. 等车…"
[notifications]

View file

@ -182,7 +182,7 @@ func testInstance(instance any) map[string]testResult {
}
if dev, ok := instance.(api.SocLimiter); ok {
val, err := dev.TargetSoc()
val, err := dev.GetLimitSoc()
res["socLimit"] = makeResult(val, err)
}

View file

@ -171,14 +171,14 @@ func (v *Provider) Odometer() (float64, error) {
var _ api.SocLimiter = (*Provider)(nil)
// TargetSoc implements the api.SocLimiter interface
func (v *Provider) TargetSoc() (float64, error) {
// GetLimitSoc implements the api.SocLimiter interface
func (v *Provider) GetLimitSoc() (int64, error) {
res, err := v.statusG()
if err == nil {
for _, targetSOC := range res.EvStatus.ReservChargeInfos.TargetSocList {
if targetSOC.PlugType == plugTypeAC {
return float64(targetSOC.TargetSocLevel), nil
return int64(targetSOC.TargetSocLevel), nil
}
}
}

View file

@ -125,9 +125,9 @@ func (v *Provider) Odometer() (float64, error) {
var _ api.SocLimiter = (*Provider)(nil)
// TargetSoc implements the api.SocLimiter interface
func (v *Provider) TargetSoc() (float64, error) {
var result = 0
// GetLimitSoc implements the api.SocLimiter interface
func (v *Provider) GetLimitSoc() (int64, error) {
result := 0
res, err := v.status.Get()
if err != nil {
return 0, err
@ -139,7 +139,7 @@ func (v *Provider) TargetSoc() (float64, error) {
result = TargetSocVals[res.ChrgMgmtData.BmsOnBdChrgTrgtSOCDspCmd]
}
return float64(result), err
return int64(result), err
}
var _ api.Resurrector = (*Provider)(nil)

View file

@ -102,10 +102,10 @@ func (v *Provider) Climater() (bool, error) {
var _ api.SocLimiter = (*Provider)(nil)
// TargetSoc implements the api.SocLimiter interface
func (v *Provider) TargetSoc() (float64, error) {
// GetLimitSoc implements the api.SocLimiter interface
func (v *Provider) GetLimitSoc() (int64, error) {
res, err := v.statusG()
return float64(res.Services.Charging.TargetPct), err
return int64(res.Services.Charging.TargetPct), err
}
var _ api.ChargeController = (*Provider)(nil)

View file

@ -127,11 +127,11 @@ func (v *Provider) Odometer() (odo float64, err error) {
var _ api.SocLimiter = (*Provider)(nil)
// TargetSoc implements the api.SocLimiter interface
func (v *Provider) TargetSoc() (float64, error) {
// GetLimitSoc implements the api.SocLimiter interface
func (v *Provider) GetLimitSoc() (int64, error) {
res, err := v.settingsG()
if err == nil {
return float64(res.TargetStateOfChargeInPercent), nil
return int64(res.TargetStateOfChargeInPercent), nil
}
return 0, err

View file

@ -122,13 +122,13 @@ func (v *Provider) FinishTime() (time.Time, error) {
var _ api.SocLimiter = (*Provider)(nil)
// TargetSoc implements the api.SocLimiter interface
func (v *Provider) TargetSoc() (float64, error) {
// GetLimitSoc implements the api.SocLimiter interface
func (v *Provider) GetLimitSoc() (int64, error) {
res, err := v.dataG()
if err != nil {
return 0, err
}
return float64(res.Response.ChargeState.ChargeLimitSoc), nil
return int64(res.Response.ChargeState.ChargeLimitSoc), nil
}
var _ api.Resurrector = (*Provider)(nil)

View file

@ -8,7 +8,7 @@ import (
"github.com/evcc-io/evcc/util"
)
//go:generate go run ../cmd/tools/decorate.go -f decorateVehicle -b api.Vehicle -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" -t "api.VehicleOdometer,Odometer,func() (float64, error)" -t "api.VehicleClimater,Climater,func() (bool, error)" -t "api.CurrentController,MaxCurrent,func(int64) error" -t "api.Resurrector,WakeUp,func() error" -t "api.ChargeController,ChargeEnable,func(bool) error"
//go:generate go run ../cmd/tools/decorate.go -f decorateVehicle -b api.Vehicle -t "api.SocLimiter,GetLimitSoc,func() (int64, error)" -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" -t "api.VehicleOdometer,Odometer,func() (float64, error)" -t "api.VehicleClimater,Climater,func() (bool, error)" -t "api.CurrentController,MaxCurrent,func(int64) error" -t "api.Resurrector,WakeUp,func() error" -t "api.ChargeController,ChargeEnable,func(bool) error"
// Vehicle is an api.Vehicle implementation with configurable getters and setters.
type Vehicle struct {
@ -25,6 +25,7 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Vehicle, error
var cc struct {
embed `mapstructure:",squash"`
Soc provider.Config
LimitSoc *provider.Config
Status *provider.Config
Range *provider.Config
Odometer *provider.Config
@ -48,15 +49,24 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Vehicle, error
socG: socG,
}
// decorate range
var limitSoc func() (int64, error)
if cc.LimitSoc != nil {
limitSoc, err = provider.NewIntGetterFromConfig(*cc.LimitSoc)
if err != nil {
return nil, fmt.Errorf("limitSoc: %w", err)
}
}
// decorate status
var status func() (api.ChargeStatus, error)
if cc.Status != nil {
statusG, err := provider.NewStringGetterFromConfig(*cc.Status)
get, err := provider.NewStringGetterFromConfig(*cc.Status)
if err != nil {
return nil, fmt.Errorf("status: %w", err)
}
status = func() (api.ChargeStatus, error) {
s, err := statusG()
s, err := get()
if err != nil {
return api.StatusNone, err
}
@ -67,52 +77,48 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Vehicle, error
// decorate range
var rng func() (int64, error)
if cc.Range != nil {
rangeG, err := provider.NewIntGetterFromConfig(*cc.Range)
rng, err = provider.NewIntGetterFromConfig(*cc.Range)
if err != nil {
return nil, fmt.Errorf("range: %w", err)
}
rng = rangeG
}
// decorate odometer
var odo func() (float64, error)
if cc.Odometer != nil {
odoG, err := provider.NewFloatGetterFromConfig(*cc.Odometer)
odo, err = provider.NewFloatGetterFromConfig(*cc.Odometer)
if err != nil {
return nil, fmt.Errorf("odometer: %w", err)
}
odo = odoG
}
// decorate climater
var climater func() (bool, error)
if cc.Climater != nil {
climateG, err := provider.NewBoolGetterFromConfig(*cc.Climater)
climater, err = provider.NewBoolGetterFromConfig(*cc.Climater)
if err != nil {
return nil, fmt.Errorf("climater: %w", err)
}
climater = climateG
}
// decorate maxCurrent
var maxCurrent func(int64) error
if cc.MaxCurrent != nil {
maxCurrentS, err := provider.NewIntSetterFromConfig("maxCurrent", *cc.MaxCurrent)
maxCurrent, err = provider.NewIntSetterFromConfig("maxCurrent", *cc.MaxCurrent)
if err != nil {
return nil, fmt.Errorf("maxCurrent: %w", err)
}
maxCurrent = maxCurrentS
}
// decorate wakeup
var wakeup func() error
if cc.Wakeup != nil {
wakeupS, err := provider.NewBoolSetterFromConfig("wakeup", *cc.Wakeup)
set, err := provider.NewBoolSetterFromConfig("wakeup", *cc.Wakeup)
if err != nil {
return nil, fmt.Errorf("wakeup: %w", err)
}
wakeup = func() error {
return wakeupS(true)
return set(true)
}
}
@ -125,7 +131,7 @@ func NewConfigurableFromConfig(other map[string]interface{}) (api.Vehicle, error
}
}
return decorateVehicle(v, status, rng, odo, climater, maxCurrent, wakeup, chargeEnable), nil
return decorateVehicle(v, limitSoc, status, rng, odo, climater, maxCurrent, wakeup, chargeEnable), nil
}
// Soc implements the api.Vehicle interface

File diff suppressed because it is too large Load diff

View file

@ -146,14 +146,14 @@ func (v *Provider) Climater() (bool, error) {
var _ api.SocLimiter = (*Provider)(nil)
// TargetSoc implements the api.SocLimiter interface
func (v *Provider) TargetSoc() (float64, error) {
// GetLimitSoc implements the api.SocLimiter interface
func (v *Provider) GetLimitSoc() (int64, error) {
res, err := v.statusG()
if err != nil || res.Charging == nil || res.Charging.ChargingSettings.Value.TargetSOCPct == nil {
return 0, api.ErrNotAvailable
}
return float64(*res.Charging.ChargingSettings.Value.TargetSOCPct), nil
return int64(*res.Charging.ChargingSettings.Value.TargetSOCPct), nil
}
var _ api.ChargeController = (*Provider)(nil)