;
diff --git a/assets/js/utils/ocpp.ts b/assets/js/utils/ocpp.ts
index 79915c015..31801b4a5 100644
--- a/assets/js/utils/ocpp.ts
+++ b/assets/js/utils/ocpp.ts
@@ -2,7 +2,7 @@ import type { Ocpp } from "@/types/evcc";
export function getOcppUrl(ocpp: Ocpp): string {
// User specified url, e.g., for reverse proxy setups
- if (ocpp.status.externalUrl) {
+ if (ocpp.status?.externalUrl) {
return ocpp.status.externalUrl;
}
return `ws://${window.location.hostname}:${ocpp.config.port}/`;
diff --git a/assets/js/views/Battery.vue b/assets/js/views/Battery.vue
index 074898f4f..ac289a532 100644
--- a/assets/js/views/Battery.vue
+++ b/assets/js/views/Battery.vue
@@ -3,11 +3,18 @@
-
+
+
{{ $t("batterySettings.usageTab") }}
-
+
@@ -28,10 +35,10 @@
import { defineComponent } from "vue";
import Header from "../components/Top/Header.vue";
import BatteryUsageSettings from "../components/Battery/BatteryUsageSettings.vue";
+import BatteryExperimental from "../components/Battery/BatteryExperimental.vue";
import SmartCostLimit from "../components/Tariff/SmartCostLimit.vue";
import store from "../store";
import settings from "../settings";
-import collector from "../mixins/collector";
import { SMART_COST_TYPE } from "../types/evcc";
export default defineComponent({
@@ -39,22 +46,22 @@ export default defineComponent({
components: {
TopHeader: Header,
BatteryUsageSettings,
+ BatteryExperimental,
SmartCostLimit,
},
- mixins: [collector],
head() {
return { title: this.$t("batterySettings.modalTitle") };
},
computed: {
+ experimental(): boolean {
+ return !!store.state.experimental;
+ },
state() {
return store.state;
},
batteryAvailable() {
return (this.state.battery?.devices?.length ?? 0) > 0;
},
- batteryUsageProps() {
- return this.collectProps(BatteryUsageSettings, this.state);
- },
gridChargePossible() {
const devices = this.state.battery?.devices ?? [];
return (
diff --git a/assets/js/views/History.vue b/assets/js/views/History.vue
index 712728878..be25902e6 100644
--- a/assets/js/views/History.vue
+++ b/assets/js/views/History.vue
@@ -47,22 +47,15 @@
-
-
-
- {{ $t(`main.history.group.${group}`) }}
-
-
- {{ groupTotalLabel(group) }}
-
-
-
+
import { defineComponent, type PropType } from "vue";
import Header from "../components/Top/Header.vue";
+import Card from "../components/Helper/Card.vue";
import PeriodSelector from "../components/Sessions/PeriodSelector.vue";
import DateNavigator from "../components/Sessions/DateNavigator.vue";
import PeriodHeader from "../components/Sessions/PeriodHeader.vue";
@@ -121,7 +115,7 @@ import type { Legend } from "../components/Sessions/types";
import type { DeviceColors } from "@/types/evcc";
import { PERIODS } from "../components/Sessions/types";
import { GROUP_ORDER, groupColor, hasColorPicker } from "../components/History/groups";
-import colors, { resolveColors, deviceColorMap, darken } from "../colors";
+import colors, { resolveColors, deviceColorMap, darken, batteryColor } from "../colors";
import LegendList from "../components/Sessions/LegendList.vue";
import { handleDownloadClick } from "@/utils/native";
import formatter, { POWER_UNIT } from "../mixins/formatter";
@@ -138,6 +132,7 @@ export default defineComponent({
name: "History",
components: {
TopHeader: Header,
+ Card,
PeriodSelector,
DateNavigator,
PeriodHeader,
@@ -159,7 +154,6 @@ export default defineComponent({
displayTo: null as Date | null,
displayPeriod: null as PERIODS | null,
loading: true,
- interval: null as ReturnType | null,
startDate: new Date(2020, 0, 1),
focusedEntity: {} as Record,
};
@@ -171,6 +165,9 @@ export default defineComponent({
deviceColors(): DeviceColors {
return deviceColorMap(store.state.deviceColors);
},
+ historyUpdated(): string | undefined {
+ return store.state.historyUpdated;
+ },
effectivePeriod(): PERIODS {
return this.period && HISTORY_PERIODS.includes(this.period)
? (this.period as PERIODS)
@@ -337,6 +334,9 @@ export default defineComponent({
offline(offline) {
if (!offline) this.fetchData();
},
+ historyUpdated() {
+ this.fetchData();
+ },
rawSeries() {
// Drop focused entries whose paletteIndex no longer matches any entity
// in the new data (e.g. a loadpoint was filtered out after a period
@@ -356,10 +356,6 @@ export default defineComponent({
},
mounted() {
this.fetchData();
- this.interval = setInterval(() => this.fetchData(), 15 * 60 * 1e3);
- },
- unmounted() {
- if (this.interval) clearInterval(this.interval);
},
methods: {
groupColor,
@@ -418,6 +414,7 @@ export default defineComponent({
const colorFor = (i: number, s: HistorySeries) => {
if (s.virtual) return colors.muted || baseColor;
if (colorPicker) return palette[s.title] || baseColor;
+ if (group === "battery") return batteryColor(s.paletteIndex ?? i);
return darken(baseColor, stepAlpha(i, Math.max(n, 1)));
};
return list.map((s, i) => {
@@ -543,6 +540,7 @@ export default defineComponent({