From 2cfdbcad15d99400cf2ef5d4c4fe179d2df10227 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 29 Feb 2024 16:26:20 -0800 Subject: [PATCH 01/71] Commit test for Issue 16 --- constrain/api/workflow.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index a16fc339..3e59c2f7 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -47,6 +47,10 @@ def __init__(self, workflow, run_workflow_now=False): self.load_states() + # change dir: change the working path to the "working_dir" value in workflow_dict + # Need test + print("Change the working path to ",self.workflow_dict['working_dir']) + os.chdir(self.workflow_dict['working_dir']) if run_workflow_now: self.run_workflow() From c47eca9b17e76d3677738c1cbb0dfdf9dc76d229 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 4 Mar 2024 16:56:38 -0800 Subject: [PATCH 02/71] update for Issue16 --- constrain/api/workflow.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 3e59c2f7..5ea764aa 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -49,8 +49,15 @@ def __init__(self, workflow, run_workflow_now=False): # change dir: change the working path to the "working_dir" value in workflow_dict # Need test - print("Change the working path to ",self.workflow_dict['working_dir']) - os.chdir(self.workflow_dict['working_dir']) + + + if (isinstance(self.workflow_dict['working_dir'], str) and os.path.exists(self.workflow_dict['working_dir'])) : + print("Change the working path to ",self.workflow_dict['working_dir']) + os.chdir(self.workflow_dict['working_dir']) + else: + logging.error( + "working directory is not valid or the specified workign directory does not exist.") + if run_workflow_now: self.run_workflow() From 1b19f89b6dd407f366851a5695ed6368f23c6a1f Mon Sep 17 00:00:00 2001 From: FanFeng Date: Tue, 12 Mar 2024 16:45:04 -0700 Subject: [PATCH 03/71] Add ctest for Linux/Windows Working path --- constrain/api/workflow.py | 31 +++++++++++++++++++++++++----- tests/api/test_flexible_calling.py | 28 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 tests/api/test_flexible_calling.py diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 5ea764aa..570106ef 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -5,7 +5,7 @@ """ import glob -import sys, logging, json, os, datetime +import sys, logging, json, os, datetime,platform from typing import Union sys.path.append("./constrain") @@ -49,14 +49,35 @@ def __init__(self, workflow, run_workflow_now=False): # change dir: change the working path to the "working_dir" value in workflow_dict # Need test + # To-Do-list + # 1. what if no working dir value is provided? + # 2. Not a valid string: not a valid linux string or windows string + # 3. WD does not exist. + # 4. Run correctly. - - if (isinstance(self.workflow_dict['working_dir'], str) and os.path.exists(self.workflow_dict['working_dir'])) : + # First, detect if the working + if (not isinstance(self.workflow_dict['working_dir'], str)): + logging.error("working directory specified is not a valid string.") + else: + # then detect if the working dir provided is in Linux format or Windows Format. + if ('/' in self.workflow_dict['working_dir']) and ('\\' not in self.workflow_dict['working_dir']): + # in Linux Format + if platform.system() == "Windows": # convert it to the working platform if it is windows + print("Convert the working path specified to Windows format") + self.workflow_dict['working_dir'] = self.workflow_dict['working_dir'].replace("/","\\") + elif ('/' not in self.workflow_dict['working_dir']) and ('\\' in self.workflow_dict['working_dir']): + # in windows format + if platform.system() == "Linux": # convert it to the working platform if it is Linux + print("Convert the working path specified to Linux format") + self.workflow_dict['working_dir'] = self.workflow_dict['working_dir'].replace("\\","/") + + # change the working directory if it exists + if (os.path.exists(self.workflow_dict['working_dir'])) : print("Change the working path to ",self.workflow_dict['working_dir']) os.chdir(self.workflow_dict['working_dir']) else: - logging.error( - "working directory is not valid or the specified workign directory does not exist.") + logging.error("working directory specified does not exist.") + if run_workflow_now: self.run_workflow() diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py new file mode 100644 index 00000000..2322743b --- /dev/null +++ b/tests/api/test_flexible_calling.py @@ -0,0 +1,28 @@ +import unittest,sys + +sys.path.append("./constrain") + +class TestFlexibleCalling(unittest.TestCase): + def test_no_dir_provided(self): + '''This test checks when no working directory is provided, if the + program will behave correctly ''' + + def test_invalid_dir_string(self): + '''This test checks when a invalid dir string is provided, if the + program will behave correctly ''' + + def test_dir_not_exist(self): + '''This test checks when a valid wd is provided but it doesn't exist, if the + program will behave correctly ''' + + def test_valid_dir(self): + '''This test checks when a working directory is provided and it also points to the correct path, if the + program will behave correctly ''' + + """ + 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. + """ + + +if __name__ == "__main__": + unittest.main() From ab4388195e5b0f57a6287ee5d173b9a9bc010ad7 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 13 Mar 2024 13:36:29 -0700 Subject: [PATCH 04/71] add check for working directory format --- constrain/api/workflow.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 570106ef..658a6a92 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -37,7 +37,6 @@ def __init__(self, workflow, run_workflow_now=False): self.states = {} self.workflow_dict = {} self.running_sequence = [] - # checking workflow validity is handed over to the API method. if isinstance(workflow, str): self.load_workflow_json(workflow) @@ -47,19 +46,15 @@ def __init__(self, workflow, run_workflow_now=False): self.load_states() - # change dir: change the working path to the "working_dir" value in workflow_dict + ### change dir: change the working path to the "working_dir" value in workflow_dict # Need test - # To-Do-list - # 1. what if no working dir value is provided? - # 2. Not a valid string: not a valid linux string or windows string - # 3. WD does not exist. - # 4. Run correctly. # First, detect if the working + print("===/n",self.workflow_dict['working_dir'],"===") if (not isinstance(self.workflow_dict['working_dir'], str)): logging.error("working directory specified is not a valid string.") else: - # then detect if the working dir provided is in Linux format or Windows Format. + # Then detect if the working dir provided is in Linux format or Windows Format. if ('/' in self.workflow_dict['working_dir']) and ('\\' not in self.workflow_dict['working_dir']): # in Linux Format if platform.system() == "Windows": # convert it to the working platform if it is windows @@ -337,6 +332,7 @@ def create_workflow_engine( workflow, dict ): workflow_engine = WorkflowEngine(workflow) + else: logging.error( "workflow needs to be either a str path to the workflow json file or a dict of the workflow definition." From 1c68726d56b4b8bc9ad4836f77d9fd7fc0062c38 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 18 Mar 2024 13:40:52 -0700 Subject: [PATCH 05/71] add check for Working path format --- constrain/api/workflow.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 658a6a92..a0fcd3a2 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -49,8 +49,7 @@ def __init__(self, workflow, run_workflow_now=False): ### change dir: change the working path to the "working_dir" value in workflow_dict # Need test - # First, detect if the working - print("===/n",self.workflow_dict['working_dir'],"===") + # First, detect if the working dir is a valid string if (not isinstance(self.workflow_dict['working_dir'], str)): logging.error("working directory specified is not a valid string.") else: From 3fe5757808d202d1147add16de21036d5e03fcf4 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 12:10:59 -0700 Subject: [PATCH 06/71] fix formatting error --- constrain/api/workflow.py | 42 +++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index a0fcd3a2..ad9530c7 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -5,7 +5,7 @@ """ import glob -import sys, logging, json, os, datetime,platform +import sys, logging, json, os, datetime, platform from typing import Union sys.path.append("./constrain") @@ -46,33 +46,42 @@ def __init__(self, workflow, run_workflow_now=False): self.load_states() - ### change dir: change the working path to the "working_dir" value in workflow_dict - # Need test - + # change dir: change the working path to the "working_dir" value in workflow_dict. # First, detect if the working dir is a valid string - if (not isinstance(self.workflow_dict['working_dir'], str)): + if not isinstance(self.workflow_dict["working_dir"], str): logging.error("working directory specified is not a valid string.") else: # Then detect if the working dir provided is in Linux format or Windows Format. - if ('/' in self.workflow_dict['working_dir']) and ('\\' not in self.workflow_dict['working_dir']): + if ("/" in self.workflow_dict["working_dir"]) and ( + "\\" not in self.workflow_dict["working_dir"] + ): # in Linux Format - if platform.system() == "Windows": # convert it to the working platform if it is windows + if ( + platform.system() == "Windows" + ): # convert it to the working platform if it is windows print("Convert the working path specified to Windows format") - self.workflow_dict['working_dir'] = self.workflow_dict['working_dir'].replace("/","\\") - elif ('/' not in self.workflow_dict['working_dir']) and ('\\' in self.workflow_dict['working_dir']): + self.workflow_dict["working_dir"] = self.workflow_dict[ + "working_dir" + ].replace("/","\\") + elif ("/" not in self.workflow_dict["working_dir"]) and ( + "\\" in self.workflow_dict["working_dir"] + ): # in windows format - if platform.system() == "Linux": # convert it to the working platform if it is Linux + if ( + platform.system() == "Linux" + ): # convert it to the working platform if it is Linux print("Convert the working path specified to Linux format") - self.workflow_dict['working_dir'] = self.workflow_dict['working_dir'].replace("\\","/") + self.workflow_dict["working_dir"] = self.workflow_dict[ + "working_dir" + ].replace("\\","/") # change the working directory if it exists - if (os.path.exists(self.workflow_dict['working_dir'])) : - print("Change the working path to ",self.workflow_dict['working_dir']) - os.chdir(self.workflow_dict['working_dir']) + if os.path.exists(self.workflow_dict['working_dir']): + print("Change the working path to ",self.workflow_dict["working_dir"]) + os.chdir(self.workflow_dict["working_dir"]) else: logging.error("working directory specified does not exist.") - - + if run_workflow_now: self.run_workflow() @@ -331,7 +340,6 @@ def create_workflow_engine( workflow, dict ): workflow_engine = WorkflowEngine(workflow) - else: logging.error( "workflow needs to be either a str path to the workflow json file or a dict of the workflow definition." From 4476be75f8a91f8254080a82cc54e747a79692be Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 12:15:07 -0700 Subject: [PATCH 07/71] fix formatting error --- constrain/api/workflow.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index ad9530c7..bd1ce1f9 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -51,37 +51,37 @@ def __init__(self, workflow, run_workflow_now=False): if not isinstance(self.workflow_dict["working_dir"], str): logging.error("working directory specified is not a valid string.") else: - # Then detect if the working dir provided is in Linux format or Windows Format. + # Then detect if the working dir provided is in Linux format or Windows Format. if ("/" in self.workflow_dict["working_dir"]) and ( "\\" not in self.workflow_dict["working_dir"] ): # in Linux Format if ( platform.system() == "Windows" - ): # convert it to the working platform if it is windows + ): # convert it to the working platform if it is windows print("Convert the working path specified to Windows format") self.workflow_dict["working_dir"] = self.workflow_dict[ "working_dir" - ].replace("/","\\") + ].replace("/", "\\") elif ("/" not in self.workflow_dict["working_dir"]) and ( "\\" in self.workflow_dict["working_dir"] ): # in windows format if ( platform.system() == "Linux" - ): # convert it to the working platform if it is Linux + ): # convert it to the working platform if it is Linux print("Convert the working path specified to Linux format") self.workflow_dict["working_dir"] = self.workflow_dict[ "working_dir" - ].replace("\\","/") + ].replace("\\", "/") # change the working directory if it exists - if os.path.exists(self.workflow_dict['working_dir']): - print("Change the working path to ",self.workflow_dict["working_dir"]) + if os.path.exists(self.workflow_dict["working_dir"]): + print("Change the working path to ", self.workflow_dict["working_dir"]) os.chdir(self.workflow_dict["working_dir"]) else: logging.error("working directory specified does not exist.") - + if run_workflow_now: self.run_workflow() From 1f898ee82efeaa626b3bf04feac6985b101bbb87 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 12:34:18 -0700 Subject: [PATCH 08/71] fix formatting error --- constrain/api/workflow.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index bd1ce1f9..737dbc52 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -46,7 +46,7 @@ def __init__(self, workflow, run_workflow_now=False): self.load_states() - # change dir: change the working path to the "working_dir" value in workflow_dict. + # change dir: change the working path to the working_dir value in workflow_dict. # First, detect if the working dir is a valid string if not isinstance(self.workflow_dict["working_dir"], str): logging.error("working directory specified is not a valid string.") @@ -81,7 +81,8 @@ def __init__(self, workflow, run_workflow_now=False): os.chdir(self.workflow_dict["working_dir"]) else: logging.error("working directory specified does not exist.") - + + # run workflow now if run_workflow_now: self.run_workflow() From fdc08058cff19b362afc3b2b3aee2269b48094f1 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 13:19:29 -0700 Subject: [PATCH 09/71] fix formatting error --- constrain/api/workflow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 737dbc52..39ec2319 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -45,8 +45,8 @@ def __init__(self, workflow, run_workflow_now=False): self.workflow_dict = workflow self.load_states() - - # change dir: change the working path to the working_dir value in workflow_dict. + + # Change the working path to the working_dir value in workflow_dict. # First, detect if the working dir is a valid string if not isinstance(self.workflow_dict["working_dir"], str): logging.error("working directory specified is not a valid string.") From 392e8752cb6a5611fbe070f3904c72f773b4c44e Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 13:22:46 -0700 Subject: [PATCH 10/71] fix formatting error --- constrain/api/workflow.py | 4 ++-- tests/api/test_flexible_calling.py | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 39ec2319..4ea7ddf1 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -45,10 +45,10 @@ def __init__(self, workflow, run_workflow_now=False): self.workflow_dict = workflow self.load_states() - + # Change the working path to the working_dir value in workflow_dict. - # First, detect if the working dir is a valid string if not isinstance(self.workflow_dict["working_dir"], str): + # First, detect if the working dir is a valid string logging.error("working directory specified is not a valid string.") else: # Then detect if the working dir provided is in Linux format or Windows Format. diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 2322743b..bd8d6ff9 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -2,22 +2,23 @@ sys.path.append("./constrain") + class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): - '''This test checks when no working directory is provided, if the - program will behave correctly ''' - + """This test checks when no working directory is provided, if the + program will behave correctly""" + def test_invalid_dir_string(self): - '''This test checks when a invalid dir string is provided, if the - program will behave correctly ''' + """This test checks when a invalid dir string is provided, if the + program will behave correctly""" def test_dir_not_exist(self): - '''This test checks when a valid wd is provided but it doesn't exist, if the - program will behave correctly ''' + """This test checks when a valid wd is provided but it doesn't exist, if the + program will behave correctly""" def test_valid_dir(self): - '''This test checks when a working directory is provided and it also points to the correct path, if the - program will behave correctly ''' + """This test checks when a working directory is provided and it also points to the correct path, if the + program will behave correctly""" """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From c71567981bf46992515823b6e3634754d7daab12 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 13:26:25 -0700 Subject: [PATCH 11/71] fix formatting error --- tests/api/test_flexible_calling.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index bd8d6ff9..45af0502 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -1,24 +1,24 @@ -import unittest,sys +import unittest, sys sys.path.append("./constrain") class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): - """This test checks when no working directory is provided, if the - program will behave correctly""" + """This test checks when no working directory is provided, + if the program will behave correctly""" def test_invalid_dir_string(self): - """This test checks when a invalid dir string is provided, if the - program will behave correctly""" + """This test checks when a invalid dir string is provided, + if the program will behave correctly""" def test_dir_not_exist(self): - """This test checks when a valid wd is provided but it doesn't exist, if the - program will behave correctly""" + """This test checks when a valid wd is provided but it doesn't exist, + if the program will behave correctly""" def test_valid_dir(self): - """This test checks when a working directory is provided and it also points to the correct path, if the - program will behave correctly""" + """This test checks when a working directory is provided and it also points to the correct path, + if the program will behave correctly""" """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From 30905afaac3e567409eef4e523d670438a815256 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 20 Mar 2024 13:35:45 -0700 Subject: [PATCH 12/71] fix formatting error --- tests/api/test_flexible_calling.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 45af0502..965e740b 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -5,15 +5,15 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): - """This test checks when no working directory is provided, + """This test checks when no working directory is provided, if the program will behave correctly""" - + def test_invalid_dir_string(self): - """This test checks when a invalid dir string is provided, + """This test checks when a invalid dir string is provided, if the program will behave correctly""" def test_dir_not_exist(self): - """This test checks when a valid wd is provided but it doesn't exist, + """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" def test_valid_dir(self): From 31bf31cedd3ee23f45cd325d0e58d8a0d19c31da Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 22 Mar 2024 01:31:23 -0700 Subject: [PATCH 13/71] add unit test --- constrain/api/workflow.py | 14 +- ...erification_case_unit_test_NotAString.json | 156 ++++++++++++++++++ tests/api/test_flexible_calling.py | 25 ++- 3 files changed, 188 insertions(+), 7 deletions(-) create mode 100644 tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 4ea7ddf1..e73dbdbd 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -49,6 +49,7 @@ def __init__(self, workflow, run_workflow_now=False): # Change the working path to the working_dir value in workflow_dict. if not isinstance(self.workflow_dict["working_dir"], str): # First, detect if the working dir is a valid string + print("working directory specified is not a valid string.") logging.error("working directory specified is not a valid string.") else: # Then detect if the working dir provided is in Linux format or Windows Format. @@ -75,12 +76,12 @@ def __init__(self, workflow, run_workflow_now=False): "working_dir" ].replace("\\", "/") - # change the working directory if it exists - if os.path.exists(self.workflow_dict["working_dir"]): - print("Change the working path to ", self.workflow_dict["working_dir"]) - os.chdir(self.workflow_dict["working_dir"]) - else: - logging.error("working directory specified does not exist.") + # change the working directory if it exists + if os.path.exists(self.workflow_dict["working_dir"]): + print("Change the working path to ", self.workflow_dict["working_dir"]) + os.chdir(self.workflow_dict["working_dir"]) + else: + logging.error("working directory specified does not exist.") # run workflow now if run_workflow_now: @@ -337,6 +338,7 @@ def create_workflow_engine( Returns: Union[None, WorkflowEngine]: Instantiated WorkflowEngine object if provided workflow is valid; None otherwise. """ + if (isinstance(workflow, str) and os.path.isfile(workflow)) or isinstance( workflow, dict ): diff --git a/tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json b/tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json new file mode 100644 index 00000000..27134a60 --- /dev/null +++ b/tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json @@ -0,0 +1,156 @@ +{ + "workflow_name": "G36 Demo workflow", + "working_dir":[], + "meta": { + "author": "ConStrain Team", + "date": "06/29/2023", + "version": "1.0", + "description": "Demo workflow to showcase G36 verification item development" + }, + "imports": [ + "numpy as np", + "pandas as pd" + ], + "states": { + "load data": { + "Type": "MethodCall", + "MethodCall": "DataProcessing", + "Parameters": { + "data_path": "./demo/G36_demo/data/G36_Modelica_Jan.csv", + "data_source": "EnergyPlus" + }, + "Payloads": { + "data_processing_obj": "$", + "data": "$.data" + }, + "Start": "True", + "Next": "load verification cases" + }, + "load verification cases": { + "Type": "MethodCall", + "MethodCall": "VerificationCase", + "Parameters": { + "json_case_path": "./demo/G36_demo/data/G36_library_verification_cases.json" + }, + "Payloads": { + "verification_case_obj": "$", + "original_case_keys": "$.case_suite.keys()" + }, + "Next": "check original case length" + }, + "check original case length": { + "Type": "Choice", + "Choices": [ + { + "Value": "len(Payloads['original_case_keys']) == 3", + "Equals": "True", + "Next": "validate cases" + } + ], + "Default": "Report Error in workflow" + }, + "validate cases": { + "Type": "Choice", + "Choices": [ + { + "Value": "Payloads['verification_case_obj'].validate()", + "Equals": "True", + "Next": "setup verification" + } + ], + "Default": "Report Error in workflow" + }, + "setup verification": { + "Type": "MethodCall", + "MethodCall": "Verification", + "Parameters": { + "verifications": "Payloads['verification_case_obj']" + }, + "Payloads": { + "verification_obj": "$" + }, + "Next": "configure verification runner" + }, + "configure verification runner": { + "Type": "MethodCall", + "MethodCall": "Payloads['verification_obj'].configure", + "Parameters": { + "output_path": "./demo/G36_demo", + "lib_items_path": "./schema/library.json", + "plot_option": "+x None", + "fig_size": "+x (6, 5)", + "num_threads": 1, + "preprocessed_data": "Payloads['data']" + }, + "Payloads": {}, + "Next": "run verification" + }, + "run verification": { + "Type": "MethodCall", + "MethodCall": "Payloads['verification_obj'].run", + "Parameters": {}, + "Payloads": { + "verification_return": "$" + }, + "Next": "check results" + }, + "check results": { + "Type": "MethodCall", + "MethodCall": "glob.glob", + "Parameters": [ + "./demo/G36_demo/*_md.json" + ], + "Payloads": { + "length_of_mdjson": "len($)" + }, + "Next": "check number of result files" + }, + "check number of result files": { + "Type": "Choice", + "Choices": [ + { + "Value": "Payloads['length_of_mdjson']", + "Equals": "3", + "Next": "reporting_object_instantiation" + } + ], + "Default": "Report Error in workflow" + }, + "reporting_object_instantiation": { + "Type": "MethodCall", + "MethodCall": "Reporting", + "Parameters": { + "verification_json": "./demo/G36_demo/*_md.json", + "result_md_name": "report_summary.md", + "report_format": "markdown" + }, + "Payloads": { + "reporting_obj": "$" + }, + "Next": "report_cases" + }, + "report_cases": { + "Type": "MethodCall", + "MethodCall": "Payloads['reporting_obj'].report_multiple_cases", + "Parameters": {}, + "Payloads": {}, + "Next": "Success" + }, + "Success": { + "Type": "MethodCall", + "MethodCall": "print", + "Parameters": [ + "Congratulations! the demo workflow is executed with expected results and no error!" + ], + "End": "True" + }, + "Report Error in workflow": { + "Type": "MethodCall", + "MethodCall": "logging.error", + "Parameters": [ + "Something is wrong in the workflow execution" + ], + "End": "True" + } + } + } \ No newline at end of file diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 965e740b..d0e23afe 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -1,25 +1,48 @@ -import unittest, sys +import unittest, sys, logging +from unittest.mock import patch + +import constrain +from constrain.api import Workflow sys.path.append("./constrain") class TestFlexibleCalling(unittest.TestCase): + def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = ( + "./data/verification_case_unit_test/verification_case_unit_test_NotAString.json" + ) + workflow = Workflow(workflow=json_case_path) + self.assertEqual(logobs.output[0],"ERROR:root:working directory specified is not a valid string.") + + + def test_invalid_dir_string(self): """This test checks when a invalid dir string is provided, if the program will behave correctly""" + a = 1 + self.assertEqual(1,a) + def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" + a = 1 + self.assertEqual(1,a) + def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" + a = 1 + self.assertEqual(1,a) + """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. """ From d44100d02e9eaff9601f9f2f04fd522202509770 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 22 Mar 2024 11:58:34 -0700 Subject: [PATCH 14/71] add unittest if path does not exist --- tests/api/test_flexible_calling.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index d0e23afe..d4bed633 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -12,16 +12,12 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" + with self.assertLogs() as logobs: - json_case_path = ( - "./data/verification_case_unit_test/verification_case_unit_test_NotAString.json" - ) + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_NotAString.json" workflow = Workflow(workflow=json_case_path) self.assertEqual(logobs.output[0],"ERROR:root:working directory specified is not a valid string.") - - - - + def test_invalid_dir_string(self): """This test checks when a invalid dir string is provided, if the program will behave correctly""" @@ -33,8 +29,10 @@ def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" - a = 1 - self.assertEqual(1,a) + with self.assertLogs() as logobs: + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_NotExist.json" + workflow = Workflow(workflow=json_case_path) + self.assertEqual(logobs.output[0],"ERROR:root:working directory specified does not exist.") def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, From b61746f2639b7a86cbaf7feb79049c0d943074ba Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 22 Mar 2024 15:58:33 -0700 Subject: [PATCH 15/71] unittest for flexible calling --- constrain/api/workflow.py | 5 +---- tests/api/test_flexible_calling.py | 14 +++++--------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index e73dbdbd..ffb1e118 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -49,7 +49,6 @@ def __init__(self, workflow, run_workflow_now=False): # Change the working path to the working_dir value in workflow_dict. if not isinstance(self.workflow_dict["working_dir"], str): # First, detect if the working dir is a valid string - print("working directory specified is not a valid string.") logging.error("working directory specified is not a valid string.") else: # Then detect if the working dir provided is in Linux format or Windows Format. @@ -60,7 +59,6 @@ def __init__(self, workflow, run_workflow_now=False): if ( platform.system() == "Windows" ): # convert it to the working platform if it is windows - print("Convert the working path specified to Windows format") self.workflow_dict["working_dir"] = self.workflow_dict[ "working_dir" ].replace("/", "\\") @@ -71,15 +69,14 @@ def __init__(self, workflow, run_workflow_now=False): if ( platform.system() == "Linux" ): # convert it to the working platform if it is Linux - print("Convert the working path specified to Linux format") self.workflow_dict["working_dir"] = self.workflow_dict[ "working_dir" ].replace("\\", "/") # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): - print("Change the working path to ", self.workflow_dict["working_dir"]) os.chdir(self.workflow_dict["working_dir"]) + logging.info("Change current working path to the specified path.") else: logging.error("working directory specified does not exist.") diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index d4bed633..c241b1a3 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -18,13 +18,6 @@ def test_no_dir_provided(self): workflow = Workflow(workflow=json_case_path) self.assertEqual(logobs.output[0],"ERROR:root:working directory specified is not a valid string.") - def test_invalid_dir_string(self): - """This test checks when a invalid dir string is provided, - if the program will behave correctly""" - - a = 1 - self.assertEqual(1,a) - def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" @@ -38,8 +31,11 @@ def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" - a = 1 - self.assertEqual(1,a) + with self.assertLogs() as logobs: + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + workflow = Workflow(workflow=json_case_path) + self.assertEqual(logobs.output[0],"INFO:root:Change current working path to the specified path.") + """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From bdd6f6a7e564903471fc5e583938c328c253aebd Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 22 Mar 2024 16:06:24 -0700 Subject: [PATCH 16/71] fix formatting error --- tests/api/test_flexible_calling.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index c241b1a3..203e8076 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -8,24 +8,29 @@ class TestFlexibleCalling(unittest.TestCase): - def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" - + with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_NotAString.json" - workflow = Workflow(workflow=json_case_path) - self.assertEqual(logobs.output[0],"ERROR:root:working directory specified is not a valid string.") - + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "ERROR:root:working directory specified is not a valid string.", + ) + def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_NotExist.json" - workflow = Workflow(workflow=json_case_path) - self.assertEqual(logobs.output[0],"ERROR:root:working directory specified does not exist.") + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "ERROR:root:working directory specified does not exist.", + ) def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, @@ -33,9 +38,11 @@ def test_valid_dir(self): with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" - workflow = Workflow(workflow=json_case_path) - self.assertEqual(logobs.output[0],"INFO:root:Change current working path to the specified path.") - + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From c3545ed2f2c304c69fff0e320f082c5104c9ef90 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Sun, 24 Mar 2024 21:55:29 -0700 Subject: [PATCH 17/71] Update unittest for flexible calling --- constrain/api/workflow.py | 67 ++++++++------- tests/api/test_flexible_calling.py | 126 +++++++++++++++++++++++++++-- 2 files changed, 157 insertions(+), 36 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index ffb1e118..7c52e8e1 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -46,39 +46,44 @@ def __init__(self, workflow, run_workflow_now=False): self.load_states() - # Change the working path to the working_dir value in workflow_dict. - if not isinstance(self.workflow_dict["working_dir"], str): - # First, detect if the working dir is a valid string - logging.error("working directory specified is not a valid string.") + # First, check if the workflow_dict has "working_dir" + if "working_dir" not in self.workflow_dict: + logging.info("No working_dic is specified") else: - # Then detect if the working dir provided is in Linux format or Windows Format. - if ("/" in self.workflow_dict["working_dir"]) and ( - "\\" not in self.workflow_dict["working_dir"] - ): - # in Linux Format - if ( - platform.system() == "Windows" - ): # convert it to the working platform if it is windows - self.workflow_dict["working_dir"] = self.workflow_dict[ - "working_dir" - ].replace("/", "\\") - elif ("/" not in self.workflow_dict["working_dir"]) and ( - "\\" in self.workflow_dict["working_dir"] - ): - # in windows format - if ( - platform.system() == "Linux" - ): # convert it to the working platform if it is Linux - self.workflow_dict["working_dir"] = self.workflow_dict[ - "working_dir" - ].replace("\\", "/") - - # change the working directory if it exists - if os.path.exists(self.workflow_dict["working_dir"]): - os.chdir(self.workflow_dict["working_dir"]) - logging.info("Change current working path to the specified path.") + # Change the working path to the working_dir value in workflow_dict. + if not isinstance(self.workflow_dict["working_dir"], str): + # First, detect if the working dir is a valid string + logging.error("working directory specified is not a valid string.") else: - logging.error("working directory specified does not exist.") + # Then detect if the working dir provided is in Linux format or Windows Format. + if ("/" in self.workflow_dict["working_dir"]) and ( + "\\" not in self.workflow_dict["working_dir"] + ): + # in Linux Format + if ( + platform.system() == "Windows" + ): # convert it to the working platform if it is windows + self.workflow_dict["working_dir"] = self.workflow_dict[ + "working_dir" + ].replace("/", "\\") + logging.info("the working dir provided is in Linux format.") + elif ("/" not in self.workflow_dict["working_dir"]) and ( + "\\" in self.workflow_dict["working_dir"] + ): + # in windows format + if ( + platform.system() == "Linux" + ): # convert it to the working platform if it is Linux + self.workflow_dict["working_dir"] = self.workflow_dict[ + "working_dir" + ].replace("\\", "/") + logging.info("the working dir provided is in Win format.") + # change the working directory if it exists + if os.path.exists(self.workflow_dict["working_dir"]): + os.chdir(self.workflow_dict["working_dir"]) + logging.info("Change current working path to the specified path.") + else: + logging.error("working directory specified does not exist.") # run workflow now if run_workflow_now: diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 203e8076..42e4301d 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -1,4 +1,4 @@ -import unittest, sys, logging +import unittest, sys, logging, json, os from unittest.mock import patch import constrain @@ -13,22 +13,107 @@ def test_no_dir_provided(self): if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_NotAString.json" + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" + + # Delete working_dir value in the json file + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + del workflow_dict["working_dir"] + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "INFO:root:No working_dic is specified", + ) + + def test_invalid_str(self): + """This test checks when working directory is not a valid string, + if the program will behave correctly""" + + with self.assertLogs() as logobs: + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a invalid string + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = [] + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + workflow = Workflow(workflow=json_case_path) self.assertEqual( logobs.output[0], "ERROR:root:working directory specified is not a valid string.", ) + def test_Linux_path(self): + """This test check if the program can detect the working path provided is in Linux format.""" + + with self.assertLogs() as logobs: + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + + # Change working_dir value in the json file to a valid path in Linux format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("..") + + self.assertEqual( + logobs.output[0], + "INFO:root:the working dir provided is in Linux format.", + ) + + def test_Win_path(self): + """This test check if the program can detect the working path provided is in WIN format.""" + + with self.assertLogs() as logobs: + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("..") + + self.assertEqual( + logobs.output[0], + "INFO:root:the working dir provided is in Win format.", + ) + def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_NotExist.json" + json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a path that does not exist + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./not_existing_path/test" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + workflow = Workflow(workflow=json_case_path) self.assertEqual( - logobs.output[0], + logobs.output[1], "ERROR:root:working directory specified does not exist.", ) @@ -38,9 +123,40 @@ def test_valid_dir(self): with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("..") + self.assertEqual( - logobs.output[0], + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) + + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("..") + + self.assertEqual( + logobs.output[1], "INFO:root:Change current working path to the specified path.", ) From fc94687e2a48e17f9dfdc44db22cd1e296603e5e Mon Sep 17 00:00:00 2001 From: FanFeng Date: Sun, 24 Mar 2024 22:44:31 -0700 Subject: [PATCH 18/71] add a minimal case for unit test --- .../verification_case_unit_test_Path.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json diff --git a/tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json b/tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json new file mode 100644 index 00000000..a503feec --- /dev/null +++ b/tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json @@ -0,0 +1 @@ +{"workflow_name": "A minimal case", "meta": {"author": "ConStrain Team", "date": "03/23/2024", "version": "1.0", "description": "A minimal case to test if flexible call feature works"}, "imports": [], "states": {}} \ No newline at end of file From 3d9676897828f678fd33702027dd483830cda12b Mon Sep 17 00:00:00 2001 From: FanFeng Date: Sun, 24 Mar 2024 23:27:48 -0700 Subject: [PATCH 19/71] fix unit test --- tests/api/test_flexible_calling.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 42e4301d..85ef56e7 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -11,10 +11,10 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" - + print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" - + # Delete working_dir value in the json file with open(json_case_path, "r") as f: workflow_dict = json.load(f) @@ -32,7 +32,7 @@ def test_no_dir_provided(self): def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" - + print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -52,10 +52,10 @@ def test_invalid_str(self): def test_Linux_path(self): """This test check if the program can detect the working path provided is in Linux format.""" - + print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" - + # Change working_dir value in the json file to a valid path in Linux format with open(json_case_path, "r") as f: workflow_dict = json.load(f) @@ -75,7 +75,7 @@ def test_Linux_path(self): def test_Win_path(self): """This test check if the program can detect the working path provided is in WIN format.""" - + print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" @@ -99,7 +99,7 @@ def test_Win_path(self): def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" - + print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -120,7 +120,7 @@ def test_dir_not_exist(self): def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" - + print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" From 823bcde8003fe8f19e4530cb0c7210a265fe1cf5 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Sun, 24 Mar 2024 23:30:50 -0700 Subject: [PATCH 20/71] fix unit test --- tests/api/test_flexible_calling.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 85ef56e7..d75d8f6a 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -14,7 +14,7 @@ def test_no_dir_provided(self): print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" - + # Delete working_dir value in the json file with open(json_case_path, "r") as f: workflow_dict = json.load(f) @@ -55,7 +55,7 @@ def test_Linux_path(self): print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" - + # Change working_dir value in the json file to a valid path in Linux format with open(json_case_path, "r") as f: workflow_dict = json.load(f) From 5c9568c18f3d8dc4de40558d2c6d6852c6e5e314 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Sun, 24 Mar 2024 23:57:53 -0700 Subject: [PATCH 21/71] Fix unitttest --- tests/api/test_flexible_calling.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index d75d8f6a..b101d3a9 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -13,7 +13,7 @@ def test_no_dir_provided(self): if the program will behave correctly""" print(os.getcwd()) with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Delete working_dir value in the json file with open(json_case_path, "r") as f: @@ -34,7 +34,7 @@ def test_invalid_str(self): if the program will behave correctly""" print(os.getcwd()) with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a invalid string with open(json_case_path, "r") as f: @@ -54,7 +54,7 @@ def test_Linux_path(self): """This test check if the program can detect the working path provided is in Linux format.""" print(os.getcwd()) with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path in Linux format with open(json_case_path, "r") as f: @@ -77,7 +77,7 @@ def test_Win_path(self): """This test check if the program can detect the working path provided is in WIN format.""" print(os.getcwd()) with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: @@ -101,7 +101,7 @@ def test_dir_not_exist(self): if the program will behave correctly""" print(os.getcwd()) with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: @@ -122,7 +122,7 @@ def test_valid_dir(self): if the program will behave correctly""" print(os.getcwd()) with self.assertLogs() as logobs: - json_case_path = "./data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: From 702c6238251b8a7806ec411fecb109cf14d6228b Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 00:03:14 -0700 Subject: [PATCH 22/71] fix unittest --- tests/api/test_flexible_calling.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b101d3a9..792ee217 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -11,7 +11,6 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" - print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -32,7 +31,6 @@ def test_no_dir_provided(self): def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" - print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -52,14 +50,13 @@ def test_invalid_str(self): def test_Linux_path(self): """This test check if the program can detect the working path provided is in Linux format.""" - print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path in Linux format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./result" + workflow_dict["working_dir"] = "./tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -75,14 +72,13 @@ def test_Linux_path(self): def test_Win_path(self): """This test check if the program can detect the working path provided is in WIN format.""" - print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\result" + workflow_dict["working_dir"] = ".\\tests\\api\\result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -99,7 +95,6 @@ def test_Win_path(self): def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" - print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -120,14 +115,13 @@ def test_dir_not_exist(self): def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" - print(os.getcwd()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./result" + workflow_dict["working_dir"] = "./tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -145,7 +139,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\result" + workflow_dict["working_dir"] = ".\\testsi\\result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From 321e939fd44b5d0c4de2259e46c4fa9e67f533a8 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 00:09:30 -0700 Subject: [PATCH 23/71] fix unittest --- tests/api/test_flexible_calling.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 792ee217..6da4e703 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -63,7 +63,7 @@ def test_Linux_path(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("..") + os.chdir("../../..") self.assertEqual( logobs.output[0], @@ -85,7 +85,7 @@ def test_Win_path(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("..") + os.chdir("../../..") self.assertEqual( logobs.output[0], @@ -129,7 +129,7 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("..") + os.chdir("../../..") self.assertEqual( logobs.output[1], @@ -139,7 +139,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\testsi\\result" + workflow_dict["working_dir"] = ".\\tests\\api\\result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -147,7 +147,7 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("..") + os.chdir("../../..") self.assertEqual( logobs.output[1], From 0c4bc3cf8edcd6b915cc45b106716e08c7383276 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 01:00:30 -0700 Subject: [PATCH 24/71] test unittest --- ...erification_case_unit_test_NotAString.json | 156 ------------------ tests/api/test_flexible_calling.py | 83 ---------- 2 files changed, 239 deletions(-) delete mode 100644 tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json diff --git a/tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json b/tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json deleted file mode 100644 index 27134a60..00000000 --- a/tests/api/data/verification_case_unit_test/verification_case_unit_test_NotAString.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "workflow_name": "G36 Demo workflow", - "working_dir":[], - "meta": { - "author": "ConStrain Team", - "date": "06/29/2023", - "version": "1.0", - "description": "Demo workflow to showcase G36 verification item development" - }, - "imports": [ - "numpy as np", - "pandas as pd" - ], - "states": { - "load data": { - "Type": "MethodCall", - "MethodCall": "DataProcessing", - "Parameters": { - "data_path": "./demo/G36_demo/data/G36_Modelica_Jan.csv", - "data_source": "EnergyPlus" - }, - "Payloads": { - "data_processing_obj": "$", - "data": "$.data" - }, - "Start": "True", - "Next": "load verification cases" - }, - "load verification cases": { - "Type": "MethodCall", - "MethodCall": "VerificationCase", - "Parameters": { - "json_case_path": "./demo/G36_demo/data/G36_library_verification_cases.json" - }, - "Payloads": { - "verification_case_obj": "$", - "original_case_keys": "$.case_suite.keys()" - }, - "Next": "check original case length" - }, - "check original case length": { - "Type": "Choice", - "Choices": [ - { - "Value": "len(Payloads['original_case_keys']) == 3", - "Equals": "True", - "Next": "validate cases" - } - ], - "Default": "Report Error in workflow" - }, - "validate cases": { - "Type": "Choice", - "Choices": [ - { - "Value": "Payloads['verification_case_obj'].validate()", - "Equals": "True", - "Next": "setup verification" - } - ], - "Default": "Report Error in workflow" - }, - "setup verification": { - "Type": "MethodCall", - "MethodCall": "Verification", - "Parameters": { - "verifications": "Payloads['verification_case_obj']" - }, - "Payloads": { - "verification_obj": "$" - }, - "Next": "configure verification runner" - }, - "configure verification runner": { - "Type": "MethodCall", - "MethodCall": "Payloads['verification_obj'].configure", - "Parameters": { - "output_path": "./demo/G36_demo", - "lib_items_path": "./schema/library.json", - "plot_option": "+x None", - "fig_size": "+x (6, 5)", - "num_threads": 1, - "preprocessed_data": "Payloads['data']" - }, - "Payloads": {}, - "Next": "run verification" - }, - "run verification": { - "Type": "MethodCall", - "MethodCall": "Payloads['verification_obj'].run", - "Parameters": {}, - "Payloads": { - "verification_return": "$" - }, - "Next": "check results" - }, - "check results": { - "Type": "MethodCall", - "MethodCall": "glob.glob", - "Parameters": [ - "./demo/G36_demo/*_md.json" - ], - "Payloads": { - "length_of_mdjson": "len($)" - }, - "Next": "check number of result files" - }, - "check number of result files": { - "Type": "Choice", - "Choices": [ - { - "Value": "Payloads['length_of_mdjson']", - "Equals": "3", - "Next": "reporting_object_instantiation" - } - ], - "Default": "Report Error in workflow" - }, - "reporting_object_instantiation": { - "Type": "MethodCall", - "MethodCall": "Reporting", - "Parameters": { - "verification_json": "./demo/G36_demo/*_md.json", - "result_md_name": "report_summary.md", - "report_format": "markdown" - }, - "Payloads": { - "reporting_obj": "$" - }, - "Next": "report_cases" - }, - "report_cases": { - "Type": "MethodCall", - "MethodCall": "Payloads['reporting_obj'].report_multiple_cases", - "Parameters": {}, - "Payloads": {}, - "Next": "Success" - }, - "Success": { - "Type": "MethodCall", - "MethodCall": "print", - "Parameters": [ - "Congratulations! the demo workflow is executed with expected results and no error!" - ], - "End": "True" - }, - "Report Error in workflow": { - "Type": "MethodCall", - "MethodCall": "logging.error", - "Parameters": [ - "Something is wrong in the workflow execution" - ], - "End": "True" - } - } - } \ No newline at end of file diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 6da4e703..4982f30e 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -48,49 +48,7 @@ def test_invalid_str(self): "ERROR:root:working directory specified is not a valid string.", ) - def test_Linux_path(self): - """This test check if the program can detect the working path provided is in Linux format.""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" - - # Change working_dir value in the json file to a valid path in Linux format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:the working dir provided is in Linux format.", - ) - - def test_Win_path(self): - """This test check if the program can detect the working path provided is in WIN format.""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" - - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:the working dir provided is in Win format.", - ) def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, @@ -112,47 +70,6 @@ def test_dir_not_exist(self): "ERROR:root:working directory specified does not exist.", ) - def test_valid_dir(self): - """This test checks when a working directory is provided and it also points to the correct path, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" - - # Change working_dir value in the json file to a valid path - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[1], - "INFO:root:Change current working path to the specified path.", - ) - - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[1], - "INFO:root:Change current working path to the specified path.", - ) """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From 74bcf94f2d60b8ccc9b4a034a653bb42dd0ff20c Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 01:10:15 -0700 Subject: [PATCH 25/71] Test for unit test 1 --- tests/api/test_flexible_calling.py | 43 ++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 4982f30e..b013db59 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -48,8 +48,6 @@ def test_invalid_str(self): "ERROR:root:working directory specified is not a valid string.", ) - - def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" @@ -70,6 +68,47 @@ def test_dir_not_exist(self): "ERROR:root:working directory specified does not exist.", ) + def test_valid_dir(self): + """This test checks when a working directory is provided and it also points to the correct path, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./tests/api/result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) + + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From cc7e1b40afb95a346ecf5f900d5d58940becc1d1 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 01:26:25 -0700 Subject: [PATCH 26/71] Fix unittest --- tests/api/test_flexible_calling.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b013db59..9750b704 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -92,23 +92,7 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[1], - "INFO:root:Change current working path to the specified path.", - ) """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. From 600cdf35b3eaaf4d91ced8d1adccd3f75f903093 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 01:37:54 -0700 Subject: [PATCH 27/71] Fix unittest --- tests/api/test_flexible_calling.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 9750b704..c89c11f3 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -92,6 +92,25 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) + with self.assertLogs() as logobs: + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # Change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) + """ From 84fb6bdb537b2eb4d096b32f49bb8b6b8a68e630 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 13:46:39 -0700 Subject: [PATCH 28/71] Fix unit test --- tests/api/test_flexible_calling.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index c89c11f3..cf0c77ab 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -12,7 +12,7 @@ def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Delete working_dir value in the json file with open(json_case_path, "r") as f: @@ -32,7 +32,7 @@ def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a invalid string with open(json_case_path, "r") as f: @@ -52,7 +52,7 @@ def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: @@ -72,12 +72,12 @@ def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result" + workflow_dict["working_dir"] = "../tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -85,7 +85,7 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("../../..") + os.chdir("../../../constrain") self.assertEqual( logobs.output[1], @@ -96,7 +96,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" + workflow_dict["working_dir"] = "..\\tests\\api\\result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -104,7 +104,7 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # Change current working directory back - os.chdir("../../..") + os.chdir("../../../constrain") self.assertEqual( logobs.output[1], From 0b139bbca846ae84bb22a7af56fe84a5e9e67cab Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 15:34:24 -0700 Subject: [PATCH 29/71] Test1 --- tests/api/test_flexible_calling.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index cf0c77ab..4aaeb120 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -11,6 +11,7 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" + print(os.getcwd()) # os.getcwd() with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -31,6 +32,7 @@ def test_no_dir_provided(self): def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" + print(os.getcwd()) # os.getcwd() with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -51,6 +53,7 @@ def test_invalid_str(self): def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" + print(os.getcwd()) # os.getcwd() with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -71,8 +74,9 @@ def test_dir_not_exist(self): def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" + print(os.getcwd()) # os.getcwd() with self.assertLogs() as logobs: - json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: From 0726e4fa73e834921d676cf554938707d2e02b64 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 15:40:59 -0700 Subject: [PATCH 30/71] Test1 --- tests/api/test_flexible_calling.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 4aaeb120..825973ed 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -11,7 +11,8 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" - print(os.getcwd()) # os.getcwd() + print("---Debug---",os.getcwd()) # os.getcwd() + print("---Debug---",os.listdir()) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -33,6 +34,7 @@ def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() + print("---Debug---",os.listdir()) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -54,6 +56,7 @@ def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() + print("---Debug---",os.listdir()) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -75,6 +78,7 @@ def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() + print("---Debug---",os.listdir()) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" From 79df117373479f6b82884589738c4cba833ec86c Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 15:48:47 -0700 Subject: [PATCH 31/71] Fix unittest --- tests/api/test_flexible_calling.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 825973ed..b335d535 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -12,7 +12,7 @@ def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" print("---Debug---",os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir()) + print("---Debug---",os.listdir("./tests/api/data")) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -34,7 +34,7 @@ def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir()) + print("---Debug---",os.listdir("./tests/api/data")) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -56,7 +56,7 @@ def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir()) + print("---Debug---",os.listdir("./tests/api/data")) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -78,7 +78,7 @@ def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir()) + print("---Debug---",os.listdir("./tests/api/data")) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" From 95ffdffb951d984750303bbee099823be9230b4c Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 15:58:22 -0700 Subject: [PATCH 32/71] Unit test 1 --- tests/api/test_flexible_calling.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b335d535..d2241cac 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -12,7 +12,7 @@ def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" print("---Debug---",os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data")) + print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -34,7 +34,7 @@ def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data")) + print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -56,7 +56,7 @@ def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data")) + print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -78,7 +78,7 @@ def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data")) + print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" From ca55f316f51a53b67d67772255013df8dab6d93d Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 16:04:30 -0700 Subject: [PATCH 33/71] Fix unittest --- tests/api/test_flexible_calling.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index d2241cac..04eb3d93 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -14,7 +14,7 @@ def test_no_dir_provided(self): print("---Debug---",os.getcwd()) # os.getcwd() print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: - json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Delete working_dir value in the json file with open(json_case_path, "r") as f: @@ -36,7 +36,7 @@ def test_invalid_str(self): print(os.getcwd()) # os.getcwd() print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: - json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a invalid string with open(json_case_path, "r") as f: @@ -58,7 +58,7 @@ def test_dir_not_exist(self): print(os.getcwd()) # os.getcwd() print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: - json_case_path = "../tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: @@ -85,7 +85,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "../tests/api/result" + workflow_dict["working_dir"] = "./tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -93,7 +93,7 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("../../../constrain") + os.chdir("../../..") self.assertEqual( logobs.output[1], @@ -104,7 +104,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "..\\tests\\api\\result" + workflow_dict["working_dir"] = ".\\tests\\api\\result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -112,7 +112,7 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # Change current working directory back - os.chdir("../../../constrain") + os.chdir("../../..") self.assertEqual( logobs.output[1], From 1dc278ee271b4801947f551e05e5d1b6c6fdfe4b Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 16:15:54 -0700 Subject: [PATCH 34/71] Unit test 1 --- tests/api/test_flexible_calling.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 04eb3d93..9df8c2e8 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -11,8 +11,6 @@ class TestFlexibleCalling(unittest.TestCase): def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" - print("---Debug---",os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -33,8 +31,6 @@ def test_no_dir_provided(self): def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" - print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -55,8 +51,6 @@ def test_invalid_str(self): def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" - print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" @@ -77,10 +71,8 @@ def test_dir_not_exist(self): def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" - print(os.getcwd()) # os.getcwd() - print("---Debug---",os.listdir("./tests/api/data/verification_case_unit_test")) with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_ValidPath.json" + json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: From 60aa878605fd98caec4bd71297e96588db575816 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 16:26:18 -0700 Subject: [PATCH 35/71] Move flexible calling to a new folder --- .../verification_case_unit_test_Path.json | 11 +++++++++++ .../verification_case_unit_test_Path.json | 1 - tests/api/test_flexible_calling.py | 8 ++++---- 3 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json delete mode 100644 tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json diff --git a/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json b/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json new file mode 100644 index 00000000..9a0765dd --- /dev/null +++ b/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json @@ -0,0 +1,11 @@ +{ + "workflow_name": "A minimal case", + "meta": { + "author": "ConStrain Team", + "date": "03/23/2024", + "version": "1.0", + "description": "A minimal case to test if flexible call feature works" + }, + "imports": [], + "states": {} +} \ No newline at end of file diff --git a/tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json b/tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json deleted file mode 100644 index a503feec..00000000 --- a/tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json +++ /dev/null @@ -1 +0,0 @@ -{"workflow_name": "A minimal case", "meta": {"author": "ConStrain Team", "date": "03/23/2024", "version": "1.0", "description": "A minimal case to test if flexible call feature works"}, "imports": [], "states": {}} \ No newline at end of file diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 9df8c2e8..09775f54 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -12,7 +12,7 @@ def test_no_dir_provided(self): """This test checks when no working directory is provided, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" # Delete working_dir value in the json file with open(json_case_path, "r") as f: @@ -32,7 +32,7 @@ def test_invalid_str(self): """This test checks when working directory is not a valid string, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a invalid string with open(json_case_path, "r") as f: @@ -52,7 +52,7 @@ def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: @@ -72,7 +72,7 @@ def test_valid_dir(self): """This test checks when a working directory is provided and it also points to the correct path, if the program will behave correctly""" with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/verification_case_unit_test/verification_case_unit_test_Path.json" + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: From 6d2dec066149318d44a0e8904fae8a9d6acecffb Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 25 Mar 2024 16:40:42 -0700 Subject: [PATCH 36/71] Update unittest for flexible calling --- tests/api/test_flexible_calling.py | 46 ++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 09775f54..e69b0813 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -48,6 +48,50 @@ def test_invalid_str(self): "ERROR:root:working directory specified is not a valid string.", ) + def test_Linux_path(self): + """This test check if the program can detect the working path provided is in Linux format.""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path in Linux format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./tests/api/result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:the working dir provided is in Linux format.", + ) + + def test_Win_path(self): + """This test check if the program can detect the working path provided is in WIN format.""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:the working dir provided is in Win format.", + ) + def test_dir_not_exist(self): """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" @@ -111,8 +155,6 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) - - """ 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. """ From 7ed2796ac0faf21b4965e55d60a0e8032821b036 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Tue, 16 Apr 2024 10:55:29 -0700 Subject: [PATCH 37/71] clean redundant comments --- tests/api/test_flexible_calling.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index e69b0813..2e27c888 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -155,10 +155,5 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) - """ - 1. Probably another test is needed to check if the program can successfully detect if the WD provided is Linux format or Window format. - """ - - if __name__ == "__main__": unittest.main() From 1ac2802cd0c3695eade4a869f089899f01f39f6a Mon Sep 17 00:00:00 2001 From: FanFeng Date: Tue, 16 Apr 2024 10:59:44 -0700 Subject: [PATCH 38/71] clean redundant comments --- tests/api/test_flexible_calling.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 2e27c888..b06f2495 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -155,5 +155,6 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) + if __name__ == "__main__": unittest.main() From 273bb0f019f3c9088fc8e497786894d20dbf15a9 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 8 May 2024 03:33:39 -0700 Subject: [PATCH 39/71] create json schemas for library and verification case --- schema/library_schema.json | 11124 ++++++++++++++++ ...new_library_verification_cases_schema.json | 3604 +++++ 2 files changed, 14728 insertions(+) create mode 100644 schema/library_schema.json create mode 100644 schema/new_library_verification_cases_schema.json diff --git a/schema/library_schema.json b/schema/library_schema.json new file mode 100644 index 00000000..b2fb36c0 --- /dev/null +++ b/schema/library_schema.json @@ -0,0 +1,11124 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "http://example.com/example.json", + "description": "Placeholder", + "type": "object", + "default": {}, + "required": [], + "properties": { + "SupplyAirTempReset": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 1 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling supply air temperature reset scale (25%)" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Multiple zone HVAC systems must include controls that automatically reset the supply air temperature in response to representative building loads, or to outdoor air temperature. The controls shall reset the supply air temperature at least 25% of the difference between the design supply air temperature and the design room air temperature. Controls that adjust the reset based on zone humidity are allowed. Zones that are expected to experience relatively constant loads, such as electronic equipment rooms, shall be designed for the fully reset supply temperature." + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.3.5 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.3.5 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_sa_set", + "T_z_coo" + ], + "properties": { + "T_sa_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU supply air temperature setpoint" + ] + }, + "T_z_coo": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Design zone cooling air temperature" + ] + } + }, + "examples": [{ + "T_sa_set": "AHU supply air temperature setpoint", + "T_z_coo": "Design zone cooling air temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Max(T_sa_set) - Min(T_sa_set) \u003e= (T_z_coo - Min(T_sa_set)) * 0.25" + ] + }, + "examples": [ + [ + "Max(T_sa_set) - Min(T_sa_set) \u003e= (T_z_coo - Min(T_sa_set)) * 0.25"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 1, + "description_brief": "Cooling supply air temperature reset scale (25%)", + "description_detail": "Multiple zone HVAC systems must include controls that automatically reset the supply air temperature in response to representative building loads, or to outdoor air temperature. The controls shall reset the supply air temperature at least 25% of the difference between the design supply air temperature and the design room air temperature. Controls that adjust the reset based on zone humidity are allowed. Zones that are expected to experience relatively constant loads, such as electronic equipment rooms, shall be designed for the fully reset supply temperature.", + "description_index": [ + "Section 6.5.3.5 in 90.1-2016" + ], + "description_datapoints": { + "T_sa_set": "AHU supply air temperature setpoint", + "T_z_coo": "Design zone cooling air temperature" + }, + "description_assertions": [ + "Max(T_sa_set) - Min(T_sa_set) \u003e= (T_z_coo - Min(T_sa_set)) * 0.25" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "EconomizerHighLimitA": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 2 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Fixed dry bulb economizer high limit" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Economizer needs to be OFF when High-Limit Condition was satisfied. Y_e_HL =f($Climate Zone, $Toa, $Tra, $hoa, $hra)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Table 6.5.1.1.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Table 6.5.1.1.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_oa_db", + "oa_threshold", + "oa_min_flow", + "oa_flow" + ], + "properties": { + "T_oa_db": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb temperature" + ] + }, + "oa_threshold": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb threshold" + ] + }, + "oa_min_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA minimum airflow setpoint" + ] + }, + "oa_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA airflow" + ] + } + }, + "examples": [{ + "T_oa_db": "OA dry bulb temperature", + "oa_threshold": "OA dry bulb threshold", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(oa_flow \u003e oa_min_flow) AND (T_oa_db \u003e oa_threshold)" + ] + }, + "examples": [ + [ + "(oa_flow \u003e oa_min_flow) AND (T_oa_db \u003e oa_threshold)"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "fail" + ] + } + }, + "examples": [{ + "library_item_id": 2, + "description_brief": "Fixed dry bulb economizer high limit", + "description_detail": "Economizer needs to be OFF when High-Limit Condition was satisfied. Y_e_HL =f($Climate Zone, $Toa, $Tra, $hoa, $hra)", + "description_index": [ + "Table 6.5.1.1.3 in 90.1-2016" + ], + "description_datapoints": { + "T_oa_db": "OA dry bulb temperature", + "oa_threshold": "OA dry bulb threshold", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow" + }, + "description_assertions": [ + "(oa_flow \u003e oa_min_flow) AND (T_oa_db \u003e oa_threshold)" + ], + "description_verification_type": "rule-based", + "assertions_type": "fail" + }] + }, + "EconomizerHighLimitB": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 3 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Differential dry bulb economizer high limit" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Check the 90.1-2016 table" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Table 6.5.1.1.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Table 6.5.1.1.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_oa_db", + "ret_a_temp", + "oa_min_flow", + "oa_flow" + ], + "properties": { + "T_oa_db": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb temperature" + ] + }, + "ret_a_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Retuan air temperature" + ] + }, + "oa_min_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA minimum airflow setpoint" + ] + }, + "oa_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA airflow" + ] + } + }, + "examples": [{ + "T_oa_db": "OA dry bulb temperature", + "ret_a_temp": "Retuan air temperature", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(oa_flow \u003e oa_min_flow) AND (ret_a_temp \u003c T_oa_db)" + ] + }, + "examples": [ + [ + "(oa_flow \u003e oa_min_flow) AND (ret_a_temp \u003c T_oa_db)"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "fail" + ] + } + }, + "examples": [{ + "library_item_id": 3, + "description_brief": "Differential dry bulb economizer high limit", + "description_detail": "Check the 90.1-2016 table", + "description_index": [ + "Table 6.5.1.1.3 in 90.1-2016" + ], + "description_datapoints": { + "T_oa_db": "OA dry bulb temperature", + "ret_a_temp": "Retuan air temperature", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow" + }, + "description_assertions": [ + "(oa_flow \u003e oa_min_flow) AND (ret_a_temp \u003c T_oa_db)" + ], + "description_verification_type": "rule-based", + "assertions_type": "fail" + }] + }, + "EconomizerHighLimitC": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [4] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Fixed enthalpy + fixed dry bulb economizer high limit" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "N/A" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Table 6.5.1.1.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Table 6.5.1.1.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_oa_db", + "oa_threshold", + "oa_min_flow", + "oa_flow", + "oa_enth", + "oa_enth_threshold" + ], + "properties": { + "T_oa_db": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb temperature" + ] + }, + "oa_threshold": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb threshold" + ] + }, + "oa_min_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA minimum airflow setpoint" + ] + }, + "oa_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA airflow" + ] + }, + "oa_enth": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA enthalpy" + ] + }, + "oa_enth_threshold": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA enthalpy threshold" + ] + } + }, + "examples": [{ + "T_oa_db": "OA dry bulb temperature", + "oa_threshold": "OA dry bulb threshold", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow", + "oa_enth": "OA enthalpy", + "oa_enth_threshold": "OA enthalpy threshold" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(oa_flow \u003e oa_min_flow) AND ((T_oa_db \u003e oa_threshold) OR (oa_enth \u003e oa_enth_threshold))" + ] + }, + "examples": [ + [ + "(oa_flow \u003e oa_min_flow) AND ((T_oa_db \u003e oa_threshold) OR (oa_enth \u003e oa_enth_threshold))"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "fail" + ] + } + }, + "examples": [{ + "library_item_id": 4, + "description_brief": "Fixed enthalpy + fixed dry bulb economizer high limit", + "description_detail": "N/A", + "description_index": [ + "Table 6.5.1.1.3 in 90.1-2016" + ], + "description_datapoints": { + "T_oa_db": "OA dry bulb temperature", + "oa_threshold": "OA dry bulb threshold", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow", + "oa_enth": "OA enthalpy", + "oa_enth_threshold": "OA enthalpy threshold" + }, + "description_assertions": [ + "(oa_flow \u003e oa_min_flow) AND ((T_oa_db \u003e oa_threshold) OR (oa_enth \u003e oa_enth_threshold))" + ], + "description_verification_type": "rule-based", + "assertions_type": "fail" + }] + }, + "EconomizerHighLimitD": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 5 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Differential enthalpy + fixed dry bulb economizer high limit (case study)" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "N/A" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Table 6.5.1.1.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Table 6.5.1.1.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_oa_db", + "oa_threshold", + "oa_min_flow", + "oa_flow", + "oa_enth", + "ret_a_enth" + ], + "properties": { + "T_oa_db": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb temperature" + ] + }, + "oa_threshold": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry bulb threshold" + ] + }, + "oa_min_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA minimum airflow setpoint" + ] + }, + "oa_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA airflow" + ] + }, + "oa_enth": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA enthalpy" + ] + }, + "ret_a_enth": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air enthalpy" + ] + } + }, + "examples": [{ + "T_oa_db": "OA dry bulb temperature", + "oa_threshold": "OA dry bulb threshold", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow", + "oa_enth": "OA enthalpy", + "ret_a_enth": "Return air enthalpy" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "oa_flow \u003e oa_min_flow) AND ((ret_a_enth \u003c oa_enth) OR (T_oa_db \u003e oa_threshold))" + ] + }, + "examples": [ + [ + "oa_flow \u003e oa_min_flow) AND ((ret_a_enth \u003c oa_enth) OR (T_oa_db \u003e oa_threshold))"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "fail" + ] + } + }, + "examples": [{ + "library_item_id": 5, + "description_brief": "Differential enthalpy + fixed dry bulb economizer high limit (case study)", + "description_detail": "N/A", + "description_index": [ + "Table 6.5.1.1.3 in 90.1-2016" + ], + "description_datapoints": { + "T_oa_db": "OA dry bulb temperature", + "oa_threshold": "OA dry bulb threshold", + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow", + "oa_enth": "OA enthalpy", + "ret_a_enth": "Return air enthalpy" + }, + "description_assertions": [ + "oa_flow \u003e oa_min_flow) AND ((ret_a_enth \u003c oa_enth) OR (T_oa_db \u003e oa_threshold))" + ], + "description_verification_type": "rule-based", + "assertions_type": "fail" + }] + }, + "IntegratedEconomizerControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 6 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Economizer shall be integrated with mechanical cooling" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Economizer systems shall be integrated with the mechanical cooling system and be capable of and configured to provide partial cooling even when additional mechanical cooling is required to meet the remainder of the cooling load. Controls shall not false load the mechanical cooling systems by limiting or disabling the economizer or by any other means, such as hot-gas bypass, except at the lowest stage of mechanical cooling. (case study, add non-integrated economizer (check each seprate on, but not both on)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.1.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.1.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "oa_min_flow", + "oa_flow", + "ccoil_out" + ], + "properties": { + "oa_min_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA minimum airflow setpoint" + ] + }, + "oa_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA airflow" + ] + }, + "ccoil_out": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling coil transfer" + ] + } + }, + "examples": [{ + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow", + "ccoil_out": "Cooling coil transfer" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "((oa_flow \u003e oa_min_flow) AND (ccoil_out \u003e 0)) never happens" + ] + }, + "examples": [ + [ + "((oa_flow \u003e oa_min_flow) AND (ccoil_out \u003e 0)) never happens"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "fail" + ] + } + }, + "examples": [{ + "library_item_id": 6, + "description_brief": "Economizer shall be integrated with mechanical cooling", + "description_detail": "Economizer systems shall be integrated with the mechanical cooling system and be capable of and configured to provide partial cooling even when additional mechanical cooling is required to meet the remainder of the cooling load. Controls shall not false load the mechanical cooling systems by limiting or disabling the economizer or by any other means, such as hot-gas bypass, except at the lowest stage of mechanical cooling. (case study, add non-integrated economizer (check each seprate on, but not both on)", + "description_index": [ + "Section 6.5.1.3 in 90.1-2016" + ], + "description_datapoints": { + "oa_min_flow": "OA minimum airflow setpoint", + "oa_flow": "OA airflow", + "ccoil_out": "Cooling coil transfer" + }, + "description_assertions": [ + "((oa_flow \u003e oa_min_flow) AND (ccoil_out \u003e 0)) never happens" + ], + "description_verification_type": "procedure-based", + "assertions_type": "fail" + }] + }, + "ERVRatio": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 7 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "ERV ratio of at least 50%" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Energy recovery systems required by this section shall result in an enthalpy recovery ratio of at least 50%. A 50% enthalpy recovery ratio shall mean a change in the enthalpy of the outdoor air supply equal to 50% of the difference between the outdoor air and entering exhaust air enthalpies at design conditions." + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.6.1 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.6.1 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "oa_enth", + "ret_enth", + "oa_enth_ERV" + ], + "properties": { + "oa_enth": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA enthalpy" + ] + }, + "ret_enth": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air enthalpy" + ] + }, + "oa_enth_ERV": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA enthalpy after ERV" + ] + } + }, + "examples": [{ + "oa_enth": "OA enthalpy", + "ret_enth": "Return air enthalpy", + "oa_enth_ERV": "OA enthalpy after ERV" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(oa_enth_ERV - oa_enth)/(ret_enth - oa_enth) \u003e = 50% happens at least once in winter design day" + ] + }, + "examples": [ + [ + "(oa_enth_ERV - oa_enth)/(ret_enth - oa_enth) \u003e = 50% happens at least once in winter design day"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 7, + "description_brief": "ERV ratio of at least 50%", + "description_detail": "Energy recovery systems required by this section shall result in an enthalpy recovery ratio of at least 50%. A 50% enthalpy recovery ratio shall mean a change in the enthalpy of the outdoor air supply equal to 50% of the difference between the outdoor air and entering exhaust air enthalpies at design conditions.", + "description_index": [ + "Section 6.5.6.1 in 90.1-2016" + ], + "description_datapoints": { + "oa_enth": "OA enthalpy", + "ret_enth": "Return air enthalpy", + "oa_enth_ERV": "OA enthalpy after ERV" + }, + "description_assertions": [ + "(oa_enth_ERV - oa_enth)/(ret_enth - oa_enth) \u003e = 50% happens at least once in winter design day" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ZoneTempControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 8 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone temperature setpoint deadband \u003e= 5F (2.77C)" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Where used to control both heating and cooling, zone thermostatic controls shall be capable of and configured to provide a temperature range or dead band of at least 5°F within which the supply of heating and cooling energy to the zone is shut off or reduced to a minimum. (case study for zone temperature reset, not for this one)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.1.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.1.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_set_cool", + "T_set_heat" + ], + "properties": { + "T_set_cool": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone cooling temperature setpoint" + ] + }, + "T_set_heat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone heating temperature setpoint" + ] + } + }, + "examples": [{ + "T_set_cool": "Zone cooling temperature setpoint", + "T_set_heat": "Zone heating temperature setpoint" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "T_set_cool - T_set_heat \u003e 5F (2.77C)" + ] + }, + "examples": [ + [ + "T_set_cool - T_set_heat \u003e 5F (2.77C)"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 8, + "description_brief": "Zone temperature setpoint deadband \u003e= 5F (2.77C)", + "description_detail": "Where used to control both heating and cooling, zone thermostatic controls shall be capable of and configured to provide a temperature range or dead band of at least 5°F within which the supply of heating and cooling energy to the zone is shut off or reduced to a minimum. (case study for zone temperature reset, not for this one)", + "description_index": [ + "Section 6.4.3.1.2 in 90.1-2016" + ], + "description_datapoints": { + "T_set_cool": "Zone cooling temperature setpoint", + "T_set_heat": "Zone heating temperature setpoint" + }, + "description_assertions": [ + "T_set_cool - T_set_heat \u003e 5F (2.77C)" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "HWReset": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 9 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Hot water supply water temperature reset" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Hot-water systems with a design capacity exceeding 300,000 Btu/h supplying heated water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.4.4 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.4.4 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_oa_db", + "T_oa_max", + "T_oa_min", + "T_hw", + "m_hw", + "T_hw_max_set", + "T_hw_min_set" + ], + "properties": { + "T_oa_db": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry-bulb temperature" + ] + }, + "T_oa_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry-bulb upper threshold" + ] + }, + "T_oa_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry-bulb lower threshold" + ] + }, + "T_hw": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Hot water temp observed from the system node" + ] + }, + "m_hw": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Hot water flow rate" + ] + }, + "T_hw_max_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Hot water maximum temp setpoint" + ] + }, + "T_hw_min_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Hot water minimum temp setpoint" + ] + } + }, + "examples": [{ + "T_oa_db": "OA dry-bulb temperature", + "T_oa_max": "OA dry-bulb upper threshold", + "T_oa_min": "OA dry-bulb lower threshold", + "T_hw": "Hot water temp observed from the system node", + "m_hw": "Hot water flow rate", + "T_hw_max_set": "Hot water maximum temp setpoint", + "T_hw_min_set": "Hot water minimum temp setpoint" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "When m_hw \u003e 0, T_hw \u003c= T_hw_max_set and T_hw \u003e= T_hw_min_set; When m_hw \u003c 0, always pass" + ] + }, + "examples": [ + [ + "When m_hw \u003e 0, T_hw \u003c= T_hw_max_set and T_hw \u003e= T_hw_min_set; When m_hw \u003c 0, always pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 9, + "description_brief": "Hot water supply water temperature reset", + "description_detail": "Hot-water systems with a design capacity exceeding 300,000 Btu/h supplying heated water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)", + "description_index": [ + "Section 6.5.4.4 in 90.1-2016" + ], + "description_datapoints": { + "T_oa_db": "OA dry-bulb temperature", + "T_oa_max": "OA dry-bulb upper threshold", + "T_oa_min": "OA dry-bulb lower threshold", + "T_hw": "Hot water temp observed from the system node", + "m_hw": "Hot water flow rate", + "T_hw_max_set": "Hot water maximum temp setpoint", + "T_hw_min_set": "Hot water minimum temp setpoint" + }, + "description_assertions": [ + "When m_hw \u003e 0, T_hw \u003c= T_hw_max_set and T_hw \u003e= T_hw_min_set; When m_hw \u003c 0, always pass" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "CHWReset": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 10 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Chilled water supply water temperature reset" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Chilled-water systems with a design capacity exceeding 300,000 Btu/h supplying chilled water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.4.4 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.4.4 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_oa_db", + "T_oa_max", + "T_oa_min", + "T_chw", + "m_chw", + "T_chw_max_set", + "T_chw_min_set" + ], + "properties": { + "T_oa_db": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry-bulb temperature" + ] + }, + "T_oa_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry-bulb upper threshold" + ] + }, + "T_oa_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "OA dry-bulb lower threshold" + ] + }, + "T_chw": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Chilled water temp observed from the system node" + ] + }, + "m_chw": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Chilled water flow rate" + ] + }, + "T_chw_max_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Chilled water maximum temp setpoint" + ] + }, + "T_chw_min_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Chilled water minimum temp setpoint" + ] + } + }, + "examples": [{ + "T_oa_db": "OA dry-bulb temperature", + "T_oa_max": "OA dry-bulb upper threshold", + "T_oa_min": "OA dry-bulb lower threshold", + "T_chw": "Chilled water temp observed from the system node", + "m_chw": "Chilled water flow rate", + "T_chw_max_set": "Chilled water maximum temp setpoint", + "T_chw_min_set": "Chilled water minimum temp setpoint" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "When m_chw \u003e 0, T_chw \u003c= T_chw_max_set and T_chw \u003e= T_chw_min_set; When m_chw \u003c= 0 , always pass" + ] + }, + "examples": [ + [ + "When m_chw \u003e 0, T_chw \u003c= T_chw_max_set and T_chw \u003e= T_chw_min_set; When m_chw \u003c= 0 , always pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 10, + "description_brief": "Chilled water supply water temperature reset", + "description_detail": "Chilled-water systems with a design capacity exceeding 300,000 Btu/h supplying chilled water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)", + "description_index": [ + "Section 6.5.4.4 in 90.1-2016" + ], + "description_datapoints": { + "T_oa_db": "OA dry-bulb temperature", + "T_oa_max": "OA dry-bulb upper threshold", + "T_oa_min": "OA dry-bulb lower threshold", + "T_chw": "Chilled water temp observed from the system node", + "m_chw": "Chilled water flow rate", + "T_chw_max_set": "Chilled water maximum temp setpoint", + "T_chw_min_set": "Chilled water minimum temp setpoint" + }, + "description_assertions": [ + "When m_chw \u003e 0, T_chw \u003c= T_chw_max_set and T_chw \u003e= T_chw_min_set; When m_chw \u003c= 0 , always pass" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "ZoneHeatSetpointMinimum": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 11 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone heating setpoint reset temperature minimum value check" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating systems located in climate zones 2-8 shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures above a heating setpoint adjustable down to 55°F or lower. (case study)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.2.2 in 90.1-2004" + ] + }, + "examples": [ + [ + "Section 6.4.3.2.2 in 90.1-2004"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_heat_set" + ], + "properties": { + "T_heat_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Heating Setpoint Temperature" + ] + } + }, + "examples": [{ + "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if min(T_heat_set) \u003c= 55°F, then pass" + ] + }, + "examples": [ + [ + "if min(T_heat_set) \u003c= 55°F, then pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 11, + "description_brief": "Zone heating setpoint reset temperature minimum value check", + "description_detail": "Heating systems located in climate zones 2-8 shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures above a heating setpoint adjustable down to 55°F or lower. (case study)", + "description_index": [ + "Section 6.4.3.2.2 in 90.1-2004" + ], + "description_datapoints": { + "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" + }, + "description_assertions": [ + "if min(T_heat_set) \u003c= 55°F, then pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ZoneCoolingSetpointMaximum": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 12 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + " Cooling systems located in climate zones 1b, 2b, and 3b shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures below a cooling setpoint adjustable up to 90°F or higher or to prevent high space humidity levels. (case study)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.2.2 in 90.1-2004" + ] + }, + "examples": [ + [ + "Section 6.4.3.2.2 in 90.1-2004"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_cool_set" + ], + "properties": { + "T_cool_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Cooling Setpoint Temperature" + ] + } + }, + "examples": [{ + "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if max(T_cool_set) \u003e= 90F, then pass" + ] + }, + "examples": [ + [ + "if max(T_cool_set) \u003e= 90F, then pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 12, + "description_brief": " Cooling systems located in climate zones 1b, 2b, and 3b shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures below a cooling setpoint adjustable up to 90°F or higher or to prevent high space humidity levels. (case study)", + "description_index": [ + "Section 6.4.3.2.2 in 90.1-2004" + ], + "description_datapoints": { + "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" + }, + "description_assertions": [ + "if max(T_cool_set) \u003e= 90F, then pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ZoneHeatingResetDepth": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 13 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the system as required to maintain zone temperatures above an adjustable heating set point at least 10°F below (will be 60°F) the occupied heating set point. (case study)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.3.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.3.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_heat_set" + ], + "properties": { + "T_heat_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Heating Setpoint Temperature" + ] + } + }, + "examples": [{ + "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if max(T_heat_set) - min(T_heat_set) \u003e= 10F, then pass" + ] + }, + "examples": [ + [ + "if max(T_heat_set) - min(T_heat_set) \u003e= 10F, then pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 13, + "description_brief": "Heating systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the system as required to maintain zone temperatures above an adjustable heating set point at least 10°F below (will be 60°F) the occupied heating set point. (case study)", + "description_index": [ + "Section 6.4.3.3.2 in 90.1-2016" + ], + "description_datapoints": { + "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" + }, + "description_assertions": [ + "if max(T_heat_set) - min(T_heat_set) \u003e= 10F, then pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ZoneCoolingResetDepth": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 14 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the mechanical cooling system as required to maintain zone temperatures below an adjustable cooling set point at least 5°F above the occupied cooling set point or to prevent high space humidity levels. (case study)" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.3.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.3.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_cool_set" + ], + "properties": { + "T_cool_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Cooling Setpoint Temperature" + ] + } + }, + "examples": [{ + "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if max(T_cool_set) - min(T_cool_set) \u003e= 5F, then pass" + ] + }, + "examples": [ + [ + "if max(T_cool_set) - min(T_cool_set) \u003e= 5F, then pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 14, + "description_brief": "Cooling systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the mechanical cooling system as required to maintain zone temperatures below an adjustable cooling set point at least 5°F above the occupied cooling set point or to prevent high space humidity levels. (case study)", + "description_index": [ + "Section 6.4.3.3.2 in 90.1-2016" + ], + "description_datapoints": { + "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" + }, + "description_assertions": [ + "if max(T_cool_set) - min(T_cool_set) \u003e= 5F, then pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "NightCycleOperation": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 15 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "TSPR tool software development" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "null", + "default": null, + "examples": [ + null + ] + }, + "examples": [ + [ + null] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_zone", + "HVAC_operation_sch", + "T_heat_set", + "T_cool_set", + "Fan_elec_rate" + ], + "properties": { + "T_zone": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Air Temperature" + ] + }, + "HVAC_operation_sch": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "HVAC Operation Schedule" + ] + }, + "T_heat_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Heating Setpoint Temperature" + ] + }, + "T_cool_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Cooling Setpoint Temperature" + ] + }, + "Fan_elec_rate": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Fan Electricity Rate" + ] + } + }, + "examples": [{ + "T_zone": "Zone Air Temperature", + "HVAC_operation_sch": "HVAC Operation Schedule", + "T_heat_set": "Zone Thermostat Heating Setpoint Temperature", + "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature", + "Fan_elec_rate": "Fan Electricity Rate" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if T_heat_set \u003c= T_zone \u003c= T_cool_set and Fan_elec_rate ==0 then x1=0 else x1=1, if (T_zone \u003e T_cool_set and Fan_elec_rate \u003e= 0) and (T_zone \u003c T_heat_set and Fan_elec_rate\u003e0) then x2=0 else x=1, if x1 and x2=0, then pass, elseif x1=0 and x2=1 then fail, elseif x1=1 and x2=0 then fail, elseif x1=1 and x2=1 then fail" + ] + }, + "examples": [ + [ + "if T_heat_set \u003c= T_zone \u003c= T_cool_set and Fan_elec_rate ==0 then x1=0 else x1=1, if (T_zone \u003e T_cool_set and Fan_elec_rate \u003e= 0) and (T_zone \u003c T_heat_set and Fan_elec_rate\u003e0) then x2=0 else x=1, if x1 and x2=0, then pass, elseif x1=0 and x2=1 then fail, elseif x1=1 and x2=0 then fail, elseif x1=1 and x2=1 then fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 15, + "description_brief": "TSPR tool software development", + "description_index": [ + null + ], + "description_datapoints": { + "T_zone": "Zone Air Temperature", + "HVAC_operation_sch": "HVAC Operation Schedule", + "T_heat_set": "Zone Thermostat Heating Setpoint Temperature", + "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature", + "Fan_elec_rate": "Fan Electricity Rate" + }, + "description_assertions": [ + "if T_heat_set \u003c= T_zone \u003c= T_cool_set and Fan_elec_rate ==0 then x1=0 else x1=1, if (T_zone \u003e T_cool_set and Fan_elec_rate \u003e= 0) and (T_zone \u003c T_heat_set and Fan_elec_rate\u003e0) then x2=0 else x=1, if x1 and x2=0, then pass, elseif x1=0 and x2=1 then fail, elseif x1=1 and x2=0 then fail, elseif x1=1 and x2=1 then fail" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ERVTemperatureControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 16 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "TSPR tool software development" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "null", + "default": null, + "examples": [ + null + ] + }, + "examples": [ + [ + null] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "MIN_OA_FLOW", + "OA_FLOW", + "NOM_FLOW", + "HX_DSN_EFF_HTG", + "HX_DSN_EFF_HTG_75_PCT", + "HX_DSN_EFF_CLG", + "HX_DSN_EFF_CLG_75_PCT", + "T_OA", + "T_SO", + "T_SO_SP", + "T_EI" + ], + "properties": { + "MIN_OA_FLOW": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum outdoor air flow rate" + ] + }, + "OA_FLOW": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air flow rate" + ] + }, + "NOM_FLOW": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heat exchanger's norminal flow rate" + ] + }, + "HX_DSN_EFF_HTG": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heat exchanger heating effectiveness at the nominal air flow rate" + ] + }, + "HX_DSN_EFF_HTG_75_PCT": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heat exchanger heating effectiveness at 75% of the nominal air flow rate" + ] + }, + "HX_DSN_EFF_CLG": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heat exchanger cooling effectiveness at the nominal air flow rate" + ] + }, + "HX_DSN_EFF_CLG_75_PCT": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heat exchanger cooling effectiveness at 75% of the nominal air flow rate" + ] + }, + "T_OA": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air dry-bulb temperature" + ] + }, + "T_SO": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Supply air temperature" + ] + }, + "T_SO_SP": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Supply air temperature setpoint" + ] + }, + "T_EI": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone air temperature" + ] + } + }, + "examples": [{ + "MIN_OA_FLOW": "Minimum outdoor air flow rate", + "OA_FLOW": "Outdoor air flow rate", + "NOM_FLOW": "Heat exchanger's norminal flow rate", + "HX_DSN_EFF_HTG": "Heat exchanger heating effectiveness at the nominal air flow rate", + "HX_DSN_EFF_HTG_75_PCT": "Heat exchanger heating effectiveness at 75% of the nominal air flow rate", + "HX_DSN_EFF_CLG": "Heat exchanger cooling effectiveness at the nominal air flow rate", + "HX_DSN_EFF_CLG_75_PCT": "Heat exchanger cooling effectiveness at 75% of the nominal air flow rate", + "T_OA": "Outdoor air dry-bulb temperature", + "T_SO": "Supply air temperature", + "T_SO_SP": "Supply air temperature setpoint", + "T_EI": "Zone air temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Check that the ERV is bypassed during economizer operation; During non-economizer operation, if the outdoor air flow rate, 1) if T_SO \u003e T_SO_SP the ERV is not operating correctly if T_OA \u003c T_EI and the ERV is running, T_OA \u003e T_EI and the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value, 2) if T_SO \u003c T_SO_SP the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value" + ] + }, + "examples": [ + [ + "Check that the ERV is bypassed during economizer operation; During non-economizer operation, if the outdoor air flow rate, 1) if T_SO \u003e T_SO_SP the ERV is not operating correctly if T_OA \u003c T_EI and the ERV is running, T_OA \u003e T_EI and the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value, 2) if T_SO \u003c T_SO_SP the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 16, + "description_brief": "TSPR tool software development", + "description_index": [ + null + ], + "description_datapoints": { + "MIN_OA_FLOW": "Minimum outdoor air flow rate", + "OA_FLOW": "Outdoor air flow rate", + "NOM_FLOW": "Heat exchanger's norminal flow rate", + "HX_DSN_EFF_HTG": "Heat exchanger heating effectiveness at the nominal air flow rate", + "HX_DSN_EFF_HTG_75_PCT": "Heat exchanger heating effectiveness at 75% of the nominal air flow rate", + "HX_DSN_EFF_CLG": "Heat exchanger cooling effectiveness at the nominal air flow rate", + "HX_DSN_EFF_CLG_75_PCT": "Heat exchanger cooling effectiveness at 75% of the nominal air flow rate", + "T_OA": "Outdoor air dry-bulb temperature", + "T_SO": "Supply air temperature", + "T_SO_SP": "Supply air temperature setpoint", + "T_EI": "Zone air temperature" + }, + "description_assertions": [ + "Check that the ERV is bypassed during economizer operation; During non-economizer operation, if the outdoor air flow rate, 1) if T_SO \u003e T_SO_SP the ERV is not operating correctly if T_OA \u003c T_EI and the ERV is running, T_OA \u003e T_EI and the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value, 2) if T_SO \u003c T_SO_SP the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "AutomaticOADamperControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 17 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "HVAC system shall be turned on and off everyday" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.4.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.4.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "o", + "m_oa", + "eco_onoff", + "tol_o", + "tol_m_oa" + ], + "properties": { + "o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Number of occupants" + ] + }, + "m_oa": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Air terminal outdoor air volume flow rate" + ] + }, + "eco_onoff": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Air system outdoor air economizer status" + ] + }, + "tol_o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for the number of occupants" + ] + }, + "tol_m_oa": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for the air terminal air volume flow rate" + ] + } + }, + "examples": [{ + "o": "Number of occupants", + "m_oa": "Air terminal outdoor air volume flow rate", + "eco_onoff": "Air system outdoor air economizer status", + "tol_o": "Tolerance for the number of occupants", + "tol_m_oa": "Tolerance for the air terminal air volume flow rate" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if no_of_occ \u003c= 0 + tol and m_ea + m_oa \u003e 0 and eco_onoff = 0, then false else pass" + ] + }, + "examples": [ + [ + "if no_of_occ \u003c= 0 + tol and m_ea + m_oa \u003e 0 and eco_onoff = 0, then false else pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 17, + "description_brief": "HVAC system shall be turned on and off everyday", + "description_index": [ + "Section 6.4.3.4.2 in 90.1-2016" + ], + "description_datapoints": { + "o": "Number of occupants", + "m_oa": "Air terminal outdoor air volume flow rate", + "eco_onoff": "Air system outdoor air economizer status", + "tol_o": "Tolerance for the number of occupants", + "tol_m_oa": "Tolerance for the air terminal air volume flow rate" + }, + "description_assertions": [ + "if no_of_occ \u003c= 0 + tol and m_ea + m_oa \u003e 0 and eco_onoff = 0, then false else pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "FanStaticPressureResetControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 18 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "The set point is reset lower until one zone damper is nearly wide open" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.3.2.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.3.2.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "p_set", + "d_VAV_x", + "tol", + "p_set_min" + ], + "properties": { + "p_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Static pressure setpoint" + ] + }, + "d_VAV_x": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "VAV Damper x Position (includes all VAV dampers served by the system under test" + ] + }, + "tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for VAV box damper position openings" + ] + }, + "p_set_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + ": Minimum static pressure setpoint threshold" + ] + } + }, + "examples": [{ + "p_set": "Static pressure setpoint", + "d_VAV_x": "VAV Damper x Position (includes all VAV dampers served by the system under test", + "tol": "Tolerance for VAV box damper position openings", + "p_set_min": ": Minimum static pressure setpoint threshold" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if d_VAV(n) (n=1,2,...,N) \u003c 0.9 and p_set(t) \u003e p_set(t-1), then fail else pass" + ] + }, + "examples": [ + [ + "if d_VAV(n) (n=1,2,...,N) \u003c 0.9 and p_set(t) \u003e p_set(t-1), then fail else pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 18, + "description_brief": "The set point is reset lower until one zone damper is nearly wide open", + "description_index": [ + "Section 6.5.3.2.3 in 90.1-2016" + ], + "description_datapoints": { + "p_set": "Static pressure setpoint", + "d_VAV_x": "VAV Damper x Position (includes all VAV dampers served by the system under test", + "tol": "Tolerance for VAV box damper position openings", + "p_set_min": ": Minimum static pressure setpoint threshold" + }, + "description_assertions": [ + "if d_VAV(n) (n=1,2,...,N) \u003c 0.9 and p_set(t) \u003e p_set(t-1), then fail else pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "HeatRejectionFanVariableFlowControlsCells": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 19 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heat rejection fan variable flow controls cells" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.5.2.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.5.2.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "ct_op_cells", + "ct_cells", + "ct_m", + "ct_m_des", + "min_flow_frac_per_cell", + "ct_P_fan" + ], + "properties": { + "ct_op_cells": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Number of operating cooling tower cells" + ] + }, + "ct_cells": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Number of cooling tower cells" + ] + }, + "ct_m": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling tower mass flow rate" + ] + }, + "ct_m_des": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling tower design mass flow rate" + ] + }, + "min_flow_frac_per_cell": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum flow fraction per cooling tower cell" + ] + }, + "ct_P_fan": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling tower fan power" + ] + } + }, + "examples": [{ + "ct_op_cells": "Number of operating cooling tower cells", + "ct_cells": "Number of cooling tower cells", + "ct_m": "Cooling tower mass flow rate", + "ct_m_des": "Cooling tower design mass flow rate", + "min_flow_frac_per_cell": "Minimum flow fraction per cooling tower cell", + "ct_P_fan": "Cooling tower fan power" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if the number of operating cooling tower cells is equal to the maximum number of cooling tower cells then pass else fail" + ] + }, + "examples": [ + [ + "if the number of operating cooling tower cells is equal to the maximum number of cooling tower cells then pass else fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 19, + "description_brief": "Heat rejection fan variable flow controls cells", + "description_index": [ + "Section 6.5.5.2.2 in 90.1-2016" + ], + "description_datapoints": { + "ct_op_cells": "Number of operating cooling tower cells", + "ct_cells": "Number of cooling tower cells", + "ct_m": "Cooling tower mass flow rate", + "ct_m_des": "Cooling tower design mass flow rate", + "min_flow_frac_per_cell": "Minimum flow fraction per cooling tower cell", + "ct_P_fan": "Cooling tower fan power" + }, + "description_assertions": [ + "if the number of operating cooling tower cells is equal to the maximum number of cooling tower cells then pass else fail" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ServiceWaterHeatingSystemControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 20 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Service water heating system control" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 7.4.4.3 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 7.4.4.3 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_wh_inlet" + ], + "properties": { + "T_wh_inlet": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Water temperature on demand side from the water heater" + ] + } + }, + "examples": [{ + "T_wh_inlet": "Water temperature on demand side from the water heater" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if maximum(T_wh_inlet) \u003c 43.33 °C Then pass else fail" + ] + }, + "examples": [ + [ + "if maximum(T_wh_inlet) \u003c 43.33 °C Then pass else fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 20, + "description_brief": "Service water heating system control", + "description_index": [ + "Section 7.4.4.3 in 90.1-2016" + ], + "description_datapoints": { + "T_wh_inlet": "Water temperature on demand side from the water heater" + }, + "description_assertions": [ + "if maximum(T_wh_inlet) \u003c 43.33 °C Then pass else fail" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "VAVStaticPressureSensorLocation": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 21 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "VAV static pressure sensor location requirement" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.3.2.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.3.2.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "p_fan_set", + "tol_P_fan" + ], + "properties": { + "p_fan_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Static pressure setpoint" + ] + }, + "tol_P_fan": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for VAV box static pressure sensor" + ] + } + }, + "examples": [{ + "p_fan_set": "Static pressure setpoint", + "tol_P_fan": "Tolerance for VAV box static pressure sensor" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if static pressure setpoint is no greater than 1.2 in of water (298.608 Pa) then pass else fail" + ] + }, + "examples": [ + [ + "if static pressure setpoint is no greater than 1.2 in of water (298.608 Pa) then pass else fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 21, + "description_brief": "VAV static pressure sensor location requirement", + "description_index": [ + "Section 6.5.3.2.2 in 90.1-2016" + ], + "description_datapoints": { + "p_fan_set": "Static pressure setpoint", + "tol_P_fan": "Tolerance for VAV box static pressure sensor" + }, + "description_assertions": [ + "if static pressure setpoint is no greater than 1.2 in of water (298.608 Pa) then pass else fail" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "VentilationFanControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 22 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Ventilation fan control" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.4.4 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.4.4 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "no_of_occ", + "Q_load", + "P_fan" + ], + "properties": { + "no_of_occ": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "People Occupant Count" + ] + }, + "Q_load": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Predicted Sensible Load to Setpoint Heat Transfer Rate" + ] + }, + "P_fan": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Fan Electric Power" + ] + } + }, + "examples": [{ + "no_of_occ": "People Occupant Count", + "Q_load": "Zone Predicted Sensible Load to Setpoint Heat Transfer Rate", + "P_fan": "Fan Electric Power" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if Q_load = 0 and no_of_occ = 0 and P_fan != 0 then fail else pass" + ] + }, + "examples": [ + [ + "if Q_load = 0 and no_of_occ = 0 and P_fan != 0 then fail else pass"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 22, + "description_brief": "Ventilation fan control", + "description_index": [ + "Section 6.4.3.4.4 in 90.1-2016" + ], + "description_datapoints": { + "no_of_occ": "People Occupant Count", + "Q_load": "Zone Predicted Sensible Load to Setpoint Heat Transfer Rate", + "P_fan": "Fan Electric Power" + }, + "description_assertions": [ + "if Q_load = 0 and no_of_occ = 0 and P_fan != 0 then fail else pass" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "WLHPLoopHeatRejectionControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 23 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Water-loop heat pump heat rejection control" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.2.2.3 (a) in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.2.2.3 (a) in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_max_heating_loop", + "T_min_cooling_loop", + "m_pump", + "tol" + ], + "properties": { + "T_max_heating_loop": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "maximum temperature of heating loop" + ] + }, + "T_min_cooling_loop": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "minimum temperature of cooling loop" + ] + }, + "m_pump": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Pump Mass Flow Rate" + ] + }, + "tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for water-loop temperature difference" + ] + } + }, + "examples": [{ + "T_max_heating_loop": "maximum temperature of heating loop", + "T_min_cooling_loop": "minimum temperature of cooling loop", + "m_pump": "Pump Mass Flow Rate", + "tol": "Tolerance for water-loop temperature difference" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "If the temperature difference between the maximum heating loop and minimum heating loop when the pump runs is greater than 11.11 °C, then pass else fail" + ] + }, + "examples": [ + [ + "If the temperature difference between the maximum heating loop and minimum heating loop when the pump runs is greater than 11.11 °C, then pass else fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 23, + "description_brief": "Water-loop heat pump heat rejection control", + "description_index": [ + "Section 6.5.2.2.3 (a) in 90.1-2016" + ], + "description_datapoints": { + "T_max_heating_loop": "maximum temperature of heating loop", + "T_min_cooling_loop": "minimum temperature of cooling loop", + "m_pump": "Pump Mass Flow Rate", + "tol": "Tolerance for water-loop temperature difference" + }, + "description_assertions": [ + "If the temperature difference between the maximum heating loop and minimum heating loop when the pump runs is greater than 11.11 °C, then pass else fail" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "AutomaticShutdown": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 24 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Off Hour Automatic Temperature Setback and System Shutoff" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "null", + "default": null, + "examples": [ + null + ] + }, + "examples": [ + [ + null] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "hvac_set" + ], + "properties": { + "hvac_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "HVAC Operation Schedule" + ] + } + }, + "examples": [{ + "hvac_set": "HVAC Operation Schedule" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "if minimum start_time != maximum start_time and minimum end_time != maximum end_time then pass else fail" + ] + }, + "examples": [ + [ + "if minimum start_time != maximum start_time and minimum end_time != maximum end_time then pass else fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 24, + "description_brief": "Off Hour Automatic Temperature Setback and System Shutoff", + "description_index": [ + null + ], + "description_datapoints": { + "hvac_set": "HVAC Operation Schedule" + }, + "description_assertions": [ + "if minimum start_time != maximum start_time and minimum end_time != maximum end_time then pass else fail" + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "HeatPumpSupplementalHeatLockout": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 25 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Supplemental heating coil should be off when the heat pump can meet the load by itself" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.5 Heat Pump Auxiliary Heat Control and 6.3.2.h Criteria in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.5 Heat Pump Auxiliary Heat Control and 6.3.2.h Criteria in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "C_ref", + "L_op", + "C_t_mod", + "P_supp_ht", + "C_ff_mod", + "L_defrost" + ], + "properties": { + "C_ref": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating Coil Reference Capacity" + ] + }, + "L_op": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating Coil Runtime Fraction" + ] + }, + "C_t_mod": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating Coil Heating Rate" + ] + }, + "P_supp_ht": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating Coil Gas Rate" + ] + }, + "C_ff_mod": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating Capacity Function of Flow Fraction Curve" + ] + }, + "L_defrost": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Defrost load on the heating coil" + ] + } + }, + "examples": [{ + "C_ref": "Heating Coil Reference Capacity", + "L_op": "Heating Coil Runtime Fraction", + "C_t_mod": "Heating Coil Heating Rate", + "P_supp_ht": "Heating Coil Gas Rate", + "C_ff_mod": "Heating Capacity Function of Flow Fraction Curve", + "L_defrost": "Defrost load on the heating coil" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "If C_ref * C_t_mod \u003e= L_op and P_supp_ht == 0 then pass else fail" + ] + }, + "examples": [ + [ + "If C_ref * C_t_mod \u003e= L_op and P_supp_ht == 0 then pass else fail"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 25, + "description_brief": "Supplemental heating coil should be off when the heat pump can meet the load by itself", + "description_index": [ + "Section 6.4.3.5 Heat Pump Auxiliary Heat Control and 6.3.2.h Criteria in 90.1-2016" + ], + "description_datapoints": { + "C_ref": "Heating Coil Reference Capacity", + "L_op": "Heating Coil Runtime Fraction", + "C_t_mod": "Heating Coil Heating Rate", + "P_supp_ht": "Heating Coil Gas Rate", + "C_ff_mod": "Heating Capacity Function of Flow Fraction Curve", + "L_defrost": "Defrost load on the heating coil" + }, + "description_assertions": [ + "If C_ref * C_t_mod \u003e= L_op and P_supp_ht == 0 then pass else fail" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "HeatRejectionFanVariableFlowControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 26 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "The cooling tower fan power is 30% of the design value at 50% flow" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.5.5.2.1 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.5.5.2.1 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "ct_P_fan", + "ct_P_fan_dsgn", + "ct_m_fan_ratio", + "ct_m_fan_dsgn" + ], + "properties": { + "ct_P_fan": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling Tower Fan Power" + ] + }, + "ct_P_fan_dsgn": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling Tower Design Fan Power" + ] + }, + "ct_m_fan_ratio": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling Tower Air Flow Rate Ratio" + ] + }, + "ct_m_fan_dsgn": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling Tower Design Air Flow" + ] + } + }, + "examples": [{ + "ct_P_fan": "Cooling Tower Fan Power", + "ct_P_fan_dsgn": "Cooling Tower Design Fan Power", + "ct_m_fan_ratio": "Cooling Tower Air Flow Rate Ratio", + "ct_m_fan_dsgn": "Cooling Tower Design Air Flow" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that at 5% flow, the cooling tower fan power is 30% of the design value. Since simulation results might not include that exact point, we use a regression based approach to determining if the code requirement is met" + ] + }, + "examples": [ + [ + "Verify that at 5% flow, the cooling tower fan power is 30% of the design value. Since simulation results might not include that exact point, we use a regression based approach to determining if the code requirement is met"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 26, + "description_brief": "The cooling tower fan power is 30% of the design value at 50% flow", + "description_index": [ + "Section 6.5.5.2.1 in 90.1-2016" + ], + "description_datapoints": { + "ct_P_fan": "Cooling Tower Fan Power", + "ct_P_fan_dsgn": "Cooling Tower Design Fan Power", + "ct_m_fan_ratio": "Cooling Tower Air Flow Rate Ratio", + "ct_m_fan_dsgn": "Cooling Tower Design Air Flow" + }, + "description_assertions": [ + "Verify that at 5% flow, the cooling tower fan power is 30% of the design value. Since simulation results might not include that exact point, we use a regression based approach to determining if the code requirement is met" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "DemandControlVentilation": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 27 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Demand control ventilation verification for high-occupancy areas" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.8 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.8 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "v_oa", + "s_ahu", + "s_eco", + "no_of_occ" + ], + "properties": { + "v_oa": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Air Terminal Outdoor Air Volume Flow Rate" + ] + }, + "s_ahu": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "status of HVAC system operation" + ] + }, + "s_eco": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Air System Outdoor Air Economizer Status" + ] + }, + "no_of_occ": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "People Occupant Count" + ] + } + }, + "examples": [{ + "v_oa": "Zone Air Terminal Outdoor Air Volume Flow Rate", + "s_ahu": "status of HVAC system operation", + "s_eco": "Air System Outdoor Air Economizer Status", + "no_of_occ": "People Occupant Count" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "i) If v_oa is constant over time, NO DCV presents. ii) If v_oa has two clusters, DCV with hbinary control presents. iii) v_oa is linearly correlated to o_ahu, DCV with occupant-counting based control presents" + ] + }, + "examples": [ + [ + "i) If v_oa is constant over time, NO DCV presents. ii) If v_oa has two clusters, DCV with hbinary control presents. iii) v_oa is linearly correlated to o_ahu, DCV with occupant-counting based control presents"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 27, + "description_brief": "Demand control ventilation verification for high-occupancy areas", + "description_index": [ + "Section 6.4.3.8 in 90.1-2016" + ], + "description_datapoints": { + "v_oa": "Zone Air Terminal Outdoor Air Volume Flow Rate", + "s_ahu": "status of HVAC system operation", + "s_eco": "Air System Outdoor Air Economizer Status", + "no_of_occ": "People Occupant Count" + }, + "description_assertions": [ + "i) If v_oa is constant over time, NO DCV presents. ii) If v_oa has two clusters, DCV with hbinary control presents. iii) v_oa is linearly correlated to o_ahu, DCV with occupant-counting based control presents" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "GuestRoomControlTemp": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 28 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify whether there is guest room temperature control during operation hours" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.3.5 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.3.5 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "T_z_hea_set", + "T_z_coo_set", + "O_sch", + "tol_occ", + "tol_temp" + ], + "properties": { + "T_z_hea_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Heating Setpoint Temperature" + ] + }, + "T_z_coo_set": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Thermostat Cooling Setpoint Temperature" + ] + }, + "O_sch": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupant Schedule" + ] + }, + "tol_occ": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerence for Occupant Schedule" + ] + }, + "tol_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for Temperature" + ] + } + }, + "examples": [{ + "T_z_hea_set": "Zone Thermostat Heating Setpoint Temperature", + "T_z_coo_set": "Zone Thermostat Cooling Setpoint Temperature", + "O_sch": "Occupant Schedule", + "tol_occ": "Tolerence for Occupant Schedule", + "tol_temp": "Tolerance for Temperature" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Check the two different temperature control logics when the room is/isn't rented out" + ] + }, + "examples": [ + [ + "Check the two different temperature control logics when the room is/isn't rented out"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 28, + "description_brief": "Verify whether there is guest room temperature control during operation hours", + "description_index": [ + "Section 6.4.3.3.5 in 90.1-2016" + ], + "description_datapoints": { + "T_z_hea_set": "Zone Thermostat Heating Setpoint Temperature", + "T_z_coo_set": "Zone Thermostat Cooling Setpoint Temperature", + "O_sch": "Occupant Schedule", + "tol_occ": "Tolerence for Occupant Schedule", + "tol_temp": "Tolerance for Temperature" + }, + "description_assertions": [ + "Check the two different temperature control logics when the room is/isn't rented out" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "GuestRoomControlVent": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 29 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify whether there is guest room outdoor airflow control during operation hours" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 6.4.3.3.5.2 in 90.1-2016" + ] + }, + "examples": [ + [ + "Section 6.4.3.3.5.2 in 90.1-2016"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "damper_sch", + "m_oa_fraction", + "O_sch", + "m_oa_heat_design", + "m_oa_cool_design", + "volume", + "v_outdoor_per_zone", + "tol_occ", + "tol_oa_flow" + ], + "properties": { + "damper_sch": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Damper Schdule" + ] + }, + "m_oa_fraction": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Air System Outdoor Air Flow Fraction" + ] + }, + "O_sch": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupant schedule" + ] + }, + "m_oa_heat_design": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Design Heating Air Flow Rate" + ] + }, + "m_oa_cool_design": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Design Cooling Air Flow Rate" + ] + }, + "volume": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone Volume" + ] + }, + "v_outdoor_per_zone": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor Air Flow per Zone Floor Area" + ] + }, + "tol_occ": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerence for occupant Schedule" + ] + }, + "tol_oa_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance for Outdoor Airflow" + ] + } + }, + "examples": [{ + "damper_sch": "Damper Schdule", + "m_oa_fraction": "Air System Outdoor Air Flow Fraction", + "O_sch": "Occupant schedule", + "m_oa_heat_design": "Design Heating Air Flow Rate", + "m_oa_cool_design": "Design Cooling Air Flow Rate", + "volume": "Zone Volume", + "v_outdoor_per_zone": "Outdoor Air Flow per Zone Floor Area", + "tol_occ": "Tolerence for occupant Schedule", + "tol_oa_flow": "Tolerance for Outdoor Airflow" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Check the two different airflow control logics when the room is/isn't rented out" + ] + }, + "examples": [ + [ + "Check the two different airflow control logics when the room is/isn't rented out"] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 29, + "description_brief": "Verify whether there is guest room outdoor airflow control during operation hours", + "description_index": [ + "Section 6.4.3.3.5.2 in 90.1-2016" + ], + "description_datapoints": { + "damper_sch": "Damper Schdule", + "m_oa_fraction": "Air System Outdoor Air Flow Fraction", + "O_sch": "Occupant schedule", + "m_oa_heat_design": "Design Heating Air Flow Rate", + "m_oa_cool_design": "Design Cooling Air Flow Rate", + "volume": "Zone Volume", + "v_outdoor_per_zone": "Outdoor Air Flow per Zone Floor Area", + "tol_occ": "Tolerence for occupant Schedule", + "tol_oa_flow": "Tolerance for Outdoor Airflow" + }, + "description_assertions": [ + "Check the two different airflow control logics when the room is/isn't rented out" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36SupplyAirTemperatureSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 30 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Supply air temperature operation following the Guideline 36 recommendations" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the supply air temperature setpoint of a system follows the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.2 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.2 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "oa_t", + "t_max", + "sa_t_sp_ac", + "oa_t_min", + "oa_t_max", + "min_clg_sa_t_sp", + "max_clg_sa_t_sp", + "sa_sp_tol" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "oa_t": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air temperature" + ] + }, + "t_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum supply air temperature setpoint based on requests" + ] + }, + "sa_t_sp_ac": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Actual supply air temperature setpoint" + ] + }, + "oa_t_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum outdoor air temperature for linear SAT reset" + ] + }, + "oa_t_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum outdoor air temperature for linear SAT reset" + ] + }, + "min_clg_sa_t_sp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum cooling supply air temperature setpoint" + ] + }, + "max_clg_sa_t_sp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum cooling supply air temperature setpoint" + ] + }, + "sa_sp_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply air temperature tolerance" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "oa_t": "Outdoor air temperature", + "t_max": "Maximum supply air temperature setpoint based on requests", + "sa_t_sp_ac": "Actual supply air temperature setpoint", + "oa_t_min": "Minimum outdoor air temperature for linear SAT reset", + "oa_t_max": "Maximum outdoor air temperature for linear SAT reset", + "min_clg_sa_t_sp": "Minimum cooling supply air temperature setpoint", + "max_clg_sa_t_sp": "Maximum cooling supply air temperature setpoint", + "sa_sp_tol": "supply air temperature tolerance" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if t_max \u003e max_clg_sa_t_sp", + " fail", + "end", + "", + "switch operation_mode", + "case 'cooldown'", + " sa_t_sp = min_clg_sa_t_sp", + "case 'warmup', 'setback", + " sa_t_sp = 35 # 95 F", + "case 'occupied', 'setup'", + " if oa_t \u003c= oa_t_min", + " sa_t_sp = t_max", + " else if oa_t \u003e= oa_t_max", + " sa_t_sp = min_clg_sa_t_sp", + " else", + " sa_t_sp = (oa_t - oa_t_min) * (t_max - min_clg_sa_t_sp) / (oa_t_min - oa_t_max) + t_max ", + "# linear interpolation", + " end", + "if abs(sa_t_sp - sa_t_s_ac) \u003c sa_sp_tol", + " pass", + "else" + ] + }, + "examples": [ + ["if t_max \u003e max_clg_sa_t_sp", + " fail", + "end", + "", + "switch operation_mode", + "case 'cooldown'", + " sa_t_sp = min_clg_sa_t_sp", + "case 'warmup', 'setback", + " sa_t_sp = 35 # 95 F", + "case 'occupied', 'setup'", + " if oa_t \u003c= oa_t_min", + " sa_t_sp = t_max", + " else if oa_t \u003e= oa_t_max", + " sa_t_sp = min_clg_sa_t_sp", + " else", + " sa_t_sp = (oa_t - oa_t_min) * (t_max - min_clg_sa_t_sp) / (oa_t_min - oa_t_max) + t_max ", + "# linear interpolation", + " end", + "end", + "", + "if abs(sa_t_sp - sa_t_s_ac) \u003c sa_sp_tol", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 30, + "description_brief": "Supply air temperature operation following the Guideline 36 recommendations", + "description_detail": "Verify that the supply air temperature setpoint of a system follows the Guideline 36 recommendations", + "description_index": [ + "Section 5.16.2.2 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "oa_t": "Outdoor air temperature", + "t_max": "Maximum supply air temperature setpoint based on requests", + "sa_t_sp_ac": "Actual supply air temperature setpoint", + "oa_t_min": "Minimum outdoor air temperature for linear SAT reset", + "oa_t_max": "Maximum outdoor air temperature for linear SAT reset", + "min_clg_sa_t_sp": "Minimum cooling supply air temperature setpoint", + "max_clg_sa_t_sp": "Maximum cooling supply air temperature setpoint", + "sa_sp_tol": "supply air temperature tolerance" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if t_max \u003e max_clg_sa_t_sp", + " fail", + "end", + "", + "switch operation_mode", + "case 'cooldown'", + " sa_t_sp = min_clg_sa_t_sp", + "case 'warmup', 'setback", + " sa_t_sp = 35 # 95 F", + "case 'occupied', 'setup'", + " if oa_t \u003c= oa_t_min", + " sa_t_sp = t_max", + " else if oa_t \u003e= oa_t_max", + " sa_t_sp = min_clg_sa_t_sp", + " else", + " sa_t_sp = (oa_t - oa_t_min) * (t_max - min_clg_sa_t_sp) / (oa_t_min - oa_t_max) + t_max ", + "# linear interpolation", + " end", + "end", + "", + "if abs(sa_t_sp - sa_t_s_ac) \u003c sa_sp_tol", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36SimultaneousHeatingCooling": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 31 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verifiy that both the heating and cooling coil are not operating at the same time" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "heating_output", + "cooling_output" + ], + "properties": { + "heating_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU heating coil output" + ] + }, + "cooling_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU cooling coil output" + ] + } + }, + "examples": [{ + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if heating_output \u003e 0 and cooling_output \u003e 0", + " fail", + "else", + " pass", + "end" + ] + }, + "examples": [ + ["if heating_output \u003e 0 and cooling_output \u003e 0", + " fail", + "else", + " pass", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 31, + "description_brief": "Verifiy that both the heating and cooling coil are not operating at the same time", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if heating_output \u003e 0 and cooling_output \u003e 0", + " fail", + "else", + " pass", + "end" + ] + }] + }, + "G36ReturnAirDamperPositionForReliefDamperOrFan": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 32 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the return air damper operation follows Guideline 36 recommendations for systems with relief damper/fan" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "max_ra_p", + "ra_p_tol", + "ra_p", + "oa_p", + "max_oa_p" + ], + "properties": { + "max_ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum return air damper position" + ] + }, + "ra_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position tolerance" + ] + }, + "ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position" + ] + }, + "oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position" + ] + }, + "max_oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum outdoor air damper position" + ] + } + }, + "examples": [{ + "max_ra_p": "Maximum return air damper position", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position", + "oa_p": "Outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if heating_output \u003e 0", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(ra_p - 0) \u003c ra_p_tol", + "else if oa_p \u003c max_oa_p", + "else if abs(oa - max_oa_p) \u003c oa_p_tol", + " if ra_p \u003c max_ra_p", + "end" + ] + }, + "examples": [ + ["if heating_output \u003e 0", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(ra_p - 0) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if oa_p \u003c max_oa_p", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(oa - max_oa_p) \u003c oa_p_tol", + " if ra_p \u003c max_ra_p", + " pass", + " else", + " fail", + " end", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 32, + "description_brief": "Verify that the return air damper operation follows Guideline 36 recommendations for systems with relief damper/fan", + "description_detail": "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "max_ra_p": "Maximum return air damper position", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position", + "oa_p": "Outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if heating_output \u003e 0", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(ra_p - 0) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if oa_p \u003c max_oa_p", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(oa - max_oa_p) \u003c oa_p_tol", + " if ra_p \u003c max_ra_p", + " pass", + " else", + " fail", + " end", + "end" + ] + }] + }, + "G36OutdoorAirDamperPositionForReliefDamperOrFan": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 33 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with relief damper/fan" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "heating_output", + "cooling_output", + "economizer_high_limit_reached", + "oa_p", + "min_oa_p", + "max_oa_p", + "oa_p_tol", + "ra_p_tol", + "ra_p", + "max_ra_p" + ], + "properties": { + "heating_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU heating coil output" + ] + }, + "cooling_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU cooling coil output" + ] + }, + "economizer_high_limit_reached": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Economizer high limit flag" + ] + }, + "oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position" + ] + }, + "min_oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum outdoor air damper position" + ] + }, + "max_oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum outdoor air damper position" + ] + }, + "oa_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position tolerance" + ] + }, + "ra_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position tolerance" + ] + }, + "ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position" + ] + }, + "max_ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum return air damper position" + ] + } + }, + "examples": [{ + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "economizer_high_limit_reached": "Economizer high limit flag", + "oa_p": "Outdoor air damper position", + "min_oa_p": "Minimum outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position", + "oa_p_tol": "Outdoor air damper position tolerance", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position", + "max_ra_p": "Maximum return air damper position" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if heating_output \u003e 0", + " if abs(oa_p - min_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if economizer_high_limit_reached", + " if abs(oa_p - min_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + " if abs(oa_p - max_oa_p) \u003c oa_p_tol", + "else if ra_p \u003c max_ra_p", + " if abs(oa_p - max_oa_p) \u003c oa_p_tol", + "else if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " if min_oa_p \u003c oa_p \u003c max_oa_p", + "end" + ] + }, + "examples": [ + ["if heating_output \u003e 0", + " if abs(oa_p - min_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if economizer_high_limit_reached", + " if abs(oa_p - min_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + " else", + " if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + " end", + "else if ra_p \u003c max_ra_p", + " if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " if min_oa_p \u003c oa_p \u003c max_oa_p", + " pass", + " else", + " fail", + " end", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 33, + "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with relief damper/fan", + "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "economizer_high_limit_reached": "Economizer high limit flag", + "oa_p": "Outdoor air damper position", + "min_oa_p": "Minimum outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position", + "oa_p_tol": "Outdoor air damper position tolerance", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position", + "max_ra_p": "Maximum return air damper position" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if heating_output \u003e 0", + " if abs(oa_p - min_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if economizer_high_limit_reached", + " if abs(oa_p - min_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + " else", + " if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + " end", + "else if ra_p \u003c max_ra_p", + " if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " if min_oa_p \u003c oa_p \u003c max_oa_p", + " pass", + " else", + " fail", + " end", + "end" + ] + }] + }, + "G36ReturnAirDamperPositionForReturnFanAirflowTracking": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 34 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "heating_output", + "cooling_output", + "max_ra_p", + "ra_p_tol", + "ra_p", + "rea_p" + ], + "properties": { + "heating_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU heating coil output" + ] + }, + "cooling_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU cooling coil output" + ] + }, + "max_ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum return air damper position" + ] + }, + "ra_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position tolerance" + ] + }, + "ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position" + ] + }, + "rea_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Relief air damper position" + ] + } + }, + "examples": [{ + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "max_ra_p": "Maximum return air damper position", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position", + "rea_p": "Relief air damper position" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 34, + "description_brief": "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking", + "description_detail": "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "max_ra_p": "Maximum return air damper position", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position", + "rea_p": "Relief air damper position" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "G36OutdoorAirDamperPositionForReturnFanAirflowTracking": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 35 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "oa_p", + "max_oa_p", + "oa_p_tol" + ], + "properties": { + "oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position" + ] + }, + "max_oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum outdoor air damper position" + ] + }, + "oa_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position tolerance" + ] + } + }, + "examples": [{ + "oa_p": "Outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position", + "oa_p_tol": "Outdoor air damper position tolerance" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 35, + "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking", + "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "oa_p": "Outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position", + "oa_p_tol": "Outdoor air damper position tolerance" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36ReliefAirDamperPositionForReturnFanAirflowTracking": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 36 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "heating_output", + "cooling_output", + "max_rea_p", + "rea_p_tol", + "rea_p", + "ra_p" + ], + "properties": { + "heating_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU heating coil output" + ] + }, + "cooling_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU cooling coil output" + ] + }, + "max_rea_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum return air damper position" + ] + }, + "rea_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position tolerance" + ] + }, + "rea_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position" + ] + }, + "ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Relief air damper position" + ] + } + }, + "examples": [{ + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "max_rea_p": "Maximum return air damper position", + "rea_p_tol": "Return air damper position tolerance", + "rea_p": "Return air damper position", + "ra_p": "Relief air damper position" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if heating_output \u003e 0", + " if abs(rea_p - 0) \u003c rea_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(rea_p - max_rea_p) \u003c rea_p_tol", + "else if abs(rea_p - (1 - ra_p) * max_rea_p) \u003c rea_p_tol", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["if heating_output \u003e 0", + " if abs(rea_p - 0) \u003c rea_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(rea_p - max_rea_p) \u003c rea_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(rea_p - (1 - ra_p) * max_rea_p) \u003c rea_p_tol", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 36, + "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking", + "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "max_rea_p": "Maximum return air damper position", + "rea_p_tol": "Return air damper position tolerance", + "rea_p": "Return air damper position", + "ra_p": "Relief air damper position" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if heating_output \u003e 0", + " if abs(rea_p - 0) \u003c rea_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(rea_p - max_rea_p) \u003c rea_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(rea_p - (1 - ra_p) * max_rea_p) \u003c rea_p_tol", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36ReturnAirDamperPositionForReturnFanDirectBuildingPressure": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 37 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "heating_output", + "cooling_output", + "max_ra_p", + "ra_p_tol", + "ra_p" + ], + "properties": { + "heating_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU heating coil output" + ] + }, + "cooling_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU cooling coil output" + ] + }, + "max_ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum return air damper position" + ] + }, + "ra_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position tolerance" + ] + }, + "ra_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Return air damper position" + ] + } + }, + "examples": [{ + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "max_ra_p": "Maximum return air damper position", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if heating_output \u003e 0", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(ra_p - 0) \u003c ra_p_tol", + "else if abs(ra_p - (1 - rea_p) * max_ra_p) \u003c ra_p_tol", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["if heating_output \u003e 0", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(ra_p - 0) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(ra_p - (1 - rea_p) * max_ra_p) \u003c ra_p_tol", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 37, + "description_brief": "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control", + "description_detail": "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "heating_output": "AHU heating coil output", + "cooling_output": "AHU cooling coil output", + "max_ra_p": "Maximum return air damper position", + "ra_p_tol": "Return air damper position tolerance", + "ra_p": "Return air damper position" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if heating_output \u003e 0", + " if abs(ra_p - max_ra_p) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if cooling_output \u003e 0", + " if abs(ra_p - 0) \u003c ra_p_tol", + " pass", + " else", + " fail", + " end", + "else if abs(ra_p - (1 - rea_p) * max_ra_p) \u003c ra_p_tol", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36OutdoorAirDamperPositionForReturnFanDirectBuildingPressure": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_detail", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 38 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control" + ] + }, + "description_detail": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "oa_p", + "max_oa_p", + "oa_p_tol" + ], + "properties": { + "oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position" + ] + }, + "max_oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum outdoor air damper position" + ] + }, + "oa_p_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air damper position tolerance" + ] + } + }, + "examples": [{ + "oa_p": "Outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position", + "oa_p_tol": "Outdoor air damper position tolerance" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 38, + "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control", + "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", + "description_index": [ + "Section 5.16.2.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "oa_p": "Outdoor air damper position", + "max_oa_p": "Maximum outdoor air damper position", + "oa_p_tol": "Outdoor air damper position tolerance" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if abs(oa_p - max_oa_p) \u003c oa_p_tol", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36FreezeProtectionStage1": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 39 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 freeze protection stage 1 requirements" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.12.1. in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.12.1. in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "supply_air_temp", + "outdoor_damper_command", + "outdoor_damper_minimum" + ], + "properties": { + "supply_air_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply air temperature" + ] + }, + "outdoor_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air damper" + ] + }, + "outdoor_damper_minimum": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air damper minimum position" + ] + } + }, + "examples": [{ + "supply_air_temp": "supply air temperature", + "outdoor_damper_command": "outdoor air damper", + "outdoor_damper_minimum": "outdoor air damper minimum position" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if supply_air_temp \u003c 4.4 (continuously 5 minutes) and outdoor_damper_command \u003e outdoor_damper_minimum:", + " fail", + "elif outdoor_damper_command \u003e outdoor_damper_minimum and not (supply_air_temp \u003e 7 (continuously 5 minutes)):", + "else:", + " pass", + "", + "if never (supply_air_temp \u003c 4.4 (continuously 5 minutes)):", + " untested" + ] + }, + "examples": [ + ["if supply_air_temp \u003c 4.4 (continuously 5 minutes) and outdoor_damper_command \u003e outdoor_damper_minimum:", + " fail", + "elif outdoor_damper_command \u003e outdoor_damper_minimum and not (supply_air_temp \u003e 7 (continuously 5 minutes)):", + " fail", + "else:", + " pass", + "", + "if never (supply_air_temp \u003c 4.4 (continuously 5 minutes)):", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 39, + "description_brief": "G36 freeze protection stage 1 requirements", + "description_index": [ + "Section 5.16.12.1. in Guideline 36-2021" + ], + "description_datapoints": { + "supply_air_temp": "supply air temperature", + "outdoor_damper_command": "outdoor air damper", + "outdoor_damper_minimum": "outdoor air damper minimum position" + }, + "description_assertions": [ + "if supply_air_temp \u003c 4.4 (continuously 5 minutes) and outdoor_damper_command \u003e outdoor_damper_minimum:", + " fail", + "elif outdoor_damper_command \u003e outdoor_damper_minimum and not (supply_air_temp \u003e 7 (continuously 5 minutes)):", + " fail", + "else:", + " pass", + "", + "if never (supply_air_temp \u003c 4.4 (continuously 5 minutes)):", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36FreezeProtectionStage2": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 40 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 freeze protection stage 2 requirements" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.12.2. in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.12.2. in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "supply_air_temp", + "outdoor_damper_command" + ], + "properties": { + "supply_air_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply air temperature" + ] + }, + "outdoor_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air damper" + ] + } + }, + "examples": [{ + "supply_air_temp": "supply air temperature", + "outdoor_damper_command": "outdoor air damper" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if supply_air_temp \u003c 3.3 (continuously 5 minutes) and outdoor_damper_command \u003e 0 (ever in the following hour):", + " fail", + "else:", + " pass", + "if never (supply_air_temp \u003c 3.3 (continuously 5 minutes)):", + " untested" + ] + }, + "examples": [ + ["if supply_air_temp \u003c 3.3 (continuously 5 minutes) and outdoor_damper_command \u003e 0 (ever in the following hour):", + " fail", + "else:", + " pass", + "if never (supply_air_temp \u003c 3.3 (continuously 5 minutes)):", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 40, + "description_brief": "G36 freeze protection stage 2 requirements", + "description_index": [ + "Section 5.16.12.2. in Guideline 36-2021" + ], + "description_datapoints": { + "supply_air_temp": "supply air temperature", + "outdoor_damper_command": "outdoor air damper" + }, + "description_assertions": [ + "if supply_air_temp \u003c 3.3 (continuously 5 minutes) and outdoor_damper_command \u003e 0 (ever in the following hour):", + " fail", + "else:", + " pass", + "if never (supply_air_temp \u003c 3.3 (continuously 5 minutes)):", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36FreezeProtectionStage3": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 41 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 freeze protection stage 3 (highest) requirements" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.12.3. in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.12.3. in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "freeze_stat", + "supply_air_temp", + "outdoor_damper_command", + "supply_fan_status", + "return_fan_status", + "relief_fan_status", + "cooling_coil_command", + "heating_coil_command" + ], + "properties": { + "freeze_stat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(optional, set to False if system does not have it) binary freeze-stat" + ] + }, + "supply_air_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply air temperature" + ] + }, + "outdoor_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air damper" + ] + }, + "supply_fan_status": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply fan status (speed): [1, 0] (can be replaced by binary or numeric variables)" + ] + }, + "return_fan_status": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(optional, set to False if system does not have it) return fan status (speed)" + ] + }, + "relief_fan_status": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "(optional, set to False if system does not have it) relief fan status (speed)" + ] + }, + "cooling_coil_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "cooling coil command" + ] + }, + "heating_coil_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "heating coil command" + ] + } + }, + "examples": [{ + "freeze_stat": "(optional, set to False if system does not have it) binary freeze-stat", + "supply_air_temp": "supply air temperature", + "outdoor_damper_command": "outdoor air damper", + "supply_fan_status": "supply fan status (speed): [1, 0] (can be replaced by binary or numeric variables)", + "return_fan_status": "(optional, set to False if system does not have it) return fan status (speed)", + "relief_fan_status": "(optional, set to False if system does not have it) relief fan status (speed)", + "cooling_coil_command": "cooling coil command", + "heating_coil_command": "heating coil command" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if supply_air_temp \u003c 3.3 (continuously 15 minutes) or", + " supply_air_temp \u003c 1 (continuously 5 minutes) or", + " freeze_stat == True", + " if not (", + " outdoor_damper_command == 0 and", + " supply_fan_status == 'off' and", + " return_fan_status == 'off' and", + " relief_fan_status == 'off' and", + " cooling_coil_command == 100 and", + " heating_coil_command \u003e 0", + " ):", + " fail", + " else:", + " pass", + "if never (", + " supply_air_temp \u003c 3.3 (continuously 15 minutes) or", + "):", + " untested" + ] + }, + "examples": [ + ["if supply_air_temp \u003c 3.3 (continuously 15 minutes) or", + " supply_air_temp \u003c 1 (continuously 5 minutes) or", + " freeze_stat == True", + " if not (", + " outdoor_damper_command == 0 and", + " supply_fan_status == 'off' and", + " return_fan_status == 'off' and", + " relief_fan_status == 'off' and", + " cooling_coil_command == 100 and", + " heating_coil_command \u003e 0", + " ):", + " fail", + " else:", + " pass", + "if never (", + " supply_air_temp \u003c 3.3 (continuously 15 minutes) or", + " supply_air_temp \u003c 1 (continuously 5 minutes) or", + " freeze_stat == True", + "):", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 41, + "description_brief": "G36 freeze protection stage 3 (highest) requirements", + "description_index": [ + "Section 5.16.12.3. in Guideline 36-2021" + ], + "description_datapoints": { + "freeze_stat": "(optional, set to False if system does not have it) binary freeze-stat", + "supply_air_temp": "supply air temperature", + "outdoor_damper_command": "outdoor air damper", + "supply_fan_status": "supply fan status (speed): [1, 0] (can be replaced by binary or numeric variables)", + "return_fan_status": "(optional, set to False if system does not have it) return fan status (speed)", + "relief_fan_status": "(optional, set to False if system does not have it) relief fan status (speed)", + "cooling_coil_command": "cooling coil command", + "heating_coil_command": "heating coil command" + }, + "description_assertions": [ + "if supply_air_temp \u003c 3.3 (continuously 15 minutes) or", + " supply_air_temp \u003c 1 (continuously 5 minutes) or", + " freeze_stat == True", + " if not (", + " outdoor_damper_command == 0 and", + " supply_fan_status == 'off' and", + " return_fan_status == 'off' and", + " relief_fan_status == 'off' and", + " cooling_coil_command == 100 and", + " heating_coil_command \u003e 0", + " ):", + " fail", + " else:", + " pass", + "if never (", + " supply_air_temp \u003c 3.3 (continuously 15 minutes) or", + " supply_air_temp \u003c 1 (continuously 5 minutes) or", + " freeze_stat == True", + "):", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36MinOAwEconomizer": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 42 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 minimum outdoor air control when economizer is active" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16 in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16 in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "outdoor_air_temp", + "economizer_high_limit_sp", + "outdoor_damper_command", + "min_oa_p", + "min_oa_sp", + "outdoor_air_flow", + "sys_mode" + ], + "properties": { + "outdoor_air_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air temperature" + ] + }, + "economizer_high_limit_sp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "economizer lockout high limit set point" + ] + }, + "outdoor_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air damper command" + ] + }, + "min_oa_p": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "minimum outdoor air damper position set point" + ] + }, + "min_oa_sp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "minimum outdoor air flow rate setpoint" + ] + }, + "outdoor_air_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air flow rate" + ] + }, + "sys_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + ] + } + }, + "examples": [{ + "outdoor_air_temp": "outdoor air temperature", + "economizer_high_limit_sp": "economizer lockout high limit set point", + "outdoor_damper_command": "outdoor air damper command", + "min_oa_p": "minimum outdoor air damper position set point", + "min_oa_sp": "minimum outdoor air flow rate setpoint", + "outdoor_air_flow": "outdoor air flow rate", + "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if not economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", + " if oudoor_damper_command \u003e= MinOA-P and outdoor_air_flow \u003e= MinOAsp:", + " pass", + " else:", + " fail", + "else:", + " untested" + ] + }, + "examples": [ + ["if not economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", + " if oudoor_damper_command \u003e= MinOA-P and outdoor_air_flow \u003e= MinOAsp:", + " pass", + " else:", + " fail", + "else:", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 42, + "description_brief": "G36 minimum outdoor air control when economizer is active", + "description_index": [ + "Section 5.16 in Guideline 36-2021" + ], + "description_datapoints": { + "outdoor_air_temp": "outdoor air temperature", + "economizer_high_limit_sp": "economizer lockout high limit set point", + "outdoor_damper_command": "outdoor air damper command", + "min_oa_p": "minimum outdoor air damper position set point", + "min_oa_sp": "minimum outdoor air flow rate setpoint", + "outdoor_air_flow": "outdoor air flow rate", + "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + }, + "description_assertions": [ + "if not economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", + " if oudoor_damper_command \u003e= MinOA-P and outdoor_air_flow \u003e= MinOAsp:", + " pass", + " else:", + " fail", + "else:", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36MinOAwoEconomizer": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 43 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 minimum outdoor air control when economizer is in lockout" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16 in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16 in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "outdoor_air_temp", + "economizer_high_limit_sp", + "outdoor_damper_command", + "return_damper_command", + "outdoor_air_flow", + "min_oa_sp", + "sys_mode" + ], + "properties": { + "outdoor_air_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air temperature" + ] + }, + "economizer_high_limit_sp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "economizer lockout high limit set point" + ] + }, + "outdoor_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air damper command" + ] + }, + "return_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "return air damper command" + ] + }, + "outdoor_air_flow": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "outdoor air flow rate" + ] + }, + "min_oa_sp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "minimum outdoor air flow rate setpoint" + ] + }, + "sys_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + ] + } + }, + "examples": [{ + "outdoor_air_temp": "outdoor air temperature", + "economizer_high_limit_sp": "economizer lockout high limit set point", + "outdoor_damper_command": "outdoor air damper command", + "return_damper_command": "return air damper command", + "outdoor_air_flow": "outdoor air flow rate", + "min_oa_sp": "minimum outdoor air flow rate setpoint", + "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", + " if outdoor_air_flow \u003c MinOAsp (continuously (e.g. fall below the sp for a consecutive 1 hr)):", + " if outdoor_damper_command == 100 and return_damper_command == 0:", + " pass", + " else:", + " fail", + " elif outdoor_air_flow \u003e MinOAsp (continuously):", + " if outdoor_damper_command == 0 and return_damper_command == 100:", + " else:", + " pass (essentially untested yet)", + "else:", + " untested" + ] + }, + "examples": [ + ["if economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", + " if outdoor_air_flow \u003c MinOAsp (continuously (e.g. fall below the sp for a consecutive 1 hr)):", + " if outdoor_damper_command == 100 and return_damper_command == 0:", + " pass", + " else:", + " fail", + " elif outdoor_air_flow \u003e MinOAsp (continuously):", + " if outdoor_damper_command == 0 and return_damper_command == 100:", + " pass", + " else:", + " fail", + " else:", + " pass (essentially untested yet)", + "else:", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 43, + "description_brief": "G36 minimum outdoor air control when economizer is in lockout", + "description_index": [ + "Section 5.16 in Guideline 36-2021" + ], + "description_datapoints": { + "outdoor_air_temp": "outdoor air temperature", + "economizer_high_limit_sp": "economizer lockout high limit set point", + "outdoor_damper_command": "outdoor air damper command", + "return_damper_command": "return air damper command", + "outdoor_air_flow": "outdoor air flow rate", + "min_oa_sp": "minimum outdoor air flow rate setpoint", + "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + }, + "description_assertions": [ + "if economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", + " if outdoor_air_flow \u003c MinOAsp (continuously (e.g. fall below the sp for a consecutive 1 hr)):", + " if outdoor_damper_command == 100 and return_damper_command == 0:", + " pass", + " else:", + " fail", + " elif outdoor_air_flow \u003e MinOAsp (continuously):", + " if outdoor_damper_command == 0 and return_damper_command == 100:", + " pass", + " else:", + " fail", + " else:", + " pass (essentially untested yet)", + "else:", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36OutputChangeRateLimit": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 44 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 requirement of controller command change rate limit" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.1.9 in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.1.9 in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "command", + "max_rate_of_change_per_min" + ], + "properties": { + "command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "control command to be verified with command range being (0-100)" + ] + }, + "max_rate_of_change_per_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "control loop output maximum rate of change, default to 25." + ] + } + }, + "examples": [{ + "command": "control command to be verified with command range being (0-100)", + "max_rate_of_change_per_min": "control loop output maximum rate of change, default to 25." + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if abs(command(current_t) - command(prev_t)) \u003e max_rage_of_change_per_min and (current_t - prev_t \u003c= 1 minute):", + " fail", + "else:", + " pass" + ] + }, + "examples": [ + ["if abs(command(current_t) - command(prev_t)) \u003e max_rage_of_change_per_min and (current_t - prev_t \u003c= 1 minute):", + " fail", + "else:", + " pass" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 44, + "description_brief": "G36 requirement of controller command change rate limit", + "description_index": [ + "Section 5.1.9 in Guideline 36-2021" + ], + "description_datapoints": { + "command": "control command to be verified with command range being (0-100)", + "max_rate_of_change_per_min": "control loop output maximum rate of change, default to 25." + }, + "description_assertions": [ + "if abs(command(current_t) - command(prev_t)) \u003e max_rage_of_change_per_min and (current_t - prev_t \u003c= 1 minute):", + " fail", + "else:", + " pass" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36ReliefDamperStatus": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 45 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 relief dampers shall be enabled when the associated supply fan is proven ON, and disabled otherwise." + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.8.1 in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.8.1 in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "relief_damper_command", + "supply_fan_status" + ], + "properties": { + "relief_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "relief damper opening (0-100)" + ] + }, + "supply_fan_status": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" + ] + } + }, + "examples": [{ + "relief_damper_command": "relief damper opening (0-100)", + "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if relief_damper_command \u003e 0 and supply_fan_status == 'on':", + " pass", + "elif supply_fan_status == 'off' and relief_damper_command == 0:", + "else:", + " fail", + "if not ['on', 'off'] in supply_fan_status:", + " untested" + ] + }, + "examples": [ + ["if relief_damper_command \u003e 0 and supply_fan_status == 'on':", + " pass", + "elif supply_fan_status == 'off' and relief_damper_command == 0:", + " pass", + "else:", + " fail", + "if not ['on', 'off'] in supply_fan_status:", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 45, + "description_brief": "G36 relief dampers shall be enabled when the associated supply fan is proven ON, and disabled otherwise.", + "description_index": [ + "Section 5.16.8.1 in Guideline 36-2021" + ], + "description_datapoints": { + "relief_damper_command": "relief damper opening (0-100)", + "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" + }, + "description_assertions": [ + "if relief_damper_command \u003e 0 and supply_fan_status == 'on':", + " pass", + "elif supply_fan_status == 'off' and relief_damper_command == 0:", + " pass", + "else:", + " fail", + "if not ['on', 'off'] in supply_fan_status:", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "G36SupplyFanStatus": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 46 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "G36 supply fan on/off requirements" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.16.1.1. in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.16.1.1. in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "sys_mode", + "has_reheat_box_on_perimeter_zones", + "supply_fan_status" + ], + "properties": { + "sys_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" + ] + }, + "has_reheat_box_on_perimeter_zones": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "binary flag of If there are any VAV-reheat boxes on perimeter zones." + ] + }, + "supply_fan_status": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" + ] + } + }, + "examples": [{ + "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']", + "has_reheat_box_on_perimeter_zones": "binary flag of If there are any VAV-reheat boxes on perimeter zones.", + "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if has_reheat_box_on_perimeter_zones == True:", + " if sys_mode != 'unoccupied' and supply_fan_status == 'off':", + " fail", + "", + "else:", + " if sys_mode in ['occupied', 'setup', 'cooldown'] and supply_fan_staus == 'off':", + "if ['occupied', 'unoccupied'] in sys_mode:", + " pass", + " untested" + ] + }, + "examples": [ + ["if has_reheat_box_on_perimeter_zones == True:", + " if sys_mode != 'unoccupied' and supply_fan_status == 'off':", + " fail", + "", + "else:", + " if sys_mode in ['occupied', 'setup', 'cooldown'] and supply_fan_staus == 'off':", + " fail", + "", + "if ['occupied', 'unoccupied'] in sys_mode:", + " pass", + "else:", + " untested" + ] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "rule-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 46, + "description_brief": "G36 supply fan on/off requirements", + "description_index": [ + "Section 5.16.1.1. in Guideline 36-2021" + ], + "description_datapoints": { + "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']", + "has_reheat_box_on_perimeter_zones": "binary flag of If there are any VAV-reheat boxes on perimeter zones.", + "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" + }, + "description_assertions": [ + "if has_reheat_box_on_perimeter_zones == True:", + " if sys_mode != 'unoccupied' and supply_fan_status == 'off':", + " fail", + "", + "else:", + " if sys_mode in ['occupied', 'setup', 'cooldown'] and supply_fan_staus == 'off':", + " fail", + "", + "if ['occupied', 'unoccupied'] in sys_mode:", + " pass", + "else:", + " untested" + ], + "description_verification_type": "rule-based", + "assertions_type": "pass" + }] + }, + "LocalLoopSetPointTracking": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 47 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Local Loop Performance Verification - Set Point Tracking" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "feedback_sensor", + "set_point" + ], + "properties": { + "feedback_sensor": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "feedback sensor reading of the subject to be controlled towards a set point" + ] + }, + "set_point": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "set point value" + ] + } + }, + "examples": [{ + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "With a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01), if the number of samples of which the error is larger than this threshold is beyond 5% of number of all samples, then this verification fails; Otherwise, it passes." + ] + }, + "examples": [ + [ + "With a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01), if the number of samples of which the error is larger than this threshold is beyond 5% of number of all samples, then this verification fails; Otherwise, it passes."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 47, + "description_brief": "Local Loop Performance Verification - Set Point Tracking", + "description_datapoints": { + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value" + }, + "description_assertions": [ + "With a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01), if the number of samples of which the error is larger than this threshold is beyond 5% of number of all samples, then this verification fails; Otherwise, it passes." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "LocalLoopUnmetHours": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 48 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Local Loop Performance Verification - Set Point Unmet Hours" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "feedback_sensor", + "set_point" + ], + "properties": { + "feedback_sensor": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "feedback sensor reading of the subject to be controlled towards a set point" + ] + }, + "set_point": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "set point value" + ] + } + }, + "examples": [{ + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Instead of checking the number of samples among the whole data set for which the set points are not met, this verification checks the total accumulated time that the set points are not met within a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01)." + ] + }, + "examples": [ + [ + "Instead of checking the number of samples among the whole data set for which the set points are not met, this verification checks the total accumulated time that the set points are not met within a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01)."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 48, + "description_brief": "Local Loop Performance Verification - Set Point Unmet Hours", + "description_datapoints": { + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value" + }, + "description_assertions": [ + "Instead of checking the number of samples among the whole data set for which the set points are not met, this verification checks the total accumulated time that the set points are not met within a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01)." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "LocalLoopSaturationDirectActingMax": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 49 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Local Loop Performance Verification - Direct Acting Loop Actuator Maximum Saturation" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "feedback_sensor", + "set_point", + "cmd", + "cmd_max" + ], + "properties": { + "feedback_sensor": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "feedback sensor reading of the subject to be controlled towards a set point" + ] + }, + "set_point": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "set point value" + ] + }, + "cmd": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "control command" + ] + }, + "cmd_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "control command range maximum value" + ] + } + }, + "examples": [{ + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value", + "cmd": "control command", + "cmd_max": "control command range maximum value" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "If the sensed data values are consistently above its set point, and after a default of 1 hour, the control command is still not saturated to maximum, then the verification fails; Otherwise, it passes." + ] + }, + "examples": [ + [ + "If the sensed data values are consistently above its set point, and after a default of 1 hour, the control command is still not saturated to maximum, then the verification fails; Otherwise, it passes."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 49, + "description_brief": "Local Loop Performance Verification - Direct Acting Loop Actuator Maximum Saturation", + "description_datapoints": { + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value", + "cmd": "control command", + "cmd_max": "control command range maximum value" + }, + "description_assertions": [ + "If the sensed data values are consistently above its set point, and after a default of 1 hour, the control command is still not saturated to maximum, then the verification fails; Otherwise, it passes." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "LocalLoopSaturationDirectActingMin": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 50 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Local Loop Performance Verification - Direct Acting Loop Actuator Minimum Saturation" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "feedback_sensor", + "set_point", + "cmd", + "cmd_min" + ], + "properties": { + "feedback_sensor": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "feedback sensor reading of the subject to be controlled towards a set point" + ] + }, + "set_point": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "set point value" + ] + }, + "cmd": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "control command" + ] + }, + "cmd_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "control command range minimum value" + ] + } + }, + "examples": [{ + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value", + "cmd": "control command", + "cmd_min": "control command range minimum value" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "If the sensed data values are consistently below its set point, and after a default of 1 hour, the control command is still not saturated to minimum, then the verification fails; Otherwise, it passes." + ] + }, + "examples": [ + [ + "If the sensed data values are consistently below its set point, and after a default of 1 hour, the control command is still not saturated to minimum, then the verification fails; Otherwise, it passes."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 50, + "description_brief": "Local Loop Performance Verification - Direct Acting Loop Actuator Minimum Saturation", + "description_datapoints": { + "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", + "set_point": "set point value", + "cmd": "control command", + "cmd_min": "control command range minimum value" + }, + "description_assertions": [ + "If the sensed data values are consistently below its set point, and after a default of 1 hour, the control command is still not saturated to minimum, then the verification fails; Otherwise, it passes." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "MZSystemOccupiedStandbyVentilationZoneControl": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 53 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Multizone system zone standby model ventilation control" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "zone_is_standby_mode", + "m_oa_requested_by_system", + "m_oa_zone_requirement" + ], + "properties": { + "zone_is_standby_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Flag indicating that the zone targeted by the verification is in occupied standby mode" + ] + }, + "m_oa_requested_by_system": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System outdoor air setpoint" + ] + }, + "m_oa_zone_requirement": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Outdoor air required by the targeted zone" + ] + } + }, + "examples": [{ + "zone_is_standby_mode": "Flag indicating that the zone targeted by the verification is in occupied standby mode", + "m_oa_requested_by_system": "System outdoor air setpoint", + "m_oa_zone_requirement": "Outdoor air required by the targeted zone" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "If the targted zone is in standby mode and if the difference between the outdoor air setpoint and the last reported outdoor air setpoint when the zone was not in standby mode is greater than the outdoor air required for the zone the verification passes, it otherwise fails." + ] + }, + "examples": [ + [ + "If the targted zone is in standby mode and if the difference between the outdoor air setpoint and the last reported outdoor air setpoint when the zone was not in standby mode is greater than the outdoor air required for the zone the verification passes, it otherwise fails."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 53, + "description_brief": "Multizone system zone standby model ventilation control", + "description_datapoints": { + "zone_is_standby_mode": "Flag indicating that the zone targeted by the verification is in occupied standby mode", + "m_oa_requested_by_system": "System outdoor air setpoint", + "m_oa_zone_requirement": "Outdoor air required by the targeted zone" + }, + "description_assertions": [ + "If the targted zone is in standby mode and if the difference between the outdoor air setpoint and the last reported outdoor air setpoint when the zone was not in standby mode is greater than the outdoor air required for the zone the verification passes, it otherwise fails." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "AppendixGHVACSystemFanOperation": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 54 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Verify HVAC system fan operation as per ASHRAE 90.1 Appendix G rules" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "o", + "fan_runtime_fraction", + "m_oa", + "tol_o" + ], + "properties": { + "o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Number of occupants" + ] + }, + "fan_runtime_fraction": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Fan runtime fraction (fraction of time the fan ran for the reported period)" + ] + }, + "m_oa": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System outdoor air flow rate" + ] + }, + "tol_o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + ] + } + }, + "examples": [{ + "o": "Number of occupants", + "fan_runtime_fraction": "Fan runtime fraction (fraction of time the fan ran for the reported period)", + "m_oa": "System outdoor air flow rate", + "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "If the system never provides outdoor air the verification is untested. The verification fails if the system fan is not continuously running during an occupied period, it passes if it does. The verification fails if the system is always operating continuously during occupied periods, it passes otherwise." + ] + }, + "examples": [ + [ + "If the system never provides outdoor air the verification is untested. The verification fails if the system fan is not continuously running during an occupied period, it passes if it does. The verification fails if the system is always operating continuously during occupied periods, it passes otherwise."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 54, + "description_brief": "Verify HVAC system fan operation as per ASHRAE 90.1 Appendix G rules", + "description_datapoints": { + "o": "Number of occupants", + "fan_runtime_fraction": "Fan runtime fraction (fraction of time the fan ran for the reported period)", + "m_oa": "System outdoor air flow rate", + "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + }, + "description_assertions": [ + "If the system never provides outdoor air the verification is untested. The verification fails if the system fan is not continuously running during an occupied period, it passes if it does. The verification fails if the system is always operating continuously during occupied periods, it passes otherwise." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "InteriorLightingControlAutomaticFullOff": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 55 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Interior lighting control automatic full off" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "o", + "total_lighting_power", + "lighted_floor_area", + "tol_o" + ], + "properties": { + "o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Number of occupants" + ] + }, + "total_lighting_power": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Reported total lighting power (not the design total lighting power)" + ] + }, + "lighted_floor_area": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Area lit by the device/system considered" + ] + }, + "tol_o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + ] + } + }, + "examples": [{ + "o": "Number of occupants", + "total_lighting_power": "Reported total lighting power (not the design total lighting power)", + "lighted_floor_area": "Area lit by the device/system considered", + "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "The algorithm verifies that the device/system doesn't serves more than 5,000 ft2 and that if it doesn't, if occupants are not present for at least 20 minutes, the lighting power of the device/system should be less or equal to 0.02 W/ft2, otherwise, the verification fails." + ] + }, + "examples": [ + [ + "The algorithm verifies that the device/system doesn't serves more than 5,000 ft2 and that if it doesn't, if occupants are not present for at least 20 minutes, the lighting power of the device/system should be less or equal to 0.02 W/ft2, otherwise, the verification fails."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 55, + "description_brief": "Interior lighting control automatic full off", + "description_datapoints": { + "o": "Number of occupants", + "total_lighting_power": "Reported total lighting power (not the design total lighting power)", + "lighted_floor_area": "Area lit by the device/system considered", + "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + }, + "description_assertions": [ + "The algorithm verifies that the device/system doesn't serves more than 5,000 ft2 and that if it doesn't, if occupants are not present for at least 20 minutes, the lighting power of the device/system should be less or equal to 0.02 W/ft2, otherwise, the verification fails." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ExteriorLightingControlDaylightOff": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 56 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Exterior lighting control occupancy sensing reduction" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "is_sun_up", + "daylight_sensed", + "daylight_setpoint", + "total_lighting_power" + ], + "properties": { + "is_sun_up": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Flag that indicates if the sun has risen" + ] + }, + "daylight_sensed": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Amount of daylight sensed by a sensor, this should be expressed in the same unit as the setpoint" + ] + }, + "daylight_setpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Daylight setpoint, or thresholds, used to determine if the exterior lighting system should be turned off" + ] + }, + "total_lighting_power": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Reported total lighting power (not the design total lighting power)" + ] + } + }, + "examples": [{ + "is_sun_up": "Flag that indicates if the sun has risen", + "daylight_sensed": "Amount of daylight sensed by a sensor, this should be expressed in the same unit as the setpoint", + "daylight_setpoint": "Daylight setpoint, or thresholds, used to determine if the exterior lighting system should be turned off", + "total_lighting_power": "Reported total lighting power (not the design total lighting power)" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "The algorithm verifies that the exterior lighting is off when the sun has risen, or when there is a sufficient amount of daylight. If the exterior lighting system is not off during these situation, the verification fails, otherwise it passes." + ] + }, + "examples": [ + [ + "The algorithm verifies that the exterior lighting is off when the sun has risen, or when there is a sufficient amount of daylight. If the exterior lighting system is not off during these situation, the verification fails, otherwise it passes."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 56, + "description_brief": "Exterior lighting control occupancy sensing reduction", + "description_datapoints": { + "is_sun_up": "Flag that indicates if the sun has risen", + "daylight_sensed": "Amount of daylight sensed by a sensor, this should be expressed in the same unit as the setpoint", + "daylight_setpoint": "Daylight setpoint, or thresholds, used to determine if the exterior lighting system should be turned off", + "total_lighting_power": "Reported total lighting power (not the design total lighting power)" + }, + "description_assertions": [ + "The algorithm verifies that the exterior lighting is off when the sun has risen, or when there is a sufficient amount of daylight. If the exterior lighting system is not off during these situation, the verification fails, otherwise it passes." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "ExteriorLightingControlOccupancySensingReduction": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_datapoints", + "description_assertions", + "description_verification_type", + "assertions_type" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 57 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Exterior lighting control occupancy sensing reduction" + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "o", + "total_lighting_power", + "tol_o" + ], + "properties": { + "o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Number of occupants" + ] + }, + "total_lighting_power": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Reported total lighting power (not the design total lighting power)" + ] + }, + "tol_o": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + ] + } + }, + "examples": [{ + "o": "Number of occupants", + "total_lighting_power": "Reported total lighting power (not the design total lighting power)", + "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + }] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "The algorithm verifies that the exterior lighting is controlled based on occupancy. It fails if the maximum reported total lighting power is greater than 1500 W and if the total mnaximum lighting power is not reduced by half when occupancy has not been detected for 15 mins. Otherwise, it passes." + ] + }, + "examples": [ + [ + "The algorithm verifies that the exterior lighting is controlled based on occupancy. It fails if the maximum reported total lighting power is greater than 1500 W and if the total mnaximum lighting power is not reduced by half when occupancy has not been detected for 15 mins. Otherwise, it passes."] + ] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + } + }, + "examples": [{ + "library_item_id": 57, + "description_brief": "Exterior lighting control occupancy sensing reduction", + "description_datapoints": { + "o": "Number of occupants", + "total_lighting_power": "Reported total lighting power (not the design total lighting power)", + "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" + }, + "description_assertions": [ + "The algorithm verifies that the exterior lighting is controlled based on occupancy. It fails if the maximum reported total lighting power is greater than 1500 W and if the total mnaximum lighting power is not reduced by half when occupancy has not been detected for 15 mins. Otherwise, it passes." + ], + "description_verification_type": "procedure-based", + "assertions_type": "pass" + }] + }, + "G36CoolingOnlyTerminalBoxCoolingAirflowSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 58 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling only terminal box airflow control when the zone state is cooling following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.5.5.1 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.5.5.1 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_cool_max", + "v_min", + "v_spt" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_cool_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum cooling airflow setpoint" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Maximum cooling airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "switch operation_mode", + "case 'occupied'", + " cooling_maximum = v_cool_max", + " minimum = v_min", + "case 'cooldown', 'setup'", + " minimum = 0", + "case 'warmup', 'setback', 'unoccupied'", + " cooling_maximum = 0", + "", + "if minimum \u003c= v_spt \u003c= cooling_maximum", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["switch operation_mode", + "case 'occupied'", + " cooling_maximum = v_cool_max", + " minimum = v_min", + "case 'cooldown', 'setup'", + " cooling_maximum = v_cool_max", + " minimum = 0", + "case 'warmup', 'setback', 'unoccupied'", + " cooling_maximum = 0", + " minimum = 0", + "", + "if minimum \u003c= v_spt \u003c= cooling_maximum", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 58, + "description_brief": "Cooling only terminal box airflow control when the zone state is cooling following the Guideline 36 recommendations", + "description_index": [ + "Section 5.5.5.1 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Maximum cooling airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "switch operation_mode", + "case 'occupied'", + " cooling_maximum = v_cool_max", + " minimum = v_min", + "case 'cooldown', 'setup'", + " cooling_maximum = v_cool_max", + " minimum = 0", + "case 'warmup', 'setback', 'unoccupied'", + " cooling_maximum = 0", + " minimum = 0", + "", + "if minimum \u003c= v_spt \u003c= cooling_maximum", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36CoolingOnlyTerminalBoxDeadbandAirflowSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 59 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling only terminal box airflow control when the zone state is deadband following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.5.5.2 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.5.5.2 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_min", + "v_spt", + "v_spt_tol" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + }, + "v_spt_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Airflow setpoint tolerance" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "switch operation_mode", + "case 'occupied'", + " minimum = v_min", + "case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + "", + "if abs(v_spt - minimum) \u003c= v_spt_tol", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["switch operation_mode", + "case 'occupied'", + " minimum = v_min", + "case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + "", + "if abs(v_spt - minimum) \u003c= v_spt_tol", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 59, + "description_brief": "Cooling only terminal box airflow control when the zone state is deadband following the Guideline 36 recommendations", + "description_index": [ + "Section 5.5.5.2 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "switch operation_mode", + "case 'occupied'", + " minimum = v_min", + "case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + "", + "if abs(v_spt - minimum) \u003c= v_spt_tol", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36CoolingOnlyTerminalBoxHeatingAirflowSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 60 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Cooling only terminal box airflow control when the zone state is heating following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.5.5.3 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.5.5.3 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_cool_max", + "v_heat_max", + "v_min", + "v_spt" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_cool_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone maximum cooling airflow setpoint" + ] + }, + "v_heat_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone maximum heating airflow setpoint" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Zone maximum cooling airflow setpoint", + "v_heat_max": "Zone maximum heating airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "switch operation_mode", + "case 'occupied'", + " heating_maximum = v_heat_max", + " minimum = v_min", + "case 'cooldown', 'setup', 'unoccupied'", + " heating_maximum = 0", + " minimum = 0", + "case 'warmup', 'setback'", + " heating_maximum = v_cool_max", + "", + "if minimum \u003c= v_spt \u003c= heating_maximum", + " pass", + "else", + " fail", + "end" + ] + }, + "examples": [ + ["switch operation_mode", + "case 'occupied'", + " heating_maximum = v_heat_max", + " minimum = v_min", + "case 'cooldown', 'setup', 'unoccupied'", + " heating_maximum = 0", + " minimum = 0", + "case 'warmup', 'setback'", + " heating_maximum = v_cool_max", + " minimum = 0", + "", + "if minimum \u003c= v_spt \u003c= heating_maximum", + " pass", + "else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 60, + "description_brief": "Cooling only terminal box airflow control when the zone state is heating following the Guideline 36 recommendations", + "description_index": [ + "Section 5.5.5.3 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Zone maximum cooling airflow setpoint", + "v_heat_max": "Zone maximum heating airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "switch operation_mode", + "case 'occupied'", + " heating_maximum = v_heat_max", + " minimum = v_min", + "case 'cooldown', 'setup', 'unoccupied'", + " heating_maximum = 0", + " minimum = 0", + "case 'warmup', 'setback'", + " heating_maximum = v_cool_max", + " minimum = 0", + "", + "if minimum \u003c= v_spt \u003c= heating_maximum", + " pass", + "else", + " fail", + "end" + ] + }] + }, + "G36TerminalBoxVAVDamperTracking": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 61 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box airflow control with VAV damper following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.5.5.4 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.5.5.4 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "vav_damper_command", + "v", + "v_spt", + "v_tracking_tol" + ], + "properties": { + "vav_damper_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box VAV damper command" + ] + }, + "v": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box discharge airflow rate" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + }, + "v_tracking_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Airflow tracking tolerance" + ] + } + }, + "examples": [{ + "vav_damper_command": "Terminal box VAV damper command", + "v": "Terminal box discharge airflow rate", + "v_spt": "Active airflow setpoint", + "v_tracking_tol": "Airflow tracking tolerance" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if abs(v_spt - v) \u003e= v_tracking_tol (less than 1hr):", + " pass", + "elif abs(v_spt - v) \u003c v_tracking_tol:", + "if v - v_spt \u003e= v_tracking_tol (continously) and vav_damper_command \u003c= 1:", + "elif v_spt - v \u003e= v_tracking_tol (continuously) and vav_damper_command \u003e= 99:", + "else:", + " fail", + "end" + ] + }, + "examples": [ + ["if abs(v_spt - v) \u003e= v_tracking_tol (less than 1hr):", + " pass", + "elif abs(v_spt - v) \u003c v_tracking_tol:", + " pass", + "if v - v_spt \u003e= v_tracking_tol (continously) and vav_damper_command \u003c= 1:", + " pass", + "elif v_spt - v \u003e= v_tracking_tol (continuously) and vav_damper_command \u003e= 99:", + " pass", + "else:", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 61, + "description_brief": "Terminal box airflow control with VAV damper following the Guideline 36 recommendations", + "description_index": [ + "Section 5.5.5.4 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "vav_damper_command": "Terminal box VAV damper command", + "v": "Terminal box discharge airflow rate", + "v_spt": "Active airflow setpoint", + "v_tracking_tol": "Airflow tracking tolerance" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if abs(v_spt - v) \u003e= v_tracking_tol (less than 1hr):", + " pass", + "elif abs(v_spt - v) \u003c v_tracking_tol:", + " pass", + "if v - v_spt \u003e= v_tracking_tol (continously) and vav_damper_command \u003c= 1:", + " pass", + "elif v_spt - v \u003e= v_tracking_tol (continuously) and vav_damper_command \u003e= 99:", + " pass", + "else:", + " fail", + "end" + ] + }] + }, + "G36TerminalBoxCoolingMinimumAirflow": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 62 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box in cooling mode needs maintain minimum airflow when supply air temperature is high following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "Section 5.5.5.1.a in Guideline 36-2021", + "Section 5.6.5.1.a in Guideline 36-2021" + ] + }, + "examples": [ + ["Section 5.5.5.1.a in Guideline 36-2021", + "Section 5.6.5.1.a in Guideline 36-2021" + ] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_min", + "ahu_sat_spt", + "v_spt", + "v_spt_tol", + "room_temp" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "ahu_sat_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU supply air temperature setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + }, + "v_spt_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Airflow setpoint tolerance" + ] + }, + "room_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Room temperature" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_min": "Occupied zone minimum airflow setpoint", + "ahu_sat_spt": "AHU supply air temperature setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance", + "room_temp": "Room temperature" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if ahu_sat_spt \u003c= room_temp:", + " untested", + "else:", + " switch operation_mode", + " case 'occupied'", + " minimum = v_min", + " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + " if v_spt - v_spt_tol \u003e minimum:", + " fail", + " else:", + " pass" + ] + }, + "examples": [ + ["if ahu_sat_spt \u003c= room_temp:", + " untested", + "else:", + " switch operation_mode", + " case 'occupied'", + " minimum = v_min", + " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + " if v_spt - v_spt_tol \u003e minimum:", + " fail", + " else:", + " pass" + ] + ] + } + }, + "examples": [{ + "library_item_id": 62, + "description_brief": "Terminal box in cooling mode needs maintain minimum airflow when supply air temperature is high following the Guideline 36 recommendations", + "description_index": [ + "Section 5.5.5.1.a in Guideline 36-2021", + "Section 5.6.5.1.a in Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_min": "Occupied zone minimum airflow setpoint", + "ahu_sat_spt": "AHU supply air temperature setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance", + "room_temp": "Room temperature" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if ahu_sat_spt \u003c= room_temp:", + " untested", + "else:", + " switch operation_mode", + " case 'occupied'", + " minimum = v_min", + " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + " if v_spt - v_spt_tol \u003e minimum:", + " fail", + " else:", + " pass" + ] + }] + }, + "G36ReheatTerminalBoxCoolingAirflowSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 63 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box with reheat when the zone state is cooling following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.6.5.1 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.6.5.1 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_cool_max", + "v_min", + "v_spt", + "heating_coil_command", + "heating_coil_command_tol", + "dat", + "dat_min_spt" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_cool_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Maximum cooling airflow setpoint" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + }, + "heating_coil_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating coil command" + ] + }, + "heating_coil_command_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating coil command saturation tolerance" + ] + }, + "dat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature" + ] + }, + "dat_min_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum discharge air temperature setpoint" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Maximum cooling airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "heating_coil_command": "Heating coil command", + "heating_coil_command_tol": "Heating coil command saturation tolerance", + "dat": "Discharge air temperature", + "dat_min_spt": "Minimum discharge air temperature setpoint" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", + " fail", + "else", + " switch operation_mode", + " case 'occupied'", + " cooling_maximum = v_cool_max", + " minimum = v_min", + " case 'cooldown', 'setup'", + " minimum = 0", + " case 'warmup', 'setback', 'unoccupied'", + " cooling_maximum = 0", + " ", + " if cooling_minimum \u003c= v_spt \u003c= cooling_maximum", + " pass", + " else", + " fail", + "end" + ] + }, + "examples": [ + ["if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", + " fail", + "else", + " switch operation_mode", + " case 'occupied'", + " cooling_maximum = v_cool_max", + " minimum = v_min", + " case 'cooldown', 'setup'", + " cooling_maximum = v_cool_max", + " minimum = 0", + " case 'warmup', 'setback', 'unoccupied'", + " cooling_maximum = 0", + " minimum = 0", + " ", + " if cooling_minimum \u003c= v_spt \u003c= cooling_maximum", + " pass", + " else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 63, + "description_brief": "Terminal box with reheat when the zone state is cooling following the Guideline 36 recommendations", + "description_index": [ + "Section 5.6.5.1 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Maximum cooling airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "heating_coil_command": "Heating coil command", + "heating_coil_command_tol": "Heating coil command saturation tolerance", + "dat": "Discharge air temperature", + "dat_min_spt": "Minimum discharge air temperature setpoint" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", + " fail", + "else", + " switch operation_mode", + " case 'occupied'", + " cooling_maximum = v_cool_max", + " minimum = v_min", + " case 'cooldown', 'setup'", + " cooling_maximum = v_cool_max", + " minimum = 0", + " case 'warmup', 'setback', 'unoccupied'", + " cooling_maximum = 0", + " minimum = 0", + " ", + " if cooling_minimum \u003c= v_spt \u003c= cooling_maximum", + " pass", + " else", + " fail", + "end" + ] + }] + }, + "G36ReheatTerminalBoxDeadbandAirflowSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 64 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box with reheat when the zone state is deadband following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.6.5.2 in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.6.5.2 in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_min", + "v_spt", + "v_spt_tol", + "heating_coil_command", + "heating_coil_command_tol", + "dat", + "dat_min_spt" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + }, + "v_spt_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Airflow setpoint tolerance" + ] + }, + "heating_coil_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating coil command" + ] + }, + "heating_coil_command_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating coil command saturation tolerance" + ] + }, + "dat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature" + ] + }, + "dat_min_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Minimum discharge air temperature setpoint" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance", + "heating_coil_command": "Heating coil command", + "heating_coil_command_tol": "Heating coil command saturation tolerance", + "dat": "Discharge air temperature", + "dat_min_spt": "Minimum discharge air temperature setpoint" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", + " fail", + "else", + " switch operation_mode", + " case 'occupied'", + " minimum = v_min", + " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + " if abs(v_spt - minimum) \u003c= v_spt_tol", + " pass", + " else", + " fail", + "end" + ] + }, + "examples": [ + ["if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", + " fail", + "else", + " switch operation_mode", + " case 'occupied'", + " minimum = v_min", + " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + " if abs(v_spt - minimum) \u003c= v_spt_tol", + " pass", + " else", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 64, + "description_brief": "Terminal box with reheat when the zone state is deadband following the Guideline 36 recommendations", + "description_index": [ + "Section 5.6.5.2 in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance", + "heating_coil_command": "Heating coil command", + "heating_coil_command_tol": "Heating coil command saturation tolerance", + "dat": "Discharge air temperature", + "dat_min_spt": "Minimum discharge air temperature setpoint" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", + " fail", + "else", + " switch operation_mode", + " case 'occupied'", + " minimum = v_min", + " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", + " minimum = 0", + " if abs(v_spt - minimum) \u003c= v_spt_tol", + " pass", + " else", + " fail", + "end" + ] + }] + }, + "G36ReheatTerminalBoxHeatingAirflowSetpoint": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 65 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box with reheat when the zone state is heating following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.6.5.3 (a, b) in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.6.5.3 (a, b) in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "zone_state", + "v_cool_max", + "v_heat_max", + "v_heat_min", + "v_min", + "v_spt", + "v_spt_tol", + "heating_loop_output", + "room_temp", + "space_temp_spt", + "ahu_sat_spt", + "dat", + "dat_spt" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "zone_state": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone state (heating, cooling, or deadband (not in either heating or cooling))" + ] + }, + "v_cool_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone maximum cooling airflow setpoint" + ] + }, + "v_heat_max": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone maximum heating airflow setpoint" + ] + }, + "v_heat_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone minimum heating airflow setpoint" + ] + }, + "v_min": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Occupied zone minimum airflow setpoint" + ] + }, + "v_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Active airflow setpoint" + ] + }, + "v_spt_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Airflow setpoint tolerance" + ] + }, + "heating_loop_output": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Zone heating loop signal (from 0 to 100)" + ] + }, + "room_temp": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Room temperature" + ] + }, + "space_temp_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Space temperature setpoint" + ] + }, + "ahu_sat_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "AHU supply air temperature setpoint" + ] + }, + "dat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature" + ] + }, + "dat_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature setpoint" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Zone maximum cooling airflow setpoint", + "v_heat_max": "Zone maximum heating airflow setpoint", + "v_heat_min": "Zone minimum heating airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance", + "heating_loop_output": "Zone heating loop signal (from 0 to 100)", + "room_temp": "Room temperature", + "space_temp_spt": "Space temperature setpoint", + "ahu_sat_spt": "AHU supply air temperature setpoint", + "dat": "Discharge air temperature", + "dat_spt": "Discharge air temperature setpoint" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "switch operation_mode", + " case 'occupied'", + " heating_maximum = max(v_heat_min, v_min)", + " heating_minimum = max(v_heat_min, v_min)", + " case 'cooldown'", + " heating_maximum = v_heat_max", + " heating_minimum = v_heat_min", + " case 'setup', 'unoccupied'", + " heating_maximum = 0", + " heating_minimum = 0", + " case 'warmup', 'setback'", + " heating_minimum = v_cool_max", + "", + " if 0 \u003c heating_loop_output \u003c= 50:", + " if abs(v_spt - heating_minimum) \u003c= tolerance and ahu_sat_spt \u003c= dat_spt \u003c= 11 + space_temp_spt:", + " pass", + " else:", + " fail", + " if 50 \u003c heating_loop_output \u003c= 100:", + " if dat \u003e room_temp + 3 and heating_minimum \u003c= v_spt \u003c= heating_maximum:", + " untested", + " end" + ] + }, + "examples": [ + ["switch operation_mode", + " case 'occupied'", + " heating_maximum = max(v_heat_min, v_min)", + " heating_minimum = max(v_heat_min, v_min)", + " case 'cooldown'", + " heating_maximum = v_heat_max", + " heating_minimum = v_heat_min", + " case 'setup', 'unoccupied'", + " heating_maximum = 0", + " heating_minimum = 0", + " case 'warmup', 'setback'", + " heating_maximum = v_heat_max", + " heating_minimum = v_cool_max", + "", + " if 0 \u003c heating_loop_output \u003c= 50:", + " if abs(v_spt - heating_minimum) \u003c= tolerance and ahu_sat_spt \u003c= dat_spt \u003c= 11 + space_temp_spt:", + " pass", + " else:", + " fail", + " if 50 \u003c heating_loop_output \u003c= 100:", + " if dat \u003e room_temp + 3 and heating_minimum \u003c= v_spt \u003c= heating_maximum:", + " pass", + " else:", + " untested", + " end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 65, + "description_brief": "Terminal box with reheat when the zone state is heating following the Guideline 36 recommendations", + "description_index": [ + "Section 5.6.5.3 (a, b) in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", + "v_cool_max": "Zone maximum cooling airflow setpoint", + "v_heat_max": "Zone maximum heating airflow setpoint", + "v_heat_min": "Zone minimum heating airflow setpoint", + "v_min": "Occupied zone minimum airflow setpoint", + "v_spt": "Active airflow setpoint", + "v_spt_tol": "Airflow setpoint tolerance", + "heating_loop_output": "Zone heating loop signal (from 0 to 100)", + "room_temp": "Room temperature", + "space_temp_spt": "Space temperature setpoint", + "ahu_sat_spt": "AHU supply air temperature setpoint", + "dat": "Discharge air temperature", + "dat_spt": "Discharge air temperature setpoint" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "switch operation_mode", + " case 'occupied'", + " heating_maximum = max(v_heat_min, v_min)", + " heating_minimum = max(v_heat_min, v_min)", + " case 'cooldown'", + " heating_maximum = v_heat_max", + " heating_minimum = v_heat_min", + " case 'setup', 'unoccupied'", + " heating_maximum = 0", + " heating_minimum = 0", + " case 'warmup', 'setback'", + " heating_maximum = v_heat_max", + " heating_minimum = v_cool_max", + "", + " if 0 \u003c heating_loop_output \u003c= 50:", + " if abs(v_spt - heating_minimum) \u003c= tolerance and ahu_sat_spt \u003c= dat_spt \u003c= 11 + space_temp_spt:", + " pass", + " else:", + " fail", + " if 50 \u003c heating_loop_output \u003c= 100:", + " if dat \u003e room_temp + 3 and heating_minimum \u003c= v_spt \u003c= heating_maximum:", + " pass", + " else:", + " untested", + " end" + ] + }] + }, + "G36ReheatTerminalBoxHeatingCoilTracking": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 66 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box with reheat heating coil tracking discharge temperature at setpoint following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.6.5.3 c in ASHRAE Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.6.5.3 c in ASHRAE Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "heating_coil_command", + "dat", + "dat_spt", + "dat_tracking_tol" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "heating_coil_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating coil command" + ] + }, + "dat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature" + ] + }, + "dat_spt": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature setpoint" + ] + }, + "dat_tracking_tol": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Temperature tracking tolerance" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "heating_coil_command": "Heating coil command", + "dat": "Discharge air temperature", + "dat_spt": "Discharge air temperature setpoint", + "dat_tracking_tol": "Temperature tracking tolerance" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "only check the following if operation_mode is heating", + "if abs(dat_spt - dat) \u003e= dat_tracking_tol (less than 1hr):", + " pass", + "elif abs(dat_spt - dat) \u003c dat_tracking_tol:", + "if dat - dat_spt \u003e= dat_tracking_tol (continously) and heating_coil_command \u003c= 1:", + "elif dat_spt - dat \u003e= dat_tracking_tol (continuously) and vav_damper_command \u003e= 99:", + "else:", + " fail", + "end" + ] + }, + "examples": [ + ["only check the following if operation_mode is heating", + "if abs(dat_spt - dat) \u003e= dat_tracking_tol (less than 1hr):", + " pass", + "elif abs(dat_spt - dat) \u003c dat_tracking_tol:", + " pass", + "if dat - dat_spt \u003e= dat_tracking_tol (continously) and heating_coil_command \u003c= 1:", + " pass", + "elif dat_spt - dat \u003e= dat_tracking_tol (continuously) and vav_damper_command \u003e= 99:", + " pass", + "else:", + " fail", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 66, + "description_brief": "Terminal box with reheat heating coil tracking discharge temperature at setpoint following the Guideline 36 recommendations", + "description_index": [ + "Section 5.6.5.3 c in ASHRAE Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "heating_coil_command": "Heating coil command", + "dat": "Discharge air temperature", + "dat_spt": "Discharge air temperature setpoint", + "dat_tracking_tol": "Temperature tracking tolerance" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "only check the following if operation_mode is heating", + "if abs(dat_spt - dat) \u003e= dat_tracking_tol (less than 1hr):", + " pass", + "elif abs(dat_spt - dat) \u003c dat_tracking_tol:", + " pass", + "if dat - dat_spt \u003e= dat_tracking_tol (continously) and heating_coil_command \u003c= 1:", + " pass", + "elif dat_spt - dat \u003e= dat_tracking_tol (continuously) and vav_damper_command \u003e= 99:", + " pass", + "else:", + " fail", + "end" + ] + }] + }, + "G36ReheatTerminalBoxHeatingCoilLowerBound": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "library_item_id", + "description_brief", + "description_index", + "description_datapoints", + "description_verification_type", + "assertions_type", + "description_assertions" + ], + "properties": { + "library_item_id": { + "description": "An explanation about the purpose of this instance.", + "type": "integer", + "default": 0, + "examples": [ + 67 + ] + }, + "description_brief": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Terminal box with reheat heating coil needs to keep discharge air temp no lower than 10C when occupied following the Guideline 36 recommendations" + ] + }, + "description_index": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Section 5.6.5.4 in Guideline 36-2021" + ] + }, + "examples": [ + [ + "Section 5.6.5.4 in Guideline 36-2021"] + ] + }, + "description_datapoints": { + "description": "An explanation about the purpose of this instance.", + "type": "object", + "default": {}, + "required": [ + "operation_mode", + "heating_coil_command", + "dat" + ], + "properties": { + "operation_mode": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "System operation mode" + ] + }, + "heating_coil_command": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Heating coil command" + ] + }, + "dat": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "Discharge air temperature" + ] + } + }, + "examples": [{ + "operation_mode": "System operation mode", + "heating_coil_command": "Heating coil command", + "dat": "Discharge air temperature" + }] + }, + "description_verification_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "procedure-based" + ] + }, + "assertions_type": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "default": "", + "examples": [ + "pass" + ] + }, + "description_assertions": { + "description": "An explanation about the purpose of this instance.", + "type": "array", + "default": [], + "items": { + "description": "An explanation about the purpose of this instance.", + "type": "string", + "examples": [ + "if operation_mode != 'occupied':", + " untested", + "if operation_mode == 'occupied':", + " if dat \u003c 10 and heating_coil_command \u003c 99:", + " fail", + " else:", + " pass", + "end" + ] + }, + "examples": [ + ["if operation_mode != 'occupied':", + " untested", + "if operation_mode == 'occupied':", + " if dat \u003c 10 and heating_coil_command \u003c 99:", + " fail", + " else:", + " pass", + "end" + ] + ] + } + }, + "examples": [{ + "library_item_id": 67, + "description_brief": "Terminal box with reheat heating coil needs to keep discharge air temp no lower than 10C when occupied following the Guideline 36 recommendations", + "description_index": [ + "Section 5.6.5.4 in Guideline 36-2021" + ], + "description_datapoints": { + "operation_mode": "System operation mode", + "heating_coil_command": "Heating coil command", + "dat": "Discharge air temperature" + }, + "description_verification_type": "procedure-based", + "assertions_type": "pass", + "description_assertions": [ + "if operation_mode != 'occupied':", + " untested", + "if operation_mode == 'occupied':", + " if dat \u003c 10 and heating_coil_command \u003c 99:", + " fail", + " else:", + " pass", + "end" + ] + }] + } + } +} diff --git a/schema/new_library_verification_cases_schema.json b/schema/new_library_verification_cases_schema.json new file mode 100644 index 00000000..6a93a567 --- /dev/null +++ b/schema/new_library_verification_cases_schema.json @@ -0,0 +1,3604 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "cases": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_sa_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_sa_set" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_z_coo": { + "type": "number" + } + }, + "required": [ + "T_z_coo" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_sa_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_sa_set" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_z_coo": { + "type": "number" + } + }, + "required": [ + "T_z_coo" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_sa_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_sa_set" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_z_coo": { + "type": "number" + } + }, + "required": [ + "T_z_coo" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_sa_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_sa_set" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_z_coo": { + "type": "number" + } + }, + "required": [ + "T_z_coo" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "oa_flow": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "oa_db": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ret_a_enth": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "oa_enth": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "oa_flow", + "oa_db", + "ret_a_enth", + "oa_enth" + ] + }, + "parameters": { + "type": "object", + "properties": { + "oa_threshold": { + "type": "integer" + }, + "oa_min_flow": { + "type": "number" + } + }, + "required": [ + "oa_threshold", + "oa_min_flow" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "oa_flow": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "oa_db": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ret_a_enth": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "oa_enth": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "oa_flow", + "oa_db", + "ret_a_enth", + "oa_enth" + ] + }, + "parameters": { + "type": "object", + "properties": { + "oa_threshold": { + "type": "integer" + }, + "oa_min_flow": { + "type": "number" + } + }, + "required": [ + "oa_threshold", + "oa_min_flow" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "oa_flow": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ccoil_out": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "oa_flow", + "ccoil_out" + ] + }, + "parameters": { + "type": "object", + "properties": { + "oa_min_flow": { + "type": "number" + } + }, + "required": [ + "oa_min_flow" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "oa_flow": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ccoil_out": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "oa_flow", + "ccoil_out" + ] + }, + "parameters": { + "type": "object", + "properties": { + "oa_min_flow": { + "type": "number" + } + }, + "required": [ + "oa_min_flow" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_oa_db": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_hw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "m_hw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_oa_db", + "T_hw", + "m_hw" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_oa_max": { + "type": "integer" + }, + "T_oa_min": { + "type": "number" + }, + "T_hw_max_set": { + "type": "number" + }, + "T_hw_min_set": { + "type": "number" + } + }, + "required": [ + "T_oa_max", + "T_oa_min", + "T_hw_max_set", + "T_hw_min_set" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_oa_db": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_hw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "m_hw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_oa_db", + "T_hw", + "m_hw" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_oa_max": { + "type": "integer" + }, + "T_oa_min": { + "type": "number" + }, + "T_hw_max_set": { + "type": "number" + }, + "T_hw_min_set": { + "type": "number" + } + }, + "required": [ + "T_oa_max", + "T_oa_min", + "T_hw_max_set", + "T_hw_min_set" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_oa_db": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_chw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "m_chw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_oa_db", + "T_chw", + "m_chw" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_oa_max": { + "type": "number" + }, + "T_oa_min": { + "type": "number" + }, + "T_chw_max_st": { + "type": "number" + }, + "T_chw_min_st": { + "type": "number" + } + }, + "required": [ + "T_oa_max", + "T_oa_min", + "T_chw_max_st", + "T_chw_min_st" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_oa_db": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_chw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "m_chw": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_oa_db", + "T_chw", + "m_chw" + ] + }, + "parameters": { + "type": "object", + "properties": { + "T_oa_max": { + "type": "number" + }, + "T_oa_min": { + "type": "number" + }, + "T_chw_max_st": { + "type": "number" + }, + "T_chw_min_st": { + "type": "number" + } + }, + "required": [ + "T_oa_max", + "T_oa_min", + "T_chw_max_st", + "T_chw_min_st" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_zone": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "HVAC_operation_sch": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_heat_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_cool_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "Fan_elec_rate": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_zone", + "HVAC_operation_sch", + "T_heat_set", + "T_cool_set", + "Fan_elec_rate" + ] + }, + "parameters": { + "type": "object" + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "o": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "m_oa": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "eco_onoff": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "o", + "m_oa", + "eco_onoff" + ] + }, + "parameters": { + "type": "object", + "properties": { + "tol": { + "type": "number" + } + }, + "required": [ + "tol" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "p_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "d_VAV_1": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "d_VAV_2": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "d_VAV_3": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "d_VAV_4": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "d_VAV_5": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "p_set", + "d_VAV_1", + "d_VAV_2", + "d_VAV_3", + "d_VAV_4", + "d_VAV_5" + ] + }, + "parameters": { + "type": "object", + "properties": { + "p_set_min": { + "type": "number" + }, + "tol": { + "type": "number" + } + }, + "required": [ + "p_set_min", + "tol" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "ct_op_cells": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ct_m": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ct_P_fan": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "ct_op_cells", + "ct_m", + "ct_P_fan" + ] + }, + "parameters": { + "type": "object", + "properties": { + "ct_cells": { + "type": "integer" + }, + "ct_m_des": { + "type": "number" + }, + "min_flow_frac_per_cell": { + "type": "number" + } + }, + "required": [ + "ct_cells", + "ct_m_des", + "min_flow_frac_per_cell" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_wh_inlet": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_wh_inlet" + ] + }, + "parameters": { + "type": "object" + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "p_fan_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "p_fan_set" + ] + }, + "parameters": { + "type": "object", + "properties": { + "tol_P_fan": { + "type": "number" + } + }, + "required": [ + "tol_P_fan" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "no_of_occ": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "Q_load": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "P_fan": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "no_of_occ", + "Q_load", + "P_fan" + ] + }, + "parameters": { + "type": "object" + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_max_heating_loop": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_min_cooling_loop": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "m_pump": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_max_heating_loop", + "T_min_cooling_loop", + "m_pump" + ] + }, + "parameters": { + "type": "object", + "properties": { + "tol": { + "type": "number" + } + }, + "required": [ + "tol" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "hvac_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "hvac_set" + ] + }, + "parameters": { + "type": "object" + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "L_op": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "P_supp_ht": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "C_t_mod": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "C_ff_mod": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "L_defrost": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "L_op", + "P_supp_ht", + "C_t_mod", + "C_ff_mod", + "L_defrost" + ] + }, + "parameters": { + "type": "object", + "properties": { + "C_ref": { + "type": "number" + }, + "tol": { + "type": "number" + } + }, + "required": [ + "C_ref", + "tol" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "ct_P_fan": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "ct_m_fan_ratio": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "ct_P_fan", + "ct_m_fan_ratio" + ] + }, + "parameters": { + "type": "object", + "properties": { + "ct_m_fan_dsgn": { + "type": "number" + }, + "ct_P_fan_dsgn": { + "type": "number" + } + }, + "required": [ + "ct_m_fan_dsgn", + "ct_P_fan_dsgn" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "m_z_oa": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "O_sch": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "m_z_oa", + "O_sch" + ] + }, + "parameters": { + "type": "object", + "properties": { + "area_z": { + "type": "number" + }, + "height_z": { + "type": "number" + }, + "v_outdoor_per_zone": { + "type": "number" + }, + "tol_occ": { + "type": "number" + }, + "tol_oa_flow": { + "type": "number" + } + }, + "required": [ + "area_z", + "height_z", + "v_outdoor_per_zone", + "tol_occ", + "tol_oa_flow" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "T_z_hea_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "T_z_coo_set": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "O_sch": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "T_z_hea_set", + "T_z_coo_set", + "O_sch" + ] + }, + "parameters": { + "type": "object", + "properties": { + "tol_occ": { + "type": "number" + }, + "tol_temp": { + "type": "number" + } + }, + "required": [ + "tol_occ", + "tol_temp" + ] + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + }, + { + "type": "object", + "properties": { + "no": { + "type": "integer" + }, + "run_simulation": { + "type": "boolean" + }, + "simulation_IO": { + "type": "object", + "properties": { + "idf": { + "type": "string" + }, + "idd": { + "type": "string" + }, + "weather": { + "type": "string" + }, + "output": { + "type": "string" + }, + "ep_path": { + "type": "string" + } + }, + "required": [ + "idf", + "idd", + "weather", + "output", + "ep_path" + ] + }, + "expected_result": { + "type": "string" + }, + "datapoints_source": { + "type": "object", + "properties": { + "idf_output_variables": { + "type": "object", + "properties": { + "v_oa": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "s_ahu": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "s_eco": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "no_of_occ_core": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "no_of_occ_per1": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "no_of_occ_per2": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "no_of_occ_per3": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + }, + "no_of_occ_per4": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "variable": { + "type": "string" + }, + "frequency": { + "type": "string" + } + }, + "required": [ + "subject", + "variable", + "frequency" + ] + } + }, + "required": [ + "v_oa", + "s_ahu", + "s_eco", + "no_of_occ_core", + "no_of_occ_per1", + "no_of_occ_per2", + "no_of_occ_per3", + "no_of_occ_per4" + ] + }, + "parameters": { + "type": "object" + } + }, + "required": [ + "idf_output_variables", + "parameters" + ] + }, + "verification_class": { + "type": "string" + } + }, + "required": [ + "no", + "run_simulation", + "simulation_IO", + "expected_result", + "datapoints_source", + "verification_class" + ] + } + ] + } + }, + "required": [ + "cases" + ] +} \ No newline at end of file From 7cd898196783430e71b0a4e4b89a50f43b83cbc0 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 01:48:48 -0700 Subject: [PATCH 40/71] Create a new directory if it doesn't exist --- constrain/api/workflow.py | 16 +++++++++++----- tests/api/test_flexible_calling.py | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 7c52e8e1..7202249d 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -6,6 +6,7 @@ import glob import sys, logging, json, os, datetime, platform +from pathlib import Path from typing import Union sys.path.append("./constrain") @@ -45,7 +46,14 @@ def __init__(self, workflow, run_workflow_now=False): self.workflow_dict = workflow self.load_states() + # change working dir + self.change_work_dir() + # run workflow now + if run_workflow_now: + self.run_workflow() + + def change_work_dir(self) -> None: # First, check if the workflow_dict has "working_dir" if "working_dir" not in self.workflow_dict: logging.info("No working_dic is specified") @@ -78,16 +86,14 @@ def __init__(self, workflow, run_workflow_now=False): "working_dir" ].replace("\\", "/") logging.info("the working dir provided is in Win format.") + # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): os.chdir(self.workflow_dict["working_dir"]) logging.info("Change current working path to the specified path.") else: - logging.error("working directory specified does not exist.") - - # run workflow now - if run_workflow_now: - self.run_workflow() + Path(self.workflow_dict["working_dir"]).mkdir(parents=True, exist_ok=True) + logging.info("working directory specified does not exist and create a new director.") def validate(self, verbose: bool = False) -> bool: """function to be implemented to check for high level validity of the workflow definition""" diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b06f2495..d182ab37 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -109,7 +109,7 @@ def test_dir_not_exist(self): workflow = Workflow(workflow=json_case_path) self.assertEqual( logobs.output[1], - "ERROR:root:working directory specified does not exist.", + "INFO:root:working directory specified does not exist and create a new director.", ) def test_valid_dir(self): From e8b44fb1b63a65a9dfa7b23d16e1205eae34930d Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 02:05:22 -0700 Subject: [PATCH 41/71] put the whole working dir logic into a dedicate --- constrain/api/workflow.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 7202249d..f4443f91 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -92,8 +92,12 @@ def change_work_dir(self) -> None: os.chdir(self.workflow_dict["working_dir"]) logging.info("Change current working path to the specified path.") else: - Path(self.workflow_dict["working_dir"]).mkdir(parents=True, exist_ok=True) - logging.info("working directory specified does not exist and create a new director.") + Path(self.workflow_dict["working_dir"]).mkdir( + parents=True, exist_ok=True + ) + logging.info( + "working directory specified does not exist and create a new director." + ) def validate(self, verbose: bool = False) -> bool: """function to be implemented to check for high level validity of the workflow definition""" From 04f86d464dbcebea71f72b16ab5597e4c66f2978 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 11:11:32 -0700 Subject: [PATCH 42/71] fix unittest error --- constrain/api/workflow.py | 20 +++++++++++++++----- tests/api/test_flexible_calling.py | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 7c52e8e1..f4443f91 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -6,6 +6,7 @@ import glob import sys, logging, json, os, datetime, platform +from pathlib import Path from typing import Union sys.path.append("./constrain") @@ -45,7 +46,14 @@ def __init__(self, workflow, run_workflow_now=False): self.workflow_dict = workflow self.load_states() + # change working dir + self.change_work_dir() + # run workflow now + if run_workflow_now: + self.run_workflow() + + def change_work_dir(self) -> None: # First, check if the workflow_dict has "working_dir" if "working_dir" not in self.workflow_dict: logging.info("No working_dic is specified") @@ -78,16 +86,18 @@ def __init__(self, workflow, run_workflow_now=False): "working_dir" ].replace("\\", "/") logging.info("the working dir provided is in Win format.") + # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): os.chdir(self.workflow_dict["working_dir"]) logging.info("Change current working path to the specified path.") else: - logging.error("working directory specified does not exist.") - - # run workflow now - if run_workflow_now: - self.run_workflow() + Path(self.workflow_dict["working_dir"]).mkdir( + parents=True, exist_ok=True + ) + logging.info( + "working directory specified does not exist and create a new director." + ) def validate(self, verbose: bool = False) -> bool: """function to be implemented to check for high level validity of the workflow definition""" diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b06f2495..d182ab37 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -109,7 +109,7 @@ def test_dir_not_exist(self): workflow = Workflow(workflow=json_case_path) self.assertEqual( logobs.output[1], - "ERROR:root:working directory specified does not exist.", + "INFO:root:working directory specified does not exist and create a new director.", ) def test_valid_dir(self): From bc8dc9b547930ec92e897ebd75299d08e0e34177 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 11:13:27 -0700 Subject: [PATCH 43/71] rm json schema --- schema/library_schema.json | 11124 ---------------- ...new_library_verification_cases_schema.json | 3604 ----- 2 files changed, 14728 deletions(-) delete mode 100644 schema/library_schema.json delete mode 100644 schema/new_library_verification_cases_schema.json diff --git a/schema/library_schema.json b/schema/library_schema.json deleted file mode 100644 index b2fb36c0..00000000 --- a/schema/library_schema.json +++ /dev/null @@ -1,11124 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft-07/schema", - "$id": "http://example.com/example.json", - "description": "Placeholder", - "type": "object", - "default": {}, - "required": [], - "properties": { - "SupplyAirTempReset": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 1 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling supply air temperature reset scale (25%)" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Multiple zone HVAC systems must include controls that automatically reset the supply air temperature in response to representative building loads, or to outdoor air temperature. The controls shall reset the supply air temperature at least 25% of the difference between the design supply air temperature and the design room air temperature. Controls that adjust the reset based on zone humidity are allowed. Zones that are expected to experience relatively constant loads, such as electronic equipment rooms, shall be designed for the fully reset supply temperature." - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.3.5 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.3.5 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_sa_set", - "T_z_coo" - ], - "properties": { - "T_sa_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU supply air temperature setpoint" - ] - }, - "T_z_coo": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Design zone cooling air temperature" - ] - } - }, - "examples": [{ - "T_sa_set": "AHU supply air temperature setpoint", - "T_z_coo": "Design zone cooling air temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Max(T_sa_set) - Min(T_sa_set) \u003e= (T_z_coo - Min(T_sa_set)) * 0.25" - ] - }, - "examples": [ - [ - "Max(T_sa_set) - Min(T_sa_set) \u003e= (T_z_coo - Min(T_sa_set)) * 0.25"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 1, - "description_brief": "Cooling supply air temperature reset scale (25%)", - "description_detail": "Multiple zone HVAC systems must include controls that automatically reset the supply air temperature in response to representative building loads, or to outdoor air temperature. The controls shall reset the supply air temperature at least 25% of the difference between the design supply air temperature and the design room air temperature. Controls that adjust the reset based on zone humidity are allowed. Zones that are expected to experience relatively constant loads, such as electronic equipment rooms, shall be designed for the fully reset supply temperature.", - "description_index": [ - "Section 6.5.3.5 in 90.1-2016" - ], - "description_datapoints": { - "T_sa_set": "AHU supply air temperature setpoint", - "T_z_coo": "Design zone cooling air temperature" - }, - "description_assertions": [ - "Max(T_sa_set) - Min(T_sa_set) \u003e= (T_z_coo - Min(T_sa_set)) * 0.25" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "EconomizerHighLimitA": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 2 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Fixed dry bulb economizer high limit" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Economizer needs to be OFF when High-Limit Condition was satisfied. Y_e_HL =f($Climate Zone, $Toa, $Tra, $hoa, $hra)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Table 6.5.1.1.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Table 6.5.1.1.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_oa_db", - "oa_threshold", - "oa_min_flow", - "oa_flow" - ], - "properties": { - "T_oa_db": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb temperature" - ] - }, - "oa_threshold": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb threshold" - ] - }, - "oa_min_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA minimum airflow setpoint" - ] - }, - "oa_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA airflow" - ] - } - }, - "examples": [{ - "T_oa_db": "OA dry bulb temperature", - "oa_threshold": "OA dry bulb threshold", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(oa_flow \u003e oa_min_flow) AND (T_oa_db \u003e oa_threshold)" - ] - }, - "examples": [ - [ - "(oa_flow \u003e oa_min_flow) AND (T_oa_db \u003e oa_threshold)"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "fail" - ] - } - }, - "examples": [{ - "library_item_id": 2, - "description_brief": "Fixed dry bulb economizer high limit", - "description_detail": "Economizer needs to be OFF when High-Limit Condition was satisfied. Y_e_HL =f($Climate Zone, $Toa, $Tra, $hoa, $hra)", - "description_index": [ - "Table 6.5.1.1.3 in 90.1-2016" - ], - "description_datapoints": { - "T_oa_db": "OA dry bulb temperature", - "oa_threshold": "OA dry bulb threshold", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow" - }, - "description_assertions": [ - "(oa_flow \u003e oa_min_flow) AND (T_oa_db \u003e oa_threshold)" - ], - "description_verification_type": "rule-based", - "assertions_type": "fail" - }] - }, - "EconomizerHighLimitB": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 3 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Differential dry bulb economizer high limit" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Check the 90.1-2016 table" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Table 6.5.1.1.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Table 6.5.1.1.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_oa_db", - "ret_a_temp", - "oa_min_flow", - "oa_flow" - ], - "properties": { - "T_oa_db": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb temperature" - ] - }, - "ret_a_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Retuan air temperature" - ] - }, - "oa_min_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA minimum airflow setpoint" - ] - }, - "oa_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA airflow" - ] - } - }, - "examples": [{ - "T_oa_db": "OA dry bulb temperature", - "ret_a_temp": "Retuan air temperature", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(oa_flow \u003e oa_min_flow) AND (ret_a_temp \u003c T_oa_db)" - ] - }, - "examples": [ - [ - "(oa_flow \u003e oa_min_flow) AND (ret_a_temp \u003c T_oa_db)"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "fail" - ] - } - }, - "examples": [{ - "library_item_id": 3, - "description_brief": "Differential dry bulb economizer high limit", - "description_detail": "Check the 90.1-2016 table", - "description_index": [ - "Table 6.5.1.1.3 in 90.1-2016" - ], - "description_datapoints": { - "T_oa_db": "OA dry bulb temperature", - "ret_a_temp": "Retuan air temperature", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow" - }, - "description_assertions": [ - "(oa_flow \u003e oa_min_flow) AND (ret_a_temp \u003c T_oa_db)" - ], - "description_verification_type": "rule-based", - "assertions_type": "fail" - }] - }, - "EconomizerHighLimitC": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [4] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Fixed enthalpy + fixed dry bulb economizer high limit" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "N/A" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Table 6.5.1.1.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Table 6.5.1.1.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_oa_db", - "oa_threshold", - "oa_min_flow", - "oa_flow", - "oa_enth", - "oa_enth_threshold" - ], - "properties": { - "T_oa_db": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb temperature" - ] - }, - "oa_threshold": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb threshold" - ] - }, - "oa_min_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA minimum airflow setpoint" - ] - }, - "oa_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA airflow" - ] - }, - "oa_enth": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA enthalpy" - ] - }, - "oa_enth_threshold": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA enthalpy threshold" - ] - } - }, - "examples": [{ - "T_oa_db": "OA dry bulb temperature", - "oa_threshold": "OA dry bulb threshold", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow", - "oa_enth": "OA enthalpy", - "oa_enth_threshold": "OA enthalpy threshold" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(oa_flow \u003e oa_min_flow) AND ((T_oa_db \u003e oa_threshold) OR (oa_enth \u003e oa_enth_threshold))" - ] - }, - "examples": [ - [ - "(oa_flow \u003e oa_min_flow) AND ((T_oa_db \u003e oa_threshold) OR (oa_enth \u003e oa_enth_threshold))"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "fail" - ] - } - }, - "examples": [{ - "library_item_id": 4, - "description_brief": "Fixed enthalpy + fixed dry bulb economizer high limit", - "description_detail": "N/A", - "description_index": [ - "Table 6.5.1.1.3 in 90.1-2016" - ], - "description_datapoints": { - "T_oa_db": "OA dry bulb temperature", - "oa_threshold": "OA dry bulb threshold", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow", - "oa_enth": "OA enthalpy", - "oa_enth_threshold": "OA enthalpy threshold" - }, - "description_assertions": [ - "(oa_flow \u003e oa_min_flow) AND ((T_oa_db \u003e oa_threshold) OR (oa_enth \u003e oa_enth_threshold))" - ], - "description_verification_type": "rule-based", - "assertions_type": "fail" - }] - }, - "EconomizerHighLimitD": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 5 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Differential enthalpy + fixed dry bulb economizer high limit (case study)" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "N/A" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Table 6.5.1.1.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Table 6.5.1.1.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_oa_db", - "oa_threshold", - "oa_min_flow", - "oa_flow", - "oa_enth", - "ret_a_enth" - ], - "properties": { - "T_oa_db": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb temperature" - ] - }, - "oa_threshold": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry bulb threshold" - ] - }, - "oa_min_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA minimum airflow setpoint" - ] - }, - "oa_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA airflow" - ] - }, - "oa_enth": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA enthalpy" - ] - }, - "ret_a_enth": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air enthalpy" - ] - } - }, - "examples": [{ - "T_oa_db": "OA dry bulb temperature", - "oa_threshold": "OA dry bulb threshold", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow", - "oa_enth": "OA enthalpy", - "ret_a_enth": "Return air enthalpy" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "oa_flow \u003e oa_min_flow) AND ((ret_a_enth \u003c oa_enth) OR (T_oa_db \u003e oa_threshold))" - ] - }, - "examples": [ - [ - "oa_flow \u003e oa_min_flow) AND ((ret_a_enth \u003c oa_enth) OR (T_oa_db \u003e oa_threshold))"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "fail" - ] - } - }, - "examples": [{ - "library_item_id": 5, - "description_brief": "Differential enthalpy + fixed dry bulb economizer high limit (case study)", - "description_detail": "N/A", - "description_index": [ - "Table 6.5.1.1.3 in 90.1-2016" - ], - "description_datapoints": { - "T_oa_db": "OA dry bulb temperature", - "oa_threshold": "OA dry bulb threshold", - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow", - "oa_enth": "OA enthalpy", - "ret_a_enth": "Return air enthalpy" - }, - "description_assertions": [ - "oa_flow \u003e oa_min_flow) AND ((ret_a_enth \u003c oa_enth) OR (T_oa_db \u003e oa_threshold))" - ], - "description_verification_type": "rule-based", - "assertions_type": "fail" - }] - }, - "IntegratedEconomizerControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 6 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Economizer shall be integrated with mechanical cooling" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Economizer systems shall be integrated with the mechanical cooling system and be capable of and configured to provide partial cooling even when additional mechanical cooling is required to meet the remainder of the cooling load. Controls shall not false load the mechanical cooling systems by limiting or disabling the economizer or by any other means, such as hot-gas bypass, except at the lowest stage of mechanical cooling. (case study, add non-integrated economizer (check each seprate on, but not both on)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.1.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.1.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "oa_min_flow", - "oa_flow", - "ccoil_out" - ], - "properties": { - "oa_min_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA minimum airflow setpoint" - ] - }, - "oa_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA airflow" - ] - }, - "ccoil_out": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling coil transfer" - ] - } - }, - "examples": [{ - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow", - "ccoil_out": "Cooling coil transfer" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "((oa_flow \u003e oa_min_flow) AND (ccoil_out \u003e 0)) never happens" - ] - }, - "examples": [ - [ - "((oa_flow \u003e oa_min_flow) AND (ccoil_out \u003e 0)) never happens"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "fail" - ] - } - }, - "examples": [{ - "library_item_id": 6, - "description_brief": "Economizer shall be integrated with mechanical cooling", - "description_detail": "Economizer systems shall be integrated with the mechanical cooling system and be capable of and configured to provide partial cooling even when additional mechanical cooling is required to meet the remainder of the cooling load. Controls shall not false load the mechanical cooling systems by limiting or disabling the economizer or by any other means, such as hot-gas bypass, except at the lowest stage of mechanical cooling. (case study, add non-integrated economizer (check each seprate on, but not both on)", - "description_index": [ - "Section 6.5.1.3 in 90.1-2016" - ], - "description_datapoints": { - "oa_min_flow": "OA minimum airflow setpoint", - "oa_flow": "OA airflow", - "ccoil_out": "Cooling coil transfer" - }, - "description_assertions": [ - "((oa_flow \u003e oa_min_flow) AND (ccoil_out \u003e 0)) never happens" - ], - "description_verification_type": "procedure-based", - "assertions_type": "fail" - }] - }, - "ERVRatio": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 7 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "ERV ratio of at least 50%" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Energy recovery systems required by this section shall result in an enthalpy recovery ratio of at least 50%. A 50% enthalpy recovery ratio shall mean a change in the enthalpy of the outdoor air supply equal to 50% of the difference between the outdoor air and entering exhaust air enthalpies at design conditions." - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.6.1 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.6.1 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "oa_enth", - "ret_enth", - "oa_enth_ERV" - ], - "properties": { - "oa_enth": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA enthalpy" - ] - }, - "ret_enth": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air enthalpy" - ] - }, - "oa_enth_ERV": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA enthalpy after ERV" - ] - } - }, - "examples": [{ - "oa_enth": "OA enthalpy", - "ret_enth": "Return air enthalpy", - "oa_enth_ERV": "OA enthalpy after ERV" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(oa_enth_ERV - oa_enth)/(ret_enth - oa_enth) \u003e = 50% happens at least once in winter design day" - ] - }, - "examples": [ - [ - "(oa_enth_ERV - oa_enth)/(ret_enth - oa_enth) \u003e = 50% happens at least once in winter design day"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 7, - "description_brief": "ERV ratio of at least 50%", - "description_detail": "Energy recovery systems required by this section shall result in an enthalpy recovery ratio of at least 50%. A 50% enthalpy recovery ratio shall mean a change in the enthalpy of the outdoor air supply equal to 50% of the difference between the outdoor air and entering exhaust air enthalpies at design conditions.", - "description_index": [ - "Section 6.5.6.1 in 90.1-2016" - ], - "description_datapoints": { - "oa_enth": "OA enthalpy", - "ret_enth": "Return air enthalpy", - "oa_enth_ERV": "OA enthalpy after ERV" - }, - "description_assertions": [ - "(oa_enth_ERV - oa_enth)/(ret_enth - oa_enth) \u003e = 50% happens at least once in winter design day" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ZoneTempControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 8 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone temperature setpoint deadband \u003e= 5F (2.77C)" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Where used to control both heating and cooling, zone thermostatic controls shall be capable of and configured to provide a temperature range or dead band of at least 5°F within which the supply of heating and cooling energy to the zone is shut off or reduced to a minimum. (case study for zone temperature reset, not for this one)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.1.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.1.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_set_cool", - "T_set_heat" - ], - "properties": { - "T_set_cool": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone cooling temperature setpoint" - ] - }, - "T_set_heat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone heating temperature setpoint" - ] - } - }, - "examples": [{ - "T_set_cool": "Zone cooling temperature setpoint", - "T_set_heat": "Zone heating temperature setpoint" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "T_set_cool - T_set_heat \u003e 5F (2.77C)" - ] - }, - "examples": [ - [ - "T_set_cool - T_set_heat \u003e 5F (2.77C)"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 8, - "description_brief": "Zone temperature setpoint deadband \u003e= 5F (2.77C)", - "description_detail": "Where used to control both heating and cooling, zone thermostatic controls shall be capable of and configured to provide a temperature range or dead band of at least 5°F within which the supply of heating and cooling energy to the zone is shut off or reduced to a minimum. (case study for zone temperature reset, not for this one)", - "description_index": [ - "Section 6.4.3.1.2 in 90.1-2016" - ], - "description_datapoints": { - "T_set_cool": "Zone cooling temperature setpoint", - "T_set_heat": "Zone heating temperature setpoint" - }, - "description_assertions": [ - "T_set_cool - T_set_heat \u003e 5F (2.77C)" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "HWReset": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 9 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Hot water supply water temperature reset" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Hot-water systems with a design capacity exceeding 300,000 Btu/h supplying heated water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.4.4 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.4.4 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_oa_db", - "T_oa_max", - "T_oa_min", - "T_hw", - "m_hw", - "T_hw_max_set", - "T_hw_min_set" - ], - "properties": { - "T_oa_db": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry-bulb temperature" - ] - }, - "T_oa_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry-bulb upper threshold" - ] - }, - "T_oa_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry-bulb lower threshold" - ] - }, - "T_hw": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Hot water temp observed from the system node" - ] - }, - "m_hw": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Hot water flow rate" - ] - }, - "T_hw_max_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Hot water maximum temp setpoint" - ] - }, - "T_hw_min_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Hot water minimum temp setpoint" - ] - } - }, - "examples": [{ - "T_oa_db": "OA dry-bulb temperature", - "T_oa_max": "OA dry-bulb upper threshold", - "T_oa_min": "OA dry-bulb lower threshold", - "T_hw": "Hot water temp observed from the system node", - "m_hw": "Hot water flow rate", - "T_hw_max_set": "Hot water maximum temp setpoint", - "T_hw_min_set": "Hot water minimum temp setpoint" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "When m_hw \u003e 0, T_hw \u003c= T_hw_max_set and T_hw \u003e= T_hw_min_set; When m_hw \u003c 0, always pass" - ] - }, - "examples": [ - [ - "When m_hw \u003e 0, T_hw \u003c= T_hw_max_set and T_hw \u003e= T_hw_min_set; When m_hw \u003c 0, always pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 9, - "description_brief": "Hot water supply water temperature reset", - "description_detail": "Hot-water systems with a design capacity exceeding 300,000 Btu/h supplying heated water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)", - "description_index": [ - "Section 6.5.4.4 in 90.1-2016" - ], - "description_datapoints": { - "T_oa_db": "OA dry-bulb temperature", - "T_oa_max": "OA dry-bulb upper threshold", - "T_oa_min": "OA dry-bulb lower threshold", - "T_hw": "Hot water temp observed from the system node", - "m_hw": "Hot water flow rate", - "T_hw_max_set": "Hot water maximum temp setpoint", - "T_hw_min_set": "Hot water minimum temp setpoint" - }, - "description_assertions": [ - "When m_hw \u003e 0, T_hw \u003c= T_hw_max_set and T_hw \u003e= T_hw_min_set; When m_hw \u003c 0, always pass" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "CHWReset": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 10 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Chilled water supply water temperature reset" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Chilled-water systems with a design capacity exceeding 300,000 Btu/h supplying chilled water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.4.4 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.4.4 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_oa_db", - "T_oa_max", - "T_oa_min", - "T_chw", - "m_chw", - "T_chw_max_set", - "T_chw_min_set" - ], - "properties": { - "T_oa_db": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry-bulb temperature" - ] - }, - "T_oa_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry-bulb upper threshold" - ] - }, - "T_oa_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "OA dry-bulb lower threshold" - ] - }, - "T_chw": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Chilled water temp observed from the system node" - ] - }, - "m_chw": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Chilled water flow rate" - ] - }, - "T_chw_max_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Chilled water maximum temp setpoint" - ] - }, - "T_chw_min_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Chilled water minimum temp setpoint" - ] - } - }, - "examples": [{ - "T_oa_db": "OA dry-bulb temperature", - "T_oa_max": "OA dry-bulb upper threshold", - "T_oa_min": "OA dry-bulb lower threshold", - "T_chw": "Chilled water temp observed from the system node", - "m_chw": "Chilled water flow rate", - "T_chw_max_set": "Chilled water maximum temp setpoint", - "T_chw_min_set": "Chilled water minimum temp setpoint" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "When m_chw \u003e 0, T_chw \u003c= T_chw_max_set and T_chw \u003e= T_chw_min_set; When m_chw \u003c= 0 , always pass" - ] - }, - "examples": [ - [ - "When m_chw \u003e 0, T_chw \u003c= T_chw_max_set and T_chw \u003e= T_chw_min_set; When m_chw \u003c= 0 , always pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 10, - "description_brief": "Chilled water supply water temperature reset", - "description_detail": "Chilled-water systems with a design capacity exceeding 300,000 Btu/h supplying chilled water to comfort conditioning systems shall include controls that automatically reset supply water temperatures by representative building loads (including return water temperature) or by outdoor air temperature. Where DDC is used to control valves, the set point shall be reset based on valve positions until one valve is nearly wide open or setpoint limits of the system equipment or application have been reached. (case study)", - "description_index": [ - "Section 6.5.4.4 in 90.1-2016" - ], - "description_datapoints": { - "T_oa_db": "OA dry-bulb temperature", - "T_oa_max": "OA dry-bulb upper threshold", - "T_oa_min": "OA dry-bulb lower threshold", - "T_chw": "Chilled water temp observed from the system node", - "m_chw": "Chilled water flow rate", - "T_chw_max_set": "Chilled water maximum temp setpoint", - "T_chw_min_set": "Chilled water minimum temp setpoint" - }, - "description_assertions": [ - "When m_chw \u003e 0, T_chw \u003c= T_chw_max_set and T_chw \u003e= T_chw_min_set; When m_chw \u003c= 0 , always pass" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "ZoneHeatSetpointMinimum": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 11 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone heating setpoint reset temperature minimum value check" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating systems located in climate zones 2-8 shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures above a heating setpoint adjustable down to 55°F or lower. (case study)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.2.2 in 90.1-2004" - ] - }, - "examples": [ - [ - "Section 6.4.3.2.2 in 90.1-2004"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_heat_set" - ], - "properties": { - "T_heat_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Heating Setpoint Temperature" - ] - } - }, - "examples": [{ - "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if min(T_heat_set) \u003c= 55°F, then pass" - ] - }, - "examples": [ - [ - "if min(T_heat_set) \u003c= 55°F, then pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 11, - "description_brief": "Zone heating setpoint reset temperature minimum value check", - "description_detail": "Heating systems located in climate zones 2-8 shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures above a heating setpoint adjustable down to 55°F or lower. (case study)", - "description_index": [ - "Section 6.4.3.2.2 in 90.1-2004" - ], - "description_datapoints": { - "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" - }, - "description_assertions": [ - "if min(T_heat_set) \u003c= 55°F, then pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ZoneCoolingSetpointMaximum": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 12 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - " Cooling systems located in climate zones 1b, 2b, and 3b shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures below a cooling setpoint adjustable up to 90°F or higher or to prevent high space humidity levels. (case study)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.2.2 in 90.1-2004" - ] - }, - "examples": [ - [ - "Section 6.4.3.2.2 in 90.1-2004"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_cool_set" - ], - "properties": { - "T_cool_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Cooling Setpoint Temperature" - ] - } - }, - "examples": [{ - "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if max(T_cool_set) \u003e= 90F, then pass" - ] - }, - "examples": [ - [ - "if max(T_cool_set) \u003e= 90F, then pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 12, - "description_brief": " Cooling systems located in climate zones 1b, 2b, and 3b shall be equipped with controls that have the capability to automatically restart and temporarily operate the system as required to maintain zone temperatures below a cooling setpoint adjustable up to 90°F or higher or to prevent high space humidity levels. (case study)", - "description_index": [ - "Section 6.4.3.2.2 in 90.1-2004" - ], - "description_datapoints": { - "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" - }, - "description_assertions": [ - "if max(T_cool_set) \u003e= 90F, then pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ZoneHeatingResetDepth": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 13 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the system as required to maintain zone temperatures above an adjustable heating set point at least 10°F below (will be 60°F) the occupied heating set point. (case study)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.3.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.3.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_heat_set" - ], - "properties": { - "T_heat_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Heating Setpoint Temperature" - ] - } - }, - "examples": [{ - "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if max(T_heat_set) - min(T_heat_set) \u003e= 10F, then pass" - ] - }, - "examples": [ - [ - "if max(T_heat_set) - min(T_heat_set) \u003e= 10F, then pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 13, - "description_brief": "Heating systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the system as required to maintain zone temperatures above an adjustable heating set point at least 10°F below (will be 60°F) the occupied heating set point. (case study)", - "description_index": [ - "Section 6.4.3.3.2 in 90.1-2016" - ], - "description_datapoints": { - "T_heat_set": "Zone Thermostat Heating Setpoint Temperature" - }, - "description_assertions": [ - "if max(T_heat_set) - min(T_heat_set) \u003e= 10F, then pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ZoneCoolingResetDepth": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 14 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the mechanical cooling system as required to maintain zone temperatures below an adjustable cooling set point at least 5°F above the occupied cooling set point or to prevent high space humidity levels. (case study)" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.3.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.3.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_cool_set" - ], - "properties": { - "T_cool_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Cooling Setpoint Temperature" - ] - } - }, - "examples": [{ - "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if max(T_cool_set) - min(T_cool_set) \u003e= 5F, then pass" - ] - }, - "examples": [ - [ - "if max(T_cool_set) - min(T_cool_set) \u003e= 5F, then pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 14, - "description_brief": "Cooling systems shall be equipped with controls capable of and configured to automatically restart and temporarily operate the mechanical cooling system as required to maintain zone temperatures below an adjustable cooling set point at least 5°F above the occupied cooling set point or to prevent high space humidity levels. (case study)", - "description_index": [ - "Section 6.4.3.3.2 in 90.1-2016" - ], - "description_datapoints": { - "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature" - }, - "description_assertions": [ - "if max(T_cool_set) - min(T_cool_set) \u003e= 5F, then pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "NightCycleOperation": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 15 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "TSPR tool software development" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "null", - "default": null, - "examples": [ - null - ] - }, - "examples": [ - [ - null] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_zone", - "HVAC_operation_sch", - "T_heat_set", - "T_cool_set", - "Fan_elec_rate" - ], - "properties": { - "T_zone": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Air Temperature" - ] - }, - "HVAC_operation_sch": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "HVAC Operation Schedule" - ] - }, - "T_heat_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Heating Setpoint Temperature" - ] - }, - "T_cool_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Cooling Setpoint Temperature" - ] - }, - "Fan_elec_rate": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Fan Electricity Rate" - ] - } - }, - "examples": [{ - "T_zone": "Zone Air Temperature", - "HVAC_operation_sch": "HVAC Operation Schedule", - "T_heat_set": "Zone Thermostat Heating Setpoint Temperature", - "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature", - "Fan_elec_rate": "Fan Electricity Rate" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if T_heat_set \u003c= T_zone \u003c= T_cool_set and Fan_elec_rate ==0 then x1=0 else x1=1, if (T_zone \u003e T_cool_set and Fan_elec_rate \u003e= 0) and (T_zone \u003c T_heat_set and Fan_elec_rate\u003e0) then x2=0 else x=1, if x1 and x2=0, then pass, elseif x1=0 and x2=1 then fail, elseif x1=1 and x2=0 then fail, elseif x1=1 and x2=1 then fail" - ] - }, - "examples": [ - [ - "if T_heat_set \u003c= T_zone \u003c= T_cool_set and Fan_elec_rate ==0 then x1=0 else x1=1, if (T_zone \u003e T_cool_set and Fan_elec_rate \u003e= 0) and (T_zone \u003c T_heat_set and Fan_elec_rate\u003e0) then x2=0 else x=1, if x1 and x2=0, then pass, elseif x1=0 and x2=1 then fail, elseif x1=1 and x2=0 then fail, elseif x1=1 and x2=1 then fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 15, - "description_brief": "TSPR tool software development", - "description_index": [ - null - ], - "description_datapoints": { - "T_zone": "Zone Air Temperature", - "HVAC_operation_sch": "HVAC Operation Schedule", - "T_heat_set": "Zone Thermostat Heating Setpoint Temperature", - "T_cool_set": "Zone Thermostat Cooling Setpoint Temperature", - "Fan_elec_rate": "Fan Electricity Rate" - }, - "description_assertions": [ - "if T_heat_set \u003c= T_zone \u003c= T_cool_set and Fan_elec_rate ==0 then x1=0 else x1=1, if (T_zone \u003e T_cool_set and Fan_elec_rate \u003e= 0) and (T_zone \u003c T_heat_set and Fan_elec_rate\u003e0) then x2=0 else x=1, if x1 and x2=0, then pass, elseif x1=0 and x2=1 then fail, elseif x1=1 and x2=0 then fail, elseif x1=1 and x2=1 then fail" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ERVTemperatureControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 16 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "TSPR tool software development" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "null", - "default": null, - "examples": [ - null - ] - }, - "examples": [ - [ - null] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "MIN_OA_FLOW", - "OA_FLOW", - "NOM_FLOW", - "HX_DSN_EFF_HTG", - "HX_DSN_EFF_HTG_75_PCT", - "HX_DSN_EFF_CLG", - "HX_DSN_EFF_CLG_75_PCT", - "T_OA", - "T_SO", - "T_SO_SP", - "T_EI" - ], - "properties": { - "MIN_OA_FLOW": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum outdoor air flow rate" - ] - }, - "OA_FLOW": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air flow rate" - ] - }, - "NOM_FLOW": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heat exchanger's norminal flow rate" - ] - }, - "HX_DSN_EFF_HTG": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heat exchanger heating effectiveness at the nominal air flow rate" - ] - }, - "HX_DSN_EFF_HTG_75_PCT": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heat exchanger heating effectiveness at 75% of the nominal air flow rate" - ] - }, - "HX_DSN_EFF_CLG": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heat exchanger cooling effectiveness at the nominal air flow rate" - ] - }, - "HX_DSN_EFF_CLG_75_PCT": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heat exchanger cooling effectiveness at 75% of the nominal air flow rate" - ] - }, - "T_OA": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air dry-bulb temperature" - ] - }, - "T_SO": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Supply air temperature" - ] - }, - "T_SO_SP": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Supply air temperature setpoint" - ] - }, - "T_EI": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone air temperature" - ] - } - }, - "examples": [{ - "MIN_OA_FLOW": "Minimum outdoor air flow rate", - "OA_FLOW": "Outdoor air flow rate", - "NOM_FLOW": "Heat exchanger's norminal flow rate", - "HX_DSN_EFF_HTG": "Heat exchanger heating effectiveness at the nominal air flow rate", - "HX_DSN_EFF_HTG_75_PCT": "Heat exchanger heating effectiveness at 75% of the nominal air flow rate", - "HX_DSN_EFF_CLG": "Heat exchanger cooling effectiveness at the nominal air flow rate", - "HX_DSN_EFF_CLG_75_PCT": "Heat exchanger cooling effectiveness at 75% of the nominal air flow rate", - "T_OA": "Outdoor air dry-bulb temperature", - "T_SO": "Supply air temperature", - "T_SO_SP": "Supply air temperature setpoint", - "T_EI": "Zone air temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Check that the ERV is bypassed during economizer operation; During non-economizer operation, if the outdoor air flow rate, 1) if T_SO \u003e T_SO_SP the ERV is not operating correctly if T_OA \u003c T_EI and the ERV is running, T_OA \u003e T_EI and the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value, 2) if T_SO \u003c T_SO_SP the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value" - ] - }, - "examples": [ - [ - "Check that the ERV is bypassed during economizer operation; During non-economizer operation, if the outdoor air flow rate, 1) if T_SO \u003e T_SO_SP the ERV is not operating correctly if T_OA \u003c T_EI and the ERV is running, T_OA \u003e T_EI and the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value, 2) if T_SO \u003c T_SO_SP the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 16, - "description_brief": "TSPR tool software development", - "description_index": [ - null - ], - "description_datapoints": { - "MIN_OA_FLOW": "Minimum outdoor air flow rate", - "OA_FLOW": "Outdoor air flow rate", - "NOM_FLOW": "Heat exchanger's norminal flow rate", - "HX_DSN_EFF_HTG": "Heat exchanger heating effectiveness at the nominal air flow rate", - "HX_DSN_EFF_HTG_75_PCT": "Heat exchanger heating effectiveness at 75% of the nominal air flow rate", - "HX_DSN_EFF_CLG": "Heat exchanger cooling effectiveness at the nominal air flow rate", - "HX_DSN_EFF_CLG_75_PCT": "Heat exchanger cooling effectiveness at 75% of the nominal air flow rate", - "T_OA": "Outdoor air dry-bulb temperature", - "T_SO": "Supply air temperature", - "T_SO_SP": "Supply air temperature setpoint", - "T_EI": "Zone air temperature" - }, - "description_assertions": [ - "Check that the ERV is bypassed during economizer operation; During non-economizer operation, if the outdoor air flow rate, 1) if T_SO \u003e T_SO_SP the ERV is not operating correctly if T_OA \u003c T_EI and the ERV is running, T_OA \u003e T_EI and the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value, 2) if T_SO \u003c T_SO_SP the ERV is NOT running and the operating sensible efficiency of the ERV is NOT close to the operating design value" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "AutomaticOADamperControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 17 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "HVAC system shall be turned on and off everyday" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.4.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.4.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "o", - "m_oa", - "eco_onoff", - "tol_o", - "tol_m_oa" - ], - "properties": { - "o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Number of occupants" - ] - }, - "m_oa": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Air terminal outdoor air volume flow rate" - ] - }, - "eco_onoff": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Air system outdoor air economizer status" - ] - }, - "tol_o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for the number of occupants" - ] - }, - "tol_m_oa": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for the air terminal air volume flow rate" - ] - } - }, - "examples": [{ - "o": "Number of occupants", - "m_oa": "Air terminal outdoor air volume flow rate", - "eco_onoff": "Air system outdoor air economizer status", - "tol_o": "Tolerance for the number of occupants", - "tol_m_oa": "Tolerance for the air terminal air volume flow rate" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if no_of_occ \u003c= 0 + tol and m_ea + m_oa \u003e 0 and eco_onoff = 0, then false else pass" - ] - }, - "examples": [ - [ - "if no_of_occ \u003c= 0 + tol and m_ea + m_oa \u003e 0 and eco_onoff = 0, then false else pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 17, - "description_brief": "HVAC system shall be turned on and off everyday", - "description_index": [ - "Section 6.4.3.4.2 in 90.1-2016" - ], - "description_datapoints": { - "o": "Number of occupants", - "m_oa": "Air terminal outdoor air volume flow rate", - "eco_onoff": "Air system outdoor air economizer status", - "tol_o": "Tolerance for the number of occupants", - "tol_m_oa": "Tolerance for the air terminal air volume flow rate" - }, - "description_assertions": [ - "if no_of_occ \u003c= 0 + tol and m_ea + m_oa \u003e 0 and eco_onoff = 0, then false else pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "FanStaticPressureResetControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 18 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "The set point is reset lower until one zone damper is nearly wide open" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.3.2.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.3.2.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "p_set", - "d_VAV_x", - "tol", - "p_set_min" - ], - "properties": { - "p_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Static pressure setpoint" - ] - }, - "d_VAV_x": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "VAV Damper x Position (includes all VAV dampers served by the system under test" - ] - }, - "tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for VAV box damper position openings" - ] - }, - "p_set_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - ": Minimum static pressure setpoint threshold" - ] - } - }, - "examples": [{ - "p_set": "Static pressure setpoint", - "d_VAV_x": "VAV Damper x Position (includes all VAV dampers served by the system under test", - "tol": "Tolerance for VAV box damper position openings", - "p_set_min": ": Minimum static pressure setpoint threshold" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if d_VAV(n) (n=1,2,...,N) \u003c 0.9 and p_set(t) \u003e p_set(t-1), then fail else pass" - ] - }, - "examples": [ - [ - "if d_VAV(n) (n=1,2,...,N) \u003c 0.9 and p_set(t) \u003e p_set(t-1), then fail else pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 18, - "description_brief": "The set point is reset lower until one zone damper is nearly wide open", - "description_index": [ - "Section 6.5.3.2.3 in 90.1-2016" - ], - "description_datapoints": { - "p_set": "Static pressure setpoint", - "d_VAV_x": "VAV Damper x Position (includes all VAV dampers served by the system under test", - "tol": "Tolerance for VAV box damper position openings", - "p_set_min": ": Minimum static pressure setpoint threshold" - }, - "description_assertions": [ - "if d_VAV(n) (n=1,2,...,N) \u003c 0.9 and p_set(t) \u003e p_set(t-1), then fail else pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "HeatRejectionFanVariableFlowControlsCells": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 19 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heat rejection fan variable flow controls cells" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.5.2.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.5.2.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "ct_op_cells", - "ct_cells", - "ct_m", - "ct_m_des", - "min_flow_frac_per_cell", - "ct_P_fan" - ], - "properties": { - "ct_op_cells": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Number of operating cooling tower cells" - ] - }, - "ct_cells": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Number of cooling tower cells" - ] - }, - "ct_m": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling tower mass flow rate" - ] - }, - "ct_m_des": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling tower design mass flow rate" - ] - }, - "min_flow_frac_per_cell": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum flow fraction per cooling tower cell" - ] - }, - "ct_P_fan": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling tower fan power" - ] - } - }, - "examples": [{ - "ct_op_cells": "Number of operating cooling tower cells", - "ct_cells": "Number of cooling tower cells", - "ct_m": "Cooling tower mass flow rate", - "ct_m_des": "Cooling tower design mass flow rate", - "min_flow_frac_per_cell": "Minimum flow fraction per cooling tower cell", - "ct_P_fan": "Cooling tower fan power" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if the number of operating cooling tower cells is equal to the maximum number of cooling tower cells then pass else fail" - ] - }, - "examples": [ - [ - "if the number of operating cooling tower cells is equal to the maximum number of cooling tower cells then pass else fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 19, - "description_brief": "Heat rejection fan variable flow controls cells", - "description_index": [ - "Section 6.5.5.2.2 in 90.1-2016" - ], - "description_datapoints": { - "ct_op_cells": "Number of operating cooling tower cells", - "ct_cells": "Number of cooling tower cells", - "ct_m": "Cooling tower mass flow rate", - "ct_m_des": "Cooling tower design mass flow rate", - "min_flow_frac_per_cell": "Minimum flow fraction per cooling tower cell", - "ct_P_fan": "Cooling tower fan power" - }, - "description_assertions": [ - "if the number of operating cooling tower cells is equal to the maximum number of cooling tower cells then pass else fail" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ServiceWaterHeatingSystemControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 20 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Service water heating system control" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 7.4.4.3 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 7.4.4.3 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_wh_inlet" - ], - "properties": { - "T_wh_inlet": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Water temperature on demand side from the water heater" - ] - } - }, - "examples": [{ - "T_wh_inlet": "Water temperature on demand side from the water heater" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if maximum(T_wh_inlet) \u003c 43.33 °C Then pass else fail" - ] - }, - "examples": [ - [ - "if maximum(T_wh_inlet) \u003c 43.33 °C Then pass else fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 20, - "description_brief": "Service water heating system control", - "description_index": [ - "Section 7.4.4.3 in 90.1-2016" - ], - "description_datapoints": { - "T_wh_inlet": "Water temperature on demand side from the water heater" - }, - "description_assertions": [ - "if maximum(T_wh_inlet) \u003c 43.33 °C Then pass else fail" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "VAVStaticPressureSensorLocation": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 21 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "VAV static pressure sensor location requirement" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.3.2.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.3.2.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "p_fan_set", - "tol_P_fan" - ], - "properties": { - "p_fan_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Static pressure setpoint" - ] - }, - "tol_P_fan": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for VAV box static pressure sensor" - ] - } - }, - "examples": [{ - "p_fan_set": "Static pressure setpoint", - "tol_P_fan": "Tolerance for VAV box static pressure sensor" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if static pressure setpoint is no greater than 1.2 in of water (298.608 Pa) then pass else fail" - ] - }, - "examples": [ - [ - "if static pressure setpoint is no greater than 1.2 in of water (298.608 Pa) then pass else fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 21, - "description_brief": "VAV static pressure sensor location requirement", - "description_index": [ - "Section 6.5.3.2.2 in 90.1-2016" - ], - "description_datapoints": { - "p_fan_set": "Static pressure setpoint", - "tol_P_fan": "Tolerance for VAV box static pressure sensor" - }, - "description_assertions": [ - "if static pressure setpoint is no greater than 1.2 in of water (298.608 Pa) then pass else fail" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "VentilationFanControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 22 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Ventilation fan control" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.4.4 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.4.4 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "no_of_occ", - "Q_load", - "P_fan" - ], - "properties": { - "no_of_occ": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "People Occupant Count" - ] - }, - "Q_load": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Predicted Sensible Load to Setpoint Heat Transfer Rate" - ] - }, - "P_fan": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Fan Electric Power" - ] - } - }, - "examples": [{ - "no_of_occ": "People Occupant Count", - "Q_load": "Zone Predicted Sensible Load to Setpoint Heat Transfer Rate", - "P_fan": "Fan Electric Power" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if Q_load = 0 and no_of_occ = 0 and P_fan != 0 then fail else pass" - ] - }, - "examples": [ - [ - "if Q_load = 0 and no_of_occ = 0 and P_fan != 0 then fail else pass"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 22, - "description_brief": "Ventilation fan control", - "description_index": [ - "Section 6.4.3.4.4 in 90.1-2016" - ], - "description_datapoints": { - "no_of_occ": "People Occupant Count", - "Q_load": "Zone Predicted Sensible Load to Setpoint Heat Transfer Rate", - "P_fan": "Fan Electric Power" - }, - "description_assertions": [ - "if Q_load = 0 and no_of_occ = 0 and P_fan != 0 then fail else pass" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "WLHPLoopHeatRejectionControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 23 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Water-loop heat pump heat rejection control" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.2.2.3 (a) in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.2.2.3 (a) in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_max_heating_loop", - "T_min_cooling_loop", - "m_pump", - "tol" - ], - "properties": { - "T_max_heating_loop": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "maximum temperature of heating loop" - ] - }, - "T_min_cooling_loop": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "minimum temperature of cooling loop" - ] - }, - "m_pump": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Pump Mass Flow Rate" - ] - }, - "tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for water-loop temperature difference" - ] - } - }, - "examples": [{ - "T_max_heating_loop": "maximum temperature of heating loop", - "T_min_cooling_loop": "minimum temperature of cooling loop", - "m_pump": "Pump Mass Flow Rate", - "tol": "Tolerance for water-loop temperature difference" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "If the temperature difference between the maximum heating loop and minimum heating loop when the pump runs is greater than 11.11 °C, then pass else fail" - ] - }, - "examples": [ - [ - "If the temperature difference between the maximum heating loop and minimum heating loop when the pump runs is greater than 11.11 °C, then pass else fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 23, - "description_brief": "Water-loop heat pump heat rejection control", - "description_index": [ - "Section 6.5.2.2.3 (a) in 90.1-2016" - ], - "description_datapoints": { - "T_max_heating_loop": "maximum temperature of heating loop", - "T_min_cooling_loop": "minimum temperature of cooling loop", - "m_pump": "Pump Mass Flow Rate", - "tol": "Tolerance for water-loop temperature difference" - }, - "description_assertions": [ - "If the temperature difference between the maximum heating loop and minimum heating loop when the pump runs is greater than 11.11 °C, then pass else fail" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "AutomaticShutdown": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 24 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Off Hour Automatic Temperature Setback and System Shutoff" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "null", - "default": null, - "examples": [ - null - ] - }, - "examples": [ - [ - null] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "hvac_set" - ], - "properties": { - "hvac_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "HVAC Operation Schedule" - ] - } - }, - "examples": [{ - "hvac_set": "HVAC Operation Schedule" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "if minimum start_time != maximum start_time and minimum end_time != maximum end_time then pass else fail" - ] - }, - "examples": [ - [ - "if minimum start_time != maximum start_time and minimum end_time != maximum end_time then pass else fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 24, - "description_brief": "Off Hour Automatic Temperature Setback and System Shutoff", - "description_index": [ - null - ], - "description_datapoints": { - "hvac_set": "HVAC Operation Schedule" - }, - "description_assertions": [ - "if minimum start_time != maximum start_time and minimum end_time != maximum end_time then pass else fail" - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "HeatPumpSupplementalHeatLockout": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 25 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Supplemental heating coil should be off when the heat pump can meet the load by itself" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.5 Heat Pump Auxiliary Heat Control and 6.3.2.h Criteria in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.5 Heat Pump Auxiliary Heat Control and 6.3.2.h Criteria in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "C_ref", - "L_op", - "C_t_mod", - "P_supp_ht", - "C_ff_mod", - "L_defrost" - ], - "properties": { - "C_ref": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating Coil Reference Capacity" - ] - }, - "L_op": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating Coil Runtime Fraction" - ] - }, - "C_t_mod": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating Coil Heating Rate" - ] - }, - "P_supp_ht": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating Coil Gas Rate" - ] - }, - "C_ff_mod": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating Capacity Function of Flow Fraction Curve" - ] - }, - "L_defrost": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Defrost load on the heating coil" - ] - } - }, - "examples": [{ - "C_ref": "Heating Coil Reference Capacity", - "L_op": "Heating Coil Runtime Fraction", - "C_t_mod": "Heating Coil Heating Rate", - "P_supp_ht": "Heating Coil Gas Rate", - "C_ff_mod": "Heating Capacity Function of Flow Fraction Curve", - "L_defrost": "Defrost load on the heating coil" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "If C_ref * C_t_mod \u003e= L_op and P_supp_ht == 0 then pass else fail" - ] - }, - "examples": [ - [ - "If C_ref * C_t_mod \u003e= L_op and P_supp_ht == 0 then pass else fail"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 25, - "description_brief": "Supplemental heating coil should be off when the heat pump can meet the load by itself", - "description_index": [ - "Section 6.4.3.5 Heat Pump Auxiliary Heat Control and 6.3.2.h Criteria in 90.1-2016" - ], - "description_datapoints": { - "C_ref": "Heating Coil Reference Capacity", - "L_op": "Heating Coil Runtime Fraction", - "C_t_mod": "Heating Coil Heating Rate", - "P_supp_ht": "Heating Coil Gas Rate", - "C_ff_mod": "Heating Capacity Function of Flow Fraction Curve", - "L_defrost": "Defrost load on the heating coil" - }, - "description_assertions": [ - "If C_ref * C_t_mod \u003e= L_op and P_supp_ht == 0 then pass else fail" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "HeatRejectionFanVariableFlowControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 26 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "The cooling tower fan power is 30% of the design value at 50% flow" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.5.5.2.1 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.5.5.2.1 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "ct_P_fan", - "ct_P_fan_dsgn", - "ct_m_fan_ratio", - "ct_m_fan_dsgn" - ], - "properties": { - "ct_P_fan": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling Tower Fan Power" - ] - }, - "ct_P_fan_dsgn": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling Tower Design Fan Power" - ] - }, - "ct_m_fan_ratio": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling Tower Air Flow Rate Ratio" - ] - }, - "ct_m_fan_dsgn": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling Tower Design Air Flow" - ] - } - }, - "examples": [{ - "ct_P_fan": "Cooling Tower Fan Power", - "ct_P_fan_dsgn": "Cooling Tower Design Fan Power", - "ct_m_fan_ratio": "Cooling Tower Air Flow Rate Ratio", - "ct_m_fan_dsgn": "Cooling Tower Design Air Flow" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that at 5% flow, the cooling tower fan power is 30% of the design value. Since simulation results might not include that exact point, we use a regression based approach to determining if the code requirement is met" - ] - }, - "examples": [ - [ - "Verify that at 5% flow, the cooling tower fan power is 30% of the design value. Since simulation results might not include that exact point, we use a regression based approach to determining if the code requirement is met"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 26, - "description_brief": "The cooling tower fan power is 30% of the design value at 50% flow", - "description_index": [ - "Section 6.5.5.2.1 in 90.1-2016" - ], - "description_datapoints": { - "ct_P_fan": "Cooling Tower Fan Power", - "ct_P_fan_dsgn": "Cooling Tower Design Fan Power", - "ct_m_fan_ratio": "Cooling Tower Air Flow Rate Ratio", - "ct_m_fan_dsgn": "Cooling Tower Design Air Flow" - }, - "description_assertions": [ - "Verify that at 5% flow, the cooling tower fan power is 30% of the design value. Since simulation results might not include that exact point, we use a regression based approach to determining if the code requirement is met" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "DemandControlVentilation": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 27 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Demand control ventilation verification for high-occupancy areas" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.8 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.8 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "v_oa", - "s_ahu", - "s_eco", - "no_of_occ" - ], - "properties": { - "v_oa": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Air Terminal Outdoor Air Volume Flow Rate" - ] - }, - "s_ahu": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "status of HVAC system operation" - ] - }, - "s_eco": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Air System Outdoor Air Economizer Status" - ] - }, - "no_of_occ": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "People Occupant Count" - ] - } - }, - "examples": [{ - "v_oa": "Zone Air Terminal Outdoor Air Volume Flow Rate", - "s_ahu": "status of HVAC system operation", - "s_eco": "Air System Outdoor Air Economizer Status", - "no_of_occ": "People Occupant Count" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "i) If v_oa is constant over time, NO DCV presents. ii) If v_oa has two clusters, DCV with hbinary control presents. iii) v_oa is linearly correlated to o_ahu, DCV with occupant-counting based control presents" - ] - }, - "examples": [ - [ - "i) If v_oa is constant over time, NO DCV presents. ii) If v_oa has two clusters, DCV with hbinary control presents. iii) v_oa is linearly correlated to o_ahu, DCV with occupant-counting based control presents"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 27, - "description_brief": "Demand control ventilation verification for high-occupancy areas", - "description_index": [ - "Section 6.4.3.8 in 90.1-2016" - ], - "description_datapoints": { - "v_oa": "Zone Air Terminal Outdoor Air Volume Flow Rate", - "s_ahu": "status of HVAC system operation", - "s_eco": "Air System Outdoor Air Economizer Status", - "no_of_occ": "People Occupant Count" - }, - "description_assertions": [ - "i) If v_oa is constant over time, NO DCV presents. ii) If v_oa has two clusters, DCV with hbinary control presents. iii) v_oa is linearly correlated to o_ahu, DCV with occupant-counting based control presents" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "GuestRoomControlTemp": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 28 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify whether there is guest room temperature control during operation hours" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.3.5 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.3.5 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "T_z_hea_set", - "T_z_coo_set", - "O_sch", - "tol_occ", - "tol_temp" - ], - "properties": { - "T_z_hea_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Heating Setpoint Temperature" - ] - }, - "T_z_coo_set": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Thermostat Cooling Setpoint Temperature" - ] - }, - "O_sch": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupant Schedule" - ] - }, - "tol_occ": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerence for Occupant Schedule" - ] - }, - "tol_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for Temperature" - ] - } - }, - "examples": [{ - "T_z_hea_set": "Zone Thermostat Heating Setpoint Temperature", - "T_z_coo_set": "Zone Thermostat Cooling Setpoint Temperature", - "O_sch": "Occupant Schedule", - "tol_occ": "Tolerence for Occupant Schedule", - "tol_temp": "Tolerance for Temperature" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Check the two different temperature control logics when the room is/isn't rented out" - ] - }, - "examples": [ - [ - "Check the two different temperature control logics when the room is/isn't rented out"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 28, - "description_brief": "Verify whether there is guest room temperature control during operation hours", - "description_index": [ - "Section 6.4.3.3.5 in 90.1-2016" - ], - "description_datapoints": { - "T_z_hea_set": "Zone Thermostat Heating Setpoint Temperature", - "T_z_coo_set": "Zone Thermostat Cooling Setpoint Temperature", - "O_sch": "Occupant Schedule", - "tol_occ": "Tolerence for Occupant Schedule", - "tol_temp": "Tolerance for Temperature" - }, - "description_assertions": [ - "Check the two different temperature control logics when the room is/isn't rented out" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "GuestRoomControlVent": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 29 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify whether there is guest room outdoor airflow control during operation hours" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 6.4.3.3.5.2 in 90.1-2016" - ] - }, - "examples": [ - [ - "Section 6.4.3.3.5.2 in 90.1-2016"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "damper_sch", - "m_oa_fraction", - "O_sch", - "m_oa_heat_design", - "m_oa_cool_design", - "volume", - "v_outdoor_per_zone", - "tol_occ", - "tol_oa_flow" - ], - "properties": { - "damper_sch": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Damper Schdule" - ] - }, - "m_oa_fraction": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Air System Outdoor Air Flow Fraction" - ] - }, - "O_sch": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupant schedule" - ] - }, - "m_oa_heat_design": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Design Heating Air Flow Rate" - ] - }, - "m_oa_cool_design": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Design Cooling Air Flow Rate" - ] - }, - "volume": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone Volume" - ] - }, - "v_outdoor_per_zone": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor Air Flow per Zone Floor Area" - ] - }, - "tol_occ": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerence for occupant Schedule" - ] - }, - "tol_oa_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance for Outdoor Airflow" - ] - } - }, - "examples": [{ - "damper_sch": "Damper Schdule", - "m_oa_fraction": "Air System Outdoor Air Flow Fraction", - "O_sch": "Occupant schedule", - "m_oa_heat_design": "Design Heating Air Flow Rate", - "m_oa_cool_design": "Design Cooling Air Flow Rate", - "volume": "Zone Volume", - "v_outdoor_per_zone": "Outdoor Air Flow per Zone Floor Area", - "tol_occ": "Tolerence for occupant Schedule", - "tol_oa_flow": "Tolerance for Outdoor Airflow" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Check the two different airflow control logics when the room is/isn't rented out" - ] - }, - "examples": [ - [ - "Check the two different airflow control logics when the room is/isn't rented out"] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 29, - "description_brief": "Verify whether there is guest room outdoor airflow control during operation hours", - "description_index": [ - "Section 6.4.3.3.5.2 in 90.1-2016" - ], - "description_datapoints": { - "damper_sch": "Damper Schdule", - "m_oa_fraction": "Air System Outdoor Air Flow Fraction", - "O_sch": "Occupant schedule", - "m_oa_heat_design": "Design Heating Air Flow Rate", - "m_oa_cool_design": "Design Cooling Air Flow Rate", - "volume": "Zone Volume", - "v_outdoor_per_zone": "Outdoor Air Flow per Zone Floor Area", - "tol_occ": "Tolerence for occupant Schedule", - "tol_oa_flow": "Tolerance for Outdoor Airflow" - }, - "description_assertions": [ - "Check the two different airflow control logics when the room is/isn't rented out" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36SupplyAirTemperatureSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 30 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Supply air temperature operation following the Guideline 36 recommendations" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the supply air temperature setpoint of a system follows the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.2 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.2 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "oa_t", - "t_max", - "sa_t_sp_ac", - "oa_t_min", - "oa_t_max", - "min_clg_sa_t_sp", - "max_clg_sa_t_sp", - "sa_sp_tol" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "oa_t": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air temperature" - ] - }, - "t_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum supply air temperature setpoint based on requests" - ] - }, - "sa_t_sp_ac": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Actual supply air temperature setpoint" - ] - }, - "oa_t_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum outdoor air temperature for linear SAT reset" - ] - }, - "oa_t_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum outdoor air temperature for linear SAT reset" - ] - }, - "min_clg_sa_t_sp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum cooling supply air temperature setpoint" - ] - }, - "max_clg_sa_t_sp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum cooling supply air temperature setpoint" - ] - }, - "sa_sp_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply air temperature tolerance" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "oa_t": "Outdoor air temperature", - "t_max": "Maximum supply air temperature setpoint based on requests", - "sa_t_sp_ac": "Actual supply air temperature setpoint", - "oa_t_min": "Minimum outdoor air temperature for linear SAT reset", - "oa_t_max": "Maximum outdoor air temperature for linear SAT reset", - "min_clg_sa_t_sp": "Minimum cooling supply air temperature setpoint", - "max_clg_sa_t_sp": "Maximum cooling supply air temperature setpoint", - "sa_sp_tol": "supply air temperature tolerance" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if t_max \u003e max_clg_sa_t_sp", - " fail", - "end", - "", - "switch operation_mode", - "case 'cooldown'", - " sa_t_sp = min_clg_sa_t_sp", - "case 'warmup', 'setback", - " sa_t_sp = 35 # 95 F", - "case 'occupied', 'setup'", - " if oa_t \u003c= oa_t_min", - " sa_t_sp = t_max", - " else if oa_t \u003e= oa_t_max", - " sa_t_sp = min_clg_sa_t_sp", - " else", - " sa_t_sp = (oa_t - oa_t_min) * (t_max - min_clg_sa_t_sp) / (oa_t_min - oa_t_max) + t_max ", - "# linear interpolation", - " end", - "if abs(sa_t_sp - sa_t_s_ac) \u003c sa_sp_tol", - " pass", - "else" - ] - }, - "examples": [ - ["if t_max \u003e max_clg_sa_t_sp", - " fail", - "end", - "", - "switch operation_mode", - "case 'cooldown'", - " sa_t_sp = min_clg_sa_t_sp", - "case 'warmup', 'setback", - " sa_t_sp = 35 # 95 F", - "case 'occupied', 'setup'", - " if oa_t \u003c= oa_t_min", - " sa_t_sp = t_max", - " else if oa_t \u003e= oa_t_max", - " sa_t_sp = min_clg_sa_t_sp", - " else", - " sa_t_sp = (oa_t - oa_t_min) * (t_max - min_clg_sa_t_sp) / (oa_t_min - oa_t_max) + t_max ", - "# linear interpolation", - " end", - "end", - "", - "if abs(sa_t_sp - sa_t_s_ac) \u003c sa_sp_tol", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 30, - "description_brief": "Supply air temperature operation following the Guideline 36 recommendations", - "description_detail": "Verify that the supply air temperature setpoint of a system follows the Guideline 36 recommendations", - "description_index": [ - "Section 5.16.2.2 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "oa_t": "Outdoor air temperature", - "t_max": "Maximum supply air temperature setpoint based on requests", - "sa_t_sp_ac": "Actual supply air temperature setpoint", - "oa_t_min": "Minimum outdoor air temperature for linear SAT reset", - "oa_t_max": "Maximum outdoor air temperature for linear SAT reset", - "min_clg_sa_t_sp": "Minimum cooling supply air temperature setpoint", - "max_clg_sa_t_sp": "Maximum cooling supply air temperature setpoint", - "sa_sp_tol": "supply air temperature tolerance" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if t_max \u003e max_clg_sa_t_sp", - " fail", - "end", - "", - "switch operation_mode", - "case 'cooldown'", - " sa_t_sp = min_clg_sa_t_sp", - "case 'warmup', 'setback", - " sa_t_sp = 35 # 95 F", - "case 'occupied', 'setup'", - " if oa_t \u003c= oa_t_min", - " sa_t_sp = t_max", - " else if oa_t \u003e= oa_t_max", - " sa_t_sp = min_clg_sa_t_sp", - " else", - " sa_t_sp = (oa_t - oa_t_min) * (t_max - min_clg_sa_t_sp) / (oa_t_min - oa_t_max) + t_max ", - "# linear interpolation", - " end", - "end", - "", - "if abs(sa_t_sp - sa_t_s_ac) \u003c sa_sp_tol", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36SimultaneousHeatingCooling": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 31 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verifiy that both the heating and cooling coil are not operating at the same time" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "heating_output", - "cooling_output" - ], - "properties": { - "heating_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU heating coil output" - ] - }, - "cooling_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU cooling coil output" - ] - } - }, - "examples": [{ - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if heating_output \u003e 0 and cooling_output \u003e 0", - " fail", - "else", - " pass", - "end" - ] - }, - "examples": [ - ["if heating_output \u003e 0 and cooling_output \u003e 0", - " fail", - "else", - " pass", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 31, - "description_brief": "Verifiy that both the heating and cooling coil are not operating at the same time", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if heating_output \u003e 0 and cooling_output \u003e 0", - " fail", - "else", - " pass", - "end" - ] - }] - }, - "G36ReturnAirDamperPositionForReliefDamperOrFan": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 32 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the return air damper operation follows Guideline 36 recommendations for systems with relief damper/fan" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "max_ra_p", - "ra_p_tol", - "ra_p", - "oa_p", - "max_oa_p" - ], - "properties": { - "max_ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum return air damper position" - ] - }, - "ra_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position tolerance" - ] - }, - "ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position" - ] - }, - "oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position" - ] - }, - "max_oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum outdoor air damper position" - ] - } - }, - "examples": [{ - "max_ra_p": "Maximum return air damper position", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position", - "oa_p": "Outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if heating_output \u003e 0", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(ra_p - 0) \u003c ra_p_tol", - "else if oa_p \u003c max_oa_p", - "else if abs(oa - max_oa_p) \u003c oa_p_tol", - " if ra_p \u003c max_ra_p", - "end" - ] - }, - "examples": [ - ["if heating_output \u003e 0", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(ra_p - 0) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if oa_p \u003c max_oa_p", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(oa - max_oa_p) \u003c oa_p_tol", - " if ra_p \u003c max_ra_p", - " pass", - " else", - " fail", - " end", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 32, - "description_brief": "Verify that the return air damper operation follows Guideline 36 recommendations for systems with relief damper/fan", - "description_detail": "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "max_ra_p": "Maximum return air damper position", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position", - "oa_p": "Outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if heating_output \u003e 0", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(ra_p - 0) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if oa_p \u003c max_oa_p", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(oa - max_oa_p) \u003c oa_p_tol", - " if ra_p \u003c max_ra_p", - " pass", - " else", - " fail", - " end", - "end" - ] - }] - }, - "G36OutdoorAirDamperPositionForReliefDamperOrFan": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 33 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with relief damper/fan" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "heating_output", - "cooling_output", - "economizer_high_limit_reached", - "oa_p", - "min_oa_p", - "max_oa_p", - "oa_p_tol", - "ra_p_tol", - "ra_p", - "max_ra_p" - ], - "properties": { - "heating_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU heating coil output" - ] - }, - "cooling_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU cooling coil output" - ] - }, - "economizer_high_limit_reached": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Economizer high limit flag" - ] - }, - "oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position" - ] - }, - "min_oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum outdoor air damper position" - ] - }, - "max_oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum outdoor air damper position" - ] - }, - "oa_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position tolerance" - ] - }, - "ra_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position tolerance" - ] - }, - "ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position" - ] - }, - "max_ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum return air damper position" - ] - } - }, - "examples": [{ - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "economizer_high_limit_reached": "Economizer high limit flag", - "oa_p": "Outdoor air damper position", - "min_oa_p": "Minimum outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position", - "oa_p_tol": "Outdoor air damper position tolerance", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position", - "max_ra_p": "Maximum return air damper position" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if heating_output \u003e 0", - " if abs(oa_p - min_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if economizer_high_limit_reached", - " if abs(oa_p - min_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - " if abs(oa_p - max_oa_p) \u003c oa_p_tol", - "else if ra_p \u003c max_ra_p", - " if abs(oa_p - max_oa_p) \u003c oa_p_tol", - "else if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " if min_oa_p \u003c oa_p \u003c max_oa_p", - "end" - ] - }, - "examples": [ - ["if heating_output \u003e 0", - " if abs(oa_p - min_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if economizer_high_limit_reached", - " if abs(oa_p - min_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - " else", - " if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - " end", - "else if ra_p \u003c max_ra_p", - " if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " if min_oa_p \u003c oa_p \u003c max_oa_p", - " pass", - " else", - " fail", - " end", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 33, - "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with relief damper/fan", - "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "economizer_high_limit_reached": "Economizer high limit flag", - "oa_p": "Outdoor air damper position", - "min_oa_p": "Minimum outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position", - "oa_p_tol": "Outdoor air damper position tolerance", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position", - "max_ra_p": "Maximum return air damper position" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if heating_output \u003e 0", - " if abs(oa_p - min_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if economizer_high_limit_reached", - " if abs(oa_p - min_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - " else", - " if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - " end", - "else if ra_p \u003c max_ra_p", - " if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " if min_oa_p \u003c oa_p \u003c max_oa_p", - " pass", - " else", - " fail", - " end", - "end" - ] - }] - }, - "G36ReturnAirDamperPositionForReturnFanAirflowTracking": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 34 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "heating_output", - "cooling_output", - "max_ra_p", - "ra_p_tol", - "ra_p", - "rea_p" - ], - "properties": { - "heating_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU heating coil output" - ] - }, - "cooling_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU cooling coil output" - ] - }, - "max_ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum return air damper position" - ] - }, - "ra_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position tolerance" - ] - }, - "ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position" - ] - }, - "rea_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Relief air damper position" - ] - } - }, - "examples": [{ - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "max_ra_p": "Maximum return air damper position", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position", - "rea_p": "Relief air damper position" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 34, - "description_brief": "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking", - "description_detail": "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "max_ra_p": "Maximum return air damper position", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position", - "rea_p": "Relief air damper position" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "G36OutdoorAirDamperPositionForReturnFanAirflowTracking": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 35 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "oa_p", - "max_oa_p", - "oa_p_tol" - ], - "properties": { - "oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position" - ] - }, - "max_oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum outdoor air damper position" - ] - }, - "oa_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position tolerance" - ] - } - }, - "examples": [{ - "oa_p": "Outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position", - "oa_p_tol": "Outdoor air damper position tolerance" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 35, - "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking", - "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "oa_p": "Outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position", - "oa_p_tol": "Outdoor air damper position tolerance" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36ReliefAirDamperPositionForReturnFanAirflowTracking": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 36 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "heating_output", - "cooling_output", - "max_rea_p", - "rea_p_tol", - "rea_p", - "ra_p" - ], - "properties": { - "heating_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU heating coil output" - ] - }, - "cooling_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU cooling coil output" - ] - }, - "max_rea_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum return air damper position" - ] - }, - "rea_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position tolerance" - ] - }, - "rea_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position" - ] - }, - "ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Relief air damper position" - ] - } - }, - "examples": [{ - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "max_rea_p": "Maximum return air damper position", - "rea_p_tol": "Return air damper position tolerance", - "rea_p": "Return air damper position", - "ra_p": "Relief air damper position" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if heating_output \u003e 0", - " if abs(rea_p - 0) \u003c rea_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(rea_p - max_rea_p) \u003c rea_p_tol", - "else if abs(rea_p - (1 - ra_p) * max_rea_p) \u003c rea_p_tol", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["if heating_output \u003e 0", - " if abs(rea_p - 0) \u003c rea_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(rea_p - max_rea_p) \u003c rea_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(rea_p - (1 - ra_p) * max_rea_p) \u003c rea_p_tol", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 36, - "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with airflow tracking", - "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "max_rea_p": "Maximum return air damper position", - "rea_p_tol": "Return air damper position tolerance", - "rea_p": "Return air damper position", - "ra_p": "Relief air damper position" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if heating_output \u003e 0", - " if abs(rea_p - 0) \u003c rea_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(rea_p - max_rea_p) \u003c rea_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(rea_p - (1 - ra_p) * max_rea_p) \u003c rea_p_tol", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36ReturnAirDamperPositionForReturnFanDirectBuildingPressure": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 37 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "heating_output", - "cooling_output", - "max_ra_p", - "ra_p_tol", - "ra_p" - ], - "properties": { - "heating_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU heating coil output" - ] - }, - "cooling_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU cooling coil output" - ] - }, - "max_ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum return air damper position" - ] - }, - "ra_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position tolerance" - ] - }, - "ra_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Return air damper position" - ] - } - }, - "examples": [{ - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "max_ra_p": "Maximum return air damper position", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if heating_output \u003e 0", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(ra_p - 0) \u003c ra_p_tol", - "else if abs(ra_p - (1 - rea_p) * max_ra_p) \u003c ra_p_tol", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["if heating_output \u003e 0", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(ra_p - 0) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(ra_p - (1 - rea_p) * max_ra_p) \u003c ra_p_tol", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 37, - "description_brief": "Verify that the return air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control", - "description_detail": "Verify that the return air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "heating_output": "AHU heating coil output", - "cooling_output": "AHU cooling coil output", - "max_ra_p": "Maximum return air damper position", - "ra_p_tol": "Return air damper position tolerance", - "ra_p": "Return air damper position" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if heating_output \u003e 0", - " if abs(ra_p - max_ra_p) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if cooling_output \u003e 0", - " if abs(ra_p - 0) \u003c ra_p_tol", - " pass", - " else", - " fail", - " end", - "else if abs(ra_p - (1 - rea_p) * max_ra_p) \u003c ra_p_tol", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36OutdoorAirDamperPositionForReturnFanDirectBuildingPressure": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_detail", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 38 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control" - ] - }, - "description_detail": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "oa_p", - "max_oa_p", - "oa_p_tol" - ], - "properties": { - "oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position" - ] - }, - "max_oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum outdoor air damper position" - ] - }, - "oa_p_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air damper position tolerance" - ] - } - }, - "examples": [{ - "oa_p": "Outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position", - "oa_p_tol": "Outdoor air damper position tolerance" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 38, - "description_brief": "Verify that the outdoor air damper operation follows Guideline 36 recommendations for systems with return fan with direct building pressure control", - "description_detail": "Verify that the outdoor air damper operation follows the Guideline 36 recommendations for supply air temperature setpoint operations", - "description_index": [ - "Section 5.16.2.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "oa_p": "Outdoor air damper position", - "max_oa_p": "Maximum outdoor air damper position", - "oa_p_tol": "Outdoor air damper position tolerance" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if abs(oa_p - max_oa_p) \u003c oa_p_tol", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36FreezeProtectionStage1": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 39 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 freeze protection stage 1 requirements" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.12.1. in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.12.1. in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "supply_air_temp", - "outdoor_damper_command", - "outdoor_damper_minimum" - ], - "properties": { - "supply_air_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply air temperature" - ] - }, - "outdoor_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air damper" - ] - }, - "outdoor_damper_minimum": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air damper minimum position" - ] - } - }, - "examples": [{ - "supply_air_temp": "supply air temperature", - "outdoor_damper_command": "outdoor air damper", - "outdoor_damper_minimum": "outdoor air damper minimum position" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if supply_air_temp \u003c 4.4 (continuously 5 minutes) and outdoor_damper_command \u003e outdoor_damper_minimum:", - " fail", - "elif outdoor_damper_command \u003e outdoor_damper_minimum and not (supply_air_temp \u003e 7 (continuously 5 minutes)):", - "else:", - " pass", - "", - "if never (supply_air_temp \u003c 4.4 (continuously 5 minutes)):", - " untested" - ] - }, - "examples": [ - ["if supply_air_temp \u003c 4.4 (continuously 5 minutes) and outdoor_damper_command \u003e outdoor_damper_minimum:", - " fail", - "elif outdoor_damper_command \u003e outdoor_damper_minimum and not (supply_air_temp \u003e 7 (continuously 5 minutes)):", - " fail", - "else:", - " pass", - "", - "if never (supply_air_temp \u003c 4.4 (continuously 5 minutes)):", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 39, - "description_brief": "G36 freeze protection stage 1 requirements", - "description_index": [ - "Section 5.16.12.1. in Guideline 36-2021" - ], - "description_datapoints": { - "supply_air_temp": "supply air temperature", - "outdoor_damper_command": "outdoor air damper", - "outdoor_damper_minimum": "outdoor air damper minimum position" - }, - "description_assertions": [ - "if supply_air_temp \u003c 4.4 (continuously 5 minutes) and outdoor_damper_command \u003e outdoor_damper_minimum:", - " fail", - "elif outdoor_damper_command \u003e outdoor_damper_minimum and not (supply_air_temp \u003e 7 (continuously 5 minutes)):", - " fail", - "else:", - " pass", - "", - "if never (supply_air_temp \u003c 4.4 (continuously 5 minutes)):", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36FreezeProtectionStage2": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 40 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 freeze protection stage 2 requirements" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.12.2. in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.12.2. in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "supply_air_temp", - "outdoor_damper_command" - ], - "properties": { - "supply_air_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply air temperature" - ] - }, - "outdoor_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air damper" - ] - } - }, - "examples": [{ - "supply_air_temp": "supply air temperature", - "outdoor_damper_command": "outdoor air damper" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if supply_air_temp \u003c 3.3 (continuously 5 minutes) and outdoor_damper_command \u003e 0 (ever in the following hour):", - " fail", - "else:", - " pass", - "if never (supply_air_temp \u003c 3.3 (continuously 5 minutes)):", - " untested" - ] - }, - "examples": [ - ["if supply_air_temp \u003c 3.3 (continuously 5 minutes) and outdoor_damper_command \u003e 0 (ever in the following hour):", - " fail", - "else:", - " pass", - "if never (supply_air_temp \u003c 3.3 (continuously 5 minutes)):", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 40, - "description_brief": "G36 freeze protection stage 2 requirements", - "description_index": [ - "Section 5.16.12.2. in Guideline 36-2021" - ], - "description_datapoints": { - "supply_air_temp": "supply air temperature", - "outdoor_damper_command": "outdoor air damper" - }, - "description_assertions": [ - "if supply_air_temp \u003c 3.3 (continuously 5 minutes) and outdoor_damper_command \u003e 0 (ever in the following hour):", - " fail", - "else:", - " pass", - "if never (supply_air_temp \u003c 3.3 (continuously 5 minutes)):", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36FreezeProtectionStage3": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 41 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 freeze protection stage 3 (highest) requirements" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.12.3. in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.12.3. in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "freeze_stat", - "supply_air_temp", - "outdoor_damper_command", - "supply_fan_status", - "return_fan_status", - "relief_fan_status", - "cooling_coil_command", - "heating_coil_command" - ], - "properties": { - "freeze_stat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(optional, set to False if system does not have it) binary freeze-stat" - ] - }, - "supply_air_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply air temperature" - ] - }, - "outdoor_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air damper" - ] - }, - "supply_fan_status": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply fan status (speed): [1, 0] (can be replaced by binary or numeric variables)" - ] - }, - "return_fan_status": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(optional, set to False if system does not have it) return fan status (speed)" - ] - }, - "relief_fan_status": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "(optional, set to False if system does not have it) relief fan status (speed)" - ] - }, - "cooling_coil_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "cooling coil command" - ] - }, - "heating_coil_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "heating coil command" - ] - } - }, - "examples": [{ - "freeze_stat": "(optional, set to False if system does not have it) binary freeze-stat", - "supply_air_temp": "supply air temperature", - "outdoor_damper_command": "outdoor air damper", - "supply_fan_status": "supply fan status (speed): [1, 0] (can be replaced by binary or numeric variables)", - "return_fan_status": "(optional, set to False if system does not have it) return fan status (speed)", - "relief_fan_status": "(optional, set to False if system does not have it) relief fan status (speed)", - "cooling_coil_command": "cooling coil command", - "heating_coil_command": "heating coil command" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if supply_air_temp \u003c 3.3 (continuously 15 minutes) or", - " supply_air_temp \u003c 1 (continuously 5 minutes) or", - " freeze_stat == True", - " if not (", - " outdoor_damper_command == 0 and", - " supply_fan_status == 'off' and", - " return_fan_status == 'off' and", - " relief_fan_status == 'off' and", - " cooling_coil_command == 100 and", - " heating_coil_command \u003e 0", - " ):", - " fail", - " else:", - " pass", - "if never (", - " supply_air_temp \u003c 3.3 (continuously 15 minutes) or", - "):", - " untested" - ] - }, - "examples": [ - ["if supply_air_temp \u003c 3.3 (continuously 15 minutes) or", - " supply_air_temp \u003c 1 (continuously 5 minutes) or", - " freeze_stat == True", - " if not (", - " outdoor_damper_command == 0 and", - " supply_fan_status == 'off' and", - " return_fan_status == 'off' and", - " relief_fan_status == 'off' and", - " cooling_coil_command == 100 and", - " heating_coil_command \u003e 0", - " ):", - " fail", - " else:", - " pass", - "if never (", - " supply_air_temp \u003c 3.3 (continuously 15 minutes) or", - " supply_air_temp \u003c 1 (continuously 5 minutes) or", - " freeze_stat == True", - "):", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 41, - "description_brief": "G36 freeze protection stage 3 (highest) requirements", - "description_index": [ - "Section 5.16.12.3. in Guideline 36-2021" - ], - "description_datapoints": { - "freeze_stat": "(optional, set to False if system does not have it) binary freeze-stat", - "supply_air_temp": "supply air temperature", - "outdoor_damper_command": "outdoor air damper", - "supply_fan_status": "supply fan status (speed): [1, 0] (can be replaced by binary or numeric variables)", - "return_fan_status": "(optional, set to False if system does not have it) return fan status (speed)", - "relief_fan_status": "(optional, set to False if system does not have it) relief fan status (speed)", - "cooling_coil_command": "cooling coil command", - "heating_coil_command": "heating coil command" - }, - "description_assertions": [ - "if supply_air_temp \u003c 3.3 (continuously 15 minutes) or", - " supply_air_temp \u003c 1 (continuously 5 minutes) or", - " freeze_stat == True", - " if not (", - " outdoor_damper_command == 0 and", - " supply_fan_status == 'off' and", - " return_fan_status == 'off' and", - " relief_fan_status == 'off' and", - " cooling_coil_command == 100 and", - " heating_coil_command \u003e 0", - " ):", - " fail", - " else:", - " pass", - "if never (", - " supply_air_temp \u003c 3.3 (continuously 15 minutes) or", - " supply_air_temp \u003c 1 (continuously 5 minutes) or", - " freeze_stat == True", - "):", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36MinOAwEconomizer": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 42 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 minimum outdoor air control when economizer is active" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16 in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16 in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "outdoor_air_temp", - "economizer_high_limit_sp", - "outdoor_damper_command", - "min_oa_p", - "min_oa_sp", - "outdoor_air_flow", - "sys_mode" - ], - "properties": { - "outdoor_air_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air temperature" - ] - }, - "economizer_high_limit_sp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "economizer lockout high limit set point" - ] - }, - "outdoor_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air damper command" - ] - }, - "min_oa_p": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "minimum outdoor air damper position set point" - ] - }, - "min_oa_sp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "minimum outdoor air flow rate setpoint" - ] - }, - "outdoor_air_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air flow rate" - ] - }, - "sys_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - ] - } - }, - "examples": [{ - "outdoor_air_temp": "outdoor air temperature", - "economizer_high_limit_sp": "economizer lockout high limit set point", - "outdoor_damper_command": "outdoor air damper command", - "min_oa_p": "minimum outdoor air damper position set point", - "min_oa_sp": "minimum outdoor air flow rate setpoint", - "outdoor_air_flow": "outdoor air flow rate", - "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if not economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", - " if oudoor_damper_command \u003e= MinOA-P and outdoor_air_flow \u003e= MinOAsp:", - " pass", - " else:", - " fail", - "else:", - " untested" - ] - }, - "examples": [ - ["if not economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", - " if oudoor_damper_command \u003e= MinOA-P and outdoor_air_flow \u003e= MinOAsp:", - " pass", - " else:", - " fail", - "else:", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 42, - "description_brief": "G36 minimum outdoor air control when economizer is active", - "description_index": [ - "Section 5.16 in Guideline 36-2021" - ], - "description_datapoints": { - "outdoor_air_temp": "outdoor air temperature", - "economizer_high_limit_sp": "economizer lockout high limit set point", - "outdoor_damper_command": "outdoor air damper command", - "min_oa_p": "minimum outdoor air damper position set point", - "min_oa_sp": "minimum outdoor air flow rate setpoint", - "outdoor_air_flow": "outdoor air flow rate", - "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - }, - "description_assertions": [ - "if not economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", - " if oudoor_damper_command \u003e= MinOA-P and outdoor_air_flow \u003e= MinOAsp:", - " pass", - " else:", - " fail", - "else:", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36MinOAwoEconomizer": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 43 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 minimum outdoor air control when economizer is in lockout" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16 in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16 in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "outdoor_air_temp", - "economizer_high_limit_sp", - "outdoor_damper_command", - "return_damper_command", - "outdoor_air_flow", - "min_oa_sp", - "sys_mode" - ], - "properties": { - "outdoor_air_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air temperature" - ] - }, - "economizer_high_limit_sp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "economizer lockout high limit set point" - ] - }, - "outdoor_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air damper command" - ] - }, - "return_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "return air damper command" - ] - }, - "outdoor_air_flow": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "outdoor air flow rate" - ] - }, - "min_oa_sp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "minimum outdoor air flow rate setpoint" - ] - }, - "sys_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - ] - } - }, - "examples": [{ - "outdoor_air_temp": "outdoor air temperature", - "economizer_high_limit_sp": "economizer lockout high limit set point", - "outdoor_damper_command": "outdoor air damper command", - "return_damper_command": "return air damper command", - "outdoor_air_flow": "outdoor air flow rate", - "min_oa_sp": "minimum outdoor air flow rate setpoint", - "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", - " if outdoor_air_flow \u003c MinOAsp (continuously (e.g. fall below the sp for a consecutive 1 hr)):", - " if outdoor_damper_command == 100 and return_damper_command == 0:", - " pass", - " else:", - " fail", - " elif outdoor_air_flow \u003e MinOAsp (continuously):", - " if outdoor_damper_command == 0 and return_damper_command == 100:", - " else:", - " pass (essentially untested yet)", - "else:", - " untested" - ] - }, - "examples": [ - ["if economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", - " if outdoor_air_flow \u003c MinOAsp (continuously (e.g. fall below the sp for a consecutive 1 hr)):", - " if outdoor_damper_command == 100 and return_damper_command == 0:", - " pass", - " else:", - " fail", - " elif outdoor_air_flow \u003e MinOAsp (continuously):", - " if outdoor_damper_command == 0 and return_damper_command == 100:", - " pass", - " else:", - " fail", - " else:", - " pass (essentially untested yet)", - "else:", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 43, - "description_brief": "G36 minimum outdoor air control when economizer is in lockout", - "description_index": [ - "Section 5.16 in Guideline 36-2021" - ], - "description_datapoints": { - "outdoor_air_temp": "outdoor air temperature", - "economizer_high_limit_sp": "economizer lockout high limit set point", - "outdoor_damper_command": "outdoor air damper command", - "return_damper_command": "return air damper command", - "outdoor_air_flow": "outdoor air flow rate", - "min_oa_sp": "minimum outdoor air flow rate setpoint", - "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - }, - "description_assertions": [ - "if economizer_lockout(outdoor_air_temp, economizer_high_limit_sp) and sys_mode == 'occupied':", - " if outdoor_air_flow \u003c MinOAsp (continuously (e.g. fall below the sp for a consecutive 1 hr)):", - " if outdoor_damper_command == 100 and return_damper_command == 0:", - " pass", - " else:", - " fail", - " elif outdoor_air_flow \u003e MinOAsp (continuously):", - " if outdoor_damper_command == 0 and return_damper_command == 100:", - " pass", - " else:", - " fail", - " else:", - " pass (essentially untested yet)", - "else:", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36OutputChangeRateLimit": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 44 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 requirement of controller command change rate limit" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.1.9 in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.1.9 in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "command", - "max_rate_of_change_per_min" - ], - "properties": { - "command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "control command to be verified with command range being (0-100)" - ] - }, - "max_rate_of_change_per_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "control loop output maximum rate of change, default to 25." - ] - } - }, - "examples": [{ - "command": "control command to be verified with command range being (0-100)", - "max_rate_of_change_per_min": "control loop output maximum rate of change, default to 25." - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if abs(command(current_t) - command(prev_t)) \u003e max_rage_of_change_per_min and (current_t - prev_t \u003c= 1 minute):", - " fail", - "else:", - " pass" - ] - }, - "examples": [ - ["if abs(command(current_t) - command(prev_t)) \u003e max_rage_of_change_per_min and (current_t - prev_t \u003c= 1 minute):", - " fail", - "else:", - " pass" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 44, - "description_brief": "G36 requirement of controller command change rate limit", - "description_index": [ - "Section 5.1.9 in Guideline 36-2021" - ], - "description_datapoints": { - "command": "control command to be verified with command range being (0-100)", - "max_rate_of_change_per_min": "control loop output maximum rate of change, default to 25." - }, - "description_assertions": [ - "if abs(command(current_t) - command(prev_t)) \u003e max_rage_of_change_per_min and (current_t - prev_t \u003c= 1 minute):", - " fail", - "else:", - " pass" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36ReliefDamperStatus": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 45 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 relief dampers shall be enabled when the associated supply fan is proven ON, and disabled otherwise." - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.8.1 in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.8.1 in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "relief_damper_command", - "supply_fan_status" - ], - "properties": { - "relief_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "relief damper opening (0-100)" - ] - }, - "supply_fan_status": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" - ] - } - }, - "examples": [{ - "relief_damper_command": "relief damper opening (0-100)", - "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if relief_damper_command \u003e 0 and supply_fan_status == 'on':", - " pass", - "elif supply_fan_status == 'off' and relief_damper_command == 0:", - "else:", - " fail", - "if not ['on', 'off'] in supply_fan_status:", - " untested" - ] - }, - "examples": [ - ["if relief_damper_command \u003e 0 and supply_fan_status == 'on':", - " pass", - "elif supply_fan_status == 'off' and relief_damper_command == 0:", - " pass", - "else:", - " fail", - "if not ['on', 'off'] in supply_fan_status:", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 45, - "description_brief": "G36 relief dampers shall be enabled when the associated supply fan is proven ON, and disabled otherwise.", - "description_index": [ - "Section 5.16.8.1 in Guideline 36-2021" - ], - "description_datapoints": { - "relief_damper_command": "relief damper opening (0-100)", - "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" - }, - "description_assertions": [ - "if relief_damper_command \u003e 0 and supply_fan_status == 'on':", - " pass", - "elif supply_fan_status == 'off' and relief_damper_command == 0:", - " pass", - "else:", - " fail", - "if not ['on', 'off'] in supply_fan_status:", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "G36SupplyFanStatus": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 46 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "G36 supply fan on/off requirements" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.16.1.1. in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.16.1.1. in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "sys_mode", - "has_reheat_box_on_perimeter_zones", - "supply_fan_status" - ], - "properties": { - "sys_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']" - ] - }, - "has_reheat_box_on_perimeter_zones": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "binary flag of If there are any VAV-reheat boxes on perimeter zones." - ] - }, - "supply_fan_status": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" - ] - } - }, - "examples": [{ - "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']", - "has_reheat_box_on_perimeter_zones": "binary flag of If there are any VAV-reheat boxes on perimeter zones.", - "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if has_reheat_box_on_perimeter_zones == True:", - " if sys_mode != 'unoccupied' and supply_fan_status == 'off':", - " fail", - "", - "else:", - " if sys_mode in ['occupied', 'setup', 'cooldown'] and supply_fan_staus == 'off':", - "if ['occupied', 'unoccupied'] in sys_mode:", - " pass", - " untested" - ] - }, - "examples": [ - ["if has_reheat_box_on_perimeter_zones == True:", - " if sys_mode != 'unoccupied' and supply_fan_status == 'off':", - " fail", - "", - "else:", - " if sys_mode in ['occupied', 'setup', 'cooldown'] and supply_fan_staus == 'off':", - " fail", - "", - "if ['occupied', 'unoccupied'] in sys_mode:", - " pass", - "else:", - " untested" - ] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "rule-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 46, - "description_brief": "G36 supply fan on/off requirements", - "description_index": [ - "Section 5.16.1.1. in Guideline 36-2021" - ], - "description_datapoints": { - "sys_mode": "AHU system mode mode, enumeration of ['occupied', 'unoccupied', 'cooldown', 'warmup', 'setback', 'setup']", - "has_reheat_box_on_perimeter_zones": "binary flag of If there are any VAV-reheat boxes on perimeter zones.", - "supply_fan_status": "supply fan status (speed) [1, 0] (can be replaced by binary or numeric variables)" - }, - "description_assertions": [ - "if has_reheat_box_on_perimeter_zones == True:", - " if sys_mode != 'unoccupied' and supply_fan_status == 'off':", - " fail", - "", - "else:", - " if sys_mode in ['occupied', 'setup', 'cooldown'] and supply_fan_staus == 'off':", - " fail", - "", - "if ['occupied', 'unoccupied'] in sys_mode:", - " pass", - "else:", - " untested" - ], - "description_verification_type": "rule-based", - "assertions_type": "pass" - }] - }, - "LocalLoopSetPointTracking": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 47 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Local Loop Performance Verification - Set Point Tracking" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "feedback_sensor", - "set_point" - ], - "properties": { - "feedback_sensor": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "feedback sensor reading of the subject to be controlled towards a set point" - ] - }, - "set_point": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "set point value" - ] - } - }, - "examples": [{ - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "With a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01), if the number of samples of which the error is larger than this threshold is beyond 5% of number of all samples, then this verification fails; Otherwise, it passes." - ] - }, - "examples": [ - [ - "With a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01), if the number of samples of which the error is larger than this threshold is beyond 5% of number of all samples, then this verification fails; Otherwise, it passes."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 47, - "description_brief": "Local Loop Performance Verification - Set Point Tracking", - "description_datapoints": { - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value" - }, - "description_assertions": [ - "With a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01), if the number of samples of which the error is larger than this threshold is beyond 5% of number of all samples, then this verification fails; Otherwise, it passes." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "LocalLoopUnmetHours": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 48 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Local Loop Performance Verification - Set Point Unmet Hours" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "feedback_sensor", - "set_point" - ], - "properties": { - "feedback_sensor": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "feedback sensor reading of the subject to be controlled towards a set point" - ] - }, - "set_point": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "set point value" - ] - } - }, - "examples": [{ - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Instead of checking the number of samples among the whole data set for which the set points are not met, this verification checks the total accumulated time that the set points are not met within a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01)." - ] - }, - "examples": [ - [ - "Instead of checking the number of samples among the whole data set for which the set points are not met, this verification checks the total accumulated time that the set points are not met within a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01)."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 48, - "description_brief": "Local Loop Performance Verification - Set Point Unmet Hours", - "description_datapoints": { - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value" - }, - "description_assertions": [ - "Instead of checking the number of samples among the whole data set for which the set points are not met, this verification checks the total accumulated time that the set points are not met within a threshold of 5% of abs(set_point) (if the set point is 0, then the threshold is default to be 0.01)." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "LocalLoopSaturationDirectActingMax": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 49 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Local Loop Performance Verification - Direct Acting Loop Actuator Maximum Saturation" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "feedback_sensor", - "set_point", - "cmd", - "cmd_max" - ], - "properties": { - "feedback_sensor": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "feedback sensor reading of the subject to be controlled towards a set point" - ] - }, - "set_point": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "set point value" - ] - }, - "cmd": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "control command" - ] - }, - "cmd_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "control command range maximum value" - ] - } - }, - "examples": [{ - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value", - "cmd": "control command", - "cmd_max": "control command range maximum value" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "If the sensed data values are consistently above its set point, and after a default of 1 hour, the control command is still not saturated to maximum, then the verification fails; Otherwise, it passes." - ] - }, - "examples": [ - [ - "If the sensed data values are consistently above its set point, and after a default of 1 hour, the control command is still not saturated to maximum, then the verification fails; Otherwise, it passes."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 49, - "description_brief": "Local Loop Performance Verification - Direct Acting Loop Actuator Maximum Saturation", - "description_datapoints": { - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value", - "cmd": "control command", - "cmd_max": "control command range maximum value" - }, - "description_assertions": [ - "If the sensed data values are consistently above its set point, and after a default of 1 hour, the control command is still not saturated to maximum, then the verification fails; Otherwise, it passes." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "LocalLoopSaturationDirectActingMin": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 50 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Local Loop Performance Verification - Direct Acting Loop Actuator Minimum Saturation" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "feedback_sensor", - "set_point", - "cmd", - "cmd_min" - ], - "properties": { - "feedback_sensor": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "feedback sensor reading of the subject to be controlled towards a set point" - ] - }, - "set_point": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "set point value" - ] - }, - "cmd": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "control command" - ] - }, - "cmd_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "control command range minimum value" - ] - } - }, - "examples": [{ - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value", - "cmd": "control command", - "cmd_min": "control command range minimum value" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "If the sensed data values are consistently below its set point, and after a default of 1 hour, the control command is still not saturated to minimum, then the verification fails; Otherwise, it passes." - ] - }, - "examples": [ - [ - "If the sensed data values are consistently below its set point, and after a default of 1 hour, the control command is still not saturated to minimum, then the verification fails; Otherwise, it passes."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 50, - "description_brief": "Local Loop Performance Verification - Direct Acting Loop Actuator Minimum Saturation", - "description_datapoints": { - "feedback_sensor": "feedback sensor reading of the subject to be controlled towards a set point", - "set_point": "set point value", - "cmd": "control command", - "cmd_min": "control command range minimum value" - }, - "description_assertions": [ - "If the sensed data values are consistently below its set point, and after a default of 1 hour, the control command is still not saturated to minimum, then the verification fails; Otherwise, it passes." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "MZSystemOccupiedStandbyVentilationZoneControl": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 53 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Multizone system zone standby model ventilation control" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "zone_is_standby_mode", - "m_oa_requested_by_system", - "m_oa_zone_requirement" - ], - "properties": { - "zone_is_standby_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Flag indicating that the zone targeted by the verification is in occupied standby mode" - ] - }, - "m_oa_requested_by_system": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System outdoor air setpoint" - ] - }, - "m_oa_zone_requirement": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Outdoor air required by the targeted zone" - ] - } - }, - "examples": [{ - "zone_is_standby_mode": "Flag indicating that the zone targeted by the verification is in occupied standby mode", - "m_oa_requested_by_system": "System outdoor air setpoint", - "m_oa_zone_requirement": "Outdoor air required by the targeted zone" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "If the targted zone is in standby mode and if the difference between the outdoor air setpoint and the last reported outdoor air setpoint when the zone was not in standby mode is greater than the outdoor air required for the zone the verification passes, it otherwise fails." - ] - }, - "examples": [ - [ - "If the targted zone is in standby mode and if the difference between the outdoor air setpoint and the last reported outdoor air setpoint when the zone was not in standby mode is greater than the outdoor air required for the zone the verification passes, it otherwise fails."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 53, - "description_brief": "Multizone system zone standby model ventilation control", - "description_datapoints": { - "zone_is_standby_mode": "Flag indicating that the zone targeted by the verification is in occupied standby mode", - "m_oa_requested_by_system": "System outdoor air setpoint", - "m_oa_zone_requirement": "Outdoor air required by the targeted zone" - }, - "description_assertions": [ - "If the targted zone is in standby mode and if the difference between the outdoor air setpoint and the last reported outdoor air setpoint when the zone was not in standby mode is greater than the outdoor air required for the zone the verification passes, it otherwise fails." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "AppendixGHVACSystemFanOperation": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 54 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Verify HVAC system fan operation as per ASHRAE 90.1 Appendix G rules" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "o", - "fan_runtime_fraction", - "m_oa", - "tol_o" - ], - "properties": { - "o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Number of occupants" - ] - }, - "fan_runtime_fraction": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Fan runtime fraction (fraction of time the fan ran for the reported period)" - ] - }, - "m_oa": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System outdoor air flow rate" - ] - }, - "tol_o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - ] - } - }, - "examples": [{ - "o": "Number of occupants", - "fan_runtime_fraction": "Fan runtime fraction (fraction of time the fan ran for the reported period)", - "m_oa": "System outdoor air flow rate", - "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "If the system never provides outdoor air the verification is untested. The verification fails if the system fan is not continuously running during an occupied period, it passes if it does. The verification fails if the system is always operating continuously during occupied periods, it passes otherwise." - ] - }, - "examples": [ - [ - "If the system never provides outdoor air the verification is untested. The verification fails if the system fan is not continuously running during an occupied period, it passes if it does. The verification fails if the system is always operating continuously during occupied periods, it passes otherwise."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 54, - "description_brief": "Verify HVAC system fan operation as per ASHRAE 90.1 Appendix G rules", - "description_datapoints": { - "o": "Number of occupants", - "fan_runtime_fraction": "Fan runtime fraction (fraction of time the fan ran for the reported period)", - "m_oa": "System outdoor air flow rate", - "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - }, - "description_assertions": [ - "If the system never provides outdoor air the verification is untested. The verification fails if the system fan is not continuously running during an occupied period, it passes if it does. The verification fails if the system is always operating continuously during occupied periods, it passes otherwise." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "InteriorLightingControlAutomaticFullOff": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 55 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Interior lighting control automatic full off" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "o", - "total_lighting_power", - "lighted_floor_area", - "tol_o" - ], - "properties": { - "o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Number of occupants" - ] - }, - "total_lighting_power": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Reported total lighting power (not the design total lighting power)" - ] - }, - "lighted_floor_area": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Area lit by the device/system considered" - ] - }, - "tol_o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - ] - } - }, - "examples": [{ - "o": "Number of occupants", - "total_lighting_power": "Reported total lighting power (not the design total lighting power)", - "lighted_floor_area": "Area lit by the device/system considered", - "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "The algorithm verifies that the device/system doesn't serves more than 5,000 ft2 and that if it doesn't, if occupants are not present for at least 20 minutes, the lighting power of the device/system should be less or equal to 0.02 W/ft2, otherwise, the verification fails." - ] - }, - "examples": [ - [ - "The algorithm verifies that the device/system doesn't serves more than 5,000 ft2 and that if it doesn't, if occupants are not present for at least 20 minutes, the lighting power of the device/system should be less or equal to 0.02 W/ft2, otherwise, the verification fails."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 55, - "description_brief": "Interior lighting control automatic full off", - "description_datapoints": { - "o": "Number of occupants", - "total_lighting_power": "Reported total lighting power (not the design total lighting power)", - "lighted_floor_area": "Area lit by the device/system considered", - "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - }, - "description_assertions": [ - "The algorithm verifies that the device/system doesn't serves more than 5,000 ft2 and that if it doesn't, if occupants are not present for at least 20 minutes, the lighting power of the device/system should be less or equal to 0.02 W/ft2, otherwise, the verification fails." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ExteriorLightingControlDaylightOff": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 56 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Exterior lighting control occupancy sensing reduction" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "is_sun_up", - "daylight_sensed", - "daylight_setpoint", - "total_lighting_power" - ], - "properties": { - "is_sun_up": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Flag that indicates if the sun has risen" - ] - }, - "daylight_sensed": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Amount of daylight sensed by a sensor, this should be expressed in the same unit as the setpoint" - ] - }, - "daylight_setpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Daylight setpoint, or thresholds, used to determine if the exterior lighting system should be turned off" - ] - }, - "total_lighting_power": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Reported total lighting power (not the design total lighting power)" - ] - } - }, - "examples": [{ - "is_sun_up": "Flag that indicates if the sun has risen", - "daylight_sensed": "Amount of daylight sensed by a sensor, this should be expressed in the same unit as the setpoint", - "daylight_setpoint": "Daylight setpoint, or thresholds, used to determine if the exterior lighting system should be turned off", - "total_lighting_power": "Reported total lighting power (not the design total lighting power)" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "The algorithm verifies that the exterior lighting is off when the sun has risen, or when there is a sufficient amount of daylight. If the exterior lighting system is not off during these situation, the verification fails, otherwise it passes." - ] - }, - "examples": [ - [ - "The algorithm verifies that the exterior lighting is off when the sun has risen, or when there is a sufficient amount of daylight. If the exterior lighting system is not off during these situation, the verification fails, otherwise it passes."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 56, - "description_brief": "Exterior lighting control occupancy sensing reduction", - "description_datapoints": { - "is_sun_up": "Flag that indicates if the sun has risen", - "daylight_sensed": "Amount of daylight sensed by a sensor, this should be expressed in the same unit as the setpoint", - "daylight_setpoint": "Daylight setpoint, or thresholds, used to determine if the exterior lighting system should be turned off", - "total_lighting_power": "Reported total lighting power (not the design total lighting power)" - }, - "description_assertions": [ - "The algorithm verifies that the exterior lighting is off when the sun has risen, or when there is a sufficient amount of daylight. If the exterior lighting system is not off during these situation, the verification fails, otherwise it passes." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "ExteriorLightingControlOccupancySensingReduction": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_datapoints", - "description_assertions", - "description_verification_type", - "assertions_type" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 57 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Exterior lighting control occupancy sensing reduction" - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "o", - "total_lighting_power", - "tol_o" - ], - "properties": { - "o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Number of occupants" - ] - }, - "total_lighting_power": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Reported total lighting power (not the design total lighting power)" - ] - }, - "tol_o": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - ] - } - }, - "examples": [{ - "o": "Number of occupants", - "total_lighting_power": "Reported total lighting power (not the design total lighting power)", - "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - }] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "The algorithm verifies that the exterior lighting is controlled based on occupancy. It fails if the maximum reported total lighting power is greater than 1500 W and if the total mnaximum lighting power is not reduced by half when occupancy has not been detected for 15 mins. Otherwise, it passes." - ] - }, - "examples": [ - [ - "The algorithm verifies that the exterior lighting is controlled based on occupancy. It fails if the maximum reported total lighting power is greater than 1500 W and if the total mnaximum lighting power is not reduced by half when occupancy has not been detected for 15 mins. Otherwise, it passes."] - ] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - } - }, - "examples": [{ - "library_item_id": 57, - "description_brief": "Exterior lighting control occupancy sensing reduction", - "description_datapoints": { - "o": "Number of occupants", - "total_lighting_power": "Reported total lighting power (not the design total lighting power)", - "tol_o": "Tolerance or threshold for the number of occupants below which the system is serving an unoccupied space" - }, - "description_assertions": [ - "The algorithm verifies that the exterior lighting is controlled based on occupancy. It fails if the maximum reported total lighting power is greater than 1500 W and if the total mnaximum lighting power is not reduced by half when occupancy has not been detected for 15 mins. Otherwise, it passes." - ], - "description_verification_type": "procedure-based", - "assertions_type": "pass" - }] - }, - "G36CoolingOnlyTerminalBoxCoolingAirflowSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 58 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling only terminal box airflow control when the zone state is cooling following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.5.5.1 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.5.5.1 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_cool_max", - "v_min", - "v_spt" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_cool_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum cooling airflow setpoint" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Maximum cooling airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "switch operation_mode", - "case 'occupied'", - " cooling_maximum = v_cool_max", - " minimum = v_min", - "case 'cooldown', 'setup'", - " minimum = 0", - "case 'warmup', 'setback', 'unoccupied'", - " cooling_maximum = 0", - "", - "if minimum \u003c= v_spt \u003c= cooling_maximum", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["switch operation_mode", - "case 'occupied'", - " cooling_maximum = v_cool_max", - " minimum = v_min", - "case 'cooldown', 'setup'", - " cooling_maximum = v_cool_max", - " minimum = 0", - "case 'warmup', 'setback', 'unoccupied'", - " cooling_maximum = 0", - " minimum = 0", - "", - "if minimum \u003c= v_spt \u003c= cooling_maximum", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 58, - "description_brief": "Cooling only terminal box airflow control when the zone state is cooling following the Guideline 36 recommendations", - "description_index": [ - "Section 5.5.5.1 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Maximum cooling airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "switch operation_mode", - "case 'occupied'", - " cooling_maximum = v_cool_max", - " minimum = v_min", - "case 'cooldown', 'setup'", - " cooling_maximum = v_cool_max", - " minimum = 0", - "case 'warmup', 'setback', 'unoccupied'", - " cooling_maximum = 0", - " minimum = 0", - "", - "if minimum \u003c= v_spt \u003c= cooling_maximum", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36CoolingOnlyTerminalBoxDeadbandAirflowSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 59 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling only terminal box airflow control when the zone state is deadband following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.5.5.2 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.5.5.2 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_min", - "v_spt", - "v_spt_tol" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - }, - "v_spt_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Airflow setpoint tolerance" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "switch operation_mode", - "case 'occupied'", - " minimum = v_min", - "case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - "", - "if abs(v_spt - minimum) \u003c= v_spt_tol", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["switch operation_mode", - "case 'occupied'", - " minimum = v_min", - "case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - "", - "if abs(v_spt - minimum) \u003c= v_spt_tol", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 59, - "description_brief": "Cooling only terminal box airflow control when the zone state is deadband following the Guideline 36 recommendations", - "description_index": [ - "Section 5.5.5.2 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "switch operation_mode", - "case 'occupied'", - " minimum = v_min", - "case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - "", - "if abs(v_spt - minimum) \u003c= v_spt_tol", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36CoolingOnlyTerminalBoxHeatingAirflowSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 60 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Cooling only terminal box airflow control when the zone state is heating following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.5.5.3 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.5.5.3 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_cool_max", - "v_heat_max", - "v_min", - "v_spt" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_cool_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone maximum cooling airflow setpoint" - ] - }, - "v_heat_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone maximum heating airflow setpoint" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Zone maximum cooling airflow setpoint", - "v_heat_max": "Zone maximum heating airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "switch operation_mode", - "case 'occupied'", - " heating_maximum = v_heat_max", - " minimum = v_min", - "case 'cooldown', 'setup', 'unoccupied'", - " heating_maximum = 0", - " minimum = 0", - "case 'warmup', 'setback'", - " heating_maximum = v_cool_max", - "", - "if minimum \u003c= v_spt \u003c= heating_maximum", - " pass", - "else", - " fail", - "end" - ] - }, - "examples": [ - ["switch operation_mode", - "case 'occupied'", - " heating_maximum = v_heat_max", - " minimum = v_min", - "case 'cooldown', 'setup', 'unoccupied'", - " heating_maximum = 0", - " minimum = 0", - "case 'warmup', 'setback'", - " heating_maximum = v_cool_max", - " minimum = 0", - "", - "if minimum \u003c= v_spt \u003c= heating_maximum", - " pass", - "else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 60, - "description_brief": "Cooling only terminal box airflow control when the zone state is heating following the Guideline 36 recommendations", - "description_index": [ - "Section 5.5.5.3 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Zone maximum cooling airflow setpoint", - "v_heat_max": "Zone maximum heating airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "switch operation_mode", - "case 'occupied'", - " heating_maximum = v_heat_max", - " minimum = v_min", - "case 'cooldown', 'setup', 'unoccupied'", - " heating_maximum = 0", - " minimum = 0", - "case 'warmup', 'setback'", - " heating_maximum = v_cool_max", - " minimum = 0", - "", - "if minimum \u003c= v_spt \u003c= heating_maximum", - " pass", - "else", - " fail", - "end" - ] - }] - }, - "G36TerminalBoxVAVDamperTracking": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 61 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box airflow control with VAV damper following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.5.5.4 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.5.5.4 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "vav_damper_command", - "v", - "v_spt", - "v_tracking_tol" - ], - "properties": { - "vav_damper_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box VAV damper command" - ] - }, - "v": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box discharge airflow rate" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - }, - "v_tracking_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Airflow tracking tolerance" - ] - } - }, - "examples": [{ - "vav_damper_command": "Terminal box VAV damper command", - "v": "Terminal box discharge airflow rate", - "v_spt": "Active airflow setpoint", - "v_tracking_tol": "Airflow tracking tolerance" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if abs(v_spt - v) \u003e= v_tracking_tol (less than 1hr):", - " pass", - "elif abs(v_spt - v) \u003c v_tracking_tol:", - "if v - v_spt \u003e= v_tracking_tol (continously) and vav_damper_command \u003c= 1:", - "elif v_spt - v \u003e= v_tracking_tol (continuously) and vav_damper_command \u003e= 99:", - "else:", - " fail", - "end" - ] - }, - "examples": [ - ["if abs(v_spt - v) \u003e= v_tracking_tol (less than 1hr):", - " pass", - "elif abs(v_spt - v) \u003c v_tracking_tol:", - " pass", - "if v - v_spt \u003e= v_tracking_tol (continously) and vav_damper_command \u003c= 1:", - " pass", - "elif v_spt - v \u003e= v_tracking_tol (continuously) and vav_damper_command \u003e= 99:", - " pass", - "else:", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 61, - "description_brief": "Terminal box airflow control with VAV damper following the Guideline 36 recommendations", - "description_index": [ - "Section 5.5.5.4 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "vav_damper_command": "Terminal box VAV damper command", - "v": "Terminal box discharge airflow rate", - "v_spt": "Active airflow setpoint", - "v_tracking_tol": "Airflow tracking tolerance" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if abs(v_spt - v) \u003e= v_tracking_tol (less than 1hr):", - " pass", - "elif abs(v_spt - v) \u003c v_tracking_tol:", - " pass", - "if v - v_spt \u003e= v_tracking_tol (continously) and vav_damper_command \u003c= 1:", - " pass", - "elif v_spt - v \u003e= v_tracking_tol (continuously) and vav_damper_command \u003e= 99:", - " pass", - "else:", - " fail", - "end" - ] - }] - }, - "G36TerminalBoxCoolingMinimumAirflow": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 62 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box in cooling mode needs maintain minimum airflow when supply air temperature is high following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "Section 5.5.5.1.a in Guideline 36-2021", - "Section 5.6.5.1.a in Guideline 36-2021" - ] - }, - "examples": [ - ["Section 5.5.5.1.a in Guideline 36-2021", - "Section 5.6.5.1.a in Guideline 36-2021" - ] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_min", - "ahu_sat_spt", - "v_spt", - "v_spt_tol", - "room_temp" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "ahu_sat_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU supply air temperature setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - }, - "v_spt_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Airflow setpoint tolerance" - ] - }, - "room_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Room temperature" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_min": "Occupied zone minimum airflow setpoint", - "ahu_sat_spt": "AHU supply air temperature setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance", - "room_temp": "Room temperature" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if ahu_sat_spt \u003c= room_temp:", - " untested", - "else:", - " switch operation_mode", - " case 'occupied'", - " minimum = v_min", - " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - " if v_spt - v_spt_tol \u003e minimum:", - " fail", - " else:", - " pass" - ] - }, - "examples": [ - ["if ahu_sat_spt \u003c= room_temp:", - " untested", - "else:", - " switch operation_mode", - " case 'occupied'", - " minimum = v_min", - " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - " if v_spt - v_spt_tol \u003e minimum:", - " fail", - " else:", - " pass" - ] - ] - } - }, - "examples": [{ - "library_item_id": 62, - "description_brief": "Terminal box in cooling mode needs maintain minimum airflow when supply air temperature is high following the Guideline 36 recommendations", - "description_index": [ - "Section 5.5.5.1.a in Guideline 36-2021", - "Section 5.6.5.1.a in Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_min": "Occupied zone minimum airflow setpoint", - "ahu_sat_spt": "AHU supply air temperature setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance", - "room_temp": "Room temperature" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if ahu_sat_spt \u003c= room_temp:", - " untested", - "else:", - " switch operation_mode", - " case 'occupied'", - " minimum = v_min", - " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - " if v_spt - v_spt_tol \u003e minimum:", - " fail", - " else:", - " pass" - ] - }] - }, - "G36ReheatTerminalBoxCoolingAirflowSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 63 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box with reheat when the zone state is cooling following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.6.5.1 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.6.5.1 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_cool_max", - "v_min", - "v_spt", - "heating_coil_command", - "heating_coil_command_tol", - "dat", - "dat_min_spt" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_cool_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Maximum cooling airflow setpoint" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - }, - "heating_coil_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating coil command" - ] - }, - "heating_coil_command_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating coil command saturation tolerance" - ] - }, - "dat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature" - ] - }, - "dat_min_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum discharge air temperature setpoint" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Maximum cooling airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "heating_coil_command": "Heating coil command", - "heating_coil_command_tol": "Heating coil command saturation tolerance", - "dat": "Discharge air temperature", - "dat_min_spt": "Minimum discharge air temperature setpoint" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", - " fail", - "else", - " switch operation_mode", - " case 'occupied'", - " cooling_maximum = v_cool_max", - " minimum = v_min", - " case 'cooldown', 'setup'", - " minimum = 0", - " case 'warmup', 'setback', 'unoccupied'", - " cooling_maximum = 0", - " ", - " if cooling_minimum \u003c= v_spt \u003c= cooling_maximum", - " pass", - " else", - " fail", - "end" - ] - }, - "examples": [ - ["if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", - " fail", - "else", - " switch operation_mode", - " case 'occupied'", - " cooling_maximum = v_cool_max", - " minimum = v_min", - " case 'cooldown', 'setup'", - " cooling_maximum = v_cool_max", - " minimum = 0", - " case 'warmup', 'setback', 'unoccupied'", - " cooling_maximum = 0", - " minimum = 0", - " ", - " if cooling_minimum \u003c= v_spt \u003c= cooling_maximum", - " pass", - " else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 63, - "description_brief": "Terminal box with reheat when the zone state is cooling following the Guideline 36 recommendations", - "description_index": [ - "Section 5.6.5.1 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Maximum cooling airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "heating_coil_command": "Heating coil command", - "heating_coil_command_tol": "Heating coil command saturation tolerance", - "dat": "Discharge air temperature", - "dat_min_spt": "Minimum discharge air temperature setpoint" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", - " fail", - "else", - " switch operation_mode", - " case 'occupied'", - " cooling_maximum = v_cool_max", - " minimum = v_min", - " case 'cooldown', 'setup'", - " cooling_maximum = v_cool_max", - " minimum = 0", - " case 'warmup', 'setback', 'unoccupied'", - " cooling_maximum = 0", - " minimum = 0", - " ", - " if cooling_minimum \u003c= v_spt \u003c= cooling_maximum", - " pass", - " else", - " fail", - "end" - ] - }] - }, - "G36ReheatTerminalBoxDeadbandAirflowSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 64 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box with reheat when the zone state is deadband following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.6.5.2 in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.6.5.2 in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_min", - "v_spt", - "v_spt_tol", - "heating_coil_command", - "heating_coil_command_tol", - "dat", - "dat_min_spt" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - }, - "v_spt_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Airflow setpoint tolerance" - ] - }, - "heating_coil_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating coil command" - ] - }, - "heating_coil_command_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating coil command saturation tolerance" - ] - }, - "dat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature" - ] - }, - "dat_min_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Minimum discharge air temperature setpoint" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance", - "heating_coil_command": "Heating coil command", - "heating_coil_command_tol": "Heating coil command saturation tolerance", - "dat": "Discharge air temperature", - "dat_min_spt": "Minimum discharge air temperature setpoint" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", - " fail", - "else", - " switch operation_mode", - " case 'occupied'", - " minimum = v_min", - " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - " if abs(v_spt - minimum) \u003c= v_spt_tol", - " pass", - " else", - " fail", - "end" - ] - }, - "examples": [ - ["if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", - " fail", - "else", - " switch operation_mode", - " case 'occupied'", - " minimum = v_min", - " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - " if abs(v_spt - minimum) \u003c= v_spt_tol", - " pass", - " else", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 64, - "description_brief": "Terminal box with reheat when the zone state is deadband following the Guideline 36 recommendations", - "description_index": [ - "Section 5.6.5.2 in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance", - "heating_coil_command": "Heating coil command", - "heating_coil_command_tol": "Heating coil command saturation tolerance", - "dat": "Discharge air temperature", - "dat_min_spt": "Minimum discharge air temperature setpoint" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if dat \u003e dat_min_spt and heating_coil_command \u003e heating_coil_command_tol", - " fail", - "else", - " switch operation_mode", - " case 'occupied'", - " minimum = v_min", - " case 'cooldown', 'setup', 'warmup', 'setback', 'unoccupied'", - " minimum = 0", - " if abs(v_spt - minimum) \u003c= v_spt_tol", - " pass", - " else", - " fail", - "end" - ] - }] - }, - "G36ReheatTerminalBoxHeatingAirflowSetpoint": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 65 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box with reheat when the zone state is heating following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.6.5.3 (a, b) in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.6.5.3 (a, b) in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "zone_state", - "v_cool_max", - "v_heat_max", - "v_heat_min", - "v_min", - "v_spt", - "v_spt_tol", - "heating_loop_output", - "room_temp", - "space_temp_spt", - "ahu_sat_spt", - "dat", - "dat_spt" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "zone_state": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone state (heating, cooling, or deadband (not in either heating or cooling))" - ] - }, - "v_cool_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone maximum cooling airflow setpoint" - ] - }, - "v_heat_max": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone maximum heating airflow setpoint" - ] - }, - "v_heat_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone minimum heating airflow setpoint" - ] - }, - "v_min": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Occupied zone minimum airflow setpoint" - ] - }, - "v_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Active airflow setpoint" - ] - }, - "v_spt_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Airflow setpoint tolerance" - ] - }, - "heating_loop_output": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Zone heating loop signal (from 0 to 100)" - ] - }, - "room_temp": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Room temperature" - ] - }, - "space_temp_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Space temperature setpoint" - ] - }, - "ahu_sat_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "AHU supply air temperature setpoint" - ] - }, - "dat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature" - ] - }, - "dat_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature setpoint" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Zone maximum cooling airflow setpoint", - "v_heat_max": "Zone maximum heating airflow setpoint", - "v_heat_min": "Zone minimum heating airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance", - "heating_loop_output": "Zone heating loop signal (from 0 to 100)", - "room_temp": "Room temperature", - "space_temp_spt": "Space temperature setpoint", - "ahu_sat_spt": "AHU supply air temperature setpoint", - "dat": "Discharge air temperature", - "dat_spt": "Discharge air temperature setpoint" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "switch operation_mode", - " case 'occupied'", - " heating_maximum = max(v_heat_min, v_min)", - " heating_minimum = max(v_heat_min, v_min)", - " case 'cooldown'", - " heating_maximum = v_heat_max", - " heating_minimum = v_heat_min", - " case 'setup', 'unoccupied'", - " heating_maximum = 0", - " heating_minimum = 0", - " case 'warmup', 'setback'", - " heating_minimum = v_cool_max", - "", - " if 0 \u003c heating_loop_output \u003c= 50:", - " if abs(v_spt - heating_minimum) \u003c= tolerance and ahu_sat_spt \u003c= dat_spt \u003c= 11 + space_temp_spt:", - " pass", - " else:", - " fail", - " if 50 \u003c heating_loop_output \u003c= 100:", - " if dat \u003e room_temp + 3 and heating_minimum \u003c= v_spt \u003c= heating_maximum:", - " untested", - " end" - ] - }, - "examples": [ - ["switch operation_mode", - " case 'occupied'", - " heating_maximum = max(v_heat_min, v_min)", - " heating_minimum = max(v_heat_min, v_min)", - " case 'cooldown'", - " heating_maximum = v_heat_max", - " heating_minimum = v_heat_min", - " case 'setup', 'unoccupied'", - " heating_maximum = 0", - " heating_minimum = 0", - " case 'warmup', 'setback'", - " heating_maximum = v_heat_max", - " heating_minimum = v_cool_max", - "", - " if 0 \u003c heating_loop_output \u003c= 50:", - " if abs(v_spt - heating_minimum) \u003c= tolerance and ahu_sat_spt \u003c= dat_spt \u003c= 11 + space_temp_spt:", - " pass", - " else:", - " fail", - " if 50 \u003c heating_loop_output \u003c= 100:", - " if dat \u003e room_temp + 3 and heating_minimum \u003c= v_spt \u003c= heating_maximum:", - " pass", - " else:", - " untested", - " end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 65, - "description_brief": "Terminal box with reheat when the zone state is heating following the Guideline 36 recommendations", - "description_index": [ - "Section 5.6.5.3 (a, b) in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "zone_state": "Zone state (heating, cooling, or deadband (not in either heating or cooling))", - "v_cool_max": "Zone maximum cooling airflow setpoint", - "v_heat_max": "Zone maximum heating airflow setpoint", - "v_heat_min": "Zone minimum heating airflow setpoint", - "v_min": "Occupied zone minimum airflow setpoint", - "v_spt": "Active airflow setpoint", - "v_spt_tol": "Airflow setpoint tolerance", - "heating_loop_output": "Zone heating loop signal (from 0 to 100)", - "room_temp": "Room temperature", - "space_temp_spt": "Space temperature setpoint", - "ahu_sat_spt": "AHU supply air temperature setpoint", - "dat": "Discharge air temperature", - "dat_spt": "Discharge air temperature setpoint" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "switch operation_mode", - " case 'occupied'", - " heating_maximum = max(v_heat_min, v_min)", - " heating_minimum = max(v_heat_min, v_min)", - " case 'cooldown'", - " heating_maximum = v_heat_max", - " heating_minimum = v_heat_min", - " case 'setup', 'unoccupied'", - " heating_maximum = 0", - " heating_minimum = 0", - " case 'warmup', 'setback'", - " heating_maximum = v_heat_max", - " heating_minimum = v_cool_max", - "", - " if 0 \u003c heating_loop_output \u003c= 50:", - " if abs(v_spt - heating_minimum) \u003c= tolerance and ahu_sat_spt \u003c= dat_spt \u003c= 11 + space_temp_spt:", - " pass", - " else:", - " fail", - " if 50 \u003c heating_loop_output \u003c= 100:", - " if dat \u003e room_temp + 3 and heating_minimum \u003c= v_spt \u003c= heating_maximum:", - " pass", - " else:", - " untested", - " end" - ] - }] - }, - "G36ReheatTerminalBoxHeatingCoilTracking": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 66 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box with reheat heating coil tracking discharge temperature at setpoint following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.6.5.3 c in ASHRAE Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.6.5.3 c in ASHRAE Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "heating_coil_command", - "dat", - "dat_spt", - "dat_tracking_tol" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "heating_coil_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating coil command" - ] - }, - "dat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature" - ] - }, - "dat_spt": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature setpoint" - ] - }, - "dat_tracking_tol": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Temperature tracking tolerance" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "heating_coil_command": "Heating coil command", - "dat": "Discharge air temperature", - "dat_spt": "Discharge air temperature setpoint", - "dat_tracking_tol": "Temperature tracking tolerance" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "only check the following if operation_mode is heating", - "if abs(dat_spt - dat) \u003e= dat_tracking_tol (less than 1hr):", - " pass", - "elif abs(dat_spt - dat) \u003c dat_tracking_tol:", - "if dat - dat_spt \u003e= dat_tracking_tol (continously) and heating_coil_command \u003c= 1:", - "elif dat_spt - dat \u003e= dat_tracking_tol (continuously) and vav_damper_command \u003e= 99:", - "else:", - " fail", - "end" - ] - }, - "examples": [ - ["only check the following if operation_mode is heating", - "if abs(dat_spt - dat) \u003e= dat_tracking_tol (less than 1hr):", - " pass", - "elif abs(dat_spt - dat) \u003c dat_tracking_tol:", - " pass", - "if dat - dat_spt \u003e= dat_tracking_tol (continously) and heating_coil_command \u003c= 1:", - " pass", - "elif dat_spt - dat \u003e= dat_tracking_tol (continuously) and vav_damper_command \u003e= 99:", - " pass", - "else:", - " fail", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 66, - "description_brief": "Terminal box with reheat heating coil tracking discharge temperature at setpoint following the Guideline 36 recommendations", - "description_index": [ - "Section 5.6.5.3 c in ASHRAE Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "heating_coil_command": "Heating coil command", - "dat": "Discharge air temperature", - "dat_spt": "Discharge air temperature setpoint", - "dat_tracking_tol": "Temperature tracking tolerance" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "only check the following if operation_mode is heating", - "if abs(dat_spt - dat) \u003e= dat_tracking_tol (less than 1hr):", - " pass", - "elif abs(dat_spt - dat) \u003c dat_tracking_tol:", - " pass", - "if dat - dat_spt \u003e= dat_tracking_tol (continously) and heating_coil_command \u003c= 1:", - " pass", - "elif dat_spt - dat \u003e= dat_tracking_tol (continuously) and vav_damper_command \u003e= 99:", - " pass", - "else:", - " fail", - "end" - ] - }] - }, - "G36ReheatTerminalBoxHeatingCoilLowerBound": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "library_item_id", - "description_brief", - "description_index", - "description_datapoints", - "description_verification_type", - "assertions_type", - "description_assertions" - ], - "properties": { - "library_item_id": { - "description": "An explanation about the purpose of this instance.", - "type": "integer", - "default": 0, - "examples": [ - 67 - ] - }, - "description_brief": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Terminal box with reheat heating coil needs to keep discharge air temp no lower than 10C when occupied following the Guideline 36 recommendations" - ] - }, - "description_index": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Section 5.6.5.4 in Guideline 36-2021" - ] - }, - "examples": [ - [ - "Section 5.6.5.4 in Guideline 36-2021"] - ] - }, - "description_datapoints": { - "description": "An explanation about the purpose of this instance.", - "type": "object", - "default": {}, - "required": [ - "operation_mode", - "heating_coil_command", - "dat" - ], - "properties": { - "operation_mode": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "System operation mode" - ] - }, - "heating_coil_command": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Heating coil command" - ] - }, - "dat": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "Discharge air temperature" - ] - } - }, - "examples": [{ - "operation_mode": "System operation mode", - "heating_coil_command": "Heating coil command", - "dat": "Discharge air temperature" - }] - }, - "description_verification_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "procedure-based" - ] - }, - "assertions_type": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "default": "", - "examples": [ - "pass" - ] - }, - "description_assertions": { - "description": "An explanation about the purpose of this instance.", - "type": "array", - "default": [], - "items": { - "description": "An explanation about the purpose of this instance.", - "type": "string", - "examples": [ - "if operation_mode != 'occupied':", - " untested", - "if operation_mode == 'occupied':", - " if dat \u003c 10 and heating_coil_command \u003c 99:", - " fail", - " else:", - " pass", - "end" - ] - }, - "examples": [ - ["if operation_mode != 'occupied':", - " untested", - "if operation_mode == 'occupied':", - " if dat \u003c 10 and heating_coil_command \u003c 99:", - " fail", - " else:", - " pass", - "end" - ] - ] - } - }, - "examples": [{ - "library_item_id": 67, - "description_brief": "Terminal box with reheat heating coil needs to keep discharge air temp no lower than 10C when occupied following the Guideline 36 recommendations", - "description_index": [ - "Section 5.6.5.4 in Guideline 36-2021" - ], - "description_datapoints": { - "operation_mode": "System operation mode", - "heating_coil_command": "Heating coil command", - "dat": "Discharge air temperature" - }, - "description_verification_type": "procedure-based", - "assertions_type": "pass", - "description_assertions": [ - "if operation_mode != 'occupied':", - " untested", - "if operation_mode == 'occupied':", - " if dat \u003c 10 and heating_coil_command \u003c 99:", - " fail", - " else:", - " pass", - "end" - ] - }] - } - } -} diff --git a/schema/new_library_verification_cases_schema.json b/schema/new_library_verification_cases_schema.json deleted file mode 100644 index 6a93a567..00000000 --- a/schema/new_library_verification_cases_schema.json +++ /dev/null @@ -1,3604 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "properties": { - "cases": { - "type": "array", - "items": [ - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_sa_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_sa_set" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_z_coo": { - "type": "number" - } - }, - "required": [ - "T_z_coo" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_sa_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_sa_set" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_z_coo": { - "type": "number" - } - }, - "required": [ - "T_z_coo" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_sa_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_sa_set" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_z_coo": { - "type": "number" - } - }, - "required": [ - "T_z_coo" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_sa_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_sa_set" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_z_coo": { - "type": "number" - } - }, - "required": [ - "T_z_coo" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "oa_flow": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "oa_db": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ret_a_enth": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "oa_enth": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "oa_flow", - "oa_db", - "ret_a_enth", - "oa_enth" - ] - }, - "parameters": { - "type": "object", - "properties": { - "oa_threshold": { - "type": "integer" - }, - "oa_min_flow": { - "type": "number" - } - }, - "required": [ - "oa_threshold", - "oa_min_flow" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "oa_flow": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "oa_db": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ret_a_enth": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "oa_enth": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "oa_flow", - "oa_db", - "ret_a_enth", - "oa_enth" - ] - }, - "parameters": { - "type": "object", - "properties": { - "oa_threshold": { - "type": "integer" - }, - "oa_min_flow": { - "type": "number" - } - }, - "required": [ - "oa_threshold", - "oa_min_flow" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "oa_flow": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ccoil_out": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "oa_flow", - "ccoil_out" - ] - }, - "parameters": { - "type": "object", - "properties": { - "oa_min_flow": { - "type": "number" - } - }, - "required": [ - "oa_min_flow" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "oa_flow": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ccoil_out": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "oa_flow", - "ccoil_out" - ] - }, - "parameters": { - "type": "object", - "properties": { - "oa_min_flow": { - "type": "number" - } - }, - "required": [ - "oa_min_flow" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_oa_db": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_hw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "m_hw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_oa_db", - "T_hw", - "m_hw" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_oa_max": { - "type": "integer" - }, - "T_oa_min": { - "type": "number" - }, - "T_hw_max_set": { - "type": "number" - }, - "T_hw_min_set": { - "type": "number" - } - }, - "required": [ - "T_oa_max", - "T_oa_min", - "T_hw_max_set", - "T_hw_min_set" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_oa_db": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_hw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "m_hw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_oa_db", - "T_hw", - "m_hw" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_oa_max": { - "type": "integer" - }, - "T_oa_min": { - "type": "number" - }, - "T_hw_max_set": { - "type": "number" - }, - "T_hw_min_set": { - "type": "number" - } - }, - "required": [ - "T_oa_max", - "T_oa_min", - "T_hw_max_set", - "T_hw_min_set" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_oa_db": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_chw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "m_chw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_oa_db", - "T_chw", - "m_chw" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_oa_max": { - "type": "number" - }, - "T_oa_min": { - "type": "number" - }, - "T_chw_max_st": { - "type": "number" - }, - "T_chw_min_st": { - "type": "number" - } - }, - "required": [ - "T_oa_max", - "T_oa_min", - "T_chw_max_st", - "T_chw_min_st" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_oa_db": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_chw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "m_chw": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_oa_db", - "T_chw", - "m_chw" - ] - }, - "parameters": { - "type": "object", - "properties": { - "T_oa_max": { - "type": "number" - }, - "T_oa_min": { - "type": "number" - }, - "T_chw_max_st": { - "type": "number" - }, - "T_chw_min_st": { - "type": "number" - } - }, - "required": [ - "T_oa_max", - "T_oa_min", - "T_chw_max_st", - "T_chw_min_st" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_zone": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "HVAC_operation_sch": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_heat_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_cool_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "Fan_elec_rate": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_zone", - "HVAC_operation_sch", - "T_heat_set", - "T_cool_set", - "Fan_elec_rate" - ] - }, - "parameters": { - "type": "object" - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "o": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "m_oa": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "eco_onoff": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "o", - "m_oa", - "eco_onoff" - ] - }, - "parameters": { - "type": "object", - "properties": { - "tol": { - "type": "number" - } - }, - "required": [ - "tol" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "p_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "d_VAV_1": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "d_VAV_2": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "d_VAV_3": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "d_VAV_4": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "d_VAV_5": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "p_set", - "d_VAV_1", - "d_VAV_2", - "d_VAV_3", - "d_VAV_4", - "d_VAV_5" - ] - }, - "parameters": { - "type": "object", - "properties": { - "p_set_min": { - "type": "number" - }, - "tol": { - "type": "number" - } - }, - "required": [ - "p_set_min", - "tol" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "ct_op_cells": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ct_m": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ct_P_fan": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "ct_op_cells", - "ct_m", - "ct_P_fan" - ] - }, - "parameters": { - "type": "object", - "properties": { - "ct_cells": { - "type": "integer" - }, - "ct_m_des": { - "type": "number" - }, - "min_flow_frac_per_cell": { - "type": "number" - } - }, - "required": [ - "ct_cells", - "ct_m_des", - "min_flow_frac_per_cell" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_wh_inlet": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_wh_inlet" - ] - }, - "parameters": { - "type": "object" - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "p_fan_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "p_fan_set" - ] - }, - "parameters": { - "type": "object", - "properties": { - "tol_P_fan": { - "type": "number" - } - }, - "required": [ - "tol_P_fan" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "no_of_occ": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "Q_load": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "P_fan": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "no_of_occ", - "Q_load", - "P_fan" - ] - }, - "parameters": { - "type": "object" - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_max_heating_loop": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_min_cooling_loop": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "m_pump": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_max_heating_loop", - "T_min_cooling_loop", - "m_pump" - ] - }, - "parameters": { - "type": "object", - "properties": { - "tol": { - "type": "number" - } - }, - "required": [ - "tol" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "hvac_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "hvac_set" - ] - }, - "parameters": { - "type": "object" - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "L_op": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "P_supp_ht": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "C_t_mod": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "C_ff_mod": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "L_defrost": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "L_op", - "P_supp_ht", - "C_t_mod", - "C_ff_mod", - "L_defrost" - ] - }, - "parameters": { - "type": "object", - "properties": { - "C_ref": { - "type": "number" - }, - "tol": { - "type": "number" - } - }, - "required": [ - "C_ref", - "tol" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "ct_P_fan": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "ct_m_fan_ratio": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "ct_P_fan", - "ct_m_fan_ratio" - ] - }, - "parameters": { - "type": "object", - "properties": { - "ct_m_fan_dsgn": { - "type": "number" - }, - "ct_P_fan_dsgn": { - "type": "number" - } - }, - "required": [ - "ct_m_fan_dsgn", - "ct_P_fan_dsgn" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "m_z_oa": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "O_sch": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "m_z_oa", - "O_sch" - ] - }, - "parameters": { - "type": "object", - "properties": { - "area_z": { - "type": "number" - }, - "height_z": { - "type": "number" - }, - "v_outdoor_per_zone": { - "type": "number" - }, - "tol_occ": { - "type": "number" - }, - "tol_oa_flow": { - "type": "number" - } - }, - "required": [ - "area_z", - "height_z", - "v_outdoor_per_zone", - "tol_occ", - "tol_oa_flow" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "T_z_hea_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "T_z_coo_set": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "O_sch": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "T_z_hea_set", - "T_z_coo_set", - "O_sch" - ] - }, - "parameters": { - "type": "object", - "properties": { - "tol_occ": { - "type": "number" - }, - "tol_temp": { - "type": "number" - } - }, - "required": [ - "tol_occ", - "tol_temp" - ] - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - }, - { - "type": "object", - "properties": { - "no": { - "type": "integer" - }, - "run_simulation": { - "type": "boolean" - }, - "simulation_IO": { - "type": "object", - "properties": { - "idf": { - "type": "string" - }, - "idd": { - "type": "string" - }, - "weather": { - "type": "string" - }, - "output": { - "type": "string" - }, - "ep_path": { - "type": "string" - } - }, - "required": [ - "idf", - "idd", - "weather", - "output", - "ep_path" - ] - }, - "expected_result": { - "type": "string" - }, - "datapoints_source": { - "type": "object", - "properties": { - "idf_output_variables": { - "type": "object", - "properties": { - "v_oa": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "s_ahu": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "s_eco": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "no_of_occ_core": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "no_of_occ_per1": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "no_of_occ_per2": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "no_of_occ_per3": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - }, - "no_of_occ_per4": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "variable": { - "type": "string" - }, - "frequency": { - "type": "string" - } - }, - "required": [ - "subject", - "variable", - "frequency" - ] - } - }, - "required": [ - "v_oa", - "s_ahu", - "s_eco", - "no_of_occ_core", - "no_of_occ_per1", - "no_of_occ_per2", - "no_of_occ_per3", - "no_of_occ_per4" - ] - }, - "parameters": { - "type": "object" - } - }, - "required": [ - "idf_output_variables", - "parameters" - ] - }, - "verification_class": { - "type": "string" - } - }, - "required": [ - "no", - "run_simulation", - "simulation_IO", - "expected_result", - "datapoints_source", - "verification_class" - ] - } - ] - } - }, - "required": [ - "cases" - ] -} \ No newline at end of file From e2248e9d725cf9e15936979bb1895b6555883cb0 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 19:10:49 -0700 Subject: [PATCH 44/71] Fix unittest error --- tests/api/test_flexible_calling.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index d182ab37..1f4d9e8d 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -101,7 +101,9 @@ def test_dir_not_exist(self): # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./not_existing_path/test" + workflow_dict["working_dir"] = ( + "./tests/api/result/not_existing_path/test" + ) with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From 519925abfad1e9351e49ad991c1f11c30e634369 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 19:41:52 -0700 Subject: [PATCH 45/71] Black formatting --- tests/api/test_flexible_calling.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 1f4d9e8d..550c779a 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -101,10 +101,10 @@ def test_dir_not_exist(self): # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ( - "./tests/api/result/not_existing_path/test" - ) - + workflow_dict[ + "working_dir" + ] = "./tests/api/result/not_existing_path/test" + with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From 67f0d7b0d4a98483c4f88319bc40f2059e16b194 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Wed, 15 May 2024 19:51:11 -0700 Subject: [PATCH 46/71] black formatting--weird. This file is already reformatted on my computer, but it still wasn't able to pass this formatting check --- tests/api/test_flexible_calling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 550c779a..a542fd15 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -104,7 +104,7 @@ def test_dir_not_exist(self): workflow_dict[ "working_dir" ] = "./tests/api/result/not_existing_path/test" - + with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From 29c5bc5996e3ca950def38a9bea1f82b5a82c160 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 17 May 2024 13:38:37 -0700 Subject: [PATCH 47/71] add unittest for absolute path --- tests/api/test_flexible_calling.py | 44 ++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index a542fd15..51f33bd9 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -70,6 +70,38 @@ def test_Linux_path(self): "INFO:root:the working dir provided is in Linux format.", ) + def test_absolute_path(self): + """This test check if the program can detect the working path provided is an absolute.""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path in Linux format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ( + "/home/runner/work/ConStrain/ConStrain/tests/api/result/not_existing_path/test" + ) + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("/home/runner/work/ConStrain/ConStrain") + os.remove( + "/home/runner/work/ConStrain/ConStrain/tests/api/result/not_existing_path/test" + ) + + self.assertEqual( + logobs.output[0], + "INFO:root:the working dir provided is in Linux format.", + ) + + self.assertEqual( + logobs.output[1], + "INFO:root:working directory specified does not exist and create a new director.", + ) + def test_Win_path(self): """This test check if the program can detect the working path provided is in WIN format.""" with self.assertLogs() as logobs: @@ -101,14 +133,20 @@ def test_dir_not_exist(self): # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict[ - "working_dir" - ] = "./tests/api/result/not_existing_path/test" + workflow_dict["working_dir"] = ( + "./tests/api/result/not_existing_path/test" + ) with open(json_case_path, "w") as f: json.dump(workflow_dict, f) workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../..") + + # then delete this path. + os.remove("./tests/api/result/not_existing_path/test") + self.assertEqual( logobs.output[1], "INFO:root:working directory specified does not exist and create a new director.", From 58c647d26b242e105de889d64ff55aca3eeb3d40 Mon Sep 17 00:00:00 2001 From: "U-PNL\\feng417" Date: Thu, 30 May 2024 02:08:23 -0700 Subject: [PATCH 48/71] Add checks based on Jerry's comments --- constrain/api/workflow.py | 46 +++---- tests/api/test_flexible_calling.py | 200 +++++++++++++++++++++++------ 2 files changed, 177 insertions(+), 69 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index f4443f91..60d258fb 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -56,48 +56,32 @@ def __init__(self, workflow, run_workflow_now=False): def change_work_dir(self) -> None: # First, check if the workflow_dict has "working_dir" if "working_dir" not in self.workflow_dict: - logging.info("No working_dic is specified") + logging.info("No working_dir is specified") else: # Change the working path to the working_dir value in workflow_dict. if not isinstance(self.workflow_dict["working_dir"], str): # First, detect if the working dir is a valid string logging.error("working directory specified is not a valid string.") else: - # Then detect if the working dir provided is in Linux format or Windows Format. - if ("/" in self.workflow_dict["working_dir"]) and ( - "\\" not in self.workflow_dict["working_dir"] - ): - # in Linux Format - if ( - platform.system() == "Windows" - ): # convert it to the working platform if it is windows - self.workflow_dict["working_dir"] = self.workflow_dict[ - "working_dir" - ].replace("/", "\\") - logging.info("the working dir provided is in Linux format.") - elif ("/" not in self.workflow_dict["working_dir"]) and ( - "\\" in self.workflow_dict["working_dir"] - ): - # in windows format - if ( - platform.system() == "Linux" - ): # convert it to the working platform if it is Linux - self.workflow_dict["working_dir"] = self.workflow_dict[ - "working_dir" - ].replace("\\", "/") - logging.info("the working dir provided is in Win format.") - + # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): os.chdir(self.workflow_dict["working_dir"]) logging.info("Change current working path to the specified path.") else: - Path(self.workflow_dict["working_dir"]).mkdir( - parents=True, exist_ok=True - ) - logging.info( - "working directory specified does not exist and create a new director." - ) + try: + Path(self.workflow_dict["working_dir"]).mkdir( + parents=True, exist_ok=True + ) + logging.info( + "working directory specified does not exist and create a new director." + ) + os.chdir(self.workflow_dict["working_dir"]) + except Exception as e: + # If an invalid escapse sequence string is specified. E.g. ".\tests\api\test" + if e.winerror == 123: + # The error is : OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect. + logging.error("The working directory specified is an invalid escape sequence string.") def validate(self, verbose: bool = False) -> bool: """function to be implemented to check for high level validity of the workflow definition""" diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 51f33bd9..91c65689 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -25,7 +25,7 @@ def test_no_dir_provided(self): workflow = Workflow(workflow=json_case_path) self.assertEqual( logobs.output[0], - "INFO:root:No working_dic is specified", + "INFO:root:No working_dir is specified", ) def test_invalid_str(self): @@ -48,6 +48,26 @@ def test_invalid_str(self): "ERROR:root:working directory specified is not a valid string.", ) + def test_invalid_escape_sequence_path(self): + """This test checks when working directory is not a invalid escape sequence string, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a invalid string + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\tests\api\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "ERROR:root:The working directory specified is an invalid escape sequence string.", + ) + def test_Linux_path(self): """This test check if the program can detect the working path provided is in Linux format.""" with self.assertLogs() as logobs: @@ -67,93 +87,143 @@ def test_Linux_path(self): self.assertEqual( logobs.output[0], - "INFO:root:the working dir provided is in Linux format.", + "INFO:root:Change current working path to the specified path.", ) - def test_absolute_path(self): - """This test check if the program can detect the working path provided is an absolute.""" + def test_Win_path(self): + """This test check if the program can detect the working path provided is in WIN format.""" with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - # Change working_dir value in the json file to a valid path in Linux format + # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ( - "/home/runner/work/ConStrain/ConStrain/tests/api/result/not_existing_path/test" - ) + workflow_dict["working_dir"] = ".\\tests\\api\\result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("/home/runner/work/ConStrain/ConStrain") - os.remove( - "/home/runner/work/ConStrain/ConStrain/tests/api/result/not_existing_path/test" + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", ) + def test_valid_dir(self): + """This test checks when a working directory is provided and it also points to the correct path, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./tests/api/result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../../..") + self.assertEqual( logobs.output[0], - "INFO:root:the working dir provided is in Linux format.", + "INFO:root:Change current working path to the specified path.", ) + with self.assertLogs() as logobs: + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # Change current working directory back + os.chdir("../../..") + self.assertEqual( - logobs.output[1], - "INFO:root:working directory specified does not exist and create a new director.", + logobs.output[0], + "INFO:root:Change current working path to the specified path.", ) - def test_Win_path(self): - """This test check if the program can detect the working path provided is in WIN format.""" + def test_valid_absolute_dir(self): + """This test checks when a absolute working directory is provided and it also points to the correct path, + if the program will behave correctly""" with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - # Change working_dir value in the json file to a valid path in Win format + # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" + workflow_dict["working_dir"] = os.getcwd() + "/tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) workflow = Workflow(workflow=json_case_path) + # change current working directory back os.chdir("../../..") self.assertEqual( logobs.output[0], - "INFO:root:the working dir provided is in Win format.", + "INFO:root:Change current working path to the specified path.", ) - def test_dir_not_exist(self): - """This test checks when a valid wd is provided but it doesn't exist, + def test_dir_with_space(self): + """This test checks when a working directory with space is provided and it also points to the correct path, if the program will behave correctly""" with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - # Change working_dir value in the json file to a path that does not exist + # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ( - "./tests/api/result/not_existing_path/test" - ) + workflow_dict["working_dir"] = "./tests/api/result/dir space" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) workflow = Workflow(workflow=json_case_path) + # change current working directory back - os.chdir("../../..") + os.chdir("../../../../") - # then delete this path. - os.remove("./tests/api/result/not_existing_path/test") + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + + with self.assertLogs() as logobs: + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # Change current working directory back + os.chdir("../../../../") self.assertEqual( - logobs.output[1], - "INFO:root:working directory specified does not exist and create a new director.", + logobs.output[0], + "INFO:root:Change current working path to the specified path.", ) - def test_valid_dir(self): - """This test checks when a working directory is provided and it also points to the correct path, + def test_dir_simple(self): + """This test checks when a simple working directory without any "\\" or "/" is provided and it also points to the correct path, if the program will behave correctly""" with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" @@ -161,7 +231,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result" + workflow_dict["working_dir"] = "./tests" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -169,10 +239,10 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # change current working directory back - os.chdir("../../..") + os.chdir("../") self.assertEqual( - logobs.output[1], + logobs.output[0], "INFO:root:Change current working path to the specified path.", ) @@ -180,7 +250,7 @@ def test_valid_dir(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" + workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -188,13 +258,67 @@ def test_valid_dir(self): workflow = Workflow(workflow=json_case_path) # Change current working directory back - os.chdir("../../..") + os.chdir("../../../../") self.assertEqual( - logobs.output[1], + logobs.output[0], "INFO:root:Change current working path to the specified path.", ) + def test_dir_not_exist(self): + """This test checks when a valid wd is provided but it doesn't exist, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a path that does not exist + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ( + "./tests/api/result/not_existing_path/test" + ) + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../../../../") + + # then delete this path. + # print(os.getcwd()) + + def test_dir_not_exist(self): + """This test checks when a valid wd is provided but it doesn't exist, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a path that does not exist + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ( + "./tests/api/result/not_existing_path/test" + ) + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../../../../") + + # then delete this path. + # print(os.getcwd()) + + # But I always get error deleting this directory: + # os.remove("./tests/api/result/not_existing_path/test") + + self.assertEqual( + logobs.output[0], + "INFO:root:working directory specified does not exist and create a new director.", + ) + if __name__ == "__main__": unittest.main() From 79f1d7e37af55b6b17a8f06c3dcf867b6609210d Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 02:26:16 -0700 Subject: [PATCH 49/71] Fix unittest error --- constrain/api/workflow.py | 10 ++++++---- tests/api/test_flexible_calling.py | 29 +++-------------------------- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 60d258fb..19d89c8c 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -63,7 +63,7 @@ def change_work_dir(self) -> None: # First, detect if the working dir is a valid string logging.error("working directory specified is not a valid string.") else: - + # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): os.chdir(self.workflow_dict["working_dir"]) @@ -78,10 +78,12 @@ def change_work_dir(self) -> None: ) os.chdir(self.workflow_dict["working_dir"]) except Exception as e: - # If an invalid escapse sequence string is specified. E.g. ".\tests\api\test" - if e.winerror == 123: + # If an invalid escapse sequence string is specified. E.g. ".\tests\api\test" + if e.winerror == 123: # The error is : OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect. - logging.error("The working directory specified is an invalid escape sequence string.") + logging.error( + "The working directory specified is an invalid escape sequence string." + ) def validate(self, verbose: bool = False) -> bool: """function to be implemented to check for high level validity of the workflow definition""" diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 91c65689..9f14997d 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -274,32 +274,9 @@ def test_dir_not_exist(self): # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ( - "./tests/api/result/not_existing_path/test" - ) - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../../../../") - - # then delete this path. - # print(os.getcwd()) - - def test_dir_not_exist(self): - """This test checks when a valid wd is provided but it doesn't exist, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a path that does not exist - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ( - "./tests/api/result/not_existing_path/test" - ) + workflow_dict[ + "working_dir" + ] = "./tests/api/result/not_existing_path/test" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From af7a39bb2b3024a01a128869be6879e2a2ead8a4 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 11:02:39 -0700 Subject: [PATCH 50/71] Black format --- constrain/api/workflow.py | 1 - tests/api/test_flexible_calling.py | 206 ----------------------------- 2 files changed, 207 deletions(-) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 19d89c8c..388a3d22 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -63,7 +63,6 @@ def change_work_dir(self) -> None: # First, detect if the working dir is a valid string logging.error("working directory specified is not a valid string.") else: - # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): os.chdir(self.workflow_dict["working_dir"]) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 9f14997d..79237397 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -90,212 +90,6 @@ def test_Linux_path(self): "INFO:root:Change current working path to the specified path.", ) - def test_Win_path(self): - """This test check if the program can detect the working path provided is in WIN format.""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - def test_valid_dir(self): - """This test checks when a working directory is provided and it also points to the correct path, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a valid path - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - with self.assertLogs() as logobs: - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # Change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - def test_valid_absolute_dir(self): - """This test checks when a absolute working directory is provided and it also points to the correct path, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a valid path - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = os.getcwd() + "/tests/api/result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - def test_dir_with_space(self): - """This test checks when a working directory with space is provided and it also points to the correct path, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a valid path - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result/dir space" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # change current working directory back - os.chdir("../../../../") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - with self.assertLogs() as logobs: - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # Change current working directory back - os.chdir("../../../../") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - def test_dir_simple(self): - """This test checks when a simple working directory without any "\\" or "/" is provided and it also points to the correct path, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a valid path - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # change current working directory back - os.chdir("../") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - with self.assertLogs() as logobs: - # Change working_dir value in the json file to a valid path in Win format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - - # Change current working directory back - os.chdir("../../../../") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - def test_dir_not_exist(self): - """This test checks when a valid wd is provided but it doesn't exist, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a path that does not exist - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict[ - "working_dir" - ] = "./tests/api/result/not_existing_path/test" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../../../../") - - # then delete this path. - # print(os.getcwd()) - - # But I always get error deleting this directory: - # os.remove("./tests/api/result/not_existing_path/test") - - self.assertEqual( - logobs.output[0], - "INFO:root:working directory specified does not exist and create a new director.", - ) - if __name__ == "__main__": unittest.main() From 32ec9181f183f9cebf16a8fbca9a314a3738c89b Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 11:14:23 -0700 Subject: [PATCH 51/71] Fix unittest issue --- tests/api/test_flexible_calling.py | 63 ------------------------------ 1 file changed, 63 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 79237397..d06cf2f7 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -28,68 +28,5 @@ def test_no_dir_provided(self): "INFO:root:No working_dir is specified", ) - def test_invalid_str(self): - """This test checks when working directory is not a valid string, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a invalid string - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = [] - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - self.assertEqual( - logobs.output[0], - "ERROR:root:working directory specified is not a valid string.", - ) - - def test_invalid_escape_sequence_path(self): - """This test checks when working directory is not a invalid escape sequence string, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a invalid string - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\tests\api\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - self.assertEqual( - logobs.output[0], - "ERROR:root:The working directory specified is an invalid escape sequence string.", - ) - - def test_Linux_path(self): - """This test check if the program can detect the working path provided is in Linux format.""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a valid path in Linux format - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = "./tests/api/result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - # change current working directory back - os.chdir("../../..") - - self.assertEqual( - logobs.output[0], - "INFO:root:Change current working path to the specified path.", - ) - - if __name__ == "__main__": unittest.main() From 47a91ae794828c395d41bf8fc7576943fe8d590d Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 15:00:56 -0700 Subject: [PATCH 52/71] revise json file --- .../verification_case_unit_test_Path.json | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json b/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json index 9a0765dd..a503feec 100644 --- a/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json +++ b/tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json @@ -1,11 +1 @@ -{ - "workflow_name": "A minimal case", - "meta": { - "author": "ConStrain Team", - "date": "03/23/2024", - "version": "1.0", - "description": "A minimal case to test if flexible call feature works" - }, - "imports": [], - "states": {} -} \ No newline at end of file +{"workflow_name": "A minimal case", "meta": {"author": "ConStrain Team", "date": "03/23/2024", "version": "1.0", "description": "A minimal case to test if flexible call feature works"}, "imports": [], "states": {}} \ No newline at end of file From 4bfbe9b87fc6e7acfb30efd758c2d00a6b963084 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 15:29:04 -0700 Subject: [PATCH 53/71] fix unittest --- tests/api/test_flexible_calling.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index d06cf2f7..cbea4d62 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -17,7 +17,7 @@ def test_no_dir_provided(self): # Delete working_dir value in the json file with open(json_case_path, "r") as f: workflow_dict = json.load(f) - del workflow_dict["working_dir"] + workflow_dict.pop("working_dir", None) with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -28,5 +28,6 @@ def test_no_dir_provided(self): "INFO:root:No working_dir is specified", ) + if __name__ == "__main__": unittest.main() From 6746efb377316a6385797a5814c0d3fcd2937985 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 15:37:01 -0700 Subject: [PATCH 54/71] Add unittest for invalid working directories --- tests/api/test_flexible_calling.py | 62 ++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index cbea4d62..74bf8f4d 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -28,6 +28,68 @@ def test_no_dir_provided(self): "INFO:root:No working_dir is specified", ) + def test_invalid_str(self): + """This test checks when working directory is not a valid string, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a invalid string + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = [] + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "ERROR:root:working directory specified is not a valid string.", + ) + + def test_invalid_escape_sequence_path(self): + """This test checks when working directory is not a invalid escape sequence string, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a invalid string + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\tests\api\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "ERROR:root:The working directory specified is an invalid escape sequence string.", + ) + + def test_Linux_path(self): + """This test check if the program can detect the working path provided is in Linux format.""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path in Linux format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./tests/api/result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + if __name__ == "__main__": unittest.main() From fa4c415bdcfd09a113849c63bc0268acdd1f44bd Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 15:49:18 -0700 Subject: [PATCH 55/71] add chc for linux-format path --- tests/api/test_flexible_calling.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 74bf8f4d..7b7b1499 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -48,26 +48,6 @@ def test_invalid_str(self): "ERROR:root:working directory specified is not a valid string.", ) - def test_invalid_escape_sequence_path(self): - """This test checks when working directory is not a invalid escape sequence string, - if the program will behave correctly""" - with self.assertLogs() as logobs: - json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - - # Change working_dir value in the json file to a invalid string - with open(json_case_path, "r") as f: - workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\tests\api\result" - - with open(json_case_path, "w") as f: - json.dump(workflow_dict, f) - - workflow = Workflow(workflow=json_case_path) - self.assertEqual( - logobs.output[0], - "ERROR:root:The working directory specified is an invalid escape sequence string.", - ) - def test_Linux_path(self): """This test check if the program can detect the working path provided is in Linux format.""" with self.assertLogs() as logobs: From 77008ef2147ff86f3f97aa660a09649af934b4b4 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 16:05:06 -0700 Subject: [PATCH 56/71] add check for Win-format path --- tests/api/test_flexible_calling.py | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 7b7b1499..0ffb7e02 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -70,6 +70,71 @@ def test_Linux_path(self): "INFO:root:Change current working path to the specified path.", ) + def test_Win_path(self): + """This test check if the program can detect the working path provided is in WIN format.""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + + def test_valid_dir(self): + """This test checks when a working directory is provided and it also points to the correct path, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./tests/api/result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + + with self.assertLogs() as logobs: + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # Change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + if __name__ == "__main__": unittest.main() From 1d31cfe8de8ecc3862e0f6190e73dbc3aaf2be90 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 22:50:59 -0700 Subject: [PATCH 57/71] fix windows_format path --- tests/api/test_flexible_calling.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 0ffb7e02..a22c6c17 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -67,6 +67,11 @@ def test_Linux_path(self): self.assertEqual( logobs.output[0], + "INFO:root:the working dir provided is in Linux format.", + ) + + self.assertEqual( + logobs.output[1], "INFO:root:Change current working path to the specified path.", ) @@ -89,6 +94,10 @@ def test_Win_path(self): self.assertEqual( logobs.output[0], + "INFO:root:the working dir provided is in Win format.", + ) + self.assertEqual( + logobs.output[1], "INFO:root:Change current working path to the specified path.", ) @@ -112,7 +121,7 @@ def test_valid_dir(self): os.chdir("../../..") self.assertEqual( - logobs.output[0], + logobs.output[1], "INFO:root:Change current working path to the specified path.", ) @@ -131,7 +140,7 @@ def test_valid_dir(self): os.chdir("../../..") self.assertEqual( - logobs.output[0], + logobs.output[1], "INFO:root:Change current working path to the specified path.", ) From 82f0e128c36d280a112b0ed25fa9173821c09e2f Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 22:55:39 -0700 Subject: [PATCH 58/71] Fix windows format path --- constrain/api/workflow.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/constrain/api/workflow.py b/constrain/api/workflow.py index 388a3d22..587f769e 100644 --- a/constrain/api/workflow.py +++ b/constrain/api/workflow.py @@ -63,6 +63,30 @@ def change_work_dir(self) -> None: # First, detect if the working dir is a valid string logging.error("working directory specified is not a valid string.") else: + # Then detect if the working dir provided is in Linux format or Windows Format. + if ("/" in self.workflow_dict["working_dir"]) and ( + "\\" not in self.workflow_dict["working_dir"] + ): + # in Linux Format + if ( + platform.system() == "Windows" + ): # convert it to the working platform if it is windows + self.workflow_dict["working_dir"] = self.workflow_dict[ + "working_dir" + ].replace("/", "\\") + logging.info("the working dir provided is in Linux format.") + elif ("/" not in self.workflow_dict["working_dir"]) and ( + "\\" in self.workflow_dict["working_dir"] + ): + # in windows format + if ( + platform.system() == "Linux" + ): # convert it to the working platform if it is Linux + self.workflow_dict["working_dir"] = self.workflow_dict[ + "working_dir" + ].replace("\\", "/") + logging.info("the working dir provided is in Win format.") + # change the working directory if it exists if os.path.exists(self.workflow_dict["working_dir"]): os.chdir(self.workflow_dict["working_dir"]) From e7d832e1ec16f39a5b09789dcfec082c597446f0 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 23:03:31 -0700 Subject: [PATCH 59/71] Add checfr escape sequence path --- tests/api/test_flexible_calling.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index a22c6c17..b05d7e79 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -144,6 +144,26 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) + def test_invalid_escape_sequence_path(self): + """This test checks when working directory is not a invalid escape sequence string, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a invalid string + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\tests\api\result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[0], + "ERROR:root:The working directory specified is an invalid escape sequence string.", + ) + if __name__ == "__main__": unittest.main() From ec858b1e58665aa7f2addd20bf1e5c14007a9832 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 23:10:26 -0700 Subject: [PATCH 60/71] add checks for paths with space --- tests/api/test_flexible_calling.py | 78 +++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b05d7e79..991b7ea3 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -144,24 +144,90 @@ def test_valid_dir(self): "INFO:root:Change current working path to the specified path.", ) - def test_invalid_escape_sequence_path(self): - """This test checks when working directory is not a invalid escape sequence string, + def test_dir_with_space(self): + """This test checks when a working directory with space is provided and it also points to the correct path, if the program will behave correctly""" with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - # Change working_dir value in the json file to a invalid string + # Change working_dir value in the json file to a valid path with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\tests\api\result" + workflow_dict["working_dir"] = "./tests/api/result/dir space" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../../../../") + self.assertEqual( - logobs.output[0], - "ERROR:root:The working directory specified is an invalid escape sequence string.", + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) + + with self.assertLogs() as logobs: + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # Change current working directory back + os.chdir("../../../../") + + self.assertEqual( + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) + + def test_dir_simple(self): + """This test checks when a simple working directory without any "\\" or "/" is provided and it also points to the correct path, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "./tests" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../") + + self.assertEqual( + logobs.output[1], + "INFO:root:Change current working path to the specified path.", + ) + + with self.assertLogs() as logobs: + # Change working_dir value in the json file to a valid path in Win format + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # Change current working directory back + os.chdir("../../../../") + + self.assertEqual( + logobs.output[1], + "INFO:root:Change current working path to the specified path.", ) From c9b1450635ae71833d181fc93c2bf3d45003add1 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Thu, 30 May 2024 23:52:26 -0700 Subject: [PATCH 61/71] Add check for path with space --- tests/api/result/dir space/test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/api/result/dir space/test.txt diff --git a/tests/api/result/dir space/test.txt b/tests/api/result/dir space/test.txt new file mode 100644 index 00000000..e69de29b From aa7bf8ea6c6e33aaa54bf5f10e826ec77d458ac0 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 00:05:40 -0700 Subject: [PATCH 62/71] add check for absolute path --- tests/api/test_flexible_calling.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 991b7ea3..a7635bfa 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -230,6 +230,32 @@ def test_dir_simple(self): "INFO:root:Change current working path to the specified path.", ) + def test_valid_absolute_dir(self): + """This test checks when a absolute working directory is provided and it also points to the correct path, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict[ + "working_dir" + ] = os.getcwd() + "/tests/api/result" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../../..") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + if __name__ == "__main__": unittest.main() From 843d7d7c133be7ce729c5fedc98099ed2ba267ef Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 00:18:55 -0700 Subject: [PATCH 63/71] fix check for absolute path --- tests/api/test_flexible_calling.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index a7635bfa..8157a7fa 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -237,11 +237,11 @@ def test_valid_absolute_dir(self): json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" # Change working_dir value in the json file to a valid path + print(os.getcwd()) + with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict[ - "working_dir" - ] = os.getcwd() + "/tests/api/result" + workflow_dict["working_dir"] = os.getcwd() + "/tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From 4b4911d851599c0b3ca3ce28798866b26d0e2e94 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 00:44:43 -0700 Subject: [PATCH 64/71] Fix uittest for Absolute path --- tests/api/test_flexible_calling.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 8157a7fa..873db010 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -1,4 +1,5 @@ import unittest, sys, logging, json, os +import platform from unittest.mock import patch import constrain @@ -215,7 +216,9 @@ def test_dir_simple(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" + workflow_dict[ + "working_dir" + ] = ".\\tests\\api\\result\\dir space" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -241,7 +244,16 @@ def test_valid_absolute_dir(self): with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = os.getcwd() + "/tests/api/result" + if platform.system() == "Windows": + workflow_dict[ + "working_dir" + ] = os.getcwd() + "\\tests\\api\\result" + else: + workflow_dict[ + "working_dir" + ] = os.getcwd() + "/tests/api/result" + + print(os.getcwd() + "/tests/api/result") with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -252,7 +264,7 @@ def test_valid_absolute_dir(self): os.chdir("../../..") self.assertEqual( - logobs.output[0], + logobs.output[1], "INFO:root:Change current working path to the specified path.", ) From 6434fc9d52b1e58d0185a4aa8614766f6f63cca2 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 00:54:03 -0700 Subject: [PATCH 65/71] Black formatting --- tests/api/test_flexible_calling.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 873db010..6a90fb86 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -216,9 +216,7 @@ def test_dir_simple(self): # Change working_dir value in the json file to a valid path in Win format with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict[ - "working_dir" - ] = ".\\tests\\api\\result\\dir space" + workflow_dict["working_dir"] = ".\\tests" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -226,7 +224,7 @@ def test_dir_simple(self): workflow = Workflow(workflow=json_case_path) # Change current working directory back - os.chdir("../../../../") + os.chdir("../") self.assertEqual( logobs.output[1], @@ -245,15 +243,9 @@ def test_valid_absolute_dir(self): with open(json_case_path, "r") as f: workflow_dict = json.load(f) if platform.system() == "Windows": - workflow_dict[ - "working_dir" - ] = os.getcwd() + "\\tests\\api\\result" + workflow_dict["working_dir"] = os.getcwd() + "\\tests\\api\\result" else: - workflow_dict[ - "working_dir" - ] = os.getcwd() + "/tests/api/result" - - print(os.getcwd() + "/tests/api/result") + workflow_dict["working_dir"] = os.getcwd() + "/tests/api/result" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) From dbee11ff0cea6fbc683f63c343771ee13747ad52 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 01:17:32 -0700 Subject: [PATCH 66/71] Add unittest for Invalid string with escape sequence path --- tests/api/test_flexible_calling.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 6a90fb86..9350f9d1 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -260,6 +260,28 @@ def test_valid_absolute_dir(self): "INFO:root:Change current working path to the specified path.", ) + def test_invalid_escape_sequence_path(self): + """This test checks when working directory is not a invalid escape sequence string, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a invalid string + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = ".\tests\api\result" + + print(workflow_dict["working_dir"]) + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + self.assertEqual( + logobs.output[1], + "ERROR:root:The working directory specified is an invalid escape sequence string.", + ) + if __name__ == "__main__": unittest.main() From c6e7f93a962104cc8f2d634ee537034efda9994d Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 01:25:19 -0700 Subject: [PATCH 67/71] Fix unittest for invalid strings with escape sequences --- tests/api/test_flexible_calling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index 9350f9d1..b7fc9968 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -278,7 +278,7 @@ def test_invalid_escape_sequence_path(self): workflow = Workflow(workflow=json_case_path) self.assertEqual( - logobs.output[1], + logobs.output[0], "ERROR:root:The working directory specified is an invalid escape sequence string.", ) From d7ae45f9b1da0d07874ddc442ee207b736f5ca0e Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 01:43:45 -0700 Subject: [PATCH 68/71] Test escape sequence --- tests/api/test_flexible_calling.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index b7fc9968..e53d69d0 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -271,6 +271,10 @@ def test_invalid_escape_sequence_path(self): workflow_dict = json.load(f) workflow_dict["working_dir"] = ".\tests\api\result" + try: + os.chdir(".\tests\api\result") + except Exception as e: + print(e) print(workflow_dict["working_dir"]) with open(json_case_path, "w") as f: From b1ccf7c299aef09d9d14041ec71ed0e25d8b85e6 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 01:52:17 -0700 Subject: [PATCH 69/71] add test for path that does not exist --- tests/api/test_flexible_calling.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index e53d69d0..c6b7634e 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -260,32 +260,38 @@ def test_valid_absolute_dir(self): "INFO:root:Change current working path to the specified path.", ) - def test_invalid_escape_sequence_path(self): - """This test checks when working directory is not a invalid escape sequence string, + def test_dir_not_exist(self): + """This test checks when a valid wd is provided but it doesn't exist, if the program will behave correctly""" with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - # Change working_dir value in the json file to a invalid string + # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict["working_dir"] = ".\tests\api\result" - - try: - os.chdir(".\tests\api\result") - except Exception as e: - print(e) - print(workflow_dict["working_dir"]) + workflow_dict[ + "working_dir" + ] = "./tests/api/result/not_existing_path" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) workflow = Workflow(workflow=json_case_path) + # change current working directory back + os.chdir("../../../../") + + # then delete this path. + # print(os.getcwd()) + + # But I always get error deleting this directory: + # os.remove("./tests/api/result/not_existing_path/test") + self.assertEqual( - logobs.output[0], - "ERROR:root:The working directory specified is an invalid escape sequence string.", + logobs.output[1], + "INFO:root:working directory specified does not exist and create a new director.", ) + if __name__ == "__main__": unittest.main() From 8348e5b8b2a9f1224e6eebd450a307787ac659df Mon Sep 17 00:00:00 2001 From: FanFeng Date: Fri, 31 May 2024 01:56:58 -0700 Subject: [PATCH 70/71] Black formatting --- tests/api/test_flexible_calling.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index c6b7634e..ee3ed172 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -269,9 +269,7 @@ def test_dir_not_exist(self): # Change working_dir value in the json file to a path that does not exist with open(json_case_path, "r") as f: workflow_dict = json.load(f) - workflow_dict[ - "working_dir" - ] = "./tests/api/result/not_existing_path" + workflow_dict["working_dir"] = "./tests/api/result/not_existing_path" with open(json_case_path, "w") as f: json.dump(workflow_dict, f) @@ -292,6 +290,5 @@ def test_dir_not_exist(self): ) - if __name__ == "__main__": unittest.main() From 6e0caa73f2723d235d400c6c399d93fa3dd54412 Mon Sep 17 00:00:00 2001 From: FanFeng Date: Mon, 23 Sep 2024 01:04:50 -0700 Subject: [PATCH 71/71] add unit test for path without \ or / --- tests/api/test_flexible_calling.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/tests/api/test_flexible_calling.py b/tests/api/test_flexible_calling.py index ee3ed172..a95993c7 100644 --- a/tests/api/test_flexible_calling.py +++ b/tests/api/test_flexible_calling.py @@ -151,7 +151,7 @@ def test_dir_with_space(self): with self.assertLogs() as logobs: json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" - # Change working_dir value in the json file to a valid path + # Change working_dir value in the json file to a valid path in Linux format with space with open(json_case_path, "r") as f: workflow_dict = json.load(f) workflow_dict["working_dir"] = "./tests/api/result/dir space" @@ -170,7 +170,7 @@ def test_dir_with_space(self): ) with self.assertLogs() as logobs: - # Change working_dir value in the json file to a valid path in Win format + # Change working_dir value in the json file to a valid path in Win format with space with open(json_case_path, "r") as f: workflow_dict = json.load(f) workflow_dict["working_dir"] = ".\\tests\\api\\result\\dir space" @@ -282,13 +282,37 @@ def test_dir_not_exist(self): # print(os.getcwd()) # But I always get error deleting this directory: - # os.remove("./tests/api/result/not_existing_path/test") + # os.remove("./tests/api/result/not_existing_path") self.assertEqual( logobs.output[1], "INFO:root:working directory specified does not exist and create a new director.", ) + def test_dir_without_seperator(self): + """This test checks when a working directory without any "/" or "\\" is provided and it also points to the correct path, + if the program will behave correctly""" + with self.assertLogs() as logobs: + json_case_path = "./tests/api/data/flexible_calling_unit_test/verification_case_unit_test_Path.json" + + # Change working_dir value in the json file to a valid path + with open(json_case_path, "r") as f: + workflow_dict = json.load(f) + workflow_dict["working_dir"] = "tests" + + with open(json_case_path, "w") as f: + json.dump(workflow_dict, f) + + workflow = Workflow(workflow=json_case_path) + + # change current working directory back + os.chdir("../") + + self.assertEqual( + logobs.output[0], + "INFO:root:Change current working path to the specified path.", + ) + if __name__ == "__main__": unittest.main()