forked from codema-dev/dublin-energy-app
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
148 lines (118 loc) · 4.91 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
from configparser import ConfigParser
from pathlib import Path
from typing import Any
from typing import Dict
import streamlit as st
from dea import CONFIG
from dea import DEFAULTS
from dea import _DATA_DIR
from dea import filter
from dea import io
from dea import plot
from dea.mapselect import mapselect
from dea import retrofit
import os
import toml
# Read values from the TOML file
#config = toml.load("config.toml")
import boto3
import streamlit as st
# Load AWS credentials from environment variables
aws_access_key_id = os.environ.get("AWS_ACCESS_KEY_ID")
aws_secret_access_key = os.environ.get("AWS_SECRET_ACCESS_KEY")
# Access AWS credentials
#aws_access_key_id = config["aws"]["access_key_id"]
#aws_secret_access_key = config["aws"]["secret_access_key"]
# Debugging print statements
#print(f"AWS Access Key ID: {aws_access_key_id}")
#print(f"AWS Secret Access Key: {aws_secret_access_key}")
DeaSelection = Dict[str, Any]
@st.cache_data
def load_small_area_boundaries(small_area_boundaries_url, data_dir):
return io.load_small_area_boundaries(
url=small_area_boundaries_url, data_dir=data_dir
)
def main(
defaults: DeaSelection = DEFAULTS,
data_dir: Path = _DATA_DIR,
config: ConfigParser = CONFIG,
):
st.header("Welcome to the Dublin Retrofitting Tool")
small_area_boundaries_url = config["urls"]["small_area_boundaries"]
small_area_boundaries = load_small_area_boundaries(small_area_boundaries_url, data_dir)
with st.form(key="Inputs"):
st.markdown("ℹ️ Click `Submit` once you've selected all parameters")
selected_energy_ratings = st.multiselect(
"Select BER Ratings",
options=["A", "B", "C", "D", "E", "F", "G"],
default=["A", "B", "C", "D", "E", "F", "G"],
)
selected_small_areas = mapselect(
column_name="small_area", boundaries=small_area_boundaries
)
retrofit_selections = _retrofitselect(defaults)
inputs_are_submitted = st.form_submit_button(label="Submit")
if inputs_are_submitted:
pre_retrofit = io.load_selected_buildings(
url=config["urls"]["bers"],
data_dir=data_dir,
selected_energy_ratings=selected_energy_ratings,
selected_small_areas=selected_small_areas,
)
with st.spinner("Retrofitting buildings..."):
post_retrofit = retrofit.retrofit_buildings(
buildings=pre_retrofit, selections=retrofit_selections
)
pre_vs_post_bers = retrofit.calculate_ber_improvement(
pre_retrofit=pre_retrofit, post_retrofit=post_retrofit
)
pre_vs_post_hps = retrofit.calculate_heat_pump_viability_improvement(
pre_retrofit=pre_retrofit, post_retrofit=post_retrofit
)
plot.plot_ber_rating_comparison(pre_vs_post_bers)
plot.plot_heat_pump_viability_comparison(pre_vs_post_hps)
plot.plot_retrofit_costs(post_retrofit=post_retrofit)
def _retrofitselect(defaults: DeaSelection) -> DeaSelection:
selections = defaults.copy()
for component, properties in defaults.items():
with st.expander(label=f"Change {component} defaults"):
selections[component]["uvalue"]["target"] = st.number_input(
label="Threshold U-Value [W/m²K] - assume no retrofits below this value",
min_value=float(0),
value=properties["uvalue"]["target"],
key=component + "_threshold",
step=0.05,
)
c1, c2 = st.columns(2)
selections[component]["cost"]["lower"] = c1.number_input(
label="Lowest* Likely Cost [€/m²]",
min_value=0,
value=properties["cost"]["lower"],
key=component + "_cost_lower",
step=5,
)
selections[component]["cost"]["upper"] = c2.number_input(
label="Highest** Likely Cost [€/m²]",
min_value=0,
value=properties["cost"]["upper"],
key=component + "_cost_upper",
step=5,
)
footnote = f"""
<small> * {properties["typical_area"] * properties["cost"]["lower"]}€
for a typical {component} area of {properties["typical_area"]}m²<br>
** {properties["typical_area"] * properties["cost"]["upper"]}€
for a typical {component} area of {properties["typical_area"]}m²</small>
"""
st.markdown(footnote, unsafe_allow_html=True)
selections[component]["percentage_selected"] = st.slider(
f"""% of viable {component}s retrofitted to U-Value =
{selections[component]['uvalue']['target']} [W/m²K]""",
min_value=0.0,
max_value=1.0,
value=0.0,
key=component + "_percentage",
)
return selections
if __name__ == "__main__":
main()