Skip to content

Commit

Permalink
Custom vehicle: add limitsoc (#13100)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored and naltatis committed Mar 26, 2024
1 parent eac0b6e commit f3aab6b
Show file tree
Hide file tree
Showing 44 changed files with 4,057 additions and 844 deletions.
3 changes: 1 addition & 2 deletions api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion assets/js/components/ChargingPlan.vue
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ export default {
vehicle: Object,
capacity: Number,
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
},
data: function () {
return {
Expand Down
2 changes: 1 addition & 1 deletion assets/js/components/ChargingPlanSettings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export default {
mode: String,
capacity: Number,
vehicle: Object,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
},
emits: ["plan-removed", "plan-updated"],
data: function () {
Expand Down
6 changes: 3 additions & 3 deletions assets/js/components/ChargingPlanWarnings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export default {
mode: String,
tariff: Object,
plan: Object,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
},
computed: {
endTime: function () {
Expand Down Expand Up @@ -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;
},
Expand All @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion assets/js/components/Loadpoint.vue
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export default {
vehicleSoc: Number,
vehicleName: String,
vehicleIcon: String,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
vehicles: Array,
planActive: Boolean,
planProjectedStart: String,
Expand Down
4 changes: 2 additions & 2 deletions assets/js/components/Vehicle.story.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
Expand Down
2 changes: 1 addition & 1 deletion assets/js/components/Vehicle.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
Expand Down
28 changes: 14 additions & 14 deletions assets/js/components/VehicleSoc.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -82,7 +82,7 @@ export default {
props: {
connected: Boolean,
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
enabled: Boolean,
charging: Boolean,
heating: Boolean,
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand All @@ -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;
},
Expand All @@ -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) {
Expand All @@ -219,7 +219,7 @@ export default {
effectiveLimitSoc: function () {
this.selectedLimitSoc = this.effectiveLimitSoc;
},
vehicleTargetSoc: function () {
vehicleLimitSoc: function () {
this.updateTooltip();
},
},
Expand Down Expand Up @@ -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 });
},
},
Expand Down
8 changes: 4 additions & 4 deletions assets/js/components/VehicleStatus.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,10 @@ describe("vehicle target soc", () => {
{
connected: true,
enabled: true,
vehicleTargetSoc: 70,
vehicleLimitSoc: 70,
vehicleSoc: 70,
},
"vehicleTargetReached",
"vehicleLimitReached",
{ soc: 70 }
);
});
Expand All @@ -164,10 +164,10 @@ describe("vehicle target soc", () => {
{
connected: true,
enabled: true,
vehicleTargetSoc: 70,
vehicleLimitSoc: 70,
vehicleSoc: 69,
},
"vehicleTargetReached",
"vehicleLimitReached",
{ soc: 70 }
);
});
Expand Down
6 changes: 3 additions & 3 deletions assets/js/components/VehicleStatus.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default {
mixins: [formatter],
props: {
vehicleSoc: Number,
vehicleTargetSoc: Number,
vehicleLimitSoc: Number,
minSoc: Number,
enabled: Boolean,
connected: Boolean,
Expand Down Expand Up @@ -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");
}
Expand Down
6 changes: 3 additions & 3 deletions cmd/dumper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down
2 changes: 1 addition & 1 deletion core/keys/loadpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
12 changes: 6 additions & 6 deletions core/loadpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
2 changes: 1 addition & 1 deletion core/loadpoint_vehicle.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions i18n/ca.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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..."
Expand All @@ -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]
Expand Down
4 changes: 2 additions & 2 deletions i18n/cs.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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í..."
Expand All @@ -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]
Expand Down
4 changes: 2 additions & 2 deletions i18n/da.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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..."
Expand All @@ -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]
Expand Down
4 changes: 2 additions & 2 deletions i18n/de.toml
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ charging = "lädt"
connected = "verbunden"
disconnected = "getrennt"
ready = "bereit"
vehicleTarget = "Fahrzeuglimit: {soc}%"
vehicleLimit = "Fahrzeuglimit: {soc}%"

[main.vehicleStatus]
charging = "Ladevorgang aktiv …"
Expand All @@ -374,7 +374,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]
Expand Down
4 changes: 2 additions & 2 deletions i18n/en.toml
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ charging = "charging"
connected = "connected"
disconnected = "disconnected"
ready = "ready"
vehicleTarget = "Vehicle limit: {soc}%"
vehicleLimit = "Vehicle limit: {soc}%"

[main.vehicleStatus]
charging = "Charging…"
Expand All @@ -374,7 +374,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]
Expand Down
4 changes: 2 additions & 2 deletions i18n/es.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 ..."
Expand All @@ -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]
Expand Down
Loading

0 comments on commit f3aab6b

Please sign in to comment.