From 847319ff3a7aa47224e99f51407537fb764961c9 Mon Sep 17 00:00:00 2001
From: Sustainability and Tech <39064649+TechandEco@users.noreply.github.com>
Date: Tue, 26 Dec 2023 09:19:50 -0800
Subject: [PATCH] Add solar_potential_calculations region tag
---
src/routes/sections/Sections.svelte | 24 ++--
.../sections/SolarPotentialSection.svelte | 131 ++++++++++--------
2 files changed, 87 insertions(+), 68 deletions(-)
diff --git a/src/routes/sections/Sections.svelte b/src/routes/sections/Sections.svelte
index f3a6072..a58824a 100644
--- a/src/routes/sections/Sections.svelte
+++ b/src/routes/sections/Sections.svelte
@@ -35,24 +35,24 @@
let showPanels = true;
// User settings
- let monthlyAverageEnergyBill = 300;
- let panelCapacityWatts = 250;
- let energyCostPerKwh = 0.31;
- let dcToAcDerate = 0.85;
+ let monthlyAverageEnergyBillInput = 300;
+ let panelCapacityWattsInput = 250;
+ let energyCostPerKwhInput = 0.31;
+ let dcToAcDerateInput = 0.85;
// Find the config that covers the yearly energy consumption.
let yearlyKwhEnergyConsumption: number;
- $: yearlyKwhEnergyConsumption = (monthlyAverageEnergyBill / energyCostPerKwh) * 12;
+ $: yearlyKwhEnergyConsumption = (monthlyAverageEnergyBillInput / energyCostPerKwhInput) * 12;
let configId: number | undefined;
$: if (configId === undefined && buildingInsights) {
const defaultPanelCapacity = buildingInsights.solarPotential.panelCapacityWatts;
- const panelCapacityRatio = panelCapacityWatts / defaultPanelCapacity;
+ const panelCapacityRatio = panelCapacityWattsInput / defaultPanelCapacity;
configId = findSolarConfig(
buildingInsights.solarPotential.solarPanelConfigs,
yearlyKwhEnergyConsumption,
panelCapacityRatio,
- dcToAcDerate,
+ dcToAcDerateInput,
);
}
@@ -63,7 +63,7 @@
bind:expandedSection
bind:buildingInsights
bind:configId
- bind:panelCapacityWatts
+ bind:panelCapacityWattsInput
bind:showPanels
{googleMapsApiKey}
{geometryLibrary}
@@ -87,10 +87,10 @@
diff --git a/src/routes/sections/SolarPotentialSection.svelte b/src/routes/sections/SolarPotentialSection.svelte
index b856aad..a684acf 100644
--- a/src/routes/sections/SolarPotentialSection.svelte
+++ b/src/routes/sections/SolarPotentialSection.svelte
@@ -36,83 +36,102 @@
export let expandedSection: string;
export let configId: number;
- export let monthlyAverageEnergyBill: number;
- export let energyCostPerKwh: number;
- export let panelCapacityWatts: number;
- export let dcToAcDerate: number;
+ export let monthlyAverageEnergyBillInput: number;
+ export let energyCostPerKwhInput: number;
+ export let panelCapacityWattsInput: number;
+ export let dcToAcDerateInput: number;
export let solarPanelConfigs: SolarPanelConfig[];
export let defaultPanelCapacityWatts: number;
const icon = 'payments';
const title = 'Solar Potential analysis';
+ let costChart: HTMLElement;
+ let showAdvancedSettings = false;
+
+ // [START solar_potential_calculations]
+ // Solar configuration, from buildingInsights.solarPotential.solarPanelConfigs
+ let panelsCount = 20;
+ let yearlyEnergyDcKwh = 12000;
+
// Basic settings
- let panelCapacityRatio = 1.0;
- $: panelCapacityRatio = panelCapacityWatts / defaultPanelCapacityWatts;
+ let monthlyAverageEnergyBill: number = 300;
+ let energyCostPerKwh = 0.31;
+ let panelCapacityWatts = 400;
let solarIncentives: number = 7000;
let installationCostPerWatt: number = 4.0;
- let installationLifeSpan = 20;
+ let installationLifeSpan: number = 20;
// Advanced settings
+ let dcToAcDerate = 0.85;
let efficiencyDepreciationFactor = 0.995;
let costIncreaseFactor = 1.022;
let discountRate = 1.04;
- // Calculations
- let installationCostTotal: number;
- $: installationCostTotal = installationCostPerWatt * installationSizeKw * 1000;
+ // Solar installation
+ let installationSizeKw: number = panelsCount * panelCapacityWatts / 1000;
+ let installationCostTotal: number = installationCostPerWatt * installationSizeKw * 1000;
- let costChart: HTMLElement;
- let showAdvancedSettings = false;
+ // Energy consumption
+ let monthlyKwhEnergyConsumption: number = monthlyAverageEnergyBill / energyCostPerKwh;
+ let yearlyKwhEnergyConsumption: number = monthlyKwhEnergyConsumption * 12;
- let installationSizeKw: number;
- $: if (solarPanelConfigs[configId]) {
- installationSizeKw = (solarPanelConfigs[configId].panelsCount * panelCapacityWatts) / 1000;
- }
+ // Energy produced for installation life span
+ let initialAcKwhPerYear: number = yearlyEnergyDcKwh * dcToAcDerate;
+ let yearlyProductionAcKwh: number[] = [...Array(installationLifeSpan).keys()].map(
+ (year) => initialAcKwhPerYear * efficiencyDepreciationFactor ** year,
+ );
- let monthlyKwhEnergyConsumption: number;
- $: monthlyKwhEnergyConsumption = monthlyAverageEnergyBill / energyCostPerKwh;
+ // Cost with solar for installation life span
+ let yearlyUtilityBillEstimates: number[] = yearlyProductionAcKwh.map((yearlyKwhEnergyProduced, year) => {
+ const billEnergyKwh = yearlyKwhEnergyConsumption - yearlyKwhEnergyProduced;
+ const billEstimate = (billEnergyKwh * energyCostPerKwh * costIncreaseFactor ** year) / discountRate ** year;
+ return Math.max(billEstimate, 0); // bill cannot be negative
+ });
+ let remainingLifetimeUtilityBill: number = yearlyUtilityBillEstimates.reduce((x, y) => x + y, 0);
+ let totalCostWithSolar: number = installationCostTotal + remainingLifetimeUtilityBill - solarIncentives;
+ console.log(`Cost with solar: \$${totalCostWithSolar.toFixed(2)}`)
+
+ // Cost without solar for installation life span
+ let yearlyCostWithoutSolar: number[] = [...Array(installationLifeSpan).keys()].map(
+ (year) => (monthlyAverageEnergyBill * 12 * costIncreaseFactor ** year) / discountRate ** year,
+ );
+ let totalCostWithoutSolar: number = yearlyCostWithoutSolar.reduce((x, y) => x + y, 0);
+ console.log(`Cost without solar: \$${totalCostWithoutSolar.toFixed(2)}`)
- let yearlyKwhEnergyConsumption: number;
- $: yearlyKwhEnergyConsumption = monthlyKwhEnergyConsumption * 12;
+ // Savings with solar for installation life span
+ let savings: number = totalCostWithoutSolar - totalCostWithSolar;
+ console.log(`Savings: \$${savings.toFixed(2)} in ${installationLifeSpan} years`)
+ // [END solar_potential_calculations]
- let initialAcKwhPerYear: number;
+ // Reactive calculations
+ let panelCapacityRatio: number = 1.0;
+ $: panelCapacityRatio = panelCapacityWattsInput / defaultPanelCapacityWatts;
+ $: installationCostTotal = installationCostPerWatt * installationSizeKw * 1000;
+ $: if (solarPanelConfigs[configId]) {
+ installationSizeKw = solarPanelConfigs[configId].panelsCount * panelCapacityWattsInput / 1000;
+ }
+ $: monthlyKwhEnergyConsumption = monthlyAverageEnergyBillInput / energyCostPerKwhInput;
+ $: yearlyKwhEnergyConsumption = monthlyKwhEnergyConsumption * 12;
$: if (solarPanelConfigs[configId]) {
initialAcKwhPerYear =
- solarPanelConfigs[configId].yearlyEnergyDcKwh * panelCapacityRatio * dcToAcDerate;
+ solarPanelConfigs[configId].yearlyEnergyDcKwh * panelCapacityRatio * dcToAcDerateInput;
}
-
- let yearlyProductionAcKwh: number[];
$: yearlyProductionAcKwh = [...Array(installationLifeSpan).keys()].map(
(year) => initialAcKwhPerYear * efficiencyDepreciationFactor ** year,
);
-
- let yearlyUtilityBillEstimates: number[];
- $: yearlyUtilityBillEstimates = yearlyProductionAcKwh.map((yearlyKwhEnergyProduced, year) =>
- Math.max(
- ((yearlyKwhEnergyConsumption - yearlyKwhEnergyProduced) *
- energyCostPerKwh *
- costIncreaseFactor ** year) /
- discountRate ** year,
- 0,
- ),
- );
-
- let remainingLifetimeUtilityBill: number;
+ $: yearlyUtilityBillEstimates = yearlyProductionAcKwh.map((yearlyKwhEnergyProduced, year) => {
+ const billEnergyKwh = yearlyKwhEnergyConsumption - yearlyKwhEnergyProduced;
+ const billEstimate = (billEnergyKwh * energyCostPerKwhInput * costIncreaseFactor ** year) / discountRate ** year;
+ return Math.max(billEstimate, 0); // bill cannot be negative
+ });
$: remainingLifetimeUtilityBill = yearlyUtilityBillEstimates.reduce((x, y) => x + y, 0);
-
- let costOfElectricityWithoutSolar: number;
- let yearlyCostWithoutSolar: number[];
+ $: totalCostWithSolar = installationCostTotal + remainingLifetimeUtilityBill - solarIncentives;
$: yearlyCostWithoutSolar = [...Array(installationLifeSpan).keys()].map(
- (year) => (monthlyAverageEnergyBill * 12 * costIncreaseFactor ** year) / discountRate ** year,
+ (year) => (monthlyAverageEnergyBillInput * 12 * costIncreaseFactor ** year) / discountRate ** year,
);
- $: costOfElectricityWithoutSolar = yearlyCostWithoutSolar.reduce((x, y) => x + y, 0);
-
- let totalCostWithSolar: number;
- $: totalCostWithSolar = installationCostTotal + remainingLifetimeUtilityBill - solarIncentives;
-
- let savings: number;
- $: savings = costOfElectricityWithoutSolar - totalCostWithSolar;
+ $: totalCostWithoutSolar = yearlyCostWithoutSolar.reduce((x, y) => x + y, 0);
+ $: savings = totalCostWithoutSolar - totalCostWithSolar;
let energyCovered: number;
$: energyCovered = yearlyProductionAcKwh[0] / yearlyKwhEnergyConsumption;
@@ -163,14 +182,14 @@
);
function updateConfig() {
- monthlyKwhEnergyConsumption = monthlyAverageEnergyBill / energyCostPerKwh;
+ monthlyKwhEnergyConsumption = monthlyAverageEnergyBillInput / energyCostPerKwhInput;
yearlyKwhEnergyConsumption = monthlyKwhEnergyConsumption * 12;
- panelCapacityRatio = panelCapacityWatts / defaultPanelCapacityWatts;
+ panelCapacityRatio = panelCapacityWattsInput / defaultPanelCapacityWatts;
configId = findSolarConfig(
solarPanelConfigs,
yearlyKwhEnergyConsumption,
panelCapacityRatio,
- dcToAcDerate,
+ dcToAcDerateInput,
);
}
@@ -202,7 +221,7 @@