From b503f0152f11ce76f9cd2d2370d3e6e65c236509 Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Wed, 5 Apr 2023 13:14:56 +0200 Subject: [PATCH] Add ui for price/co2 limit (#6935) --- api/api.go | 1 + assets/css/app.css | 15 +- assets/js/components/ChargingPlan.story.vue | 31 ++ assets/js/components/ChargingPlan.vue | 235 ++++++++++++ assets/js/components/ChargingPlanArrival.vue | 63 ++++ .../Energyflow/Energyflow.story.vue | 35 ++ .../js/components/Energyflow/Energyflow.vue | 43 ++- .../components/Energyflow/EnergyflowEntry.vue | 31 +- assets/js/components/GlobalSettingsModal.vue | 30 -- assets/js/components/GridSettingsModal.vue | 340 ++++++++++++++++++ assets/js/components/Loadpoint.vue | 6 +- .../js/components/LoadpointSettingsModal.vue | 55 +-- assets/js/components/Loadpoints.vue | 8 + assets/js/components/Site.vue | 13 +- assets/js/components/TargetCharge.vue | 291 ++++++--------- .../js/components/TargetChargePlan.story.vue | 11 + assets/js/components/TargetChargePlan.vue | 144 +------- .../js/components/TargetChargePlanMinimal.vue | 63 ---- assets/js/components/TariffChart.vue | 173 +++++++++ assets/js/components/TopNavigation.vue | 2 - assets/js/components/Vehicle.story.vue | 5 +- assets/js/components/Vehicle.vue | 27 +- assets/js/components/VehicleSettingsModal.vue | 6 +- assets/js/components/VehicleStatus.test.js | 29 ++ assets/js/components/VehicleStatus.vue | 18 + assets/js/gridDetails.js | 22 -- assets/js/settings.js | 3 - assets/js/units.js | 2 + cmd/demo.yaml | 3 - core/site.go | 5 +- i18n/de.toml | 33 +- i18n/en.toml | 33 +- mock/mock_api.go | 14 + tariff/awattar.go | 5 + tariff/electricitymaps.go | 5 + tariff/fixed.go | 17 +- tariff/gruenstromindex.go | 5 + tariff/octopus.go | 5 + tariff/tibber.go | 5 + 39 files changed, 1282 insertions(+), 550 deletions(-) create mode 100644 assets/js/components/ChargingPlan.story.vue create mode 100644 assets/js/components/ChargingPlan.vue create mode 100644 assets/js/components/ChargingPlanArrival.vue create mode 100644 assets/js/components/GridSettingsModal.vue delete mode 100644 assets/js/components/TargetChargePlanMinimal.vue create mode 100644 assets/js/components/TariffChart.vue delete mode 100644 assets/js/gridDetails.js diff --git a/api/api.go b/api/api.go index 42ac143af..f9bce4a5a 100644 --- a/api/api.go +++ b/api/api.go @@ -206,6 +206,7 @@ type Rates []Rate type Tariff interface { Unit() string Rates() (Rates, error) + IsDynamic() bool } // AuthProvider is the ability to provide OAuth authentication through the ui diff --git a/assets/css/app.css b/assets/css/app.css index bfca86e75..e7a6cffe8 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -52,12 +52,14 @@ --evcc-transition-very-fast: 100ms; --bs-primary: var(--evcc-darker-green); - --bs-primary-rgb: 58, 186, 44; + --bs-primary-rgb: 11, 166, 49; --bs-body-font-size: 14px; --bs-font-sans-serif: Montserrat, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-success: var(--evcc-primary); + --bs-success-rgb: var(--bs-primary-rgb); } :root.dark { @@ -105,6 +107,11 @@ h4 { font-size: 1.25rem; } +h5 { + font-size: 1rem; + font-weight: bold; +} + .large { font-size: 1.25rem; line-height: 1.2; @@ -198,6 +205,12 @@ a:hover { --bs-btn-hover-color: var(--bs-gray-dark); } +.accordion { + --bs-accordion-active-color: var(--bs-text); + --bs-accordion-active-bg: var(--evcc-background); + --bs-accordion-btn-active-icon: var(--bs-accordion-btn-icon); +} + .text-evcc { color: var(--evcc-dark-green); } diff --git a/assets/js/components/ChargingPlan.story.vue b/assets/js/components/ChargingPlan.story.vue new file mode 100644 index 000000000..b0589c0a2 --- /dev/null +++ b/assets/js/components/ChargingPlan.story.vue @@ -0,0 +1,31 @@ + + diff --git a/assets/js/components/ChargingPlan.vue b/assets/js/components/ChargingPlan.vue new file mode 100644 index 000000000..e5f39ffd3 --- /dev/null +++ b/assets/js/components/ChargingPlan.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/assets/js/components/ChargingPlanArrival.vue b/assets/js/components/ChargingPlanArrival.vue new file mode 100644 index 000000000..f2a1a74d4 --- /dev/null +++ b/assets/js/components/ChargingPlanArrival.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/assets/js/components/Energyflow/Energyflow.story.vue b/assets/js/components/Energyflow/Energyflow.story.vue index 047c6ed32..9bffe116c 100644 --- a/assets/js/components/Energyflow/Energyflow.story.vue +++ b/assets/js/components/Energyflow/Energyflow.story.vue @@ -13,6 +13,12 @@ import Energyflow from "./Energyflow.vue"; :homePower="800" :loadpointsPower="4200" :activeLoadpointsCount="3" + :tariffGrid="0.25" + :tariffFeedIn="0.08" + :tariffEffectivePrice="0.08" + smartCostUnit="EUR" + smartCostAvailable + currency="EUR" siteTitle="Home" :pv="[{ power: 5000 }, { power: 2300 }]" /> @@ -27,6 +33,10 @@ import Energyflow from "./Energyflow.vue"; :homePower="2000" :batteryPower="800" :batterySoc="77" + :tariffGrid="0.25" + :tariffFeedIn="0.08" + :tariffEffectivePrice="0.08" + currency="EUR" siteTitle="Home" :battery="[ { soc: 44.999, capacity: 13.3 }, @@ -116,8 +126,33 @@ import Energyflow from "./Energyflow.vue"; :homePower="300" :batteryPower="-100" :batterySoc="55" + :tariffGrid="0.25" + :tariffFeedIn="0.08" + :tariffEffectivePrice="0.08" + currency="EUR" siteTitle="Home" /> + + + diff --git a/assets/js/components/Energyflow/Energyflow.vue b/assets/js/components/Energyflow/Energyflow.vue index e1985984f..9fcf7ea7b 100644 --- a/assets/js/components/Energyflow/Energyflow.vue +++ b/assets/js/components/Energyflow/Energyflow.vue @@ -77,7 +77,9 @@ :powerInKw="powerInKw" :details="detailsValue(tariffGrid, tariffCo2)" :detailsFmt="detailsFmt" + :detailsClickable="smartCostAvailable" :detailsTooltip="detailsTooltip(tariffGrid, tariffCo2)" + @details-clicked="openGridSettingsModal" /> @@ -146,22 +148,26 @@ + diff --git a/assets/js/components/Energyflow/EnergyflowEntry.vue b/assets/js/components/Energyflow/EnergyflowEntry.vue index 5384a365f..6ec3e20c5 100644 --- a/assets/js/components/Energyflow/EnergyflowEntry.vue +++ b/assets/js/components/Energyflow/EnergyflowEntry.vue @@ -9,10 +9,17 @@ {{ name }} -
- +
+
-
+
@@ -44,7 +51,9 @@ export default { details: { type: Number }, detailsFmt: { type: Function }, detailsTooltip: { type: Array }, + detailsClickable: { type: Boolean }, }, + emits: ["details-clicked"], data() { return { powerTooltipInstance: null, detailsTooltipInstance: null }; }, @@ -87,6 +96,9 @@ export default { ); }, updateDetailsTooltip() { + if (this.detailsClickable) { + return; + } this.detailsTooltipInstance = this.updateTooltip( this.detailsTooltipInstance, this.detailsTooltip, @@ -107,6 +119,19 @@ export default { instance.setContent({ ".tooltip-inner": html }); return instance; }, + powerClicked: function ($event) { + if (this.powerTooltip) { + $event.stopPropagation(); + } + }, + detailsClicked: function ($event) { + if (this.detailsClickable || this.detailsTooltip) { + $event.stopPropagation(); + } + if (this.detailsClickable) { + this.$emit("details-clicked"); + } + }, }, }; diff --git a/assets/js/components/GlobalSettingsModal.vue b/assets/js/components/GlobalSettingsModal.vue index 8584a5375..01d7ebf4b 100644 --- a/assets/js/components/GlobalSettingsModal.vue +++ b/assets/js/components/GlobalSettingsModal.vue @@ -64,23 +64,6 @@ " /> - - - @@ -120,7 +103,6 @@ import SelectGroup from "./SelectGroup.vue"; import { getLocalePreference, setLocalePreference, LOCALES, removeLocalePreference } from "../i18n"; import { getThemePreference, setThemePreference, THEMES } from "../theme"; import { getUnits, setUnits, UNITS } from "../units"; -import { getGridDetails, setGridDetails, GRID_DETAILS } from "../gridDetails"; import { getHiddenFeatures, setHiddenFeatures } from "../featureflags"; export default { @@ -128,8 +110,6 @@ export default { components: { TelemetrySettings, FormRow, SelectGroup, SponsorTokenExpires }, props: { sponsor: String, - hasPrice: Boolean, - hasCo2: Boolean, sponsorTokenExpires: Number, }, data: function () { @@ -137,11 +117,9 @@ export default { theme: getThemePreference(), language: getLocalePreference() || "", unit: getUnits(), - gridDetails: getGridDetails(), hiddenFeatures: getHiddenFeatures(), THEMES, UNITS, - GRID_DETAILS, }; }, computed: { @@ -161,9 +139,6 @@ export default { unit(value) { setUnits(value); }, - gridDetails(value) { - setGridDetails(value); - }, theme(value) { setThemePreference(value); }, @@ -179,10 +154,5 @@ export default { } }, }, - methods: { - isDisabled(option) { - return (option === "co2" && !this.hasCo2) || (option === "price" && !this.hasPrice); - }, - }, }; diff --git a/assets/js/components/GridSettingsModal.vue b/assets/js/components/GridSettingsModal.vue new file mode 100644 index 000000000..ecc1eb607 --- /dev/null +++ b/assets/js/components/GridSettingsModal.vue @@ -0,0 +1,340 @@ + + + + + diff --git a/assets/js/components/Loadpoint.vue b/assets/js/components/Loadpoint.vue index ddceb4c80..dd837bc9d 100644 --- a/assets/js/components/Loadpoint.vue +++ b/assets/js/components/Loadpoint.vue @@ -32,7 +32,6 @@ @maxcurrent-updated="setMaxCurrent" @mincurrent-updated="setMinCurrent" @phasesconfigured-updated="setPhasesConfigured" - @minsoc-updated="setMinSoc" />
@@ -199,6 +199,10 @@ export default { pvAction: String, guardRemaining: Number, guardAction: String, + smartCostLimit: Number, + smartCostUnit: String, + tariffGrid: Number, + tariffCo2: Number, }, data() { return { diff --git a/assets/js/components/LoadpointSettingsModal.vue b/assets/js/components/LoadpointSettingsModal.vue index 21354e97d..bfe79bbcc 100644 --- a/assets/js/components/LoadpointSettingsModal.vue +++ b/assets/js/components/LoadpointSettingsModal.vue @@ -23,47 +23,6 @@