From 711030e4160cbd6dca0eea7b1ddb2ef1dbe7116d Mon Sep 17 00:00:00 2001 From: Jackson Jarboe <122476654+JacksonJ-KC@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:23:20 -0400 Subject: [PATCH 1/4] write rule 6-12 RDS --- docs/ashrae9012022/section6/Rule6-12.md | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/ashrae9012022/section6/Rule6-12.md diff --git a/docs/ashrae9012022/section6/Rule6-12.md b/docs/ashrae9012022/section6/Rule6-12.md new file mode 100644 index 0000000000..517bc363bc --- /dev/null +++ b/docs/ashrae9012022/section6/Rule6-12.md @@ -0,0 +1,43 @@ + +# Lighting - Rule 6-12 + +**Rule ID:** 6-12 +**Rule Description:** In buildings >5000 ft2 lighting shall be modeled having occupancy sensors in employee lunch and break rooms, conference/meeting rooms, and classrooms (not including shop classrooms, laboratory classrooms, and preschool through 12th grade classrooms). These controls shall be reflected in the baseline building design lighting schedules. +**Rule Assertion:** Baseline RMD = expected value +**Appendix G Section:** G3.1 6 Baseline + +**Mandatory Rule:** True +**Evaluation Context:** Each Space +**Function Call:** + +- get_component_by_id() + +## Applicability Check: +1. Building area is greater than 5000 ft2 +2. Space type is one of the following: employee lunch and break rooms, conference/meeting rooms, and classrooms (not including shop classrooms, laboratory classrooms, and preschool through 12th grade classrooms) + +## Rule Logic: +- For each building in the baseline model: `for building_b in B_RMD...buildings:` + + **Applicability Check 1:** + - Declare a variable for the building area: `building_area_b = 0` + - Iterate the spaces in the building: `for space_b in building_b...spaces:` + - Add the area of each space to the building area sum: `building_area_b += space_b...floor_area` + - Check if the building area is greater than 5000 ft2: `if building_area_b > 5000: IS_APPLICABLE` + + - For each space in the building: `for space_b in building_b...spaces:` + + - **Applicability Check 2:** + - Check if the space type is one of the specified types: `if space_b["lighting_space_type"] in [LOUNGE_BREAKROOM_ALL_OTHERS, CONFERENCE_MEETING_MULTIPURPOSE_ROOM, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_PENITENTIARY, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_ALL_OTHER] or (space_b["function"] == LABORATORY and space_b["lighting_space_type"] == CLASSROOM_LECTURE_HALL_TRAINING_ROOM_SCHOOL): IS_APPLICABLE` + - Create a list of the occupancy sensor controls in the space: `occupancy_sensor_controls_b = [interior_lighting_b.get("occupancy_control_type") for interior_lighting_b in space_b["interior_lighting"]` + - Create a list of boolean values indicating if occupancy sensors were modeled via schedule adjustments: `occupancy_sensor_schedules_b = [interior_lighting_b.get("are_schedules_used_for_modeling_occupancy_control") for interior_lighting_b in space_b["interior_lighting"]` + + - **Rule Assertion:** + - Case 1: All interior lighting in the space is controlled by occupancy sensors and modeled via adjustments to the schedules: PASS `if not any(val in ["NONE", "MANUAL_ON", None] for val in occupancy_controls_b): PASS` + - Case 2: Any interior lighting in the space is missing definitions for occupancy sensor type and schedule adjustments: UNDETERMINED `elif any(val is None for val in occupancy_controls_b) or any(val is None for val in occupancy_sensor_schedules_b): UNDETERMINED` + - Case 3: Else, at least one interior lighting data group in the space is not controlled by occupancy sensors or modeled via adjustments to the schedules: FAIL `else: FAIL` + +**Notes:** +None + +**[Back](../_toc.md)** From 44a3ce3e3f3be28ceb7743b3eb2144344614e271 Mon Sep 17 00:00:00 2001 From: Jackson Jarboe <122476654+JacksonJ-KC@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:04:19 -0400 Subject: [PATCH 2/4] CML review comments addressed. --- docs/ashrae9012022/section6/Rule6-12.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ashrae9012022/section6/Rule6-12.md b/docs/ashrae9012022/section6/Rule6-12.md index 517bc363bc..9286bb7b58 100644 --- a/docs/ashrae9012022/section6/Rule6-12.md +++ b/docs/ashrae9012022/section6/Rule6-12.md @@ -4,7 +4,7 @@ **Rule ID:** 6-12 **Rule Description:** In buildings >5000 ft2 lighting shall be modeled having occupancy sensors in employee lunch and break rooms, conference/meeting rooms, and classrooms (not including shop classrooms, laboratory classrooms, and preschool through 12th grade classrooms). These controls shall be reflected in the baseline building design lighting schedules. **Rule Assertion:** Baseline RMD = expected value -**Appendix G Section:** G3.1 6 Baseline +**Appendix G Section:** Table G3.1 #6 Baseline column **Mandatory Rule:** True **Evaluation Context:** Each Space @@ -28,7 +28,7 @@ - For each space in the building: `for space_b in building_b...spaces:` - **Applicability Check 2:** - - Check if the space type is one of the specified types: `if space_b["lighting_space_type"] in [LOUNGE_BREAKROOM_ALL_OTHERS, CONFERENCE_MEETING_MULTIPURPOSE_ROOM, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_PENITENTIARY, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_ALL_OTHER] or (space_b["function"] == LABORATORY and space_b["lighting_space_type"] == CLASSROOM_LECTURE_HALL_TRAINING_ROOM_SCHOOL): IS_APPLICABLE` + - Check if the space type is one of the specified types: `if space_b["lighting_space_type"] in [LOUNGE_BREAKROOM_ALL_OTHERS, CONFERENCE_MEETING_MULTIPURPOSE_ROOM, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_PENITENTIARY, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_ALL_OTHER, LABORATORY_EXCEPT_IN_OR_AS_A_CLASSROOM] or (space_b["function"] == LABORATORY and space_b["lighting_space_type"] == CLASSROOM_LECTURE_HALL_TRAINING_ROOM_SCHOOL): IS_APPLICABLE` - Create a list of the occupancy sensor controls in the space: `occupancy_sensor_controls_b = [interior_lighting_b.get("occupancy_control_type") for interior_lighting_b in space_b["interior_lighting"]` - Create a list of boolean values indicating if occupancy sensors were modeled via schedule adjustments: `occupancy_sensor_schedules_b = [interior_lighting_b.get("are_schedules_used_for_modeling_occupancy_control") for interior_lighting_b in space_b["interior_lighting"]` From d602b7ee0f1b429aa8603467c0c8c808f27fc790 Mon Sep 17 00:00:00 2001 From: Jackson Jarboe <122476654+JacksonJ-KC@users.noreply.github.com> Date: Tue, 9 Sep 2025 13:50:28 -0400 Subject: [PATCH 3/4] verify modeled via schedule adjustments --- docs/ashrae9012022/section6/Rule6-12.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ashrae9012022/section6/Rule6-12.md b/docs/ashrae9012022/section6/Rule6-12.md index 9286bb7b58..096568ca8e 100644 --- a/docs/ashrae9012022/section6/Rule6-12.md +++ b/docs/ashrae9012022/section6/Rule6-12.md @@ -33,7 +33,7 @@ - Create a list of boolean values indicating if occupancy sensors were modeled via schedule adjustments: `occupancy_sensor_schedules_b = [interior_lighting_b.get("are_schedules_used_for_modeling_occupancy_control") for interior_lighting_b in space_b["interior_lighting"]` - **Rule Assertion:** - - Case 1: All interior lighting in the space is controlled by occupancy sensors and modeled via adjustments to the schedules: PASS `if not any(val in ["NONE", "MANUAL_ON", None] for val in occupancy_controls_b): PASS` + - Case 1: All interior lighting in the space is controlled by occupancy sensors and modeled via adjustments to the schedules: PASS `if not any(val in ["NONE", "MANUAL_ON", None] for val in occupancy_controls_b) and all(occupancy_sensor_schedules_b): PASS` - Case 2: Any interior lighting in the space is missing definitions for occupancy sensor type and schedule adjustments: UNDETERMINED `elif any(val is None for val in occupancy_controls_b) or any(val is None for val in occupancy_sensor_schedules_b): UNDETERMINED` - Case 3: Else, at least one interior lighting data group in the space is not controlled by occupancy sensors or modeled via adjustments to the schedules: FAIL `else: FAIL` From 50104260278e6592fcfc1696a5e59ef48093eabd Mon Sep 17 00:00:00 2001 From: Jackson Jarboe <122476654+JacksonJ-KC@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:36:17 -0500 Subject: [PATCH 4/4] plenum, crawlspace, interstitial updates --- docs/ashrae9012022/section6/Rule6-12.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/ashrae9012022/section6/Rule6-12.md b/docs/ashrae9012022/section6/Rule6-12.md index 096568ca8e..b315dfa15e 100644 --- a/docs/ashrae9012022/section6/Rule6-12.md +++ b/docs/ashrae9012022/section6/Rule6-12.md @@ -14,7 +14,7 @@ ## Applicability Check: 1. Building area is greater than 5000 ft2 -2. Space type is one of the following: employee lunch and break rooms, conference/meeting rooms, and classrooms (not including shop classrooms, laboratory classrooms, and preschool through 12th grade classrooms) +2. Space has lighting and lighting space type is one of the following: employee lunch and break rooms, conference/meeting rooms, and classrooms (not including shop classrooms, laboratory classrooms, and preschool through 12th grade classrooms) ## Rule Logic: - For each building in the baseline model: `for building_b in B_RMD...buildings:` @@ -26,16 +26,18 @@ - Check if the building area is greater than 5000 ft2: `if building_area_b > 5000: IS_APPLICABLE` - For each space in the building: `for space_b in building_b...spaces:` + - Get the total interior lighting power in the space: `interior_lighting_power_b = sum([interior_lighting_b.get("power_per_area") for interior_lighting_b in space_b["interior_lighting"]])` - - **Applicability Check 2:** - - Check if the space type is one of the specified types: `if space_b["lighting_space_type"] in [LOUNGE_BREAKROOM_ALL_OTHERS, CONFERENCE_MEETING_MULTIPURPOSE_ROOM, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_PENITENTIARY, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_ALL_OTHER, LABORATORY_EXCEPT_IN_OR_AS_A_CLASSROOM] or (space_b["function"] == LABORATORY and space_b["lighting_space_type"] == CLASSROOM_LECTURE_HALL_TRAINING_ROOM_SCHOOL): IS_APPLICABLE` + **Applicability Check 2:** + - Check if the space has lighting and the lighting space type is one of the specified types: `if interior_lighting_power_b > 0 and space_b["lighting_space_type"] in [LOUNGE_BREAKROOM_ALL_OTHERS, CONFERENCE_MEETING_MULTIPURPOSE_ROOM, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_PENITENTIARY, CLASSROOM_LECTURE_HALL_TRAINING_ROOM_ALL_OTHER, LABORATORY_EXCEPT_IN_OR_AS_A_CLASSROOM] or (space_b["function"] == LABORATORY and space_b["lighting_space_type"] == CLASSROOM_LECTURE_HALL_TRAINING_ROOM_SCHOOL): IS_APPLICABLE` - Create a list of the occupancy sensor controls in the space: `occupancy_sensor_controls_b = [interior_lighting_b.get("occupancy_control_type") for interior_lighting_b in space_b["interior_lighting"]` - Create a list of boolean values indicating if occupancy sensors were modeled via schedule adjustments: `occupancy_sensor_schedules_b = [interior_lighting_b.get("are_schedules_used_for_modeling_occupancy_control") for interior_lighting_b in space_b["interior_lighting"]` - **Rule Assertion:** - - Case 1: All interior lighting in the space is controlled by occupancy sensors and modeled via adjustments to the schedules: PASS `if not any(val in ["NONE", "MANUAL_ON", None] for val in occupancy_controls_b) and all(occupancy_sensor_schedules_b): PASS` - - Case 2: Any interior lighting in the space is missing definitions for occupancy sensor type and schedule adjustments: UNDETERMINED `elif any(val is None for val in occupancy_controls_b) or any(val is None for val in occupancy_sensor_schedules_b): UNDETERMINED` - - Case 3: Else, at least one interior lighting data group in the space is not controlled by occupancy sensors or modeled via adjustments to the schedules: FAIL `else: FAIL` + - Case 1: The space function is plenum, crawlspace, or interstitial space and has lighting modeled: UNDETERMINED `if space_b["function"] in [PLENUM, CRAWLSPACE, INTERSTITIAL_SPACE]: UNDETERMINED and raise_warning("Unable to determine whether occupancy sensor lighting controls are required in plenum, crawlspace, or interstitial spaces.")` + - Case 2: All interior lighting in the space is controlled by occupancy sensors and modeled via adjustments to the schedules: PASS `if not any(val in ["NONE", "MANUAL_ON", None] for val in occupancy_controls_b) and all(occupancy_sensor_schedules_b): PASS` + - Case 3: Any interior lighting in the space is missing definitions for occupancy sensor type and schedule adjustments: UNDETERMINED `elif any(val is None for val in occupancy_controls_b) or any(val is None for val in occupancy_sensor_schedules_b): UNDETERMINED` + - Case 4: Else, at least one interior lighting data group in the space is not controlled by occupancy sensors or modeled via adjustments to the schedules: FAIL `else: FAIL` **Notes:** None