diff --git a/assets/js/components/Battery/BatterySettingsModal.vue b/assets/js/components/Battery/BatterySettingsModal.vue
index 489d5cafe..5c3a981c6 100644
--- a/assets/js/components/Battery/BatterySettingsModal.vue
+++ b/assets/js/components/Battery/BatterySettingsModal.vue
@@ -262,7 +262,7 @@ import collector from "../../mixins/collector.js";
import api from "../../api.js";
import smartCostAvailable from "../../utils/smartCostAvailable.js";
import { defineComponent, type PropType } from "vue";
-import type { Battery, SelectOption } from "assets/js/types/evcc.js";
+import type { Battery, SelectOption } from "../../types/evcc.js";
export default defineComponent({
name: "BatterySettingsModal",
diff --git a/assets/js/components/ChargingPlans/ChargingPlan.vue b/assets/js/components/ChargingPlans/ChargingPlan.vue
index 250b5145e..ec7c26f8a 100644
--- a/assets/js/components/ChargingPlans/ChargingPlan.vue
+++ b/assets/js/components/ChargingPlans/ChargingPlan.vue
@@ -113,9 +113,9 @@ import collector from "../../mixins/collector.js";
import api from "../../api.js";
import { optionStep, fmtEnergy } from "../../utils/energyOptions.js";
import { defineComponent, type PropType } from "vue";
-import type { CURRENCY, Timeout, Vehicle } from "assets/js/types/evcc.js";
+import type { CURRENCY, Timeout, Vehicle } from "../../types/evcc.js";
import type { StaticPlan, StaticSocPlan, StaticEnergyPlan, RepeatingPlan } from "./types.js";
-import type { Forecast } from "../../utils/forecast.ts";
+import type { Forecast } from "../../types/evcc.ts";
const ONE_MINUTE = 60 * 1000;
export default defineComponent({
diff --git a/assets/js/components/ChargingPlans/PlansSettings.vue b/assets/js/components/ChargingPlans/PlansSettings.vue
index ade01e458..504f64175 100644
--- a/assets/js/components/ChargingPlans/PlansSettings.vue
+++ b/assets/js/components/ChargingPlans/PlansSettings.vue
@@ -88,7 +88,7 @@ import type {
StaticEnergyPlan,
PlanResponse,
} from "./types.js";
-import type { Forecast } from "../../utils/forecast.ts";
+import type { Forecast } from "../../types/evcc.ts";
export default defineComponent({
name: "ChargingPlansSettings",
diff --git a/assets/js/components/ChargingPlans/Warnings.vue b/assets/js/components/ChargingPlans/Warnings.vue
index 44ad0e872..39284f382 100644
--- a/assets/js/components/ChargingPlans/Warnings.vue
+++ b/assets/js/components/ChargingPlans/Warnings.vue
@@ -22,7 +22,7 @@
import { defineComponent, type PropType } from "vue";
import formatter from "../../mixins/formatter.js";
import type { PlanWrapper } from "./types.js";
-import type { Tariff } from "assets/js/types/evcc.js";
+import type { Tariff } from "../../types/evcc.js";
export default defineComponent({
name: "ChargingPlanWarnings",
diff --git a/assets/js/components/ChargingPlans/types.d.ts b/assets/js/components/ChargingPlans/types.d.ts
index 6fed83a5d..4400c0b82 100644
--- a/assets/js/components/ChargingPlans/types.d.ts
+++ b/assets/js/components/ChargingPlans/types.d.ts
@@ -1,4 +1,4 @@
-import type { Rate } from "assets/js/types/evcc";
+import type { Rate } from "../../types/evcc";
export interface RepeatingPlan {
weekdays: number[];
diff --git a/assets/js/components/Energyflow/BatteryIcon.stories.js b/assets/js/components/Energyflow/BatteryIcon.stories.js
deleted file mode 100644
index 4093f2bf6..000000000
--- a/assets/js/components/Energyflow/BatteryIcon.stories.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import BatteryIcon from "./BatteryIcon.vue";
-
-export default {
- title: "Energyflow/BatteryIcon",
- component: BatteryIcon,
- parameters: {
- layout: "centered",
- },
-};
-
-const createStory = (args) => {
- const story = () => ({
- components: { BatteryIcon },
- setup() {
- return { args };
- },
- template: '',
- });
- story.args = args;
- return story;
-};
-
-export const Empty = createStory({ soc: 0 });
-export const Soc10 = createStory({ soc: 10 });
-export const Soc20 = createStory({ soc: 20 });
-export const Soc30 = createStory({ soc: 30 });
-export const Soc40 = createStory({ soc: 40 });
-export const Soc50 = createStory({ soc: 50 });
-export const Soc60 = createStory({ soc: 60 });
-export const Soc70 = createStory({ soc: 70 });
-export const Soc80 = createStory({ soc: 80 });
-export const Soc90 = createStory({ soc: 90 });
-export const Hold = createStory({ hold: true });
-export const GridCharge = createStory({ gridCharge: true });
diff --git a/assets/js/components/Energyflow/BatteryIcon.stories.ts b/assets/js/components/Energyflow/BatteryIcon.stories.ts
new file mode 100644
index 000000000..9c8d0e67a
--- /dev/null
+++ b/assets/js/components/Energyflow/BatteryIcon.stories.ts
@@ -0,0 +1,58 @@
+import BatteryIcon from "./BatteryIcon.vue";
+import type { Meta, StoryFn } from "@storybook/vue3";
+
+export default {
+ title: "Energyflow/BatteryIcon",
+ component: BatteryIcon,
+ parameters: {
+ layout: "centered",
+ },
+} as Meta;
+
+const Template: StoryFn = (args) => {
+ const story = () => ({
+ components: { BatteryIcon },
+ setup() {
+ return { args };
+ },
+ template: '',
+ });
+ story.args = args;
+ return story;
+};
+
+export const Empty = Template.bind({});
+Empty.args = { soc: 0 };
+
+export const Soc10 = Template.bind({});
+Soc10.args = { soc: 10 };
+
+export const Soc20 = Template.bind({});
+Soc20.args = { soc: 20 };
+
+export const Soc30 = Template.bind({});
+Soc30.args = { soc: 30 };
+
+export const Soc40 = Template.bind({});
+Soc40.args = { soc: 40 };
+
+export const Soc50 = Template.bind({});
+Soc50.args = { soc: 50 };
+
+export const Soc60 = Template.bind({});
+Soc60.args = { soc: 60 };
+
+export const Soc70 = Template.bind({});
+Soc70.args = { soc: 70 };
+
+export const Soc80 = Template.bind({});
+Soc80.args = { soc: 80 };
+
+export const Soc90 = Template.bind({});
+Soc90.args = { soc: 90 };
+
+export const Hold = Template.bind({});
+Hold.args = { hold: true };
+
+export const GridCharge = Template.bind({});
+GridCharge.args = { gridCharge: true };
diff --git a/assets/js/components/Energyflow/BatteryIcon.vue b/assets/js/components/Energyflow/BatteryIcon.vue
index 78df10793..e03a7c826 100644
--- a/assets/js/components/Energyflow/BatteryIcon.vue
+++ b/assets/js/components/Energyflow/BatteryIcon.vue
@@ -19,10 +19,11 @@
-
diff --git a/assets/js/components/Energyflow/Energyflow.stories.js b/assets/js/components/Energyflow/Energyflow.stories.js
deleted file mode 100644
index d7481728f..000000000
--- a/assets/js/components/Energyflow/Energyflow.stories.js
+++ /dev/null
@@ -1,215 +0,0 @@
-import Energyflow from "./Energyflow.vue";
-
-export default {
- title: "Energyflow/Energyflow",
- component: Energyflow,
-};
-
-const Template = (args) => ({
- components: { Energyflow },
- setup() {
- return { args };
- },
- template: '',
-});
-
-export const GridAndPV = Template.bind({});
-GridAndPV.args = {
- gridConfigured: true,
- pvConfigured: true,
- pvPower: 7300,
- gridPower: -2300,
- homePower: 800,
- loadpointsCompact: [
- { power: 1000, icon: "car", charging: true },
- { power: 1000, icon: "bike", charging: true },
- { power: 2200, icon: "car", charging: true },
- ],
- tariffGrid: 0.25,
- tariffFeedIn: 0.08,
- tariffEffectivePrice: 0.08,
- smartCostType: "price",
- smartCostAvailable: true,
- currency: "EUR",
- siteTitle: "Home",
- pv: [{ power: 5000 }, { power: 2300 }],
-};
-
-export const BatteryAndGrid = Template.bind({});
-BatteryAndGrid.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 0,
- gridPower: 1200,
- 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, power: 350 },
- { soc: 82.3331, capacity: 21, power: 450 },
- ],
-};
-
-export const BatteryCharging = Template.bind({});
-BatteryCharging.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 5000,
- gridPower: -1300,
- homePower: 800,
- loadpointsCompact: [{ power: 1400, icon: "car", charging: true }],
- batteryPower: -1500,
- batterySoc: 75,
- siteTitle: "Home",
-};
-
-export const GridPVAndBattery = Template.bind({});
-GridPVAndBattery.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 1000,
- gridPower: 700,
- homePower: 3300,
- batteryPower: 1500,
- batterySoc: 30,
- siteTitle: "Home",
-};
-
-export const BatteryThresholds = Template.bind({});
-BatteryThresholds.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 8700,
- gridPower: -500,
- loadpointsCompact: [
- { power: 5000, icon: "car", charging: true },
- { power: 2500, icon: "bus", charging: true },
- ],
- batteryPower: -700,
- batterySoc: 95,
- siteTitle: "Home",
-};
-
-export const PVThresholds = Template.bind({});
-PVThresholds.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 300,
- gridPower: 6500,
- homePower: 1000,
- loadpointsCompact: [
- { power: 5000, icon: "car", charging: true },
- { power: 1600, icon: "car", charging: true },
- ],
- batteryPower: 800,
- batterySoc: 76,
- siteTitle: "Home",
-};
-
-export const GridOnly = Template.bind({});
-GridOnly.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 0,
- gridPower: 6500,
- homePower: 1000,
- loadpointsCompact: [
- { power: 5500, icon: "car", charging: true },
- { power: 0, icon: "car", charging: false },
- { power: 0, icon: "car", charging: false },
- { power: 0, icon: "car", charging: false },
- ],
- batteryPower: 0,
- batterySoc: 0,
- siteTitle: "Home",
-};
-
-export const LowPower = Template.bind({});
-LowPower.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 700,
- gridPower: -300,
- homePower: 300,
- batteryPower: -100,
- batterySoc: 55,
- tariffGrid: 0.25,
- tariffFeedIn: 0.08,
- tariffEffectivePrice: 0.08,
- currency: "EUR",
- siteTitle: "Home",
-};
-
-export const CO2 = Template.bind({});
-CO2.args = {
- gridConfigured: true,
- pvConfigured: true,
- pvPower: 7300,
- gridPower: -2300,
- homePower: 800,
- loadpointsCompact: [
- { power: 1000, icon: "car", charging: true },
- { power: 1000, icon: "car", charging: true },
- { power: 2200, icon: "car", charging: true },
- ],
- tariffGrid: 0.25,
- tariffFeedIn: 0.08,
- tariffEffectivePrice: 0.08,
- tariffCo2: 723,
- tariffEffectiveCo2: 0,
- smartCostType: "co2",
- smartCostAvailable: true,
- currency: "EUR",
- siteTitle: "Home",
- pv: [{ power: 5000 }, { power: 2300 }],
-};
-
-export const UnknownInput = Template.bind({});
-UnknownInput.args = {
- gridConfigured: true,
- pvConfigured: true,
- pvPower: 2000,
- gridPower: -2000,
- loadpointsCompact: [{ power: 1000, icon: "car", charging: true }],
-};
-
-export const UnknownInputFill = Template.bind({});
-UnknownInputFill.args = {
- gridConfigured: true,
- pvConfigured: true,
- batteryConfigured: true,
- pvPower: 500,
- gridPower: 0,
- batteryPower: -1000,
- loadpointsCompact: [],
-};
-
-export const UnknownOutput = Template.bind({});
-UnknownOutput.args = {
- gridConfigured: true,
- pvConfigured: true,
- pvPower: 3000,
- gridPower: -1000,
- loadpointsCompact: [{ power: 1700, icon: "car", charging: true }],
-};
-
-export const UnknownOutputLessThan10Percent = Template.bind({});
-UnknownOutputLessThan10Percent.args = {
- gridConfigured: true,
- pvConfigured: true,
- pvPower: 3000,
- gridPower: -1000,
- loadpointsCompact: [{ power: 1800, icon: "car", charging: true }],
-};
diff --git a/assets/js/components/Energyflow/Energyflow.stories.ts b/assets/js/components/Energyflow/Energyflow.stories.ts
new file mode 100644
index 000000000..71309fa71
--- /dev/null
+++ b/assets/js/components/Energyflow/Energyflow.stories.ts
@@ -0,0 +1,201 @@
+import type { Meta, StoryFn } from "@storybook/vue3";
+import Energyflow from "./Energyflow.vue";
+import { CURRENCY } from "../../types/evcc";
+
+export default {
+ title: "Energyflow/Energyflow",
+ component: Energyflow,
+} as Meta;
+
+const Template: StoryFn = (args) => ({
+ components: { Energyflow },
+ setup() {
+ return { args };
+ },
+ template: '',
+});
+
+export const GridAndPV = Template.bind({});
+GridAndPV.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ pvPower: 7300,
+ gridPower: -2300,
+ homePower: 800,
+ loadpointsCompact: [
+ { power: 1000, icon: "car", charging: true, title: "Garage" },
+ { power: 1000, icon: "bike", charging: true, title: "Garage" },
+ { power: 2200, icon: "car", charging: true, title: "Garage" },
+ ],
+ tariffGrid: 0.25,
+ tariffFeedIn: 0.08,
+ smartCostType: "price",
+ currency: CURRENCY.EUR,
+ pv: [{ power: 5000 }, { power: 2300 }],
+};
+
+export const BatteryAndGrid = Template.bind({});
+BatteryAndGrid.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 0,
+ gridPower: 1200,
+ homePower: 2000,
+ batteryPower: 800,
+ batterySoc: 77,
+ tariffGrid: 0.25,
+ tariffFeedIn: 0.08,
+ currency: CURRENCY.EUR,
+ battery: [
+ { soc: 44.999, capacity: 13.3, power: 350, controllable: true },
+ { soc: 82.3331, capacity: 21, power: 450, controllable: false },
+ ],
+};
+
+export const BatteryCharging = Template.bind({});
+BatteryCharging.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 5000,
+ gridPower: -1300,
+ homePower: 800,
+ loadpointsCompact: [{ power: 1400, icon: "car", charging: true, title: "Garage" }],
+ batteryPower: -1500,
+ batterySoc: 75,
+};
+
+export const GridPVAndBattery = Template.bind({});
+GridPVAndBattery.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 1000,
+ gridPower: 700,
+ homePower: 3300,
+ batteryPower: 1500,
+ batterySoc: 30,
+};
+
+export const BatteryThresholds = Template.bind({});
+BatteryThresholds.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 8700,
+ gridPower: -500,
+ loadpointsCompact: [
+ { power: 5000, icon: "car", charging: true, title: "Garage" },
+ { power: 2500, icon: "bus", charging: true, title: "Garage" },
+ ],
+ batteryPower: -700,
+ batterySoc: 95,
+};
+
+export const PVThresholds = Template.bind({});
+PVThresholds.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 300,
+ gridPower: 6500,
+ homePower: 1000,
+ loadpointsCompact: [
+ { power: 5000, icon: "car", charging: true, title: "Garage" },
+ { power: 1600, icon: "car", charging: true, title: "Garage" },
+ ],
+ batteryPower: 800,
+ batterySoc: 76,
+};
+
+export const GridOnly = Template.bind({});
+GridOnly.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 0,
+ gridPower: 6500,
+ homePower: 1000,
+ loadpointsCompact: [
+ { power: 5500, icon: "car", charging: true, title: "Garage" },
+ { power: 0, icon: "car", charging: false, title: "Garage" },
+ { power: 0, icon: "car", charging: false, title: "Garage" },
+ { power: 0, icon: "car", charging: false, title: "Garage" },
+ ],
+ batteryPower: 0,
+ batterySoc: 0,
+};
+
+export const LowPower = Template.bind({});
+LowPower.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 700,
+ gridPower: -300,
+ homePower: 300,
+ batteryPower: -100,
+ batterySoc: 55,
+ tariffGrid: 0.25,
+ tariffFeedIn: 0.08,
+ currency: CURRENCY.EUR,
+};
+
+export const CO2 = Template.bind({});
+CO2.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ pvPower: 7300,
+ gridPower: -2300,
+ homePower: 800,
+ loadpointsCompact: [
+ { power: 1000, icon: "car", charging: true, title: "Garage" },
+ { power: 1000, icon: "car", charging: true, title: "Garage" },
+ { power: 2200, icon: "car", charging: true, title: "Garage" },
+ ],
+ tariffGrid: 0.25,
+ tariffFeedIn: 0.08,
+ tariffCo2: 723,
+ smartCostType: "co2",
+ currency: CURRENCY.EUR,
+ pv: [{ power: 5000 }, { power: 2300 }],
+};
+
+export const UnknownInput = Template.bind({});
+UnknownInput.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ pvPower: 2000,
+ gridPower: -2000,
+ loadpointsCompact: [{ power: 1000, icon: "car", charging: true, title: "Garage" }],
+};
+
+export const UnknownInputFill = Template.bind({});
+UnknownInputFill.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ batteryConfigured: true,
+ pvPower: 500,
+ gridPower: 0,
+ batteryPower: -1000,
+ loadpointsCompact: [],
+};
+
+export const UnknownOutput = Template.bind({});
+UnknownOutput.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ pvPower: 3000,
+ gridPower: -1000,
+ loadpointsCompact: [{ power: 1700, icon: "car", charging: true, title: "Garage" }],
+};
+
+export const UnknownOutputLessThan10Percent = Template.bind({});
+UnknownOutputLessThan10Percent.args = {
+ gridConfigured: true,
+ pvConfigured: true,
+ pvPower: 3000,
+ gridPower: -1000,
+ loadpointsCompact: [{ power: 1800, icon: "car", charging: true, title: "Garage" }],
+};
diff --git a/assets/js/components/Energyflow/Energyflow.vue b/assets/js/components/Energyflow/Energyflow.vue
index f986f715b..e58f3e9f3 100644
--- a/assets/js/components/Energyflow/Energyflow.vue
+++ b/assets/js/components/Energyflow/Energyflow.vue
@@ -94,7 +94,7 @@
@details-clicked="openForecastModal"
@toggle="togglePv"
>
-
+
-
+
1" #expanded>
+
-