@@ -649,6 +649,10 @@ def self.get_unavailable_periods(runner, schedule_name, unavailable_periods)
649
649
end
650
650
651
651
# Add unavailable period rules to the OpenStudio Schedule object.
652
+ # An unavailable period rule is an OpenStudio ScheduleRule object.
653
+ # Each OpenStudio ScheduleRule stores start month/day, end month/day, and day (24 hour) schedule.
654
+ # The unavailable period (i.e., number of consecutive days, whether starting/ending in the middle of the day, etc.) determines
655
+ # the number of ScheduleRule objects that are needed, as well as the start, end, and day schedule fields that are set.
652
656
#
653
657
# @param model [OpenStudio::Model::Model] OpenStudio Model object
654
658
# @param schedule [OpenStudio::Model::ScheduleRuleset] the OpenStudio Schedule object for which to set unavailable period rules
@@ -691,82 +695,44 @@ def self.set_unavailable_periods(model, schedule, sch_name, unavailable_periods)
691
695
begin_day_schedule = schedule . getDaySchedules ( date_s , date_s ) [ 0 ]
692
696
end_day_schedule = schedule . getDaySchedules ( date_e , date_e ) [ 0 ]
693
697
694
- outage_days = day_e - day_s
695
- if outage_days == 0 # outage is less than 1 calendar day (need 1 outage rule)
696
- Model . add_schedule_ruleset_rule (
697
- schedule ,
698
- start_date : date_s ,
699
- end_date : date_e ,
700
- hourly_values : ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) || ( h >= period . end_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value }
701
- )
702
- else # outage is at least 1 calendar day
703
- if period . begin_hour == 0 && period . end_hour == 24 # 1 outage rule
704
- Model . add_schedule_ruleset_rule (
705
- schedule ,
706
- start_date : date_s ,
707
- end_date : date_e ,
708
- hourly_values : [ value ] * 24
709
- )
710
- elsif ( period . begin_hour == 0 && period . end_hour != 24 ) || ( period . begin_hour != 0 && period . end_hour == 24 ) # 2 outage rules
698
+ # [[start_date, end_date, hourly_values], ...]
699
+ schedule_ruleset_rules = [ ]
700
+
701
+ unavail_days = day_e - day_s
702
+ if unavail_days == 0 # unavailable period is less than 1 calendar day (need 1 unavailable period rule)
703
+ schedule_ruleset_rules << [ date_s , date_e , ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) || ( h >= period . end_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ]
704
+ else # unavailable period is at least 1 calendar day
705
+ if period . begin_hour == 0 && period . end_hour == 24 # 1 unavailable period rule
706
+ schedule_ruleset_rules << [ date_s , date_e , [ value ] * 24 ]
707
+ elsif ( period . begin_hour == 0 && period . end_hour != 24 ) || ( period . begin_hour != 0 && period . end_hour == 24 ) # 2 unavailable period rules
711
708
if period . begin_hour == 0 && period . end_hour != 24
712
- # last day
713
- Model . add_schedule_ruleset_rule (
714
- schedule ,
715
- start_date : date_e ,
716
- end_date : date_e ,
717
- hourly_values : ( 0 ..23 ) . map { |h | ( h >= period . end_hour ) ? end_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value }
718
- )
719
-
720
- # all other days
721
- Model . add_schedule_ruleset_rule (
722
- schedule ,
723
- start_date : date_s ,
724
- end_date : OpenStudio ::Date ::fromDayOfYear ( day_e - 1 , year ) ,
725
- hourly_values : [ value ] * 24
726
- )
709
+ schedule_ruleset_rules << [ date_e , date_e , ( 0 ..23 ) . map { |h | ( h >= period . end_hour ) ? end_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ] # last day
710
+ schedule_ruleset_rules << [ date_s , OpenStudio ::Date ::fromDayOfYear ( day_e - 1 , year ) , [ value ] * 24 ] # all other days
727
711
elsif period . begin_hour != 0 && period . end_hour == 24
728
- # first day
729
- Model . add_schedule_ruleset_rule (
730
- schedule ,
731
- start_date : date_s ,
732
- end_date : date_s ,
733
- hourly_values : ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value }
734
- )
735
-
736
- # all other days
737
- Model . add_schedule_ruleset_rule (
738
- schedule ,
739
- start_date : OpenStudio ::Date ::fromDayOfYear ( day_s + 1 , year ) ,
740
- end_date : date_e ,
741
- hourly_values : [ value ] * 24
742
- )
712
+ schedule_ruleset_rules << [ date_s , date_s , ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ] # first day
713
+ schedule_ruleset_rules << [ OpenStudio ::Date ::fromDayOfYear ( day_s + 1 , year ) , date_e , [ value ] * 24 ]
714
+ end
715
+ else # 2 or 3 unavailable period rules
716
+ if unavail_days == 1 # 2 unavailable period rules
717
+ schedule_ruleset_rules << [ date_s , date_s , ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ] # first day
718
+ schedule_ruleset_rules << [ date_e , date_e , ( 0 ..23 ) . map { |h | ( h >= period . end_hour ) ? end_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ] # last day
719
+ else # 3 unavailable period rules
720
+ schedule_ruleset_rules << [ date_s , date_s , ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ] # first day
721
+ schedule_ruleset_rules << [ OpenStudio ::Date ::fromDayOfYear ( day_s + 1 , year ) , OpenStudio ::Date ::fromDayOfYear ( day_e - 1 , year ) , [ value ] * 24 ] # all other days
722
+ schedule_ruleset_rules << [ date_e , date_e , ( 0 ..23 ) . map { |h | ( h >= period . end_hour ) ? end_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value } ] # last day
743
723
end
744
- else # 3 outage rules
745
- # first day
746
- Model . add_schedule_ruleset_rule (
747
- schedule ,
748
- start_date : date_s ,
749
- end_date : date_s ,
750
- hourly_values : ( 0 ..23 ) . map { |h | ( h < period . begin_hour ) ? begin_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value }
751
- )
752
-
753
- # all other days
754
- Model . add_schedule_ruleset_rule (
755
- schedule ,
756
- start_date : OpenStudio ::Date ::fromDayOfYear ( day_s + 1 , year ) ,
757
- end_date : OpenStudio ::Date ::fromDayOfYear ( day_e - 1 , year ) ,
758
- hourly_values : [ value ] * 24
759
- )
760
-
761
- # last day
762
- Model . add_schedule_ruleset_rule (
763
- schedule ,
764
- start_date : date_e ,
765
- end_date : date_e ,
766
- hourly_values : ( 0 ..23 ) . map { |h | ( h >= period . end_hour ) ? end_day_schedule . getValue ( OpenStudio ::Time . new ( 0 , h + 1 , 0 , 0 ) ) : value }
767
- )
768
724
end
769
725
end
726
+
727
+ schedule_ruleset_rules . each do |schedule_ruleset_rule |
728
+ start_date , end_date , hourly_values = schedule_ruleset_rule
729
+ Model . add_schedule_ruleset_rule (
730
+ schedule ,
731
+ start_date : start_date ,
732
+ end_date : end_date ,
733
+ hourly_values : hourly_values
734
+ )
735
+ end
770
736
end
771
737
end
772
738
0 commit comments