From 9964b129659aee42768faed9a7d53288d08471a6 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 3 Dec 2022 10:49:23 -0800 Subject: [PATCH 01/68] fixed issue #408 :Problem: the following code fails :: fhandle = StringIO("VERSION, 7.3;" ) idf = IDF(fhandle) idf.idfname = "somefile.idf" idf.save() :Solution: idf.save uses self.idfabsname, ensure that it is not None --- eppy/modeleditor.py | 10 ++++++++++ tests/test_modeleditor.py | 19 ++++++++++++++++++- tests/test_modeleditor1.py | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/eppy/modeleditor.py b/eppy/modeleditor.py index 560a6f3b..b8cc9d4a 100644 --- a/eppy/modeleditor.py +++ b/eppy/modeleditor.py @@ -996,6 +996,9 @@ def save(self, filename=None, lineendings="default", encoding="latin-1"): is compatible with the EnergyPlus IDFEditor. """ + if self.idfabsname is None and isinstance(self.idfname, str): + # this happens when the user sets self.idfname to an in-memory idf + self.idfabsname = os.path.abspath(self.idfname) if filename is None: filename = self.idfabsname s = self.idfstr() @@ -1023,6 +1026,13 @@ def save(self, filename=None, lineendings="default", encoding="latin-1"): except TypeError: filename.write(s.decode(encoding)) + try: + pass + except Exception as e: + raise e + else: + pass + def saveas(self, filename, lineendings="default", encoding="latin-1"): """Save the IDF as a text file with the filename passed. diff --git a/tests/test_modeleditor.py b/tests/test_modeleditor.py index 873077af..3c16494f 100644 --- a/tests/test_modeleditor.py +++ b/tests/test_modeleditor.py @@ -5,7 +5,7 @@ # (See accompanying file LICENSE or copy at # http://opensource.org/licenses/MIT) # ======================================================================= -"""py.test for modeleditor""" +"""Main py.test modeleditor. Other tests are in test_modeleditor.py""" from __future__ import absolute_import from __future__ import division @@ -690,3 +690,20 @@ def test_copyidf(): idf = IDF(StringIO(idftxt)) new_idf = idf.copyidf() assert idf.idfstr() == new_idf.idfstr() + + +def test_name_and_save_inmemoryidf(): + """py.test to name and save a file that is created in memory""" + # fixing and testing an error from user documentation code + # fix for issue #408 + + idftxt = "VERSION, 7.3;" + fhandle = StringIO(idftxt) + idf_notemptyfile = IDF(fhandle) + idf_notemptyfile.idfname = "notemptyfile_randomchars_laksdfjl.idf" + try: + idf_notemptyfile.save() + except Exception as e: + raise e + finally: + os.remove("notemptyfile_randomchars_laksdfjl.idf") diff --git a/tests/test_modeleditor1.py b/tests/test_modeleditor1.py index 0236b2d1..9588687f 100644 --- a/tests/test_modeleditor1.py +++ b/tests/test_modeleditor1.py @@ -4,7 +4,7 @@ # (See accompanying file LICENSE or copy at # http://opensource.org/licenses/MIT) # ======================================================================= -"""py.test for some functions of modeleditor""" +"""py.test for some functions of modeleditor. Other tests are in test_modeleditor.py""" from __future__ import absolute_import from __future__ import division from __future__ import print_function From aefd00296c4a8fc1411cdcb94291710c317eb196 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Wed, 7 Dec 2022 17:47:08 -0800 Subject: [PATCH 02/68] Working on issue 409 modified: eppy/__init__.py modified: tests/test_eppy.py --- eppy/__init__.py | 17 ++++++++++++---- tests/test_eppy.py | 51 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/eppy/__init__.py b/eppy/__init__.py index 6c4e566e..5620645e 100644 --- a/eppy/__init__.py +++ b/eppy/__init__.py @@ -20,25 +20,34 @@ from io import StringIO import eppy - +from eppy import modeleditor +from eppy.modeleditor import IDF def newidf(version=None): """open a new idf file - easy way to open a new idf file for particular version. Works only id Energyplus of that version is installed. + easy way to open a new idf file for particular version. Works only if Energyplus of that version is installed. + + - newidf(version=None) or newidf() will workif the IDD has already been set + - newidf(version=some_version) will work + - if some_version matches the IDD already set + - OR if no IDD has been set Parameters ---------- version: string - version of the new file you want to create. Will work only if this version of Energyplus has been installed. + version of the new file you want to create. Will work only if this version of Energyplus has been installed OR if it matches the IDD already set. Returns ------- idf file of type eppy.modelmake.IDF """ # noqa: E501 + import eppy.easyopen as easyopen if not version: - version = "8.9" + return IDF(StringIO("")) + # return easyopen.easyopen(StringIO("")) + import eppy.easyopen as easyopen idfstring = " Version,{};".format(str(version)) diff --git a/tests/test_eppy.py b/tests/test_eppy.py index 6a35e90e..4bc5a31b 100644 --- a/tests/test_eppy.py +++ b/tests/test_eppy.py @@ -13,14 +13,63 @@ from eppy.pytest_helpers import do_integration_tests import eppy.idd_helpers as idd_helpers +IDDVERSION = "8.4.0" + + +def versiontuple(vers): + """version tuple""" + return tuple([int(num) for num in vers.split(".")]) @pytest.mark.skipif( not do_integration_tests(), reason="$EPPY_INTEGRATION env var not set" ) -def test_newidf(): +def test_newidf1(): """py.test for newidf""" data = ((idd_helpers.latestidd(), idd_helpers.latestidd()),) # ver, expected for ver, expected in data: idf = eppy.newidf(ver) result = idf.idfobjects["version".upper()][0] assert result.Version_Identifier == expected + +@pytest.mark.skipif( + not do_integration_tests(), reason="$EPPY_INTEGRATION env var not set" +) +def test_newidf2(): + from importlib import reload + import eppy + # Now test the following + # + # :Problem: eppy.newidf(version=None) does not work correctly + # :Solution: + # + # There are starting conditions here: + # + # 1. IDD is already set + # - if IDD has been set, it should use that IDD + # - eppy.newidf(version=wrongIDD): throw exception + # 2. IDD has not been set + # - if eppy.newidf(version=None), it should throw an exception + # - if eppy.newidf(version=some_version), it shoule use that some_version of IDD + + # 1. IDD is already set + # - if IDD has been set, it should use that IDD + reload(eppy.modeleditor) # this will reset the IDD to None + iddversion = IDDVERSION + # iimport pdb; pdb.set_trace() + # from pudb import set_trace; set_trace() # does not work + idf1 = eppy.newidf(version=iddversion) # this will set the IDD version + # idf2 = eppy.newidf(version=None) + # assert idf2.idd_version == versiontuple(iddversion) + # # - eppy.newidf(version=wrongIDD): throw exception + # wrongiddversion = "8.9.9" + # with pytest.raises(eppy.easyopen.MissingIDDException): + # idf3 = eppy.newidf(version=wrongiddversion) + # # 2. IDD has not been set + # # - if eppy.newidf(version=None), it should throw an exception + # reload(eppy.modeleditor) # this will reset the IDD to None + # with pytest.raises(eppy.modeleditor.IDDNotSetError): + # idf4 = eppy.newidf(version=None) + # # - if eppy.newidf(version=some_version), it shoule use that some_version of IDD + # idf5 = eppy.newidf(version=iddversion) + # assert idf5.idd_version == versiontuple(iddversion) + # reload(eppy.modeleditor) # this will reset the IDD to None From 9e3b1951e63c0c1ca704bc560608594d9c793561 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Wed, 7 Dec 2022 19:39:17 -0800 Subject: [PATCH 03/68] fixed issue #410 :Problem: need a IDF.resetidd() function during testing :Solution: IDF.resetidd() will reset all related idd values modified: eppy/modeleditor.py modified: tests/test_runner.py --- eppy/modeleditor.py | 26 ++++++++++++++++++++++++++ tests/test_runner.py | 6 ++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/eppy/modeleditor.py b/eppy/modeleditor.py index b8cc9d4a..ad6c486a 100644 --- a/eppy/modeleditor.py +++ b/eppy/modeleditor.py @@ -59,6 +59,10 @@ class IDDAlreadySetError(Exception): """Exception Object""" pass + +class IDDResetError(Exception): + """Exception Object""" + pass def almostequal(first, second, places=7, printit=True): @@ -613,6 +617,28 @@ def setiddname(cls, iddname, testing=False): if testing == False: errortxt = "IDD file is set to: %s" % (cls.iddname,) raise IDDAlreadySetError(errortxt) + + @classmethod + def resetidd(cls): + """resets the IDD for testing. Users should not use this + + It will raise the exception IDDResetError + + Returns + ------- + None + + """ + cls.iddname = None + print(27, cls.iddname) + cls.idd_info = None + cls.block = None + cls.idd_info = None + cls.idd_index = None + cls.idd_version = None + print(28, cls.iddname) + raise IDDResetError("IDD should never be reset unless you are doing test runs") + @classmethod def getiddname(cls): diff --git a/tests/test_runner.py b/tests/test_runner.py index 845ff6a6..1c5f5216 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -71,7 +71,10 @@ def test_version_reader(): # We need to reload modeleditor since the IDF class may have had an IDD # which causes problems. # https://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module - reload(modeleditor) + try: + modeleditor.IDF.resetidd() # reload(modeleditor) + except modeleditor.IDDResetError as e: + pass iddfile = os.path.join(IDD_FILES, TEST_IDD) fname1 = os.path.join(IDF_FILES, TEST_IDF) modeleditor.IDF.setiddname(iddfile, testing=True) @@ -478,7 +481,6 @@ def test_version(self, capfd, test_idf): expected_version = VERSION.replace("-", ".") version_string = "EnergyPlus, Version {}".format(expected_version) - assert out.strip().startswith(version_string) def test_help(self, capfd, test_idf): From 0efa1f1808c8eb50156ee3cf74ca2f599ef74c4e Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Wed, 7 Dec 2022 19:41:38 -0800 Subject: [PATCH 04/68] modified: HISTORY.rst --- HISTORY.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 09becc8c..55fa2276 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -5,6 +5,19 @@ History Changes ~~~~~~~ +2022-12-07 +---------- + +fixed issue #410 +```````````````` + +:Problem: need a IDF.resetidd() function during testing +:Solution: IDF.resetidd() will reset all related idd values + + modified: eppy/modeleditor.py + modified: tests/test_runner.py + + release r0.5.63 ~~~~~~~~~~~~~~~ From cf49acf59a0cca3e2821428dbd74a361c7f3fa3c Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Thu, 8 Dec 2022 09:32:03 -0800 Subject: [PATCH 05/68] working on issue # 409 --- eppy/modeleditor.py | 2 - tests/conftest.py | 13 +- tests/test_IDF.py | 22 +- tests/test_bunch_subclass.py | 10 +- tests/test_bunch_subclass_functions.py | 12 +- tests/test_easyopen.py | 27 +- tests/test_eppy.py | 48 ++-- tests/test_extend_extensible.py | 8 +- tests/test_fanpower.py | 12 +- tests/test_function_helpers.py | 12 +- tests/test_hvacbuilder.py | 11 +- tests/test_idf_helpers.py | 12 +- tests/test_json_functions.py | 10 +- tests/test_modeleditor.py | 10 +- tests/test_parse_error.py | 14 +- tests/test_runner.py | 10 +- tests/test_simpleread.py | 7 + tests/test_thermal_properties.py | 342 +++++++++++++------------ 18 files changed, 348 insertions(+), 234 deletions(-) diff --git a/eppy/modeleditor.py b/eppy/modeleditor.py index ad6c486a..523213e2 100644 --- a/eppy/modeleditor.py +++ b/eppy/modeleditor.py @@ -630,13 +630,11 @@ def resetidd(cls): """ cls.iddname = None - print(27, cls.iddname) cls.idd_info = None cls.block = None cls.idd_info = None cls.idd_index = None cls.idd_version = None - print(28, cls.iddname) raise IDDResetError("IDD should never be reset unless you are doing test runs") diff --git a/tests/conftest.py b/tests/conftest.py index c120ad8d..0cc5159d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,6 +4,7 @@ from io import StringIO from importlib import reload +import eppy from eppy.modeleditor import IDF from eppy.iddcurrent import iddcurrent from eppy import modeleditor @@ -25,11 +26,21 @@ TEST_OLD_IDD = "Energy+V7_2_0.idd" +def teardown_module(module): + """new IDD has been set in the module. Here you tear it down""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass + @pytest.fixture() def test_idf(): idd_file = os.path.join(IDD_FILES, TEST_IDD) idf_file = os.path.join(IDF_FILES, TEST_IDF) - reload(modeleditor) + try: + eppy.modeleditor.IDF.resetidd() # reload(modeleditor) + except eppy.modeleditor.IDDResetError as e: + pass # This is a way to change the IDD modeleditor.IDF.setiddname(idd_file, testing=True) idf = modeleditor.IDF(idf_file, TEST_EPW) try: diff --git a/tests/test_IDF.py b/tests/test_IDF.py index 7a80485a..11f4d602 100644 --- a/tests/test_IDF.py +++ b/tests/test_IDF.py @@ -13,9 +13,23 @@ from io import StringIO -from eppy.iddcurrent import iddcurrent from eppy.modeleditor import IDF +# Not sure why these tests are sitting in this file +# Should it not be in test_modeleditor.py or test_modeleditor1.py + +def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) def test_IDF(): """py.test for class IDF""" @@ -30,12 +44,6 @@ def test_IDF(): IDF.iddname = stored_idd -iddsnippet = iddcurrent.iddtxt -iddfhandle = StringIO(iddsnippet) - - -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) class TestIDF(object): diff --git a/tests/test_bunch_subclass.py b/tests/test_bunch_subclass.py index e36cb3cb..5f3fca52 100644 --- a/tests/test_bunch_subclass.py +++ b/tests/test_bunch_subclass.py @@ -31,9 +31,13 @@ # idd is read only once in this test # if it has already been read from some other test, it will continue with # the old reading -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) # This test is ugly because I have to send file names and not able to send file handles idftxt = """Version,6.0; diff --git a/tests/test_bunch_subclass_functions.py b/tests/test_bunch_subclass_functions.py index ffa1daa0..c01df4b6 100644 --- a/tests/test_bunch_subclass_functions.py +++ b/tests/test_bunch_subclass_functions.py @@ -18,10 +18,14 @@ from eppy.pytest_helpers import almostequal -iddtxt = iddcurrent.iddtxt -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddtxt = iddcurrent.iddtxt +# iddfhandle = StringIO(iddcurrent.iddtxt) +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) idftxt = """Version,8.0; diff --git a/tests/test_easyopen.py b/tests/test_easyopen.py index 45996ed2..412f1f5c 100644 --- a/tests/test_easyopen.py +++ b/tests/test_easyopen.py @@ -26,6 +26,13 @@ from importlib import reload +def teardown_module(module): + """new IDD has been set in the module. Here you tear it down""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass + def test_cleanupversion(): """py.test for cleanupversion""" data = ( @@ -49,9 +56,13 @@ def test_easyopen_idfopen(): txt, result = (" Version,{};".format(ver), "{}".format(ver)) fhandle1 = StringIO(txt) fhandle2 = StringIO(txt) - reload(eppy) - reload(modeleditor) - reload(easyopen) + # reload(eppy) + # reload(modeleditor) + # reload(easyopen) + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass # This is a way to change the IDD idf1, idf2 = easyopen.easyopen(fhandle1), eppy.openidf(fhandle2) for idf in [idf1, idf2]: versions = idf.idfobjects["version"] @@ -80,9 +91,13 @@ def test_easyopen_withidd(): txt, result = (" Version,{};".format(ver), "{}".format(ver)) fhandle1 = StringIO(txt) fhandle2 = StringIO(txt) - reload(eppy) - reload(modeleditor) - reload(easyopen) + # reload(eppy) + # reload(modeleditor) + # reload(easyopen) + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass # This is a way to change the IDD idf1, idf2 = ( easyopen.easyopen(fhandle1, idd=iddfile), eppy.openidf(fhandle2, idd=iddfile), diff --git a/tests/test_eppy.py b/tests/test_eppy.py index 4bc5a31b..23865f89 100644 --- a/tests/test_eppy.py +++ b/tests/test_eppy.py @@ -16,6 +16,13 @@ IDDVERSION = "8.4.0" +def teardown_module(module): + """new IDD has been set in the module. Here you tear it down""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass + def versiontuple(vers): """version tuple""" return tuple([int(num) for num in vers.split(".")]) @@ -35,7 +42,6 @@ def test_newidf1(): not do_integration_tests(), reason="$EPPY_INTEGRATION env var not set" ) def test_newidf2(): - from importlib import reload import eppy # Now test the following # @@ -53,23 +59,29 @@ def test_newidf2(): # 1. IDD is already set # - if IDD has been set, it should use that IDD - reload(eppy.modeleditor) # this will reset the IDD to None + + # reload(eppy.modeleditor) # this will reset the IDD to None + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass # This is a way to change the IDD iddversion = IDDVERSION - # iimport pdb; pdb.set_trace() - # from pudb import set_trace; set_trace() # does not work idf1 = eppy.newidf(version=iddversion) # this will set the IDD version - # idf2 = eppy.newidf(version=None) - # assert idf2.idd_version == versiontuple(iddversion) - # # - eppy.newidf(version=wrongIDD): throw exception - # wrongiddversion = "8.9.9" - # with pytest.raises(eppy.easyopen.MissingIDDException): - # idf3 = eppy.newidf(version=wrongiddversion) - # # 2. IDD has not been set - # # - if eppy.newidf(version=None), it should throw an exception - # reload(eppy.modeleditor) # this will reset the IDD to None - # with pytest.raises(eppy.modeleditor.IDDNotSetError): - # idf4 = eppy.newidf(version=None) - # # - if eppy.newidf(version=some_version), it shoule use that some_version of IDD - # idf5 = eppy.newidf(version=iddversion) - # assert idf5.idd_version == versiontuple(iddversion) + idf2 = eppy.newidf(version=None) + assert idf2.idd_version == versiontuple(iddversion) + # - eppy.newidf(version=wrongIDD): throw exception + wrongiddversion = "8.9.9" + with pytest.raises(eppy.easyopen.MissingIDDException): + idf3 = eppy.newidf(version=wrongiddversion) + # 2. IDD has not been set + # - if eppy.newidf(version=None), it should throw an exception + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass # This is a way to change the IDD # reload(eppy.modeleditor) # this will reset the IDD to None + with pytest.raises(eppy.modeleditor.IDDNotSetError): + idf4 = eppy.newidf(version=None) + # - if eppy.newidf(version=some_version), it shoule use that some_version of IDD + idf5 = eppy.newidf(version=iddversion) + assert idf5.idd_version == versiontuple(iddversion) diff --git a/tests/test_extend_extensible.py b/tests/test_extend_extensible.py index 39e9d5cb..97f01108 100644 --- a/tests/test_extend_extensible.py +++ b/tests/test_extend_extensible.py @@ -15,9 +15,10 @@ # idd is read only once in this test # if it has already been read from some other test, it will continue with # the old reading -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) def test_read_overextended(): @@ -37,6 +38,7 @@ def test_read_overextended(): newstr = f"{astr} {extfields};" fhandle = StringIO(newstr) + print(1, IDF.iddname) idf = IDF(fhandle) wm = idf.idfobjects["WINDOWMATERIAL:GLAZINGGROUP:THERMOCHROMIC"] assert wm[0][f"Optical_Data_Temperature_{nn + 1}"] == nn - 1 diff --git a/tests/test_fanpower.py b/tests/test_fanpower.py index f30c3768..efa057e4 100644 --- a/tests/test_fanpower.py +++ b/tests/test_fanpower.py @@ -19,10 +19,14 @@ from eppy.pytest_helpers import almostequal -iddfhandle = StringIO(iddcurrent.iddtxt) - -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) def test_pascal2inh2o(): diff --git a/tests/test_function_helpers.py b/tests/test_function_helpers.py index 2123c668..2db0bdea 100644 --- a/tests/test_function_helpers.py +++ b/tests/test_function_helpers.py @@ -20,10 +20,14 @@ from eppy.modeleditor import IDF from eppy.pytest_helpers import almostequal -iddtxt = iddcurrent.iddtxt -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddtxt = iddcurrent.iddtxt +# iddfhandle = StringIO(iddcurrent.iddtxt) +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) idftxt = """Version,8.0; diff --git a/tests/test_hvacbuilder.py b/tests/test_hvacbuilder.py index 1faf00dd..e1520799 100644 --- a/tests/test_hvacbuilder.py +++ b/tests/test_hvacbuilder.py @@ -20,9 +20,13 @@ # idd is read only once in this test # if it has already been read from some other test, it will continue with the old reading -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) def test_flattencopy(): @@ -101,6 +105,7 @@ def test_makeplantloop(): # print('-' * 15) # print(idf2.model) # print('=' * 15) + print(1,idf2.getiddname()) assert str(idf1.model) == str(idf2.model) diff --git a/tests/test_idf_helpers.py b/tests/test_idf_helpers.py index 3a2c5842..5f8665b0 100644 --- a/tests/test_idf_helpers.py +++ b/tests/test_idf_helpers.py @@ -17,10 +17,14 @@ from eppy.pytest_helpers import almostequal import eppy.idf_helpers as idf_helpers -iddfhandle = StringIO(iddcurrent.iddtxt) - -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) def test_idfobjectkeys(): diff --git a/tests/test_json_functions.py b/tests/test_json_functions.py index a51e46e2..c9e8785a 100644 --- a/tests/test_json_functions.py +++ b/tests/test_json_functions.py @@ -22,9 +22,13 @@ # idd is read only once in this test # if it has already been read from some other test, it will continue with # the old reading -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) def test_key2elements(): diff --git a/tests/test_modeleditor.py b/tests/test_modeleditor.py index 3c16494f..42776630 100644 --- a/tests/test_modeleditor.py +++ b/tests/test_modeleditor.py @@ -42,9 +42,13 @@ # idd is read only once in this test # if it has already been read from some other test, it will continue with # the old reading -iddfhandle = StringIO(iddcurrent.iddtxt) -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) def test_poptrailing(): diff --git a/tests/test_parse_error.py b/tests/test_parse_error.py index f26fb9dc..9f368d79 100644 --- a/tests/test_parse_error.py +++ b/tests/test_parse_error.py @@ -5,10 +5,18 @@ from six import StringIO +import eppy from eppy import modeleditor from eppy.runner.run_functions import parse_error, EnergyPlusRunError +def teardown_module(module): + """new IDD has been set in the module. Here you tear it down""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass + def test_capture_stderr(): tmp_out = StringIO() sys.stderr = tmp_out @@ -34,4 +42,8 @@ def test_capture_real_error(test_idf): assert "invalid Heating Setpoint Temperature Schedule" in str(e) finally: shutil.rmtree(rundir) - reload(modeleditor) + # reload(modeleditor) + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass # This is a way to change the IDD diff --git a/tests/test_runner.py b/tests/test_runner.py index 1c5f5216..57592195 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -26,6 +26,7 @@ import pytest from importlib import reload +import eppy from eppy import modeleditor from eppy.pytest_helpers import do_integration_tests from eppy.runner.run_functions import install_paths, EnergyPlusRunError @@ -57,6 +58,13 @@ def versiontuple(vers): eplus_exe, eplus_weather = install_paths(VERSION, os.path.join(IDD_FILES, TEST_IDD)) +def teardown_module(module): + """new IDD has been set in the module. Here you tear it down""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass + def has_severe_errors(results="run_outputs"): """Check for severe errors in the eplusout.end file.""" end_filename = glob("{}/*.end".format(results))[0] @@ -74,7 +82,7 @@ def test_version_reader(): try: modeleditor.IDF.resetidd() # reload(modeleditor) except modeleditor.IDDResetError as e: - pass + pass # This is a way to change the IDD iddfile = os.path.join(IDD_FILES, TEST_IDD) fname1 = os.path.join(IDF_FILES, TEST_IDF) modeleditor.IDF.setiddname(iddfile, testing=True) diff --git a/tests/test_simpleread.py b/tests/test_simpleread.py index dc5c668b..310a87a7 100644 --- a/tests/test_simpleread.py +++ b/tests/test_simpleread.py @@ -10,8 +10,15 @@ from __future__ import unicode_literals from io import StringIO +import eppy import eppy.simpleread as simpleread +def teardown_module(module): + """new IDD has been set in the module. Here you tear it down""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass def test_idf2txt(): """py.test for idf2txt""" diff --git a/tests/test_thermal_properties.py b/tests/test_thermal_properties.py index 746c9a74..8301dcc9 100644 --- a/tests/test_thermal_properties.py +++ b/tests/test_thermal_properties.py @@ -22,158 +22,164 @@ from eppy.pytest_helpers import almostequal -iddfhandle = StringIO(iddcurrent.iddtxt) - -if IDF.getiddname() == None: - IDF.setiddname(iddfhandle) - -single_layer = """ - Construction, - TestConstruction, !- Name - TestMaterial; !- Inside Layer +def setup_module(module): + iddfhandle = StringIO(iddcurrent.iddtxt) + if IDF.getiddname() == None: + IDF.setiddname(iddfhandle) +# iddfhandle = StringIO(iddcurrent.iddtxt) +# +# if IDF.getiddname() == None: +# IDF.setiddname(iddfhandle) + +class Data(object): + """data""" + single_layer = """ + Construction, + TestConstruction, !- Name + TestMaterial; !- Inside Layer - Material, - TestMaterial, - Rough, !- Roughness - 0.10, !- Thickness {m} - 0.5, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 1200, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - """ - -expected_failure = """ - Construction, - TestConstruction, !- Name - Skyhooks; !- Inside Layer + Material, + TestMaterial, + Rough, !- Roughness + 0.10, !- Thickness {m} + 0.5, !- Conductivity {W/m-K} + 1000.0, !- Density {kg/m3} + 1200, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + """ + + expected_failure = """ + Construction, + TestConstruction, !- Name + Skyhooks; !- Inside Layer - Boiler:HotWater, - Skyhooks, - Rough, !- Roughness - 0.10, !- Thickness {m} - 0.5, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 1200, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - """ - -double_layer = """ - Construction, - TestConstruction, !- Name - TestMaterial, !- Inside Layer - TestMaterial; !- Outside Layer + Boiler:HotWater, + Skyhooks, + Rough, !- Roughness + 0.10, !- Thickness {m} + 0.5, !- Conductivity {W/m-K} + 1000.0, !- Density {kg/m3} + 1200, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + """ + + double_layer = """ + Construction, + TestConstruction, !- Name + TestMaterial, !- Inside Layer + TestMaterial; !- Outside Layer - Material, - TestMaterial, - Rough, !- Roughness - 0.10, !- Thickness {m} - 0.5, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 1200, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - """ - -air_gap = """ - Construction, - TestConstruction, !- Name - TestMaterial, !- Inside Layer - AirGap, !- Layer 2 - TestMaterial; !- Outside Layer + Material, + TestMaterial, + Rough, !- Roughness + 0.10, !- Thickness {m} + 0.5, !- Conductivity {W/m-K} + 1000.0, !- Density {kg/m3} + 1200, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + """ + + air_gap = """ + Construction, + TestConstruction, !- Name + TestMaterial, !- Inside Layer + AirGap, !- Layer 2 + TestMaterial; !- Outside Layer - Material, - TestMaterial, - Rough, !- Roughness - 0.10, !- Thickness {m} - 0.5, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 1200, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - Material:AirGap, - AirGap, - 0.1; !- Thermal Resistance - """ - -infrared_transparent = """ - Construction, - TestConstruction, !- Name - TestMaterial, !- Inside Layer - InfraredTransparent, !- Layer 2 - TestMaterial; !- Outside Layer + Material, + TestMaterial, + Rough, !- Roughness + 0.10, !- Thickness {m} + 0.5, !- Conductivity {W/m-K} + 1000.0, !- Density {kg/m3} + 1200, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + Material:AirGap, + AirGap, + 0.1; !- Thermal Resistance + """ + + infrared_transparent = """ + Construction, + TestConstruction, !- Name + TestMaterial, !- Inside Layer + InfraredTransparent, !- Layer 2 + TestMaterial; !- Outside Layer - Material, - TestMaterial, - Rough, !- Roughness - 0.10, !- Thickness {m} - 0.5, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 1200, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - Material:InfraredTransparent, - InfraredTransparent; !- Name - """ - -no_mass = """ - Construction, - TestConstruction, !- Name - TestMaterial, !- Inside Layer - NoMass, !- Layer 2 - TestMaterial; !- Outside Layer + Material, + TestMaterial, + Rough, !- Roughness + 0.10, !- Thickness {m} + 0.5, !- Conductivity {W/m-K} + 1000.0, !- Density {kg/m3} + 1200, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + Material:InfraredTransparent, + InfraredTransparent; !- Name + """ + + no_mass = """ + Construction, + TestConstruction, !- Name + TestMaterial, !- Inside Layer + NoMass, !- Layer 2 + TestMaterial; !- Outside Layer - Material, - TestMaterial, - Rough, !- Roughness - 0.10, !- Thickness {m} - 0.5, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 1200, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - Material:NoMass, - NoMass, ! Material Name - , ! Roughness - 0.1, ! Resistance {M**2K/W} - , ! Thermal Absorptance - , ! Solar Absorptance - ; ! Visible Absorptance - """ - -roof_vegetation = """ - Construction, - TestConstruction, !- Name - RoofVegetation; !- Inside Layer + Material, + TestMaterial, + Rough, !- Roughness + 0.10, !- Thickness {m} + 0.5, !- Conductivity {W/m-K} + 1000.0, !- Density {kg/m3} + 1200, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + Material:NoMass, + NoMass, ! Material Name + , ! Roughness + 0.1, ! Resistance {M**2K/W} + , ! Thermal Absorptance + , ! Solar Absorptance + ; ! Visible Absorptance + """ + + roof_vegetation = """ + Construction, + TestConstruction, !- Name + RoofVegetation; !- Inside Layer - Material:RoofVegetation, - RoofVegetation, !- Name - , !- Height of Plants {m} - , !- Leaf Area Index {dimensionless} - , !- Leaf Reflectivity {dimensionless} - , !- Leaf Emissivity - , !- Minimum Stomatal Resistance {s/m} - , !- Soil Layer Name - , !- Roughness - 0.1, !- Thickness {m} - 0.5, !- Conductivity of Dry Soil {W/m-K} - 1000, !- Density of Dry Soil {kg/m3} - 1200, !- Specific Heat of Dry Soil {J/kg-K} - , !- Thermal Absorptance - , !- Solar Absorptance - , !- Visible Absorptance - , !- Saturation Volumetric Moisture Content of the Soil Layer - , !- Residual Volumetric Moisture Content of the Soil Layer - , !- Initial Volumetric Moisture Content of the Soil Layer - ; !- Moisture Diffusion Calculation Method - """ + Material:RoofVegetation, + RoofVegetation, !- Name + , !- Height of Plants {m} + , !- Leaf Area Index {dimensionless} + , !- Leaf Reflectivity {dimensionless} + , !- Leaf Emissivity + , !- Minimum Stomatal Resistance {s/m} + , !- Soil Layer Name + , !- Roughness + 0.1, !- Thickness {m} + 0.5, !- Conductivity of Dry Soil {W/m-K} + 1000, !- Density of Dry Soil {kg/m3} + 1200, !- Specific Heat of Dry Soil {J/kg-K} + , !- Thermal Absorptance + , !- Solar Absorptance + , !- Visible Absorptance + , !- Saturation Volumetric Moisture Content of the Soil Layer + , !- Residual Volumetric Moisture Content of the Soil Layer + , !- Initial Volumetric Moisture Content of the Soil Layer + ; !- Moisture Diffusion Calculation Method + """ class Test_ThermalProperties(object): @@ -181,7 +187,9 @@ def setup_method(self, test_method): self.idf = IDF() def test_rvalue_1_layer_construction(self): - self.idf.initreadtxt(single_layer) + self.idf.initreadtxt(Data.single_layer) + print(1, self.idf.iddname) + print(2, list(self.idf.idfobjects.keys())) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = INSIDE_FILM_R + m.Thickness / m.Conductivity + OUTSIDE_FILM_R @@ -189,7 +197,7 @@ def test_rvalue_1_layer_construction(self): assert c.rvalue == 0.35 def test_rvalue_fails(self): - self.idf.initreadtxt(expected_failure) + self.idf.initreadtxt(Data.expected_failure) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") try: c.rvalue @@ -198,7 +206,7 @@ def test_rvalue_fails(self): assert str(e) == "Skyhooks material not found in IDF" def test_rvalue_2_layer_construction(self): - self.idf.initreadtxt(double_layer) + self.idf.initreadtxt(Data.double_layer) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = ( @@ -211,7 +219,7 @@ def test_rvalue_2_layer_construction(self): assert c.rvalue == 0.55 def test_rvalue_airgap_construction(self): - self.idf.initreadtxt(air_gap) + self.idf.initreadtxt(Data.air_gap) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") a = self.idf.getobject("MATERIAL:AIRGAP", "AirGap") @@ -226,7 +234,7 @@ def test_rvalue_airgap_construction(self): assert almostequal(c.rvalue, 0.65, places=2) def test_rvalue_infraredtransparent_construction(self): - self.idf.initreadtxt(infrared_transparent) + self.idf.initreadtxt(Data.infrared_transparent) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = ( @@ -239,7 +247,7 @@ def test_rvalue_infraredtransparent_construction(self): assert almostequal(c.rvalue, 0.55, places=2) def test_rvalue_nomass_construction(self): - self.idf.initreadtxt(no_mass) + self.idf.initreadtxt(Data.no_mass) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") n = self.idf.getobject("MATERIAL:NOMASS", "NoMass") @@ -254,7 +262,7 @@ def test_rvalue_nomass_construction(self): assert almostequal(c.rvalue, 0.65, places=2) def test_rvalue_roofvegetation_construction(self): - self.idf.initreadtxt(roof_vegetation) + self.idf.initreadtxt(Data.roof_vegetation) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL:ROOFVEGETATION", "RoofVegetation") expected = ( @@ -268,14 +276,14 @@ def test_rvalue_roofvegetation_construction(self): assert issubclass(w[-1].category, UserWarning) def test_rvalue_material(self): - self.idf.initreadtxt(single_layer) + self.idf.initreadtxt(Data.single_layer) m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness / m.Conductivity assert m.rvalue == expected assert m.rvalue == 0.2 def test_ufactor_1_layer_construction(self): - self.idf.initreadtxt(single_layer) + self.idf.initreadtxt(Data.single_layer) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = 1 / (INSIDE_FILM_R + m.Thickness / m.Conductivity + OUTSIDE_FILM_R) @@ -283,7 +291,7 @@ def test_ufactor_1_layer_construction(self): assert c.ufactor == 1 / 0.35 def test_ufactor_2_layer_construction(self): - self.idf.initreadtxt(double_layer) + self.idf.initreadtxt(Data.double_layer) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = 1 / ( @@ -296,7 +304,7 @@ def test_ufactor_2_layer_construction(self): assert c.ufactor == 1 / 0.55 def test_ufactor_airgap_construction(self): - self.idf.initreadtxt(air_gap) + self.idf.initreadtxt(Data.air_gap) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") a = self.idf.getobject("MATERIAL:AIRGAP", "AirGap") @@ -311,7 +319,7 @@ def test_ufactor_airgap_construction(self): assert almostequal(c.ufactor, 1 / 0.65, places=2) def test_ufactor_infraredtransparent_construction(self): - self.idf.initreadtxt(infrared_transparent) + self.idf.initreadtxt(Data.infrared_transparent) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = 1 / ( @@ -324,7 +332,7 @@ def test_ufactor_infraredtransparent_construction(self): assert almostequal(c.ufactor, 1 / 0.55, places=2) def test_ufactor_nomass_construction(self): - self.idf.initreadtxt(no_mass) + self.idf.initreadtxt(Data.no_mass) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") n = self.idf.getobject("MATERIAL:NOMASS", "NoMass") @@ -339,7 +347,7 @@ def test_ufactor_nomass_construction(self): assert almostequal(c.ufactor, 1 / 0.65, places=2) def test_ufactor_roofvegetation_construction(self): - self.idf.initreadtxt(roof_vegetation) + self.idf.initreadtxt(Data.roof_vegetation) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL:ROOFVEGETATION", "RoofVegetation") expected = 1 / ( @@ -353,14 +361,14 @@ def test_ufactor_roofvegetation_construction(self): assert issubclass(w[-1].category, UserWarning) def test_ufactor_material(self): - self.idf.initreadtxt(single_layer) + self.idf.initreadtxt(Data.single_layer) m = self.idf.getobject("MATERIAL", "TestMaterial") expected = 1 / (m.Thickness / m.Conductivity) assert m.ufactor == expected assert m.ufactor == 1 / 0.2 def test_heatcapacity_1_layer_construction(self): - self.idf.initreadtxt(single_layer) + self.idf.initreadtxt(Data.single_layer) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness * m.Specific_Heat * m.Density * 0.001 @@ -368,7 +376,7 @@ def test_heatcapacity_1_layer_construction(self): assert c.heatcapacity == 120 def test_heatcapacity_2_layer_construction(self): - self.idf.initreadtxt(double_layer) + self.idf.initreadtxt(Data.double_layer) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness * m.Specific_Heat * m.Density * 0.001 * 2 @@ -376,7 +384,7 @@ def test_heatcapacity_2_layer_construction(self): assert c.heatcapacity == 240 def test_heatcapacity_airgap_construction(self): - self.idf.initreadtxt(air_gap) + self.idf.initreadtxt(Data.air_gap) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness * m.Specific_Heat * m.Density * 0.001 * 2 @@ -384,7 +392,7 @@ def test_heatcapacity_airgap_construction(self): assert almostequal(c.heatcapacity, 240, places=2) def test_heatcapacity_infraredtransparent_construction(self): - self.idf.initreadtxt(infrared_transparent) + self.idf.initreadtxt(Data.infrared_transparent) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness * m.Specific_Heat * m.Density * 0.001 * 2 @@ -392,7 +400,7 @@ def test_heatcapacity_infraredtransparent_construction(self): assert almostequal(c.heatcapacity, 240, places=2) def test_heatcapacity_nomass_construction(self): - self.idf.initreadtxt(no_mass) + self.idf.initreadtxt(Data.no_mass) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness * m.Specific_Heat * m.Density * 0.001 * 2 @@ -403,7 +411,7 @@ def test_heatcapacity_nomass_construction(self): assert issubclass(w[-1].category, UserWarning) def test_heatcapacity_roofvegetation_construction(self): - self.idf.initreadtxt(roof_vegetation) + self.idf.initreadtxt(Data.roof_vegetation) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL:ROOFVEGETATION", "RoofVegetation") expected = ( @@ -417,7 +425,7 @@ def test_heatcapacity_roofvegetation_construction(self): assert issubclass(w[-1].category, UserWarning) def test_heatcapacity_material(self): - self.idf.initreadtxt(single_layer) + self.idf.initreadtxt(Data.single_layer) m = self.idf.getobject("MATERIAL", "TestMaterial") expected = m.Thickness * m.Specific_Heat * m.Density * 0.001 assert m.heatcapacity == expected From a7b08ab91c6c37d0427bce44ce570f7abebef002 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Thu, 8 Dec 2022 10:54:45 -0800 Subject: [PATCH 06/68] fixed issue #409 :Problem: eppy.newidf(version=None) does not work correctly :Solution: There are starting conditions here: 1. IDD is already set - if IDD has been set, it should use that IDD 2. IDD has not been set - if eppy.newidf(version=None), it should throw an exception - if eppy.newidf(version=some_version), it shoule use that some_version of IDD --- requirements.txt | 2 +- tests/conftest.py | 13 ++++--------- tests/test_bunch_subclass.py | 15 +++++++++------ tests/test_bunch_subclass_functions.py | 12 ++++++++---- tests/test_easyopen.py | 25 +++++-------------------- tests/test_eppy.py | 21 +++++---------------- tests/test_extend_extensible.py | 12 ++++++++---- tests/test_fanpower.py | 12 ++++++++---- tests/test_function_helpers.py | 12 ++++++++---- tests/test_hvacbuilder.py | 19 ++++++++----------- tests/test_idf_helpers.py | 12 ++++++++---- tests/test_json_functions.py | 14 ++++++++------ tests/test_modeleditor.py | 26 ++++++++++++-------------- tests/test_parse_error.py | 15 +++++---------- tests/test_runner.py | 22 +++------------------- tests/test_simpleread.py | 8 +++----- tests/test_thermal_properties.py | 15 +++++++++------ 17 files changed, 112 insertions(+), 143 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9143a17b..024e3c40 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ munch soupsieve beautifulsoup4 pydot -pyparsing +pyparsing>=3.0.9 pytest tinynumpy six diff --git a/tests/conftest.py b/tests/conftest.py index 0cc5159d..48d61289 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,13 +2,13 @@ import pytest from io import StringIO -from importlib import reload import eppy from eppy.modeleditor import IDF from eppy.iddcurrent import iddcurrent from eppy import modeleditor from .test_runner import versiontuple +from tests.pytest_helpers import safeIDDreset THIS_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -26,21 +26,16 @@ TEST_OLD_IDD = "Energy+V7_2_0.idd" + def teardown_module(module): """new IDD has been set in the module. Here you tear it down""" - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass + safeIDDreset() @pytest.fixture() def test_idf(): idd_file = os.path.join(IDD_FILES, TEST_IDD) idf_file = os.path.join(IDF_FILES, TEST_IDF) - try: - eppy.modeleditor.IDF.resetidd() # reload(modeleditor) - except eppy.modeleditor.IDDResetError as e: - pass # This is a way to change the IDD + safeIDDreset() modeleditor.IDF.setiddname(idd_file, testing=True) idf = modeleditor.IDF(idf_file, TEST_EPW) try: diff --git a/tests/test_bunch_subclass.py b/tests/test_bunch_subclass.py index 5f3fca52..155c4847 100644 --- a/tests/test_bunch_subclass.py +++ b/tests/test_bunch_subclass.py @@ -28,16 +28,19 @@ iddtxt = iddcurrent.iddtxt -# idd is read only once in this test -# if it has already been read from some other test, it will continue with -# the old reading + def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) # This test is ugly because I have to send file names and not able to send file handles idftxt = """Version,6.0; diff --git a/tests/test_bunch_subclass_functions.py b/tests/test_bunch_subclass_functions.py index c01df4b6..2b6a7cd6 100644 --- a/tests/test_bunch_subclass_functions.py +++ b/tests/test_bunch_subclass_functions.py @@ -19,13 +19,17 @@ def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddtxt = iddcurrent.iddtxt -# iddfhandle = StringIO(iddcurrent.iddtxt) -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) idftxt = """Version,8.0; diff --git a/tests/test_easyopen.py b/tests/test_easyopen.py index 412f1f5c..20a57464 100644 --- a/tests/test_easyopen.py +++ b/tests/test_easyopen.py @@ -22,16 +22,13 @@ import eppy.idd_helpers as idd_helpers -from six import StringIO -from importlib import reload +from io import StringIO +from tests.pytest_helpers import safeIDDreset def teardown_module(module): """new IDD has been set in the module. Here you tear it down""" - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass + safeIDDreset() def test_cleanupversion(): """py.test for cleanupversion""" @@ -56,13 +53,7 @@ def test_easyopen_idfopen(): txt, result = (" Version,{};".format(ver), "{}".format(ver)) fhandle1 = StringIO(txt) fhandle2 = StringIO(txt) - # reload(eppy) - # reload(modeleditor) - # reload(easyopen) - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass # This is a way to change the IDD + safeIDDreset() idf1, idf2 = easyopen.easyopen(fhandle1), eppy.openidf(fhandle2) for idf in [idf1, idf2]: versions = idf.idfobjects["version"] @@ -91,13 +82,7 @@ def test_easyopen_withidd(): txt, result = (" Version,{};".format(ver), "{}".format(ver)) fhandle1 = StringIO(txt) fhandle2 = StringIO(txt) - # reload(eppy) - # reload(modeleditor) - # reload(easyopen) - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass # This is a way to change the IDD + safeIDDreset() idf1, idf2 = ( easyopen.easyopen(fhandle1, idd=iddfile), eppy.openidf(fhandle2, idd=iddfile), diff --git a/tests/test_eppy.py b/tests/test_eppy.py index 23865f89..8dad20f2 100644 --- a/tests/test_eppy.py +++ b/tests/test_eppy.py @@ -12,17 +12,14 @@ import eppy from eppy.pytest_helpers import do_integration_tests import eppy.idd_helpers as idd_helpers +from tests.pytest_helpers import safeIDDreset IDDVERSION = "8.4.0" - def teardown_module(module): """new IDD has been set in the module. Here you tear it down""" - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass - + safeIDDreset() + def versiontuple(vers): """version tuple""" return tuple([int(num) for num in vers.split(".")]) @@ -60,11 +57,7 @@ def test_newidf2(): # 1. IDD is already set # - if IDD has been set, it should use that IDD - # reload(eppy.modeleditor) # this will reset the IDD to None - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass # This is a way to change the IDD + safeIDDreset() iddversion = IDDVERSION idf1 = eppy.newidf(version=iddversion) # this will set the IDD version idf2 = eppy.newidf(version=None) @@ -75,11 +68,7 @@ def test_newidf2(): idf3 = eppy.newidf(version=wrongiddversion) # 2. IDD has not been set # - if eppy.newidf(version=None), it should throw an exception - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass # This is a way to change the IDD - # reload(eppy.modeleditor) # this will reset the IDD to None + safeIDDreset() with pytest.raises(eppy.modeleditor.IDDNotSetError): idf4 = eppy.newidf(version=None) # - if eppy.newidf(version=some_version), it shoule use that some_version of IDD diff --git a/tests/test_extend_extensible.py b/tests/test_extend_extensible.py index 97f01108..48e31fb4 100644 --- a/tests/test_extend_extensible.py +++ b/tests/test_extend_extensible.py @@ -12,10 +12,15 @@ from eppy.modeleditor import IDF -# idd is read only once in this test -# if it has already been read from some other test, it will continue with -# the old reading def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) @@ -38,7 +43,6 @@ def test_read_overextended(): newstr = f"{astr} {extfields};" fhandle = StringIO(newstr) - print(1, IDF.iddname) idf = IDF(fhandle) wm = idf.idfobjects["WINDOWMATERIAL:GLAZINGGROUP:THERMOCHROMIC"] assert wm[0][f"Optical_Data_Temperature_{nn + 1}"] == nn - 1 diff --git a/tests/test_fanpower.py b/tests/test_fanpower.py index efa057e4..350431f5 100644 --- a/tests/test_fanpower.py +++ b/tests/test_fanpower.py @@ -20,13 +20,17 @@ def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) def test_pascal2inh2o(): diff --git a/tests/test_function_helpers.py b/tests/test_function_helpers.py index 2db0bdea..a0e1b216 100644 --- a/tests/test_function_helpers.py +++ b/tests/test_function_helpers.py @@ -21,13 +21,17 @@ from eppy.pytest_helpers import almostequal def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddtxt = iddcurrent.iddtxt -# iddfhandle = StringIO(iddcurrent.iddtxt) -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) idftxt = """Version,8.0; diff --git a/tests/test_hvacbuilder.py b/tests/test_hvacbuilder.py index e1520799..bbb7e0a7 100644 --- a/tests/test_hvacbuilder.py +++ b/tests/test_hvacbuilder.py @@ -18,15 +18,18 @@ from eppy.modeleditor import IDF -# idd is read only once in this test -# if it has already been read from some other test, it will continue with the old reading def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) def test_flattencopy(): @@ -100,12 +103,6 @@ def test_makeplantloop(): dloop = ["db0", ["db1", "db2", "db3"], "db4"] hvacbuilder.makeplantloop(idf1, loopname, sloop, dloop) idf2 = IDF(StringIO(nidf)) - # print('=' * 15) - # print(idf1.model) - # print('-' * 15) - # print(idf2.model) - # print('=' * 15) - print(1,idf2.getiddname()) assert str(idf1.model) == str(idf2.model) diff --git a/tests/test_idf_helpers.py b/tests/test_idf_helpers.py index 5f8665b0..cd5f8f55 100644 --- a/tests/test_idf_helpers.py +++ b/tests/test_idf_helpers.py @@ -18,13 +18,17 @@ import eppy.idf_helpers as idf_helpers def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) def test_idfobjectkeys(): diff --git a/tests/test_json_functions.py b/tests/test_json_functions.py index c9e8785a..a9d1d96d 100644 --- a/tests/test_json_functions.py +++ b/tests/test_json_functions.py @@ -19,16 +19,18 @@ from eppy import json_functions -# idd is read only once in this test -# if it has already been read from some other test, it will continue with -# the old reading def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) def test_key2elements(): diff --git a/tests/test_modeleditor.py b/tests/test_modeleditor.py index 42776630..152de7bc 100644 --- a/tests/test_modeleditor.py +++ b/tests/test_modeleditor.py @@ -21,8 +21,7 @@ import pytest -from six import StringIO -from six import string_types +from io import StringIO from eppy import modeleditor from eppy.bunch_subclass import Bunch @@ -32,23 +31,22 @@ import eppy.snippet as snippet -iddsnippet = iddcurrent.iddtxt idfsnippet = snippet.idfsnippet -# idffhandle = StringIO(idfsnippet) -# iddfhandle = StringIO(iddsnippet) -# bunchdt, data, commdct, gdict = idfreader.idfreader(idffhandle, iddfhandle, None) -# idd is read only once in this test -# if it has already been read from some other test, it will continue with -# the old reading def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) + def test_poptrailing(): @@ -520,14 +518,14 @@ def test_initread(): # test fname as unicode fname = "tmp.idf" - assert isinstance(fname, string_types) + assert isinstance(fname, str) idf = IDF() idf.initread(fname) assert idf.getobject("BUILDING", "Building") # test fname as str fname = str("tmp.idf") - assert isinstance(fname, string_types) + assert isinstance(fname, str) idf = IDF() idf.initread(fname) assert idf.getobject("BUILDING", "Building") diff --git a/tests/test_parse_error.py b/tests/test_parse_error.py index 9f368d79..1019f15a 100644 --- a/tests/test_parse_error.py +++ b/tests/test_parse_error.py @@ -1,7 +1,6 @@ import os import shutil import sys -from importlib import reload from six import StringIO @@ -9,13 +8,12 @@ from eppy import modeleditor from eppy.runner.run_functions import parse_error, EnergyPlusRunError +from tests.pytest_helpers import safeIDDreset + def teardown_module(module): """new IDD has been set in the module. Here you tear it down""" - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass + safeIDDreset() def test_capture_stderr(): tmp_out = StringIO() @@ -42,8 +40,5 @@ def test_capture_real_error(test_idf): assert "invalid Heating Setpoint Temperature Schedule" in str(e) finally: shutil.rmtree(rundir) - # reload(modeleditor) - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass # This is a way to change the IDD + safeIDDreset() + \ No newline at end of file diff --git a/tests/test_runner.py b/tests/test_runner.py index 57592195..d5a5dda5 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -24,7 +24,6 @@ import shutil import pytest -from importlib import reload import eppy from eppy import modeleditor @@ -33,6 +32,7 @@ from eppy.runner.run_functions import multirunner from eppy.runner.run_functions import run from eppy.runner.run_functions import runIDFs +from tests.pytest_helpers import safeIDDreset def versiontuple(vers): @@ -60,10 +60,7 @@ def versiontuple(vers): def teardown_module(module): """new IDD has been set in the module. Here you tear it down""" - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass + safeIDDreset() def has_severe_errors(results="run_outputs"): """Check for severe errors in the eplusout.end file.""" @@ -76,13 +73,7 @@ def has_severe_errors(results="run_outputs"): def test_version_reader(): """Test that get the expected idd_version when reading an IDF/IDD.""" - # We need to reload modeleditor since the IDF class may have had an IDD - # which causes problems. - # https://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module - try: - modeleditor.IDF.resetidd() # reload(modeleditor) - except modeleditor.IDDResetError as e: - pass # This is a way to change the IDD + safeIDDreset() iddfile = os.path.join(IDD_FILES, TEST_IDD) fname1 = os.path.join(IDF_FILES, TEST_IDF) modeleditor.IDF.setiddname(iddfile, testing=True) @@ -91,7 +82,6 @@ def test_version_reader(): assert ep_version == versiontuple(VERSION) ep_version = modeleditor.IDF.idd_version assert ep_version == versiontuple(VERSION) - # reload(modeleditor) @pytest.mark.skipif( @@ -147,7 +137,6 @@ class TestRunFunction(object): def setup(self): """Tidy up just in case anything is left from previous test runs.""" - # reload(modeleditor) os.chdir(THIS_DIR) shutil.rmtree("test_results", ignore_errors=True) shutil.rmtree("run_outputs", ignore_errors=True) @@ -157,7 +146,6 @@ def teardown(self): os.chdir(THIS_DIR) shutil.rmtree("test_results", ignore_errors=True) shutil.rmtree("run_outputs", ignore_errors=True) - # reload(modeleditor) def test_run_abs_paths(self): """ @@ -208,7 +196,6 @@ class TestIDFRunner(object): def setup(self): """Tidy up anything left from previous runs. Get an IDF object to run.""" - # reload(modeleditor) shutil.rmtree(os.path.join(THIS_DIR, "run_outputs"), ignore_errors=True) self.expected_files = [ @@ -260,7 +247,6 @@ def teardown(self): shutil.rmtree("run_outputs", ignore_errors=True) shutil.rmtree("other_run_outputs", ignore_errors=True) shutil.rmtree("test_results", ignore_errors=True) - # reload(modeleditor) for f in {"eplusout.end", "eplusout.err", "in.idf"}: try: os.remove(os.path.join(THIS_DIR, f)) @@ -616,7 +602,6 @@ class TestMultiprocessing(object): def setup(self): """Clear out any results from previous tests.""" - # reload(modeleditor) os.chdir(THIS_DIR) shutil.rmtree("multirun_outputs", ignore_errors=True) self.expected_files = [ @@ -640,7 +625,6 @@ def teardown(self): shutil.rmtree(results_dir) shutil.rmtree("test_results", ignore_errors=True) shutil.rmtree("run_outputs", ignore_errors=True) - # reload(modeleditor) def test_sequential_run(self): """ diff --git a/tests/test_simpleread.py b/tests/test_simpleread.py index 310a87a7..ab85ed07 100644 --- a/tests/test_simpleread.py +++ b/tests/test_simpleread.py @@ -12,14 +12,12 @@ from io import StringIO import eppy import eppy.simpleread as simpleread +from tests.pytest_helpers import safeIDDreset def teardown_module(module): """new IDD has been set in the module. Here you tear it down""" - try: - eppy.modeleditor.IDF.resetidd() - except eppy.modeleditor.IDDResetError as e: - pass - + safeIDDreset() + def test_idf2txt(): """py.test for idf2txt""" data = ( diff --git a/tests/test_thermal_properties.py b/tests/test_thermal_properties.py index 8301dcc9..250ca016 100644 --- a/tests/test_thermal_properties.py +++ b/tests/test_thermal_properties.py @@ -23,13 +23,18 @@ def setup_module(module): + """ + idd is read only once in this module + if it has already been read from some other module, it will continue + without reading it again + + pytest run this before running the module + """ + from eppy.iddcurrent import iddcurrent iddfhandle = StringIO(iddcurrent.iddtxt) if IDF.getiddname() == None: IDF.setiddname(iddfhandle) -# iddfhandle = StringIO(iddcurrent.iddtxt) -# -# if IDF.getiddname() == None: -# IDF.setiddname(iddfhandle) + class Data(object): """data""" @@ -188,8 +193,6 @@ def setup_method(self, test_method): def test_rvalue_1_layer_construction(self): self.idf.initreadtxt(Data.single_layer) - print(1, self.idf.iddname) - print(2, list(self.idf.idfobjects.keys())) c = self.idf.getobject("CONSTRUCTION", "TestConstruction") m = self.idf.getobject("MATERIAL", "TestMaterial") expected = INSIDE_FILM_R + m.Thickness / m.Conductivity + OUTSIDE_FILM_R From 619bca4ddf46a53a8e792b6b68b801cedb6d5646 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Thu, 8 Dec 2022 10:55:40 -0800 Subject: [PATCH 07/68] further fix to issue #409 modified: HISTORY.rst new file: tests/pytest_helpers.py --- HISTORY.rst | 17 +++++++++++++++++ tests/pytest_helpers.py | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/pytest_helpers.py diff --git a/HISTORY.rst b/HISTORY.rst index 55fa2276..5b8d82fb 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -5,6 +5,23 @@ History Changes ~~~~~~~ +2022-12-08 +---------- + +fixed issue #409 +```````````````` + +:Problem: eppy.newidf(version=None) does not work correctly +:Solution: + + There are starting conditions here: + + 1. IDD is already set + - if IDD has been set, it should use that IDD + 2. IDD has not been set + - if eppy.newidf(version=None), it should throw an exception + - if eppy.newidf(version=some_version), it shoule use that some_version of IDD + 2022-12-07 ---------- diff --git a/tests/pytest_helpers.py b/tests/pytest_helpers.py new file mode 100644 index 00000000..11e79328 --- /dev/null +++ b/tests/pytest_helpers.py @@ -0,0 +1,18 @@ +# Copyright (c) 2022 Santosh Philip +# ======================================================================= +# Distributed under the MIT License. +# (See accompanying file LICENSE or copy at +# http://opensource.org/licenses/MIT) +# ======================================================================= +"""helpers for pytest in eppy""" + + +import eppy + +def safeIDDreset(): + """reset the IDD for testing and catch the exception""" + try: + eppy.modeleditor.IDF.resetidd() + except eppy.modeleditor.IDDResetError as e: + pass + From dc760ea4563abcdf65a3af8b0ea1b15f95efa719 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 23 Dec 2022 09:14:35 -0800 Subject: [PATCH 08/68] Fixed issue #411 :Problem: eppy run functions does not throw an exception if weather file is missing :Solution: eppy run function throws Exception "EnergyPlusRunError" with message saying weather file missing --- eppy/runner/run_functions.py | 19 ++++++++++++++++--- eppy/runningnotes.txt | 17 +++++++++++++++++ tests/test_runner.py | 10 ++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/eppy/runner/run_functions.py b/eppy/runner/run_functions.py index d9413994..54843570 100644 --- a/eppy/runner/run_functions.py +++ b/eppy/runner/run_functions.py @@ -22,6 +22,8 @@ from subprocess import CalledProcessError, check_call import sys import tempfile +import errno + from io import StringIO @@ -343,10 +345,21 @@ def run( return # convert paths to absolute paths if required - if os.path.isfile(args["weather"]): - args["weather"] = os.path.abspath(args["weather"]) + hold_weather = args["weather"] + if os.path.isfile(hold_weather): + hold_weather = os.path.abspath(hold_weather) else: - args["weather"] = os.path.join(eplus_weather_path, args["weather"]) + hold_weather = os.path.join(eplus_weather_path, hold_weather) + # this will still work with non-existent file - fix for issue #411 + if not os.path.isfile(hold_weather): + # from https://stackoverflow.com/questions/36077266/how-do-i-raise-a-filenotfounderror-properly + raise EnergyPlusRunError( + f"ERROR: Could not find weather file: {hold_weather}" + ) + # errno.ENOENT, os.strerror(errno.ENOENT), hold_weather) + args["weather"] = hold_weather + + output_dir = os.path.abspath(args["output_directory"]) args["output_directory"] = output_dir if iddname is not None: diff --git a/eppy/runningnotes.txt b/eppy/runningnotes.txt index 237d0d1f..8f89459a 100644 --- a/eppy/runningnotes.txt +++ b/eppy/runningnotes.txt @@ -1,4 +1,21 @@ +2022-12-21 +---------- + +issue #411 +- Looks like just a space in the weatherfile path tripped it up +- confirm this +- strip the space -> solution +- check if it works with embedded spaces + - looks like embedded spaces are not an issue + +- code to fix this issue - DONE + - test if file exists + - throw exception + - do unit test for this exception - TODO +- check on unmethours issue +- respond to this at +- https://unmethours.com/question/58548/eppy-error-in-running-simulation-using-idfrun/ 2022-11-30 ---------- diff --git a/tests/test_runner.py b/tests/test_runner.py index d5a5dda5..406ff6b4 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -186,6 +186,15 @@ def test_run_missing_file_raises_error(self, capfd): out, _err = capfd.readouterr() assert "ERROR: Could not find input data file:" in out + def test_missing_weatherfile_raises_error(self, capfd): + """pytest for exception if weather file is missing""" + fname1 = os.path.join(IDF_FILES, TEST_IDF) + epw = os.path.join(eplus_weather, "XXXXXX_fake_weather_file.epw") + with pytest.raises(EnergyPlusRunError): + run(fname1, epw, output_directory="test_results", ep_version=VERSION) + out, _err = capfd.readouterr() + assert "No such file or directory" in out + @pytest.mark.skipif( not do_integration_tests(), reason="$EPPY_INTEGRATION env var not set" @@ -737,3 +746,4 @@ def test_multiprocess_run_IDF_from_generator(self): multirunfolder = os.path.join(THIS_DIR, "multi_runs") assert os.path.exists(multirunfolder) shutil.rmtree(multirunfolder, ignore_errors=True) + From 01a7b4dc542aae254b0c88170a4799f6a1d4e6bc Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 23 Dec 2022 09:17:18 -0800 Subject: [PATCH 09/68] modified: HISTORY.rst --- HISTORY.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 5b8d82fb..212a3f41 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -5,6 +5,17 @@ History Changes ~~~~~~~ + +2022-12-23 +---------- + +Fixed issue #411 +```````````````` + +:Problem: eppy run functions does not throw an exception if weather file is missing +:Solution: eppy run function throws Exception "EnergyPlusRunError" with message saying weather file missing + + 2022-12-08 ---------- From 529247bba248df089c4afd8d8accdd7649cd19e0 Mon Sep 17 00:00:00 2001 From: Dragan Stevanovic Date: Fri, 17 Mar 2023 09:11:21 +0100 Subject: [PATCH 10/68] Resolves issue #414 with hanging temporary folders --- eppy/runner/run_functions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eppy/runner/run_functions.py b/eppy/runner/run_functions.py index 54843570..64e292bb 100644 --- a/eppy/runner/run_functions.py +++ b/eppy/runner/run_functions.py @@ -410,6 +410,7 @@ def run( finally: sys.stderr = old_err os.chdir(cwd) + shutil.rmtree(run_dir, ignore_errors=True) return "OK" From 0f68c61023ee6fbfb1afd76b7c03c4a0ef24a969 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 3 Nov 2023 19:13:53 -0700 Subject: [PATCH 11/68] new file: .github/workflows/main.yml --- .github/workflows/main.yml | 57 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..9e30ac4d --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,57 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python + +name: eppy package + +on: + push: + branches: [ "branchtest" ] + inputs: + energyplus-version: + description: 'EnergyPlus major.minor.patch version' + required: true + default: 9.0.1 + energyplus-sha: + description: 'EnergyPlus version SHA' + required: true + default: 921312fa1d + energyplus-install: + description: 'EnergyPlus major-minor-patch version' + default: 9-0-1 + required: true + + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.11", ] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - run: echo Installing EnergyPlusV${{ inputs.energyplus-version }}... + shell: bash + - run: echo "${{ github.action_path }}" >> $GITHUB_PATH + shell: bash + - run: bash .github/workflows/install.sh + shell: bash + env: + ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} + ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} + ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} + + - name: Test with pytest + run: | + pytest From 1e8cb48a66b0058ac6ffdf08464dfe1378ff6e5d Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 3 Nov 2023 19:15:51 -0700 Subject: [PATCH 12/68] new file: .github/workflows/install.sh --- .github/workflows/install.sh | 92 ++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100755 .github/workflows/install.sh diff --git a/.github/workflows/install.sh b/.github/workflows/install.sh new file mode 100755 index 00000000..cd95096c --- /dev/null +++ b/.github/workflows/install.sh @@ -0,0 +1,92 @@ +#!/bin/bash +function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; } +# Check if EnergyPlus env variables exist already. If not use these defaults +if [[ -z "${ENERGYPLUS_VERSION}" ]]; then + export ENERGYPLUS_VERSION=9.2.0 +fi +if [[ -z "${ENERGYPLUS_SHA}" ]]; then + export ENERGYPLUS_SHA=921312fa1d +fi +if [[ -z "${ENERGYPLUS_INSTALL_VERSION}" ]]; then + export ENERGYPLUS_INSTALL_VERSION=9-2-0 +fi + +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + if version_gt $ENERGYPLUS_VERSION 9.3.0; then + export EXT="sh" + export PLATFORM=Linux-Ubuntu18.04 + else + export EXT="sh" + export PLATFORM=Linux + fi + export ATTCHBASE=67022360382 + export ATTCHNUM="multipletransitionidfversionupdater-lin.tar.gz" +elif [[ "$OSTYPE" == "darwin"* ]]; then + if version_gt $ENERGYPLUS_VERSION 9.3.0; then + export EXT=dmg + export PLATFORM=Darwin-macOS10.15 + else + export EXT=dmg + export PLATFORM=Darwin + fi + export ATTCHBASE=67022360547 + export ATTCHNUM="idfversionupdater-macos-v8.4.0.zip" +elif [[ "$OSTYPE" == "win"* || "$OSTYPE" == "msys"* ]]; then + export EXT=zip + export PLATFORM=Windows + export ATTCHBASE=67022360088 + export ATTCHNUM="multipletransitionidfversionupdater-win.zip" +fi +# Download EnergyPlus executable +ENERGYPLUS_DOWNLOAD_BASE_URL=https://github.com/NREL/EnergyPlus/releases/download/v$ENERGYPLUS_VERSION +ENERGYPLUS_DOWNLOAD_FILENAME=EnergyPlus-$ENERGYPLUS_VERSION-$ENERGYPLUS_SHA-$PLATFORM-x86_64 +ENERGYPLUS_DOWNLOAD_URL=$ENERGYPLUS_DOWNLOAD_BASE_URL/$ENERGYPLUS_DOWNLOAD_FILENAME.$EXT +echo "$ENERGYPLUS_DOWNLOAD_URL" +curl --fail -SL -C - "$ENERGYPLUS_DOWNLOAD_URL" -o "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT + +# Extra downloads +EXTRAS_DOWNLOAD_URL=https://energyplushelp.freshdesk.com/helpdesk/attachments/$ATTCHBASE +curl --fail -SL -C - $EXTRAS_DOWNLOAD_URL -o $ATTCHNUM + +# Install EnergyPlus and Extra Downloads +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + sudo chmod +x "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT + printf "y\r" | sudo ./"$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT + sudo tar zxvf $ATTCHNUM -C /usr/local/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/PreProcess/IDFVersionUpdater + sudo chmod -R a+rwx /usr/local/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/PreProcess/IDFVersionUpdater + sudo chmod -R a+rwx /usr/local/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/ExampleFiles + # cleanup + sudo rm "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT + sudo rm $ATTCHNUM +elif [[ "$OSTYPE" == "darwin"* ]]; then + # getting custom install script https://github.com/NREL/EnergyPlus/pull/7615 + curl -SL -C - https://raw.githubusercontent.com/jmarrec/EnergyPlus/40afb275f66201db5305f54df6c070d0b0cb4fc3/cmake/qtifw/install_script.qs -o install_script.qs + sudo hdiutil attach "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT + sudo /Volumes/"$ENERGYPLUS_DOWNLOAD_FILENAME"/"$ENERGYPLUS_DOWNLOAD_FILENAME".app/Contents/MacOS/"$ENERGYPLUS_DOWNLOAD_FILENAME" --verbose --script install_script.qs + sudo tar zxvf $ATTCHNUM -C /Applications/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/PreProcess + sudo chmod -R a+rwx /Applications/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/PreProcess/IDFVersionUpdater + sudo chmod -R a+rwx /Applications/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/ExampleFiles + # cleanup + sudo rm install_script.qs + sudo rm "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT + sudo rm $ATTCHNUM +elif [[ "$OSTYPE" == "win"* || "$OSTYPE" == "msys"* ]]; then + # On windows, we are simply extracting the zip file to c:\\ + echo "Extracting and Copying files to... C:\\" + powershell Expand-Archive -Path $ENERGYPLUS_DOWNLOAD_FILENAME.$EXT -DestinationPath C:\\ + powershell Rename-Item -Path c:\\$ENERGYPLUS_DOWNLOAD_FILENAME -NewName EnergyPlusV"$ENERGYPLUS_INSTALL_VERSION" + # extract extra downloads to destination + DEST=C:\\EnergyPlusV"$ENERGYPLUS_INSTALL_VERSION"\\PreProcess\\IDFVersionUpdater + echo "Extracting and Copying files to... $DEST" + powershell Expand-Archive -Path $ATTCHNUM -DestinationPath "$DEST" -Force + # cleanup + rm -v $ENERGYPLUS_DOWNLOAD_FILENAME.$EXT + rm -v $ATTCHNUM + IDD=C:\\EnergyPlusV"$ENERGYPLUS_INSTALL_VERSION"\\Energy+.idd + if [ -f "$IDD" ]; then + echo "$IDD" exists + else + echo "$IDD" does not exist + travis_terminate 1 + fi +fi From 748ea713fbe96539b012a6b81181257ff418d99c Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 3 Nov 2023 19:22:34 -0700 Subject: [PATCH 13/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9e30ac4d..477f11de 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,4 +54,4 @@ jobs: - name: Test with pytest run: | - pytest + pytest -x From 40993234bc9e48a7fb87ee654d0c38ce9f523243 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 3 Nov 2023 19:28:22 -0700 Subject: [PATCH 14/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 477f11de..ad58cab9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,14 +10,14 @@ on: energyplus-version: description: 'EnergyPlus major.minor.patch version' required: true - default: 9.0.1 + default: 8.9.0 energyplus-sha: description: 'EnergyPlus version SHA' required: true default: 921312fa1d energyplus-install: description: 'EnergyPlus major-minor-patch version' - default: 9-0-1 + default: 8-9-0 required: true From d5a211d2a88af2a63ce43530a42c8575c42a6fba Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Fri, 3 Nov 2023 19:30:56 -0700 Subject: [PATCH 15/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ad58cab9..e0c407a2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,4 +54,4 @@ jobs: - name: Test with pytest run: | - pytest -x + pytest -vx From d5c4f6a9f1a13939ef7a665a8761107aa12f4715 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 05:54:14 -0700 Subject: [PATCH 16/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e0c407a2..ed5407d8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,4 +54,4 @@ jobs: - name: Test with pytest run: | - pytest -vx + pytest -vx tests/test_modeleditor1.py \ No newline at end of file From 69b9db5ca5a4bc39cacfab31ddb0b9c3898541e0 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 07:35:26 -0700 Subject: [PATCH 17/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ed5407d8..6e6ed067 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,4 +54,4 @@ jobs: - name: Test with pytest run: | - pytest -vx tests/test_modeleditor1.py \ No newline at end of file + pytest -vx tests/test_parse_error.py \ No newline at end of file From a2c50eda31c693805a453e10082a182af7472ba2 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:20:36 -0700 Subject: [PATCH 18/68] modified: tests/test_parse_error.py --- tests/test_parse_error.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/test_parse_error.py b/tests/test_parse_error.py index 1019f15a..339c48bb 100644 --- a/tests/test_parse_error.py +++ b/tests/test_parse_error.py @@ -25,20 +25,20 @@ def test_capture_stderr(): sys.stderr = sys.__stderr__ -def test_capture_real_error(test_idf): - test_idf.newidfobject( - "HVACTemplate:Thermostat", - Name="thermostat VRF", - Heating_Setpoint_Schedule_Name=15, - Constant_Cooling_Setpoint=25, - ) - rundir = "test_capture_real_error" - os.mkdir(rundir) - try: - test_idf.run(output_directory=rundir) - except EnergyPlusRunError as e: - assert "invalid Heating Setpoint Temperature Schedule" in str(e) - finally: - shutil.rmtree(rundir) - safeIDDreset() +# def test_capture_real_error(test_idf): +# test_idf.newidfobject( +# "HVACTemplate:Thermostat", +# Name="thermostat VRF", +# Heating_Setpoint_Schedule_Name=15, +# Constant_Cooling_Setpoint=25, +# ) +# rundir = "test_capture_real_error" +# os.mkdir(rundir) +# try: +# test_idf.run(output_directory=rundir) +# except EnergyPlusRunError as e: +# assert "invalid Heating Setpoint Temperature Schedule" in str(e) +# finally: +# shutil.rmtree(rundir) +# safeIDDreset() \ No newline at end of file From 650b37f27f1be0e75eb7a2855c579cc96d837906 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:21:37 -0700 Subject: [PATCH 19/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6e6ed067..c75b69c9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,4 +54,4 @@ jobs: - name: Test with pytest run: | - pytest -vx tests/test_parse_error.py \ No newline at end of file + pytest -vx \ No newline at end of file From b881f50384c6270780ad945803116ef2cff41078 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:23:33 -0700 Subject: [PATCH 20/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c75b69c9..a4812a72 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,4 +54,4 @@ jobs: - name: Test with pytest run: | - pytest -vx \ No newline at end of file + pytest -vx tests/test_runner.py \ No newline at end of file From 5e363c9c9ce3d3f4c610ed5b2168aa699f524226 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:25:36 -0700 Subject: [PATCH 21/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a4812a72..f766d5ad 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,6 +51,7 @@ jobs: ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} + EPPY_INTEGRATION: True - name: Test with pytest run: | From 2abe416ec4fea8f47b6cf75ed2b4bb6d681da3f8 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:28:28 -0700 Subject: [PATCH 22/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f766d5ad..32b57881 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,7 +51,7 @@ jobs: ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} - EPPY_INTEGRATION: True + EPPY_INTEGRATION: "True" - name: Test with pytest run: | From d4bcb56e22763a9bb3f1578ac64fa3474b06e93b Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:47:55 -0700 Subject: [PATCH 23/68] modified: eppy/pytest_helpers.py --- eppy/pytest_helpers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index 6dfd695c..eb7dec9a 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -32,7 +32,10 @@ def do_integration_tests(): bool """ - return os.getenv("EPPY_INTEGRATION", False) + result = os.getenv("EPPY_INTEGRATION", False) + if result == "True": # github CI returns strings 9no booleans) + result = True + return result def almostequal(first, second, places=7, printit=True): From 6cfe5a04ffff34a92002e6b7fa94a8bf5c3e80d2 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:51:19 -0700 Subject: [PATCH 24/68] modified: eppy/pytest_helpers.py --- eppy/pytest_helpers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index eb7dec9a..ea5dc65a 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -35,6 +35,7 @@ def do_integration_tests(): result = os.getenv("EPPY_INTEGRATION", False) if result == "True": # github CI returns strings 9no booleans) result = True + print(f" **** EPPY_INTEGRATION = {result}") return result From 82b2418678ad0a9457751841e484202528c87a5a Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:54:14 -0700 Subject: [PATCH 25/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 32b57881..590ee769 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -55,4 +55,4 @@ jobs: - name: Test with pytest run: | - pytest -vx tests/test_runner.py \ No newline at end of file + pytest -vs tests/test_runner.py \ No newline at end of file From 4efb7c3293a08017a041bf389fefaf7de0be4704 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 08:57:13 -0700 Subject: [PATCH 26/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 590ee769..e0f53ba0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,7 +51,7 @@ jobs: ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} - EPPY_INTEGRATION: "True" + EPPY_INTEGRATION: True - name: Test with pytest run: | From a1a5b0661214ffc5b432efb243ffaff198a24b9d Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:04:02 -0700 Subject: [PATCH 27/68] modified: eppy/pytest_helpers.py --- eppy/pytest_helpers.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index ea5dc65a..ac6dbf63 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -32,7 +32,12 @@ def do_integration_tests(): bool """ - result = os.getenv("EPPY_INTEGRATION", False) + try: + result = os.environ["EPPY_INTEGRATION"] + print(f" Actual EPPY_INTEGRATION = {result}") + except KeyError as e: + result = False + # result = os.getenv("EPPY_INTEGRATION", False) if result == "True": # github CI returns strings 9no booleans) result = True print(f" **** EPPY_INTEGRATION = {result}") From 31c6042462cba681b74a3bd3c4cbd1264563f90a Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:11:39 -0700 Subject: [PATCH 28/68] modified: eppy/pytest_helpers.py --- eppy/pytest_helpers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index ac6dbf63..56b9a678 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -33,7 +33,9 @@ def do_integration_tests(): """ try: - result = os.environ["EPPY_INTEGRATION"] + # print(f"{os.environ['LANG'] = }") + print(f"{os.environ['ENERGYPLUS_VERSION'] = }") + result = os.environ['EPPY_INTEGRATION'] print(f" Actual EPPY_INTEGRATION = {result}") except KeyError as e: result = False From 864ba8edd7c5854602b63f2968d358fdf76c7c35 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:14:12 -0700 Subject: [PATCH 29/68] modified: eppy/pytest_helpers.py --- eppy/pytest_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index 56b9a678..c35b3fa9 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -34,7 +34,7 @@ def do_integration_tests(): """ try: # print(f"{os.environ['LANG'] = }") - print(f"{os.environ['ENERGYPLUS_VERSION'] = }") + print(f"{os.environ['GITHUB_ACTION'] = }") result = os.environ['EPPY_INTEGRATION'] print(f" Actual EPPY_INTEGRATION = {result}") except KeyError as e: From 963442c71a7d147a3a52edc4d76276f5b6d6ee43 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:21:13 -0700 Subject: [PATCH 30/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e0f53ba0..7630fe35 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,8 +51,9 @@ jobs: ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} - EPPY_INTEGRATION: True - name: Test with pytest + env: + EPPY_INTEGRATION: True run: | pytest -vs tests/test_runner.py \ No newline at end of file From 9eda81b4a5da01ce5bd765b345881ea21d09f60d Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:24:43 -0700 Subject: [PATCH 31/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7630fe35..8aee1c92 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,6 +54,9 @@ jobs: - name: Test with pytest env: + ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} + ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} + ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} EPPY_INTEGRATION: True run: | pytest -vs tests/test_runner.py \ No newline at end of file From aa8ba7068b4e2240ed9bb97acb3476a543c61a2f Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:49:21 -0700 Subject: [PATCH 32/68] modified: tests/conftest.py modified: tests/test_runner.py --- tests/conftest.py | 2 +- tests/test_runner.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 48d61289..cbe8770c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -17,7 +17,7 @@ IDD_FILES = os.path.join(RESOURCES_DIR, "iddfiles") IDF_FILES = os.path.join(RESOURCES_DIR, "idffiles") try: - VERSION = os.environ["ENERGYPLUS_INSTALL_VERSION"] # used in CI files + VERSION = os.environ['ENERGYPLUS_INSTALL_VERSION'] # used in CI files except KeyError: VERSION = "8-9-0" # current default for integration tests on local system TEST_IDF = "V{}/smallfile.idf".format(VERSION[:3].replace("-", "_")) diff --git a/tests/test_runner.py b/tests/test_runner.py index 406ff6b4..199e3c4d 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -47,7 +47,7 @@ def versiontuple(vers): IDD_FILES = os.path.join(RESOURCES_DIR, "iddfiles") IDF_FILES = os.path.join(RESOURCES_DIR, "idffiles") try: - VERSION = os.environ["ENERGYPLUS_INSTALL_VERSION"] # used in CI files + VERSION = os.environ['ENERGYPLUS_INSTALL_VERSION'] # used in CI files except KeyError: VERSION = "8-9-0" # current default for integration tests on local system TEST_IDF = "V{}/smallfile.idf".format(VERSION[:3].replace("-", "_")) From a53e3f3ff78b27069e844e117fd1a0dc346f1fbf Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sat, 4 Nov 2023 09:51:32 -0700 Subject: [PATCH 33/68] modified: tests/test_runner.py --- tests/test_runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_runner.py b/tests/test_runner.py index 199e3c4d..4e7e1e7d 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -37,6 +37,7 @@ def versiontuple(vers): """version tuple""" + print(f"{vers = }") return tuple([int(num) for num in vers.split("-")]) From bcdc693be359c7b9c8cb2ca7d92364a5f02241e5 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sun, 5 Nov 2023 07:59:06 -0800 Subject: [PATCH 34/68] modified: eppy/pytest_helpers.py --- eppy/pytest_helpers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index c35b3fa9..bd946908 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -35,6 +35,8 @@ def do_integration_tests(): try: # print(f"{os.environ['LANG'] = }") print(f"{os.environ['GITHUB_ACTION'] = }") + print(f"{os.environ['ENERGYPLUS_INSTALL_VERSION'] = }") + print(f"{os.environ['ENERGYPLUS_VERSION'] = }") result = os.environ['EPPY_INTEGRATION'] print(f" Actual EPPY_INTEGRATION = {result}") except KeyError as e: From 1d296933a624e35ed95057ec01a7e620f5ee7700 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sun, 5 Nov 2023 08:04:23 -0800 Subject: [PATCH 35/68] modified: .github/workflows/main.yml modified: eppy/pytest_helpers.py --- .github/workflows/main.yml | 4 ++-- eppy/pytest_helpers.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8aee1c92..b9cc41be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,9 +54,9 @@ jobs: - name: Test with pytest env: - ENERGYPLUS_VERSION: ${{ inputs.energyplus-version }} + ENERGYPLUS_VERSION: 8.9.0 ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} - ENERGYPLUS_INSTALL_VERSION: ${{ inputs.energyplus-install }} + ENERGYPLUS_INSTALL_VERSION: 8-9-0 EPPY_INTEGRATION: True run: | pytest -vs tests/test_runner.py \ No newline at end of file diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index bd946908..d828566d 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -35,8 +35,10 @@ def do_integration_tests(): try: # print(f"{os.environ['LANG'] = }") print(f"{os.environ['GITHUB_ACTION'] = }") - print(f"{os.environ['ENERGYPLUS_INSTALL_VERSION'] = }") + print(f"{os.environ['ENERGYPLUS_SHA'] = }") print(f"{os.environ['ENERGYPLUS_VERSION'] = }") + print(f"{os.environ['ENERGYPLUS_INSTALL_VERSION'] = }") + print(f"{os.environ['EPPY_INTEGRATION'] = }") result = os.environ['EPPY_INTEGRATION'] print(f" Actual EPPY_INTEGRATION = {result}") except KeyError as e: From 0e6fa44bcc9e81d70ac7540898c74a5e2465d572 Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sun, 5 Nov 2023 08:07:08 -0800 Subject: [PATCH 36/68] modified: .github/workflows/main.yml --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b9cc41be..a46ac433 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,14 +10,14 @@ on: energyplus-version: description: 'EnergyPlus major.minor.patch version' required: true - default: 8.9.0 + default: 9.2.0 energyplus-sha: description: 'EnergyPlus version SHA' required: true default: 921312fa1d energyplus-install: description: 'EnergyPlus major-minor-patch version' - default: 8-9-0 + default: 9-2-0 required: true @@ -54,9 +54,9 @@ jobs: - name: Test with pytest env: - ENERGYPLUS_VERSION: 8.9.0 + ENERGYPLUS_VERSION: 9.2.0 ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} - ENERGYPLUS_INSTALL_VERSION: 8-9-0 + ENERGYPLUS_INSTALL_VERSION: 9-2-0 EPPY_INTEGRATION: True run: | pytest -vs tests/test_runner.py \ No newline at end of file From 42c36ce09742ae1c19b3430e42af2a526741a5dd Mon Sep 17 00:00:00 2001 From: Santosh Philip Date: Sun, 5 Nov 2023 08:19:38 -0800 Subject: [PATCH 37/68] modified: .github/workflows/main.yml modified: eppy/pytest_helpers.py new file: eppy/resources/iddfiles/Energy+V9_2_0.idd new file: eppy/resources/idffiles/V9_2/smallfile.idf --- .github/workflows/main.yml | 2 +- eppy/pytest_helpers.py | 8 +- eppy/resources/iddfiles/Energy+V9_2_0.idd | 107637 ++++++++++++++++++ eppy/resources/idffiles/V9_2/smallfile.idf | 127 + 4 files changed, 107771 insertions(+), 3 deletions(-) create mode 100644 eppy/resources/iddfiles/Energy+V9_2_0.idd create mode 100644 eppy/resources/idffiles/V9_2/smallfile.idf diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a46ac433..ab304695 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,6 +57,6 @@ jobs: ENERGYPLUS_VERSION: 9.2.0 ENERGYPLUS_SHA: ${{ inputs.energyplus-sha }} ENERGYPLUS_INSTALL_VERSION: 9-2-0 - EPPY_INTEGRATION: True + EPPY_INTEGRATION: TRUE run: | pytest -vs tests/test_runner.py \ No newline at end of file diff --git a/eppy/pytest_helpers.py b/eppy/pytest_helpers.py index d828566d..a6be8584 100755 --- a/eppy/pytest_helpers.py +++ b/eppy/pytest_helpers.py @@ -33,18 +33,22 @@ def do_integration_tests(): """ try: - # print(f"{os.environ['LANG'] = }") print(f"{os.environ['GITHUB_ACTION'] = }") print(f"{os.environ['ENERGYPLUS_SHA'] = }") print(f"{os.environ['ENERGYPLUS_VERSION'] = }") print(f"{os.environ['ENERGYPLUS_INSTALL_VERSION'] = }") print(f"{os.environ['EPPY_INTEGRATION'] = }") + except KeyError as e: + print("not on CI - on local machine") + try: + print(f"{os.environ['EPPY_INTEGRATION'] = }") result = os.environ['EPPY_INTEGRATION'] print(f" Actual EPPY_INTEGRATION = {result}") + # --- except KeyError as e: result = False # result = os.getenv("EPPY_INTEGRATION", False) - if result == "True": # github CI returns strings 9no booleans) + if result == "TRUE": # github CI returns strings 9no booleans) result = True print(f" **** EPPY_INTEGRATION = {result}") return result diff --git a/eppy/resources/iddfiles/Energy+V9_2_0.idd b/eppy/resources/iddfiles/Energy+V9_2_0.idd new file mode 100644 index 00000000..d6b5fb7a --- /dev/null +++ b/eppy/resources/iddfiles/Energy+V9_2_0.idd @@ -0,0 +1,107637 @@ +!IDD_Version 9.2.0 +!IDD_BUILD 921312fa1d +! ************************************************************************** +! This file is the Input Data Dictionary (IDD) for EnergyPlus. +! The IDD defines the syntax and data model for each type of input "Object." +! Lines in EnergyPlus input files (and IDD) are limited to 500 characters. +! +! Object Description +! ------------------ +! To define an object (a record with data), develop a key word that is unique +! Each data item to the object can be A (Alphanumeric string) or N (numeric) +! Number each A and N. This will show how the data items will be put into the +! arrays that are passed to the Input Processor "Get" (GetObjectItem) routines. +! All alpha fields are limited to 100 characters. Numeric fields should be +! valid numerics (can include such as 1.0E+05) and are placed into double +! precision variables. +! +! NOTE: Even though a field may be optional, a comma representing that field +! must be included (unless it is the last field in the object). Since the +! entire input is "field-oriented" and not "keyword-oriented", the EnergyPlus +! Input Processor must have some representation (even if blank) for each +! field. +! +! Object Documentation +! -------------------- +! In addition, the following special comments appear one per line and +! most are followed by a value. Comments may apply to a field or the object +! or a group of objects. +! +! Field-level comments: +! +! \field Name of field +! (should be succinct and readable, blanks are encouraged) +! +! \note Note describing the field and its valid values. If multiple lines, +! start each line with \note. Limit line length to 100 characters. +! +! \required-field To flag fields which must have a value. If the idf input is blank and +! there is a \default, then the default will be used. However, as of v8.6.0 +! the use of \required-field and \default on the same field is discouraged +! and instances with both have been changed. +! (this comment has no "value") +! +! \begin-extensible Marks the first field at which the object accepts an extensible +! field set. A fixed number of fields from this marker define the +! extensible field set, see the object code \extensible for +! more information. +! +! \units Units (must be from EnergyPlus standard units list) +! EnergyPlus units are standard SI units +! +! \ip-units IP-Units (for use by input processors with IP units) +! This is only used if the default conversion is not +! appropriate. +! +! \unitsBasedOnField For fields that may have multiple possible units, indicates +! the field in the object that can be used to determine +! the units. The field reference is in the A2 form. +! +! \minimum Minimum that includes the following value +! +! \minimum> Minimum that must be > than the following value +! +! \maximum Maximum that includes the following value +! +! \maximum< Maximum that must be < than the following value +! +! \default Default for the field (if N/A then omit entire line). If a default is +! added to an existing field, then \required-field should be removed if present. +! Defaults are filled in only if the field is within \min-fields, or the actual +! object is longer than this field. +! +! \deprecated This field is not really used and will be deleted from the object. +! The required information is gotten internally or +! not needed by the program. +! +! \autosizable Flag to indicate that this field can be used with the Auto +! Sizing routines to produce calculated results for the +! field. If a value follows this, then that will be used +! when the "Autosize" feature is flagged. To trigger +! autosizing for a field, enter Autosize as the field's +! value. Only applicable to numeric fields. +! +! \autocalculatable Flag to indicate that this field can be automatically +! calculated. To trigger auto calculation for a field, enter +! Autocalculate as the field's value. Only applicable to +! numeric fields. +! +! \type Type of data for the field - +! integer +! real +! alpha (arbitrary string), +! choice (alpha with specific list of choices, see +! \key) +! object-list (link to a list of objects defined elsewhere, +! see \object-list and \reference) +! external-list (uses a special list from an external source, +! see \external-list) +! node (name used in connecting HVAC components) +! +! \retaincase Retains the alphabetic case for alpha type fields +! +! \key Possible value for "\type choice" (blanks are significant) +! use multiple \key lines to indicate all valid choices +! +! \object-list Name of a list of user-provided object names that are valid +! entries for this field (used with "\reference") +! see Zone and BuildingSurface:Detailed objects below for +! examples. +! ** Note that a field may have multiple \object-list commands. +! +! \external-list The values for this field should be selected from a special +! list generated outside of the IDD file. The choices for the +! special lists are: +! autoRDDvariable +! autoRDDmeter +! autoRDDvariableMeter +! When one of these are selected the options for the field +! are taken from the RDD or MDD file or both. +! +! \reference Name of a list of names to which this object belongs +! used with "\type object-list" and with "\object-list" +! see Zone and BuildingSurface:Detailed objects below for +! examples: +! +! Zone, +! A1 , \field Name +! \type alpha +! \reference ZoneNames +! +! BuildingSurface:Detailed, +! A4 , \field Zone Name +! \note Zone the surface is a part of +! \type object-list +! \object-list ZoneNames +! +! For each zone, the field "Name" may be referenced +! by other objects, such as BuildingSurface:Detailed, so it is +! commented with "\reference ZoneNames" +! Fields that reference a zone name, such as BuildingSurface:Detailed's +! "Zone Name", are commented as +! "\type object-list" and "\object-list ZoneNames" +! ** Note that a field may have multiple \reference commands. +! ** This is useful if the object belongs to a small specific +! object-list as well as a larger more general object-list. +! +! Object-level comments: +! +! \memo Memo describing the object. If multiple lines, start each line +! with \memo. +! Limit line length to 100 characters. +! +! \unique-object To flag objects which should appear only once in an idf +! (this comment has no "value") +! +! \required-object To flag objects which are required in every idf +! (this comment has no "value") +! +! \min-fields Minimum number of fields that should be included in the +! object. If appropriate, the Input Processor will fill +! any missing fields with defaults (for numeric fields). +! It will also supply that number of fields to the "get" +! routines using blanks for alpha fields (note -- blanks +! may not be allowable for some alpha fields). +! +! \obsolete This object has been replaced though is kept (and is read) +! in the current version. Please refer to documentation as +! to the dispersal of the object. If this object is +! encountered in an IDF, the InputProcessor will post an +! appropriate message to the error file. +! usage: \obsolete New=>[New object name] +! +! \extensible:<#> This object is dynamically extensible -- meaning, if you +! change the IDD appropriately (if the object has a simple list +! structure -- just add items to the list arguments (i.e. BRANCH +! LIST). These will be automatically redimensioned and used during +! the simulation. <#> should be entered by the developer to signify +! how many of the last fields are needed to be extended (and EnergyPlus +! will attempt to auto-extend the object). The first field of the first +! instance of the extensible field set is marked with \begin-extensible. +! +! \begin-extensible See previous item, marks beginning of extensible fields in +! an object. +! +! \format The object should have a special format when saved in +! the IDF Editor with the special format option enabled. +! The options include SingleLine, Vertices, CompactSchedule, +! FluidProperties, ViewFactors, and Spectral. +! The SingleLine option puts all the fields for the object +! on a single line. The Vertices option is used in objects +! that use X, Y and Z fields to format those three fields +! on a single line. +! The CompactSchedule formats that specific object. +! The FluidProperty option formats long lists of fluid +! properties to ten values per line. +! The ViewFactor option formats three fields related to +! view factors per line. +! The Spectral option formats the four fields related to +! window glass spectral data per line. +! +! \reference-class-name Adds the name of the class to the reference list +! similar to \reference. +! +! Group-level comments: +! +! \group Name for a group of related objects +! +! +! Notes on comments +! ----------------- +! +! 1. If a particular comment is not applicable (such as units, or default) +! then simply omit the comment rather than indicating N/A. +! +! 2. Memos and notes should be brief (recommend 5 lines or less per block). +! More extensive explanations are expected to be in the user documentation +! +! Default IP conversions (no \ip-units necessary) +! $/(m3/s) => $/(ft3/min) 0.000472000059660808 +! $/(W/K) => $/(Btu/h-F) 0.52667614683731 +! $/kW => $/(kBtuh/h) 0.293083235638921 +! $/m2 => $/ft2 0.0928939733269818 +! $/m3 => $/ft3 0.0283127014102352 +! (kg/s)/W => (lbm/sec)/(Btu/hr) 0.646078115385742 +! 1/K => 1/F 0.555555555555556 +! 1/m => 1/ft 0.3048 +! A/K => A/F 0.555555555555556 +! C => F 1.8 (plus 32) +! cm => in 0.3937 +! cm2 => inch2 0.15500031000062 +! deltaC => deltaF 1.8 +! deltaC/hr => deltaF/hr 1.8 +! deltaJ/kg => deltaBtu/lb 0.0004299 +! g/GJ => lb/MWh 0.00793664091373665 +! g/kg => grains/lb 7 +! g/MJ => lb/MWh 7.93664091373665 +! g/mol => lb/mol 0.0022046 +! g/m-s => lb/ft-s 0.000671968949659 +! g/m-s-K => lb/ft-s-F 0.000373574867724868 +! GJ => ton-hrs 78.9889415481832 +! J => Wh 0.000277777777777778 +! J/K => Btu/F 526.565 +! J/kg => Btu/lb 0.00042986 (plus 7.686) +! J/kg-K => Btu/lb-F 0.000239005736137667 +! J/kg-K2 => Btu/lb-F2 0.000132889924714692 +! J/kg-K3 => Btu/lb-F3 7.38277359526066E-05 +! J/m2-K => Btu/ft2-F 4.89224766847393E-05 +! J/m3 => Btu/ft3 2.68096514745308E-05 +! J/m3-K => Btu/ft3-F 1.49237004739337E-05 +! K => R 1.8 +! K/m => F/ft 0.54861322767449 +! kg => lb 2.2046 +! kg/J => lb/Btu 2325.83774250441 +! kg/kg-K => lb/lb-F 0.555555555555556 +! kg/m => lb/ft 0.67196893069637 +! kg/m2 => lb/ft2 0.204794053596664 +! kg/m3 => lb/ft3 0.062428 +! kg/m-s => lb/ft-s 0.67196893069637 +! kg/m-s-K => lb/ft-s-F 0.373316072609094 +! kg/m-s-K2 => lb/ft-s-F2 0.207397818116164 +! kg/Pa-s-m2 => lb/psi-s-ft2 1412.00523459398 +! kg/s => lb/s 2.20462247603796 +! kg/s2 => lb/s2 2.2046 +! kg/s-m => lb/s-ft 0.67196893069637 +! kJ/kg => Btu/lb 0.429925 +! kPa => psi 0.145038 +! L/day => pint/day 2.11337629827348 +! L/GJ => gal/kWh 0.000951022349025202 +! L/kWh => pint/kWh 2.11337629827348 +! L/MJ => gal/kWh 0.951022349025202 +! lux => foot-candles 0.092902267 +! m => ft 3.28083989501312 +! m/hr => ft/hr 3.28083989501312 +! m/s => ft/min 196.850393700787 +! m/s => miles/hr 2.2369362920544 +! m/yr => inch/yr 39.3700787401575 +! m2 => ft2 10.7639104167097 +! m2/m => ft2/ft 3.28083989501312 +! m2/person => ft2/person 10.764961 +! m2/s => ft2/s 10.7639104167097 +! m2-K/W => ft2-F-hr/Btu 5.678263 +! m3 => ft3 35.3146667214886 +! m3 => gal 264.172037284185 +! m3/GJ => ft3/MWh 127.13292 +! m3/hr => ft3/hr 35.3146667214886 +! m3/hr-m2 => ft3/hr-ft2 3.28083989501312 +! m3/hr-person => ft3/hr-person 35.3146667214886 +! m3/kg => ft3/lb 16.018 +! m3/m2 => ft3/ft2 3.28083989501312 +! m3/MJ => ft3/kWh 127.13292 +! m3/person => ft3/person 35.3146667214886 +! m3/s => ft3/min 2118.88000328931 +! m3/s-m => ft3/min-ft 645.89 +! m3/s-m2 => ft3/min-ft2 196.85 +! m3/s-person => ft3/min-person 2118.6438 +! m3/s-W => (ft3/min)/(Btu/h) 621.099127332943 +! N-m => lbf-in 8.85074900525547 +! N-s/m2 => lbf-s/ft2 0.0208857913669065 +! Pa => psi 0.000145037743897283 +! percent/K => percent/F 0.555555555555556 +! person/m2 => person/ft2 0.0928939733269818 +! s/m => s/ft 0.3048 +! V/K => V/F 0.555555555555556 +! W => Btu/h 3.4121412858518 +! W/((m3/s)-Pa) => W/((gal/min)-ftH20) 0.188582274697355 +! W/((m3/s)-Pa) => W/((ft3/min)-inH2O) 0.117556910599482 +! W/(m3/s) => W/(ft3/min) 0.0004719475 +! W/K => Btu/h-F 1.89563404769544 +! W/m => Btu/h-ft 1.04072 +! W/m2 => Btu/h-ft2 0.316957210776545 +! W/m2 => W/ft2 0.09290304 +! W/m2-K => Btu/h-ft2-F 0.176110194261872 +! W/m2-K2 => Btu/h-ft2-F2 0.097826 +! W/m-K => Btu-in/h-ft2-F 6.93481276005548 +! W/m-K2 => Btu/h-F2-ft 0.321418310071648 +! W/m-K3 => Btu/h-F3-ft 0.178565727817582 +! W/person => Btu/h-person 3.4121412858518 +! +! Other conversions supported (needs the \ip-units code) +! +! kPa => inHg 0.29523 +! m => in 39.3700787401575 +! m3/hr => gal/hr 264.172037284185 +! m3/hr-m2 => gal/hr-ft2 24.5423853466941 +! m3/hr-person => gal/hr-person 264.172037284185 +! m3/m2 => gal/ft2 24.5423853466941 +! m3/person => gal/person 264.172037284185 +! m3/s => gal/min 15850.3222370511 +! m3/s-m => gal/min-ft 4831.17821785317 +! m3/s-W => (gal/min)/(Btu/h) 4645.27137336702 +! Pa => ftH2O 0.00033455 +! Pa => inH2O 0.00401463 +! Pa => inHg 0.00029613 +! Pa => Pa 1 +! W => W 1 +! W/(m3/s) => W/(gal/min) 0.0000630902 +! W/m2 => W/m2 1 +! W/m-K => Btu/h-ft-F 0.577796066000163 +! W/person => W/person 1 +! +! Units fields that are not translated +! $ +! 1/hr +! A +! A/V +! Ah +! Availability +! Control +! cycles/hr +! days +! deg +! dimensionless +! eV +! hh:mm +! hr +! J/J +! kg/kg +! kg-H2O/kg-air +! kgWater/kgDryAir +! kmol +! kmol/s +! m3/m3 +! micron +! minutes +! Mode +! ms +! ohms +! percent +! ppm +! rev/min +! s +! V +! VA +! W/m2 or deg C +! W/m2, W or deg C +! W/s +! W/W +! years +! ************************************************************************** + +\group Simulation Parameters + +Version, + \memo Specifies the EnergyPlus version of the IDF file. + \unique-object + \format singleLine + A1 ; \field Version Identifier + \default 9.2 + +SimulationControl, + \unique-object + \memo Note that the following 3 fields are related to the Sizing:Zone, Sizing:System, + \memo and Sizing:Plant objects. Having these fields set to Yes but no corresponding + \memo Sizing object will not cause the sizing to be done. However, having any of these + \memo fields set to No, the corresponding Sizing object is ignored. + \memo Note also, if you want to do system sizing, you must also do zone sizing in the same + \memo run or an error will result. + \min-fields 5 + A1, \field Do Zone Sizing Calculation + \note If Yes, Zone sizing is accomplished from corresponding Sizing:Zone objects + \note and autosize fields. + \type choice + \key Yes + \key No + \default No + A2, \field Do System Sizing Calculation + \note If Yes, System sizing is accomplished from corresponding Sizing:System objects + \note and autosize fields. + \note If Yes, Zone sizing (previous field) must also be Yes. + \type choice + \key Yes + \key No + \default No + A3, \field Do Plant Sizing Calculation + \note If Yes, Plant sizing is accomplished from corresponding Sizing:Plant objects + \note and autosize fields. + \type choice + \key Yes + \key No + \default No + A4, \field Run Simulation for Sizing Periods + \note If Yes, SizingPeriod:* objects are executed and results from those may be displayed.. + \type choice + \key Yes + \key No + \default Yes + A5, \field Run Simulation for Weather File Run Periods + \note If Yes, RunPeriod:* objects are executed and results from those may be displayed.. + \type choice + \key Yes + \key No + \default Yes + A6, \field Do HVAC Sizing Simulation for Sizing Periods + \note If Yes, SizingPeriod:* objects are exectuted additional times for advanced sizing. + \note Currently limited to use with coincident plant sizing, see Sizing:Plant object + \type choice + \key Yes + \key No + \default No + N1; \field Maximum Number of HVAC Sizing Simulation Passes + \note the entire set of SizingPeriod:* objects may be repeated to fine tune size results + \note this input sets a limit on the number of passes that the sizing algorithms can repeate the set + \type integer + \minimum 1 + \default 1 + +PerformancePrecisionTradeoffs, + \unique-object + \memo This object enables users to choose certain options that speed up EnergyPlus simulation, + \memo but may lead to small decreases in accuracy of results. + A1; \field Use Coil Direct Solutions + \note If Yes, an analytical or empirical solution will be used to replace iterations in + \note the coil performance calculations. + \type choice + \key Yes + \key No + \default No + +Building, + \memo Describes parameters that are used during the simulation + \memo of the building. There are necessary correlations between the entries for + \memo this object and some entries in the Site:WeatherStation and + \memo Site:HeightVariation objects, specifically the Terrain field. + \unique-object + \required-object + \min-fields 8 + A1 , \field Name + \retaincase + \default NONE + N1 , \field North Axis + \note degrees from true North + \units deg + \type real + \default 0.0 + A2 , \field Terrain + \note Country=FlatOpenCountry | Suburbs=CountryTownsSuburbs | City=CityCenter | Ocean=body of water (5km) | Urban=Urban-Industrial-Forest + \type choice + \key Country + \key Suburbs + \key City + \key Ocean + \key Urban + \default Suburbs + N2 , \field Loads Convergence Tolerance Value + \note Loads Convergence Tolerance Value is a fraction of load + \type real + \minimum> 0.0 + \maximum .5 + \default .04 + N3 , \field Temperature Convergence Tolerance Value + \units deltaC + \type real + \minimum> 0.0 + \maximum .5 + \default .4 + A3 , \field Solar Distribution + \note MinimalShadowing | FullExterior | FullInteriorAndExterior | FullExteriorWithReflections | FullInteriorAndExteriorWithReflections + \type choice + \key MinimalShadowing + \key FullExterior + \key FullInteriorAndExterior + \key FullExteriorWithReflections + \key FullInteriorAndExteriorWithReflections + \default FullExterior + N4 , \field Maximum Number of Warmup Days + \note EnergyPlus will only use as many warmup days as needed to reach convergence tolerance. + \note This field's value should NOT be set less than 25. + \type integer + \minimum> 0 + \default 25 + N5 ; \field Minimum Number of Warmup Days + \note The minimum number of warmup days that produce enough temperature and flux history + \note to start EnergyPlus simulation for all reference buildings was suggested to be 6. + \note When this field is greater than the maximum warmup days defined previous field + \note the maximum number of warmup days will be reset to the minimum value entered here. + \note Warmup days will be set to be the value you entered when it is less than the default 6. + \type integer + \minimum> 0 + \default 6 + +ShadowCalculation, + \unique-object + \memo This object is used to control details of the solar, shading, and daylighting models + \extensible:1 + A1 , \field Calculation Method + \note choose calculation method. note that TimestepFrequency is only needed for certain cases + \note and can increase execution time significantly. + \type choice + \key AverageOverDaysInFrequency + \key TimestepFrequency + \default AverageOverDaysInFrequency + N1 , \field Calculation Frequency + \type integer + \minimum 1 + \default 20 + \note enter number of days + \note this field is only used if the previous field is set to AverageOverDaysInFrequency + \note 0=Use Default Periodic Calculation| calculate every day + \note only really applicable to RunPeriods + \note warning issued if >31 + N2 , \field Maximum Figures in Shadow Overlap Calculations + \note Number of allowable figures in shadow overlap calculations + \type integer + \minimum 200 + \default 15000 + A2 , \field Polygon Clipping Algorithm + \note Advanced Feature. Internal default is SutherlandHodgman + \note Refer to InputOutput Reference and Engineering Reference for more information + \type choice + \key ConvexWeilerAtherton + \key SutherlandHodgman + \default SutherlandHodgman + A3 , \field Sky Diffuse Modeling Algorithm + \note Advanced Feature. Internal default is SimpleSkyDiffuseModeling + \note If you have shading elements that change transmittance over the + \note year, you may wish to choose the detailed method. + \note Refer to InputOutput Reference and Engineering Reference for more information + \type choice + \key SimpleSkyDiffuseModeling + \key DetailedSkyDiffuseModeling + \default SimpleSkyDiffuseModeling + A4 , \field External Shading Calculation Method + \type choice + \key ScheduledShading + \key InternalCalculation + \key ImportedShading + \default InternalCalculation + \note If ScheduledShading is chosen, the External Shading Fraction Schedule Name is required + \note in SurfaceProperty:LocalEnvironment. + \note If ImportedShading is chosen, the Schedule:File:Shading object is required. + A5 , \field Output External Shading Calculation Results + \type choice + \key Yes + \key No + \default No + \note If Yes is chosen, the calculated external shading fraction results will be saved to an external CSV file with surface names as the column headers. + A6 , \field Disable Self-Shading Within Shading Zone Groups + \note If Yes, self-shading will be disabled from all exterior surfaces in a given Shading Zone Group to surfaces within + \note the same Shading Zone Group. + \note If both Disable Self-Shading Within Shading Zone Groups and Disable Self-Shading From Shading Zone Groups to Other Zones = Yes, + \note then all self-shading from exterior surfaces will be disabled. + \note If only one of these fields = Yes, then at least one Shading Zone Group must be specified, or this field will be ignored. + \note Shading from Shading:* surfaces, overhangs, fins, and reveals will not be disabled. + \type choice + \key Yes + \key No + \default No + A7 , \field Disable Self-Shading From Shading Zone Groups to Other Zones + \note If Yes, self-shading will be disabled from all exterior surfaces in a given Shading Zone Group to all other zones in the model. + \note If both Disable Self-Shading Within Shading Zone Groups and Disable Self-Shading From Shading Zone Groups to Other Zones = Yes, + \note then all self-shading from exterior surfaces will be disabled. + \note If only one of these fields = Yes, then at least one Shading Zone Group must be specified, or this field will be ignored. + \note Shading from Shading:* surfaces, overhangs, fins, and reveals will not be disabled. + \type choice + \key Yes + \key No + \default No + A8 , \field Shading Zone Group 1 ZoneList Name + \note Specifies a group of zones which are controlled by the Disable Self-Shading fields. + \type object-list + \object-list ZoneListNames + \begin-extensible + A9 , \field Shading Zone Group 2 ZoneList Name + \type object-list + \object-list ZoneListNames + A10, \field Shading Zone Group 3 ZoneList Name + \type object-list + \object-list ZoneListNames + A11, \field Shading Zone Group 4 ZoneList Name + \type object-list + \object-list ZoneListNames + A12, \field Shading Zone Group 5 ZoneList Name + \type object-list + \object-list ZoneListNames + A13; \field Shading Zone Group 6 ZoneList Name + \type object-list + \object-list ZoneListNames + +SurfaceConvectionAlgorithm:Inside, + \memo Default indoor surface heat transfer convection algorithm to be used for all zones + \unique-object + \format singleLine + A1 ; \field Algorithm + \type choice + \key Simple + \key TARP + \key CeilingDiffuser + \key AdaptiveConvectionAlgorithm + \default TARP + \note Simple = constant value natural convection (ASHRAE) + \note TARP = variable natural convection based on temperature difference (ASHRAE, Walton) + \note CeilingDiffuser = ACH-based forced and mixed convection correlations + \note for ceiling diffuser configuration with simple natural convection limit + \note AdaptiveConvectionAlgorithm = dynamic selection of convection models based on conditions + +SurfaceConvectionAlgorithm:Outside, + \memo Default outside surface heat transfer convection algorithm to be used for all zones + \unique-object + \format singleLine + A1 ; \field Algorithm + \type choice + \key SimpleCombined + \key TARP + \key MoWiTT + \key DOE-2 + \key AdaptiveConvectionAlgorithm + \default DOE-2 + \note SimpleCombined = Combined radiation and convection coefficient using simple ASHRAE model + \note TARP = correlation from models developed by ASHRAE, Walton, and Sparrow et. al. + \note MoWiTT = correlation from measurements by Klems and Yazdanian for smooth surfaces + \note DOE-2 = correlation from measurements by Klems and Yazdanian for rough surfaces + \note AdaptiveConvectionAlgorithm = dynamic selection of correlations based on conditions + +HeatBalanceAlgorithm, + \memo Determines which Heat Balance Algorithm will be used ie. + \memo CTF (Conduction Transfer Functions), + \memo EMPD (Effective Moisture Penetration Depth with Conduction Transfer Functions). + \memo Advanced/Research Usage: CondFD (Conduction Finite Difference) + \memo Advanced/Research Usage: ConductionFiniteDifferenceSimplified + \memo Advanced/Research Usage: HAMT (Combined Heat And Moisture Finite Element) + \unique-object + \format singleLine + A1 , \field Algorithm + \type choice + \key ConductionTransferFunction + \key MoisturePenetrationDepthConductionTransferFunction + \key ConductionFiniteDifference + \key CombinedHeatAndMoistureFiniteElement + \default ConductionTransferFunction + N1 , \field Surface Temperature Upper Limit + \type real + \minimum 200 + \default 200 + \units C + N2 , \field Minimum Surface Convection Heat Transfer Coefficient Value + \units W/m2-K + \default 0.1 + \minimum> 0.0 + N3 ; \field Maximum Surface Convection Heat Transfer Coefficient Value + \units W/m2-K + \default 1000 + \minimum 1.0 + +HeatBalanceSettings:ConductionFiniteDifference, + \memo Determines settings for the Conduction Finite Difference + \memo algorithm for surface heat transfer modeling. + \unique-object + A1 , \field Difference Scheme + \type choice + \key CrankNicholsonSecondOrder + \key FullyImplicitFirstOrder + \default FullyImplicitFirstOrder + N1 , \field Space Discretization Constant + \note increase or decrease number of nodes + \type real + \default 3 + N2 , \field Relaxation Factor + \type real + \default 1.0 + \minimum 0.01 + \maximum 1.0 + N3 ; \field Inside Face Surface Temperature Convergence Criteria + \type real + \default 0.002 + \minimum 1.0E-7 + \maximum 0.01 + +ZoneAirHeatBalanceAlgorithm, + \memo Determines which algorithm will be used to solve the zone air heat balance. + \unique-object + \format singleLine + \min-fields 1 + A1 ; \field Algorithm + \type choice + \key ThirdOrderBackwardDifference + \key AnalyticalSolution + \key EulerMethod + \default ThirdOrderBackwardDifference + +ZoneAirContaminantBalance, + \memo Determines which contaminant concentration will be simulates. + \unique-object + \format singleLine + A1 , \field Carbon Dioxide Concentration + \note If Yes, CO2 simulation will be performed. + \type choice + \key Yes + \key No + \default No + A2 , \field Outdoor Carbon Dioxide Schedule Name + \note Schedule values should be in parts per million (ppm) + \type object-list + \object-list ScheduleNames + A3 , \field Generic Contaminant Concentration + \note If Yes, generic contaminant simulation will be performed. + \type choice + \key Yes + \key No + \default No + A4 ; \field Outdoor Generic Contaminant Schedule Name + \note Schedule values should be generic contaminant concentration in parts per + \note million (ppm) + \type object-list + \object-list ScheduleNames + +ZoneAirMassFlowConservation, + \memo Enforces the zone air mass flow balance by adjusting zone mixing object and/or + \memo infiltration object mass flow rates. + \memo If either mixing or infiltration is active, then the zone air mass flow + \memo balance calculation will attempt to enforce conservation of mass for each zone. + \memo If mixing is "No" and infiltration is "None", then the zone air mass flow + \memo calculation defaults to assume self-balanced simple flow mixing and infiltration objects. + \unique-object + \min-fields 3 + A1, \field Adjust Zone Mixing For Zone Air Mass Flow Balance + \note If Yes, Zone mixing object flow rates are adjusted to balance the zone air mass flow + \note and additional infiltration air flow may be added if required in order to balance the + \note zone air mass flow. + \type choice + \key Yes + \key No + \default No + A2, \field Infiltration Balancing Method + \note This input field allows user to choose how zone infiltration flow is treated during + \note the zone air mass flow balance calculation. + \type choice + \key AddInfiltrationFlow + \key AdjustInfiltrationFlow + \key None + \default AddInfiltrationFlow + \note AddInfiltrationFlow may add infiltration to the base flow specified in the + \note infiltration object to balance the zone air mass flow. The additional infiltration + \note air mass flow is not self-balanced. The base flow is assumed to be self-balanced. + \note AdjustInfiltrationFlow may adjust the base flow calculated using + \note the base flow specified in the infiltration object to balance the zone air mass flow. If it + \note If no adjustment is required, then the base infiltration is assumed to be self-balanced. + \note None will make no changes to the base infiltration flow. + A3; \field Infiltration Balancing Zones + \note This input field allows user to choose which zones are included in infiltration balancing. + \note MixingSourceZonesOnly allows infiltration balancing only in zones which as source zones for mixing + \note which also have an infiltration object defined. + \note AllZones allows infiltration balancing in any zone which has an infiltration object defined. + \type choice + \key MixingSourceZonesOnly + \key AllZones + \default MixingSourceZonesOnly + +ZoneCapacitanceMultiplier:ResearchSpecial, + \format singleLine + \memo Multiplier altering the relative capacitance of the air compared to an empty zone + \min-fields 6 + A1 , \field Name + \required-field + \type alpha + A2 , \field Zone or ZoneList Name + \type object-list + \object-list ZoneAndZoneListNames + \note If this field is left blank, the multipliers are applied to all the zones not specified + N1 , \field Temperature Capacity Multiplier + \type real + \default 1.0 + \minimum> 0.0 + \note Used to alter the capacitance of zone air with respect to heat or temperature + N2 , \field Humidity Capacity Multiplier + \type real + \default 1.0 + \minimum> 0.0 + \note Used to alter the capacitance of zone air with respect to moisture or humidity ratio + N3 , \field Carbon Dioxide Capacity Multiplier + \type real + \default 1.0 + \minimum> 0.0 + \note Used to alter the capacitance of zone air with respect to zone air carbon dioxide concentration + N4 ; \field Generic Contaminant Capacity Multiplier + \type real + \default 1.0 + \minimum> 0.0 + \note Used to alter the capacitance of zone air with respect to zone air generic contaminant concentration + +Timestep, + \memo Specifies the "basic" timestep for the simulation. The + \memo value entered here is also known as the Zone Timestep. This is used in + \memo the Zone Heat Balance Model calculation as the driving timestep for heat + \memo transfer and load calculations. + \unique-object + \format singleLine + N1 ; \field Number of Timesteps per Hour + \note Number in hour: normal validity 4 to 60: 6 suggested + \note Must be evenly divisible into 60 + \note Allowable values include 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, and 60 + \note Normal 6 is minimum as lower values may cause inaccuracies + \note A minimum value of 20 is suggested for both ConductionFiniteDifference + \note and CombinedHeatAndMoistureFiniteElement surface heat balance algorithms + \note A minimum of 12 is suggested for simulations involving a Vegetated Roof (Material:RoofVegetation). + \default 6 + \type integer + \minimum 1 + \maximum 60 + +ConvergenceLimits, + \memo Specifies limits on HVAC system simulation timesteps and iterations. + \memo This item is an advanced feature that should be used only with caution. + \unique-object + N1 , \field Minimum System Timestep + \units minutes + \type integer + \note 0 sets the minimum to the zone timestep (ref: Timestep) + \note 1 is normal (ratchet down to 1 minute) + \note setting greater than zone timestep (in minutes) will effectively set to zone timestep + \minimum 0 + \maximum 60 + N2 , \field Maximum HVAC Iterations + \type integer + \default 20 + \minimum 1 + N3 , \field Minimum Plant Iterations + \note Controls the minimum number of plant system solver iterations within a single HVAC iteration + \note Larger values will increase runtime but might improve solution accuracy for complicated plant systems + \note Complex plants include: several interconnected loops, heat recovery, thermal load following generators, etc. + \type integer + \default 2 + \minimum 1 + N4 ; \field Maximum Plant Iterations + \note Controls the maximum number of plant system solver iterations within a single HVAC iteration + \note Smaller values might decrease runtime but could decrease solution accuracy for complicated plant systems + \type integer + \default 8 + \minimum 2 + +HVACSystemRootFindingAlgorithm, + \memo Specifies a HVAC system solver algorithm to find a root + \unique-object + A1 , \field Algorithm + \type choice + \key RegulaFalsi + \key Bisection + \key BisectionThenRegulaFalsi + \key RegulaFalsiThenBisection + \key Alternation + \default RegulaFalsi + N1 ; \field Number of Iterations Before Algorithm Switch + \note This field is used when RegulaFalsiThenBisection or BisectionThenRegulaFalsi is + \note entered. When iteration number is greater than the value, algorithm switches. + \type integer + \default 5 + +\group Compliance Objects + +Compliance:Building, + \memo Building level inputs related to compliance to building standards, building codes, and beyond energy code programs. + \unique-object + \min-fields 1 + N1; \field Building Rotation for Appendix G + \note Additional degrees of rotation to be used with the requirement in ASHRAE Standard 90.1 Appendix G + \note that states that the baseline building should be rotated in four directions. + \units deg + \type real + \default 0.0 + +\group Location and Climate + +Site:Location, + \memo Specifies the building's location. Only one location is allowed. + \memo Weather data file location, if it exists, will override this object. + \unique-object + \min-fields 5 + A1 , \field Name + \required-field + \type alpha + N1 , \field Latitude + \units deg + \minimum -90.0 + \maximum +90.0 + \default 0.0 + \note + is North, - is South, degree minutes represented in decimal (i.e. 30 minutes is .5) + \type real + N2 , \field Longitude + \units deg + \minimum -180.0 + \maximum +180.0 + \default 0.0 + \note - is West, + is East, degree minutes represented in decimal (i.e. 30 minutes is .5) + \type real + N3 , \field Time Zone + \note basic these limits on the WorldTimeZone Map (2003) + \units hr + \minimum -12.0 + \maximum +14.0 + \default 0.0 + \note Time relative to GMT. Decimal hours. + \type real + N4 ; \field Elevation + \units m + \minimum -300.0 + \maximum< 8900.0 + \default 0.0 + \type real + +Site:VariableLocation, + \memo Captures the scheduling of a moving/reorienting building, or more likely a vessel + \unique-object + \min-fields 1 + A1 , \field Name + \required-field + \type alpha + A2 , \field Building Location Latitude Schedule + \note The name of a schedule that defines the latitude of the building at any time. + \note If not entered, the latitude defined in the Site:Location, or the default + \note latitude, will be used for the entirety of the simulation + \type object-list + \object-list ScheduleNames + A3 , \field Building Location Longitude Schedule + \note The name of a schedule that defines the longitude of the building at any time. + \note If not entered, the longitude defined in the Site:Location, or the default + \note longitude, will be used for the entirety of the simulation + \type object-list + \object-list ScheduleNames + A4 ; \field Building Location Orientation Schedule + \note The name of a schedule that defines the orientation of the building at any time. + \note This orientation is based on a change from the original orientation. -- NEED TO REFINE THIS + \note If not entered, the original orientation will be used for the entirety of the simulation + \type object-list + \object-list ScheduleNames + +SizingPeriod:DesignDay, + \memo The design day object creates the parameters for the program to create + \memo the 24 hour weather profile that can be used for sizing as well as + \memo running to test the other simulation parameters. Parameters in this + \memo include a date (month and day), a day type (which uses the appropriate + \memo schedules for either sizing or simple tests), min/max temperatures, + \memo wind speeds, and solar radiation values. + A1, \field Name + \type alpha + \required-field + \reference RunPeriodsAndDesignDays + N1, \field Month + \required-field + \minimum 1 + \maximum 12 + \type integer + N2, \field Day of Month + \required-field + \minimum 1 + \maximum 31 + \type integer + \note must be valid for Month field + A2, \field Day Type + \required-field + \note Day Type selects the schedules appropriate for this design day + \type choice + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + N3, \field Maximum Dry-Bulb Temperature + \note This field is required when field "Dry-Bulb Temperature Range Modifier Type" + \note is not "TemperatureProfileSchedule". + \units C + \minimum -90 + \maximum 70 + \type real + N4, \field Daily Dry-Bulb Temperature Range + \note Must still produce appropriate maximum dry-bulb (within range) + \note This field is not needed if Dry-Bulb Temperature Range Modifier Type + \note is "delta". + \units deltaC + \minimum 0 + \default 0 + \type real + A3, \field Dry-Bulb Temperature Range Modifier Type + \note Type of modifier to the dry-bulb temperature calculated for the timestep + \type choice + \key MultiplierSchedule + \key DifferenceSchedule + \key TemperatureProfileSchedule + \key DefaultMultipliers + \default DefaultMultipliers + A4, \field Dry-Bulb Temperature Range Modifier Day Schedule Name + \type object-list + \object-list DayScheduleNames + \note Only used when previous field is "MultiplierSchedule", "DifferenceSchedule" or + \note "TemperatureProfileSchedule". + \note For type "MultiplierSchedule" the hour/time interval values should specify + \note the fraction (0-1) of the dry-bulb temperature range to be subtracted + \note from the maximum dry-bulb temperature for each timestep in the day + \note For type "DifferenceSchedule" the values should specify a number to be subtracted + \note from the maximum dry-bulb temperature for each timestep in the day. + \note Note that numbers in the difference schedule cannot be negative as that + \note would result in a higher maximum than the maximum previously specified. + \note For type "TemperatureProfileSchedule" the values should specify the actual dry-bulb + \note temperature for each timestep in the day. + A5, \field Humidity Condition Type + \note values/schedules indicated here and in subsequent fields create the humidity + \note values in the 24 hour design day conditions profile. + \type choice + \key WetBulb + \key DewPoint + \key HumidityRatio + \key Enthalpy + \key RelativeHumiditySchedule + \key WetBulbProfileMultiplierSchedule + \key WetBulbProfileDifferenceSchedule + \key WetBulbProfileDefaultMultipliers + \default WetBulb + N5, \field Wetbulb or DewPoint at Maximum Dry-Bulb + \note Wetbulb or dewpoint temperature coincident with the maximum temperature. + \note Required only if field Humidity Condition Type is "Wetbulb", "Dewpoint", + \note "WetBulbProfileMultiplierSchedule", "WetBulbProfileDifferenceSchedule", + \note or "WetBulbProfileDefaultMultipliers" + \type real + \units C + A6, \field Humidity Condition Day Schedule Name + \type object-list + \object-list DayScheduleNames + \note Only used when Humidity Condition Type is "RelativeHumiditySchedule", + \note "WetBulbProfileMultiplierSchedule", or "WetBulbProfileDifferenceSchedule" + \note For type "RelativeHumiditySchedule", the hour/time interval values should specify + \note relative humidity (percent) from 0.0 to 100.0. + \note For type "WetBulbProfileMultiplierSchedule" the hour/time interval values should specify + \note the fraction (0-1) of the wet-bulb temperature range to be subtracted from the + \note maximum wet-bulb temperature for each timestep in the day (units = Fraction) + \note For type "WetBulbProfileDifferenceSchedule" the values should specify a number to be subtracted + \note from the maximum wet-bulb temperature for each timestep in the day. (units = deltaC) + N6, \field Humidity Ratio at Maximum Dry-Bulb + \note Humidity ratio coincident with the maximum temperature (constant humidity ratio throughout day). + \note Required only if field Humidity Condition Type is "HumidityRatio". + \type real + \units kgWater/kgDryAir + N7, \field Enthalpy at Maximum Dry-Bulb + \note Enthalpy coincident with the maximum temperature. + \note Required only if field Humidity Condition Type is "Enthalpy". + \type real + \units J/kg + N8, \field Daily Wet-Bulb Temperature Range + \units deltaC + \note Required only if Humidity Condition Type = "WetbulbProfileMultiplierSchedule" or + \note "WetBulbProfileDefaultMultipliers" + N9, \field Barometric Pressure + \note This field's value is also checked against the calculated "standard barometric pressure" + \note for the location. If out of range (>10%) or blank, then is replaced by standard value. + \units Pa + \minimum 31000 + \maximum 120000 + \type real + \ip-units inHg + N10, \field Wind Speed + \required-field + \units m/s + \minimum 0 + \maximum 40 + \ip-units miles/hr + \type real + N11, \field Wind Direction + \required-field + \units deg + \minimum 0 + \maximum 360 + \note North=0.0 East=90.0 + \note 0 and 360 are the same direction. + \type real + A7, \field Rain Indicator + \note Yes is raining (all day), No is not raining + \type choice + \key Yes + \key No + \default No + A8, \field Snow Indicator + \type choice + \key Yes + \key No + \default No + \note Yes is Snow on Ground, No is no Snow on Ground + A9, \field Daylight Saving Time Indicator + \note Yes -- use schedules modified for Daylight Saving Time Schedules. + \note No - do not use schedules modified for Daylight Saving Time Schedules + \type choice + \key Yes + \key No + \default No + A10, \field Solar Model Indicator + \type choice + \key ASHRAEClearSky + \key ZhangHuang + \key Schedule + \key ASHRAETau + \key ASHRAETau2017 + \default ASHRAEClearSky + A11, \field Beam Solar Day Schedule Name + \note if Solar Model Indicator = Schedule, then beam schedule name (for day) + \type object-list + \object-list DayScheduleNames + A12, \field Diffuse Solar Day Schedule Name + \note if Solar Model Indicator = Schedule, then diffuse schedule name (for day) + \type object-list + \object-list DayScheduleNames + N12, \field ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + \units dimensionless + \note Required if Solar Model Indicator = ASHRAETau or ASHRAETau2017 + \note ASHRAETau2017 solar model can be used with 2013 and 2017 HOF matching taub + \minimum 0 + \maximum 1.2 + \default 0 + N13, \field ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + \units dimensionless + \note Required if Solar Model Indicator = ASHRAETau or ASHRAETau2017 + \note ASHRAETau2017 solar model can be used with 2013 and 2017 HOF matching taud + \minimum 0 + \maximum 3 + \default 0 + N14; \field Sky Clearness + \note Used if Sky Model Indicator = ASHRAEClearSky or ZhangHuang + \minimum 0.0 + \maximum 1.2 + \default 0.0 + \note 0.0 is totally unclear, 1.0 is totally clear + \type real + +SizingPeriod:WeatherFileDays, + \memo Use a weather file period for design sizing calculations. + A1 , \field Name + \reference RunPeriodsAndDesignDays + \required-field + \note user supplied name for reporting + N1 , \field Begin Month + \required-field + \minimum 1 + \maximum 12 + \type integer + N2 , \field Begin Day of Month + \required-field + \minimum 1 + \maximum 31 + \type integer + N3 , \field End Month + \required-field + \minimum 1 + \maximum 12 + \type integer + N4 , \field End Day of Month + \required-field + \minimum 1 + \maximum 31 + \type integer + A2 , \field Day of Week for Start Day + \note =[|Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|SummerDesignDay|WinterDesignDay| + \note |CustomDay1|CustomDay2]; + \note if you use SummerDesignDay or WinterDesignDay or the CustomDays then this will apply + \note to the whole period; other days (i.e., Monday) will signify a start day and + \note normal sequence of subsequent days + \default Monday + \type choice + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A3, \field Use Weather File Daylight Saving Period + \note If yes or blank, use daylight saving period as specified on Weatherfile. + \note If no, do not use the daylight saving period as specified on the Weatherfile. + \type choice + \default Yes + \key Yes + \key No + A4; \field Use Weather File Rain and Snow Indicators + \type choice + \key Yes + \key No + \default Yes + +SizingPeriod:WeatherFileConditionType, + \memo Use a weather file period for design sizing calculations. + \memo EPW weather files are created with typical and extreme periods + \memo created heuristically from the weather file data. For more + \memo details on these periods, see AuxiliaryPrograms document. + A1 , \field Name + \required-field + \reference RunPeriodsAndDesignDays + \note user supplied name for reporting + A2 , \field Period Selection + \required-field + \retaincase + \note Following is a list of all possible types of Extreme and Typical periods that + \note might be identified in the Weather File. Not all possible types are available + \note for all weather files. + \type choice + \key SummerExtreme + \key SummerTypical + \key WinterExtreme + \key WinterTypical + \key AutumnTypical + \key SpringTypical + \key WetSeason + \key DrySeason + \key NoDrySeason + \key NoWetSeason + \key TropicalHot + \key TropicalCold + \key NoDrySeasonMax + \key NoDrySeasonMin + \key NoWetSeasonMax + \key NoWetSeasonMin + A3 , \field Day of Week for Start Day + \note =[|Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|SummerDesignDay|WinterDesignDay| + \note |CustomDay1|CustomDay2]; + \note if you use SummerDesignDay or WinterDesignDay or the CustomDays then this will apply + \note to the whole period; other days (i.e., Monday) will signify a start day and + \note normal sequence of subsequent days + \default Monday + \type choice + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A4, \field Use Weather File Daylight Saving Period + \note If yes or blank, use daylight saving period as specified on Weatherfile. + \note If no, do not use the daylight saving period as specified on the Weatherfile. + \type choice + \default Yes + \key Yes + \key No + A5; \field Use Weather File Rain and Snow Indicators + \type choice + \key Yes + \key No + \default Yes + +RunPeriod, + \memo Specify a range of dates and other parameters for a simulation. + \memo Multiple run periods may be input, but they may not overlap. + \min-fields 7 + A1 , \field Name + \required-field + \reference RunPeriodsAndDesignDays + \note descriptive name (used in reporting mainly) + \note Cannot be not blank and must be unique + N1 , \field Begin Month + \required-field + \minimum 1 + \maximum 12 + \type integer + N2 , \field Begin Day of Month + \required-field + \minimum 1 + \maximum 31 + \type integer + N3, \field Begin Year + \note Start year of the simulation, if this field is specified it must agree with the Day of Week for Start Day + \note If this field is blank, the year will be selected to match the weekday, which is Sunday if not specified + N4 , \field End Month + \required-field + \minimum 1 + \maximum 12 + \type integer + N5 , \field End Day of Month + \required-field + \minimum 1 + \maximum 31 + \type integer + N6, \field End Year + \note end year of simulation, if specified + A2 , \field Day of Week for Start Day + \note =[Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday]; + \note If no year is input, this field will default to Sunday + \note If a year is input and this field is blank, the correct weekday is determined + \type choice + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + A3, \field Use Weather File Holidays and Special Days + \note If yes or blank, use holidays as specified on Weatherfile. + \note If no, do not use the holidays specified on the Weatherfile. + \note Note: You can still specify holidays/special days using the RunPeriodControl:SpecialDays object(s). + \type choice + \default Yes + \key Yes + \key No + A4, \field Use Weather File Daylight Saving Period + \note If yes or blank, use daylight saving period as specified on Weatherfile. + \note If no, do not use the daylight saving period as specified on the Weatherfile. + \type choice + \default Yes + \key Yes + \key No + A5, \field Apply Weekend Holiday Rule + \note if yes and single day holiday falls on weekend, "holiday" occurs on following Monday + \type choice + \key Yes + \key No + \default No + A6, \field Use Weather File Rain Indicators + \type choice + \key Yes + \key No + \default Yes + A7, \field Use Weather File Snow Indicators + \type choice + \key Yes + \key No + \default Yes + A8; \field Treat Weather as Actual + \type choice + \key Yes + \key No + \default No + +RunPeriodControl:SpecialDays, + \min-fields 4 + \memo This object sets up holidays/special days to be used during weather file + \memo run periods. (These are not used with SizingPeriod:* objects.) + \memo Depending on the value in the run period, days on the weather file may also + \memo be used. However, the weather file specification will take precedence over + \memo any specification shown here. (No error message on duplicate days or overlapping + \memo days). + A1, \field Name + \required-field + A2, \field Start Date + \required-field + \note Dates can be several formats: + \note / (month/day) + \note + \note + \note in in + \note can be January, February, March, April, May, June, July, August, September, October, November, December + \note Months can be the first 3 letters of the month + \note can be Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday + \note can be 1 or 1st, 2 or 2nd, etc. up to 5(?) + N1, \field Duration + \units days + \minimum 1 + \maximum 366 + \default 1 + A3; \field Special Day Type + \note Special Day Type selects the schedules appropriate for each day so labeled + \type choice + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + \default Holiday + +RunPeriodControl:DaylightSavingTime, + \unique-object + \min-fields 2 + \memo This object sets up the daylight saving time period for any RunPeriod. + \memo Ignores any daylight saving time period on the weather file and uses this definition. + \memo These are not used with SizingPeriod:DesignDay objects. + \memo Use with SizingPeriod:WeatherFileDays object can be controlled in that object. + A1, \field Start Date + \required-field + A2; \field End Date + \required-field + \note Dates can be several formats: + \note / (month/day) + \note + \note + \note in in + \note can be January, February, March, April, May, June, July, August, September, October, November, December + \note Months can be the first 3 letters of the month + \note can be Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday + \note can be 1 or 1st, 2 or 2nd, etc. up to 5(?) + +WeatherProperty:SkyTemperature, + \memo This object is used to override internal sky temperature calculations. + A1, \field Name + \note blank in this field will apply to all run periods (that is, all objects= + \note SizingPeriod:WeatherFileDays, SizingPeriod:WeatherFileConditionType or RunPeriod + \note otherwise, this name must match one of the environment object names. + \type object-list + \object-list RunPeriodsAndDesignDays + A2, \field Calculation Type + \required-field + \type choice + \key ScheduleValue + \key DifferenceScheduleDryBulbValue + \key DifferenceScheduleDewPointValue + A3; \field Schedule Name + \required-field + \note if name matches a SizingPeriod:DesignDay, put in a day schedule of this name + \note if name is for a SizingPeriod:WeatherFileDays, SizingPeriod:WeatherFileConditionType or + \note RunPeriod, put in a full year schedule that covers the appropriate days. + \type object-list + \object-list DayScheduleNames + \object-list ScheduleNames + +Site:WeatherStation, + \unique-object + \memo This object should only be used for non-standard weather data. Standard weather data + \memo such as TMY2, IWEC, and ASHRAE design day data are all measured at the + \memo default conditions and do not require this object. + N1 , \field Wind Sensor Height Above Ground + \type real + \units m + \default 10.0 + \minimum> 0.0 + N2 , \field Wind Speed Profile Exponent + \type real + \default 0.14 + \minimum 0.0 + N3 , \field Wind Speed Profile Boundary Layer Thickness + \type real + \units m + \default 270.0 + \minimum 0.0 + N4 ; \field Air Temperature Sensor Height Above Ground + \type real + \units m + \default 1.5 + \minimum 0.0 + +Site:HeightVariation, + \unique-object + \memo This object is used if the user requires advanced control over height-dependent + \memo variations in wind speed and temperature. When this object is not present, the default model + \memo for temperature dependence on height is used, and the wind speed is modeled according + \memo to the Terrain field of the BUILDING object. + N1 , \field Wind Speed Profile Exponent + \note Set to zero for no wind speed dependence on height. + \type real + \default 0.22 + \minimum 0.0 + N2 , \field Wind Speed Profile Boundary Layer Thickness + \type real + \units m + \default 370.0 + \minimum> 0.0 + N3 ; \field Air Temperature Gradient Coefficient + \note Set to zero for no air temperature dependence on height. + \type real + \units K/m + \default 0.0065 + \minimum 0.0 + +Site:GroundTemperature:BuildingSurface, + \memo These temperatures are specifically for those surfaces that have the outside environment + \memo of "Ground". Documentation about what values these should be is located in the + \memo Auxiliary programs document (Ground Heat Transfer) as well as the InputOutput Reference. + \memo CAUTION - Do not use the "undisturbed" ground temperatures from the weather data. + \memo These values are too extreme for the soil under a conditioned building. + \memo For best results, use the Slab or Basement program to calculate custom monthly + \memo average ground temperatures (see Auxiliary Programs). For typical commercial + \memo buildings in the USA, a reasonable default value is 2C less than the average indoor space temperature. + \unique-object + \min-fields 12 + \format singleLine + N1 , \field January Ground Temperature + \units C + \type real + \default 18 + N2 , \field February Ground Temperature + \units C + \type real + \default 18 + N3 , \field March Ground Temperature + \units C + \type real + \default 18 + N4 , \field April Ground Temperature + \units C + \type real + \default 18 + N5 , \field May Ground Temperature + \units C + \type real + \default 18 + N6 , \field June Ground Temperature + \units C + \type real + \default 18 + N7 , \field July Ground Temperature + \units C + \type real + \default 18 + N8 , \field August Ground Temperature + \units C + \type real + \default 18 + N9 , \field September Ground Temperature + \units C + \type real + \default 18 + N10, \field October Ground Temperature + \units C + \type real + \default 18 + N11, \field November Ground Temperature + \units C + \type real + \default 18 + N12; \field December Ground Temperature + \units C + \type real + \default 18 + +Site:GroundTemperature:FCfactorMethod, + \memo These temperatures are specifically for underground walls and ground floors + \memo defined with the C-factor and F-factor methods, and should be close to the + \memo monthly average outdoor air temperature delayed by 3 months for the location. + \unique-object + \min-fields 12 + \format singleLine + N1 , \field January Ground Temperature + \units C + \type real + \default 13 + N2 , \field February Ground Temperature + \units C + \type real + \default 13 + N3 , \field March Ground Temperature + \units C + \type real + \default 13 + N4 , \field April Ground Temperature + \units C + \type real + \default 13 + N5 , \field May Ground Temperature + \units C + \type real + \default 13 + N6 , \field June Ground Temperature + \units C + \type real + \default 13 + N7 , \field July Ground Temperature + \units C + \type real + \default 13 + N8 , \field August Ground Temperature + \units C + \type real + \default 13 + N9 , \field September Ground Temperature + \units C + \type real + \default 13 + N10, \field October Ground Temperature + \units C + \type real + \default 13 + N11, \field November Ground Temperature + \units C + \type real + \default 13 + N12; \field December Ground Temperature + \units C + \type real + \default 13 + +Site:GroundTemperature:Shallow, + \memo These temperatures are specifically for the Surface Ground Heat Exchanger and + \memo should probably be close to the average outdoor air temperature for the location. + \memo They are not used in other models. + \unique-object + \min-fields 12 + \format singleLine + N1 , \field January Surface Ground Temperature + \units C + \type real + \default 13 + N2 , \field February Surface Ground Temperature + \units C + \type real + \default 13 + N3 , \field March Surface Ground Temperature + \units C + \type real + \default 13 + N4 , \field April Surface Ground Temperature + \units C + \type real + \default 13 + N5 , \field May Surface Ground Temperature + \units C + \type real + \default 13 + N6 , \field June Surface Ground Temperature + \units C + \type real + \default 13 + N7 , \field July Surface Ground Temperature + \units C + \type real + \default 13 + N8 , \field August Surface Ground Temperature + \units C + \type real + \default 13 + N9 , \field September Surface Ground Temperature + \units C + \type real + \default 13 + N10, \field October Surface Ground Temperature + \units C + \type real + \default 13 + N11, \field November Surface Ground Temperature + \units C + \type real + \default 13 + N12; \field December Surface Ground Temperature + \units C + \type real + \default 13 + +Site:GroundTemperature:Deep, + \memo These temperatures are specifically for the ground heat exchangers that would use + \memo "deep" (3-4 m depth) ground temperatures for their heat source. + \memo They are not used in other models. + \unique-object + \min-fields 12 + \format singleLine + N1 , \field January Deep Ground Temperature + \units C + \type real + \default 16 + N2 , \field February Deep Ground Temperature + \units C + \type real + \default 16 + N3 , \field March Deep Ground Temperature + \units C + \type real + \default 16 + N4 , \field April Deep Ground Temperature + \units C + \type real + \default 16 + N5 , \field May Deep Ground Temperature + \units C + \type real + \default 16 + N6 , \field June Deep Ground Temperature + \units C + \type real + \default 16 + N7 , \field July Deep Ground Temperature + \units C + \type real + \default 16 + N8 , \field August Deep Ground Temperature + \units C + \type real + \default 16 + N9 , \field September Deep Ground Temperature + \units C + \type real + \default 16 + N10, \field October Deep Ground Temperature + \units C + \type real + \default 16 + N11, \field November Deep Ground Temperature + \units C + \type real + \default 16 + N12; \field December Deep Ground Temperature + \units C + \type real + \default 16 + +Site:GroundTemperature:Undisturbed:FiniteDifference, + \memo Undisturbed ground temperature object using a + \memo detailed finite difference 1-D model + \min-fields 7 + A1, \field Name + \required-field + \reference UndisturbedGroundTempModels + N1, \field Soil Thermal Conductivity + \required-field + \type real + \units W/m-K + \minimum> 0.0 + N2, \field Soil Density + \required-field + \type real + \units kg/m3 + \minimum> 0.0 + N3, \field Soil Specific Heat + \required-field + \type real + \units J/kg-K + \minimum> 0.0 + N4, \field Soil Moisture Content Volume Fraction + \type real + \units percent + \minimum 0 + \maximum 100 + \default 30 + N5, \field Soil Moisture Content Volume Fraction at Saturation + \type real + \units percent + \minimum 0 + \maximum 100 + \default 50 + N6; \field Evapotranspiration Ground Cover Parameter + \type real + \units dimensionless + \minimum 0 + \maximum 1.5 + \default 0.4 + \note This specifies the ground cover effects during evapotranspiration + \note calculations. The value roughly represents the following cases: + \note = 0 : concrete or other solid, non-permeable ground surface material + \note = 0.5 : short grass, much like a manicured lawn + \note = 1 : standard reference state (12 cm grass) + \note = 1.5 : wild growth + +Site:GroundTemperature:Undisturbed:KusudaAchenbach, + \memo Undisturbed ground temperature object using the + \memo Kusuda-Achenbach 1965 correlation. + \min-fields 7 + A1, \field Name + \required-field + \reference UndisturbedGroundTempModels + N1, \field Soil Thermal Conductivity + \required-field + \type real + \units W/m-K + \minimum> 0.0 + N2, \field Soil Density + \required-field + \type real + \units kg/m3 + \minimum> 0.0 + N3, \field Soil Specific Heat + \required-field + \type real + \units J/kg-K + \minimum> 0.0 + N4, \field Average Soil Surface Temperature + \type real + \units C + \note Annual average surface temperature + \note If left blank the Site:GroundTemperature:Shallow object must be included in the input + \note The soil temperature, amplitude, and phase shift must all be included or omitted together + N5, \field Average Amplitude of Surface Temperature + \type real + \units deltaC + \minimum 0 + \note Annual average surface temperature variation from average. + \note If left blank the Site:GroundTemperature:Shallow object must be included in the input + \note The soil temperature, amplitude, and phase shift must all be included or omitted together + N6; \field Phase Shift of Minimum Surface Temperature + \type real + \units days + \minimum 0 + \maximum< 365 + \note The phase shift of minimum surface temperature, or the day + \note of the year when the minimum surface temperature occurs. + \note If left blank the Site:GroundTemperature:Shallow object must be included in the input + \note The soil temperature, amplitude, and phase shift must all be included or omitted together + +Site:GroundTemperature:Undisturbed:Xing, + \memo Undisturbed ground temperature object using the + \memo Xing 2014 2 harmonic parameter model. + \min-fields 9 + A1, \field Name + \required-field + \reference UndisturbedGroundTempModels + N1, \field Soil Thermal Conductivity + \required-field + \type real + \units W/m-K + \minimum> 0.0 + N2, \field Soil Density + \required-field + \type real + \units kg/m3 + \minimum> 0.0 + N3, \field Soil Specific Heat + \required-field + \type real + \units J/kg-K + \minimum> 0.0 + N4, \field Average Soil Surface Tempeature + \required-field + \type real + \units C + N5, \field Soil Surface Temperature Amplitude 1 + \required-field + \type real + \units deltaC + N6, \field Soil Surface Temperature Amplitude 2 + \required-field + \type real + \units deltaC + N7, \field Phase Shift of Temperature Amplitude 1 + \required-field + \type real + \units days + \maximum< 365 + N8; \field Phase Shift of Temperature Amplitude 2 + \required-field + \type real + \units days + \maximum< 365 + +Site:GroundDomain:Slab, + \memo Ground-coupled slab model for on-grade and + \memo in-grade cases with or without insulation. + A1, \field Name + \required-field + N1, \field Ground Domain Depth + \type real + \default 10 + \units m + \minimum> 0.0 + N2, \field Aspect Ratio + \type real + \default 1 + N3, \field Perimeter Offset + \type real + \default 5 + \units m + \minimum> 0.0 + N4, \field Soil Thermal Conductivity + \type real + \default 1.5 + \units W/m-K + \minimum> 0.0 + N5, \field Soil Density + \type real + \default 2800 + \units kg/m3 + \minimum> 0.0 + N6, \field Soil Specific Heat + \type real + \default 850 + \units J/kg-K + \minimum> 0.0 + N7, \field Soil Moisture Content Volume Fraction + \type real + \units percent + \minimum 0 + \maximum 100 + \default 30 + N8, \field Soil Moisture Content Volume Fraction at Saturation + \type real + \units percent + \minimum 0 + \maximum 100 + \default 50 + A2, \field Undisturbed Ground Temperature Model Type + \required-field + \type choice + \key Site:GroundTemperature:Undisturbed:FiniteDifference + \key Site:GroundTemperature:Undisturbed:KusudaAchenbach + \key Site:GroundTemperature:Undisturbed:Xing + A3, \field Undisturbed Ground Temperature Model Name + \required-field + \type object-list + \object-list UndisturbedGroundTempModels + N9, \field Evapotranspiration Ground Cover Parameter + \type real + \minimum 0 + \maximum 1.5 + \default 0.4 + \note This specifies the ground cover effects during evapotranspiration + \note calculations. The value roughly represents the following cases: + \note = 0 : concrete or other solid, non-permeable ground surface material + \note = 0.5 : short grass, much like a manicured lawn + \note = 1 : standard reference state (12 cm grass) + \note = 1.5 : wild growth + A4, \field Slab Boundary Condition Model Name + \required-field + \type object-list + \object-list OSCMNames + A5, \field Slab Location + \required-field + \type choice + \key InGrade + \key OnGrade + \note This field specifies whether the slab is located "in-grade" or "on-grade" + A6, \field Slab Material Name + \type object-list + \object-list MaterialName + \note Only applicable for the in-grade case + A7, \field Horizontal Insulation + \type choice + \key Yes + \key No + \default No + \note This field specifies the presence of insulation beneath the slab. + \note Only required for in-grade case. + A8, \field Horizontal Insulation Material Name + \type object-list + \object-list MaterialName + \note This field specifies the horizontal insulation material. + A9, \field Horizontal Insulation Extents + \type choice + \key Full + \key Perimeter + \default Full + \note This field specifies whether the horizontal insulation fully insulates + \note the surface or is perimeter only insulation + N10, \field Perimeter Insulation Width + \type real + \units m + \minimum> 0.0 + \note This field specifies the width of the underfloor perimeter insulation + A10, \field Vertical Insulation + \type choice + \key Yes + \key No + \default No + \note This field specifies the presence of vertical insulation at the slab edge. + A11, \field Vertical Insulation Material Name + \type object-list + \object-list MaterialName + \note This field specifies the vertical insulation material. + N11, \field Vertical Insulation Depth + \type real + \units m + \minimum> 0.0 + \note Only used when including vertical insulation + \note This field specifies the depth of the vertical insulation + A12, \field Simulation Timestep + \type choice + \key Timestep + \key Hourly + \default Hourly + \note This field specifies the ground domain simulation timestep. + N12, \field Geometric Mesh Coefficient + \type real + \minimum 1.0 + \maximum 2.0 + \default 1.6 + N13; \field Mesh Density Parameter + \type integer + \minimum 4 + \default 6 + +Site:GroundDomain:Basement, + \memo Ground-coupled basement model for simulating basements + \memo or other underground zones. + A1, \field Name + \required-field + N1, \field Ground Domain Depth + \type real + \default 10 + \units m + \minimum> 0.0 + \note The depth from ground surface to the deep ground boundary of the domain. + N2, \field Aspect Ratio + \type real + \default 1 + \note This defines the height to width ratio of the basement zone. + N3, \field Perimeter Offset + \type real + \default 5 + \units m + \minimum> 0.0 + \note The distance from the basement wall edge to the edge of the ground domain + N4, \field Soil Thermal Conductivity + \type real + \default 1.5 + \units W/m-K + \minimum> 0.0 + N5, \field Soil Density + \type real + \default 2800 + \units kg/m3 + \minimum> 0.0 + N6, \field Soil Specific Heat + \type real + \default 850 + \units J/kg-K + \minimum> 0.0 + N7, \field Soil Moisture Content Volume Fraction + \type real + \units percent + \minimum 0 + \maximum 100 + \default 30 + N8, \field Soil Moisture Content Volume Fraction at Saturation + \type real + \units percent + \minimum 0 + \maximum 100 + \default 50 + A2, \field Undisturbed Ground Temperature Model Type + \required-field + \type choice + \key Site:GroundTemperature:Undisturbed:FiniteDifference + \key Site:GroundTemperature:Undisturbed:KusudaAchenbach + \key Site:GroundTemperature:Undisturbed:Xing + A3, \field Undisturbed Ground Temperature Model Name + \required-field + \type object-list + \object-list UndisturbedGroundTempModels + N9, \field Evapotranspiration Ground Cover Parameter + \type real + \minimum 0 + \maximum 1.5 + \default 0.4 + \note This specifies the ground cover effects during evapotranspiration + \note calculations. The value roughly represents the following cases: + \note = 0 : concrete or other solid, non-permeable ground surface material + \note = 0.5 : short grass, much like a manicured lawn + \note = 1 : standard reference state (12 cm grass) + \note = 1.5 : wild growth + A4, \field Basement Floor Boundary Condition Model Name + \required-field + \type object-list + \object-list OSCMNames + A5, \field Horizontal Insulation + \type choice + \key Yes + \key No + \default No + \note This field specifies the presence of insulation beneath the basement floor. + A6, \field Horizontal Insulation Material Name + \type object-list + \object-list MaterialName + A7, \field Horizontal Insulation Extents + \type choice + \key Perimeter + \key Full + \default Full + \note This field specifies whether the horizontal insulation fully insulates + \note the surface or is perimeter only insulation + N10, \field Perimeter Horizontal Insulation Width + \type real + \units m + \minimum> 0.0 + \note Width of horizontal perimeter insulation measured from + \note foundation wall inside surface. + N11, \field Basement Wall Depth + \type real + \units m + \minimum> 0.0 + \note Depth measured from ground surface. + A8, \field Basement Wall Boundary Condition Model Name + \required-field + \type object-list + \object-list OSCMNames + A9, \field Vertical Insulation + \type choice + \key Yes + \key No + \default No + A10, \field Basement Wall Vertical Insulation Material Name + \type object-list + \object-list MaterialName + N12, \field Vertical Insulation Depth + \type real + \units m + \minimum> 0.0 + \note Depth measured from the ground surface. + A11, \field Simulation Timestep + \type choice + \key Timestep + \key Hourly + \default Hourly + \note This field specifies the basement domain simulation interval. + N13; \field Mesh Density Parameter + \type integer + \default 4 + \minimum 2 + +Site:GroundReflectance, + \memo Specifies the ground reflectance values used to calculate ground reflected solar. + \memo The ground reflectance can be further modified when snow is on the ground + \memo by Site:GroundReflectance:SnowModifier. + \unique-object + \min-fields 12 + \format singleLine + N1 , \field January Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N2 , \field February Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N3 , \field March Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N4 , \field April Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N5 , \field May Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N6 , \field June Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N7 , \field July Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N8 , \field August Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N9 , \field September Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N10 , \field October Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N11 , \field November Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + N12 ; \field December Ground Reflectance + \default 0.2 + \type real + \minimum 0.0 + \maximum 1.0 + \units dimensionless + +Site:GroundReflectance:SnowModifier, + \memo Specifies ground reflectance multipliers when snow resident on the ground. + \memo These multipliers are applied to the "normal" ground reflectances specified + \memo in Site:GroundReflectance. + N1, \field Ground Reflected Solar Modifier + \minimum 0.0 + \default 1.0 + \note Value for modifying the "normal" ground reflectance when Snow is on ground + \note when calculating the "Ground Reflected Solar Radiation Value" + \note a value of 1.0 here uses the "normal" ground reflectance + \note Ground Reflected Solar = (BeamSolar*CosSunZenith + DiffuseSolar)*GroundReflectance + \note This would be further modified by the Snow Ground Reflectance Modifier when Snow was on the ground + \note When Snow on ground, effective GroundReflectance is normal GroundReflectance*"Ground Reflectance Snow Modifier" + \note Ground Reflectance achieved in this manner will be restricted to [0.0,1.0] + N2; \field Daylighting Ground Reflected Solar Modifier + \minimum 0.0 + \default 1.0 + \note Value for modifying the "normal" daylighting ground reflectance when Snow is on ground + \note when calculating the "Ground Reflected Solar Radiation Value" + \note a value of 1.0 here uses the "normal" ground reflectance + \note Ground Reflected Solar = (BeamSolar*CosSunZenith + DiffuseSolar)*GroundReflectance + \note This would be further modified by the Snow Ground Reflectance Modifier when Snow was on the ground + \note When Snow on ground, effective GroundReflectance is normal GroundReflectance*"Daylighting Ground Reflectance Snow Modifier" + \note Ground Reflectance achieved in this manner will be restricted to [0.0,1.0] + +Site:WaterMainsTemperature, + \memo Used to calculate water mains temperatures delivered by underground water main pipes. + \memo Water mains temperatures are a function of outdoor climate conditions + \memo and vary with time of year. + A1 , \field Calculation Method + \required-field + \type choice + \key Schedule + \key Correlation + \key CorrelationFromWeatherFile + \default CorrelationFromWeatherFile + \note If calculation method is CorrelationFromWeatherFile, the two numeric input + \note fields are ignored. Instead, EnergyPlus calculates them from weather file. + A2 , \field Temperature Schedule Name + \type object-list + \object-list ScheduleNames + N1 , \field Annual Average Outdoor Air Temperature + \note If calculation method is CorrelationFromWeatherFile or Schedule, this input + \note field is ignored. + \type real + \units C + N2 ; \field Maximum Difference In Monthly Average Outdoor Air Temperatures + \note If calculation method is CorrelationFromWeatherFile or Schedule, this input + \note field is ignored. + \type real + \units deltaC + \minimum 0 + +Site:Precipitation, + \memo Used to describe the amount of water precipitation at the building site. + \memo Precipitation includes both rain and the equivalent water content of snow. + A1, \field Precipitation Model Type + \type choice + \key ScheduleAndDesignLevel + N1, \field Design Level for Total Annual Precipitation + \note meters of water per year used for design level + \units m/yr + A2, \field Precipitation Rates Schedule Name + \type object-list + \object-list ScheduleNames + \note Schedule values in meters of water per hour + \note values should be non-negative + N2; \field Average Total Annual Precipitation + \note meters of water per year from average weather statistics + \minimum 0 + \units m/yr + +RoofIrrigation, + \memo Used to describe the amount of irrigation on the ecoroof surface over the course + \memo of the simulation runperiod. + A1, \field Irrigation Model Type + \type choice + \key Schedule + \key SmartSchedule + \note SmartSchedule will not allow irrigation when soil is already moist. + \note Current threshold set at 30% of saturation. + A2, \field Irrigation Rate Schedule Name + \type object-list + \object-list ScheduleNames + \note Schedule values in meters of water per hour + \note values should be non-negative + N1; \field Irrigation Maximum Saturation Threshold + \note Used with SmartSchedule to set the saturation level at which no + \note irrigation is allowed. + \units percent + \minimum 0.0 + \maximum 100.0 + \default 40.0 + +Site:SolarAndVisibleSpectrum, + \memo If this object is omitted, the default solar and visible spectrum data will be used. + \unique-object + A1, \field Name + \required-field + \type alpha + A2, \field Spectrum Data Method + \note The method specifies which of the solar and visible spectrum data to use in the calculations. + \note Choices: Default - existing hard-wired spectrum data in EnergyPlus. + \note UserDefined - user specified spectrum data referenced by the next two fields + \type choice + \key Default + \key UserDefined + \default Default + A3, \field Solar Spectrum Data Object Name + \type object-list + \object-list SpectrumDataNames + A4; \field Visible Spectrum Data Object Name + \type object-list + \object-list SpectrumDataNames + +Site:SpectrumData, + \min-fields 8 + \memo Spectrum Data Type is followed by up to 107 sets of normal-incidence measured values of + \memo [wavelength, spectrum] for wavelengths covering the solar (0.25 to 2.5 microns) or visible + \memo spectrum (0.38 to 0.78 microns) + \extensible:2 + A1, \field Name + \required-field + \type alpha + \reference SpectrumDataNames + A2, \field Spectrum Data Type + \required-field + \type choice + \key Solar + \key Visible + N1, \field Wavelength + \type real + \units micron + N2, \field Spectrum + \type real + N3, \field Wavelength + \type real + \units micron + N4, \field Spectrum + \type real + N5, \field Wavelength + \begin-extensible + \type real + \units micron + N6, \field Spectrum + \type real + N7, N8, \note fields as indicated + N9, N10, \note fields as indicated + N11, N12, \note fields as indicated + N13, N14, \note fields as indicated + N15, N16, \note fields as indicated + N17, N18, \note fields as indicated + N19, N20, \note fields as indicated + N21, N22, \note fields as indicated + N23, N24, \note fields as indicated + N25, N26, \note fields as indicated + N27, N28, \note fields as indicated + N29, N30, \note fields as indicated + N31, N32, \note fields as indicated + N33, N34, \note fields as indicated + N35, N36, \note fields as indicated + N37, N38, \note fields as indicated + N39, N40, \note fields as indicated + N41, N42, \note fields as indicated + N43, N44, \note fields as indicated + N45, N46, \note fields as indicated + N47, N48, \note fields as indicated + N49, N50, \note fields as indicated + N51, N52, \note fields as indicated + N53, N54, \note fields as indicated + N55, N56, \note fields as indicated + N57, N58, \note fields as indicated + N59, N60, \note fields as indicated + N61, N62, \note fields as indicated + N63, N64, \note fields as indicated + N65, N66, \note fields as indicated + N67, N68, \note fields as indicated + N69, N70, \note fields as indicated + N71, N72, \note fields as indicated + N73, N74, \note fields as indicated + N75, N76, \note fields as indicated + N77, N78, \note fields as indicated + N79, N80, \note fields as indicated + N81, N82, \note fields as indicated + N83, N84, \note fields as indicated + N85, N86, \note fields as indicated + N87, N88, \note fields as indicated + N89, N90, \note fields as indicated + N91, N92, \note fields as indicated + N93, N94, \note fields as indicated + N95, N96, \note fields as indicated + N97, N98, \note fields as indicated + N99, N100, \note fields as indicated + N101, N102, \note fields as indicated + N103, N104, \note fields as indicated + N105, N106, \note fields as indicated + N107, N108, \note fields as indicated + N109, N110, \note fields as indicated + N111, N112, \note fields as indicated + N113, N114, \note fields as indicated + N115, N116, \note fields as indicated + N117, N118, \note fields as indicated + N119, N120, \note fields as indicated + N121, N122, \note fields as indicated + N123, N124, \note fields as indicated + N125, N126, \note fields as indicated + N127, N128, \note fields as indicated + N129, N130, \note fields as indicated + N131, N132, \note fields as indicated + N133, N134, \note fields as indicated + N135, N136, \note fields as indicated + N137, N138, \note fields as indicated + N139, N140, \note fields as indicated + N141, N142, \note fields as indicated + N143, N144, \note fields as indicated + N145, N146, \note fields as indicated + N147, N148, \note fields as indicated + N149, N150, \note fields as indicated + N151, N152, \note fields as indicated + N153, N154, \note fields as indicated + N155, N156, \note fields as indicated + N157, N158, \note fields as indicated + N159, N160, \note fields as indicated + N161, N162, \note fields as indicated + N163, N164, \note fields as indicated + N165, N166, \note fields as indicated + N167, N168, \note fields as indicated + N169, N170, \note fields as indicated + N171, N172, \note fields as indicated + N173, N174, \note fields as indicated + N175, N176, \note fields as indicated + N177, N178, \note fields as indicated + N179, N180, \note fields as indicated + N181, N182, \note fields as indicated + N183, N184, \note fields as indicated + N185, N186, \note fields as indicated + N187, N188, \note fields as indicated + N189, N190, \note fields as indicated + N191, N192, \note fields as indicated + N193, N194, \note fields as indicated + N195, N196, \note fields as indicated + N197, N198, \note fields as indicated + N199, N200, \note fields as indicated + N201, N202, \note fields as indicated + N203, N204, \note fields as indicated + N205, N206, \note fields as indicated + N207, N208, \note fields as indicated + N209, N210, \note fields as indicated + N211, N212, \note fields as indicated + N213, N214; \note fields as indicated + +\group Schedules + +ScheduleTypeLimits, + \memo ScheduleTypeLimits specifies the data types and limits for the values contained in schedules + A1, \field Name + \required-field + \reference ScheduleTypeLimitsNames + \note used to validate schedule types in various schedule objects + N1, \field Lower Limit Value + \note lower limit (real or integer) for the Schedule Type. e.g. if fraction, this is 0.0 + \unitsBasedOnField A3 + N2, \field Upper Limit Value + \note upper limit (real or integer) for the Schedule Type. e.g. if fraction, this is 1.0 + \unitsBasedOnField A3 + A2, \field Numeric Type + \note Numeric type is either Continuous (all numbers within the min and + \note max are valid or Discrete (only integer numbers between min and + \note max are valid. (Could also allow REAL and INTEGER to mean the + \note same things) + \type choice + \key Continuous + \key Discrete + A3; \field Unit Type + \note Temperature (C or F) + \note DeltaTemperature (C or F) + \note PrecipitationRate (m/hr or ft/hr) + \note Angle (degrees) + \note Convection Coefficient (W/m2-K or Btu/sqft-hr-F) + \note Activity Level (W/person) + \note Velocity (m/s or ft/min) + \note Capacity (W or Btu/h) + \note Power (W) + \type choice + \key Dimensionless + \key Temperature + \key DeltaTemperature + \key PrecipitationRate + \key Angle + \key ConvectionCoefficient + \key ActivityLevel + \key Velocity + \key Capacity + \key Power + \key Availability + \key Percent + \key Control + \key Mode + \default Dimensionless + +Schedule:Day:Hourly, + \min-fields 26 + \memo A Schedule:Day:Hourly contains 24 values for each hour of the day. + A1 , \field Name + \required-field + \type alpha + \reference DayScheduleNames + A2 , \field Schedule Type Limits Name + \type object-list + \object-list ScheduleTypeLimitsNames + N1 , \field Hour 1 + \type real + \default 0 + N2 , \field Hour 2 + \type real + \default 0 + N3 , \field Hour 3 + \type real + \default 0 + N4 , \field Hour 4 + \type real + \default 0 + N5 , \field Hour 5 + \type real + \default 0 + N6 , \field Hour 6 + \type real + \default 0 + N7 , \field Hour 7 + \type real + \default 0 + N8 , \field Hour 8 + \type real + \default 0 + N9 , \field Hour 9 + \type real + \default 0 + N10, \field Hour 10 + \type real + \default 0 + N11, \field Hour 11 + \type real + \default 0 + N12, \field Hour 12 + \type real + \default 0 + N13, \field Hour 13 + \type real + \default 0 + N14, \field Hour 14 + \type real + \default 0 + N15, \field Hour 15 + \type real + \default 0 + N16, \field Hour 16 + \type real + \default 0 + N17, \field Hour 17 + \type real + \default 0 + N18, \field Hour 18 + \type real + \default 0 + N19, \field Hour 19 + \type real + \default 0 + N20, \field Hour 20 + \type real + \default 0 + N21, \field Hour 21 + \type real + \default 0 + N22, \field Hour 22 + \type real + \default 0 + N23, \field Hour 23 + \type real + \default 0 + N24; \field Hour 24 + \type real + \default 0 + +Schedule:Day:Interval, + \extensible:2 - repeat last two fields, remembering to remove ; from "inner" fields. + \memo A Schedule:Day:Interval contains a full day of values with specified end times for each value + \memo Currently, is set up to allow for 10 minute intervals for an entire day. + \min-fields 5 + A1 , \field Name + \required-field + \type alpha + \reference DayScheduleNames + A2 , \field Schedule Type Limits Name + \type object-list + \object-list ScheduleTypeLimitsNames + A3 , \field Interpolate to Timestep + \note when the interval does not match the user specified timestep a Average choice will average between the intervals request (to + \note timestep resolution. A No choice will use the interval value at the simulation timestep without regard to if it matches + \note the boundary or not. A Linear choice will interpolate linearly between successive values. + \type choice + \key Average + \key Linear + \key No + \default No + A4 , \field Time 1 + \begin-extensible + \note "until" includes the time entered. + \units hh:mm + N1 , \field Value Until Time 1 + A5 , \field Time 2 + \note "until" includes the time entered. + \units hh:mm + N2 , \field Value Until Time 2 + A6 , \field Time 3 + \note "until" includes the time entered. + \units hh:mm + N3 , \field Value Until Time 3 + A7 , \field Time 4 + \note "until" includes the time entered. + \units hh:mm + N4 , \field Value Until Time 4 + A8 , \field Time 5 + \note "until" includes the time entered. + \units hh:mm + N5 , \field Value Until Time 5 + A9 , \field Time 6 + \note "until" includes the time entered. + \units hh:mm + N6 , \field Value Until Time 6 + A10 , \field Time 7 + \note "until" includes the time entered. + \units hh:mm + N7 , \field Value Until Time 7 + A11 , \field Time 8 + \note "until" includes the time entered. + \units hh:mm + N8 , \field Value Until Time 8 + A12 , \field Time 9 + \note "until" includes the time entered. + \units hh:mm + N9 , \field Value Until Time 9 + A13 , \field Time 10 + \note "until" includes the time entered. + \units hh:mm + N10 , \field Value Until Time 10 + A14 , \field Time 11 + \note "until" includes the time entered. + \units hh:mm + N11 , \field Value Until Time 11 + A15 , \field Time 12 + \note "until" includes the time entered. + \units hh:mm + N12 , \field Value Until Time 12 + A16 , \field Time 13 + \note "until" includes the time entered. + \units hh:mm + N13 , \field Value Until Time 13 + A17 , \field Time 14 + \note "until" includes the time entered. + \units hh:mm + N14 , \field Value Until Time 14 + A18 , \field Time 15 + \note "until" includes the time entered. + \units hh:mm + N15 , \field Value Until Time 15 + A19 , \field Time 16 + \note "until" includes the time entered. + \units hh:mm + N16 , \field Value Until Time 16 + A20 , \field Time 17 + \note "until" includes the time entered. + \units hh:mm + N17 , \field Value Until Time 17 + A21 , \field Time 18 + \note "until" includes the time entered. + \units hh:mm + N18 , \field Value Until Time 18 + A22 , \field Time 19 + \note "until" includes the time entered. + \units hh:mm + N19 , \field Value Until Time 19 + A23 , \field Time 20 + \note "until" includes the time entered. + \units hh:mm + N20 , \field Value Until Time 20 + A24 , \field Time 21 + \note "until" includes the time entered. + \units hh:mm + N21 , \field Value Until Time 21 + A25 , \field Time 22 + \note "until" includes the time entered. + \units hh:mm + N22 , \field Value Until Time 22 + A26 , \field Time 23 + \note "until" includes the time entered. + \units hh:mm + N23 , \field Value Until Time 23 + A27 , \field Time 24 + \note "until" includes the time entered. + \units hh:mm + N24 , \field Value Until Time 24 + A28 , \field Time 25 + \note "until" includes the time entered. + \units hh:mm + N25 , \field Value Until Time 25 + A29 , \field Time 26 + \note "until" includes the time entered. + \units hh:mm + N26 , \field Value Until Time 26 + A30 , \field Time 27 + \note "until" includes the time entered. + \units hh:mm + N27 , \field Value Until Time 27 + A31 , \field Time 28 + \note "until" includes the time entered. + \units hh:mm + N28 , \field Value Until Time 28 + A32 , \field Time 29 + \note "until" includes the time entered. + \units hh:mm + N29 , \field Value Until Time 29 + A33 , \field Time 30 + \note "until" includes the time entered. + \units hh:mm + N30 , \field Value Until Time 30 + A34 , \field Time 31 + \note "until" includes the time entered. + \units hh:mm + N31 , \field Value Until Time 31 + A35 , \field Time 32 + \note "until" includes the time entered. + \units hh:mm + N32 , \field Value Until Time 32 + A36 , \field Time 33 + \note "until" includes the time entered. + \units hh:mm + N33 , \field Value Until Time 33 + A37 , \field Time 34 + \note "until" includes the time entered. + \units hh:mm + N34 , \field Value Until Time 34 + A38 , \field Time 35 + \note "until" includes the time entered. + \units hh:mm + N35 , \field Value Until Time 35 + A39 , \field Time 36 + \note "until" includes the time entered. + \units hh:mm + N36 , \field Value Until Time 36 + A40 , \field Time 37 + \note "until" includes the time entered. + \units hh:mm + N37 , \field Value Until Time 37 + A41 , \field Time 38 + \note "until" includes the time entered. + \units hh:mm + N38 , \field Value Until Time 38 + A42 , \field Time 39 + \note "until" includes the time entered. + \units hh:mm + N39 , \field Value Until Time 39 + A43 , \field Time 40 + \note "until" includes the time entered. + \units hh:mm + N40 , \field Value Until Time 40 + A44 , \field Time 41 + \note "until" includes the time entered. + \units hh:mm + N41 , \field Value Until Time 41 + A45 , \field Time 42 + \note "until" includes the time entered. + \units hh:mm + N42 , \field Value Until Time 42 + A46 , \field Time 43 + \note "until" includes the time entered. + \units hh:mm + N43 , \field Value Until Time 43 + A47 , \field Time 44 + \note "until" includes the time entered. + \units hh:mm + N44 , \field Value Until Time 44 + A48 , \field Time 45 + \note "until" includes the time entered. + \units hh:mm + N45 , \field Value Until Time 45 + A49 , \field Time 46 + \note "until" includes the time entered. + \units hh:mm + N46 , \field Value Until Time 46 + A50 , \field Time 47 + \note "until" includes the time entered. + \units hh:mm + N47 , \field Value Until Time 47 + A51 , \field Time 48 + \note "until" includes the time entered. + \units hh:mm + N48 , \field Value Until Time 48 + A52 , \field Time 49 + \note "until" includes the time entered. + \units hh:mm + N49 , \field Value Until Time 49 + A53 , \field Time 50 + \note "until" includes the time entered. + \units hh:mm + N50 , \field Value Until Time 50 + A54 , \field Time 51 + \note "until" includes the time entered. + \units hh:mm + N51 , \field Value Until Time 51 + A55 , \field Time 52 + \note "until" includes the time entered. + \units hh:mm + N52 , \field Value Until Time 52 + A56 , \field Time 53 + \note "until" includes the time entered. + \units hh:mm + N53 , \field Value Until Time 53 + A57 , \field Time 54 + \note "until" includes the time entered. + \units hh:mm + N54 , \field Value Until Time 54 + A58 , \field Time 55 + \note "until" includes the time entered. + \units hh:mm + N55 , \field Value Until Time 55 + A59 , \field Time 56 + \note "until" includes the time entered. + \units hh:mm + N56 , \field Value Until Time 56 + A60 , \field Time 57 + \note "until" includes the time entered. + \units hh:mm + N57 , \field Value Until Time 57 + A61 , \field Time 58 + \note "until" includes the time entered. + \units hh:mm + N58 , \field Value Until Time 58 + A62 , \field Time 59 + \note "until" includes the time entered. + \units hh:mm + N59 , \field Value Until Time 59 + A63 , \field Time 60 + \note "until" includes the time entered. + \units hh:mm + N60 , \field Value Until Time 60 + A64 , \field Time 61 + \note "until" includes the time entered. + \units hh:mm + N61 , \field Value Until Time 61 + A65 , \field Time 62 + \note "until" includes the time entered. + \units hh:mm + N62 , \field Value Until Time 62 + A66 , \field Time 63 + \note "until" includes the time entered. + \units hh:mm + N63 , \field Value Until Time 63 + A67 , \field Time 64 + \note "until" includes the time entered. + \units hh:mm + N64 , \field Value Until Time 64 + A68 , \field Time 65 + \note "until" includes the time entered. + \units hh:mm + N65 , \field Value Until Time 65 + A69 , \field Time 66 + \note "until" includes the time entered. + \units hh:mm + N66 , \field Value Until Time 66 + A70 , \field Time 67 + \note "until" includes the time entered. + \units hh:mm + N67 , \field Value Until Time 67 + A71 , \field Time 68 + \note "until" includes the time entered. + \units hh:mm + N68 , \field Value Until Time 68 + A72 , \field Time 69 + \note "until" includes the time entered. + \units hh:mm + N69 , \field Value Until Time 69 + A73 , \field Time 70 + \note "until" includes the time entered. + \units hh:mm + N70 , \field Value Until Time 70 + A74 , \field Time 71 + \note "until" includes the time entered. + \units hh:mm + N71 , \field Value Until Time 71 + A75 , \field Time 72 + \note "until" includes the time entered. + \units hh:mm + N72 , \field Value Until Time 72 + A76 , \field Time 73 + \note "until" includes the time entered. + \units hh:mm + N73 , \field Value Until Time 73 + A77 , \field Time 74 + \note "until" includes the time entered. + \units hh:mm + N74 , \field Value Until Time 74 + A78 , \field Time 75 + \note "until" includes the time entered. + \units hh:mm + N75 , \field Value Until Time 75 + A79 , \field Time 76 + \note "until" includes the time entered. + \units hh:mm + N76 , \field Value Until Time 76 + A80 , \field Time 77 + \note "until" includes the time entered. + \units hh:mm + N77 , \field Value Until Time 77 + A81 , \field Time 78 + \note "until" includes the time entered. + \units hh:mm + N78 , \field Value Until Time 78 + A82 , \field Time 79 + \note "until" includes the time entered. + \units hh:mm + N79 , \field Value Until Time 79 + A83 , \field Time 80 + \note "until" includes the time entered. + \units hh:mm + N80 , \field Value Until Time 80 + A84 , \field Time 81 + \note "until" includes the time entered. + \units hh:mm + N81 , \field Value Until Time 81 + A85 , \field Time 82 + \note "until" includes the time entered. + \units hh:mm + N82 , \field Value Until Time 82 + A86 , \field Time 83 + \note "until" includes the time entered. + \units hh:mm + N83 , \field Value Until Time 83 + A87 , \field Time 84 + \note "until" includes the time entered. + \units hh:mm + N84 , \field Value Until Time 84 + A88 , \field Time 85 + \note "until" includes the time entered. + \units hh:mm + N85 , \field Value Until Time 85 + A89 , \field Time 86 + \note "until" includes the time entered. + \units hh:mm + N86 , \field Value Until Time 86 + A90 , \field Time 87 + \note "until" includes the time entered. + \units hh:mm + N87 , \field Value Until Time 87 + A91 , \field Time 88 + \note "until" includes the time entered. + \units hh:mm + N88 , \field Value Until Time 88 + A92 , \field Time 89 + \note "until" includes the time entered. + \units hh:mm + N89 , \field Value Until Time 89 + A93 , \field Time 90 + \note "until" includes the time entered. + \units hh:mm + N90 , \field Value Until Time 90 + A94 , \field Time 91 + \note "until" includes the time entered. + \units hh:mm + N91 , \field Value Until Time 91 + A95 , \field Time 92 + \note "until" includes the time entered. + \units hh:mm + N92 , \field Value Until Time 92 + A96 , \field Time 93 + \note "until" includes the time entered. + \units hh:mm + N93 , \field Value Until Time 93 + A97 , \field Time 94 + \note "until" includes the time entered. + \units hh:mm + N94 , \field Value Until Time 94 + A98 , \field Time 95 + \note "until" includes the time entered. + \units hh:mm + N95 , \field Value Until Time 95 + A99 , \field Time 96 + \note "until" includes the time entered. + \units hh:mm + N96 , \field Value Until Time 96 + A100, \field Time 97 + \note "until" includes the time entered. + \units hh:mm + N97 , \field Value Until Time 97 + A101, \field Time 98 + \note "until" includes the time entered. + \units hh:mm + N98 , \field Value Until Time 98 + A102, \field Time 99 + \note "until" includes the time entered. + \units hh:mm + N99 , \field Value Until Time 99 + A103, \field Time 100 + \note "until" includes the time entered. + \units hh:mm + N100, \field Value Until Time 100 + A104, \field Time 101 + \note "until" includes the time entered. + \units hh:mm + N101, \field Value Until Time 101 + A105, \field Time 102 + \note "until" includes the time entered. + \units hh:mm + N102, \field Value Until Time 102 + A106, \field Time 103 + \note "until" includes the time entered. + \units hh:mm + N103, \field Value Until Time 103 + A107, \field Time 104 + \note "until" includes the time entered. + \units hh:mm + N104, \field Value Until Time 104 + A108, \field Time 105 + \note "until" includes the time entered. + \units hh:mm + N105, \field Value Until Time 105 + A109, \field Time 106 + \note "until" includes the time entered. + \units hh:mm + N106, \field Value Until Time 106 + A110, \field Time 107 + \note "until" includes the time entered. + \units hh:mm + N107, \field Value Until Time 107 + A111, \field Time 108 + \note "until" includes the time entered. + \units hh:mm + N108, \field Value Until Time 108 + A112, \field Time 109 + \note "until" includes the time entered. + \units hh:mm + N109, \field Value Until Time 109 + A113, \field Time 110 + \note "until" includes the time entered. + \units hh:mm + N110, \field Value Until Time 110 + A114, \field Time 111 + \note "until" includes the time entered. + \units hh:mm + N111, \field Value Until Time 111 + A115, \field Time 112 + \note "until" includes the time entered. + \units hh:mm + N112, \field Value Until Time 112 + A116, \field Time 113 + \note "until" includes the time entered. + \units hh:mm + N113, \field Value Until Time 113 + A117, \field Time 114 + \note "until" includes the time entered. + \units hh:mm + N114, \field Value Until Time 114 + A118, \field Time 115 + \note "until" includes the time entered. + \units hh:mm + N115, \field Value Until Time 115 + A119, \field Time 116 + \note "until" includes the time entered. + \units hh:mm + N116, \field Value Until Time 116 + A120, \field Time 117 + \note "until" includes the time entered. + \units hh:mm + N117, \field Value Until Time 117 + A121, \field Time 118 + \note "until" includes the time entered. + \units hh:mm + N118, \field Value Until Time 118 + A122, \field Time 119 + \note "until" includes the time entered. + \units hh:mm + N119, \field Value Until Time 119 + A123, \field Time 120 + \note "until" includes the time entered. + \units hh:mm + N120, \field Value Until Time 120 + A124, \field Time 121 + \note "until" includes the time entered. + \units hh:mm + N121, \field Value Until Time 121 + A125, \field Time 122 + \note "until" includes the time entered. + \units hh:mm + N122, \field Value Until Time 122 + A126, \field Time 123 + \note "until" includes the time entered. + \units hh:mm + N123, \field Value Until Time 123 + A127, \field Time 124 + \note "until" includes the time entered. + \units hh:mm + N124, \field Value Until Time 124 + A128, \field Time 125 + \note "until" includes the time entered. + \units hh:mm + N125, \field Value Until Time 125 + A129, \field Time 126 + \note "until" includes the time entered. + \units hh:mm + N126, \field Value Until Time 126 + A130, \field Time 127 + \note "until" includes the time entered. + \units hh:mm + N127, \field Value Until Time 127 + A131, \field Time 128 + \note "until" includes the time entered. + \units hh:mm + N128, \field Value Until Time 128 + A132, \field Time 129 + \note "until" includes the time entered. + \units hh:mm + N129, \field Value Until Time 129 + A133, \field Time 130 + \note "until" includes the time entered. + \units hh:mm + N130, \field Value Until Time 130 + A134, \field Time 131 + \note "until" includes the time entered. + \units hh:mm + N131, \field Value Until Time 131 + A135, \field Time 132 + \note "until" includes the time entered. + \units hh:mm + N132, \field Value Until Time 132 + A136, \field Time 133 + \note "until" includes the time entered. + \units hh:mm + N133, \field Value Until Time 133 + A137, \field Time 134 + \note "until" includes the time entered. + \units hh:mm + N134, \field Value Until Time 134 + A138, \field Time 135 + \note "until" includes the time entered. + \units hh:mm + N135, \field Value Until Time 135 + A139, \field Time 136 + \note "until" includes the time entered. + \units hh:mm + N136, \field Value Until Time 136 + A140, \field Time 137 + \note "until" includes the time entered. + \units hh:mm + N137, \field Value Until Time 137 + A141, \field Time 138 + \note "until" includes the time entered. + \units hh:mm + N138, \field Value Until Time 138 + A142, \field Time 139 + \note "until" includes the time entered. + \units hh:mm + N139, \field Value Until Time 139 + A143, \field Time 140 + \note "until" includes the time entered. + \units hh:mm + N140, \field Value Until Time 140 + A144, \field Time 141 + \note "until" includes the time entered. + \units hh:mm + N141, \field Value Until Time 141 + A145, \field Time 142 + \note "until" includes the time entered. + \units hh:mm + N142, \field Value Until Time 142 + A146, \field Time 143 + \note "until" includes the time entered. + \units hh:mm + N143, \field Value Until Time 143 + A147, \field Time 144 + \note "until" includes the time entered. + \units hh:mm + N144; \field Value Until Time 144 + +Schedule:Day:List, + \memo Schedule:Day:List will allow the user to list 24 hours worth of values, which can be sub-hourly in nature. + \min-fields 5 + \extensible:1 + A1 , \field Name + \required-field + \type alpha + \reference DayScheduleNames + A2 , \field Schedule Type Limits Name + \type object-list + \object-list ScheduleTypeLimitsNames + A3 , \field Interpolate to Timestep + \note when the interval does not match the user specified timestep a "Average" choice will average between the intervals request (to + \note timestep resolution. A "No" choice will use the interval value at the simulation timestep without regard to if it matches + \note the boundary or not. A "Linear" choice will interpolate linearly between successive values. + \type choice + \key Average + \key Linear + \key No + \default No + N1 , \field Minutes per Item + \note Must be evenly divisible into 60 + \type integer + \minimum 1 + \maximum 60 + N2, \field Value 1 + \begin-extensible + \default 0.0 + N3,N4, N5,N6,N7,N8, N9,N10,N11,N12, N13,N14,N15,N16, N17,N18,N19,N20, \note fields as indicated + N21,N22,N23,N24, N25,N26,N27,N28, N29,N30,N31,N32, N33,N34,N35,N36, N37,N38,N39,N40, \note fields as indicated + N41,N42,N43,N44, N45,N46,N47,N48, N49,N50,N51,N52, N53,N54,N55,N56, N57,N58,N59,N60, \note fields as indicated + N61,N62,N63,N64, N65,N66,N67,N68, N69,N70,N71,N72, N73,N74,N75,N76, N77,N78,N79,N80, \note fields as indicated + N81,N82,N83,N84, N85,N86,N87,N88, N89,N90,N91,N92, N93,N94,N95,N96, N97,N98,N99,N100, \note fields as indicated + + N101,N102,N103,N104, N105,N106,N107,N108, N109,N110,N111,N112, N113,N114,N115,N116, N117,N118,N119,N120, \note fields as indicated + N121,N122,N123,N124, N125,N126,N127,N128, N129,N130,N131,N132, N133,N134,N135,N136, N137,N138,N139,N140, \note fields as indicated + N141,N142,N143,N144, N145,N146,N147,N148, N149,N150,N151,N152, N153,N154,N155,N156, N157,N158,N159,N160, \note fields as indicated + N161,N162,N163,N164, N165,N166,N167,N168, N169,N170,N171,N172, N173,N174,N175,N176, N177,N178,N179,N180, \note fields as indicated + N181,N182,N183,N184, N185,N186,N187,N188, N189,N190,N191,N192, N193,N194,N195,N196, N197,N198,N199,N200, \note fields as indicated + + N201,N202,N203,N204, N205,N206,N207,N208, N209,N210,N211,N212, N213,N214,N215,N216, N217,N218,N219,N220, \note fields as indicated + N221,N222,N223,N224, N225,N226,N227,N228, N229,N230,N231,N232, N233,N234,N235,N236, N237,N238,N239,N240, \note fields as indicated + N241,N242,N243,N244, N245,N246,N247,N248, N249,N250,N251,N252, N253,N254,N255,N256, N257,N258,N259,N260, \note fields as indicated + N261,N262,N263,N264, N265,N266,N267,N268, N269,N270,N271,N272, N273,N274,N275,N276, N277,N278,N279,N280, \note fields as indicated + N281,N282,N283,N284, N285,N286,N287,N288, N289,N290,N291,N292, N293,N294,N295,N296, N297,N298,N299,N300, \note fields as indicated + + N301,N302,N303,N304, N305,N306,N307,N308, N309,N310,N311,N312, N313,N314,N315,N316, N317,N318,N319,N320, \note fields as indicated + N321,N322,N323,N324, N325,N326,N327,N328, N329,N330,N331,N332, N333,N334,N335,N336, N337,N338,N339,N340, \note fields as indicated + N341,N342,N343,N344, N345,N346,N347,N348, N349,N350,N351,N352, N353,N354,N355,N356, N357,N358,N359,N360, \note fields as indicated + N361,N362,N363,N364, N365,N366,N367,N368, N369,N370,N371,N372, N373,N374,N375,N376, N377,N378,N379,N380, \note fields as indicated + N381,N382,N383,N384, N385,N386,N387,N388, N389,N390,N391,N392, N393,N394,N395,N396, N397,N398,N399,N400, \note fields as indicated + + N401,N402,N403,N404, N405,N406,N407,N408, N409,N410,N411,N412, N413,N414,N415,N416, N417,N418,N419,N420, \note fields as indicated + N421,N422,N423,N424, N425,N426,N427,N428, N429,N430,N431,N432, N433,N434,N435,N436, N437,N438,N439,N440, \note fields as indicated + N441,N442,N443,N444, N445,N446,N447,N448, N449,N450,N451,N452, N453,N454,N455,N456, N457,N458,N459,N460, \note fields as indicated + N461,N462,N463,N464, N465,N466,N467,N468, N469,N470,N471,N472, N473,N474,N475,N476, N477,N478,N479,N480, \note fields as indicated + N481,N482,N483,N484, N485,N486,N487,N488, N489,N490,N491,N492, N493,N494,N495,N496, N497,N498,N499,N500, \note fields as indicated + + N501,N502,N503,N504, N505,N506,N507,N508, N509,N510,N511,N512, N513,N514,N515,N516, N517,N518,N519,N520, \note fields as indicated + N521,N522,N523,N524, N525,N526,N527,N528, N529,N530,N531,N532, N533,N534,N535,N536, N537,N538,N539,N540, \note fields as indicated + N541,N542,N543,N544, N545,N546,N547,N548, N549,N550,N551,N552, N553,N554,N555,N556, N557,N558,N559,N560, \note fields as indicated + N561,N562,N563,N564, N565,N566,N567,N568, N569,N570,N571,N572, N573,N574,N575,N576, N577,N578,N579,N580, \note fields as indicated + N581,N582,N583,N584, N585,N586,N587,N588, N589,N590,N591,N592, N593,N594,N595,N596, N597,N598,N599,N600, \note fields as indicated + + N601,N602,N603,N604, N605,N606,N607,N608, N609,N610,N611,N612, N613,N614,N615,N616, N617,N618,N619,N620, \note fields as indicated + N621,N622,N623,N624, N625,N626,N627,N628, N629,N630,N631,N632, N633,N634,N635,N636, N637,N638,N639,N640, \note fields as indicated + N641,N642,N643,N644, N645,N646,N647,N648, N649,N650,N651,N652, N653,N654,N655,N656, N657,N658,N659,N660, \note fields as indicated + N661,N662,N663,N664, N665,N666,N667,N668, N669,N670,N671,N672, N673,N674,N675,N676, N677,N678,N679,N680, \note fields as indicated + N681,N682,N683,N684, N685,N686,N687,N688, N689,N690,N691,N692, N693,N694,N695,N696, N697,N698,N699,N700, \note fields as indicated + + N701,N702,N703,N704, N705,N706,N707,N708, N709,N710,N711,N712, N713,N714,N715,N716, N717,N718,N719,N720, \note fields as indicated + N721,N722,N723,N724, N725,N726,N727,N728, N729,N730,N731,N732, N733,N734,N735,N736, N737,N738,N739,N740, \note fields as indicated + N741,N742,N743,N744, N745,N746,N747,N748, N749,N750,N751,N752, N753,N754,N755,N756, N757,N758,N759,N760, \note fields as indicated + N761,N762,N763,N764, N765,N766,N767,N768, N769,N770,N771,N772, N773,N774,N775,N776, N777,N778,N779,N780, \note fields as indicated + N781,N782,N783,N784, N785,N786,N787,N788, N789,N790,N791,N792, N793,N794,N795,N796, N797,N798,N799,N800, \note fields as indicated + + N801,N802,N803,N804, N805,N806,N807,N808, N809,N810,N811,N812, N813,N814,N815,N816, N817,N818,N819,N820, \note fields as indicated + N821,N822,N823,N824, N825,N826,N827,N828, N829,N830,N831,N832, N833,N834,N835,N836, N837,N838,N839,N840, \note fields as indicated + N841,N842,N843,N844, N845,N846,N847,N848, N849,N850,N851,N852, N853,N854,N855,N856, N857,N858,N859,N860, \note fields as indicated + N861,N862,N863,N864, N865,N866,N867,N868, N869,N870,N871,N872, N873,N874,N875,N876, N877,N878,N879,N880, \note fields as indicated + N881,N882,N883,N884, N885,N886,N887,N888, N889,N890,N891,N892, N893,N894,N895,N896, N897,N898,N899,N900, \note fields as indicated + + N901,N902,N903,N904, N905,N906,N907,N908, N909,N910,N911,N912, N913,N914,N915,N916, N917,N918,N919,N920, \note fields as indicated + N921,N922,N923,N924, N925,N926,N927,N928, N929,N930,N931,N932, N933,N934,N935,N936, N937,N938,N939,N940, \note fields as indicated + N941,N942,N943,N944, N945,N946,N947,N948, N949,N950,N951,N952, N953,N954,N955,N956, N957,N958,N959,N960, \note fields as indicated + N961,N962,N963,N964, N965,N966,N967,N968, N969,N970,N971,N972, N973,N974,N975,N976, N977,N978,N979,N980, \note fields as indicated + N981,N982,N983,N984, N985,N986,N987,N988, N989,N990,N991,N992, N993,N994,N995,N996, N997,N998,N999,N1000, \note fields as indicated + + N1001,N1002,N1003,N1004, N1005,N1006,N1007,N1008, N1009,N1010,N1011,N1012, N1013,N1014,N1015,N1016, N1017,N1018,N1019,N1020, \note fields as indicated + N1021,N1022,N1023,N1024, N1025,N1026,N1027,N1028, N1029,N1030,N1031,N1032, N1033,N1034,N1035,N1036, N1037,N1038,N1039,N1040, \note fields as indicated + N1041,N1042,N1043,N1044, N1045,N1046,N1047,N1048, N1049,N1050,N1051,N1052, N1053,N1054,N1055,N1056, N1057,N1058,N1059,N1060, \note fields as indicated + N1061,N1062,N1063,N1064, N1065,N1066,N1067,N1068, N1069,N1070,N1071,N1072, N1073,N1074,N1075,N1076, N1077,N1078,N1079,N1080, \note fields as indicated + N1081,N1082,N1083,N1084, N1085,N1086,N1087,N1088, N1089,N1090,N1091,N1092, N1093,N1094,N1095,N1096, N1097,N1098,N1099,N1100, \note fields as indicated + + N1101,N1102,N1103,N1104, N1105,N1106,N1107,N1108, N1109,N1110,N1111,N1112, N1113,N1114,N1115,N1116, N1117,N1118,N1119,N1120, \note fields as indicated + N1121,N1122,N1123,N1124, N1125,N1126,N1127,N1128, N1129,N1130,N1131,N1132, N1133,N1134,N1135,N1136, N1137,N1138,N1139,N1140, \note fields as indicated + N1141,N1142,N1143,N1144, N1145,N1146,N1147,N1148, N1149,N1150,N1151,N1152, N1153,N1154,N1155,N1156, N1157,N1158,N1159,N1160, \note fields as indicated + N1161,N1162,N1163,N1164, N1165,N1166,N1167,N1168, N1169,N1170,N1171,N1172, N1173,N1174,N1175,N1176, N1177,N1178,N1179,N1180, \note fields as indicated + N1181,N1182,N1183,N1184, N1185,N1186,N1187,N1188, N1189,N1190,N1191,N1192, N1193,N1194,N1195,N1196, N1197,N1198,N1199,N1200, \note fields as indicated + + N1201,N1202,N1203,N1204, N1205,N1206,N1207,N1208, N1209,N1210,N1211,N1212, N1213,N1214,N1215,N1216, N1217,N1218,N1219,N1220,\note fields as indicated + N1221,N1222,N1223,N1224, N1225,N1226,N1227,N1228, N1229,N1230,N1231,N1232, N1233,N1234,N1235,N1236, N1237,N1238,N1239,N1240,\note fields as indicated + N1241,N1242,N1243,N1244, N1245,N1246,N1247,N1248, N1249,N1250,N1251,N1252, N1253,N1254,N1255,N1256, N1257,N1258,N1259,N1260,\note fields as indicated + N1261,N1262,N1263,N1264, N1265,N1266,N1267,N1268, N1269,N1270,N1271,N1272, N1273,N1274,N1275,N1276, N1277,N1278,N1279,N1280,\note fields as indicated + N1281,N1282,N1283,N1284, N1285,N1286,N1287,N1288, N1289,N1290,N1291,N1292, N1293,N1294,N1295,N1296, N1297,N1298,N1299,N1300,\note fields as indicated + + N1301,N1302,N1303,N1304, N1305,N1306,N1307,N1308, N1309,N1310,N1311,N1312, N1313,N1314,N1315,N1316, N1317,N1318,N1319,N1320,\note fields as indicated + N1321,N1322,N1323,N1324, N1325,N1326,N1327,N1328, N1329,N1330,N1331,N1332, N1333,N1334,N1335,N1336, N1337,N1338,N1339,N1340,\note fields as indicated + N1341,N1342,N1343,N1344, N1345,N1346,N1347,N1348, N1349,N1350,N1351,N1352, N1353,N1354,N1355,N1356, N1357,N1358,N1359,N1360,\note fields as indicated + N1361,N1362,N1363,N1364, N1365,N1366,N1367,N1368, N1369,N1370,N1371,N1372, N1373,N1374,N1375,N1376, N1377,N1378,N1379,N1380,\note fields as indicated + N1381,N1382,N1383,N1384, N1385,N1386,N1387,N1388, N1389,N1390,N1391,N1392, N1393,N1394,N1395,N1396, N1397,N1398,N1399,N1400,\note fields as indicated + + N1401,N1402,N1403,N1404, N1405,N1406,N1407,N1408, N1409,N1410,N1411,N1412, N1413,N1414,N1415,N1416, N1417,N1418,N1419,N1420,\note fields as indicated + N1421,N1422,N1423,N1424, N1425,N1426,N1427,N1428, N1429,N1430,N1431,N1432, N1433,N1434,N1435,N1436, N1437,N1438,N1439,N1440,\note fields as indicated + N1441;\note fields as indicated + +Schedule:Week:Daily, + \min-fields 13 + \memo A Schedule:Week:Daily contains 12 Schedule:Day:Hourly objects, one for each day type. + A1 , \field Name + \required-field + \reference WeekScheduleNames + \type alpha + A2 , \field Sunday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A3 , \field Monday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A4 , \field Tuesday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A5 , \field Wednesday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A6 , \field Thursday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A7 , \field Friday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A8 , \field Saturday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A9 , \field Holiday Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A10, \field SummerDesignDay Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A11, \field WinterDesignDay Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A12, \field CustomDay1 Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + A13; \field CustomDay2 Schedule:Day Name + \required-field + \type object-list + \object-list DayScheduleNames + +Schedule:Week:Compact, + \extensible:2 - repeat last two fields, remembering to remove ; from "inner" fields. + \memo Compact definition for Schedule:Day:List + \min-fields 3 + A1 , \field Name + \required-field + \reference WeekScheduleNames + \type alpha + A2 , \field DayType List 1 + \begin-extensible + \note "For" is an optional prefix/start of the For fields. Choices can be combined on single line + \note if separated by spaces. i.e. "Holiday Weekends" + \note Should have a space after For, if it is included. i.e. "For Alldays" + \required-field + \type choice + \key AllDays + \key AllOtherDays + \key Weekdays + \key Weekends + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A3 , \field Schedule:Day Name 1 + \required-field + \type object-list + \object-list DayScheduleNames + A4 , \field DayType List 2 + \type choice + \key AllDays + \key AllOtherDays + \key Weekdays + \key Weekends + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A5 , \field Schedule:Day Name 2 + \type object-list + \object-list DayScheduleNames + A6 , \field DayType List 3 + \type choice + \key AllDays + \key AllOtherDays + \key Weekdays + \key Weekends + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A7 , \field Schedule:Day Name 3 + \type object-list + \object-list DayScheduleNames + A8 , \field DayType List 4 + \type choice + \key AllDays + \key AllOtherDays + \key Weekdays + \key Weekends + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A9 , \field Schedule:Day Name 4 + \type object-list + \object-list DayScheduleNames + A10, \field DayType List 5 + \type choice + \key AllDays + \key AllOtherDays + \key Weekdays + \key Weekends + \key Sunday + \key Monday + \key Tuesday + \key Wednesday + \key Thursday + \key Friday + \key Saturday + \key Holiday + \key SummerDesignDay + \key WinterDesignDay + \key CustomDay1 + \key CustomDay2 + A11; \field Schedule:Day Name 5 + \type object-list + \object-list DayScheduleNames + +Schedule:Year, + \min-fields 7 + \extensible:5 + \memo A Schedule:Year contains from 1 to 52 week schedules + A1 , \field Name + \required-field + \type alpha + \reference ScheduleNames + A2 , \field Schedule Type Limits Name + \type object-list + \object-list ScheduleTypeLimitsNames + A3 , \field Schedule:Week Name 1 + \begin-extensible + \required-field + \type object-list + \object-list WeekScheduleNames + N1 , \field Start Month 1 + \required-field + \type integer + \minimum 1 + \maximum 12 + N2 , \field Start Day 1 + \required-field + \type integer + \minimum 1 + \maximum 31 + N3 , \field End Month 1 + \required-field + \type integer + \minimum 1 + \maximum 12 + N4 , \field End Day 1 + \required-field + \type integer + \minimum 1 + \maximum 31 + A4 , \field Schedule:Week Name 2 + \type object-list + \object-list WeekScheduleNames + N5 , \field Start Month 2 + \type integer + \minimum 1 + \maximum 12 + N6 , \field Start Day 2 + \type integer + \minimum 1 + \maximum 31 + N7 , \field End Month 2 + \type integer + \minimum 1 + \maximum 12 + N8 , \field End Day 2 + \type integer + \minimum 1 + \maximum 31 + A5 , \field Schedule:Week Name 3 + \type object-list + \object-list WeekScheduleNames + N9 , \field Start Month 3 + \type integer + \minimum 1 + \maximum 12 + N10, \field Start Day 3 + \type integer + \minimum 1 + \maximum 31 + N11, \field End Month 3 + \type integer + \minimum 1 + \maximum 12 + N12, \field End Day 3 + \type integer + \minimum 1 + \maximum 31 + A6 , \field Schedule:Week Name 4 + \type object-list + \object-list WeekScheduleNames + N13, \field Start Month 4 + \type integer + \minimum 1 + \maximum 12 + N14, \field Start Day 4 + \type integer + \minimum 1 + \maximum 31 + N15, \field End Month 4 + \type integer + \minimum 1 + \maximum 12 + N16, \field End Day 4 + \type integer + \minimum 1 + \maximum 31 + A7 , \field Schedule:Week Name 5 + \type object-list + \object-list WeekScheduleNames + N17, \field Start Month 5 + \type integer + \minimum 1 + \maximum 12 + N18, \field Start Day 5 + \type integer + \minimum 1 + \maximum 31 + N19, \field End Month 5 + \type integer + \minimum 1 + \maximum 12 + N20, \field End Day 5 + \type integer + \minimum 1 + \maximum 31 + A8 , \field Schedule:Week Name 6 + \type object-list + \object-list WeekScheduleNames + N21, \field Start Month 6 + \type integer + \minimum 1 + \maximum 12 + N22, \field Start Day 6 + \type integer + \minimum 1 + \maximum 31 + N23, \field End Month 6 + \type integer + \minimum 1 + \maximum 12 + N24, \field End Day 6 + \type integer + \minimum 1 + \maximum 31 + A9 , \field Schedule:Week Name 7 + \type object-list + \object-list WeekScheduleNames + N25, \field Start Month 7 + \type integer + \minimum 1 + \maximum 12 + N26, \field Start Day 7 + \type integer + \minimum 1 + \maximum 31 + N27, \field End Month 7 + \type integer + \minimum 1 + \maximum 12 + N28, \field End Day 7 + \type integer + \minimum 1 + \maximum 31 + A10, \field Schedule:Week Name 8 + \type object-list + \object-list WeekScheduleNames + N29, \field Start Month 8 + \type integer + \minimum 1 + \maximum 12 + N30, \field Start Day 8 + \type integer + \minimum 1 + \maximum 31 + N31, \field End Month 8 + \type integer + \minimum 1 + \maximum 12 + N32, \field End Day 8 + \type integer + \minimum 1 + \maximum 31 + A11, \field Schedule:Week Name 9 + \type object-list + \object-list WeekScheduleNames + N33, \field Start Month 9 + \type integer + \minimum 1 + \maximum 12 + N34, \field Start Day 9 + \type integer + \minimum 1 + \maximum 31 + N35, \field End Month 9 + \type integer + \minimum 1 + \maximum 12 + N36, \field End Day 9 + \type integer + \minimum 1 + \maximum 31 + A12, \field Schedule:Week Name 10 + \type object-list + \object-list WeekScheduleNames + N37, \field Start Month 10 + \type integer + \minimum 1 + \maximum 12 + N38, \field Start Day 10 + \type integer + \minimum 1 + \maximum 31 + N39, \field End Month 10 + \type integer + \minimum 1 + \maximum 12 + N40, \field End Day 10 + \type integer + \minimum 1 + \maximum 31 + A13, \field Schedule:Week Name 11 + \type object-list + \object-list WeekScheduleNames + N41, \field Start Month 11 + \type integer + \minimum 1 + \maximum 12 + N42, \field Start Day 11 + \type integer + \minimum 1 + \maximum 31 + N43, \field End Month 11 + \type integer + \minimum 1 + \maximum 12 + N44, \field End Day 11 + \type integer + \minimum 1 + \maximum 31 + A14, \field Schedule:Week Name 12 + \type object-list + \object-list WeekScheduleNames + N45, \field Start Month 12 + \type integer + \minimum 1 + \maximum 12 + N46, \field Start Day 12 + \type integer + \minimum 1 + \maximum 31 + N47, \field End Month 12 + \type integer + \minimum 1 + \maximum 12 + N48, \field End Day 12 + \type integer + \minimum 1 + \maximum 31 + A15, \field Schedule:Week Name 13 + \type object-list + \object-list WeekScheduleNames + N49, \field Start Month 13 + \type integer + \minimum 1 + \maximum 12 + N50, \field Start Day 13 + \type integer + \minimum 1 + \maximum 31 + N51, \field End Month 13 + \type integer + \minimum 1 + \maximum 12 + N52, \field End Day 13 + \type integer + \minimum 1 + \maximum 31 + A16, \field Schedule:Week Name 14 + \type object-list + \object-list WeekScheduleNames + N53, \field Start Month 14 + \type integer + \minimum 1 + \maximum 12 + N54, \field Start Day 14 + \type integer + \minimum 1 + \maximum 31 + N55, \field End Month 14 + \type integer + \minimum 1 + \maximum 12 + N56, \field End Day 14 + \type integer + \minimum 1 + \maximum 31 + A17, \field Schedule:Week Name 15 + \type object-list + \object-list WeekScheduleNames + N57, \field Start Month 15 + \type integer + \minimum 1 + \maximum 12 + N58, \field Start Day 15 + \type integer + \minimum 1 + \maximum 31 + N59, \field End Month 15 + \type integer + \minimum 1 + \maximum 12 + N60, \field End Day 15 + \type integer + \minimum 1 + \maximum 31 + A18, \field Schedule:Week Name 16 + \type object-list + \object-list WeekScheduleNames + N61, \field Start Month 16 + \type integer + \minimum 1 + \maximum 12 + N62, \field Start Day 16 + \type integer + \minimum 1 + \maximum 31 + N63, \field End Month 16 + \type integer + \minimum 1 + \maximum 12 + N64, \field End Day 16 + \type integer + \minimum 1 + \maximum 31 + A19, \field Schedule:Week Name 17 + \type object-list + \object-list WeekScheduleNames + N65, \field Start Month 17 + \type integer + \minimum 1 + \maximum 12 + N66, \field Start Day 17 + \type integer + \minimum 1 + \maximum 31 + N67, \field End Month 17 + \type integer + \minimum 1 + \maximum 12 + N68, \field End Day 17 + \type integer + \minimum 1 + \maximum 31 + A20, \field Schedule:Week Name 18 + \type object-list + \object-list WeekScheduleNames + N69, \field Start Month 18 + \type integer + \minimum 1 + \maximum 12 + N70, \field Start Day 18 + \type integer + \minimum 1 + \maximum 31 + N71, \field End Month 18 + \type integer + \minimum 1 + \maximum 12 + N72, \field End Day 18 + \type integer + \minimum 1 + \maximum 31 + A21, \field Schedule:Week Name 19 + \type object-list + \object-list WeekScheduleNames + N73, \field Start Month 19 + \type integer + \minimum 1 + \maximum 12 + N74, \field Start Day 19 + \type integer + \minimum 1 + \maximum 31 + N75, \field End Month 19 + \type integer + \minimum 1 + \maximum 12 + N76, \field End Day 19 + \type integer + \minimum 1 + \maximum 31 + A22, \field Schedule:Week Name 20 + \type object-list + \object-list WeekScheduleNames + N77, \field Start Month 20 + \type integer + \minimum 1 + \maximum 12 + N78, \field Start Day 20 + \type integer + \minimum 1 + \maximum 31 + N79, \field End Month 20 + \type integer + \minimum 1 + \maximum 12 + N80, \field End Day 20 + \type integer + \minimum 1 + \maximum 31 + A23, \field Schedule:Week Name 21 + \type object-list + \object-list WeekScheduleNames + N81, \field Start Month 21 + \type integer + \minimum 1 + \maximum 12 + N82, \field Start Day 21 + \type integer + \minimum 1 + \maximum 31 + N83, \field End Month 21 + \type integer + \minimum 1 + \maximum 12 + N84, \field End Day 21 + \type integer + \minimum 1 + \maximum 31 + A24, \field Schedule:Week Name 22 + \type object-list + \object-list WeekScheduleNames + N85, \field Start Month 22 + \type integer + \minimum 1 + \maximum 12 + N86, \field Start Day 22 + \type integer + \minimum 1 + \maximum 31 + N87, \field End Month 22 + \type integer + \minimum 1 + \maximum 12 + N88, \field End Day 22 + \type integer + \minimum 1 + \maximum 31 + A25, \field Schedule:Week Name 23 + \type object-list + \object-list WeekScheduleNames + N89, \field Start Month 23 + \type integer + \minimum 1 + \maximum 12 + N90, \field Start Day 23 + \type integer + \minimum 1 + \maximum 31 + N91, \field End Month 23 + \type integer + \minimum 1 + \maximum 12 + N92, \field End Day 23 + \type integer + \minimum 1 + \maximum 31 + A26, \field Schedule:Week Name 24 + \type object-list + \object-list WeekScheduleNames + N93, \field Start Month 24 + \type integer + \minimum 1 + \maximum 12 + N94, \field Start Day 24 + \type integer + \minimum 1 + \maximum 31 + N95, \field End Month 24 + \type integer + \minimum 1 + \maximum 12 + N96, \field End Day 24 + \type integer + \minimum 1 + \maximum 31 + A27, \field Schedule:Week Name 25 + \type object-list + \object-list WeekScheduleNames + N97, \field Start Month 25 + \type integer + \minimum 1 + \maximum 12 + N98, \field Start Day 25 + \type integer + \minimum 1 + \maximum 31 + N99, \field End Month 25 + \type integer + \minimum 1 + \maximum 12 + N100, \field End Day 25 + \type integer + \minimum 1 + \maximum 31 + A28, \field Schedule:Week Name 26 + \type object-list + \object-list WeekScheduleNames + N101, \field Start Month 26 + \type integer + \minimum 1 + \maximum 12 + N102, \field Start Day 26 + \type integer + \minimum 1 + \maximum 31 + N103, \field End Month 26 + \type integer + \minimum 1 + \maximum 12 + N104, \field End Day 26 + \type integer + \minimum 1 + \maximum 31 + \note Schedule:Week for Weeks 27-53 are condensed + A29,N105,N106,N107,N108, \note For Week 27 + A30,N109,N110,N111,N112, \note For Week 28 + A31,N113,N114,N115,N116, \note For Week 29 + A32,N117,N118,N119,N120, \note For Week 30 + A33,N121,N122,N123,N124, \note For Week 31 + A34,N125,N126,N127,N128, \note For Week 32 + A35,N129,N130,N131,N132, \note For Week 33 + A36,N133,N134,N135,N136, \note For Week 34 + A37,N137,N138,N139,N140, \note For Week 35 + A38,N141,N142,N143,N144, \note For Week 36 + A39,N145,N146,N147,N148, \note For Week 37 + A40,N149,N150,N151,N152, \note For Week 38 + A41,N153,N154,N155,N156, \note For Week 39 + A42,N157,N158,N159,N160, \note For Week 40 + A43,N161,N162,N163,N164, \note For Week 41 + A44,N165,N166,N167,N168, \note For Week 42 + A45,N169,N170,N171,N172, \note For Week 43 + A46,N173,N174,N175,N176, \note For Week 44 + A47,N177,N178,N179,N180, \note For Week 45 + A48,N181,N182,N183,N184, \note For Week 46 + A49,N185,N186,N187,N188, \note For Week 47 + A50,N189,N190,N191,N192, \note For Week 48 + A51,N193,N194,N195,N196, \note For Week 49 + A52,N197,N198,N199,N200, \note For Week 50 + A53,N201,N202,N203,N204, \note For Week 51 + A54,N205,N206,N207,N208, \note For Week 52 + A55,N209,N210,N211,N212; \note For Week 53 + +Schedule:Compact, + \extensible:1 - repeat last field, remembering to remove ; from "inner" fields. + \min-fields 5 + \memo Irregular object. Does not follow the usual definition for fields. Fields A3... are: + \memo Through: Date + \memo For: Applicable days (ref: Schedule:Week:Compact) + \memo Interpolate: Average/Linear/No (ref: Schedule:Day:Interval) -- optional, if not used will be "No" + \memo Until: