diff --git a/docs/ashrae_90p1_2019/section6/Rule6-1.md b/docs/ashrae_90p1_2019/section6/Rule6-1.md index 7edc7da27b..0518d5e2eb 100644 --- a/docs/ashrae_90p1_2019/section6/Rule6-1.md +++ b/docs/ashrae_90p1_2019/section6/Rule6-1.md @@ -1,4 +1,3 @@ - # Lighting - Rule 6-1 **Rule ID:** 6-1 @@ -10,27 +9,43 @@ - Table G3.7, Performance Rating Method Lighting Power Density Allowances and Occupancy Sensor Reductions Using the Space-by-Space Method - Table G3.8, Performance Rating Method Lighting Power Densities Using the Building Area Method -**Applicability:** All required data elements exist for P_RMR +**Applicability:** All required data elements exist for P_RMD **Manual Check:** Yes -**Evaluation Context:** Each Data Element +**Evaluation Context:** Each BuildingSegment **Data Lookup:** Table G3.7 and Table G3.8 **Function Call:** None ## Rule Logic: -- For each building segment in the Proposed Model: `building_segment_p in P_RMR.building.building_segments` +- For each building segment in the Proposed Model: `building_segment_p in P_RMD.building.building_segments` + + - Initialize a variable to track if any space in the building segment is a crawl space, interstitial space, or plenum with lighting: `has_crawl_interstitial_plenum_with_lighting = FALSE` - - If building segment specifies lighting building area type, get the allowable lighting power density from Table G3-8: `if building_segment_p.lighting_building_area_type in table_G3_8: allowable_LPD_BAM = data_lookup(table_G3_8, building_segment_p.lighting_building_area_type)` + - Initialize a variable to track if any space does not specify lighting space type: `check_BAM_flag = FALSE` + +- If building segment specifies lighting building area type, get the allowable lighting power density from Table G3-8: `if building_segment_p.lighting_building_area_type in table_G3_8: allowable_LPD_BAM = data_lookup(table_G3_8, building_segment_p.lighting_building_area_type)` - For each thermal block in building segment: `thermal_block_p in building_segment_p.thermal_blocks:` - For each zone in thermal block: `zone_p in thermal_block_p.zones:` - For each space in zone: `space_p in zone_p.spaces:` + + - Get the space total interior lighting power density: `space_total_LPD_p = sum(interior_lighting.power_per_area for interior_lighting in space_p.interior_lighting)` + + - Add lighting power to building segment total: `building_segment_design_lighting_wattage += (space_total_LPD_p * space_p.floor_area)` - - For each interior lighting in space, add lighting power to building segment total: `building_segment_design_lighting_wattage += sum(interior_lighting.power_per_area for interior_lighting in space_p.interior_lighting) * space_p.floor_area` + - Check if the space is a crawl space, interstitial space, or plenum: `if space_p.function in [CRAWL_SPACE, INTERSTITIAL_SPACE, PLENUM]:` + + - If the space has interior lighting, set flag to TRUE: `if space_total_LPD_p > 0: has_crawl_interstitial_plenum_with_lighting = TRUE` + + - Continue to the next space, to take a conservative approach and avoid increasing the allowable lighting wattage for these spaces: `continue` - - If building segment specifies lighting building area type , add space floor area to the total building segment floor area: `if allowable_LPD_BAM: total_building_segment_area_p += space_p.floor_area` + - If lighting space type is explicitly NONE (unoccupiable space such as elevator or mechanical shaft): `if space_p.lighting_space_type == NONE:` + + - Exclude the space from both BAM and SBS allowance calculations and do not set check_BAM_flag: `continue` + + - If building segment specifies lighting building area type, add space floor area to the total building segment floor area: `if allowable_LPD_BAM: total_building_segment_area_p += space_p.floor_area` - Check if any space does not specify lighting space type, flag for Building Area Method: `if NOT space_p.lighting_space_type: check_BAM_flag = TRUE` @@ -40,32 +55,44 @@ **Rule Assertion:** -- Case 1: For each building segment, if both lighting building area type and lighting space type in all spaces are specified, and the total lighting power in P_RMR is less than or equal to the higher of the Building Area Method and Space-by-Space Method allowances: `if ( allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage <= max(allowable_LPD_BAM * total_building_segment_area_p, allowable_lighting_wattage_SBS) ): PASS` - -- Case 2: Else if both lighting building area type and lighting space type in all spaces are specified, and the total lighting power in P_RMR is more than the higher of the Building Area Method and Space-by-Space Method allowances: `else if ( allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage > max(allowable_LPD_BAM * total_building_segment_area_p, allowable_lighting_wattage_SBS) ): FAIL` - -- Case 3: Else if lighting building area type is not specified, and lighting space type in all spaces are specified, and the total lighting power in P_RMR is less than or equal to the Space-by-Space Method allowance: `else if ( NOT allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage <= allowable_lighting_wattage_SBS ): PASS and raise_warning 'PROJECT PASSES BASED ON SPACE-BY-SPACE METHOD. VERIFY IF PROJECT USES SPACE-BY-SPACE METHOD.'` - -- Case 4: Else if lighting building area type is not specified, and lighting space type in all spaces are specified, and the total lighting power in P_RMR is more than the Space-by-Space Method allowance: `else if ( NOT allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage > allowable_lighting_wattage_SBS ): FAIL and raise_warning 'PROJECT FAILS BASED ON SPACE-BY-SPACE METHOD. LIGHTING_BUILDING_AREA_TYPE IS NOT KNOWN TO DETERMINE BUILDING AREA METHOD ALLOWANCE.'` - -- Case 5: Else if lighting building area type is specified, and lighting space type is not specified in all spaces, and the total lighting power in P_RMR is less than or equal to Building Area Method allowance: `else if ( allowable_LPD_BAM ) and ( check_BAM_flag ) and ( building_segment_design_lighting_wattage <= allowable_LPD_BAM * total_building_segment_area_p ): PASS and raise_warning 'PROJECT PASSES BASED ON BUILDING AREA METHOD. VERIFY IF PROJECT USES BUILDING AREA METHOD.'` - -- Case 6: Else if lighting building area type is specified, and lighting space type is not specified in all spaces, and the total lighting power in P_RMR is more than Building Area Method allowance: `else if ( allowable_LPD_BAM ) and ( check_BAM_flag ) and ( building_segment_design_lighting_wattage > allowable_LPD_BAM * total_building_segment_area_p ): FAIL and raise_warning 'PROJECT FAILS BASED ON BUILDING AREA METHOD. LIGHTING_SPACE_TYPE IS NOT KNOWN IN ALL SPACES TO DETERMINE SPACE-BY-SPACE METHOD ALLOWANCE.'` - -- Case 7: Else, lighting building area type is not specified, and lighting space type is not specified in all spaces: `Else: FAIL and raise_warning 'LIGHTING_BUILDING_AREA_TYPE IS NOT KNOWN AND LIGHTING_SPACE_TYPE IS NOT KNOWN IN ALL SPACES TO DETERMINE ALLOWANCE.'` - -**Notes Before Update for Reference Only:** -Updated the Rule ID from 6-2 to 6-1 on 6/8/2022 - -The RDS needs to be updated in the future based on the following: -- If lighting_building_area_type and lighting_space_type are know known, then calculate allowance based on both, pass if less than max - -- If lighting_building_area_type is not specified, lighting_space_type for all spaces in the building segment is included: then determine allowance based on lighting space type. - - If PASS- Output should say that project passed based on space by space method. Reviewer should verify if the project uses space by space method. - - If FAIL- then CAUTION and say that it fails space by space method and lighting_building_area_type is not known to determine allowance based on BAT. - -- If lighting_building_area_type provided but lighting_space_type not included: - - If PASS - Output should say that project passed based on building area method. Reviewer should verify if the project uses building area method. - - If FAIL- then CAUTION and say that it fails building area method and lighting_space_type is not known to determine allowance based on space by sspace method. +- Case 1: For each building segment, if both lighting building area type and lighting space type in all applicable spaces are specified, and the total lighting power in P_RMD is less than or equal to the higher of the building area method and space-by-space method allowances: + `if ( allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage <= max(allowable_LPD_BAM * total_building_segment_area_p, allowable_lighting_wattage_SBS) ): PASS` + +- Case 2: Else if both lighting building area type and lighting space type in all applicable spaces are specified, and the total lighting power in P_RMD is more than the higher of the building area method and space-by-space method allowances: + `else if ( allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage > max(allowable_LPD_BAM * total_building_segment_area_p, allowable_lighting_wattage_SBS) ):` + - If `has_crawl_interstitial_plenum_with_lighting`: + `UNDETERMINED and raise_message "the model included at least one plenum, crawlspace, or interstitial space with lighting power modeled. unable to determine whether these spaces should be included in the check."` + - Else: + `FAIL` + +- Case 3: Else if lighting building area type is not specified, and lighting space type in all applicable spaces are specified, and the total lighting power in P_RMD is less than or equal to the space-by-space method allowance: + `else if ( NOT allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage <= allowable_lighting_wattage_SBS ): PASS` + +- Case 4: Else if lighting building area type is not specified, and lighting space type in all applicable spaces are specified, and the total lighting power in P_RMD is more than the space-by-space method allowance: + `else if ( NOT allowable_LPD_BAM ) and ( NOT check_BAM_flag ) and ( building_segment_design_lighting_wattage > allowable_lighting_wattage_SBS ):` + - If `has_crawl_interstitial_plenum_with_lighting`: + `UNDETERMINED and raise_message "the model included at least one plenum, crawlspace, or interstitial space with lighting power modeled. unable to determine whether these spaces should be included in the check."` + - Else: + `UNDETERMINED and raise_message 'project fails based on space-by-space method. lighting_building_area_type is not known to determine building area method allowance.'` + +- Case 5: Else if lighting building area type is specified, and lighting space type is not specified in all applicable spaces, and the total lighting power in P_RMD is less than or equal to building area method allowance: + `else if ( allowable_LPD_BAM ) and ( check_BAM_flag ) and ( building_segment_design_lighting_wattage <= allowable_LPD_BAM * total_building_segment_area_p ): PASS` + +- Case 6: Else if lighting building area type is specified, and lighting space type is not specified in all applicable spaces, and the total lighting power in P_RMD is more than building area method allowance: + `else if ( allowable_LPD_BAM ) and ( check_BAM_flag ) and ( building_segment_design_lighting_wattage > allowable_LPD_BAM * total_building_segment_area_p ):` + - If `has_crawl_interstitial_plenum_with_lighting`: + `UNDETERMINED and raise_message "the model included at least one plenum, crawlspace, or interstitial space with lighting power modeled. unable to determine whether these spaces should be included in the check."` + - Else: + `UNDETERMINED and raise_message 'project fails based on building area method. lighting_space_type is not known in all spaces to determine space-by-space method allowance.'` + +- Case 7: Else, lighting building area type is not specified, and lighting space type is not specified in all applicable spaces: + `Else:` + - If `has_crawl_interstitial_plenum_with_lighting`: + `UNDETERMINED and raise_message "the model included at least one plenum, crawlspace, or interstitial space with lighting power modeled. unable to determine whether these spaces should be included in the check."` + - Else: + `UNDETERMINED and raise_message 'lighting_building_area_type is not known and lighting_space_type is not known in all spaces to determine allowance.'` + +**Notes:** +- Updated the Rule ID from 6-2 to 6-1 on 6/8/2022 **[Back](../_toc.md)** diff --git a/rct229/rulesets/ashrae9012019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json b/rct229/rulesets/ashrae9012019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json index ac03f7bf21..ad4a0e37c1 100644 --- a/rct229/rulesets/ashrae9012019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json +++ b/rct229/rulesets/ashrae9012019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json @@ -1832,6 +1832,19 @@ "occup_sensor_auto_on_svgs": 0.1, "occup_sensor_savings": 0.125, "notes": null + }, + { + "template": "90.1-PRM-2019", + "lpd_space_type": "none", + "primary_space_type": "none", + "secondary_space_type": "none", + "w/ft^2": 0, + "w/ft": null, + "isresidential": 0, + "manon_or_partauto": 0, + "occup_sensor_auto_on_svgs": 0, + "occup_sensor_savings": 0, + "notes": null } ] } diff --git a/rct229/rulesets/ashrae9012019/data_fns/table_9_6_1_fns_test.py b/rct229/rulesets/ashrae9012019/data_fns/table_9_6_1_fns_test.py index 915ae7eb7e..6d7870b155 100644 --- a/rct229/rulesets/ashrae9012019/data_fns/table_9_6_1_fns_test.py +++ b/rct229/rulesets/ashrae9012019/data_fns/table_9_6_1_fns_test.py @@ -133,5 +133,6 @@ def test__building_type_enumeration_to_lpd_map(): "TRANSPORTATION_FACILITY_TICKET_COUNTER", "WAREHOUSE_STORAGE_AREA_MEDIUM_TO_BULKY_PALLETIZED_ITEMS", "WAREHOUSE_STORAGE_AREA_SMALLER_HAND_CARRIED_ITEMS", + "NONE", ], ) diff --git a/rct229/rulesets/ashrae9012019/data_fns/table_G3_7_fns.py b/rct229/rulesets/ashrae9012019/data_fns/table_G3_7_fns.py index 09064ada10..e724ddc209 100644 --- a/rct229/rulesets/ashrae9012019/data_fns/table_G3_7_fns.py +++ b/rct229/rulesets/ashrae9012019/data_fns/table_G3_7_fns.py @@ -112,6 +112,7 @@ "TRANSPORTATION_FACILITY_TICKET_COUNTER": "transportation ticket counter", "WAREHOUSE_STORAGE_AREA_MEDIUM_TO_BULKY_PALLETIZED_ITEMS": "warehouse - bulk storage", "WAREHOUSE_STORAGE_AREA_SMALLER_HAND_CARRIED_ITEMS": "warehouse - fine storage", + "NONE": "none", } FULL_AUTO_ON = SchemaEnums.schema_enums["LightingOccupancyControlOptions"].FULL_AUTO_ON diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule1.py b/rct229/rulesets/ashrae9012019/section6/section6rule1.py index de848a8ac6..7a5219b627 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule1.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule1.py @@ -1,18 +1,27 @@ from rct229.rule_engine.rule_base import RuleDefinitionBase from rct229.rule_engine.rule_list_indexed_base import RuleDefinitionListIndexedBase from rct229.rule_engine.ruleset_model_factory import produce_ruleset_model_description -from rct229.rulesets.ashrae9012019 import COMMON_RMD, RMD +from rct229.rulesets.ashrae9012019 import PROPOSED from rct229.rulesets.ashrae9012019.data_fns.table_G3_7_fns import table_G3_7_lookup from rct229.rulesets.ashrae9012019.data_fns.table_G3_8_fns import table_G3_8_lookup from rct229.utils.jsonpath_utils import find_all from rct229.utils.pint_utils import ZERO, CalcQ from rct229.utils.std_comparisons import std_equal +from rct229.schema.schema_enums import SchemaEnums -CASE3_WARNING = "Project passes based on space-by-space method. Verify if project sues space-by-space method." -CASE4_WARNING = "Project fails based on space-by-space method. LIGHTING_BUILDING_AREA_TYPE is not known to determine building area method allowance." -CASE5_WARNING = "Project passes based on building area method. Verify if project uses building area method." -CASE6_WARNING = "Project fails based on building area method. LIGHTING_SPACE_TYPE is not known in all spaces to determine space-by-space method allowance." -CASE7_WARNING = "LIGHTING_BUILDING_AREA_TYPE is not known and LIGHTING_SPACE_TYPE is not known in all spaces to determine allowance." +SpaceFunctionOptions = SchemaEnums.schema_enums["SpaceFunctionOptions"] +NA_SPACE_FUNCTIONS = [ + SpaceFunctionOptions.CRAWL_SPACE, + SpaceFunctionOptions.INTERSTITIAL_SPACE, + SpaceFunctionOptions.PLENUM, +] + +CASE1_WARNING = "The baseline model included at least one plenum, crawlspace, or interstitial space with lighting power. Unable to determine whether these spaces should be included in the check." +CASE3_WARNING = "Project passes based on space-by-space method. Verify if project uses the space-by-space method." +CASE4_WARNING = "Project fails based on space-by-space method. The lighting building area type is not known to determine building area method allowance." +CASE5_WARNING = "Project passes based on building area method. Verify if project uses the building area method." +CASE6_WARNING = "Project fails based on building area method. Lighting space type is not known in all spaces to determine space-by-space method allowance." +CASE7_WARNING = "The baseline lighting building area type is not known and lighting space types are not known for all spaces to determine allowance." class PRM9012019Rule99c05(RuleDefinitionListIndexedBase): @@ -24,10 +33,9 @@ def __init__(self): USER=False, BASELINE_0=False, PROPOSED=True ), each_rule=PRM9012019Rule99c05.BuildingSegmentRule(), - index_rmd=COMMON_RMD.PROPOSED, + index_rmd=PROPOSED, id="6-1", - description="The total building interior lighting power shall not exceed the interior lighting power " - "allowance determined using either Table G3.7 or G3.8", + description="The total building interior lighting power shall not exceed the interior lighting power allowance determined using either Table G3.7 or G3.8", ruleset_section_title="Lighting", standard_section="Section G1.2.1(b) Mandatory Provisions related to interior lighting power", is_primary_rule=True, @@ -56,146 +64,229 @@ def __init__(self): def get_calc_vals(self, context, data=None): building_segment_p = context.PROPOSED - allowable_LPD_BAM = ( + allowable_lpd_bam = ( table_G3_8_lookup(building_segment_p["lighting_building_area_type"])[ "lpd" ] - if building_segment_p.get("lighting_building_area_type") != None + if building_segment_p.get("lighting_building_area_type") is not None else None ) + # Track plenum / crawl / interstitial spaces with lighting + has_crawl_interstitial_plenum_with_lighting = False + building_segment_design_lighting_wattage = ZERO.POWER total_building_segment_area_p = ZERO.AREA - check_BAM_flag = False - allowable_lighting_wattage_SBS = ZERO.POWER + check_bam_flag = False + allowable_lighting_wattage_sbs = ZERO.POWER for zone_p in find_all("$.zones[*]", building_segment_p): zone_avg_height = zone_p["volume"] / sum( find_all("$.spaces[*].floor_area", zone_p) ) for space_p in find_all("$.spaces[*]", zone_p): - building_segment_design_lighting_wattage += ( - sum( - find_all("$.interior_lighting[*].power_per_area", space_p), - ZERO.POWER_PER_AREA, - ) - * space_p["floor_area"] + space_total_lpd = sum( + find_all("$.interior_lighting[*].power_per_area", space_p), + ZERO.POWER_PER_AREA, ) + space_total_wattage = space_total_lpd * space_p["floor_area"] - if allowable_LPD_BAM != None: - total_building_segment_area_p += space_p["floor_area"] + # Always add modeled lighting wattage + building_segment_design_lighting_wattage += space_total_wattage + + # Handle crawlspace / interstitial / plenum + space_function = space_p.get("function") + if space_function in NA_SPACE_FUNCTIONS: + if space_total_lpd > ZERO.POWER_PER_AREA: + has_crawl_interstitial_plenum_with_lighting = True + # Conservative exclusion from allowances + continue lighting_space_type = space_p.get("lighting_space_type") + + # Handle unoccupiable spaces (e.g. elevator / mechanical shafts) + if lighting_space_type == "NONE": + # Excluded from BAM and SBS calculations + continue + + # BAM area accumulation (applicable spaces only) + if allowable_lpd_bam is not None: + total_building_segment_area_p += space_p["floor_area"] + + # SBS handling if lighting_space_type is None: - check_BAM_flag = True + check_bam_flag = True else: - allowable_LPD_space = table_G3_7_lookup( + allowable_lpd_space = table_G3_7_lookup( lighting_space_type, space_height=zone_avg_height, space_area=space_p["floor_area"], )["lpd"] - allowable_lighting_wattage_SBS += ( - allowable_LPD_space * space_p["floor_area"] + allowable_lighting_wattage_sbs += ( + allowable_lpd_space * space_p["floor_area"] ) return { - "allowable_LPD_BAM": CalcQ("power_density", allowable_LPD_BAM), + "allowable_lpd_bam": CalcQ("power_density", allowable_lpd_bam), "building_segment_design_lighting_wattage": CalcQ( "electric_power", building_segment_design_lighting_wattage ), - "check_BAM_flag": check_BAM_flag, + "check_bam_flag": check_bam_flag, "total_building_segment_area_p": CalcQ( "area", total_building_segment_area_p ), - "allowable_lighting_wattage_SBS": CalcQ( - "electric_power", allowable_lighting_wattage_SBS + "allowable_lighting_wattage_sbs": CalcQ( + "electric_power", allowable_lighting_wattage_sbs ), + "has_crawl_interstitial_plenum_with_lighting": has_crawl_interstitial_plenum_with_lighting, } + def manual_check_required(self, context, calc_vals=None, data=None): + allowable_lpd_bam = calc_vals["allowable_lpd_bam"] + check_bam_flag = calc_vals["check_bam_flag"] + building_segment_design_lighting_wattage = calc_vals[ + "building_segment_design_lighting_wattage" + ] + total_building_segment_area_p = calc_vals["total_building_segment_area_p"] + allowable_lighting_wattage_sbs = calc_vals["allowable_lighting_wattage_sbs"] + has_na_lighting = calc_vals["has_crawl_interstitial_plenum_with_lighting"] + + # Any crawl / plenum / interstitial space with lighting + if has_na_lighting: + return True + + allowable_lighting_wattage_bam = ( + allowable_lpd_bam * total_building_segment_area_p + if allowable_lpd_bam + else ZERO.POWER + ) + + # Case 4: Fail Space-by-Space method and unable to check Building Area method + if ( + not allowable_lpd_bam + and not check_bam_flag + and building_segment_design_lighting_wattage + > allowable_lighting_wattage_sbs + ): + return True + + # Case 6: Fail Building Area method and unable to check Space-by-Space method + if ( + allowable_lpd_bam + and check_bam_flag + and building_segment_design_lighting_wattage + > allowable_lighting_wattage_bam + ): + return True + + # Case 7: Unable to reliably check either method + if not allowable_lpd_bam and check_bam_flag: + return True + + return False + + def get_manual_check_required_msg(self, context, calc_vals=None, data=None): + allowable_lpd_bam = calc_vals["allowable_lpd_bam"] + check_bam_flag = calc_vals["check_bam_flag"] + has_na_lighting = calc_vals["has_crawl_interstitial_plenum_with_lighting"] + + if has_na_lighting: + return CASE1_WARNING + elif not allowable_lpd_bam and not check_bam_flag: + return CASE4_WARNING + elif allowable_lpd_bam and check_bam_flag: + return CASE6_WARNING + elif not allowable_lpd_bam and check_bam_flag: + return CASE7_WARNING + else: + return None + def rule_check(self, context, calc_vals=None, data=None): - allowable_LPD_BAM = calc_vals["allowable_LPD_BAM"] - check_BAM_flag = calc_vals["check_BAM_flag"] + allowable_lpd_bam = calc_vals["allowable_lpd_bam"] + check_bam_flag = calc_vals["check_bam_flag"] building_segment_design_lighting_wattage = calc_vals[ "building_segment_design_lighting_wattage" ] total_building_segment_area_p = calc_vals["total_building_segment_area_p"] - allowable_lighting_wattage_SBS = calc_vals["allowable_lighting_wattage_SBS"] + allowable_lighting_wattage_sbs = calc_vals["allowable_lighting_wattage_sbs"] - allowable_LPD_wattage_BAM = ( - allowable_LPD_BAM * total_building_segment_area_p - if allowable_LPD_BAM + allowable_lpd_wattage_bam = ( + allowable_lpd_bam * total_building_segment_area_p + if allowable_lpd_bam else ZERO.POWER ) return ( - (allowable_LPD_BAM or not check_BAM_flag) + (allowable_lpd_bam or not check_bam_flag) and ( - building_segment_design_lighting_wattage < allowable_LPD_wattage_BAM + building_segment_design_lighting_wattage < allowable_lpd_wattage_bam ) or self.precision_comparison[ "building_segment_design_lighting_wattage_area" - ](building_segment_design_lighting_wattage, allowable_LPD_wattage_BAM) + ](building_segment_design_lighting_wattage, allowable_lpd_wattage_bam) or ( building_segment_design_lighting_wattage - < allowable_lighting_wattage_SBS + < allowable_lighting_wattage_sbs or self.precision_comparison[ "building_segment_design_lighting_wattage_space" ]( building_segment_design_lighting_wattage, - allowable_lighting_wattage_SBS, + allowable_lighting_wattage_sbs, ) ) ) def is_tolerance_fail(self, context, calc_vals=None, data=None): - allowable_LPD_BAM = calc_vals["allowable_LPD_BAM"] - check_BAM_flag = calc_vals["check_BAM_flag"] + allowable_lpd_bam = calc_vals["allowable_lpd_bam"] + check_bam_flag = calc_vals["check_bam_flag"] building_segment_design_lighting_wattage = calc_vals[ "building_segment_design_lighting_wattage" ] total_building_segment_area_p = calc_vals["total_building_segment_area_p"] - allowable_lighting_wattage_SBS = calc_vals["allowable_lighting_wattage_SBS"] + allowable_lighting_wattage_sbs = calc_vals["allowable_lighting_wattage_sbs"] - allowable_LPD_wattage_BAM = ( - allowable_LPD_BAM * total_building_segment_area_p - if allowable_LPD_BAM + allowable_lpd_wattage_bam = ( + allowable_lpd_bam * total_building_segment_area_p + if allowable_lpd_bam else ZERO.POWER ) return ( - (allowable_LPD_BAM or not check_BAM_flag) + (allowable_lpd_bam or not check_bam_flag) and ( - building_segment_design_lighting_wattage < allowable_LPD_wattage_BAM + building_segment_design_lighting_wattage < allowable_lpd_wattage_bam ) or std_equal( - allowable_LPD_wattage_BAM, building_segment_design_lighting_wattage + allowable_lpd_wattage_bam, building_segment_design_lighting_wattage ) or ( building_segment_design_lighting_wattage - < allowable_lighting_wattage_SBS + < allowable_lighting_wattage_sbs or std_equal( - allowable_lighting_wattage_SBS, + allowable_lighting_wattage_sbs, building_segment_design_lighting_wattage, ) ) ) def get_pass_msg(self, context, calc_vals=None, data=None): - allowable_LPD_BAM = calc_vals["allowable_LPD_BAM"] - check_BAM_flag = calc_vals["check_BAM_flag"] + allowable_lpd_bam = calc_vals["allowable_lpd_bam"] + check_bam_flag = calc_vals["check_bam_flag"] - if not allowable_LPD_BAM and not check_BAM_flag: + if not allowable_lpd_bam and not check_bam_flag: return CASE3_WARNING else: return CASE5_WARNING def get_fail_msg(self, context, calc_vals=None, data=None): - allowable_LPD_BAM = calc_vals["allowable_LPD_BAM"] - check_BAM_flag = calc_vals["check_BAM_flag"] + allowable_lpd_bam = calc_vals["allowable_lpd_bam"] + check_bam_flag = calc_vals["check_bam_flag"] - if not allowable_LPD_BAM and not check_BAM_flag: + if not allowable_lpd_bam and not check_bam_flag: return CASE4_WARNING - elif allowable_LPD_BAM and check_BAM_flag: + elif allowable_lpd_bam and check_bam_flag: return CASE6_WARNING - elif not allowable_LPD_BAM and check_BAM_flag: + elif not allowable_lpd_bam and check_bam_flag: return CASE7_WARNING + else: + return None diff --git a/rct229/ruletest_engine/ruletest_jsons/ashrae9012019/LTG/rule_6_1.json b/rct229/ruletest_engine/ruletest_jsons/ashrae9012019/LTG/rule_6_1.json index b084d6c453..f6d13bfe50 100644 --- a/rct229/ruletest_engine/ruletest_jsons/ashrae9012019/LTG/rule_6_1.json +++ b/rct229/ruletest_engine/ruletest_jsons/ashrae9012019/LTG/rule_6_1.json @@ -3,9 +3,8 @@ "Section": 6, "Rule": 1, "Test": "a", - "test_description": "Project has one building segment with two spaces. Both lighting building area type and lighting space type have been specified. The proposed building segment design lighting wattage is less than or equal to the maximum value of the allowable lighting power density multiplies total building segment area and space-by-space allowable lighting wattage.", - "expected_rule_outcome": "pass", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -16,6 +15,8 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Both lighting building area type and lighting space type have been specified. The proposed building segment design lighting wattage is less than or equal to the maximum value of the allowable lighting power density multiplies total building segment area and space-by-space allowable lighting wattage.", + "expected_rule_outcome": "pass", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -73,9 +74,8 @@ "Section": 6, "Rule": 1, "Test": "b", - "test_description": "Project has one building segment with two spaces. Both lighting_building_area_type and lighting space type have been specified. The proposed building segment design lighting wattage is greater than the maximum value of the allowable lighting power density multiplies total building segment area and space-by-space allowable lighting wattage.", - "expected_rule_outcome": "fail", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -86,6 +86,8 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Both lighting_building_area_type and lighting space type have been specified. The proposed building segment design lighting wattage is greater than the maximum value of the allowable lighting power density multiplies total building segment area and space-by-space allowable lighting wattage.", + "expected_rule_outcome": "fail", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -143,10 +145,8 @@ "Section": 6, "Rule": 1, "Test": "c", - "test_description": "Project has one building segment with two spaces. Lighting building area type hasn't been specified, and lighting space type has been specified. The proposed building segment design lighting wattage is less than or equal to space-by-space allowable lighting wattage.", - "expected_rule_outcome": "pass", - "expected_raised_message_includes": "Project passes based on space-by-space method. Verify if project sues space-by-space method.", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -157,6 +157,9 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Lighting building area type hasn't been specified, and lighting space type has been specified. The proposed building segment design lighting wattage is less than or equal to space-by-space allowable lighting wattage.", + "expected_rule_outcome": "pass", + "expected_raised_message_includes": "Project passes based on space-by-space method. Verify if project uses the space-by-space method.", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -213,10 +216,8 @@ "Section": 6, "Rule": 1, "Test": "d", - "test_description": "Project has one building segment with two spaces. Lighting building area type hasn't been specified, and lighting space type has been specified. The proposed building segment design lighting wattage is greater than space-by-space allowable lighting wattage.", - "expected_rule_outcome": "fail", - "expected_raised_message_includes": "Project fails based on space-by-space method. LIGHTING_BUILDING_AREA_TYPE is not known to determine building area method allowance.", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -227,6 +228,9 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Lighting building area type hasn't been specified, and lighting space type has been specified. The proposed building segment design lighting wattage is greater than space-by-space allowable lighting wattage.", + "expected_rule_outcome": "undetermined", + "expected_raised_message_includes": "Project fails based on space-by-space method. The lighting building area type is not known to determine building area method allowance.", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -283,10 +287,8 @@ "Section": 6, "Rule": 1, "Test": "e", - "test_description": "Project has one building segment with two spaces. Lighting building area type has been specified and lighting space type hasn't been specified. The proposed building segment design lighting wattage is less than or equal to the allowable lighting power density multiplies total building segment area.", - "expected_rule_outcome": "pass", - "expected_raised_message_includes": "Project passes based on building area method. Verify if project uses building area method.", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -297,6 +299,9 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Lighting building area type has been specified and lighting space type hasn't been specified. The proposed building segment design lighting wattage is less than or equal to the allowable lighting power density multiplies total building segment area.", + "expected_rule_outcome": "pass", + "expected_raised_message_includes": "Project passes based on building area method. Verify if project uses the building area method.", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -352,10 +357,8 @@ "Section": 6, "Rule": 1, "Test": "f", - "test_description": "Project has one building segment with two spaces. Lighting building area type has been specified and lighting space type hasn't been specified. The proposed building segment design lighting wattage is greater than the allowable lighting power density multiplies the total building segment area.", - "expected_rule_outcome": "fail", - "expected_raised_message_includes": "Project fails based on building area method. LIGHTING_SPACE_TYPE is not known in all spaces to determine space-by-space method allowance.", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -366,6 +369,9 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Lighting building area type has been specified and lighting space type hasn't been specified. The proposed building segment design lighting wattage is greater than the allowable lighting power density multiplies the total building segment area.", + "expected_rule_outcome": "undetermined", + "expected_raised_message_includes": "Project fails based on building area method. Lighting space type is not known in all spaces to determine space-by-space method allowance.", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -421,10 +427,8 @@ "Section": 6, "Rule": 1, "Test": "g", - "test_description": "Project has one building segment with two spaces. Both Lighting building area type and lighting space type haven't been specified.", - "expected_rule_outcome": "fail", - "expected_raised_message_includes": "LIGHTING_BUILDING_AREA_TYPE is not known and LIGHTING_SPACE_TYPE is not known in all spaces to determine allowance.", "standard": { + "ruleset": "ashrae9012019", "rule_id": "6-1", "ruleset_reference": "Section G1.2.1(b)", "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", @@ -435,6 +439,9 @@ "mandatory_rule": "Full", "schema_version": "0.1.7" }, + "test_description": "Project has one building segment with two spaces. Both Lighting building area type and lighting space type haven't been specified.", + "expected_rule_outcome": "undetermined", + "expected_raised_message_includes": "The baseline lighting building area type is not known and lighting space types are not known for all spaces to determine allowance.", "rmd_transformations": { "proposed": { "id": "ASHRAE229 1", @@ -484,5 +491,65 @@ ] } } + }, + "rule-6-1-h": { + "Section": 6, + "Rule": 1, + "Test": "h", + "standard": { + "ruleset": "ashrae9012019", + "rule_id": "6-1", + "ruleset_reference": "Section G1.2.1(b)", + "rule_description": "The total proposed building interior lighting power shall not exceed the interior lighting power allowance determined using either Standard 90.1-2019 Table G3.7 or Standard 90.1-2019 Table G3.8.", + "applicable_rmr": "Proposed Design", + "rule_assertion": "<=", + "comparison_value": "Expected Value", + "rule_dependency": "-", + "mandatory_rule": "Full", + "schema_version": "0.1.7" + }, + "test_description": "Project has one building segment with with a plenum space. The plenum has lighting power modeled.", + "expected_rule_outcome": "undetermined", + "expected_raised_message_includes": "The baseline model included at least one plenum, crawlspace, or interstitial space with lighting power. Unable to determine whether these spaces should be included in the check.", + "rmd_transformations": { + "proposed": { + "id": "ASHRAE229 1", + "ruleset_model_descriptions": [ + { + "id": "RMD 1", + "buildings": [ + { + "id": "Building 1", + "building_segments": [ + { + "id": "Building Segment 1", + "zones": [ + { + "id": "Thermal Zone 1", + "volume": 23.21981420543999, + "spaces": [ + { + "id": "Space 1", + "floor_area": 9.290303999999999, + "function": "PLENUM", + "interior_lighting": [ + { + "id": "Plenum Lighting", + "power_per_area": 4.413203270850986 + } + ] + } + ] + } + ] + } + ] + } + ], + "type": "PROPOSED" + } + ] + } + } } } \ No newline at end of file diff --git a/rct229/schema/Enumerations2019ASHRAE901.schema.json b/rct229/schema/Enumerations2019ASHRAE901.schema.json index 119e5fe2e3..d0e69d8e76 100644 --- a/rct229/schema/Enumerations2019ASHRAE901.schema.json +++ b/rct229/schema/Enumerations2019ASHRAE901.schema.json @@ -257,7 +257,8 @@ "TRANSPORTATION_FACILITY_AIRPORT_CONCOURSE", "TRANSPORTATION_FACILITY_TICKET_COUNTER", "WAREHOUSE_STORAGE_AREA_MEDIUM_TO_BULKY_PALLETIZED_ITEMS", - "WAREHOUSE_STORAGE_AREA_SMALLER_HAND_CARRIED_ITEMS" + "WAREHOUSE_STORAGE_AREA_SMALLER_HAND_CARRIED_ITEMS", + "NONE" ], "descriptions": [ "Atrium - Low/Medium", @@ -362,7 +363,8 @@ "Transportation Facility - Airport concourse", "Transportation Facility - Ticket counter", "Warehouse \u00e2\u20ac\u201d Storage Area - Medium to bulky, palletized items", - "Warehouse \u00e2\u20ac\u201d Storage Area - Smaller, hand-carried items" + "Warehouse \u00e2\u20ac\u201d Storage Area - Smaller, hand-carried items", + "None" ], "notes": [ null, @@ -467,7 +469,8 @@ null, null, null, - null + null, + "Indicates that the space will have no occupancy, such as an elevator shaft." ] }, "LightingPurposeOptions2019ASHRAE901": {