evcc-io/assets/js/utils/energyOptions.js
2025-01-14 16:52:40 +01:00

43 lines
1.3 KiB
JavaScript

import { POWER_UNIT } from "../mixins/formatter";
export function optionStep(maxEnergy) {
if (maxEnergy < 0.1) return 0.005;
if (maxEnergy < 1) return 0.05;
if (maxEnergy < 2) return 0.1;
if (maxEnergy < 5) return 0.25;
if (maxEnergy < 10) return 0.5;
if (maxEnergy < 25) return 1;
if (maxEnergy < 50) return 2;
return 5;
}
export function fmtEnergy(energy, step, fmtWh, zeroText) {
if (energy === 0) {
return zeroText;
}
const inKWh = step >= 0.1;
const digits = inKWh && step < 1 ? 1 : 0;
return fmtWh(energy * 1e3, inKWh ? POWER_UNIT.KW : POWER_UNIT.W, true, digits);
}
export function estimatedSoc(energy, socPerKwh) {
if (!socPerKwh) return null;
return Math.round(energy * socPerKwh);
}
export function energyOptions(fromEnergy, maxEnergy, socPerKwh, fmtWh, fmtPercentage, zeroText) {
const step = optionStep(maxEnergy);
const result = [];
for (let energy = 0; energy <= maxEnergy; energy += step) {
let text = fmtEnergy(energy, step, fmtWh, zeroText);
const disabled = energy < fromEnergy / 1e3 && energy !== 0;
const soc = estimatedSoc(energy, socPerKwh);
if (soc) {
text += ` (+${fmtPercentage(soc)})`;
}
// prevent rounding errors
const energyNormal = energy.toFixed(3) * 1;
result.push({ energy: energyNormal, text, disabled });
}
return result;
}