Custom vehicle: add limitsoc (#13100)
This commit is contained in:
parent
432959935b
commit
be18545837
44 changed files with 3461 additions and 248 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ export default {
|
|||
vehicle: Object,
|
||||
capacity: Number,
|
||||
vehicleSoc: Number,
|
||||
vehicleTargetSoc: Number,
|
||||
vehicleLimitSoc: Number,
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ export default {
|
|||
mode: String,
|
||||
capacity: Number,
|
||||
vehicle: Object,
|
||||
vehicleTargetSoc: Number,
|
||||
vehicleLimitSoc: Number,
|
||||
},
|
||||
emits: ["plan-removed", "plan-updated"],
|
||||
data: function () {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ export default {
|
|||
vehicleSoc: Number,
|
||||
vehicleName: String,
|
||||
vehicleIcon: String,
|
||||
vehicleTargetSoc: Number,
|
||||
vehicleLimitSoc: Number,
|
||||
vehicles: Array,
|
||||
planActive: Boolean,
|
||||
planProjectedStart: String,
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue