honeybee-energy 1.116.106__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- honeybee_energy/__init__.py +24 -0
- honeybee_energy/__main__.py +4 -0
- honeybee_energy/_extend_honeybee.py +145 -0
- honeybee_energy/altnumber.py +21 -0
- honeybee_energy/baseline/__init__.py +2 -0
- honeybee_energy/baseline/create.py +608 -0
- honeybee_energy/baseline/data/__init__.py +1 -0
- honeybee_energy/baseline/data/constructions.csv +64 -0
- honeybee_energy/baseline/data/fen_ratios.csv +15 -0
- honeybee_energy/baseline/data/lpd_building.csv +21 -0
- honeybee_energy/baseline/data/pci_2016.csv +22 -0
- honeybee_energy/baseline/data/pci_2019.csv +22 -0
- honeybee_energy/baseline/data/pci_2022.csv +22 -0
- honeybee_energy/baseline/data/shw.csv +21 -0
- honeybee_energy/baseline/pci.py +512 -0
- honeybee_energy/baseline/result.py +371 -0
- honeybee_energy/boundarycondition.py +128 -0
- honeybee_energy/cli/__init__.py +69 -0
- honeybee_energy/cli/baseline.py +475 -0
- honeybee_energy/cli/edit.py +327 -0
- honeybee_energy/cli/lib.py +1154 -0
- honeybee_energy/cli/result.py +810 -0
- honeybee_energy/cli/setconfig.py +124 -0
- honeybee_energy/cli/settings.py +569 -0
- honeybee_energy/cli/simulate.py +380 -0
- honeybee_energy/cli/translate.py +1714 -0
- honeybee_energy/cli/validate.py +224 -0
- honeybee_energy/config.json +11 -0
- honeybee_energy/config.py +842 -0
- honeybee_energy/construction/__init__.py +1 -0
- honeybee_energy/construction/_base.py +374 -0
- honeybee_energy/construction/air.py +325 -0
- honeybee_energy/construction/dictutil.py +89 -0
- honeybee_energy/construction/dynamic.py +607 -0
- honeybee_energy/construction/opaque.py +460 -0
- honeybee_energy/construction/shade.py +319 -0
- honeybee_energy/construction/window.py +1096 -0
- honeybee_energy/construction/windowshade.py +847 -0
- honeybee_energy/constructionset.py +1655 -0
- honeybee_energy/dictutil.py +56 -0
- honeybee_energy/generator/__init__.py +5 -0
- honeybee_energy/generator/loadcenter.py +204 -0
- honeybee_energy/generator/pv.py +535 -0
- honeybee_energy/hvac/__init__.py +21 -0
- honeybee_energy/hvac/_base.py +124 -0
- honeybee_energy/hvac/_template.py +270 -0
- honeybee_energy/hvac/allair/__init__.py +22 -0
- honeybee_energy/hvac/allair/_base.py +349 -0
- honeybee_energy/hvac/allair/furnace.py +168 -0
- honeybee_energy/hvac/allair/psz.py +131 -0
- honeybee_energy/hvac/allair/ptac.py +163 -0
- honeybee_energy/hvac/allair/pvav.py +109 -0
- honeybee_energy/hvac/allair/vav.py +128 -0
- honeybee_energy/hvac/detailed.py +337 -0
- honeybee_energy/hvac/doas/__init__.py +28 -0
- honeybee_energy/hvac/doas/_base.py +345 -0
- honeybee_energy/hvac/doas/fcu.py +127 -0
- honeybee_energy/hvac/doas/radiant.py +329 -0
- honeybee_energy/hvac/doas/vrf.py +81 -0
- honeybee_energy/hvac/doas/wshp.py +91 -0
- honeybee_energy/hvac/heatcool/__init__.py +23 -0
- honeybee_energy/hvac/heatcool/_base.py +177 -0
- honeybee_energy/hvac/heatcool/baseboard.py +61 -0
- honeybee_energy/hvac/heatcool/evapcool.py +72 -0
- honeybee_energy/hvac/heatcool/fcu.py +92 -0
- honeybee_energy/hvac/heatcool/gasunit.py +53 -0
- honeybee_energy/hvac/heatcool/radiant.py +269 -0
- honeybee_energy/hvac/heatcool/residential.py +77 -0
- honeybee_energy/hvac/heatcool/vrf.py +54 -0
- honeybee_energy/hvac/heatcool/windowac.py +70 -0
- honeybee_energy/hvac/heatcool/wshp.py +62 -0
- honeybee_energy/hvac/idealair.py +699 -0
- honeybee_energy/internalmass.py +310 -0
- honeybee_energy/lib/__init__.py +1 -0
- honeybee_energy/lib/_loadconstructions.py +194 -0
- honeybee_energy/lib/_loadconstructionsets.py +117 -0
- honeybee_energy/lib/_loadmaterials.py +83 -0
- honeybee_energy/lib/_loadprogramtypes.py +125 -0
- honeybee_energy/lib/_loadschedules.py +87 -0
- honeybee_energy/lib/_loadtypelimits.py +64 -0
- honeybee_energy/lib/constructions.py +207 -0
- honeybee_energy/lib/constructionsets.py +95 -0
- honeybee_energy/lib/materials.py +67 -0
- honeybee_energy/lib/programtypes.py +125 -0
- honeybee_energy/lib/schedules.py +61 -0
- honeybee_energy/lib/scheduletypelimits.py +31 -0
- honeybee_energy/load/__init__.py +1 -0
- honeybee_energy/load/_base.py +190 -0
- honeybee_energy/load/daylight.py +397 -0
- honeybee_energy/load/dictutil.py +47 -0
- honeybee_energy/load/equipment.py +771 -0
- honeybee_energy/load/hotwater.py +543 -0
- honeybee_energy/load/infiltration.py +460 -0
- honeybee_energy/load/lighting.py +480 -0
- honeybee_energy/load/people.py +497 -0
- honeybee_energy/load/process.py +472 -0
- honeybee_energy/load/setpoint.py +816 -0
- honeybee_energy/load/ventilation.py +550 -0
- honeybee_energy/material/__init__.py +1 -0
- honeybee_energy/material/_base.py +166 -0
- honeybee_energy/material/dictutil.py +59 -0
- honeybee_energy/material/frame.py +367 -0
- honeybee_energy/material/gas.py +1087 -0
- honeybee_energy/material/glazing.py +854 -0
- honeybee_energy/material/opaque.py +1351 -0
- honeybee_energy/material/shade.py +1360 -0
- honeybee_energy/measure.py +472 -0
- honeybee_energy/programtype.py +723 -0
- honeybee_energy/properties/__init__.py +1 -0
- honeybee_energy/properties/aperture.py +333 -0
- honeybee_energy/properties/door.py +342 -0
- honeybee_energy/properties/extension.py +244 -0
- honeybee_energy/properties/face.py +274 -0
- honeybee_energy/properties/model.py +2640 -0
- honeybee_energy/properties/room.py +1747 -0
- honeybee_energy/properties/shade.py +314 -0
- honeybee_energy/properties/shademesh.py +262 -0
- honeybee_energy/reader.py +48 -0
- honeybee_energy/result/__init__.py +1 -0
- honeybee_energy/result/colorobj.py +648 -0
- honeybee_energy/result/emissions.py +290 -0
- honeybee_energy/result/err.py +101 -0
- honeybee_energy/result/eui.py +100 -0
- honeybee_energy/result/generation.py +160 -0
- honeybee_energy/result/loadbalance.py +890 -0
- honeybee_energy/result/match.py +202 -0
- honeybee_energy/result/osw.py +90 -0
- honeybee_energy/result/rdd.py +59 -0
- honeybee_energy/result/zsz.py +190 -0
- honeybee_energy/run.py +1577 -0
- honeybee_energy/schedule/__init__.py +1 -0
- honeybee_energy/schedule/day.py +626 -0
- honeybee_energy/schedule/dictutil.py +59 -0
- honeybee_energy/schedule/fixedinterval.py +1012 -0
- honeybee_energy/schedule/rule.py +619 -0
- honeybee_energy/schedule/ruleset.py +1867 -0
- honeybee_energy/schedule/typelimit.py +310 -0
- honeybee_energy/shw.py +315 -0
- honeybee_energy/simulation/__init__.py +1 -0
- honeybee_energy/simulation/control.py +214 -0
- honeybee_energy/simulation/daylightsaving.py +185 -0
- honeybee_energy/simulation/dictutil.py +51 -0
- honeybee_energy/simulation/output.py +646 -0
- honeybee_energy/simulation/parameter.py +606 -0
- honeybee_energy/simulation/runperiod.py +443 -0
- honeybee_energy/simulation/shadowcalculation.py +295 -0
- honeybee_energy/simulation/sizing.py +546 -0
- honeybee_energy/ventcool/__init__.py +5 -0
- honeybee_energy/ventcool/_crack_data.py +91 -0
- honeybee_energy/ventcool/afn.py +289 -0
- honeybee_energy/ventcool/control.py +269 -0
- honeybee_energy/ventcool/crack.py +126 -0
- honeybee_energy/ventcool/fan.py +493 -0
- honeybee_energy/ventcool/opening.py +365 -0
- honeybee_energy/ventcool/simulation.py +314 -0
- honeybee_energy/writer.py +1078 -0
- honeybee_energy-1.116.106.dist-info/METADATA +113 -0
- honeybee_energy-1.116.106.dist-info/RECORD +162 -0
- honeybee_energy-1.116.106.dist-info/WHEEL +5 -0
- honeybee_energy-1.116.106.dist-info/entry_points.txt +2 -0
- honeybee_energy-1.116.106.dist-info/licenses/LICENSE +661 -0
- honeybee_energy-1.116.106.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
NonResidential,1.0
|
|
2
|
+
Residential,0.7
|
|
3
|
+
MidriseApartment,0.7
|
|
4
|
+
HighriseApartment,0.7
|
|
5
|
+
LargeOffice,1.0
|
|
6
|
+
MediumOffice,1.0
|
|
7
|
+
SmallOffice,1.0
|
|
8
|
+
Retail,1.5
|
|
9
|
+
StripMall,1.5
|
|
10
|
+
PrimarySchool,1.2
|
|
11
|
+
SecondarySchool,1.2
|
|
12
|
+
SmallHotel,1.09
|
|
13
|
+
LargeHotel,1.09
|
|
14
|
+
Hospital,1.2
|
|
15
|
+
Outpatient,1.0
|
|
16
|
+
Warehouse,0.8
|
|
17
|
+
SuperMarket,1.5
|
|
18
|
+
FullServiceRestaurant,1.6
|
|
19
|
+
QuickServiceRestaurant,1.4
|
|
20
|
+
Laboratory,1.4
|
|
21
|
+
Courthouse,1.2
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
,0A,0B,1A,1B,2A,2B,3A,3B,3C,4A,4B,4C,5A,5B,5C,6A,6B,7,8
|
|
2
|
+
NonResidential,0.62,0.61,0.62,0.61,0.55,0.57,0.56,0.61,0.59,0.58,0.57,0.61,0.57,0.57,0.61,0.56,0.56,0.53,0.52
|
|
3
|
+
Residential,0.73,0.73,0.73,0.73,0.71,0.69,0.74,0.73,0.68,0.78,0.81,0.81,0.76,0.8,0.81,0.76,0.79,0.74,0.8
|
|
4
|
+
MidriseApartment,0.73,0.73,0.73,0.73,0.71,0.69,0.74,0.73,0.68,0.78,0.81,0.81,0.76,0.8,0.81,0.76,0.79,0.74,0.8
|
|
5
|
+
HighriseApartment,0.73,0.73,0.73,0.73,0.71,0.69,0.74,0.73,0.68,0.78,0.81,0.81,0.76,0.8,0.81,0.76,0.79,0.74,0.8
|
|
6
|
+
LargeOffice,0.58,0.62,0.58,0.62,0.57,0.62,0.6,0.64,0.54,0.58,0.6,0.58,0.6,0.61,0.58,0.61,0.61,0.57,0.61
|
|
7
|
+
MediumOffice,0.58,0.62,0.58,0.62,0.57,0.62,0.6,0.64,0.54,0.58,0.6,0.58,0.6,0.61,0.58,0.61,0.61,0.57,0.61
|
|
8
|
+
SmallOffice,0.58,0.62,0.58,0.62,0.57,0.62,0.6,0.64,0.54,0.58,0.6,0.58,0.6,0.61,0.58,0.61,0.61,0.57,0.61
|
|
9
|
+
Retail,0.52,0.58,0.52,0.58,0.53,0.58,0.54,0.62,0.6,0.55,0.6,0.6,0.55,0.59,0.61,0.55,0.58,0.53,0.53
|
|
10
|
+
StripMall,0.52,0.58,0.52,0.58,0.53,0.58,0.54,0.62,0.6,0.55,0.6,0.6,0.55,0.59,0.61,0.55,0.58,0.53,0.53
|
|
11
|
+
PrimarySchool,0.46,0.53,0.46,0.53,0.47,0.53,0.49,0.52,0.5,0.49,0.5,0.49,0.5,0.5,0.5,0.49,0.5,0.47,0.51
|
|
12
|
+
SecondarySchool,0.46,0.53,0.46,0.53,0.47,0.53,0.49,0.52,0.5,0.49,0.5,0.49,0.5,0.5,0.5,0.49,0.5,0.47,0.51
|
|
13
|
+
SmallHotel,0.64,0.65,0.64,0.65,0.62,0.6,0.63,0.65,0.64,0.62,0.64,0.62,0.6,0.61,0.6,0.59,0.61,0.57,0.58
|
|
14
|
+
LargeHotel,0.64,0.65,0.64,0.65,0.62,0.6,0.63,0.65,0.64,0.62,0.64,0.62,0.6,0.61,0.6,0.59,0.61,0.57,0.58
|
|
15
|
+
Hospital,0.64,0.56,0.64,0.56,0.6,0.56,0.6,0.56,0.54,0.57,0.53,0.55,0.59,0.52,0.55,0.57,0.52,0.56,0.56
|
|
16
|
+
Outpatient,0.64,0.56,0.64,0.56,0.6,0.56,0.6,0.56,0.54,0.57,0.53,0.55,0.59,0.52,0.55,0.57,0.52,0.56,0.56
|
|
17
|
+
Warehouse,0.51,0.52,0.51,0.52,0.56,0.58,0.57,0.59,0.63,0.58,0.6,0.63,0.6,0.61,0.65,0.66,0.66,0.67,0.67
|
|
18
|
+
SuperMarket,0.62,0.61,0.62,0.61,0.55,0.57,0.56,0.61,0.59,0.58,0.57,0.61,0.57,0.57,0.61,0.56,0.56,0.53,0.52
|
|
19
|
+
FullServiceRestaurant,0.62,0.62,0.62,0.62,0.58,0.61,0.6,0.6,0.61,0.58,0.55,0.6,0.62,0.58,0.6,0.63,0.6,0.65,0.68
|
|
20
|
+
QuickServiceRestaurant,0.62,0.62,0.62,0.62,0.58,0.61,0.6,0.6,0.61,0.58,0.55,0.6,0.62,0.58,0.6,0.63,0.6,0.65,0.68
|
|
21
|
+
Laboratory,0.62,0.61,0.62,0.61,0.55,0.57,0.56,0.61,0.59,0.58,0.57,0.61,0.57,0.57,0.61,0.56,0.56,0.53,0.52
|
|
22
|
+
Courthouse,0.62,0.61,0.62,0.61,0.55,0.57,0.56,0.61,0.59,0.58,0.57,0.61,0.57,0.57,0.61,0.56,0.56,0.53,0.52
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
,0A,0B,1A,1B,2A,2B,3A,3B,3C,4A,4B,4C,5A,5B,5C,6A,6B,7,8
|
|
2
|
+
NonResidential,0.56,0.57,0.56,0.57,0.5,0.52,0.5,0.54,0.53,0.53,0.52,0.54,0.51,0.51,0.5,0.5,0.5,0.5,0.46
|
|
3
|
+
Residential,0.68,0.7,0.68,0.7,0.66,0.66,0.69,0.68,0.59,0.74,0.76,0.74,0.7,0.73,0.75,0.68,0.71,0.68,0.72
|
|
4
|
+
MidriseApartment,0.68,0.7,0.68,0.7,0.66,0.66,0.69,0.68,0.59,0.74,0.76,0.74,0.7,0.73,0.75,0.68,0.71,0.68,0.72
|
|
5
|
+
HighriseApartment,0.68,0.7,0.68,0.7,0.66,0.66,0.69,0.68,0.59,0.74,0.76,0.74,0.7,0.73,0.75,0.68,0.71,0.68,0.72
|
|
6
|
+
LargeOffice,0.52,0.57,0.52,0.57,0.5,0.56,0.53,0.56,0.48,0.51,0.52,0.49,0.51,0.51,0.49,0.52,0.51,0.49,0.51
|
|
7
|
+
MediumOffice,0.52,0.57,0.52,0.57,0.5,0.56,0.53,0.56,0.48,0.51,0.52,0.49,0.51,0.51,0.49,0.52,0.51,0.49,0.51
|
|
8
|
+
SmallOffice,0.52,0.57,0.52,0.57,0.5,0.56,0.53,0.56,0.48,0.51,0.52,0.49,0.51,0.51,0.49,0.52,0.51,0.49,0.51
|
|
9
|
+
Retail,0.51,0.54,0.51,0.54,0.49,0.55,0.51,0.55,0.53,0.51,0.55,0.54,0.5,0.54,0.55,0.5,0.51,0.48,0.5
|
|
10
|
+
StripMall,0.51,0.54,0.51,0.54,0.49,0.55,0.51,0.55,0.53,0.51,0.55,0.54,0.5,0.54,0.55,0.5,0.51,0.48,0.5
|
|
11
|
+
PrimarySchool,0.39,0.47,0.39,0.47,0.38,0.43,0.38,0.42,0.4,0.37,0.4,0.38,0.36,0.4,0.36,0.36,0.37,0.36,0.37
|
|
12
|
+
SecondarySchool,0.39,0.47,0.39,0.47,0.38,0.43,0.38,0.42,0.4,0.37,0.4,0.38,0.36,0.4,0.36,0.36,0.37,0.36,0.37
|
|
13
|
+
SmallHotel,0.55,0.53,0.55,0.53,0.53,0.52,0.53,0.54,0.54,0.53,0.53,0.52,0.5,0.51,0.51,0.5,0.51,0.5,0.5
|
|
14
|
+
LargeHotel,0.55,0.53,0.55,0.53,0.53,0.52,0.53,0.54,0.54,0.53,0.53,0.52,0.5,0.51,0.51,0.5,0.51,0.5,0.5
|
|
15
|
+
Hospital,0.6,0.6,0.6,0.6,0.58,0.54,0.56,0.55,0.55,0.55,0.54,0.54,0.57,0.52,0.54,0.57,0.52,0.57,0.57
|
|
16
|
+
Outpatient,0.6,0.6,0.6,0.6,0.58,0.54,0.56,0.55,0.55,0.55,0.54,0.54,0.57,0.52,0.54,0.57,0.52,0.57,0.57
|
|
17
|
+
Warehouse,0.38,0.42,0.38,0.42,0.4,0.42,0.43,0.44,0.43,0.44,0.43,0.46,0.49,0.47,0.48,0.54,0.51,0.57,0.57
|
|
18
|
+
SuperMarket,0.56,0.57,0.56,0.57,0.5,0.52,0.5,0.54,0.53,0.53,0.52,0.54,0.51,0.51,0.5,0.5,0.5,0.5,0.46
|
|
19
|
+
FullServiceRestaurant,0.63,0.64,0.63,0.64,0.6,0.6,0.6,0.61,0.58,0.62,0.57,0.61,0.63,0.6,0.64,0.65,0.62,0.67,0.7
|
|
20
|
+
QuickServiceRestaurant,0.63,0.64,0.63,0.64,0.6,0.6,0.6,0.61,0.58,0.62,0.57,0.61,0.63,0.6,0.64,0.65,0.62,0.67,0.7
|
|
21
|
+
Laboratory,0.56,0.57,0.56,0.57,0.5,0.52,0.5,0.54,0.53,0.53,0.52,0.54,0.51,0.51,0.5,0.5,0.5,0.5,0.46
|
|
22
|
+
Courthouse,0.56,0.57,0.56,0.57,0.5,0.52,0.5,0.54,0.53,0.53,0.52,0.54,0.51,0.51,0.5,0.5,0.5,0.5,0.46
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
,0A,0B,1A,1B,2A,2B,3A,3B,3C,4A,4B,4C,5A,5B,5C,6A,6B,7,8
|
|
2
|
+
NonResidential,0.62,0.6,0.62,0.59,0.55,0.51,0.53,0.52,0.55,0.53,0.52,0.55,0.53,0.53,0.56,0.54,0.54,0.54,0.54
|
|
3
|
+
Residential,0.69,0.68,0.71,0.7,0.72,0.72,0.71,0.76,0.63,0.69,0.76,0.71,0.66,0.72,0.71,0.65,0.67,0.65,0.67
|
|
4
|
+
MidriseApartment,0.69,0.68,0.71,0.7,0.72,0.72,0.71,0.76,0.63,0.69,0.76,0.71,0.66,0.72,0.71,0.65,0.67,0.65,0.67
|
|
5
|
+
HighriseApartment,0.69,0.68,0.71,0.7,0.72,0.72,0.71,0.76,0.63,0.69,0.76,0.71,0.66,0.72,0.71,0.65,0.67,0.65,0.67
|
|
6
|
+
LargeOffice,0.54,0.54,0.53,0.52,0.52,0.52,0.5,0.54,0.48,0.48,0.53,0.48,0.49,0.52,0.48,0.48,0.49,0.46,0.48
|
|
7
|
+
MediumOffice,0.54,0.54,0.53,0.52,0.52,0.52,0.5,0.54,0.48,0.48,0.53,0.48,0.49,0.52,0.48,0.48,0.49,0.46,0.48
|
|
8
|
+
SmallOffice,0.54,0.54,0.53,0.52,0.52,0.52,0.5,0.54,0.48,0.48,0.53,0.48,0.49,0.52,0.48,0.48,0.49,0.46,0.48
|
|
9
|
+
Retail,0.51,0.49,0.48,0.48,0.44,0.43,0.43,0.43,0.44,0.42,0.43,0.46,0.43,0.42,0.47,0.43,0.43,0.41,0.44
|
|
10
|
+
StripMall,0.51,0.49,0.48,0.48,0.44,0.43,0.43,0.43,0.44,0.42,0.43,0.46,0.43,0.42,0.47,0.43,0.43,0.41,0.44
|
|
11
|
+
PrimarySchool,0.52,0.57,0.57,0.56,0.52,0.53,0.52,0.49,0.5,0.46,0.47,0.47,0.47,0.46,0.46,0.46,0.44,0.45,0.45
|
|
12
|
+
SecondarySchool,0.52,0.57,0.57,0.56,0.52,0.53,0.52,0.49,0.5,0.46,0.47,0.47,0.47,0.46,0.46,0.46,0.44,0.45,0.45
|
|
13
|
+
SmallHotel,0.66,0.66,0.69,0.65,0.65,0.64,0.64,0.65,0.65,0.63,0.65,0.63,0.62,0.63,0.62,0.61,0.62,0.59,0.58
|
|
14
|
+
LargeHotel,0.66,0.66,0.69,0.65,0.65,0.64,0.64,0.65,0.65,0.63,0.65,0.63,0.62,0.63,0.62,0.61,0.62,0.59,0.58
|
|
15
|
+
Hospital,0.69,0.69,0.7,0.68,0.67,0.65,0.65,0.66,0.64,0.64,0.66,0.63,0.67,0.65,0.65,0.66,0.67,0.68,0.7
|
|
16
|
+
Outpatient,0.69,0.69,0.7,0.68,0.67,0.65,0.65,0.66,0.64,0.64,0.66,0.63,0.67,0.65,0.65,0.66,0.67,0.68,0.7
|
|
17
|
+
Warehouse,0.26,0.26,0.22,0.25,0.21,0.22,0.25,0.21,0.19,0.25,0.22,0.22,0.28,0.24,0.22,0.31,0.28,0.29,0.32
|
|
18
|
+
SuperMarket,0.62,0.6,0.62,0.59,0.55,0.51,0.53,0.52,0.55,0.53,0.52,0.55,0.53,0.53,0.56,0.54,0.54,0.54,0.54
|
|
19
|
+
FullServiceRestaurant,0.62,0.59,0.57,0.57,0.57,0.53,0.57,0.53,0.51,0.55,0.54,0.54,0.57,0.56,0.55,0.59,0.58,0.61,0.64
|
|
20
|
+
QuickServiceRestaurant,0.62,0.59,0.57,0.57,0.57,0.53,0.57,0.53,0.51,0.55,0.54,0.54,0.57,0.56,0.55,0.59,0.58,0.61,0.64
|
|
21
|
+
Laboratory,0.62,0.6,0.62,0.59,0.55,0.51,0.53,0.52,0.55,0.53,0.52,0.55,0.53,0.53,0.56,0.54,0.54,0.54,0.54
|
|
22
|
+
Courthouse,0.62,0.6,0.62,0.59,0.55,0.51,0.53,0.52,0.55,0.53,0.52,0.55,0.53,0.53,0.56,0.54,0.54,0.54,0.54
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
NonResidential,Electric
|
|
2
|
+
Residential,Gas
|
|
3
|
+
MidriseApartment,Gas
|
|
4
|
+
HighriseApartment,Gas
|
|
5
|
+
LargeOffice,Electric
|
|
6
|
+
MediumOffice,Electric
|
|
7
|
+
SmallOffice,Electric
|
|
8
|
+
Retail,Electric
|
|
9
|
+
StripMall,Electric
|
|
10
|
+
PrimarySchool,Gas
|
|
11
|
+
SecondarySchool,Gas
|
|
12
|
+
SmallHotel,Gas
|
|
13
|
+
LargeHotel,Gas
|
|
14
|
+
Hospital,Gas
|
|
15
|
+
Outpatient,Electric
|
|
16
|
+
Warehouse,Electric
|
|
17
|
+
SuperMarket,Electric
|
|
18
|
+
FullServiceRestaurant,Gas
|
|
19
|
+
QuickServiceRestaurant,Gas
|
|
20
|
+
Laboratory,Gas
|
|
21
|
+
Courthouse,Electric
|
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
"""Module for computing Performance Cost Index (PCI) from baseline simulation results."""
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from ladybug.sql import SQLiteResult
|
|
5
|
+
from ladybug.futil import csv_to_matrix
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
UNREGULATED_USES = ('Interior Equipment', 'Exterior Equipment', 'Generators')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def comparison_from_sql(
|
|
12
|
+
proposed_sql, baseline_sqls, climate_zone, building_type='NonResidential',
|
|
13
|
+
electricity_cost=0.12, natural_gas_cost=0.06, district_cooling_cost=0.04,
|
|
14
|
+
district_heating_cost=0.08, electricity_emissions=400):
|
|
15
|
+
"""Get a dictionary comparing baseline and proposed simulations from EnergyPlus SQLs.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
proposed_sql: The path of the SQL result file that has been generated from an
|
|
19
|
+
energy simulation of a proposed building.
|
|
20
|
+
baseline_sqls: The path of the SQL result file that has been generated from an
|
|
21
|
+
energy simulation of a baseline building. This can also be a list of SQL
|
|
22
|
+
result files (eg. for several simulations of different orientations)
|
|
23
|
+
in which case the PCI will be computed as the average across all files.
|
|
24
|
+
Lastly, it can be a directory or list of directories containing results,
|
|
25
|
+
in which case, the target PCI will be calculated form all files
|
|
26
|
+
ending in .sql.
|
|
27
|
+
climate_zone: Text indicating the ASHRAE climate zone. This can be a single
|
|
28
|
+
integer (in which case it is interpreted as A) or it can include the
|
|
29
|
+
A, B, or C qualifier (eg. 3C).
|
|
30
|
+
building_type: Text for the building type that the Model represents. This is
|
|
31
|
+
used to determine the baseline window-to-wall ratio and HVAC system. If
|
|
32
|
+
the type is not recognized or is "Unknown", it will be assumed that the
|
|
33
|
+
building is a generic NonResidential. The following have specified
|
|
34
|
+
meaning per the standard.
|
|
35
|
+
|
|
36
|
+
* NonResidential
|
|
37
|
+
* Residential
|
|
38
|
+
* MidriseApartment
|
|
39
|
+
* HighriseApartment
|
|
40
|
+
* LargeOffice
|
|
41
|
+
* MediumOffice
|
|
42
|
+
* SmallOffice
|
|
43
|
+
* Retail
|
|
44
|
+
* StripMall
|
|
45
|
+
* PrimarySchool
|
|
46
|
+
* SecondarySchool
|
|
47
|
+
* SmallHotel
|
|
48
|
+
* LargeHotel
|
|
49
|
+
* Hospital
|
|
50
|
+
* Outpatient
|
|
51
|
+
* Warehouse
|
|
52
|
+
* SuperMarket
|
|
53
|
+
* FullServiceRestaurant
|
|
54
|
+
* QuickServiceRestaurant
|
|
55
|
+
* Laboratory
|
|
56
|
+
* Courthouse
|
|
57
|
+
|
|
58
|
+
electricity_cost: A number for the cost per each kWh of electricity. This
|
|
59
|
+
can be in any currency as long as it is coordinated with the costs of
|
|
60
|
+
other inputs to this method. (Default: 0.12 for the average 2020
|
|
61
|
+
cost of electricity in the US in $/kWh).
|
|
62
|
+
natural_gas_cost: A number for the cost per each kWh of natural gas. This
|
|
63
|
+
can be in any currency as long as it is coordinated with the
|
|
64
|
+
other inputs to this method. (Default: 0.06 for the average 2020
|
|
65
|
+
cost of natural gas in the US in $/kWh).
|
|
66
|
+
district_cooling_cost: A number for the cost per each kWh of district cooling
|
|
67
|
+
energy. This can be in any currency as long as it is coordinated with the
|
|
68
|
+
other inputs to this method. (Default: 0.04 assuming average 2020 US
|
|
69
|
+
cost of electricity in $/kWh with a COP 3.5 chiller).
|
|
70
|
+
district_heating_cost: A number for the cost per each kWh of district heating
|
|
71
|
+
energy. This can be in any currency as long as it is coordinated with the
|
|
72
|
+
other inputs to this method. (Default: 0.08 assuming average 2020 US
|
|
73
|
+
cost of natural gas in $/kWh with an efficiency of 0.75 with all burner
|
|
74
|
+
and distribution losses).
|
|
75
|
+
electricity_emissions: A number for the electric grid carbon emissions
|
|
76
|
+
in kg CO2 per MWh. For locations in the USA, this can be obtained from
|
|
77
|
+
he honeybee_energy.result.emissions future_electricity_emissions method.
|
|
78
|
+
For locations outside of the USA where specific data is unavailable,
|
|
79
|
+
the following rules of thumb may be used as a guide. (Default: 400).
|
|
80
|
+
|
|
81
|
+
* 800 kg/MWh - for an inefficient coal or oil-dominated grid
|
|
82
|
+
* 400 kg/MWh - for the US (energy mixed) grid around 2020
|
|
83
|
+
* 100-200 kg/MWh - for grids with majority renewable/nuclear composition
|
|
84
|
+
* 0-100 kg/MWh - for grids with renewables and storage
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
A dictionary with several keys.
|
|
88
|
+
|
|
89
|
+
- proposed_eui -- A number for the proposed end use intensity. Specifically,
|
|
90
|
+
this is the sum of all electricity, fuel, district heating/cooling,
|
|
91
|
+
etc. divided by the gross floor area (including both conditioned
|
|
92
|
+
and unconditioned spaces). Units are kWh/m2.
|
|
93
|
+
|
|
94
|
+
- proposed_energy -- A number for the total energy use of the proposed
|
|
95
|
+
building in kWh.
|
|
96
|
+
|
|
97
|
+
- proposed_cost -- A number for the total annual energy cost of the
|
|
98
|
+
proposed building.
|
|
99
|
+
|
|
100
|
+
- proposed_carbon -- A number for the total annual operational carbon
|
|
101
|
+
emissions of the proposed building in kg of C02.
|
|
102
|
+
|
|
103
|
+
- baseline_eui -- A number for the baseline end use intensity. Specifically,
|
|
104
|
+
this is the sum of all electricity, fuel, district heating/cooling,
|
|
105
|
+
etc. divided by the gross floor area (including both conditioned
|
|
106
|
+
and unconditioned spaces). Units are kWh/m2.
|
|
107
|
+
|
|
108
|
+
- baseline_energy -- A number for the total energy use of the baseline
|
|
109
|
+
building in kWh.
|
|
110
|
+
|
|
111
|
+
- baseline_cost -- A number for the total annual energy cost of the
|
|
112
|
+
baseline building.
|
|
113
|
+
|
|
114
|
+
- baseline_carbon -- A number for the total annual operational carbon
|
|
115
|
+
emissions of the baseline building in kg of C02.
|
|
116
|
+
|
|
117
|
+
- pci_t_2016 -- A fractional number for the target PCI for ASHRAE 90.1-2016.
|
|
118
|
+
|
|
119
|
+
- pci_t_2019 -- A fractional number for the target PCI for ASHRAE 90.1-2019.
|
|
120
|
+
|
|
121
|
+
- pci_t_2022 -- A fractional number for the target PCI for ASHRAE 90.1-2022.
|
|
122
|
+
|
|
123
|
+
- pci -- A fractional number for the PCI of the proposed building.
|
|
124
|
+
|
|
125
|
+
- pci_improvement_2016 -- A number less than 100 for the percentage better
|
|
126
|
+
that the proposed building is over the target PCI for ASHRAE 90.1-2016.
|
|
127
|
+
Negative numbers indicate a proposed building that is worse than
|
|
128
|
+
the 2016 target PCI.
|
|
129
|
+
|
|
130
|
+
- pci_improvement_2019 -- A number less than 100 for the percentage better
|
|
131
|
+
that the proposed building is over the target PCI for ASHRAE 90.1-2019.
|
|
132
|
+
Negative numbers indicate a proposed building that is worse than
|
|
133
|
+
the 2019 target PCI.
|
|
134
|
+
|
|
135
|
+
- pci_improvement_2022 -- A number less than 100 for the percentage better
|
|
136
|
+
that the proposed building is over the target PCI for ASHRAE 90.1-2022.
|
|
137
|
+
Negative numbers indicate a proposed building that is worse than
|
|
138
|
+
the 2022 target PCI.
|
|
139
|
+
|
|
140
|
+
- carbon_t_2016 -- A fractional number for the target carbon index
|
|
141
|
+
for ASHRAE 90.1-2016.
|
|
142
|
+
|
|
143
|
+
- carbon_t_2019 -- A fractional number for the target carbon index
|
|
144
|
+
for ASHRAE 90.1-2019.
|
|
145
|
+
|
|
146
|
+
- carbon_t_2022 -- A fractional number for the target carbon index
|
|
147
|
+
for ASHRAE 90.1-2022.
|
|
148
|
+
|
|
149
|
+
- pci_carbon -- A fractional number for the performance improvement
|
|
150
|
+
of the proposed building in terms of carbon emissions.
|
|
151
|
+
|
|
152
|
+
- carbon_improvement_2016 -- A number less than 100 for the percentage better
|
|
153
|
+
that the proposed building is over the target carbon for ASHRAE 90.1-2016.
|
|
154
|
+
Negative numbers indicate a proposed building that is worse than
|
|
155
|
+
the 2016 target.
|
|
156
|
+
|
|
157
|
+
- carbon_improvement_2019 -- A number less than 100 for the percentage better
|
|
158
|
+
that the proposed building is over the target carbon for ASHRAE 90.1-2019.
|
|
159
|
+
Negative numbers indicate a proposed building that is worse than
|
|
160
|
+
the 2019 target.
|
|
161
|
+
|
|
162
|
+
- carbon_improvement_2022 -- A number less than 100 for the percentage better
|
|
163
|
+
that the proposed building is over the target carbon for ASHRAE 90.1-2022.
|
|
164
|
+
Negative numbers indicate a proposed building that is worse than
|
|
165
|
+
the 2022 target.
|
|
166
|
+
"""
|
|
167
|
+
# compute the target PCI from the baseline simulations
|
|
168
|
+
base_dict = pci_target_from_baseline_sql(
|
|
169
|
+
baseline_sqls, climate_zone, building_type,
|
|
170
|
+
electricity_cost, natural_gas_cost, district_cooling_cost, district_heating_cost,
|
|
171
|
+
electricity_emissions)
|
|
172
|
+
# compute the energy cost of the proposed building
|
|
173
|
+
result_dict = energy_cost_from_proposed_sql(
|
|
174
|
+
proposed_sql, electricity_cost, natural_gas_cost,
|
|
175
|
+
district_cooling_cost, district_heating_cost, electricity_emissions)
|
|
176
|
+
result_dict.update(base_dict)
|
|
177
|
+
# compute the improvement indices for energy cost
|
|
178
|
+
pci = result_dict['proposed_cost'] / result_dict['baseline_cost']
|
|
179
|
+
t_2016 = result_dict['pci_t_2016']
|
|
180
|
+
t_2019 = result_dict['pci_t_2019']
|
|
181
|
+
t_2022 = result_dict['pci_t_2022']
|
|
182
|
+
result_dict['pci'] = round(pci, 3)
|
|
183
|
+
result_dict['pci_improvement_2016'] = round(((t_2016 - pci) / t_2016) * 100, 3)
|
|
184
|
+
result_dict['pci_improvement_2019'] = round(((t_2019 - pci) / t_2019) * 100, 3)
|
|
185
|
+
result_dict['pci_improvement_2022'] = round(((t_2022 - pci) / t_2022) * 100, 3)
|
|
186
|
+
# compute the improvement indices for energy cost
|
|
187
|
+
pci_c = result_dict['proposed_carbon'] / result_dict['baseline_carbon']
|
|
188
|
+
tc_2016 = result_dict['carbon_t_2016']
|
|
189
|
+
tc_2019 = result_dict['carbon_t_2019']
|
|
190
|
+
tc_2022 = result_dict['carbon_t_2022']
|
|
191
|
+
result_dict['pci_carbon'] = pci_c
|
|
192
|
+
result_dict['carbon_improvement_2016'] = \
|
|
193
|
+
round(((tc_2016 - pci_c) / tc_2016) * 100, 3)
|
|
194
|
+
result_dict['carbon_improvement_2019'] = \
|
|
195
|
+
round(((tc_2019 - pci_c) / tc_2019) * 100, 3)
|
|
196
|
+
result_dict['carbon_improvement_2022'] = \
|
|
197
|
+
round(((tc_2022 - pci_c) / tc_2022) * 100, 3)
|
|
198
|
+
return result_dict
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def pci_target_from_baseline_sql(
|
|
202
|
+
sql_results, climate_zone, building_type='NonResidential',
|
|
203
|
+
electricity_cost=0.12, natural_gas_cost=0.06,
|
|
204
|
+
district_cooling_cost=0.04, district_heating_cost=0.08,
|
|
205
|
+
electricity_emissions=400):
|
|
206
|
+
"""Get a dictionary of target Performance Cost Indices from EnergyPlus SQLs.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
sql_results: The path of the SQL result file that has been generated from an
|
|
210
|
+
energy simulation of a baseline building. This can also be a list of SQL
|
|
211
|
+
result files (eg. for several simulations of different orientations)
|
|
212
|
+
in which case the PCI will be computed as the average across all files.
|
|
213
|
+
Lastly, it can be a directory or list of directories containing results,
|
|
214
|
+
in which case, the target PCI will be calculated form all files
|
|
215
|
+
ending in .sql.
|
|
216
|
+
climate_zone: Text indicating the ASHRAE climate zone. This can be a single
|
|
217
|
+
integer (in which case it is interpreted as A) or it can include the
|
|
218
|
+
A, B, or C qualifier (eg. 3C).
|
|
219
|
+
building_type: Text for the building type that the Model represents. This is
|
|
220
|
+
used to determine the baseline window-to-wall ratio and HVAC system. If
|
|
221
|
+
the type is not recognized or is "Unknown", it will be assumed that the
|
|
222
|
+
building is a generic NonResidential. The following have specified
|
|
223
|
+
meaning per the standard.
|
|
224
|
+
|
|
225
|
+
* NonResidential
|
|
226
|
+
* Residential
|
|
227
|
+
* MidriseApartment
|
|
228
|
+
* HighriseApartment
|
|
229
|
+
* LargeOffice
|
|
230
|
+
* MediumOffice
|
|
231
|
+
* SmallOffice
|
|
232
|
+
* Retail
|
|
233
|
+
* StripMall
|
|
234
|
+
* PrimarySchool
|
|
235
|
+
* SecondarySchool
|
|
236
|
+
* SmallHotel
|
|
237
|
+
* LargeHotel
|
|
238
|
+
* Hospital
|
|
239
|
+
* Outpatient
|
|
240
|
+
* Warehouse
|
|
241
|
+
* SuperMarket
|
|
242
|
+
* FullServiceRestaurant
|
|
243
|
+
* QuickServiceRestaurant
|
|
244
|
+
* Laboratory
|
|
245
|
+
* Courthouse
|
|
246
|
+
|
|
247
|
+
electricity_cost: A number for the cost per each kWh of electricity. This
|
|
248
|
+
can be in any currency as long as it is coordinated with the costs of
|
|
249
|
+
other inputs to this method. (Default: 0.12 for the average 2020
|
|
250
|
+
cost of electricity in the US in $/kWh).
|
|
251
|
+
natural_gas_cost: A number for the cost per each kWh of natural gas. This
|
|
252
|
+
can be in any currency as long as it is coordinated with the
|
|
253
|
+
other inputs to this method. (Default: 0.06 for the average 2020
|
|
254
|
+
cost of natural gas in the US in $/kWh).
|
|
255
|
+
district_cooling_cost: A number for the cost per each kWh of district cooling
|
|
256
|
+
energy. This can be in any currency as long as it is coordinated with the
|
|
257
|
+
other inputs to this method. (Default: 0.04 assuming average 2020 US
|
|
258
|
+
cost of electricity in $/kWh with a COP 3.5 chiller).
|
|
259
|
+
district_heating_cost: A number for the cost per each kWh of district heating
|
|
260
|
+
energy. This can be in any currency as long as it is coordinated with the
|
|
261
|
+
other inputs to this method. (Default: 0.08 assuming average 2020 US
|
|
262
|
+
cost of natural gas in $/kWh with an efficiency of 0.75 with all burner
|
|
263
|
+
and distribution losses).
|
|
264
|
+
electricity_emissions: A number for the electric grid carbon emissions
|
|
265
|
+
in kg CO2 per MWh. For locations in the USA, this can be obtained from
|
|
266
|
+
he honeybee_energy.result.emissions future_electricity_emissions method.
|
|
267
|
+
For locations outside of the USA where specific data is unavailable,
|
|
268
|
+
the following rules of thumb may be used as a guide. (Default: 400).
|
|
269
|
+
|
|
270
|
+
* 800 kg/MWh - for an inefficient coal or oil-dominated grid
|
|
271
|
+
* 400 kg/MWh - for the US (energy mixed) grid around 2020
|
|
272
|
+
* 100-200 kg/MWh - for grids with majority renewable/nuclear composition
|
|
273
|
+
* 0-100 kg/MWh - for grids with renewables and storage
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
A dictionary with several keys.
|
|
277
|
+
|
|
278
|
+
- baseline_eui -- A number for the total end use intensity. Specifically,
|
|
279
|
+
this is the sum of all electricity, fuel, district heating/cooling,
|
|
280
|
+
etc. divided by the gross floor area (including both conditioned
|
|
281
|
+
and unconditioned spaces). Units are kWh/m2.
|
|
282
|
+
|
|
283
|
+
- baseline_energy -- A number for the total energy use of the baseline
|
|
284
|
+
building in kWh.
|
|
285
|
+
|
|
286
|
+
- baseline_cost -- A number for the total annual energy cost of the
|
|
287
|
+
baseline building.
|
|
288
|
+
|
|
289
|
+
- baseline_carbon -- A number for the total annual operational carbon
|
|
290
|
+
emissions of the baseline building in kg of C02.
|
|
291
|
+
|
|
292
|
+
- pci_t_2016 -- A fractional number for the target PCI for ASHRAE 90.1-2016.
|
|
293
|
+
|
|
294
|
+
- pci_t_2019 -- A fractional number for the target PCI for ASHRAE 90.1-2019.
|
|
295
|
+
|
|
296
|
+
- pci_t_2022 -- A fractional number for the target PCI for ASHRAE 90.1-2022.
|
|
297
|
+
|
|
298
|
+
- carbon_t_2016 -- A fractional number for the target carbon index
|
|
299
|
+
for ASHRAE 90.1-2016.
|
|
300
|
+
|
|
301
|
+
- carbon_t_2019 -- A fractional number for the target carbon index
|
|
302
|
+
for ASHRAE 90.1-2019.
|
|
303
|
+
|
|
304
|
+
- carbon_t_2022 -- A fractional number for the target carbon index
|
|
305
|
+
for ASHRAE 90.1-2022.
|
|
306
|
+
"""
|
|
307
|
+
# create a list of sql file path that were either passed directly or are
|
|
308
|
+
# contained within passed folders
|
|
309
|
+
if not isinstance(sql_results, (list, tuple)):
|
|
310
|
+
sql_results = [sql_results]
|
|
311
|
+
sql_paths = []
|
|
312
|
+
for file_or_folder_path in sql_results:
|
|
313
|
+
if os.path.isdir(file_or_folder_path):
|
|
314
|
+
for file_path in os.listdir(file_or_folder_path):
|
|
315
|
+
if file_path.endswith('.sql'):
|
|
316
|
+
sql_paths.append(os.path.join(file_or_folder_path, file_path))
|
|
317
|
+
else:
|
|
318
|
+
sql_paths.append(file_or_folder_path)
|
|
319
|
+
|
|
320
|
+
# parse the regulated and unregulated energy use from the sql
|
|
321
|
+
# loop through the sql files and add the energy use
|
|
322
|
+
total_floor_area = 0
|
|
323
|
+
bbu_energy, bbr_energy = 0, 0
|
|
324
|
+
bbu_cost, bbr_cost = 0, 0
|
|
325
|
+
bbu_carbon, bbr_carbon = 0, 0
|
|
326
|
+
for sql_path in sql_paths:
|
|
327
|
+
# parse the SQL file
|
|
328
|
+
sql_obj = SQLiteResult(sql_path)
|
|
329
|
+
# get the total floor area of the model
|
|
330
|
+
area_dict = sql_obj.tabular_data_by_name('Building Area')
|
|
331
|
+
areas = tuple(area_dict.values())
|
|
332
|
+
try:
|
|
333
|
+
total_floor_area += areas[0][0]
|
|
334
|
+
except IndexError:
|
|
335
|
+
msg = 'Failed to find the "Building Area" table in the .sql file.'
|
|
336
|
+
raise ValueError(msg)
|
|
337
|
+
# get the energy use
|
|
338
|
+
eui_dict = sql_obj.tabular_data_by_name('End Uses')
|
|
339
|
+
for category, vals in eui_dict.items():
|
|
340
|
+
try:
|
|
341
|
+
vals = [float(v) for v in vals[:12]]
|
|
342
|
+
except ValueError:
|
|
343
|
+
break # we hit the end of the table
|
|
344
|
+
ele = (vals[0] * electricity_emissions) / 1000
|
|
345
|
+
gas = (vals[1] * 277.358) / 1000
|
|
346
|
+
dce = (vals[10] * (electricity_emissions / 3.5)) / 1000
|
|
347
|
+
dhe = (vals[11] * 369.811) / 1000
|
|
348
|
+
if category in UNREGULATED_USES:
|
|
349
|
+
bbu_energy += sum(vals)
|
|
350
|
+
bbu_cost += vals[0] * electricity_cost
|
|
351
|
+
bbu_cost += vals[1] * natural_gas_cost
|
|
352
|
+
bbu_cost += vals[10] * district_cooling_cost
|
|
353
|
+
bbu_cost += vals[11] * district_heating_cost
|
|
354
|
+
bbu_carbon += sum([ele, gas, dce, dhe])
|
|
355
|
+
else:
|
|
356
|
+
bbr_energy += sum(vals)
|
|
357
|
+
bbr_cost += vals[0] * electricity_cost
|
|
358
|
+
bbr_cost += vals[1] * natural_gas_cost
|
|
359
|
+
bbr_cost += vals[10] * district_cooling_cost
|
|
360
|
+
bbr_cost += vals[11] * district_heating_cost
|
|
361
|
+
bbr_carbon += sum([ele, gas, dce, dhe])
|
|
362
|
+
# divide the results by number of SQLs if there are several of them
|
|
363
|
+
if len(sql_paths) != 1:
|
|
364
|
+
total_floor_area = total_floor_area / len(sql_paths)
|
|
365
|
+
bbu_energy = bbu_energy / len(sql_paths)
|
|
366
|
+
bbr_energy = bbr_energy / len(sql_paths)
|
|
367
|
+
bbu_cost = bbu_cost / len(sql_paths)
|
|
368
|
+
bbr_cost = bbr_cost / len(sql_paths)
|
|
369
|
+
bbu_carbon = bbu_carbon / len(sql_paths)
|
|
370
|
+
bbr_carbon = bbr_carbon / len(sql_paths)
|
|
371
|
+
|
|
372
|
+
# process the input climate zone
|
|
373
|
+
if len(climate_zone) == 1 and climate_zone not in ('7', '8'):
|
|
374
|
+
climate_zone = '{}A'.format(climate_zone)
|
|
375
|
+
|
|
376
|
+
# load the building performance factors from the tables
|
|
377
|
+
pci_2016_file = os.path.join(os.path.dirname(__file__), 'data', 'pci_2016.csv')
|
|
378
|
+
pci_2016_data = csv_to_matrix(pci_2016_file)
|
|
379
|
+
cz_i = pci_2016_data[0].index(climate_zone)
|
|
380
|
+
bpf_2016 = float(pci_2016_data[1][cz_i])
|
|
381
|
+
for row in pci_2016_data[1:]:
|
|
382
|
+
if row[0] == building_type:
|
|
383
|
+
bpf_2016 = float(row[cz_i])
|
|
384
|
+
break
|
|
385
|
+
pci_2019_file = os.path.join(os.path.dirname(__file__), 'data', 'pci_2019.csv')
|
|
386
|
+
pci_2019_data = csv_to_matrix(pci_2019_file)
|
|
387
|
+
cz_i = pci_2019_data[0].index(climate_zone)
|
|
388
|
+
bpf_2019 = float(pci_2019_data[1][cz_i])
|
|
389
|
+
for row in pci_2019_data[1:]:
|
|
390
|
+
if row[0] == building_type:
|
|
391
|
+
bpf_2019 = float(row[cz_i])
|
|
392
|
+
break
|
|
393
|
+
pci_2022_file = os.path.join(os.path.dirname(__file__), 'data', 'pci_2022.csv')
|
|
394
|
+
pci_2022_data = csv_to_matrix(pci_2022_file)
|
|
395
|
+
cz_i = pci_2022_data[0].index(climate_zone)
|
|
396
|
+
bpf_2022 = float(pci_2022_data[1][cz_i])
|
|
397
|
+
for row in pci_2022_data[1:]:
|
|
398
|
+
if row[0] == building_type:
|
|
399
|
+
bpf_2022 = float(row[cz_i])
|
|
400
|
+
break
|
|
401
|
+
|
|
402
|
+
# put all metrics into a final dictionary
|
|
403
|
+
total_energy = bbu_energy + bbr_energy
|
|
404
|
+
total_cost = bbu_cost + bbr_cost
|
|
405
|
+
total_carbon = bbu_carbon + bbr_carbon
|
|
406
|
+
result_dict = {
|
|
407
|
+
'baseline_eui': round(total_energy / total_floor_area, 3),
|
|
408
|
+
'baseline_energy': round(total_energy, 3),
|
|
409
|
+
'baseline_cost': round(total_cost, 2),
|
|
410
|
+
'baseline_carbon': round(total_carbon, 3),
|
|
411
|
+
'pci_t_2016': round((bbu_cost + (bpf_2016 * bbr_cost)) / total_cost, 3),
|
|
412
|
+
'pci_t_2019': round((bbu_cost + (bpf_2019 * bbr_cost)) / total_cost, 3),
|
|
413
|
+
'pci_t_2022': round((bbu_cost + (bpf_2022 * bbr_cost)) / total_cost, 3),
|
|
414
|
+
'carbon_t_2016': round((bbu_carbon + (bpf_2016 * bbr_carbon)) / total_carbon, 3),
|
|
415
|
+
'carbon_t_2019': round((bbu_carbon + (bpf_2019 * bbr_carbon)) / total_carbon, 3),
|
|
416
|
+
'carbon_t_2022': round((bbu_carbon + (bpf_2022 * bbr_carbon)) / total_carbon, 3)
|
|
417
|
+
}
|
|
418
|
+
return result_dict
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
def energy_cost_from_proposed_sql(
|
|
422
|
+
sql_result, electricity_cost=0.12, natural_gas_cost=0.06,
|
|
423
|
+
district_cooling_cost=0.04, district_heating_cost=0.08,
|
|
424
|
+
electricity_emissions=400):
|
|
425
|
+
"""Get a dictionary of proposed energy cost from an EnergyPlus SQL.
|
|
426
|
+
|
|
427
|
+
Args:
|
|
428
|
+
sql_result: The path of the SQL result file that has been generated from an
|
|
429
|
+
energy simulation of a proposed building.
|
|
430
|
+
electricity_cost: A number for the cost per each kWh of electricity. This
|
|
431
|
+
can be in any currency as long as it is coordinated with the costs of
|
|
432
|
+
other inputs to this method. (Default: 0.12 for the average 2020
|
|
433
|
+
cost of electricity in the US in $/kWh).
|
|
434
|
+
natural_gas_cost: A number for the cost per each kWh of natural gas. This
|
|
435
|
+
can be in any currency as long as it is coordinated with the
|
|
436
|
+
other inputs to this method. (Default: 0.06 for the average 2020
|
|
437
|
+
cost of natural gas in the US in $/kWh).
|
|
438
|
+
district_cooling_cost: A number for the cost per each kWh of district cooling
|
|
439
|
+
energy. This can be in any currency as long as it is coordinated with the
|
|
440
|
+
other inputs to this method. (Default: 0.04 assuming average 2020 US
|
|
441
|
+
cost of electricity in $/kWh with a COP 3.5 chiller).
|
|
442
|
+
district_heating_cost: A number for the cost per each kWh of district heating
|
|
443
|
+
energy. This can be in any currency as long as it is coordinated with the
|
|
444
|
+
other inputs to this method. (Default: 0.08 assuming average 2020 US
|
|
445
|
+
cost of natural gas in $/kWh with an efficiency of 0.75 with all burner
|
|
446
|
+
and distribution losses).
|
|
447
|
+
electricity_emissions: A number for the electric grid carbon emissions
|
|
448
|
+
in kg CO2 per MWh. For locations in the USA, this can be obtained from
|
|
449
|
+
he honeybee_energy.result.emissions future_electricity_emissions method.
|
|
450
|
+
For locations outside of the USA where specific data is unavailable,
|
|
451
|
+
the following rules of thumb may be used as a guide. (Default: 400).
|
|
452
|
+
|
|
453
|
+
* 800 kg/MWh - for an inefficient coal or oil-dominated grid
|
|
454
|
+
* 400 kg/MWh - for the US (energy mixed) grid around 2020
|
|
455
|
+
* 100-200 kg/MWh - for grids with majority renewable/nuclear composition
|
|
456
|
+
* 0-100 kg/MWh - for grids with renewables and storage
|
|
457
|
+
|
|
458
|
+
Returns:
|
|
459
|
+
A dictionary with several keys.
|
|
460
|
+
|
|
461
|
+
- proposed_eui -- A number for the total end use intensity. Specifically,
|
|
462
|
+
this is the sum of all electricity, fuel, district heating/cooling,
|
|
463
|
+
etc. divided by the gross floor area (including both conditioned
|
|
464
|
+
and unconditioned spaces). Units are kWh/m2.
|
|
465
|
+
|
|
466
|
+
- proposed_energy -- A number for the total energy use of the proposed
|
|
467
|
+
building in kWh.
|
|
468
|
+
|
|
469
|
+
- proposed_cost -- A number for the total annual energy cost of the
|
|
470
|
+
proposed building.
|
|
471
|
+
|
|
472
|
+
- proposed_carbon -- A number for the total annual operational carbon
|
|
473
|
+
emissions of the proposed building in kg of C02.
|
|
474
|
+
"""
|
|
475
|
+
# get the energy use and floor area from the SQL
|
|
476
|
+
total_floor_area, total_energy, total_cost, total_carbon = 0, 0, 0, 0
|
|
477
|
+
# parse the SQL file
|
|
478
|
+
sql_obj = SQLiteResult(sql_result)
|
|
479
|
+
# get the total floor area of the model
|
|
480
|
+
area_dict = sql_obj.tabular_data_by_name('Building Area')
|
|
481
|
+
areas = tuple(area_dict.values())
|
|
482
|
+
try:
|
|
483
|
+
total_floor_area += areas[0][0]
|
|
484
|
+
except IndexError:
|
|
485
|
+
msg = 'Failed to find the "Building Area" table in the .sql file.'
|
|
486
|
+
raise ValueError(msg)
|
|
487
|
+
# get the energy use
|
|
488
|
+
eui_dict = sql_obj.tabular_data_by_name('End Uses')
|
|
489
|
+
for category, vals in eui_dict.items():
|
|
490
|
+
try:
|
|
491
|
+
vals = [float(v) for v in vals[:12]]
|
|
492
|
+
except ValueError:
|
|
493
|
+
break # we hit the end of the table
|
|
494
|
+
total_energy += sum(vals)
|
|
495
|
+
total_cost += vals[0] * electricity_cost
|
|
496
|
+
total_cost += vals[1] * natural_gas_cost
|
|
497
|
+
total_cost += vals[10] * district_cooling_cost
|
|
498
|
+
total_cost += vals[11] * district_heating_cost
|
|
499
|
+
ele = (vals[0] * electricity_emissions) / 1000
|
|
500
|
+
gas = (vals[1] * 277.358) / 1000
|
|
501
|
+
dce = (vals[10] * (electricity_emissions / 3.5)) / 1000
|
|
502
|
+
dhe = (vals[11] * 369.811) / 1000
|
|
503
|
+
total_carbon += sum([ele, gas, dce, dhe])
|
|
504
|
+
|
|
505
|
+
# put all metrics into a final dictionary
|
|
506
|
+
result_dict = {
|
|
507
|
+
'proposed_eui': round(total_energy / total_floor_area, 3),
|
|
508
|
+
'proposed_energy': round(total_energy, 3),
|
|
509
|
+
'proposed_cost': round(total_cost, 2),
|
|
510
|
+
'proposed_carbon': round(total_carbon, 3)
|
|
511
|
+
}
|
|
512
|
+
return result_dict
|