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.
Files changed (162) hide show
  1. honeybee_energy/__init__.py +24 -0
  2. honeybee_energy/__main__.py +4 -0
  3. honeybee_energy/_extend_honeybee.py +145 -0
  4. honeybee_energy/altnumber.py +21 -0
  5. honeybee_energy/baseline/__init__.py +2 -0
  6. honeybee_energy/baseline/create.py +608 -0
  7. honeybee_energy/baseline/data/__init__.py +1 -0
  8. honeybee_energy/baseline/data/constructions.csv +64 -0
  9. honeybee_energy/baseline/data/fen_ratios.csv +15 -0
  10. honeybee_energy/baseline/data/lpd_building.csv +21 -0
  11. honeybee_energy/baseline/data/pci_2016.csv +22 -0
  12. honeybee_energy/baseline/data/pci_2019.csv +22 -0
  13. honeybee_energy/baseline/data/pci_2022.csv +22 -0
  14. honeybee_energy/baseline/data/shw.csv +21 -0
  15. honeybee_energy/baseline/pci.py +512 -0
  16. honeybee_energy/baseline/result.py +371 -0
  17. honeybee_energy/boundarycondition.py +128 -0
  18. honeybee_energy/cli/__init__.py +69 -0
  19. honeybee_energy/cli/baseline.py +475 -0
  20. honeybee_energy/cli/edit.py +327 -0
  21. honeybee_energy/cli/lib.py +1154 -0
  22. honeybee_energy/cli/result.py +810 -0
  23. honeybee_energy/cli/setconfig.py +124 -0
  24. honeybee_energy/cli/settings.py +569 -0
  25. honeybee_energy/cli/simulate.py +380 -0
  26. honeybee_energy/cli/translate.py +1714 -0
  27. honeybee_energy/cli/validate.py +224 -0
  28. honeybee_energy/config.json +11 -0
  29. honeybee_energy/config.py +842 -0
  30. honeybee_energy/construction/__init__.py +1 -0
  31. honeybee_energy/construction/_base.py +374 -0
  32. honeybee_energy/construction/air.py +325 -0
  33. honeybee_energy/construction/dictutil.py +89 -0
  34. honeybee_energy/construction/dynamic.py +607 -0
  35. honeybee_energy/construction/opaque.py +460 -0
  36. honeybee_energy/construction/shade.py +319 -0
  37. honeybee_energy/construction/window.py +1096 -0
  38. honeybee_energy/construction/windowshade.py +847 -0
  39. honeybee_energy/constructionset.py +1655 -0
  40. honeybee_energy/dictutil.py +56 -0
  41. honeybee_energy/generator/__init__.py +5 -0
  42. honeybee_energy/generator/loadcenter.py +204 -0
  43. honeybee_energy/generator/pv.py +535 -0
  44. honeybee_energy/hvac/__init__.py +21 -0
  45. honeybee_energy/hvac/_base.py +124 -0
  46. honeybee_energy/hvac/_template.py +270 -0
  47. honeybee_energy/hvac/allair/__init__.py +22 -0
  48. honeybee_energy/hvac/allair/_base.py +349 -0
  49. honeybee_energy/hvac/allair/furnace.py +168 -0
  50. honeybee_energy/hvac/allair/psz.py +131 -0
  51. honeybee_energy/hvac/allair/ptac.py +163 -0
  52. honeybee_energy/hvac/allair/pvav.py +109 -0
  53. honeybee_energy/hvac/allair/vav.py +128 -0
  54. honeybee_energy/hvac/detailed.py +337 -0
  55. honeybee_energy/hvac/doas/__init__.py +28 -0
  56. honeybee_energy/hvac/doas/_base.py +345 -0
  57. honeybee_energy/hvac/doas/fcu.py +127 -0
  58. honeybee_energy/hvac/doas/radiant.py +329 -0
  59. honeybee_energy/hvac/doas/vrf.py +81 -0
  60. honeybee_energy/hvac/doas/wshp.py +91 -0
  61. honeybee_energy/hvac/heatcool/__init__.py +23 -0
  62. honeybee_energy/hvac/heatcool/_base.py +177 -0
  63. honeybee_energy/hvac/heatcool/baseboard.py +61 -0
  64. honeybee_energy/hvac/heatcool/evapcool.py +72 -0
  65. honeybee_energy/hvac/heatcool/fcu.py +92 -0
  66. honeybee_energy/hvac/heatcool/gasunit.py +53 -0
  67. honeybee_energy/hvac/heatcool/radiant.py +269 -0
  68. honeybee_energy/hvac/heatcool/residential.py +77 -0
  69. honeybee_energy/hvac/heatcool/vrf.py +54 -0
  70. honeybee_energy/hvac/heatcool/windowac.py +70 -0
  71. honeybee_energy/hvac/heatcool/wshp.py +62 -0
  72. honeybee_energy/hvac/idealair.py +699 -0
  73. honeybee_energy/internalmass.py +310 -0
  74. honeybee_energy/lib/__init__.py +1 -0
  75. honeybee_energy/lib/_loadconstructions.py +194 -0
  76. honeybee_energy/lib/_loadconstructionsets.py +117 -0
  77. honeybee_energy/lib/_loadmaterials.py +83 -0
  78. honeybee_energy/lib/_loadprogramtypes.py +125 -0
  79. honeybee_energy/lib/_loadschedules.py +87 -0
  80. honeybee_energy/lib/_loadtypelimits.py +64 -0
  81. honeybee_energy/lib/constructions.py +207 -0
  82. honeybee_energy/lib/constructionsets.py +95 -0
  83. honeybee_energy/lib/materials.py +67 -0
  84. honeybee_energy/lib/programtypes.py +125 -0
  85. honeybee_energy/lib/schedules.py +61 -0
  86. honeybee_energy/lib/scheduletypelimits.py +31 -0
  87. honeybee_energy/load/__init__.py +1 -0
  88. honeybee_energy/load/_base.py +190 -0
  89. honeybee_energy/load/daylight.py +397 -0
  90. honeybee_energy/load/dictutil.py +47 -0
  91. honeybee_energy/load/equipment.py +771 -0
  92. honeybee_energy/load/hotwater.py +543 -0
  93. honeybee_energy/load/infiltration.py +460 -0
  94. honeybee_energy/load/lighting.py +480 -0
  95. honeybee_energy/load/people.py +497 -0
  96. honeybee_energy/load/process.py +472 -0
  97. honeybee_energy/load/setpoint.py +816 -0
  98. honeybee_energy/load/ventilation.py +550 -0
  99. honeybee_energy/material/__init__.py +1 -0
  100. honeybee_energy/material/_base.py +166 -0
  101. honeybee_energy/material/dictutil.py +59 -0
  102. honeybee_energy/material/frame.py +367 -0
  103. honeybee_energy/material/gas.py +1087 -0
  104. honeybee_energy/material/glazing.py +854 -0
  105. honeybee_energy/material/opaque.py +1351 -0
  106. honeybee_energy/material/shade.py +1360 -0
  107. honeybee_energy/measure.py +472 -0
  108. honeybee_energy/programtype.py +723 -0
  109. honeybee_energy/properties/__init__.py +1 -0
  110. honeybee_energy/properties/aperture.py +333 -0
  111. honeybee_energy/properties/door.py +342 -0
  112. honeybee_energy/properties/extension.py +244 -0
  113. honeybee_energy/properties/face.py +274 -0
  114. honeybee_energy/properties/model.py +2640 -0
  115. honeybee_energy/properties/room.py +1747 -0
  116. honeybee_energy/properties/shade.py +314 -0
  117. honeybee_energy/properties/shademesh.py +262 -0
  118. honeybee_energy/reader.py +48 -0
  119. honeybee_energy/result/__init__.py +1 -0
  120. honeybee_energy/result/colorobj.py +648 -0
  121. honeybee_energy/result/emissions.py +290 -0
  122. honeybee_energy/result/err.py +101 -0
  123. honeybee_energy/result/eui.py +100 -0
  124. honeybee_energy/result/generation.py +160 -0
  125. honeybee_energy/result/loadbalance.py +890 -0
  126. honeybee_energy/result/match.py +202 -0
  127. honeybee_energy/result/osw.py +90 -0
  128. honeybee_energy/result/rdd.py +59 -0
  129. honeybee_energy/result/zsz.py +190 -0
  130. honeybee_energy/run.py +1577 -0
  131. honeybee_energy/schedule/__init__.py +1 -0
  132. honeybee_energy/schedule/day.py +626 -0
  133. honeybee_energy/schedule/dictutil.py +59 -0
  134. honeybee_energy/schedule/fixedinterval.py +1012 -0
  135. honeybee_energy/schedule/rule.py +619 -0
  136. honeybee_energy/schedule/ruleset.py +1867 -0
  137. honeybee_energy/schedule/typelimit.py +310 -0
  138. honeybee_energy/shw.py +315 -0
  139. honeybee_energy/simulation/__init__.py +1 -0
  140. honeybee_energy/simulation/control.py +214 -0
  141. honeybee_energy/simulation/daylightsaving.py +185 -0
  142. honeybee_energy/simulation/dictutil.py +51 -0
  143. honeybee_energy/simulation/output.py +646 -0
  144. honeybee_energy/simulation/parameter.py +606 -0
  145. honeybee_energy/simulation/runperiod.py +443 -0
  146. honeybee_energy/simulation/shadowcalculation.py +295 -0
  147. honeybee_energy/simulation/sizing.py +546 -0
  148. honeybee_energy/ventcool/__init__.py +5 -0
  149. honeybee_energy/ventcool/_crack_data.py +91 -0
  150. honeybee_energy/ventcool/afn.py +289 -0
  151. honeybee_energy/ventcool/control.py +269 -0
  152. honeybee_energy/ventcool/crack.py +126 -0
  153. honeybee_energy/ventcool/fan.py +493 -0
  154. honeybee_energy/ventcool/opening.py +365 -0
  155. honeybee_energy/ventcool/simulation.py +314 -0
  156. honeybee_energy/writer.py +1078 -0
  157. honeybee_energy-1.116.106.dist-info/METADATA +113 -0
  158. honeybee_energy-1.116.106.dist-info/RECORD +162 -0
  159. honeybee_energy-1.116.106.dist-info/WHEEL +5 -0
  160. honeybee_energy-1.116.106.dist-info/entry_points.txt +2 -0
  161. honeybee_energy-1.116.106.dist-info/licenses/LICENSE +661 -0
  162. 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