From 9d87d497fc31ede088e9d24fad3f9e2e87fc2a34 Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Mon, 21 Aug 2023 14:56:01 -0700 Subject: [PATCH] fix(python): Ensure compatibility with Python 3 for Rhino 8 WIP --- .../icon/HB Annual Loads.png | Bin 964 -> 965 bytes .../icon/HB Balance Temperature.png | Bin 1374 -> 1374 bytes .../icon/HB Run IDF.png | Bin 960 -> 959 bytes .../icon/HB Run OSM.png | Bin 1060 -> 1060 bytes .../icon/HB Run OSW.png | Bin 1067 -> 1067 bytes .../icon/HB Thermal Load Balance.png | Bin 1088 -> 1089 bytes .../json/HB_Annual_Loads.json | 4 ++-- .../json/HB_Balance_Temperature.json | 4 ++-- .../json/HB_Run_IDF.json | 4 ++-- .../json/HB_Run_OSM.json | 4 ++-- .../json/HB_Run_OSW.json | 4 ++-- .../json/HB_Thermal_Load_Balance.json | 4 ++-- .../src/HB Annual Loads.py | 6 +++--- .../src/HB Balance Temperature.py | 3 +-- honeybee_grasshopper_energy/src/HB Run IDF.py | 4 ++-- honeybee_grasshopper_energy/src/HB Run OSM.py | 4 ++-- honeybee_grasshopper_energy/src/HB Run OSW.py | 4 ++-- .../src/HB Thermal Load Balance.py | 4 ++-- .../user_objects/HB Annual Loads.ghuser | Bin 10505 -> 10520 bytes .../HB Balance Temperature.ghuser | Bin 6696 -> 6695 bytes .../user_objects/HB Run IDF.ghuser | Bin 5658 -> 5659 bytes .../user_objects/HB Run OSM.ghuser | Bin 6405 -> 6423 bytes .../user_objects/HB Run OSW.ghuser | Bin 6158 -> 6177 bytes .../HB Thermal Load Balance.ghuser | Bin 6721 -> 6737 bytes 24 files changed, 24 insertions(+), 25 deletions(-) diff --git a/honeybee_grasshopper_energy/icon/HB Annual Loads.png b/honeybee_grasshopper_energy/icon/HB Annual Loads.png index 3c1ace8d5f83c65b98e8b200df9dc097eaaf32df..93db7963b4933177708e73ec139045b6098f2322 100644 GIT binary patch delta 892 zcmV-?1B3j;2gL`FR)1PaL_t(YOU;#CNEA^N$7grPnf-9*&g`~+w!6Beo0SAc)I-)w z^&l2y;fv9S;X_zf`;n=uWwmA?Jrq$81Q9|)AZb0cyQY?9Y!zBre!Q8>~Ae0fI*QrZf{?Uy*vHt7pT9|I<@ zlb1~?7BM0MqJN|-I_r7wV+idU5rg8+CCYA2`a;bU;PwShhyng4B~oCa*{1y1*#2UT zW^9+*@IGIweVU%*98nb2O(;v6y1BBBTf}i~G*ktm-{%{|L_w@3h;93Ta|Mc}aN$}! zhh@9Y$0flVYdYLWvchp=e2B&bGYpt*aLJSacBS$@&VNl1j&^(bsxIuJF0l%S6e6-# zt<(R@I!0?CpoTB6oG8=P%}A@f|wQc%6r)^p9muLKUC3+F_Xc{v9B zY_-E1OByUtt6!iuUm6NiTqdpQ|BCZ^3GiNVQj@ALiU1+u13vikj5~# zW#5iu{>DP2;GkdvNXdZ9@v{M2q6oby6}LgB`v}%~(35NfR;4BWi)HVW?C8m` zgkeTLV*dkv>}^DtKrd2~xmuO#l#!nlqNtzggkDdg S;U{YV00001BCp=2gC=ER)1MZL_t(YOU;#QNEA^N$7grPnSIWk*>!hyb$4}3%}N3z>OVs6Ig#<=VB*L=Vhi~nv6+|D3FbIN(pdg4|AKYD2%d&DK(!wYr%?K5HQrZJOo!OZL zvlWf~&>wy<{O`Tz+%t3T9qPXqU+mA|EAKBCA*BJAY)4O=uYdlmP}2!QZ6|P^K&5O) zPsHax#aD-b-xC7j3HW3?dLq8yaWOc*7jXx6$o9WWU+hoktL|p;B@K&tPs3u)8@R$( zwgO+(3d9?z6TR?Q)q^bJsZW-dOAjx0-~fVT7S>;HBTYDYeWo+JC`WCHR=ns&w$$GfTO8qMeJ zYU9T|t@e3pwx?fFaBM_bbhVu;Yq?F_HwMC0Aco!k9!wO%YC_ny4>@nJPzpCzbEmOv z+Zl@u-Z@j@rp*aQOx7@$!k> zB;yZeBl&v-GeA;0T(TwtwnPDX6UvgK(|rNw4CqL30jp9SP%5dNg@OqVnJlo+WFA8; zdR_Pp!~`L10$hJs3KLl*mu26J2_9pD7)+p|sDIU~4BVT|MCjYh@ncxe@x5yd+}m7a zfkyih*DsgCOrQ*wee@N(=L5c?G<=qA2GK=8D?=lbQuTH0bFu8Bu~xC{ZIT^58Rs!f z{}=3kz>mF=2qWl4N-|xmQk^i-^pvmXrMU(&@&gluE5Xz2VwfiM#cOy4vdK;}=Zgp# zx^!Z5KnhKFqo+Wor0hj8F?~((&Tx_;OxBE@a?zRq*Rbzf5|ZI0o`E@xrWxmoE&ET3 z$9)~fliit5gm3$dX4opk{>(QRUOO4)B94pIL`7ox4n({%#Gi*6`JY5lzW@LyURCQ% RunzzL002ovPDHLkV1kO`ra1rr diff --git a/honeybee_grasshopper_energy/icon/HB Balance Temperature.png b/honeybee_grasshopper_energy/icon/HB Balance Temperature.png index 1c18d2923a53e8b11f49015a4d0cdee23dd2f8c9..76b8795406797491e61e9b1af9d7a52245857f35 100644 GIT binary patch delta 1295 zcmV+q1@QXb3f>BkV1H~>RTRfBDOf=$$&^aEx3hHK%xhu)XQhaReQcfnjoPRJUAwx_>mX7DO8kK5Y zmWp4mQ>)ct`ky3~rKO!%RvyH*Z9Bj#xyv*c75)@KW~0$%G8i1$x@@OWtIZeFlVrDV znVOcEyxL~7{jzmy4O-ee(RSbv)~sHOxv{ak#ATC3%?oH08FfZaj$WT9rY9*TW=>~u zu@`L}2hq^nhJX6K`-Ny}>qOb2GE9$(@`+0)iUD#Ah6M~jpL50ZL`_S4uBOt0%76tM zHt$4ZbL#`ZzWq(u8)}5vWd511ObTxpr}2Qu70gZdI5fi;2;hr`eB{}3@%G-Z=@_K3 zxg9k-c0wwZ4vL!|iUAB-)*@ZR3Y0SWh3g$2-0v#|`hWdsSYw3S`;;()F#rqpUR}Kk z32}34#I0dj_4-0$Hk+p!jW&x;XBX3g9-o=A`OvEl!Fc#o34S|M0-P^JMM)->uiSv< zwhq+q2?+q!s?M$>a5~+1B0Ab7S`d<|*IT=I&AY9t%wx$p`fM>x6*q51zzBTc7mSBb zhvUz4rGNP0unUDYBX-o*Bh=80rj~ZRMccOI=^(t09B|U~TG52gZ{9rJ6}cK0@x-kzU%G?#SjW?)Q3eX^#s*4=?=4{oYcH(Dq$zbt5BP z5faRqA_2+@wAX&`@!?n6`#U{eI#?QgY``?=X<~p8+PcBrPHZYS(>eKs9Bbzddg3%Z z-+wNcGfe>GnFWAP1l)Pgi|-G6@cIk$QMJT`<%@GrS7pH;6w3aX0bYLA1iT*x+@tHi z>hvH}DL*WjGtIDC^%tZZnj!#LpIcWNK$e9-n!W+4`x1c_-791QBFgF<1!^?C#VV+7wRqv06NrjZ{#DYb_nF`hyd`Exql}B z)-R=iA-`}pdUiTtH}E$klH?)*P%W2#gp>^2N|NI?h1^QxU`XM%2i%4M^ap@X132=M z4&;?nAVai*GeB@d6$R5fa$ylZ3l(8&g%vkX`%o1yj?R<_H+ZIC&g51qcmE`NSivBj zMVyomIILM$yXoKb?V`tUNfu%%-hV{Q{?8%VbOa8U9X;Fg&|B-ozO}hnn5RX)QGJn+ zCoQ7wIH}c=@(ktqlTsx*SR^9{>OV00>D%PDHLk FV1h3DbQb^s delta 1295 zcmV+q1@QXb3f>BkV1G7 zCBdcESgox#3f2^&ZBbc=MHFLQ;sRE%En=eK zvQ+$fom#CH)Bhx?EG_NWvhpCdZQBlB$z7(osPLxI9lfmG~)@3`5T5Z0Vo+P_{ z%ha^Q5VnWd511ObTxpr}2Qu70gZdI5fjJ7r+h*=hY&K6d8f_Mx&Mu|}Jw7vK^MO|#g7NT)68v_m1UOrYijqt$U%3Ho z9bIVH-6#N9tGas*!Rd74iRfsTXhBG-UT^K;HSe~oGLIzZ=(EK%RouK40VD8%Uoaj% z8IC{Clz-xfgDw=>jM!e+fX3!Fw1ztI7H!*-r-Sf1a==N`>qHYezj^a?SLAA3l&e7I zo5Xt%JIkt9eSPz&ml}E>n6tP|E5V0;^lr1jQRqRas|TyrZGj_qKHAo0<4SWeIF7Fm z`%ulWSPbW696~bXD6!@6EGJ7-v=8noqDDT!aDO~tEHLOpO@#^B<^oju47e6506w7y zA>>ACss2gQT9EbaNIz{&Z)9^8_xruLwA+QChZlb2et#)OX#1|VyOEKu zXcWwuA_2+@wAX&`^Wj(8`#XJJI#?P5Y``?=X<~p8+Pa}#PHZYS(>eKs9Bbzddg3%Z z-+w8XGfe>GnFWAP1l)Pgi|-G5@cIk$QMJT`<%@GrUuD4`6w3aX0bYLA1iT*x+@tHi z>h>U0DL*KfGtIDC^%tZZx*`BrpW9a&K$bOvw0;9p|0Mz|$}w`%`AEQbJquyr6^8|L zL3X=*pPWODoEs&@cHydz2XwB~f^0knGJgn=!^0?j#*e$lT^OaU`a9t6X)k^};)N|c zt5@(QYV~6al*+CaSqADAN@zH4BTJ9XfC2WuNGsTQ6l8z`4%~#>zW{fR7fk}Nd11&; zEAT?2QhY4<+d1yF>-791QBFgFqcSCCC#VV+7wRqv06Nq&Z{#DY?mWop5dq*SbAL|& ztY1n2=l#On=-c6h-N4_FNRo>LK($={5mGX6D@l&q6mlz#gCT{h3AhdCFc<(n4dBpA zI*?aRfSjiloC1OyswkM=kqe9PSz{5lR#Lw}tUd)MY-VV)NGM)gHP zp0tRzD%PDHLk FV1hr-bCdu8 diff --git a/honeybee_grasshopper_energy/icon/HB Run IDF.png b/honeybee_grasshopper_energy/icon/HB Run IDF.png index ba056c8f34f284503d83c6a11d082680a7def931..a9b50328572cf7c1da2614fe03eb5c94576d260a 100644 GIT binary patch delta 900 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 YKi7y;5Ie{r;{X5v07*qoM6N<$f@1UUt^fc4 delta 1002 zcmVvCMI;Kg^l`UM zN{cOmB1nrG9sw0lVl?qZI{wbwsRXv=^^bnZmv&~(o;i1B?tfhNpCihehKWc+9*;O- zJ6!iV57%!O;rh*XsT1R|#u>p?%_B_c9gv@IiD*M1bddNDvHEi**Pl>w!%5igy8de= z)*MkhlDNuC6D^1>9ysSszsb-uDJ8qpc`VUJKh{ZKI;2F&hsvI_RRyQS|FUz7{|-)z zD|_}9B^JN0WPjN~#2r^+?H7ti8$0Y}Rg+DsWMpn^zKkZW%JO4MMjRyyceDndoVV6D z=#eQN#zr9|4L$(J!hDa<-r^nhSVtgxsS=@TCGb0e3GL+vW?}q#`VAeGD^V#`BEn94 zYC+{BGjuEZz(NmC`<@qU$Fdz&e3A2~9d(Ag!!CXOS$_qm<+@{vhiWg%`?ZKs-33q_PMsXdA^L<`Y>Rb8cm<(*+BL(J-|cN zpPIhg!m_**c=4VSvZ|Awy1&j-fjr>@``rkak=_T#E4lix;wzglSW{&BZ;5|&-r*D+ zTRYac*MH6_jfrqA_VG*Ps9#`0TzWB9ZBH*(a@|+%NeI`x#^O$2Gu$nfWj(`-b}Ei| zye~>b67D94YFb&zey<7pm$cp<&jtIrSM?-v<2Oo{)@7QpZt;(qdPv4wQEe@((}nS9 zL$iO$-hn10i4k~`7JtSp#TV|{mAc3YnEoVm^?xtEf$E#h1X!9?EsC$G{=|gzhy};F z|MrYObFN-{fhQ30HvLz={FzFj6BMe6nXtP9)#nDDDC+disJIe%dg*!Jq$TZvi3{3% znFR@7`U@Wg3oCO>=v^}y(zS69^g*ob|A;~GdH9fSUC&c+8oXb(+{(wphjoiFIuz-! zzkhCZLl(ROPr={dOxVRHcp9FBo$y{r7u^r=XGm;-3QpIp8=z{A!&h{Rv3c+^?5A6d zorBvTeZk&^10b;#QqnT`Bm5oOFbQ1w>?b%i@${1$c~hxsDg{|Jj{SZ z5T1e5Pt`h*L#mYeFF~641NbYv>19c8@}uy^4>;`wogNzNg7z&H-UoX_dUD!)vu}+3 Y1MbdK6ElYhP5=M^07*qoM6N<$f-fWNL;wH) diff --git a/honeybee_grasshopper_energy/icon/HB Run OSW.png b/honeybee_grasshopper_energy/icon/HB Run OSW.png index 1397e7a78ae0976ed5d3efbe0d14d681ec7906b5..42b7a9965c956ca6d1dc89197569ad5c0867de9b 100644 GIT binary patch delta 975 zcmV;=12Fun2&)K?YJVs!an3(X#-9;jA+3gBXP~VC%6ix9%IHcYMg?XBLn4VL;0sA0 zQF);(0;1p>bc76I)|IlmDliOV4mZIFNCFImECz8vx?O3z;eLL9ch86m9mwABO+LB1 z=Xv_v^W5F@RC?&4CTDj4_Z8FnG*wPUeajOEly{PvvLdDV{D0|2-^~7&#iK;i2TO0G z@1>OP+n$c9=hK>x=x8O;@gPxK717T)HdoT^m`dqJ^>S~_zbmP!^Tbc@oxk>a3ww2C zPyY{oqIPuF8l*nmPk+>UsBN2zj&63+@hvXu_+|km52!>x;b!e2qNV_)b)O!u^Gp?8 z-JM-)%N)t5_kW5x!XFn=`xbZi*3~vWuy~5q*ZNY#QVXitvucCm_Kp7PH~9x2TA$Fr+@Q|&bo5Uq>7A)vR;&%vF}*( z0@2A384dDoQ8t{cUjN!Oq7xxXM3lp#%uL|RcdZ-5BXXT6`@boGZ`{_wpkO(yjgS zI?=?;$ba0dtTQb&PV-yu*42d3;9X86JtFFdie3MxjOa)J9V*oIt(>A`m6VJsofMVF zi8gmKr>G#W|J2v>tnVKSDiQY17Ihi3#9b7o!vXFPYXXb$USAoRw7-S4@3+LcN^GcFlg`4mgJPI3t z_kJ0;vsZvq1$@mN^HGB#Gan524Q|03z(^Sj{NoGI3|C+xaOMKn@qY-vxBKqKlYkeB x-Mq5Gv*XeGp&ANdAbH@lPNf;Z??^%#y5 delta 975 zcmV;=12Fun2&)K?YJY#1IH$;Dh$Fy4S`ERCKwART^{&^I(UnMy3eG5mL=sKF7m`4t z@poiA*dm_O=GG%1HgP?bA6`wRQz+@@u-C*ILM zn@x1oZ_X^Cxo^elJf+;Wkl~RZ2wpqoi!ovwt~8M{OBqQb|TwStrWP*mtac zndoegjCy&mC>u&vt$SlC(U~B{!^$yHX2$>Z2i6T@VYyb6{ofQ_u31=5^vxKY=WTd< zx_JX5EFZP1t;`BKClECUs59zIc85GJQU1^bodsb!vxIsZ%eSpvI&JZ_{rrdmbo-#Z zRx~j)JbybQ1y1l_bexpo)Gne#jbx^N_5-)!oiibS2L|xh}aTSE^4E;fxvj|CRT=o!x>R)1HvPt*^ZLUwxQU9=M|{_#OTN6{2txypT4$e;kD8VKZES{?Ty98=(k(1|AG23?VoGo8Srz z*h%}tFXsjnn^%%F5@NtN<1B^Ca1K6){zte5t^tYTDM%aM7XE-w%qvNH9d5x>@Fc7U z-uq?X&gKE968M@s=A#CKW&s%R3*3gcfJieI_{SHa39iB<;LHWC7Jd diff --git a/honeybee_grasshopper_energy/icon/HB Thermal Load Balance.png b/honeybee_grasshopper_energy/icon/HB Thermal Load Balance.png index ecf3a690b0c1f0b13f3ea50a7b14f14437eaff63..0b6156a7fbb2c80558a6287bf8b9aea7df74f29c 100644 GIT binary patch delta 987 zcmV<110?*w2*C)DRsq(LS0aB{y|im9u+qU22!r7;8H~CTVF@NqC&Mi!AZ|h$7dDK} zvFs&g2^1VFgk&yiBGIpYH5&DU^5Qnvm6tu9OAjtFUDEE0Px8w-PfniyKj-{!a+&{4 z4Gj%1mW$%eQjUw-3Blsxai`IEOWmu4%F3>&-expLi;9X`Xe@PYYi)mh>5NT|E#{f< z6JgO{!Y_2cERkZ1NmwI|BD@*dHrr{MN<)g0)2-LvkCPibt-&g3Fhv@$viu%R zrJ-PR<~ghUJ9hHeAccQaR#|@YS++cKcr0)tB!{DirczgiAZQgbgW+5w`f@nDo6X@o zZ^96HvMqms%g6hI2)D!W3^QQ1YxW1^*z9N(t_`|zb-<1J(N_=|@&4<-xm1mz-j~7Z z%+D|b(x79%9K+oMz-$1R3t;1R0FR?&Pd)C|M%(NKCi+pYY%cB>96H*2w+1obRB=!0I6pFZS3b#;l);~CqlxW?Ry zGFn@;ufywdT`Vsxzgi~eZ*(@<(cV~?l+I>5>b(|NE%FZ@*WNL2W##z;wRJ(YmWtQy zzQFi=KEb27LrQ;zGgRqx9;>aXsZv*qsq`JcpIu#FEk=B$2#=NtOGSt++7o-i#(FWL zlQIlC+cbHmkZX?;^!xqQiqpASPpwPukxcCKjXu-EZ=)h^kLxi*n7hW|s|hn^E+_n* z3G%6)m7ry%H)$w!$r%}%e7Po;_tqEC9Ug?P?E~Z<4a0xXd*z7_jUm5%0EGr^AC09h ziD9%B<<)q>+#1B`dkLogf_ZZ3iJu3ogAv$u+5I$@x~do^%ih+#R1jH)c;n~fkY=`_ zX*fhvFO8)x{|n5Hl4EE7D45?Mh5kgr)G}dZlPxdKuA=bb0$jUychFesk~A7^mRuZ{ znz|qz55s@j+yiSv5Eeqhcf)${4M^2Zu#2X*X)JX)Hizts84iDp+#{bte`o}TmUElv zk9-Ehp<(D-!!R}W!{c(b(^%>X<}#U5W8ZH%r+)-{;%l%czauOppk6)WIzEA&*QEbH zaArQI6Dw*VbX^D6GXehfaqz*oEWT delta 986 zcmV<0110>y2*3!CRsq$KS0aD9dTG~IV5Ng45C+3xG8lCbVF@NqC*l?p5H}%>3mZn~ zSoRXLgtx#7A(@MsNc5{;jYj>TytvJEEwIOP>A@wYOWJ+$Nq#x!$;tEo=bZmdF7v;s zzP|p&a#6fh%5f1pAyiyE?lKx@)xAn*S=m+9+l=~3aO;*6pf`JNz%TSl@){5hzA-0Ygz&K$a(MW;;VuX-H9Wy7l_|F>-^aHHec2)1(0_%kR@v z8VWUKp0~=sV>gdYQb>O#&hlH&vh9(>V~GZTpK{K0XjccpQ#rm;tj>b1*1J=SM4Xeb9qz10F1nzJjR{-@pEw%T*ZaeHpCI z{0uW74cZUNQQSQQ%m;ymAU1CY@i;>E)Z=a)?tJVc4J_}`P&$9w#dg${KEOgP9!>@D zcM{ZQv;EbNJuan{hSJlyZsphY*;=gKs=;a!)U(K-A9_K4`jCTFRV99}cWl4n9`h*5 zXiepTcAwjQsl2rOTA7@`+0kf6TSH+|I-2aL^I2fE$Uk`9`^S706&DWG)P~erDn5_r zBIEb_1+U`iRGfdV&I*_7L``*drMg;7rSAj+Y?tMxq5C~K$F4tB)wJyC!GO^D$_)QPLjfl8CuE!i<;W~$}Cd`<-lJIvX z$ftTvf|ixuq@mO$XJlyd`)>fK=58yJ&iw#!{DKYsmhn;pivGJ@y&&M@C?1KEH+j z*yk`D8HTeVx@{ZrU^P5S=> zSLSm%(OCnb>jt=<3GlCvgAaWHzT-0ZlamSGbrVkF;eM2u@&;%ubp?aL9VU+ZNYJt2 zecoVS0nZN$I!##6uwkeBz-e<{-iUf8a)z*T&mJF*{YMP*4-h~>aVqluy#N3J07*qo IM6N<$g1;x@rT_o{ diff --git a/honeybee_grasshopper_energy/json/HB_Annual_Loads.json b/honeybee_grasshopper_energy/json/HB_Annual_Loads.json index 87e748c3..58da481e 100644 --- a/honeybee_grasshopper_energy/json/HB_Annual_Loads.json +++ b/honeybee_grasshopper_energy/json/HB_Annual_Loads.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "AnnualLoads", "outputs": [ [ @@ -127,7 +127,7 @@ } ], "subcategory": "5 :: Simulate", - "code": "\nimport os\nimport subprocess\nimport json\n\ntry:\n from ladybug.futil import write_to_file_by_name, nukedir\n from ladybug.epw import EPW\n from ladybug.sql import SQLiteResult\n from ladybug.datacollection import MonthlyCollection\n from ladybug.header import Header\n from ladybug.analysisperiod import AnalysisPeriod\n from ladybug.datatype.energyintensity import EnergyIntensity\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from honeybee.config import folders\n from honeybee.model import Model\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.loadbalance import LoadBalance\n from honeybee_energy.simulation.parameter import SimulationParameter\n from honeybee_energy.run import run_idf\n from honeybee_energy.result.err import Err\n from honeybee_energy.writer import energyplus_idf_version\n from honeybee_energy.config import folders as energy_folders\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from lbt_recipes.version import check_energyplus_version\nexcept ImportError as e:\n raise ImportError('\\nFailed to import lbt_recipes:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.togeometry import to_vector2d\n from ladybug_{{cad}}.config import conversion_to_meters, units_system, \\\n tolerance, angle_tolerance\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef check_window_vent(rooms):\n \"\"\"Check a rooms to make sure there's no opening of windows as coarse timestep.\"\"\"\n for room in rooms:\n if room.properties.energy.window_vent_control is not None:\n msg = 'Window ventilation was detected but your timestep is too low ' \\\n 'to model window opening correctly.\\nIt is recommended that you ' \\\n 'increase your timestep to at least 4 to get loads for this case.'\n print msg\n give_warning(ghenv.Component, msg)\n\n\ndef data_to_load_intensity(data_colls, floor_area, data_type, cop=1, mults=None):\n \"\"\"Convert data collections output by EnergyPlus to a single load intensity collection.\n\n Args:\n data_colls: A list of monthly data collections for an energy term.\n floor_area: The total floor area of the rooms, used to compute EUI.\n data_type: Text for the data type of the collections (eg. \"Cooling\").\n cop: Optional number for the COP, which the results will be divided by.\n \"\"\"\n if len(data_colls) != 0:\n if mults is not None:\n if 'Zone' in data_colls[0].header.metadata:\n rel_mults = [mults[data.header.metadata['Zone']] for data in data_colls]\n data_colls = [dat * mul for dat, mul in zip(data_colls, rel_mults)]\n total_vals = [sum(month_vals) / floor_area for month_vals in zip(*data_colls)]\n if cop != 1:\n total_vals = [val / cop for val in total_vals]\n else: # just make a \"filler\" collection of 0 values\n total_vals = [0] * 12\n meta_dat = {'type': data_type}\n total_head = Header(EnergyIntensity(), 'kWh/m2', AnalysisPeriod(), meta_dat)\n return MonthlyCollection(total_head, total_vals, range(12))\n\n\ndef serialize_data(data_dicts):\n \"\"\"Reserialize a list of MonthlyCollection dictionaries.\"\"\"\n return [MonthlyCollection.from_dict(data) for data in data_dicts]\n\n\n# List of all the output strings that will be requested\ncool_out = 'Zone Ideal Loads Supply Air Total Cooling Energy'\nheat_out = 'Zone Ideal Loads Supply Air Total Heating Energy'\nlight_out = 'Zone Lights Electricity Energy'\nel_equip_out = 'Zone Electric Equipment Electricity Energy'\ngas_equip_out = 'Zone Gas Equipment NaturalGas Energy'\nprocess1_out = 'Zone Other Equipment Total Heating Energy'\nprocess2_out = 'Zone Other Equipment Lost Heat Energy'\nshw_out = 'Water Use Equipment Heating Energy'\ngl_el_equip_out = 'Zone Electric Equipment Total Heating Energy'\ngl_gas_equip_out = 'Zone Gas Equipment Total Heating Energy'\ngl1_shw_out = 'Water Use Equipment Zone Sensible Heat Gain Energy'\ngl2_shw_out = 'Water Use Equipment Zone Latent Gain Energy'\nenergy_output = (cool_out, heat_out, light_out, el_equip_out, gas_equip_out,\n process1_out, process2_out, shw_out)\n\n\nif all_required_inputs(ghenv.Component) and _run:\n # check the presence of energyplus and check that the version is compatible\n check_energyplus_version()\n\n # set defaults for COP\n _heat_cop_ = 1 if _heat_cop_ is None else _heat_cop_\n _cool_cop_ = 1 if _cool_cop_ is None else _cool_cop_\n\n # create the Model from the _rooms and shades_\n _model = Model('Annual_Loads', _rooms, orphaned_shades=shades_, units=units_system(),\n tolerance=tolerance, angle_tolerance=angle_tolerance)\n floor_area = _model.floor_area\n assert floor_area != 0, 'Connected _rooms have no floors with which to compute EUI.'\n floor_area = floor_area * conversion_to_meters() ** 2\n mults = {rm.identifier.upper(): rm.multiplier for rm in _model.rooms}\n mults = None if all(mul == 1 for mul in mults.values()) else mults\n\n # process the simulation folder name and the directory\n directory = os.path.join(folders.default_simulation_folder, _model.identifier)\n sch_directory = os.path.join(directory, 'schedules')\n nukedir(directory) # delete any existing files in the directory\n\n # create simulation parameters for the coarsest/fastest E+ sim possible\n _sim_par_ = SimulationParameter()\n _sim_par_.timestep = _timestep_ if _timestep_ is not None else 1\n _sim_par_.shadow_calculation.solar_distribution = 'FullExterior'\n _sim_par_.output.add_zone_energy_use()\n _sim_par_.output.reporting_frequency = 'Monthly'\n if run_bal_:\n _sim_par_.output.add_output(gl_el_equip_out)\n _sim_par_.output.add_output(gl_gas_equip_out)\n _sim_par_.output.add_output(gl1_shw_out)\n _sim_par_.output.add_output(gl2_shw_out)\n _sim_par_.output.add_gains_and_losses('Total')\n _sim_par_.output.add_surface_energy_flow()\n # set the north if it is not defaulted\n if _north_ is not None:\n try:\n _sim_par_.north_vector = to_vector2d(_north_)\n except AttributeError: # north angle instead of vector\n _sim_par_.north_angle = float(_north_)\n\n # check the rooms for inaccurate cases\n if _sim_par_.timestep < 4:\n check_window_vent(_rooms)\n\n # assign design days from the EPW\n msg = None\n folder, epw_file_name = os.path.split(_epw_file)\n ddy_file = os.path.join(folder, epw_file_name.replace('.epw', '.ddy'))\n if os.path.isfile(ddy_file):\n try:\n _sim_par_.sizing_parameter.add_from_ddy_996_004(ddy_file)\n except AssertionError:\n msg = 'No design days were found in the .ddy file next to the _epw_file.'\n else:\n msg = 'No .ddy file was found next to the _epw_file.'\n if msg is not None:\n epw_obj = EPW(_epw_file)\n des_days = [epw_obj.approximate_design_day('WinterDesignDay'),\n epw_obj.approximate_design_day('SummerDesignDay')]\n _sim_par_.sizing_parameter.design_days = des_days\n msg = msg + '\\nDesign days were generated from the input _epw_file but this ' \\\n '\\nis not as accurate as design days from DDYs distributed with the EPW.'\n give_warning(ghenv.Component, msg)\n print msg\n\n # create the strings for simulation paramters and model\n ver_str = energyplus_idf_version() if energy_folders.energyplus_version \\\n is not None else energyplus_idf_version(compatibe_ep_version)\n sim_par_str = _sim_par_.to_idf()\n model_str = _model.to.idf(\n _model, schedule_directory=sch_directory, patch_missing_adjacencies=True)\n idf_str = '\\n\\n'.join([ver_str, sim_par_str, model_str])\n\n # write the final string into an IDF\n idf = os.path.join(directory, 'in.idf')\n write_to_file_by_name(directory, 'in.idf', idf_str, True)\n\n # run the IDF through EnergyPlus\n silent = True if _run == 1 else False\n sql, zsz, rdd, html, err = run_idf(idf, _epw_file, silent=silent)\n if html is None and err is not None: # something went wrong; parse the errors\n err_obj = Err(err)\n print(err_obj.file_contents)\n for error in err_obj.fatal_errors:\n raise Exception(error)\n\n # parse the result sql and get the monthly data collections\n if os.name == 'nt': # we are on windows; use IronPython like usual\n sql_obj = SQLiteResult(sql)\n cool_init = sql_obj.data_collections_by_output_name(cool_out)\n heat_init = sql_obj.data_collections_by_output_name(heat_out)\n light_init = sql_obj.data_collections_by_output_name(light_out)\n elec_equip_init = sql_obj.data_collections_by_output_name(el_equip_out)\n gas_equip_init = sql_obj.data_collections_by_output_name(gas_equip_out)\n process1_init = sql_obj.data_collections_by_output_name(process1_out)\n process2_init = sql_obj.data_collections_by_output_name(process2_out)\n shw_init = sql_obj.data_collections_by_output_name(shw_out)\n else: # we are on Mac; sqlite3 module doesn't work in Mac IronPython\n # Execute the honybee CLI to obtain the results via CPython\n cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result',\n 'data-by-outputs', sql]\n for outp in energy_output:\n cmds.append('[\"{}\"]'.format(outp))\n process = subprocess.Popen(cmds, stdout=subprocess.PIPE)\n stdout = process.communicate()\n data_coll_dicts = json.loads(stdout[0])\n cool_init = serialize_data(data_coll_dicts[0])\n heat_init = serialize_data(data_coll_dicts[1])\n light_init = serialize_data(data_coll_dicts[2])\n elec_equip_init = serialize_data(data_coll_dicts[3])\n gas_equip_init = serialize_data(data_coll_dicts[4])\n process1_init = serialize_data(data_coll_dicts[5])\n process2_init = serialize_data(data_coll_dicts[6])\n shw_init = serialize_data(data_coll_dicts[7])\n\n # convert the results to EUI and ouput them\n cooling = data_to_load_intensity(cool_init, floor_area, 'Cooling', _cool_cop_)\n heating = data_to_load_intensity(heat_init, floor_area, 'Heating', _heat_cop_)\n lighting = data_to_load_intensity(light_init, floor_area, 'Lighting', 1, mults)\n equip = data_to_load_intensity(elec_equip_init, floor_area, 'Electric Equipment', 1, mults)\n total_load = [cooling.total, heating.total, lighting.total, equip.total]\n\n # add gas equipment if it is there\n if len(gas_equip_init) != 0:\n gas_equip = data_to_load_intensity(gas_equip_init, floor_area, 'Gas Equipment', 1, mults)\n equip = [equip, gas_equip]\n total_load.append(gas_equip.total)\n # add process load if it is there\n process = []\n if len(process1_init) != 0:\n process1 = data_to_load_intensity(process1_init, floor_area, 'Process', 1, mults)\n process2 = data_to_load_intensity(process2_init, floor_area, 'Process', 1, mults)\n process = process1 + process2\n total_load.append(process.total)\n # add hot water if it is there\n hot_water = []\n if len(shw_init) != 0:\n hot_water = data_to_load_intensity(shw_init, floor_area, 'Service Hot Water', 1, mults)\n total_load.append(hot_water.total)\n\n # construct the load balance if requested\n if run_bal_:\n if os.name == 'nt': # we are on windows; use IronPython like usual\n bal_obj = LoadBalance.from_sql_file(_model, sql)\n balance = bal_obj.load_balance_terms(True, True)\n else: # we are on Mac; sqlite3 module doesn't work in Mac IronPython\n # Execute the honybee CLI to obtain the results via CPython\n model_json = os.path.join(directory, 'in.hbjson')\n with open(model_json, 'w') as fp:\n json.dump(_model.to_dict(), fp)\n cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result',\n 'load-balance', model_json, sql]\n process = subprocess.Popen(cmds, stdout=subprocess.PIPE)\n stdout = process.communicate()\n balance = serialize_data(json.loads(stdout[0]))\n", + "code": "\nimport os\nimport subprocess\nimport json\n\ntry:\n from ladybug.futil import write_to_file_by_name, nukedir\n from ladybug.epw import EPW\n from ladybug.sql import SQLiteResult\n from ladybug.datacollection import MonthlyCollection\n from ladybug.header import Header\n from ladybug.analysisperiod import AnalysisPeriod\n from ladybug.datatype.energyintensity import EnergyIntensity\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from honeybee.config import folders\n from honeybee.model import Model\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.loadbalance import LoadBalance\n from honeybee_energy.simulation.parameter import SimulationParameter\n from honeybee_energy.run import run_idf\n from honeybee_energy.result.err import Err\n from honeybee_energy.writer import energyplus_idf_version\n from honeybee_energy.config import folders as energy_folders\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from lbt_recipes.version import check_energyplus_version\nexcept ImportError as e:\n raise ImportError('\\nFailed to import lbt_recipes:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.togeometry import to_vector2d\n from ladybug_{{cad}}.config import conversion_to_meters, units_system, \\\n tolerance, angle_tolerance\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef check_window_vent(rooms):\n \"\"\"Check a rooms to make sure there's no opening of windows as coarse timestep.\"\"\"\n for room in rooms:\n if room.properties.energy.window_vent_control is not None:\n msg = 'Window ventilation was detected but your timestep is too low ' \\\n 'to model window opening correctly.\\nIt is recommended that you ' \\\n 'increase your timestep to at least 4 to get loads for this case.'\n print(msg)\n give_warning(ghenv.Component, msg)\n\n\ndef data_to_load_intensity(data_colls, floor_area, data_type, cop=1, mults=None):\n \"\"\"Convert data collections output by EnergyPlus to a single load intensity collection.\n\n Args:\n data_colls: A list of monthly data collections for an energy term.\n floor_area: The total floor area of the rooms, used to compute EUI.\n data_type: Text for the data type of the collections (eg. \"Cooling\").\n cop: Optional number for the COP, which the results will be divided by.\n \"\"\"\n if len(data_colls) != 0:\n if mults is not None:\n if 'Zone' in data_colls[0].header.metadata:\n rel_mults = [mults[data.header.metadata['Zone']] for data in data_colls]\n data_colls = [dat * mul for dat, mul in zip(data_colls, rel_mults)]\n total_vals = [sum(month_vals) / floor_area for month_vals in zip(*data_colls)]\n if cop != 1:\n total_vals = [val / cop for val in total_vals]\n else: # just make a \"filler\" collection of 0 values\n total_vals = [0] * 12\n meta_dat = {'type': data_type}\n total_head = Header(EnergyIntensity(), 'kWh/m2', AnalysisPeriod(), meta_dat)\n return MonthlyCollection(total_head, total_vals, range(12))\n\n\ndef serialize_data(data_dicts):\n \"\"\"Reserialize a list of MonthlyCollection dictionaries.\"\"\"\n return [MonthlyCollection.from_dict(data) for data in data_dicts]\n\n\n# List of all the output strings that will be requested\ncool_out = 'Zone Ideal Loads Supply Air Total Cooling Energy'\nheat_out = 'Zone Ideal Loads Supply Air Total Heating Energy'\nlight_out = 'Zone Lights Electricity Energy'\nel_equip_out = 'Zone Electric Equipment Electricity Energy'\ngas_equip_out = 'Zone Gas Equipment NaturalGas Energy'\nprocess1_out = 'Zone Other Equipment Total Heating Energy'\nprocess2_out = 'Zone Other Equipment Lost Heat Energy'\nshw_out = 'Water Use Equipment Heating Energy'\ngl_el_equip_out = 'Zone Electric Equipment Total Heating Energy'\ngl_gas_equip_out = 'Zone Gas Equipment Total Heating Energy'\ngl1_shw_out = 'Water Use Equipment Zone Sensible Heat Gain Energy'\ngl2_shw_out = 'Water Use Equipment Zone Latent Gain Energy'\nenergy_output = (cool_out, heat_out, light_out, el_equip_out, gas_equip_out,\n process1_out, process2_out, shw_out)\n\n\nif all_required_inputs(ghenv.Component) and _run:\n # check the presence of energyplus and check that the version is compatible\n check_energyplus_version()\n\n # set defaults for COP\n _heat_cop_ = 1 if _heat_cop_ is None else _heat_cop_\n _cool_cop_ = 1 if _cool_cop_ is None else _cool_cop_\n\n # create the Model from the _rooms and shades_\n _model = Model('Annual_Loads', _rooms, orphaned_shades=shades_, units=units_system(),\n tolerance=tolerance, angle_tolerance=angle_tolerance)\n floor_area = _model.floor_area\n assert floor_area != 0, 'Connected _rooms have no floors with which to compute EUI.'\n floor_area = floor_area * conversion_to_meters() ** 2\n mults = {rm.identifier.upper(): rm.multiplier for rm in _model.rooms}\n mults = None if all(mul == 1 for mul in mults.values()) else mults\n\n # process the simulation folder name and the directory\n directory = os.path.join(folders.default_simulation_folder, _model.identifier)\n sch_directory = os.path.join(directory, 'schedules')\n nukedir(directory) # delete any existing files in the directory\n\n # create simulation parameters for the coarsest/fastest E+ sim possible\n _sim_par_ = SimulationParameter()\n _sim_par_.timestep = _timestep_ if _timestep_ is not None else 1\n _sim_par_.shadow_calculation.solar_distribution = 'FullExterior'\n _sim_par_.output.add_zone_energy_use()\n _sim_par_.output.reporting_frequency = 'Monthly'\n if run_bal_:\n _sim_par_.output.add_output(gl_el_equip_out)\n _sim_par_.output.add_output(gl_gas_equip_out)\n _sim_par_.output.add_output(gl1_shw_out)\n _sim_par_.output.add_output(gl2_shw_out)\n _sim_par_.output.add_gains_and_losses('Total')\n _sim_par_.output.add_surface_energy_flow()\n # set the north if it is not defaulted\n if _north_ is not None:\n try:\n _sim_par_.north_vector = to_vector2d(_north_)\n except AttributeError: # north angle instead of vector\n _sim_par_.north_angle = float(_north_)\n\n # check the rooms for inaccurate cases\n if _sim_par_.timestep < 4:\n check_window_vent(_rooms)\n\n # assign design days from the EPW\n msg = None\n folder, epw_file_name = os.path.split(_epw_file)\n ddy_file = os.path.join(folder, epw_file_name.replace('.epw', '.ddy'))\n if os.path.isfile(ddy_file):\n try:\n _sim_par_.sizing_parameter.add_from_ddy_996_004(ddy_file)\n except AssertionError:\n msg = 'No design days were found in the .ddy file next to the _epw_file.'\n else:\n msg = 'No .ddy file was found next to the _epw_file.'\n if msg is not None:\n epw_obj = EPW(_epw_file)\n des_days = [epw_obj.approximate_design_day('WinterDesignDay'),\n epw_obj.approximate_design_day('SummerDesignDay')]\n _sim_par_.sizing_parameter.design_days = des_days\n msg = msg + '\\nDesign days were generated from the input _epw_file but this ' \\\n '\\nis not as accurate as design days from DDYs distributed with the EPW.'\n give_warning(ghenv.Component, msg)\n print(msg)\n\n # create the strings for simulation paramters and model\n ver_str = energyplus_idf_version() if energy_folders.energyplus_version \\\n is not None else energyplus_idf_version(compatibe_ep_version)\n sim_par_str = _sim_par_.to_idf()\n model_str = _model.to.idf(\n _model, schedule_directory=sch_directory, patch_missing_adjacencies=True)\n idf_str = '\\n\\n'.join([ver_str, sim_par_str, model_str])\n\n # write the final string into an IDF\n idf = os.path.join(directory, 'in.idf')\n write_to_file_by_name(directory, 'in.idf', idf_str, True)\n\n # run the IDF through EnergyPlus\n silent = True if _run == 1 else False\n sql, zsz, rdd, html, err = run_idf(idf, _epw_file, silent=silent)\n if html is None and err is not None: # something went wrong; parse the errors\n err_obj = Err(err)\n print(err_obj.file_contents)\n for error in err_obj.fatal_errors:\n raise Exception(error)\n\n # parse the result sql and get the monthly data collections\n if os.name == 'nt': # we are on windows; use IronPython like usual\n sql_obj = SQLiteResult(sql)\n cool_init = sql_obj.data_collections_by_output_name(cool_out)\n heat_init = sql_obj.data_collections_by_output_name(heat_out)\n light_init = sql_obj.data_collections_by_output_name(light_out)\n elec_equip_init = sql_obj.data_collections_by_output_name(el_equip_out)\n gas_equip_init = sql_obj.data_collections_by_output_name(gas_equip_out)\n process1_init = sql_obj.data_collections_by_output_name(process1_out)\n process2_init = sql_obj.data_collections_by_output_name(process2_out)\n shw_init = sql_obj.data_collections_by_output_name(shw_out)\n else: # we are on Mac; sqlite3 module doesn't work in Mac IronPython\n # Execute the honybee CLI to obtain the results via CPython\n cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result',\n 'data-by-outputs', sql]\n for outp in energy_output:\n cmds.append('[\"{}\"]'.format(outp))\n process = subprocess.Popen(cmds, stdout=subprocess.PIPE)\n stdout = process.communicate()\n data_coll_dicts = json.loads(stdout[0])\n cool_init = serialize_data(data_coll_dicts[0])\n heat_init = serialize_data(data_coll_dicts[1])\n light_init = serialize_data(data_coll_dicts[2])\n elec_equip_init = serialize_data(data_coll_dicts[3])\n gas_equip_init = serialize_data(data_coll_dicts[4])\n process1_init = serialize_data(data_coll_dicts[5])\n process2_init = serialize_data(data_coll_dicts[6])\n shw_init = serialize_data(data_coll_dicts[7])\n\n # convert the results to EUI and ouput them\n cooling = data_to_load_intensity(cool_init, floor_area, 'Cooling', _cool_cop_)\n heating = data_to_load_intensity(heat_init, floor_area, 'Heating', _heat_cop_)\n lighting = data_to_load_intensity(light_init, floor_area, 'Lighting', 1, mults)\n equip = data_to_load_intensity(elec_equip_init, floor_area, 'Electric Equipment', 1, mults)\n total_load = [cooling.total, heating.total, lighting.total, equip.total]\n\n # add gas equipment if it is there\n if len(gas_equip_init) != 0:\n gas_equip = data_to_load_intensity(gas_equip_init, floor_area, 'Gas Equipment', 1, mults)\n equip = [equip, gas_equip]\n total_load.append(gas_equip.total)\n # add process load if it is there\n process = []\n if len(process1_init) != 0:\n process1 = data_to_load_intensity(process1_init, floor_area, 'Process', 1, mults)\n process2 = data_to_load_intensity(process2_init, floor_area, 'Process', 1, mults)\n process = process1 + process2\n total_load.append(process.total)\n # add hot water if it is there\n hot_water = []\n if len(shw_init) != 0:\n hot_water = data_to_load_intensity(shw_init, floor_area, 'Service Hot Water', 1, mults)\n total_load.append(hot_water.total)\n\n # construct the load balance if requested\n if run_bal_:\n if os.name == 'nt': # we are on windows; use IronPython like usual\n bal_obj = LoadBalance.from_sql_file(_model, sql)\n balance = bal_obj.load_balance_terms(True, True)\n else: # we are on Mac; sqlite3 module doesn't work in Mac IronPython\n # Execute the honybee CLI to obtain the results via CPython\n model_json = os.path.join(directory, 'in.hbjson')\n with open(model_json, 'w') as fp:\n json.dump(_model.to_dict(), fp)\n cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result',\n 'load-balance', model_json, sql]\n process = subprocess.Popen(cmds, stdout=subprocess.PIPE)\n stdout = process.communicate()\n balance = serialize_data(json.loads(stdout[0]))\n", "category": "HB-Energy", "name": "HB Annual Loads", "description": "Run Honeybee Rooms through a quick energy simulation to obtain an estimate of\nannual heating, cooling, lighting, equipment, and service hot water loads.\n_\nNote that the default settings used by this component are only suitable for evaluating\nannual loads in the case where an error of up to 5% is acceptable. Also\nnote that annual loads are not the same as annual energy use or utility costs\nand, while the \"cop\" inputs can be used to approximate some effects of real\nheating + cooling systems, any evaulation of actual energy use, utility costs,\nor GHG emissions should be done by modeling a detailed HVAC using the \"HB\nModel to OSM\" component.\n-" diff --git a/honeybee_grasshopper_energy/json/HB_Balance_Temperature.json b/honeybee_grasshopper_energy/json/HB_Balance_Temperature.json index 03940436..e54954a4 100644 --- a/honeybee_grasshopper_energy/json/HB_Balance_Temperature.json +++ b/honeybee_grasshopper_energy/json/HB_Balance_Temperature.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "BalTemp", "outputs": [ [ @@ -50,7 +50,7 @@ } ], "subcategory": "6 :: Result", - "code": "\ntry:\n from ladybug.datacollection import HourlyContinuousCollection, DailyCollection\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef sum_collection(data):\n \"\"\"Sum a list of data collections into a single daily collection.\"\"\"\n total_data = data[0]\n for data_i in data[1:]:\n total_data = total_data + data_i\n if isinstance(total_data, HourlyContinuousCollection):\n total_data = total_data.average_daily()\n elif not isinstance(total_data, DailyCollection):\n raise TypeError('Expected Hourly or Daily data collection. '\n 'Got {}'.format(type(_temperature)))\n return total_data\n\n\nif all_required_inputs(ghenv.Component):\n # set the defaut day count and ensure temperature is daily\n _day_count_ = 10 if _day_count_ is None else _day_count_\n if isinstance(_temperature, HourlyContinuousCollection):\n _temperature = _temperature.average_daily()\n elif not isinstance(_temperature, DailyCollection):\n raise TypeError('Expected Hourly or Daily data collection for '\n '_temperature. Got {}'.format(type(_temperature)))\n\n # convert the heating and cooling collections to a single daily balance\n total_cool = sum_collection(_cooling)\n total_heat = sum_collection(_heating)\n total_load = total_cool + total_heat\n\n # check that all data collections are annual\n assert len(total_load) >= 365, 'Cooling and heating loads are not annual.'\n assert len(_temperature) >= 365, 'Temperature is not annual.'\n\n # sort the load to find the days with the lowest load\n temp_sort = []\n load_sort = []\n for i, (load, temp) in enumerate(sorted(zip(total_load, _temperature))):\n if i == _day_count_:\n break\n temp_sort.append(temp)\n load_sort.append(load)\n\n # return the average temperature and balance day load\n print len(temp_sort)\n bal_day_load = sum(load_sort) / _day_count_\n bal_temp = sum(temp_sort) / _day_count_\n", + "code": "\ntry:\n from ladybug.datacollection import HourlyContinuousCollection, DailyCollection\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef sum_collection(data):\n \"\"\"Sum a list of data collections into a single daily collection.\"\"\"\n total_data = data[0]\n for data_i in data[1:]:\n total_data = total_data + data_i\n if isinstance(total_data, HourlyContinuousCollection):\n total_data = total_data.average_daily()\n elif not isinstance(total_data, DailyCollection):\n raise TypeError('Expected Hourly or Daily data collection. '\n 'Got {}'.format(type(_temperature)))\n return total_data\n\n\nif all_required_inputs(ghenv.Component):\n # set the defaut day count and ensure temperature is daily\n _day_count_ = 10 if _day_count_ is None else _day_count_\n if isinstance(_temperature, HourlyContinuousCollection):\n _temperature = _temperature.average_daily()\n elif not isinstance(_temperature, DailyCollection):\n raise TypeError('Expected Hourly or Daily data collection for '\n '_temperature. Got {}'.format(type(_temperature)))\n\n # convert the heating and cooling collections to a single daily balance\n total_cool = sum_collection(_cooling)\n total_heat = sum_collection(_heating)\n total_load = total_cool + total_heat\n\n # check that all data collections are annual\n assert len(total_load) >= 365, 'Cooling and heating loads are not annual.'\n assert len(_temperature) >= 365, 'Temperature is not annual.'\n\n # sort the load to find the days with the lowest load\n temp_sort = []\n load_sort = []\n for i, (load, temp) in enumerate(sorted(zip(total_load, _temperature))):\n if i == _day_count_:\n break\n temp_sort.append(temp)\n load_sort.append(load)\n\n # return the average temperature and balance day load\n bal_day_load = sum(load_sort) / _day_count_\n bal_temp = sum(temp_sort) / _day_count_\n", "category": "HB-Energy", "name": "HB Balance Temperature", "description": "Calculate a building (or zone) balance temperature from a ideal air load simulation\nresults. The balance point is the outdoor temperature at which a building switches\nbetween heating and cooling.\n_\nIf the outdoor temperture drops below the balance temperature, the building will\nusually be in heating mode and, if the outdoor temperture is above the balance\ntemperature, the building will usually be in cooling mode.\n_\nThe balance temperture concept is useful for setting things such as automated\nblinds and airflow schedules since having these things directly controlled by\nhourly cooling or heating demand isn't always straightforward.\n_\nThis component works by taking the average combined heating/cooling values for\neach day and the average outdoor air temperature for each day. The days with\nthe smallest combined heating + cooling will have their daily mean outdoor air\ntempertures averaged to produce the output balance temperture.\n-" diff --git a/honeybee_grasshopper_energy/json/HB_Run_IDF.json b/honeybee_grasshopper_energy/json/HB_Run_IDF.json index 2ec05914..7f116060 100644 --- a/honeybee_grasshopper_energy/json/HB_Run_IDF.json +++ b/honeybee_grasshopper_energy/json/HB_Run_IDF.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "RunIDF", "outputs": [ [ @@ -71,7 +71,7 @@ } ], "subcategory": "5 :: Simulate", - "code": "\nimport os\nimport shutil\n\ntry:\n from ladybug.futil import preparedir\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.run import run_idf\n from honeybee_energy.result.err import Err\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning, \\\n recommended_processor_count, run_function_in_parallel\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef run_idf_and_report_errors(i):\n \"\"\"Run an IDF file through EnergyPlus and report errors/warnings on this component.\"\"\"\n # process the additional strings\n idf_i = idfs[i]\n if add_str_ != [] and add_str_[0] is not None:\n a_str = '/n'.join(add_str_)\n with open(idf_i, \"a\") as idf_file:\n idf_file.write(a_str)\n sql_i, zsz_i, rdd_i, html_i, err_i = run_idf(idf_i, _epw_file, silent=silent)\n\n # report any errors on this component\n if err_i is not None:\n err_obj = Err(err_i)\n err_objs[i] = err_obj\n for warn in err_obj.severe_errors:\n give_warning(ghenv.Component, warn)\n for error in err_obj.fatal_errors:\n print err_obj.file_contents # print before raising the error\n raise Exception(error)\n\n # append everything to the global lists\n sql[i] = sql_i\n zsz[i] = zsz_i\n rdd[i] = rdd_i\n html[i] = html_i\n err[i] = err_i\n\n\nif all_required_inputs(ghenv.Component) and _run:\n # global lists of outputs to be filled\n iter_count = len(_idf)\n sql = [None] * iter_count\n zsz = [None] * iter_count\n rdd = [None] * iter_count\n html = [None] * iter_count\n err = [None] * iter_count\n err_objs = [None] * iter_count\n\n # copy the IDFs into a sub-directory if they are not already labeled as in.idf\n idfs = []\n for idf_file_path in _idf:\n idf_dir, idf_file_name = os.path.split(idf_file_path)\n if idf_file_name != 'in.idf': # copy the IDF file into a sub-directory\n sub_dir = os.path.join(idf_dir, 'run')\n target = os.path.join(sub_dir, 'in.idf')\n preparedir(sub_dir)\n shutil.copy(idf_file_path, target)\n idfs.append(target)\n else:\n idfs.append(idf_file_path)\n\n # run the IDF files through E+\n silent = True if _run == 2 else False\n if _cpu_count_ is not None:\n workers = _cpu_count_\n else:\n workers = recommended_processor_count() if iter_count != 1 else 1\n run_function_in_parallel(run_idf_and_report_errors, iter_count, workers)\n\n # print out error report if it's only one\n # otherwise it's too much data to be read-able\n if len(err_objs) == 1:\n print(err_objs[0].file_contents)\n", + "code": "\nimport os\nimport shutil\n\ntry:\n from ladybug.futil import preparedir\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.run import run_idf\n from honeybee_energy.result.err import Err\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning, \\\n recommended_processor_count, run_function_in_parallel\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef run_idf_and_report_errors(i):\n \"\"\"Run an IDF file through EnergyPlus and report errors/warnings on this component.\"\"\"\n # process the additional strings\n idf_i = idfs[i]\n if add_str_ != [] and add_str_[0] is not None:\n a_str = '/n'.join(add_str_)\n with open(idf_i, \"a\") as idf_file:\n idf_file.write(a_str)\n sql_i, zsz_i, rdd_i, html_i, err_i = run_idf(idf_i, _epw_file, silent=silent)\n\n # report any errors on this component\n if err_i is not None:\n err_obj = Err(err_i)\n err_objs[i] = err_obj\n for warn in err_obj.severe_errors:\n give_warning(ghenv.Component, warn)\n for error in err_obj.fatal_errors:\n print(err_obj.file_contents) # print before raising the error\n raise Exception(error)\n\n # append everything to the global lists\n sql[i] = sql_i\n zsz[i] = zsz_i\n rdd[i] = rdd_i\n html[i] = html_i\n err[i] = err_i\n\n\nif all_required_inputs(ghenv.Component) and _run:\n # global lists of outputs to be filled\n iter_count = len(_idf)\n sql = [None] * iter_count\n zsz = [None] * iter_count\n rdd = [None] * iter_count\n html = [None] * iter_count\n err = [None] * iter_count\n err_objs = [None] * iter_count\n\n # copy the IDFs into a sub-directory if they are not already labeled as in.idf\n idfs = []\n for idf_file_path in _idf:\n idf_dir, idf_file_name = os.path.split(idf_file_path)\n if idf_file_name != 'in.idf': # copy the IDF file into a sub-directory\n sub_dir = os.path.join(idf_dir, 'run')\n target = os.path.join(sub_dir, 'in.idf')\n preparedir(sub_dir)\n shutil.copy(idf_file_path, target)\n idfs.append(target)\n else:\n idfs.append(idf_file_path)\n\n # run the IDF files through E+\n silent = True if _run == 2 else False\n if _cpu_count_ is not None:\n workers = _cpu_count_\n else:\n workers = recommended_processor_count() if iter_count != 1 else 1\n run_function_in_parallel(run_idf_and_report_errors, iter_count, workers)\n\n # print out error report if it's only one\n # otherwise it's too much data to be read-able\n if len(err_objs) == 1:\n print(err_objs[0].file_contents)\n", "category": "HB-Energy", "name": "HB Run IDF", "description": "Run an IDF file through EnergyPlus.\n-" diff --git a/honeybee_grasshopper_energy/json/HB_Run_OSM.json b/honeybee_grasshopper_energy/json/HB_Run_OSM.json index a631bcef..2379bb5f 100644 --- a/honeybee_grasshopper_energy/json/HB_Run_OSM.json +++ b/honeybee_grasshopper_energy/json/HB_Run_OSM.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "RunOSM", "outputs": [ [ @@ -85,7 +85,7 @@ } ], "subcategory": "5 :: Simulate", - "code": "\nimport os\nimport json\n\ntry:\n from honeybee_energy.run import run_osw, run_idf\n from honeybee_energy.result.err import Err\n from honeybee_energy.result.osw import OSW\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning, \\\n recommended_processor_count, run_function_in_parallel\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef run_osm_and_report_errors(i):\n \"\"\"Run an OSW through OpenStudio CLI.\"\"\"\n # create a blank osw for the translation\n osw_dict = {\n 'seed_file': _osm[i],\n 'weather_file': _epw_file\n }\n osw_directory = os.path.dirname(_osm[i])\n sch_directory1 = os.path.join(os.path.dirname(osw_directory), 'schedules')\n sch_directory2 = os.path.join(osw_directory, 'schedules')\n if os.path.isdir(sch_directory1):\n osw_dict['file_paths'] = [sch_directory1]\n elif os.path.isdir(sch_directory2):\n osw_dict['file_paths'] = [sch_directory2]\n osw = os.path.join(osw_directory, 'workflow.osw')\n with open(osw, 'w') as fp:\n json.dump(osw_dict, fp, indent=4)\n\n # get an IDF from the OSM using the OpenStudio CLI\n osm_i, idf_i = run_osw(osw, silent=silent)\n if idf_i is None:\n log_osw = OSW(os.path.join(osw_directory, 'out.osw'))\n errors = []\n print(log_osw.stdout)\n for error, tb in zip(log_osw.errors, log_osw.error_tracebacks):\n print(tb)\n errors.append(error)\n raise Exception('Failed to run OpenStudio CLI:\\n{}'.format('\\n'.join(errors)))\n\n # process the additional strings\n if add_str_ != [] and add_str_[0] is not None and idf is not None:\n a_str = '/n'.join(add_str_)\n with open(idf_i, \"a\") as idf_file:\n idf_file.write(a_str)\n osm[i] = osm_i\n idf[i] = idf_i\n\n # run the IDF through EnergyPlus\n if run_:\n sql_i, zsz_i, rdd_i, html_i, err_i = run_idf(idf_i, _epw_file, silent=silent)\n\n # report any errors on this component\n if err_i is not None:\n err_obj = Err(err_i)\n err_objs[i] = err_obj\n for warn in err_obj.severe_errors:\n give_warning(ghenv.Component, warn)\n for error in err_obj.fatal_errors:\n print err_obj.file_contents # print before raising the error\n raise Exception(error)\n\n # append everything to the global lists\n sql[i] = sql_i\n zsz[i] = zsz_i\n rdd[i] = rdd_i\n html[i] = html_i\n err[i] = err_i\n\n\nif all_required_inputs(ghenv.Component) and _translate:\n # global lists of outputs to be filled\n iter_count = len(_osm)\n osm = [None] * iter_count\n idf = [None] * iter_count\n sql = [None] * iter_count\n zsz = [None] * iter_count\n rdd = [None] * iter_count\n html = [None] * iter_count\n err = [None] * iter_count\n err_objs = [None] * iter_count\n\n # run the OSW files through OpenStudio CLI\n silent = True if run_ == 2 else False\n if _cpu_count_ is not None:\n workers = _cpu_count_\n else:\n workers = recommended_processor_count() if iter_count != 1 else 1\n run_function_in_parallel(run_osm_and_report_errors, iter_count, workers)\n\n # print out error report if it's only one file\n # otherwise it's too much data to be read-able\n if len(err_objs) == 1 and err_objs[0] is not None:\n print(err_objs[0].file_contents)\n", + "code": "\nimport os\nimport json\n\ntry:\n from honeybee_energy.run import run_osw, run_idf\n from honeybee_energy.result.err import Err\n from honeybee_energy.result.osw import OSW\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning, \\\n recommended_processor_count, run_function_in_parallel\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef run_osm_and_report_errors(i):\n \"\"\"Run an OSW through OpenStudio CLI.\"\"\"\n # create a blank osw for the translation\n osw_dict = {\n 'seed_file': _osm[i],\n 'weather_file': _epw_file\n }\n osw_directory = os.path.dirname(_osm[i])\n sch_directory1 = os.path.join(os.path.dirname(osw_directory), 'schedules')\n sch_directory2 = os.path.join(osw_directory, 'schedules')\n if os.path.isdir(sch_directory1):\n osw_dict['file_paths'] = [sch_directory1]\n elif os.path.isdir(sch_directory2):\n osw_dict['file_paths'] = [sch_directory2]\n osw = os.path.join(osw_directory, 'workflow.osw')\n with open(osw, 'w') as fp:\n json.dump(osw_dict, fp, indent=4)\n\n # get an IDF from the OSM using the OpenStudio CLI\n osm_i, idf_i = run_osw(osw, silent=silent)\n if idf_i is None:\n log_osw = OSW(os.path.join(osw_directory, 'out.osw'))\n errors = []\n print(log_osw.stdout)\n for error, tb in zip(log_osw.errors, log_osw.error_tracebacks):\n print(tb)\n errors.append(error)\n raise Exception('Failed to run OpenStudio CLI:\\n{}'.format('\\n'.join(errors)))\n\n # process the additional strings\n if add_str_ != [] and add_str_[0] is not None and idf is not None:\n a_str = '/n'.join(add_str_)\n with open(idf_i, \"a\") as idf_file:\n idf_file.write(a_str)\n osm[i] = osm_i\n idf[i] = idf_i\n\n # run the IDF through EnergyPlus\n if run_:\n sql_i, zsz_i, rdd_i, html_i, err_i = run_idf(idf_i, _epw_file, silent=silent)\n\n # report any errors on this component\n if err_i is not None:\n err_obj = Err(err_i)\n err_objs[i] = err_obj\n for warn in err_obj.severe_errors:\n give_warning(ghenv.Component, warn)\n for error in err_obj.fatal_errors:\n print(err_obj.file_contents) # print before raising the error\n raise Exception(error)\n\n # append everything to the global lists\n sql[i] = sql_i\n zsz[i] = zsz_i\n rdd[i] = rdd_i\n html[i] = html_i\n err[i] = err_i\n\n\nif all_required_inputs(ghenv.Component) and _translate:\n # global lists of outputs to be filled\n iter_count = len(_osm)\n osm = [None] * iter_count\n idf = [None] * iter_count\n sql = [None] * iter_count\n zsz = [None] * iter_count\n rdd = [None] * iter_count\n html = [None] * iter_count\n err = [None] * iter_count\n err_objs = [None] * iter_count\n\n # run the OSW files through OpenStudio CLI\n silent = True if run_ == 2 else False\n if _cpu_count_ is not None:\n workers = _cpu_count_\n else:\n workers = recommended_processor_count() if iter_count != 1 else 1\n run_function_in_parallel(run_osm_and_report_errors, iter_count, workers)\n\n # print out error report if it's only one file\n # otherwise it's too much data to be read-able\n if len(err_objs) == 1 and err_objs[0] is not None:\n print(err_objs[0].file_contents)\n", "category": "HB-Energy", "name": "HB Run OSM", "description": "Translate a fully-simualte-able OpenStudio model (.osm) to an IDF and run the it\nthrough EnergyPlus.\n-" diff --git a/honeybee_grasshopper_energy/json/HB_Run_OSW.json b/honeybee_grasshopper_energy/json/HB_Run_OSW.json index 9084b6ad..2b87abd9 100644 --- a/honeybee_grasshopper_energy/json/HB_Run_OSW.json +++ b/honeybee_grasshopper_energy/json/HB_Run_OSW.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "RunOSW", "outputs": [ [ @@ -92,7 +92,7 @@ } ], "subcategory": "5 :: Simulate", - "code": "\ntry:\n from honeybee_energy.run import run_osw, run_idf\n from honeybee_energy.result.err import Err\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning, \\\n recommended_processor_count, run_function_in_parallel\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef run_osw_and_report_errors(i):\n \"\"\"Run an OSW through OpenStudio CLI.\"\"\"\n osw = _osw[i]\n osm_i, idf_i = run_osw(osw, silent=silent)\n # process the additional strings\n if add_str_ != [] and add_str_[0] is not None and idf is not None:\n add_str = '/n'.join(add_str_)\n with open(idf_i, \"a\") as idf_file:\n idf_file.write(add_str)\n osm[i] = osm_i\n idf[i] = idf_i\n\n # run the IDF through EnergyPlus\n if run_:\n sql_i, zsz_i, rdd_i, html_i, err_i = run_idf(idf_i, _epw_file, silent=silent)\n\n # report any errors on this component\n if err_i is not None:\n err_obj = Err(err_i)\n err_objs[i] = err_obj\n for warn in err_obj.severe_errors:\n give_warning(ghenv.Component, warn)\n for error in err_obj.fatal_errors:\n print err_obj.file_contents # print before raising the error\n raise Exception(error)\n\n # append everything to the global lists\n sql[i] = sql_i\n zsz[i] = zsz_i\n rdd[i] = rdd_i\n html[i] = html_i\n err[i] = err_i\n\n\nif all_required_inputs(ghenv.Component) and _translate:\n # global lists of outputs to be filled\n iter_count = len(_osw)\n osm = [None] * iter_count\n idf = [None] * iter_count\n sql = [None] * iter_count\n zsz = [None] * iter_count\n rdd = [None] * iter_count\n html = [None] * iter_count\n err = [None] * iter_count\n err_objs = [None] * iter_count\n\n # run the OSW files through OpenStudio CLI\n silent = True if run_ == 2 else False\n workers = _cpu_count_ if _cpu_count_ is not None else recommended_processor_count()\n run_function_in_parallel(run_osw_and_report_errors, iter_count, workers)\n\n # print out error report if it's only one file\n # otherwise it's too much data to be read-able\n if len(err_objs) == 1 and err_objs[0] is not None:\n print(err_objs[0].file_contents)\n", + "code": "\ntry:\n from honeybee_energy.run import run_osw, run_idf\n from honeybee_energy.result.err import Err\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning, \\\n recommended_processor_count, run_function_in_parallel\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef run_osw_and_report_errors(i):\n \"\"\"Run an OSW through OpenStudio CLI.\"\"\"\n osw = _osw[i]\n osm_i, idf_i = run_osw(osw, silent=silent)\n # process the additional strings\n if add_str_ != [] and add_str_[0] is not None and idf is not None:\n add_str = '/n'.join(add_str_)\n with open(idf_i, \"a\") as idf_file:\n idf_file.write(add_str)\n osm[i] = osm_i\n idf[i] = idf_i\n\n # run the IDF through EnergyPlus\n if run_:\n sql_i, zsz_i, rdd_i, html_i, err_i = run_idf(idf_i, _epw_file, silent=silent)\n\n # report any errors on this component\n if err_i is not None:\n err_obj = Err(err_i)\n err_objs[i] = err_obj\n for warn in err_obj.severe_errors:\n give_warning(ghenv.Component, warn)\n for error in err_obj.fatal_errors:\n print(err_obj.file_contents) # print before raising the error\n raise Exception(error)\n\n # append everything to the global lists\n sql[i] = sql_i\n zsz[i] = zsz_i\n rdd[i] = rdd_i\n html[i] = html_i\n err[i] = err_i\n\n\nif all_required_inputs(ghenv.Component) and _translate:\n # global lists of outputs to be filled\n iter_count = len(_osw)\n osm = [None] * iter_count\n idf = [None] * iter_count\n sql = [None] * iter_count\n zsz = [None] * iter_count\n rdd = [None] * iter_count\n html = [None] * iter_count\n err = [None] * iter_count\n err_objs = [None] * iter_count\n\n # run the OSW files through OpenStudio CLI\n silent = True if run_ == 2 else False\n workers = _cpu_count_ if _cpu_count_ is not None else recommended_processor_count()\n run_function_in_parallel(run_osw_and_report_errors, iter_count, workers)\n\n # print out error report if it's only one file\n # otherwise it's too much data to be read-able\n if len(err_objs) == 1 and err_objs[0] is not None:\n print(err_objs[0].file_contents)\n", "category": "HB-Energy", "name": "HB Run OSW", "description": "Execute an OpenStudio workflow (.osw) and run the resulting IDF file through\nEnergyPlus.\n-" diff --git a/honeybee_grasshopper_energy/json/HB_Thermal_Load_Balance.json b/honeybee_grasshopper_energy/json/HB_Thermal_Load_Balance.json index 68b65b71..7ce6314d 100644 --- a/honeybee_grasshopper_energy/json/HB_Thermal_Load_Balance.json +++ b/honeybee_grasshopper_energy/json/HB_Thermal_Load_Balance.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "LoadBalance", "outputs": [ [ @@ -134,7 +134,7 @@ } ], "subcategory": "6 :: Result", - "code": "\ntry:\n from honeybee.model import Model\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.loadbalance import LoadBalance\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.config import units_system\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef check_input(input_list):\n \"\"\"Check that an input isn't a zero-length list or None.\"\"\"\n return None if len(input_list) == 0 or input_list[0] is None else input_list\n\n\nif all_required_inputs(ghenv.Component):\n # extract any rooms from input Models\n is_model, floor_area = False, 0\n rooms = []\n for hb_obj in _rooms_model:\n if isinstance(hb_obj, Model):\n rooms.extend(hb_obj.rooms)\n is_model = True\n floor_area += hb_obj.floor_area\n else:\n rooms.append(hb_obj)\n\n # if the input is for individual rooms, check the solar to ensure no groued zones\n if not is_model and len(solar_gain_) != 0:\n msg = 'Air boundaries with grouped zones detected in solar data but individual ' \\\n 'rooms were input.\\nIt is recommended that the full model be input for ' \\\n '_rooms_model to ensure correct representaiton of solar.'\n for coll in solar_gain_:\n if 'Solar Enclosure' in coll.header.metadata['Zone']:\n print msg\n give_warning(ghenv.Component, msg)\n\n # process all of the inputs\n cooling_ = check_input(cooling_)\n heating_ = check_input(heating_)\n lighting_ = check_input(lighting_)\n electric_equip_ = check_input(electric_equip_)\n gas_equip_ = check_input(gas_equip_)\n hot_water_ = check_input(hot_water_)\n people_gain_ = check_input(people_gain_)\n solar_gain_ = check_input(solar_gain_)\n infiltration_load_ = check_input(infiltration_load_)\n mech_vent_load_ = check_input(mech_vent_load_)\n nat_vent_load_ = check_input(nat_vent_load_)\n face_energy_flow_ = check_input(face_energy_flow_)\n\n # process hot water to ensure it's the correct type\n hw_type = 'Water Use Equipment Heating Energy'\n if hot_water_ is not None and hot_water_[0].header.metadata['type'] == hw_type:\n hot_water_ = [hw.duplicate() * 0.25 for hw in hot_water_]\n for hw in hot_water_:\n hw.header.metadata = {\n 'type': 'Water Use Equipment Zone Sensible Heat Gain Energy',\n 'System': hw.header.metadata['System']\n }\n\n # construct the load balance object and output the results\n load_bal_obj = LoadBalance(\n rooms, cooling_, heating_, lighting_, electric_equip_, gas_equip_, process_,\n hot_water_, people_gain_, solar_gain_, infiltration_load_, mech_vent_load_,\n nat_vent_load_, face_energy_flow_, units_system(), use_all_solar=is_model)\n if is_model:\n load_bal_obj.floor_area = floor_area\n\n balance = load_bal_obj.load_balance_terms(False, False)\n if len(balance) != 0:\n balance_stor = balance + [load_bal_obj.storage]\n norm_bal = load_bal_obj.load_balance_terms(True, False)\n norm_bal_stor = load_bal_obj.load_balance_terms(True, True)\n", + "code": "\ntry:\n from honeybee.model import Model\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.loadbalance import LoadBalance\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.config import units_system\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef check_input(input_list):\n \"\"\"Check that an input isn't a zero-length list or None.\"\"\"\n return None if len(input_list) == 0 or input_list[0] is None else input_list\n\n\nif all_required_inputs(ghenv.Component):\n # extract any rooms from input Models\n is_model, floor_area = False, 0\n rooms = []\n for hb_obj in _rooms_model:\n if isinstance(hb_obj, Model):\n rooms.extend(hb_obj.rooms)\n is_model = True\n floor_area += hb_obj.floor_area\n else:\n rooms.append(hb_obj)\n\n # if the input is for individual rooms, check the solar to ensure no groued zones\n if not is_model and len(solar_gain_) != 0:\n msg = 'Air boundaries with grouped zones detected in solar data but individual ' \\\n 'rooms were input.\\nIt is recommended that the full model be input for ' \\\n '_rooms_model to ensure correct representaiton of solar.'\n for coll in solar_gain_:\n if 'Solar Enclosure' in coll.header.metadata['Zone']:\n print(msg)\n give_warning(ghenv.Component, msg)\n\n # process all of the inputs\n cooling_ = check_input(cooling_)\n heating_ = check_input(heating_)\n lighting_ = check_input(lighting_)\n electric_equip_ = check_input(electric_equip_)\n gas_equip_ = check_input(gas_equip_)\n hot_water_ = check_input(hot_water_)\n people_gain_ = check_input(people_gain_)\n solar_gain_ = check_input(solar_gain_)\n infiltration_load_ = check_input(infiltration_load_)\n mech_vent_load_ = check_input(mech_vent_load_)\n nat_vent_load_ = check_input(nat_vent_load_)\n face_energy_flow_ = check_input(face_energy_flow_)\n\n # process hot water to ensure it's the correct type\n hw_type = 'Water Use Equipment Heating Energy'\n if hot_water_ is not None and hot_water_[0].header.metadata['type'] == hw_type:\n hot_water_ = [hw.duplicate() * 0.25 for hw in hot_water_]\n for hw in hot_water_:\n hw.header.metadata = {\n 'type': 'Water Use Equipment Zone Sensible Heat Gain Energy',\n 'System': hw.header.metadata['System']\n }\n\n # construct the load balance object and output the results\n load_bal_obj = LoadBalance(\n rooms, cooling_, heating_, lighting_, electric_equip_, gas_equip_, process_,\n hot_water_, people_gain_, solar_gain_, infiltration_load_, mech_vent_load_,\n nat_vent_load_, face_energy_flow_, units_system(), use_all_solar=is_model)\n if is_model:\n load_bal_obj.floor_area = floor_area\n\n balance = load_bal_obj.load_balance_terms(False, False)\n if len(balance) != 0:\n balance_stor = balance + [load_bal_obj.storage]\n norm_bal = load_bal_obj.load_balance_terms(True, False)\n norm_bal_stor = load_bal_obj.load_balance_terms(True, True)\n", "category": "HB-Energy", "name": "HB Thermal Load Balance", "description": "Construct a complete thermal load balance from energy simulation results and\nhoneybee Rooms or a Model.\n-" diff --git a/honeybee_grasshopper_energy/src/HB Annual Loads.py b/honeybee_grasshopper_energy/src/HB Annual Loads.py index 60762e90..ec7e2d6a 100644 --- a/honeybee_grasshopper_energy/src/HB Annual Loads.py +++ b/honeybee_grasshopper_energy/src/HB Annual Loads.py @@ -96,7 +96,7 @@ ghenv.Component.Name = 'HB Annual Loads' ghenv.Component.NickName = 'AnnualLoads' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '5 :: Simulate' ghenv.Component.AdditionalHelpFromDocStrings = '2' @@ -153,7 +153,7 @@ def check_window_vent(rooms): msg = 'Window ventilation was detected but your timestep is too low ' \ 'to model window opening correctly.\nIt is recommended that you ' \ 'increase your timestep to at least 4 to get loads for this case.' - print msg + print(msg) give_warning(ghenv.Component, msg) @@ -268,7 +268,7 @@ def serialize_data(data_dicts): msg = msg + '\nDesign days were generated from the input _epw_file but this ' \ '\nis not as accurate as design days from DDYs distributed with the EPW.' give_warning(ghenv.Component, msg) - print msg + print(msg) # create the strings for simulation paramters and model ver_str = energyplus_idf_version() if energy_folders.energyplus_version \ diff --git a/honeybee_grasshopper_energy/src/HB Balance Temperature.py b/honeybee_grasshopper_energy/src/HB Balance Temperature.py index 453db61e..73be61f4 100644 --- a/honeybee_grasshopper_energy/src/HB Balance Temperature.py +++ b/honeybee_grasshopper_energy/src/HB Balance Temperature.py @@ -55,7 +55,7 @@ ghenv.Component.Name = 'HB Balance Temperature' ghenv.Component.NickName = 'BalTemp' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '6 :: Result' ghenv.Component.AdditionalHelpFromDocStrings = '0' @@ -112,6 +112,5 @@ def sum_collection(data): load_sort.append(load) # return the average temperature and balance day load - print len(temp_sort) bal_day_load = sum(load_sort) / _day_count_ bal_temp = sum(temp_sort) / _day_count_ diff --git a/honeybee_grasshopper_energy/src/HB Run IDF.py b/honeybee_grasshopper_energy/src/HB Run IDF.py index a0fb2d41..4d05a135 100644 --- a/honeybee_grasshopper_energy/src/HB Run IDF.py +++ b/honeybee_grasshopper_energy/src/HB Run IDF.py @@ -47,7 +47,7 @@ ghenv.Component.Name = 'HB Run IDF' ghenv.Component.NickName = 'RunIDF' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '5 :: Simulate' ghenv.Component.AdditionalHelpFromDocStrings = '5' @@ -90,7 +90,7 @@ def run_idf_and_report_errors(i): for warn in err_obj.severe_errors: give_warning(ghenv.Component, warn) for error in err_obj.fatal_errors: - print err_obj.file_contents # print before raising the error + print(err_obj.file_contents) # print before raising the error raise Exception(error) # append everything to the global lists diff --git a/honeybee_grasshopper_energy/src/HB Run OSM.py b/honeybee_grasshopper_energy/src/HB Run OSM.py index 59405be6..dc2cdd48 100644 --- a/honeybee_grasshopper_energy/src/HB Run OSM.py +++ b/honeybee_grasshopper_energy/src/HB Run OSM.py @@ -52,7 +52,7 @@ ghenv.Component.Name = 'HB Run OSM' ghenv.Component.NickName = 'RunOSM' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '5 :: Simulate' ghenv.Component.AdditionalHelpFromDocStrings = '5' @@ -122,7 +122,7 @@ def run_osm_and_report_errors(i): for warn in err_obj.severe_errors: give_warning(ghenv.Component, warn) for error in err_obj.fatal_errors: - print err_obj.file_contents # print before raising the error + print(err_obj.file_contents) # print before raising the error raise Exception(error) # append everything to the global lists diff --git a/honeybee_grasshopper_energy/src/HB Run OSW.py b/honeybee_grasshopper_energy/src/HB Run OSW.py index cf888091..b5551af6 100644 --- a/honeybee_grasshopper_energy/src/HB Run OSW.py +++ b/honeybee_grasshopper_energy/src/HB Run OSW.py @@ -55,7 +55,7 @@ ghenv.Component.Name = 'HB Run OSW' ghenv.Component.NickName = 'RunOSW' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '5 :: Simulate' ghenv.Component.AdditionalHelpFromDocStrings = '4' @@ -96,7 +96,7 @@ def run_osw_and_report_errors(i): for warn in err_obj.severe_errors: give_warning(ghenv.Component, warn) for error in err_obj.fatal_errors: - print err_obj.file_contents # print before raising the error + print(err_obj.file_contents) # print before raising the error raise Exception(error) # append everything to the global lists diff --git a/honeybee_grasshopper_energy/src/HB Thermal Load Balance.py b/honeybee_grasshopper_energy/src/HB Thermal Load Balance.py index 9eca63ff..7b905bd4 100644 --- a/honeybee_grasshopper_energy/src/HB Thermal Load Balance.py +++ b/honeybee_grasshopper_energy/src/HB Thermal Load Balance.py @@ -67,7 +67,7 @@ ghenv.Component.Name = 'HB Thermal Load Balance' ghenv.Component.NickName = 'LoadBalance' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '6 :: Result' ghenv.Component.AdditionalHelpFromDocStrings = '3' @@ -113,7 +113,7 @@ def check_input(input_list): '_rooms_model to ensure correct representaiton of solar.' for coll in solar_gain_: if 'Solar Enclosure' in coll.header.metadata['Zone']: - print msg + print(msg) give_warning(ghenv.Component, msg) # process all of the inputs diff --git a/honeybee_grasshopper_energy/user_objects/HB Annual Loads.ghuser b/honeybee_grasshopper_energy/user_objects/HB Annual Loads.ghuser index 19e82a45c66f8953a5766422da3b5a1495384c21..8dc48db072cf0817a34c50e6f2cef99c507d5044 100644 GIT binary patch literal 10520 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 aKck@QxLN%FKVf3>1BHcwI{*Ga3HmQs_`m@G literal 10505 zcmV+kDfZS~dIeM*O_w(A1a}+UB}jsMaCZwZzyO2W;BLW!1$QS9Jh;2NYj7vH1Yh#L z`|bYw_c>KHT~+tF&y}v*b55gZI)j{)O{_qsF0XGF3e>+Bf;i9_BrExM3i<7}S`$%B zj*48N0I`Gf@zaqnk_6BNWMS{*@gEsv8FAK6b|5DU4^&Bzv#ArR=19b76Ut zHUqp_=?XRl0W9rZ0B&zEP5>KwpqVopI*JiGijw^su8Sqm<*fq&%s}Qqh>gpeh|6Cn zX8^<*WCk$tcv}QJzp1iycr(P#1pst1icCWwaUrqO~&3F0CD(hE)Ol>O$E@@6y)#^A{#)=#@QYn#qNIy z{vXJ{4BnRh!F2}Oz9BmQXTyJc^Nl*-O##FOYy)=jcq8xZ;{2DF8Os|7unp)RQ7Th= z2dX!I4iJ|&``%cYfc~}ljSaRU9#QP{T}h5OrNP5(_=+_#(lx7lzNC24dN;=ehJE-NFc_BIm!ZAb`j z{f3*+pSJ-pQD2kgI_K|#Ul z%SwuA$jFZ+>dWA&5)N3n4Wza;I-9%dSN^uMGpvd44D%fHEFmwTVm<0QFd+>7d>5bg z!@OBbMFoRML8Mad!-k;Z- zZ7Dh{Y{bt1ZTw97q@Aor$fNJ{#{3e`jo^w_G16UnhHCtv}HI(6TJg z=e?tWa$K^aLB`AqVAch?qml=Xu?e|%_Zx%l%Qk9V4D>gOxa6vl zFqe6#5c)FZ6V@KKQ6b9yE88M;2!!%-1)btQwdec$5h8igHh)|7Jl5&`p1C#{@XtFq z2y@y`RH`Vu`A}^{f~Fa8aOZ9W%!AUx>8$tZ*orqEOndh+zRY2f zkRp$=3$4wZ#DIfVG*oRV+8HN!SqZ~vDd6)gr4}$*Tyj1h)Vw$ml;lF#zu`eVhIl<3 zXOo)eVKw$sTitfjLMg-seooO=aE;+f$@q@nQAskDz@&3x9*wZ3po^vM0p63VFqfkb zG?ljTF=GM5;SUB8Sz@>ZZX64Bu2tvu!%%b<+7+Ss2KBAT#=tMhV61B@TG_c$ z4f-hV=ZS@@X>TE-`)FkG#Erwc_X=DOTRg2WOEyKRR|3fQPJBZ!VD7cZESP)x-M!x4 z>yPw$60+^aHTWk9krzXgVLt0=88Gx0Xrn-GR$gtJC0RzSI|!1pt1>iJyB3K;m1fFi zzG$T%7?cvp%cg~c7rv{Hc`=OXM{c#_hyCdp=6c*v&Dx`?`EL=E{iGyWA#NOqCTr*H z0<<#)NkhP9|5MW50ag?wk`)W^YJquR-v&6Pw*&M)1q(w)93b}ZL8|cgq(xGCt5E;% z1}KF8t(kuh3mqybsNX`U?xdP?vg_!I_k~mm`?T<`4QqDauAx~G(&@lBGU=1G3Cp37 z8iDjob2szURK+wCczLXXuuB#OW7fg#<4VCNF-#P_A31|7C{}pAM#uSqgZh#$&Znk( z<0mI{V6~3*Gp_91C9gBSyI)tr`@h<>%4#)!mRo10Rfz;=57*SxsGbW{cgd8pda^0& zGw1AjX(uXEkA+s;x|JNks3|XV-Pz^W z3e?Qg=Zu9Q4Vc$G+!;El;V!%&EZ*;3gE#4VZp(C=lEJfD3**u8TC_{+iDz`oXw;^C z#*FV z7HjTNQUneYk;ECDPgd~r&q-Dy@O-{( z#&HeKkKpoy8pdNLpMaLo42Oj|u09VD0;-Bm(~c**ch|-YGcyx&X=y1FbJ9M<;*(hu z(2R940ld>PQ#E#Vsh9UhbphaU?g#KesIc>)%C znh9;TC0~?*TH^JeJ;8r4;|cW?K4V{QHCgc!6kbEfy}Q%1kXA zxx<1qwM!xrQ5#86Tr2$Q!O<6`4M_Lko-uW^A}$VozJ>9S$Cy^LD6WdbtRd~U;t{7L zSqrKv^xiBL|1uvip1-4Z5i&>TmiM~`fjb&pdfGS@XI#^$Sqql@8gV!L1F>*sf3}DP zwHp5^Y*=0%;2|8{;EJBq&qv@zlI>=5ys8eY9DATvK!#@5gD8)&UsWkv;%_3Yf*q%# z>MYe?oW>}4W*pGl#$!dLW=zbyID=?i@Fq9<^=Wmn=g%@2UCL0Z*!6A@)wAWiM7*k1 z+A;aCv^f^k9F|7`8en0|ZO`B`N!>7qbu<=pIa+>z)w2kM!1_yT^aGlWsZC~fB`9OAM%l6o4g3AeER zq!`$r@6f>oc;~?vq*9&)-SAEFLkv~Q8wPZg1)sx$Qx{A}KNm1oe=CAnE}(4-qc z0s{GYjy}@*qpdQFBs$Y;)oxVkU4=l@ig0{6CTY>#v}WFcb3Uy~R7u?#9AnjBgvZG+ zM&m!EK&<$pIMXl|n=>^as9=vq7tV@Gct|%+iYqf9ju&IuDsf45;ehR2JlHy~;DcNz zWFkDiNtKgb&Z=~iVA*QJl=Vr7#CKm)ng%GLj`TWoKbs|=O05t*B+0xbqo8&?7r(mu z2bV%C+-fhZyo3rTpa39}Bd38BfXb=2S7RJ0Ob6Q+d}!X&Ef<5GuS0@Xb*U#V!H&4N ztckNX!ns2SwzR%ehrH*u=<+3KhC1Tf^h=nAb4h(LLwSm%^e50JPDvSq_37O( z?3>l#t~MThBs<(-MtAum*hoXWQuGO6@^}|SoBcGvl^g3 z&oliQ!Xn47Le+-&5wW0P6iWT13l2+i97-Ox8CHzYyE{&d*ks3+d(T8!9J4A?pYVvV z#sly^4VTB-I5>sVQM{vqBiUaaq?w3_=uL?o(`O)yN0=UktC_}o>cWx7f;xi~QKKyt z`POZHVH_@LO-o%WG)AK7WzN6x{}Tv(#@QK}CSH@Ovr?M1LpK=7lCOtP;Ob%?nku>Z z(YTV2BchRR*rdHX80X}ttoJnxbTSyB234#9fE9fAohyQNO9$Ve`1^d9(i1suL#m1* z@#h~zVFwC>G=k}c*jXbM&L)+DoEnQoZ3nFpUq^CAayMvxT&s&7F{3RH8lYtcA~#Nu z91+%Ygov|eEbt5qSF7Q(A884r<|auupv(mv&x`UG(tKmt>Vr1KW13xn^1*iEj};c< z#r)y`U0V`V?h%q&Y?hma^}g_u2w$ri2p_`~9&aLfYpWW8>91_p2@NJnp=86B?dy-? z45BHpqXw^wjjVdj5?mx0mDPP4%k)cEa|7HoS}=#!czDx9E zYELoI@^DCx1_w1r{}2loelEH@FK-5<3mw2D8-z1LgDM>e>tgt_p(%60R2u5BMgbh+ zD<)YV$XJ78i9$^bW3Y}iHowQ`jRbGESJAx2}`74gNt@w1qyY9I4Ee3MvTn@ zeN9QieKzbix2qaM&5%CiJHt+M$Q}WA@YPV?Fe5)FT7v z>mI!Wv~#E(@PmM%+Ob_hI}VoYa8uJ#O{4EZ{mC!LMT5}CkC##)o~11{6Il@ZWi_(VDl2c65KWmZk62;#pL312lbm|3KSU~E zQ}Z?uyk-l`5kyTLzxI5nt3)9*&fEu_@&3T8VlSqR^N(YIR7@i06e`et#zXRli;P%; z|6*B`4HL@v!~olEH6|0Wx#gdqS&y%qyq2wQ$`Tx#kaCv(p`kIYxMIK)1)RI4Si2mg z6@s&_Q6Ms}U&`LdZP(r&D6upyLi%2fQ8`}AdI zfvs7toaPJ(uuRFCO6T^$MimnDU~aUXOGhZwK)6^W}sE=6cNLW6NL9WM!<$b zHuQ1`abQ6qne5|Sa8l4}`kC|wta8>txV)F^tpJtYwvymrA}3E|I#}_eN&QqgF@U%z zf5jNttLuc&+}0nopz~Yv(A^U`6pc|*5o-xLv4~uf- znu1`DB~0dijzHRlN>;X-bG;EBBdac_jtT9V;KlNLA1pk`HV6DF6uu zOf?o#NE@(;T&8XOL0LIH<3XrAX^T;k0(poE;43ZzXO+AZm@!6=_V(W~6w{^rm&pwO zmo$zV%-rc_bbKu1A}X28pVb#@Lt^e4YN9fkz5ugzY#4r zm;+^N@NfG#RY}=~5FXTL(KA?2-Dfy#rCu@e4CVoW9EM!<+JB0BR zl^DS+n^Wh=nI?sd7kTJLahKbK-{XfCz!(9-Lbm&HYpK=w&Ah5@dqkTcEu^cX31?O43B`H zGS|cuj;&nX9UQ3dK)Y(qPHsp8-_2PtKXQI8>#^eG*+MA^yoO%YNu;r4@SJ;^tzIPm zArN55Q&&c^gei?ZA9p3e(3%Th;cstdO2~VOE>+zqa)LV06UTsDUBHEV1OK>4U$luw z^$i~v^=EXIfTo5XPu08Cdg6+b#5M|=ePTsFtm<7GO%>=1 zz$C=QJJlMce}Ka{=i3yRI;2LPV0s8&;A`z=IAvgL%r;9FSZ#lcbYCJk;1{eorRN~3 z=@d?0QfyKI6Sm!S+{A7t=DanXuGkpSN48$s=)lkjYI@8@{c4z;WdC9}=;Y0~;`rRJFwyjzJmgg$qHJh7saCeD>S%%b z7o$XCpLv4ZDe7;E0mnhAc$S@|4D zkBc3>EVgMG@@@@d6o-!O3PQuu%P$ukeCY)_QBKuU-CFXfog~84MaYxfvr0JUan8>z z3>0_w1K{Q2$$94Vn5Xw|*%(^(s%yGBoD^x}ilc2MKV?KkWizhG=!aJ6xZ+2LsaO)1 z_g#1eveXC2_}?_`?~0BPUvsIUj!Mb<9IzL-zB@D^b_A^9vlq;qRxpSu8z25!toyj{ zADtX^$SUJX@O5Hf>xBP<@MxsJqZWLWQx(JeQ3JiH01C9m=?OQ1;{r#eJVPcisxTcKf?wIe6S+L?p_F`41a`9UjMtVNl^Ae$? ze16~%;^;w_9=tx3bhjhd&%}shgA0fS6mp0CxJ;=IrA9^K-o|82o^lrjPe*+{i>q+U zC&0slDxw8O0CvBjom7!n?#*yOUYT8Dk;uG*@E=rG;g6XPvaCr%nq zV7exTwMwP{lVNVScqWLh03CrDB>s2Y=!sli0a7y;%vseFQJJ$Bc!1G|MxgA~tM>#nszs+(4 z2hfnZ!AAofg};II>`fOfLZ5U}V8a-P%)DVo`_PR^)wRc$rA2@+w(d|)bw=2AC#|bQ>ENwVu&7Aja{VuMWtJykHli|4%RG0WTR9A z4$Zk>n#~%KbX!??9EX>8XhaeJ76pdsC_k0{p`>=@!lczO;RZ;KYPI2F^zDVFs ztJ=x5DVRZ{Ip!PR^eO5O$S7C_Coq4i`9g{FQTnjKfc=>CscM=KTQ6Zd1s(UU<`5ij zcFb}P#gTllC#gvHcsO8edfXElkpk_3{N?%%3xU+_Sm_r zsrQGExQ_LoNwNFom?rDu>baRZTQ+1O(1MGpv&THoT@X^!V0@by9O_Iq*%+v)Ufd9n z%jZa*qmGJx8a%y+LC4}S7_RA&fD8T3@s2~Ze1nS>3A--gEP+WY#b%J3 zDGVyY7(X2C&({n~+yMN2LH$%SRP9sRI1MKlWmA=5a-1(@z3VvBS-BI%d~#^vNDT6XBgCK`tBv!9KM%@Pj9s9Nlc zfZ<8+ql_r$WaYO_EQ-{yii)Gr3~YdTX0}-a-MebT&mFD zRLkca6kTl36DuCQLPA z3mIplu0Zt~A6qDX#$^jlt7>qN?y3phRc}F(3{6gijAm;6Gc)rDHT=?VI&u*_fgiD% zbXRkLjApVtm&5I3V~8WJ8}W1WXVl5!wsj>5fi}U+hD*8r&+H0gCDcZ*ND@EKlnf1e z(#Ih%fIZyG`(+he-HbsRwOK0~?%GlgN$$K!>RcdRHszM%u%r_bRFH>;u%ykWc&LxV z6jbddhXLwkpfwVGiSw@_1a50k*s_mT>~PI~z=96)X*@x18O0Sx0(KTupVXwc`T zC322Jmx7p(OlhiJ7r4+}loWTG#zNR0p8G=Q@efaHy$R=kFcx&h(8MWDSIO{plKzhQ zaXiPHW>Hni^^t|b869o*p)%D{dwIoGUf7~FoYyydgvmhQ(LfoJdpw-6wFl2z_Q0@ zc~Kyz>L+Z^umjB&MQBVt!OD4X8^;64O@>S)@yc(6+;km7s<1;J{ewkD+c19f)3YJJ*n zp^fjJhW1H&05#RGV+2ZHoe+?5@%*SZyPX|D-(gq`2EE9GXok{m`nF4jEy1Uw;Uo-e zW<>bfEv?`xF9w{x_YcA2U+T~Q6g$A&tzcUY^Ol>|@-Pk32uF}bOt_fb=BhJs&^#ws zW?sH)!`NvO+(>*3M1@mwbHsLk|A%3NuZ?N7Rbi9o8sm`T`vw#RJwE;%QC~ep+{d#v zM)E4Rh1H6~Yn7h-LHJ(Gwm$G?z+GHk<_$cKm`(t+>H;}~)dJ6~=mTq2B31P{O$eN8 z#YBd%Vxs;)FBO z^w5x6XR~c#sST{K=kqV1OTrGc*l)!x4l0AvxO%s_?~@{t`tL%huC0Mh{*OxBT5@|o zo2t~8j6X_J0TTHrUV^Z*wv>@lKYrt4$ECfzY^!E^K@+L(&F<T$X+GV%P>;dyG|q^<^=KW#;WOIb1yP@qJjsdbC;q~FynAi7!| zDf*4Gxy;W=z;x}WY&^0 zUX+`>n!+YWz9%o57bQZ(SD&WJ)6ah_6x^PtA8Km6+T9055~}}b=vH{tX=;7&Ab3fl zAQ#^5uBn;&p-+6Q&7FO}QztY=A#|J{1Gy7&?ddPJd+=yy$9NUE8sd^td{pl_tA9Dn z!)q`UGPouGg3-#)9gahbiKNL=jtlxSjqRh>GNhOJw2)K%cW6N zMa$v-$Ef@HO`|^>soNsz&oK+Grz-+0o;QmkLY|V|uQTiu?zZz-^xkdW*53yq?;!%y#IFAy;&*+p_RBi@G_UAGl4zTvWp7}iemY#?@ zvtMc0o|`?U*R(sdfAn2YmlmnAo_o&U@?vtO@EJ(R^b@j}_%x+`YSUtOJnd}ny%{)H zEUf-=_`(%q@Uj}bChg6bA#_w8$!^8m@$kpGfeqcSY%f@K#Xj?5sCYeP#kIRf=<7E& z0bA=oxlMljJMG2nPrKC=A|9(PMomTcagl0n&o43d5JT_TZ;vlErwuVaPbBttl`XHg ze{`D^wyhr9)6K618(q#Aw_VF=vLEL}VyvGJDj<=Dt*?{!{cFGRiZg82e3kc-)f+Tk zJbef3?Yx|};^(t9?Vo?YSk(BelUS2ETkkAOI6r)CYH{;DWqW?ChN!#lj0@(L?n~Ew z^r5?3V`gsG`}q>lXRolT>u54yo85f>&E5t>NWgV}#qVi4bH&b1#8cOM*h0MN&Mk|0 zx&1XZExBPVlrhQgs9D)prTQv#Ka0-^V(WQ`>hrNZXLM<{Qc1Dn>UZSwI-#@G`kJ+U zmd|N(WP_jc1jN+Pu5G9N%Y?us$(hid`%}AijEC7&;rh$V^P>QPu=}+HYsX5{Nn-dz zVvG>J>}QW#RA+X-gYPZ&MmiVIZQ8yZ`@QSrX=%5=?oG|v4cd)=x6#KmcT{`#Bv2SZ zMy^Ok?i3#+oGZKsE=^a8*F9$X(&?1iDLwCIhPH{#?GC&fobFO^IP>QX9hCYK=IHG- zjg~nt8heYV^&4zEOedmcy*e(N}&j?Jg^C(Q8m_ zw%bnsB2sIAO}(=3{m^{UXpxRTZkghGbJ=kDSnhSZ?liGrEFC zc)eUHI&HDpd$dg!s=rvIFns<&viyPM%qYv#@!{0(Wha4pLdf>$>_^37O>uR}aof;W zjD^#eBU%ty)tdaF+se=2zzkN{5M;Fo8(7L613MCmHR>XJ6Uq{%(w& z{I0xE-`Dx&7gzj(9l`T1>~#!rj^8!Zvnj#>g@EX5BlN=n#-vED%q!)n1n#6QjI|qb z!^xIW_OFY@YyvyqEkCx5bI%p!Oz1$TAKzk(R9_By`_EcEd#8tq)UzBBqKGX!4+0RP zh%7r7-v$!P&OZSN3Jje7Lu7dJrQY9}8P;x)qfFpss}CnVy%9}9N=of0G|O`iYJC^& zAK}vi+ARF+j`#%PS?}tigR}|odjZkGQ{XuIr5p`?KbUfeuBjH${Wm6QumJB0^3V;&QW9m*7hBa7CV`fj*%7Z zuB)^2$3sB!57GN~K-516E>HUJoirpErIf5<3B%o)-UVAbV;lg7MduSHemvf{d@-7T z+6a366MEa_yx^|GHN}U@ZX7+!19zM770GLl)bWxrrfvC`>njuZ>{>OFk7_$NHF zS0`D*=sYEMMr3C*SwiQW`1A3D&9(&ovIW&I7gR?99fAC#$;w|YmJh28dC69P6b1PW zajUdsxm)SGJjIwQX1^ZYRQf#LZ_|6#{^)M2Hq0@0TJJCzsNma5-6P2M`yE9>N8xJd zsjj)L;&O5w&p*#{ytoKES1n{3`Yd|FK@mcBDpA$r^91>W(H`ANT}gdibsQ$R$B&KC zh+yUL)G*Nc^A-_R|Kr3_+sMn}bMYhhBHtm#q;bQUQAHR1>-qEjE{QA4%QD_$OsYn< zAr~&Xp`lvP!Z5MmsVI;8!XmIEQed>f;mhO8@2d4yvQvSE9={b=xL-fX0zTS&d9?d2 z)2itudNzZQ7TMqO>&aSrj?3a#9HE!v?yOL+1zU!^AoO1M@5csCf|B?>D*E)u3q&in zQzD+$FMiS+)$6c+8*V8v59AvX?E%yGdlh3t@~E~99v>dlLB>M;xbev}2(3g`(nAtHfrly+>WjN%--;3T4w#EulRZ?Lb((Z^t z-_La;lCP53S+#A&G{hJCI$UYQ_(yfw>)|3HT0b`otFkdN5+;8#Clh1 z*m#^RoMp^BWd6)rzPLTqH@rv^;~Veh{C>d85d5ek+l_^>DTR^k04vN+F4NfI{b#)L z>~X!B>(uu3>aO1C!*3kJZpVy}U>q{U5QiCgY`f?$4yFhIgKZhX9CDc^eJzn%R=!tM z3xmf(42yLm-yQj1#tHydwEm2&An}$N`RR%!iI!^E$T8v!bBZq%;fR}GZjiil zkOUj{H*M3!m1m7!5BA2?DYCWqu>z`b)uCTKuEc;Zm+_-U$H14yP5lh$^+pUDz52cG zB7tn)*3F~S%)R;<>g-EB(&(R)TVc^b;*A=z-MfOpBqC6oNnd-ZUtlMzZsR&yz50?x zEZcNj*dRT7WPVp!&;sjt41%z(E$>jsJ|+}w(_xU&qlpfb@AkZiFcAKFWfZG^r4AI0 zZoQg~{Px4Bx#;(Jaw)r|)kO5298Y$QO6jKovCV#3+9pSjo>yp8b%@FT|GgzT4}hN^ Lp#JZ-lA!+r@R*{G diff --git a/honeybee_grasshopper_energy/user_objects/HB Balance Temperature.ghuser b/honeybee_grasshopper_energy/user_objects/HB Balance Temperature.ghuser index 701be7b92155653e65fcd70a8558c63a7b0e8377..aa48a19f1fcb6129dffe4d5e77eae1232add63d2 100644 GIT binary patch literal 6695 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 diff --git a/honeybee_grasshopper_energy/user_objects/HB Run IDF.ghuser b/honeybee_grasshopper_energy/user_objects/HB Run IDF.ghuser index 09653faf116890b075050895350925a93b1bd831..596383ac8733d46c03b0e0332b8c956b3b1a4b66 100644 GIT binary patch literal 5659 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 A0RR91 diff --git a/honeybee_grasshopper_energy/user_objects/HB Run OSM.ghuser b/honeybee_grasshopper_energy/user_objects/HB Run OSM.ghuser index 1e64b9a38bf96ec5f4cf78bbbcbd1542fd2b7a3f..156215f0e55faa80c7f76e89c35d596e6e9673f7 100644 GIT binary patch literal 6423 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 literal 6405 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 T3|t|=+qVE+s3ZK}yyAZV1ig+B diff --git a/honeybee_grasshopper_energy/user_objects/HB Run OSW.ghuser b/honeybee_grasshopper_energy/user_objects/HB Run OSW.ghuser index 058059b9903d7e6b3eb3cebccea2798838a5fccc..84b8c38d7658165a91e85f894e1093d03f1c5524 100644 GIT binary patch literal 6177 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 literal 6158 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 diff --git a/honeybee_grasshopper_energy/user_objects/HB Thermal Load Balance.ghuser b/honeybee_grasshopper_energy/user_objects/HB Thermal Load Balance.ghuser index 263bbd6011cd35261a4d2c16b2a48c03d6bcbe71..ce64cc7b5015418c6f280aa9dc71f7c36c90545f 100644 GIT binary patch literal 6737 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 literal 6721 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