From d63dec9511166c35b59ee5f539062977580226b3 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 2 Dec 2023 20:56:30 +0500 Subject: [PATCH] Refactor session settings and apis (BC) (#10335) --- api/actionconfig.go | 41 +-- api/actionconfig_test.go | 41 --- api/api.go | 14 +- assets/css/app.css | 4 + assets/js/components/ChargingPlan.vue | 147 +++++--- assets/js/components/ChargingPlanArrival.vue | 106 ++++-- ...tory.vue => ChargingPlanPreview.story.vue} | 14 +- ...an.test.js => ChargingPlanPreview.test.js} | 6 +- ...ChargePlan.vue => ChargingPlanPreview.vue} | 5 +- assets/js/components/ChargingPlanSettings.vue | 175 +++++++++ .../components/ChargingPlanSettingsEntry.vue | 230 ++++++++++++ assets/js/components/ChargingPlanWarnings.vue | 110 ++++++ assets/js/components/ChargingSessionModal.vue | 6 +- assets/js/components/LabelAndValue.vue | 4 +- assets/js/components/LimitEnergySelect.vue | 100 +++++ ...TargetSocSelect.vue => LimitSocSelect.vue} | 28 +- assets/js/components/Loadpoint.story.vue | 2 +- assets/js/components/Loadpoint.vue | 51 ++- assets/js/components/Loadpoints.story.vue | 2 +- assets/js/components/Site.vue | 8 +- assets/js/components/TargetCharge.vue | 331 ----------------- assets/js/components/TargetEnergySelect.vue | 124 ------- assets/js/components/Vehicle.story.vue | 2 +- assets/js/components/Vehicle.vue | 148 ++++---- assets/js/components/VehicleOptions.vue | 9 +- assets/js/components/VehicleSoc.vue | 221 ++++++++--- assets/js/components/VehicleStatus.test.js | 24 +- assets/js/components/VehicleStatus.vue | 8 +- assets/js/components/VehicleTitle.vue | 22 +- assets/js/mixins/formatter.js | 8 + assets/js/utils/energyOptions.js | 40 ++ assets/js/views/ChargingSessions.vue | 11 +- charger/eebus.go | 83 ++--- charger/twc3.go | 2 +- cmd/demo.yaml | 4 - cmd/dump.go | 7 +- cmd/root.go | 7 +- cmd/setup.go | 4 +- cmd/setup_test.go | 4 +- core/const.go | 31 -- core/coordinator/adapter.go | 6 +- core/coordinator/api.go | 16 +- core/coordinator/coordinator.go | 31 +- core/coordinator/dummy.go | 15 +- core/keys/loadpoint.go | 74 ++++ core/keys/site.go | 47 +++ core/loadpoint.go | 345 +++++++++--------- core/loadpoint/api.go | 78 ++-- core/loadpoint/mock.go | 283 +++++++------- core/loadpoint_api.go | 301 ++++++++------- core/loadpoint_charger.go | 3 +- core/loadpoint_effective.go | 120 ++++++ core/loadpoint_phases.go | 9 +- core/loadpoint_phases_test.go | 3 +- core/loadpoint_plan.go | 41 ++- core/loadpoint_test.go | 199 +++++----- core/loadpoint_vehicle.go | 128 +++---- core/loadpoint_vehicle_test.go | 108 +----- core/prioritizer/prioritizer.go | 6 +- core/prioritizer/prioritizer_test.go | 6 +- core/settings.go | 107 ++++++ core/site.go | 204 +++++------ core/site/api.go | 8 +- core/site/vehicles.go | 13 + core/site_api.go | 105 ++++-- core/site_battery.go | 3 +- core/site_vehicles.go | 89 ++++- core/stats.go | 3 +- core/vehicle/adapter.go | 100 +++++ core/vehicle/api.go | 54 +++ core/vehicle/dummy.go | 49 +++ core/vehicle/mock.go | 145 ++++++++ core/vehicle/vehicle.go | 32 ++ go.mod | 1 - go.sum | 2 - hems/semp/semp.go | 8 +- i18n/ca.toml | 1 - i18n/cs.toml | 1 - i18n/da.toml | 3 - i18n/de.toml | 13 +- i18n/en.toml | 13 +- i18n/es.toml | 3 - i18n/fi.toml | 3 - i18n/fr.toml | 3 - i18n/hr.toml | 3 - i18n/it.toml | 1 - i18n/lb.toml | 1 - i18n/lt.toml | 3 - i18n/nl.toml | 3 - i18n/no.toml | 3 - i18n/pl.toml | 3 - i18n/pt.toml | 3 - i18n/ro.toml | 2 - i18n/ru.toml | 1 - i18n/sl.toml | 3 - i18n/sv.toml | 2 - i18n/uk.toml | 3 - i18n/zh-Hans.toml | 2 - meter/template_test.go | 1 + schema.json | 41 +-- server/db/settings/setting.go | 16 +- server/http.go | 37 +- server/http_loadpoint_handler.go | 200 ++++++++++ .../{http_handler.go => http_site_handler.go} | 190 ---------- server/http_vehicle_handler.go | 131 +++++++ server/mqtt.go | 262 +++++++------ tests/limits.spec.js | 112 ++++++ tests/persist-target-minsoc.spec.js | 196 ---------- tests/plan.evcc.yaml | 86 +++++ tests/plan.spec.js | 193 ++++++++++ tests/simulator.evcc.yaml | 5 +- tests/vehicle-settings.spec.js | 115 ++++++ util/config/handler.go | 18 +- util/templates/includes/vehicle-identify.tpl | 6 - vehicle/embed.go | 2 + vehicle/tesla.go | 2 +- 116 files changed, 4073 insertions(+), 2539 deletions(-) delete mode 100644 api/actionconfig_test.go rename assets/js/components/{TargetChargePlan.story.vue => ChargingPlanPreview.story.vue} (87%) rename assets/js/components/{TargetChargePlan.test.js => ChargingPlanPreview.test.js} (95%) rename assets/js/components/{TargetChargePlan.vue => ChargingPlanPreview.vue} (98%) create mode 100644 assets/js/components/ChargingPlanSettings.vue create mode 100644 assets/js/components/ChargingPlanSettingsEntry.vue create mode 100644 assets/js/components/ChargingPlanWarnings.vue create mode 100644 assets/js/components/LimitEnergySelect.vue rename assets/js/components/{TargetSocSelect.vue => LimitSocSelect.vue} (69%) delete mode 100644 assets/js/components/TargetCharge.vue delete mode 100644 assets/js/components/TargetEnergySelect.vue create mode 100644 assets/js/utils/energyOptions.js delete mode 100644 core/const.go create mode 100644 core/keys/loadpoint.go create mode 100644 core/keys/site.go create mode 100644 core/loadpoint_effective.go create mode 100644 core/settings.go create mode 100644 core/site/vehicles.go create mode 100644 core/vehicle/adapter.go create mode 100644 core/vehicle/api.go create mode 100644 core/vehicle/dummy.go create mode 100644 core/vehicle/mock.go create mode 100644 core/vehicle/vehicle.go create mode 100644 server/http_loadpoint_handler.go rename server/{http_handler.go => http_site_handler.go} (56%) create mode 100644 server/http_vehicle_handler.go create mode 100644 tests/limits.spec.js delete mode 100644 tests/persist-target-minsoc.spec.js create mode 100755 tests/plan.evcc.yaml create mode 100644 tests/plan.spec.js create mode 100644 tests/vehicle-settings.spec.js diff --git a/api/actionconfig.go b/api/actionconfig.go index 0e145fde6..16bc86300 100644 --- a/api/actionconfig.go +++ b/api/actionconfig.go @@ -5,32 +5,15 @@ import ( "reflect" "strings" - "dario.cat/mergo" "github.com/fatih/structs" - "github.com/jinzhu/copier" ) // ActionConfig defines an action to take on event type ActionConfig struct { - Mode *ChargeMode `mapstructure:"mode,omitempty"` // Charge Mode - MinCurrent *float64 `mapstructure:"minCurrent,omitempty"` // Minimum Current - MaxCurrent *float64 `mapstructure:"maxCurrent,omitempty"` // Maximum Current - MinSoc_ *int `mapstructure:"minSoc,omitempty"` // Minimum Soc (deprecated) - TargetSoc *int `mapstructure:"targetSoc,omitempty"` // Target Soc - Priority *int `mapstructure:"priority,omitempty"` // Priority -} - -// Merge merges all non-nil properties of the additional config into the base config. -// The receiver's config remains immutable. -func (a ActionConfig) Merge(m ActionConfig) ActionConfig { - var res ActionConfig - if err := copier.Copy(&res, a); err != nil { - panic(err) - } - if err := mergo.MergeWithOverwrite(&res, m); err != nil { - panic(err) - } - return res + Mode ChargeMode `mapstructure:"mode,omitempty"` // Charge Mode + Priority int `mapstructure:"priority,omitempty"` // Priority + MinCurrent float64 `mapstructure:"minCurrent,omitempty"` // Minimum Current + MaxCurrent float64 `mapstructure:"maxCurrent,omitempty"` // Maximum Current } // String implements Stringer and returns the ActionConfig as comma-separated key:value string @@ -44,3 +27,19 @@ func (a ActionConfig) String() string { } return strings.Join(s, ", ") } + +func (a ActionConfig) GetMode() (ChargeMode, bool) { + return a.Mode, a.Mode != "" +} + +func (a ActionConfig) GetMinCurrent() (float64, bool) { + return a.MinCurrent, a.MinCurrent > 0 +} + +func (a ActionConfig) GetMaxCurrent() (float64, bool) { + return a.MaxCurrent, a.MaxCurrent > 0 +} + +func (a ActionConfig) GetPriority() (int, bool) { + return a.Priority, a.Priority > 0 +} diff --git a/api/actionconfig_test.go b/api/actionconfig_test.go deleted file mode 100644 index e2e401d65..000000000 --- a/api/actionconfig_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package api - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestMerge(t *testing.T) { - pv := ModePV - one := 1 - six := 6.0 - old := ActionConfig{ - Mode: &pv, - Priority: &one, - MinCurrent: &six, - } - - now := ModeNow - two := 2 - new := ActionConfig{ - Mode: &now, - Priority: &two, - } - - dst := old.Merge(new) - - // unmodified - assert.Equal(t, old, ActionConfig{ - Mode: &pv, - Priority: &one, - MinCurrent: &six, - }, "old modified") - - // overwritten - assert.Equal(t, dst, ActionConfig{ - Mode: &now, - MinCurrent: &six, - Priority: &two, - }, "new wrong") -} diff --git a/api/api.go b/api/api.go index 45eeeddfb..8568b12cc 100644 --- a/api/api.go +++ b/api/api.go @@ -124,8 +124,8 @@ type ChargeState interface { Status() (ChargeStatus, error) } -// CurrentLimiter provides settings charging maximum charging current -type CurrentLimiter interface { +// CurrentController provides settings charging maximum charging current +type CurrentController interface { MaxCurrent(current int64) error } @@ -144,7 +144,7 @@ type Charger interface { ChargeState Enabled() (bool, error) Enable(enable bool) error - CurrentLimiter + CurrentController } // ChargerEx provides milli-amp precision charger current control @@ -220,8 +220,14 @@ type VehiclePosition interface { Position() (float64, float64, error) } -// SocLimiter returns the vehicles charge limit +// CurrentLimiter returns the current limits +type CurrentLimiter interface { + GetMinMaxCurrent() (float64, float64, error) +} + +// SocLimiter returns the soc limit type SocLimiter interface { + // TODO rename LimitSoc TargetSoc() (float64, error) } diff --git a/assets/css/app.css b/assets/css/app.css index 043baa7b6..d1fa6fee7 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -369,6 +369,10 @@ small { background-image: url("data:image/svg+xml,"); } +.dark .form-select:disabled { + opacity: 0.5; +} + .dark .table { --bs-table-color: var(--evcc-default-text); --bs-table-border-color: var(--evcc-gray); diff --git a/assets/js/components/ChargingPlan.vue b/assets/js/components/ChargingPlan.vue index b9a3414d6..0bf749414 100644 --- a/assets/js/components/ChargingPlan.vue +++ b/assets/js/components/ChargingPlan.vue @@ -6,17 +6,26 @@ :class="disabled ? 'opacity-25' : 'opacity-100'" data-testid="charging-plan" > -

+
-

+ @@ -33,7 +42,8 @@