diff --git a/honeybee_doe2/cli/translate.py b/honeybee_doe2/cli/translate.py index 02c49e7..5ad9e80 100644 --- a/honeybee_doe2/cli/translate.py +++ b/honeybee_doe2/cli/translate.py @@ -6,8 +6,14 @@ import logging from ladybug.futil import write_to_file_by_name +from honeybee.typing import clean_doe2_string from honeybee.model import Model +from honeybee_energy.schedule.ruleset import ScheduleRuleset +from honeybee_energy.schedule.dictutil import dict_to_schedule +from honeybee_doe2.config import RES_CHARS +from honeybee_doe2.util import header_comment_minor +from honeybee_doe2.schedule import extract_all_schedule_ruleset_from_inp_file from honeybee_doe2.simulation import SimulationPar _logger = logging.getLogger(__name__) @@ -140,3 +146,115 @@ def hbjson_to_inp_file( sys.exit(1) else: sys.exit(0) + + +@translate.command('schedules-to-inp') +@click.argument('schedule-json', type=click.Path( + exists=True, file_okay=True, dir_okay=False, resolve_path=True)) +@click.option('--output-file', '-f', help='Optional INP file to output the INP ' + 'string of the translation. By default this will be printed out to stdout', + type=click.File('w'), default='-', show_default=True) +def schedule_to_inp(schedule_json, output_file): + """Translate a Schedule JSON file to an INP. + + \b + Args: + schedule_json: Full path to a Schedule JSON file. This file should + either be an array of non-abridged Schedules or a dictionary where + the values are non-abridged Schedules. + """ + try: + # re-serialize the Schedule to Python + with open(schedule_json) as json_file: + data = json.load(json_file) + sch_list = data.values() if isinstance(data, dict) else data + sch_objs = [dict_to_schedule(sch) for sch in sch_list] + type_objs = set() + for sch in sch_objs: + type_objs.add(sch.schedule_type_limit) + + # create the INP strings + all_day_scheds, all_week_scheds, all_year_scheds = [], [], [] + used_day_sched_ids, used_day_count = {}, 1 + all_scheds = sch_objs + for sched in all_scheds: + if isinstance(sched, ScheduleRuleset): + year_schedule, week_schedules = sched.to_inp() + # check that day schedules aren't referenced by other model schedules + day_scheds = [] + for day in sched.day_schedules: + if day.identifier not in used_day_sched_ids: + day_scheds.append(day.to_inp(sched.schedule_type_limit)) + used_day_sched_ids[day.identifier] = day + elif day != used_day_sched_ids[day.identifier]: + new_day = day.duplicate() + new_day.identifier = 'Schedule Day {}'.format(used_day_count) + day_scheds.append(new_day.to_inp(sched.schedule_type_limit)) + for i, week_sch in enumerate(week_schedules): + old_day_id = clean_doe2_string(day.identifier, RES_CHARS) + new_day_id = clean_doe2_string(new_day.identifier, RES_CHARS) + week_schedules[i] = week_sch.replace(old_day_id, new_day_id) + used_day_count += 1 + all_day_scheds.extend(day_scheds) + all_week_scheds.extend(week_schedules) + all_year_scheds.append(year_schedule) + else: # ScheduleFixedInterval + year_schedule, week_schedules, year_schedule = sched.to_inp() + all_day_scheds.extend(day_scheds) + all_week_scheds.extend(week_schedules) + all_year_scheds.append(year_schedule) + inp_str_list = ['INPUT ..\n\n'] + inp_str_list.append(header_comment_minor('Day Schedules')) + inp_str_list.extend(all_day_scheds) + inp_str_list.append(header_comment_minor('Week Schedules')) + inp_str_list.extend(all_week_scheds) + inp_str_list.append(header_comment_minor('Annual Schedules')) + inp_str_list.extend(all_year_scheds) + inp_str_list.append('END ..\nCOMPUTE ..\nSTOP ..\n') + inp_str = '\n'.join(inp_str_list) + + # write out the INP file + output_file.write(inp_str) + except Exception as e: + _logger.exception('Schedule translation failed.\n{}'.format(e)) + sys.exit(1) + else: + sys.exit(0) + + +@translate.command('schedules-from-inp') +@click.argument('schedule-inp', type=click.Path( + exists=True, file_okay=True, dir_okay=False, resolve_path=True)) +@click.option( + '--dictionary/--list', ' /-l', help='Flag to note whether a the output JSON ' + 'should be a list of schedule objects or whether it should be a dictionary ' + 'where each key is the identifier of the schedule and each value is the ' + 'schedule object. The dictionary format is the one used by honeybee-standards ' + 'and is recommended when writing INP schedules into the user standards library.', + default=True, show_default=True) +@click.option( + '--output-file', '-f', help='Optional JSON file to output the JSON string of ' + 'the translation. By default this will be printed out to stdout', + type=click.File('w'), default='-', show_default=True) +def schedule_from_inp(schedule_inp, dictionary, output_file): + """Translate a schedule INP file to a honeybee JSON as an array of schedules. + + \b + Args: + schedule_inp: Full path to a Schedule INP file. + """ + try: + # re-serialize the schedules to Python + schedules = extract_all_schedule_ruleset_from_inp_file(schedule_inp) + # create the honeybee dictionaries + if dictionary: + hb_objs = {sch.identifier: sch.to_dict() for sch in schedules} + else: + hb_objs = [sch.to_dict() for sch in schedules] + # write out the JSON file + output_file.write(json.dumps(hb_objs)) + except Exception as e: + _logger.exception('Schedule translation failed.\n{}'.format(e)) + sys.exit(1) + else: + sys.exit(0) diff --git a/honeybee_doe2/schedule.py b/honeybee_doe2/schedule.py index 6da9ff2..c363eb7 100644 --- a/honeybee_doe2/schedule.py +++ b/honeybee_doe2/schedule.py @@ -5,7 +5,7 @@ from ladybug.dt import Date, MONTHNAMES from ladybug.analysisperiod import AnalysisPeriod -from honeybee.typing import clean_doe2_string +from honeybee.typing import clean_doe2_string, clean_ep_string from honeybee_energy.schedule.day import ScheduleDay from honeybee_energy.schedule.rule import ScheduleRule from honeybee_energy.schedule.ruleset import ScheduleRuleset @@ -366,14 +366,17 @@ def schedule_day_from_inp(inp_string): field_dict = {k: v for k, v in zip(keywords, values)} sch_type = field_dict['TYPE'].upper() hour_vals_init = eval(field_dict['VALUES'].replace('&D', '"&D"'), {}) - for val in hour_vals_init: - if val == '&D': - hour_vals.append(hour_vals[-1]) - else: - hour_vals.append(float(val)) - if len(hour_vals) < 24: - for _ in range(24 - len(hour_vals)): - hour_vals.append(hour_vals[-1]) + if isinstance(hour_vals_init, tuple): + for val in hour_vals_init: + if val == '&D': + hour_vals.append(hour_vals[-1]) + else: + hour_vals.append(float(val)) + if len(hour_vals) < 24: + for _ in range(24 - len(hour_vals)): + hour_vals.append(hour_vals[-1]) + else: # a constant schedule + hour_vals = [hour_vals_init] * 24 elif command.upper() == 'DAY-SCHEDULE': prev_count = 0 for key, val in zip(keywords, values): @@ -393,7 +396,7 @@ def schedule_day_from_inp(inp_string): # convert temperature values from F to C if type is TEMPERATURE if sch_type == 'TEMPERATURE': hour_vals = [round((v - 32.) * (5. / 9.), 2) for v in hour_vals] - return ScheduleDay.from_values_at_timestep(u_name, hour_vals) + return ScheduleDay.from_values_at_timestep(clean_ep_string(u_name), hour_vals) def _inp_day_schedule_dictionary(day_inp_strings): @@ -401,8 +404,11 @@ def _inp_day_schedule_dictionary(day_inp_strings): day_schedule_dict = {} for sch_str in day_inp_strings: sch_str = sch_str.strip() - sch_obj = schedule_day_from_inp(sch_str) - day_schedule_dict[sch_obj.identifier] = sch_obj + try: + sch_obj = schedule_day_from_inp(sch_str) + day_schedule_dict[sch_obj.identifier] = sch_obj + except Exception: + pass # not a schedule that can be converted return day_schedule_dict @@ -449,7 +455,7 @@ def extract_all_rules_from_inp_schedule_week( day_sch_id = prev_day if day_sch_id == '&D' else day_sch_id prev_day = day_sch_id # increment it for the next item if day_sch_id not in applied_day_ids: # make a new rule - rule = ScheduleRule(day_schedule_dict[day_sch_id], + rule = ScheduleRule(day_schedule_dict[clean_ep_string(day_sch_id)], start_date=start_date, end_date=end_date) if i == 6: rule.apply_day_by_dow(1) @@ -480,32 +486,29 @@ def _inp_week_schedule_dictionary(week_inp_strings, day_sch_dict): week_designday_dict = {} for sch_str in week_inp_strings: sch_str = sch_str.strip() - u_name, rules, holiday, winter_dd, summer_dd = \ - extract_all_rules_from_inp_schedule_week(sch_str, day_sch_dict) - week_schedule_dict[u_name] = rules - week_designday_dict[u_name] = [ - day_sch_dict[holiday], - day_sch_dict[summer_dd], - day_sch_dict[winter_dd] - ] + try: + u_name, rules, holiday, winter_dd, summer_dd = \ + extract_all_rules_from_inp_schedule_week(sch_str, day_sch_dict) + week_schedule_dict[u_name] = rules + week_designday_dict[u_name] = [ + day_sch_dict[clean_ep_string(holiday)], + day_sch_dict[clean_ep_string(summer_dd)], + day_sch_dict[clean_ep_string(winter_dd)] + ] + except Exception: + pass # schedule is not translate-able return week_schedule_dict, week_designday_dict -def schedule_ruleset_from_inp(year_inp_string, week_inp_strings, day_inp_strings): - """Create a ScheduleRuleset from a DOE-2 INP text strings. +def _convert_schedule_year(year_inp_string, week_sch_dict, week_dd_dict): + """Convert an INP string of a year SCHEDULE or SCHEDULE-PD to a ScheduleRuleset. Args: year_inp_string: An INP text string describing a DOE-2 SCHEDULE or SCHEDULE-PD. - week_inp_strings: A list of INP text strings for all of the WEEK-SCHEDULE-PD - objects used in the SCHEDULE. - day_inp_strings: A list of text strings for all of the DAY-SCHEDULE or - DAY-SCHEDULE-PD objects used in the week_inp_strings. + week_sch_dict: A dictionary of ScheduleRules from _inp_week_schedule_dictionary. + week_dd_dict: A dictionary of design day ScheduleDay output from the + _inp_week_schedule_dictionary method. """ - # process the schedule components - day_schedule_dict = _inp_day_schedule_dictionary(day_inp_strings) - week_sch_dict, week_dd_dict = _inp_week_schedule_dictionary( - week_inp_strings, day_schedule_dict) - # use the year schedule to bring it all together u_name, command, keywords, values = parse_inp_string(year_inp_string) field_dict = {k: v for k, v in zip(keywords, values)} @@ -551,15 +554,46 @@ def schedule_ruleset_from_inp(year_inp_string, week_inp_strings, day_inp_strings next_day = Date.from_doy(end_doy) prev_month, prev_day = next_day.month, next_day.day - # create the ScheduleRuleset and apply the design days + # check to be sure the schedule days don't already have a parent + for rule in all_rules: + if rule.schedule_day._parent is not None: + rule.schedule_day = rule.schedule_day.duplicate() default_day_schedule = all_rules[0].schedule_day holiday_sch, summer_dd_sch, winter_dd_sch = week_dd_dict[week_id] - sched = ScheduleRuleset(u_name, default_day_schedule, all_rules[1:], schedule_type) + if holiday_sch._parent is not None: + holiday_sch = holiday_sch.duplicate() + if summer_dd_sch._parent is not None: + summer_dd_sch = summer_dd_sch.duplicate() + if winter_dd_sch._parent is not None: + winter_dd_sch = summer_dd_sch.duplicate() + + # create the ScheduleRuleset and apply the design days + sched = ScheduleRuleset(clean_ep_string(u_name), default_day_schedule, + all_rules[1:], schedule_type) ScheduleRuleset._apply_designdays_with_check( sched, holiday_sch, summer_dd_sch, winter_dd_sch) return sched +def schedule_ruleset_from_inp(year_inp_string, week_inp_strings, day_inp_strings): + """Create a ScheduleRuleset from a DOE-2 INP text strings. + + Args: + year_inp_string: An INP text string describing a DOE-2 SCHEDULE or SCHEDULE-PD. + week_inp_strings: A list of INP text strings for all of the WEEK-SCHEDULE-PD + objects used in the SCHEDULE. + day_inp_strings: A list of text strings for all of the DAY-SCHEDULE or + DAY-SCHEDULE-PD objects used in the week_inp_strings. + """ + # process the schedule components + day_schedule_dict = _inp_day_schedule_dictionary(day_inp_strings) + week_sch_dict, week_dd_dict = _inp_week_schedule_dictionary( + week_inp_strings, day_schedule_dict) + + # convert the year_inp_string into a ScheduleRuleset + return _convert_schedule_year(year_inp_string, week_sch_dict, week_dd_dict) + + def extract_all_schedule_ruleset_from_inp_file(inp_file): """Extract all ScheduleRuleset objects from a DOE-2 INP file. @@ -591,6 +625,16 @@ def extract_all_schedule_ruleset_from_inp_file(inp_file): year_pattern2 = re.compile(r'(?i)(".*=.*SCHEDULE-PD\n[\s\S]*?\.\.)') year_sch_str = year_pattern1.findall(file_contents) + \ year_pattern2.findall(file_contents) + + # translate each SCHEDULE and check to be sure ScheduleDay objects are unique + schedules = [] + for year_sch in year_sch_str: + try: + yr_sch = _convert_schedule_year(year_sch, week_sch_dict, week_dd_dict) + schedules.append(yr_sch) + except Exception: + pass # schedule is not translate-able + return schedules """______EXTRA UTILITY FUNCTIONS RELATED TO SCHEDULES______""" diff --git a/tests/assets/Schedules.inp b/tests/assets/Schedules.inp new file mode 100644 index 0000000..aea5267 --- /dev/null +++ b/tests/assets/Schedules.inp @@ -0,0 +1,1136 @@ + +$ --------------------------------------------------------- +$ Day Schedules +$ --------------------------------------------------------- + +"HDD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"CDD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 1 ) + .. +"Non-24Hr Fan WD" = DAY-SCHEDULE-PD + TYPE = ON/OFF + VALUES = ( 0, &D, &D, &D, &D, &D, 1, &D, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, 0 ) + .. +"Non-24Hr Fan SAT" = DAY-SCHEDULE-PD + TYPE = ON/OFF + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 1, &D, &D, &D, &D, &D, + &D, &D, 0 ) + .. +"Non-24Hr Fan SUNH" = DAY-SCHEDULE-PD + TYPE = ON/OFF + VALUES = ( 0 ) + .. +"24Hr Fan WD" = DAY-SCHEDULE-PD + TYPE = ON/OFF + VALUES = ( 1 ) + .. +"24Hr Fan SAT" = DAY-SCHEDULE-PD + TYPE = ON/OFF + VALUES = ( 1 ) + .. +"24Hr Fan SUNH" = DAY-SCHEDULE-PD + TYPE = ON/OFF + VALUES = ( 1 ) + .. +"PRJ Heating WD" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 65, &D, &D, &D, 66.5, 68, 70, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, &D, 65 ) + .. +"PRJ Heating SAT" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 65, &D, &D, &D, &D, &D, 66.5, 68, 70, &D, &D, &D, &D, + &D, &D, &D, 65 ) + .. +"PRJ Heating SUN, HOL" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 65 ) + .. +"PRJ Cooling WD" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 80, &D, &D, &D, &D, &D, 74, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, &D, 80 ) + .. +"PRJ Cooling SAT" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 80, &D, &D, &D, &D, &D, &D, &D, 74, &D, &D, &D, &D, + &D, &D, &D, 80 ) + .. +"PRJ Cooling SUN, HOL" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 80 ) + .. +"Min OA WD" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0.001, &D, &D, &D, &D, &D, &D, -999, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, 0.001 ) + .. +"Min OA WEH" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0.001 ) + .. +"Min Flow WD" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0, &D, &D, &D, &D, &D, &D, -999, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, 0 ) + .. +"Min Flow WEH" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0 ) + .. +"Exterior Lighting D" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 1 ) + .. +"Domestic HW WD, WEH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, 0.1, 0.2, 0.4, 0.6, 0.4, 0.1, + &D, &D, &D, &D, &D, &D, 0.25, 0.35, 0.25, 0.2, 0.1, &D, 0.05 ) + .. +"Cooling 80 WD" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 80 ) + .. +"Cooling 74 WD" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 74 ) + .. +"Heating 60 WD" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 60 ) + .. +"Cooling 999 WD" = DAY-SCHEDULE-PD + TYPE = TEMPERATURE + VALUES = ( 999 ) + .. +"Always On Fraction WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 1 ) + .. +"Baseline HW Reset Temp WD" = DAY-SCHEDULE-PD + TYPE = RESET-TEMP + OUTSIDE-HI = 50 + OUTSIDE-LO = 20 + SUPPLY-HI = 180 + SUPPLY-LO = 150 + .. +"Baseline CHW Reset Temp WD" = DAY-SCHEDULE-PD + TYPE = RESET-TEMP + OUTSIDE-HI = 80 + OUTSIDE-LO = 60 + SUPPLY-HI = 54 + SUPPLY-LO = 44 + .. +"CW Reset Temp WD" = DAY-SCHEDULE-PD + TYPE = RESET-TEMP + OUTSIDE-HI = 80 + OUTSIDE-LO = 60 + SUPPLY-HI = 70 + SUPPLY-LO = 85 + .. +"Cond Blr HW Reset Temp WD" = DAY-SCHEDULE-PD + TYPE = RESET-TEMP + OUTSIDE-HI = 50 + OUTSIDE-LO = 30 + SUPPLY-HI = 140 + SUPPLY-LO = 120 + .. +"CHW Reset Temp WD" = DAY-SCHEDULE-PD + TYPE = RESET-TEMP + OUTSIDE-HI = 55 + OUTSIDE-LO = 50 + SUPPLY-HI = 50 + SUPPLY-LO = 42 + .. +"Office Occupancy WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.15, 0.5, 0.8, &D, &D, &D, + 0.5, 0.8, &D, &D, 0.5, 0.25, 0.15, &D, 0, &D, 0 ) + .. +"Office Occupancy SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.25, &D, &D, &D, + &D, &D, 0.1, 0 ) + .. +"Office Occupancy SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Office Lighting Usage WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.2, 0.4, 0.8, &D, &D, &D, &D, + &D, &D, &D, 0.6, &D, 0.3, &D, 0.1, 0 ) + .. +"Office Lighting Usage SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.3, &D, &D, &D, 0.15, + &D, &D, &D, 0 ) + .. +"Office Lighting Usage SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Office Equipment Usage WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, &D, &D, 0.3, 0.9, &D, &D, &D, + 0.8, 0.9, 0.8, 0.6, &D, 0.3, 0.15 ) + .. +"Office Equipment Usage SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, &D, &D, &D, 0.3, &D, &D, &D, + 0.2, &D, &D, &D, 0.15 ) + .. +"Office Equipment Usage SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15 ) + .. +"Lab Occupancy WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, 0.1, 0.2, 0.9, &D, &D, + 0.4, 0.9, &D, &D, &D, &D, 0.3, 0.1, &D, &D, 0.05 ) + .. +"Lab Occupancy SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, 0.1, 0.3, &D, &D, &D, + &D, &D, &D, &D, 0.1, &D, 0.05 ) + .. +"Lab Occupancy SUN" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.3, &D, &D, + &D, &D, 0.1, &D, 0.05 ) + .. +"Lab Lighting Usage WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2, &D, &D, &D, &D, &D, 0.3, 0.5, 0.8, &D, &D, &D, + &D, &D, &D, &D, &D, &D, 0.5, &D, 0.3, &D, 0.2 ) + .. +"Lab Lighting Usage SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.1, &D, &D, &D, &D, &D, &D, &D, 0.4, &D, &D, &D, 0.2, + &D, &D, &D, &D, 0.1 ) + .. +"Lab Lighting Usage SUN" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.1, &D, &D, &D, &D, &D, &D, &D, 0.2, 0.4, &D, &D, + 0.2, &D, 0.1 ) + .. +"Lab Equipment Usage WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2, &D, &D, &D, &D, &D, 0.3, 0.4, 0.7, 0.95, &D, &D, + 0.4, 0.9, 0.8, 0.6, &D, &D, 0.4, 0.3, 0.2 ) + .. +"Lab Equipment Usage SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2, &D, &D, &D, &D, &D, &D, &D, 0.3, 0.4, &D, &D, &D, + &D, &D, 0.3, 0.2 ) + .. +"Lab Equipment Usage SUN" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2, &D, &D, &D, &D, &D, &D, &D, 0.3, 0.4, &D, &D, &D, + 0.3, 0.2 ) + .. +"Office Vent WD" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0, &D, &D, &D, &D, &D, 1, &D, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, &D, &D, 0 ) + .. +"Office Vent SAT" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0, &D, &D, &D, &D, &D, 1, &D, &D, &D, &D, &D, &D, &D, + &D, &D, &D, 0 ) + .. +"Office Vent S/H" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0 ) + .. +"Office Min Flow WD" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0.3, &D, &D, &D, &D, &D, -999, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, &D, 0.3 ) + .. +"Office Min Flow SAT" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0.3, &D, &D, &D, &D, &D, &D, &D, -999, &D, &D, &D, &D, + &D, &D, &D, 0.3 ) + .. +"Office Min Flow SUNH" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( 0.3 ) + .. +"Lab Min Flow WD" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( {#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")}, &D, + &D, &D, &D, -999, &D, &D, &D, + {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, -999, &D, &D, + &D, {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, -999, &D, + &D, &D, &D, {#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")} ) + .. +"Lab Min Flow SAT" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( {#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")}, &D, + &D, &D, &D, &D, &D, &D, -999, &D, + {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, -999, + {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, -999, &D, &D, + {#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")} ) + .. +"Lab Min Flow SUNH" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( {#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")} ) + .. +"Baseline Lab Min Flow WD" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( +{#pa("Lab ACH_unocc")/(#pa("Lab_design_cfmsf")*60/#pa("ceiling height")) + +$#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")}, &D, &D, &D, &D, -999, &D, + &D, &D, {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, -999, + &D, &D, &D, {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, + -999, &D, &D, &D, &D, +{#pa("Lab ACH_unocc")/(#pa("Lab_design_cfmsf")*60/#pa("ceiling height")) + +$#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")} ) + .. +"Baseline Lab Min Flow SAT" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( +{#pa("Lab ACH_unocc")/(#pa("Lab_design_cfmsf")*60/#pa("ceiling height")) + +$#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")}, &D, &D, &D, &D, &D, &D, &D, + -999, &D, {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, + -999, {#pa("FH_driven_cfmsf")/#pa("Lab_design_cfmsf")}, &D, -999, + &D, &D, +{#pa("Lab ACH_unocc")/(#pa("Lab_design_cfmsf")*60/#pa("ceiling height")) + +$#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")} ) + .. +"Baseline Lab Min Flow SUNH" = DAY-SCHEDULE-PD + TYPE = FRAC/DESIGN + VALUES = ( +{#pa("Lab ACH_unocc")/(#pa("Lab_design_cfmsf")*60/#pa("ceiling height")) + +$#pa("Lab_unocc_cfmsf")/#pa("Lab_design_cfmsf")} ) + .. +"Lab Occupancy Holiday" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05 ) + .. +"Lab Lighting Usage Holiday" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.1 ) + .. +"Lab Equipment Usage Holiday" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2 ) + .. +"Elec Mech Data Occ WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.5, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, &D, 0 ) + .. +"Elec Mech Data Occ SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.2, 0.4, &D, &D, &D, + &D, &D, &D, &D, &D, 0.2, &D, 0 ) + .. +"Elec Mech Data Occ SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Elec Mech Data Ltg WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.1, &D, &D, &D, &D, &D, 0.25, &D, &D, &D, &D, &D, &D, + &D, &D, &D, &D, &D, &D, &D, 0.1 ) + .. +"Elec Mech Data Ltg SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.1, &D, &D, &D, &D, &D, &D, &D, 0.3, &D, &D, &D, &D, + &D, &D, &D, 0.1 ) + .. +"Elec Mech Data Ltg SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.1 ) + .. +"Elec Data Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.4, &D, &D, &D, &D, &D, 0.5, &D, 0.8, &D, &D, &D, &D, + &D, &D, &D, 0.6, &D, 0.5, &D, 0.4 ) + .. +"Elec Data Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.4, &D, &D, &D, &D, &D, &D, &D, 0.5, &D, &D, &D, &D, + &D, &D, &D, 0.4 ) + .. +"Elec Data Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.4 ) + .. +"Mech Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2, &D, &D, &D, &D, &D, 0.3, 0.5, 0.6, &D, &D, &D, + &D, &D, &D, &D, &D, 0.5, 0.3, &D, 0.2 ) + .. +"Mech Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2, &D, &D, &D, &D, &D, &D, &D, 0.3, 0.4, &D, &D, &D, + &D, &D, 0.3, 0.2 ) + .. +"Mech Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.2 ) + .. +"Corr Lobb Occ WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.1, &D, 1, 0.5, &D, &D, 1, + 0.5, &D, &D, 0.8, 0.5, 0.3, 0.2, 0 ) + .. +"Corr Lobb Occ SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.2, &D, &D, &D, &D, + &D, &D, &D, 0 ) + .. +"Corr Lobb Occ SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Corr Lobb Ltg WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.25, &D, &D, &D, &D, &D, 0.5, &D, 1, &D, &D, &D, &D, + &D, &D, &D, &D, &D, 0.5, &D, 0.25 ) + .. +"Corr Lobb Ltg SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.25, &D, &D, &D, &D, &D, &D, &D, 0.4, &D, &D, &D, &D, + &D, &D, &D, 0.25 ) + .. +"Corr Lobb Ltg SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.25 ) + .. +"Corr Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, 0.15, 0.3, 0.6, &D, &D, &D, + 0.4, 0.6, &D, &D, 0.3, &D, 0.15, &D, 0.05 ) + .. +"Corr Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, &D, 0.15, 0.2, &D, &D, + &D, &D, &D, 0.15, 0.05 ) + .. +"Corr Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05 ) + .. +"Lobb Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, 0.15, 0.3, 0.6, &D, &D, &D, + 0.4, 0.6, &D, &D, 0.3, &D, 0.15, &D, 0.05 ) + .. +"Lobb Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, &D, 0.15, 0.25, &D, &D, + &D, &D, &D, 0.15, 0.05 ) + .. +"Lobb Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05 ) + .. +"Toilet Storage Occ WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.1, 0.2, 0.5, 0.5, &D, &D, &D, + &D, &D, &D, &D, &D, 0.2, 0.1, 0 ) + .. +"Toilet Storage Occ SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.2, &D, &D, &D, + &D, &D, 0.1, 0 ) + .. +"Toilet Storage Occ SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Toilet Storage Ltg WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.5, &D, 0.8, &D, &D, &D, &D, + &D, &D, &D, &D, &D, 0.5, &D, 0 ) + .. +"Toilet Storage Ltg SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.2, 0.4, &D, &D, &D, + &D, &D, 0.2, 0 ) + .. +"Toilet Storage Ltg SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Toilet Storage Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.1, &D, 0.4, &D, &D, &D, 0.6, + 0.4, &D, &D, &D, &D, &D, &D, 0 ) + .. +"Toilet Storage Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.2, &D, &D, &D, + &D, &D, 0.1, 0 ) + .. +"Toilet Storage Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Stairs Occ WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, 0.2, 0.2, 0.4, &D, &D, &D, &D, + &D, &D, &D, &D, 0.2, 0.2, 0.1, 0 ) + .. +"Stairs Occ SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.2, &D, &D, &D, + &D, &D, 0.1, 0 ) + .. +"Stairs Occ SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Stairs Ltg WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.5, &D, &D, &D, &D, &D, &D, &D, 1, &D, &D, &D, &D, + &D, &D, &D, &D, &D, 0.6, &D, 0.5 ) + .. +"Stairs Ltg SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.5, &D, &D, &D, &D, &D, &D, &D, 1, &D, &D, &D, &D, + &D, &D, &D, 0.5 ) + .. +"Stairs Ltg SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.5 ) + .. +"Stairs Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0 ) + .. +"Retail Occ WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, 0.1, 0.2, 0.5, &D, 0.7, &D, + &D, &D, 0.8, &D, 0.5, &D, 0.3, &D, 0 ) + .. +"Retail Occ SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, 0.1, 0.2, 0.5, 0.6, 0.8, + &D, &D, &D, &D, &D, 0.6, 0.2, &D, &D, 0.1, 0 ) + .. +"Retail Occ SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0, &D, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.2, 0.4, &D, + &D, &D, &D, &D, 0.2, 0.1, 0 ) + .. +"Retail Ltg WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, 0.2, 0.5, 1, &D, &D, &D, + &D, &D, &D, &D, &D, 0.6, &D, 0.5, 0.2, 0.05 ) + .. +"Retail Ltg SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, 0.1, 0.3, 0.8, &D, 1, + &D, &D, &D, &D, &D, &D, 0.5, 0.3, &D, 0.1, 0.05 ) + .. +"Retail Ltg SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, &D, 0.1, &D, 0.4, &D, + 0.6, &D, &D, &D, &D, 0.4, 0.2, 0.05 ) + .. +"Retail Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, 0.2, 0.5, 0.85, &D, &D, + &D, &D, &D, &D, &D, &D, 0.6, &D, 0.5, 0.2, 0.05 ) + .. +"Retail Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, 0.1, 0.3, 0.85, &D, &D, + &D, &D, &D, &D, &D, &D, 0.5, &D, 0.3, 0.1, 0.05 ) + .. +"Retail Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.05, &D, &D, &D, &D, &D, &D, &D, 0.1, 0.2, 0.4, &D, + 0.6, &D, &D, &D, &D, 0.4, 0.2, 0.05 ) + .. +"Restaurant Occ WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, 0.15, 0.05, 0, &D, &D, &D, 0.05, 0.05, &D, 0.2, + 0.5, 0.8, 0.7, 0.4, 0.2, &D, 0.5, 0.8, &D, &D, 0.5, 0.3, 0.2 ) + .. +"Restaurant Occ SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.3, 0.25, 0.05, 0, &D, &D, &D, &D, &D, 0.05, 0.2, + 0.5, &D, &D, 0.4, 0.3, &D, &D, 0.7, 0.9, &D, 0.7, 0.5, 0.4 ) + .. +"Restaurant Occ SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, 0.05, 0, &D, &D, &D, &D, &D, &D, 0.1, 0.2, + &D, &D, 0.15, 0.2, &D, 0.4, 0.5, 0.7, &D, 0.4, 0.2 ) + .. +"Restaurant Ltg WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, 0.2, 0.4, &D, 0.5, &D, 0.8, 1, + &D, &D, &D, &D, &D, &D, &D, &D, &D, 0.8, 0.5, 0.3 ) + .. +"Restaurant Ltg SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, &D, 0.3, &D, 0.5, &D, 0.8, 1, + &D, &D, &D, &D, &D, &D, &D, &D, &D, 0.8, 0.5, 0.3 ) + .. +"Restaurant Ltg SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, &D, 0.3, &D, 0.5, &D, 0.7, 0.7, + 1, &D, &D, &D, &D, 0.8, 0.6, &D, &D, &D, 0.5, 0.3 ) + .. +"Restaurant Eqp WD" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, 0.2, 0.4, &D, 0.5, &D, 0.8, &D, + &D, &D, &D, 0.9, &D, &D, &D, &D, &D, &D, 0.5, 0.3 ) + .. +"Restaurant Eqp SAT" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, &D, 0.3, &D, 0.5, &D, 0.8, &D, + &D, &D, &D, &D, &D, 0.9, &D, &D, &D, &D, 0.5, 0.3 ) + .. +"Restaurant Eqp SUNH" = DAY-SCHEDULE-PD + TYPE = FRACTION + VALUES = ( 0.15, &D, &D, &D, &D, &D, 0.3, &D, 0.5, &D, 0.7, &D, + &D, &D, &D, &D, 0.8, &D, 0.6, &D, &D, &D, 0.5, 0.3 ) + .. + +$ --------------------------------------------------------- +$ Week Schedules +$ --------------------------------------------------------- + +"Non-24Hr Fan Wk" = WEEK-SCHEDULE-PD + TYPE = ON/OFF + DAY-SCHEDULES = ( "Non-24Hr Fan WD", &D, &D, &D, &D, "Non-24Hr Fan SAT", + "Non-24Hr Fan SUNH", &D, "Non-24Hr Fan WD" ) + .. +"24Hr Fan Wk" = WEEK-SCHEDULE-PD + TYPE = ON/OFF + DAY-SCHEDULES = ( "24Hr Fan WD", &D, &D, &D, &D, "24Hr Fan SAT", + "24Hr Fan SUNH", &D, "24Hr Fan WD" ) + .. +"PRJ Heating Wk" = WEEK-SCHEDULE-PD + TYPE = TEMPERATURE + DAY-SCHEDULES = ( "PRJ Heating WD", &D, &D, &D, &D, "PRJ Heating SAT", + "PRJ Heating SUN, HOL" ) + .. +"PRJ Cooling Wk" = WEEK-SCHEDULE-PD + TYPE = TEMPERATURE + DAY-SCHEDULES = ( "PRJ Cooling WD", &D, &D, &D, &D, "PRJ Cooling SAT", + "PRJ Cooling SUN, HOL" ) + .. +"Min OA Wk" = WEEK-SCHEDULE-PD + TYPE = FRAC/DESIGN + DAY-SCHEDULES = ( "Min OA WD", &D, &D, &D, &D, "Min OA WEH" ) + .. +"Min Flow Wk" = WEEK-SCHEDULE-PD + TYPE = FRAC/DESIGN + DAY-SCHEDULES = ( "Min Flow WD", &D, &D, &D, &D, "Min Flow WEH" ) + .. +"Exterior Lighting Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Exterior Lighting D", &D, &D, &D, &D, &D, &D, &D, + "HDD", "CDD" ) + .. +"Domestic HW Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Domestic HW WD, WEH", &D, &D, &D, &D, &D, &D, &D, + "HDD", "HDD" ) + .. +"Cooling 80 Wk" = WEEK-SCHEDULE-PD + TYPE = TEMPERATURE + DAY-SCHEDULES = ( "Cooling 80 WD" ) + .. +"Cooling 74 Wk" = WEEK-SCHEDULE-PD + TYPE = TEMPERATURE + DAY-SCHEDULES = ( "Cooling 74 WD" ) + .. +"Heating 60 Wk" = WEEK-SCHEDULE-PD + TYPE = TEMPERATURE + DAY-SCHEDULES = ( "Heating 60 WD" ) + .. +"Cooling 999 Wk" = WEEK-SCHEDULE-PD + TYPE = TEMPERATURE + DAY-SCHEDULES = ( "Cooling 999 WD" ) + .. +"Always On Fraction Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Always On Fraction WD" ) + .. +"Baseline HW Reset Temp Wk" = WEEK-SCHEDULE-PD + TYPE = RESET-TEMP + DAY-SCHEDULES = ( "Baseline HW Reset Temp WD" ) + .. +"Baseline CHW Reset Temp Wk" = WEEK-SCHEDULE-PD + TYPE = RESET-TEMP + DAY-SCHEDULES = ( "Baseline CHW Reset Temp WD" ) + .. +"CW Reset Temp Wk" = WEEK-SCHEDULE-PD + TYPE = RESET-TEMP + DAY-SCHEDULES = ( "CW Reset Temp WD" ) + .. +"Cond Blr HW Reset Temp Wk" = WEEK-SCHEDULE-PD + TYPE = RESET-TEMP + DAY-SCHEDULES = ( "Cond Blr HW Reset Temp WD" ) + .. +"CHW Reset Temp Wk" = WEEK-SCHEDULE-PD + TYPE = RESET-TEMP + DAY-SCHEDULES = ( "CHW Reset Temp WD" ) + .. +"Office Occupancy Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Office Occupancy WD", &D, &D, &D, &D, + "Office Occupancy SAT", "Office Occupancy SUNH" ) + .. +"Office Lighting Usage Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Office Lighting Usage WD", &D, &D, &D, &D, + "Office Lighting Usage SAT", "Office Lighting Usage SUNH" ) + .. +"Office Equipment Usage Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Office Equipment Usage WD", &D, &D, &D, &D, + "Office Equipment Usage SAT", "Office Equipment Usage SUNH" ) + .. +"Lab Occupancy Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Lab Occupancy WD", &D, &D, &D, &D, + "Lab Occupancy SAT", "Lab Occupancy SUN", "Lab Occupancy Holiday" ) + .. +"Lab Lighting Usage Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Lab Lighting Usage WD", &D, &D, &D, &D, + "Lab Lighting Usage SAT", "Lab Lighting Usage SUN", + "Lab Lighting Usage Holiday" ) + .. +"Lab Equipment Usage Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Lab Equipment Usage WD", &D, &D, &D, &D, + "Lab Equipment Usage SAT", "Lab Equipment Usage SUN", + "Lab Equipment Usage Holiday" ) + .. +"Office Vent WK" = WEEK-SCHEDULE-PD + TYPE = FRAC/DESIGN + DAY-SCHEDULES = ( "Office Vent WD", &D, &D, &D, &D, "Office Vent SAT", + "Office Vent S/H" ) + .. +"Office Min Flow Wk" = WEEK-SCHEDULE-PD + TYPE = FRAC/DESIGN + DAY-SCHEDULES = ( "Office Min Flow WD", &D, &D, &D, &D, + "Office Min Flow SAT", "Office Min Flow SUNH" ) + .. +"Lab Min Flow Wk" = WEEK-SCHEDULE-PD + TYPE = FRAC/DESIGN + DAY-SCHEDULES = ( "Lab Min Flow WD", &D, &D, &D, &D, "Lab Min Flow SAT", + "Lab Min Flow SUNH" ) + .. +"Baseline Lab Min Flow Wk" = WEEK-SCHEDULE-PD + TYPE = FRAC/DESIGN + DAY-SCHEDULES = ( "Baseline Lab Min Flow WD", &D, &D, &D, &D, + "Baseline Lab Min Flow SAT", "Baseline Lab Min Flow SUNH" ) + .. +"Elec Mech Data Occ Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Elec Mech Data Occ WD", &D, &D, &D, &D, + "Elec Mech Data Occ SAT", "Elec Mech Data Occ SUNH" ) + .. +"Elec Mech Data Ltg Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Elec Mech Data Ltg WD", &D, &D, &D, &D, + "Elec Mech Data Ltg SAT", "Elec Mech Data Ltg SUNH" ) + .. +"Elec Data Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Elec Data Eqp WD", &D, &D, &D, &D, + "Elec Data Eqp SAT", "Elec Data Eqp SUNH" ) + .. +"Mech Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Mech Eqp WD", &D, &D, &D, &D, "Mech Eqp SAT", + "Mech Eqp SUNH" ) + .. +"Corr Lobb Occ Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Corr Lobb Occ WD", &D, &D, &D, &D, + "Corr Lobb Occ SAT", "Corr Lobb Occ SUNH" ) + .. +"Corr Lobb Ltg Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Corr Lobb Ltg WD", &D, &D, &D, &D, + "Corr Lobb Ltg SAT", "Corr Lobb Ltg SUNH" ) + .. +"Corr Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Corr Eqp WD", &D, &D, &D, &D, "Corr Eqp SAT", + "Corr Eqp SUNH" ) + .. +"Lobb Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Lobb Eqp WD", &D, &D, &D, &D, "Lobb Eqp SAT", + "Lobb Eqp SUNH" ) + .. +"Toilet Storage Occ Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Toilet Storage Occ WD", &D, &D, &D, &D, + "Toilet Storage Occ SAT", "Toilet Storage Occ SUNH" ) + .. +"Toilet Storage Ltg Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Toilet Storage Ltg WD", &D, &D, &D, &D, + "Toilet Storage Ltg SAT", "Toilet Storage Ltg SUNH" ) + .. +"Toilet Storage Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Toilet Storage Eqp WD", &D, &D, &D, &D, + "Toilet Storage Eqp SAT", "Toilet Storage Eqp SUNH" ) + .. +"Stairs Occ Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Stairs Occ WD", &D, &D, &D, &D, "Stairs Occ SAT", + "Stairs Occ SUNH" ) + .. +"Stairs Ltg Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Stairs Ltg WD", &D, &D, &D, &D, "Stairs Ltg SAT", + "Stairs Ltg SUNH" ) + .. +"Stairs Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Stairs Eqp WD", &D, &D, &D, &D, "Stairs Eqp WD" ) + .. +"Retail Occ Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Retail Occ WD", &D, &D, &D, &D, "Retail Occ SAT", + "Retail Occ SUNH" ) + .. +"Retail Ltg Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Retail Ltg WD", &D, &D, &D, &D, "Retail Ltg SAT", + "Retail Ltg SUNH" ) + .. +"Retail Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Retail Eqp WD", &D, &D, &D, &D, "Retail Eqp SAT", + "Retail Eqp SUNH" ) + .. +"Restaurant Occ Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Restaurant Occ WD", &D, &D, &D, &D, + "Restaurant Occ SAT", "Restaurant Occ SUNH" ) + .. +"Restaurant Ltg Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Restaurant Ltg WD", &D, &D, &D, &D, + "Restaurant Ltg SAT", "Restaurant Ltg SUNH" ) + .. +"Restaurant Eqp Wk" = WEEK-SCHEDULE-PD + TYPE = FRACTION + DAY-SCHEDULES = ( "Restaurant Eqp WD", &D, &D, &D, &D, + "Restaurant Eqp SAT", "Restaurant Eqp SUNH" ) + .. + +$ --------------------------------------------------------- +$ Annual Schedules +$ --------------------------------------------------------- + +"Non-24Hr Fan Sch" = SCHEDULE-PD + TYPE = ON/OFF + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Non-24Hr Fan Wk" ) + .. +"24Hr Fan Sch" = SCHEDULE-PD + TYPE = ON/OFF + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "24Hr Fan Wk" ) + .. +"PRJ Heating Sch" = SCHEDULE-PD + TYPE = TEMPERATURE + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "PRJ Heating Wk" ) + .. +"PRJ Cooling Sch" = SCHEDULE-PD + TYPE = TEMPERATURE + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "PRJ Cooling Wk" ) + .. +"Min OA Sch" = SCHEDULE-PD + TYPE = FRAC/DESIGN + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Min OA Wk" ) + .. +"Min Flow Sch" = SCHEDULE-PD + TYPE = FRAC/DESIGN + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Min Flow Wk" ) + .. +"OFFICE ELEV" = SCHEDULE-PD + LIBRARY-ENTRY "OFFICE ELEV" + .. +"Exterior Lighting Sch" = SCHEDULE-PD + TYPE = FRACTION + PHOTOCELL-CTRL = DAY-OFF + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Exterior Lighting Wk" ) + .. +"Domestic HW Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Domestic HW Wk" ) + .. +"Cooling 80" = SCHEDULE-PD + TYPE = TEMPERATURE + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Cooling 80 Wk" ) + .. +"Cooling 74" = SCHEDULE-PD + TYPE = TEMPERATURE + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Cooling 74 Wk" ) + .. +"Heating 60" = SCHEDULE-PD + TYPE = TEMPERATURE + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Heating 60 Wk" ) + .. +"Cooling 999" = SCHEDULE-PD + TYPE = TEMPERATURE + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Cooling 999 Wk" ) + .. +"Always On Fraction Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Always On Fraction Wk" ) + .. +"Baseline HW Reset Temp Sch" = SCHEDULE-PD + TYPE = RESET-TEMP + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Baseline HW Reset Temp Wk" ) + .. +"Baseline CHW Reset Temp Sch" = SCHEDULE-PD + TYPE = RESET-TEMP + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Baseline CHW Reset Temp Wk" ) + .. +"CW Reset Temp Sch" = SCHEDULE-PD + TYPE = RESET-TEMP + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "CW Reset Temp Wk" ) + .. +"Cond Blr HW Reset Temp Sch" = SCHEDULE-PD + TYPE = RESET-TEMP + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Cond Blr HW Reset Temp Wk" ) + .. +"CHW Reset Temp Sch" = SCHEDULE-PD + TYPE = RESET-TEMP + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "CHW Reset Temp Wk" ) + .. +"Office Occupancy Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Office Occupancy Wk" ) + .. +"Office Lighting Usage Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Office Lighting Usage Wk" ) + .. +"Office Equipment Usage Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Office Equipment Usage Wk" ) + .. +"Lab Occupancy Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Lab Occupancy Wk" ) + .. +"Lab Lighting Usage Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Lab Lighting Usage Wk" ) + .. +"Lab Equipment Usage Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Lab Equipment Usage Wk" ) + .. +"Office Vent Sch" = SCHEDULE-PD + TYPE = FRAC/DESIGN + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Office Vent WK" ) + .. +"Office Min Flow Sch" = SCHEDULE-PD + TYPE = FRAC/DESIGN + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Office Min Flow Wk" ) + .. +"Lab Min Flow Sch" = SCHEDULE-PD + TYPE = FRAC/DESIGN + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Lab Min Flow Wk" ) + .. +"Baseline Lab Min Flow Sch" = SCHEDULE-PD + TYPE = FRAC/DESIGN + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Baseline Lab Min Flow Wk" ) + .. +"Elec Mech Data Occ Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Elec Mech Data Occ Wk" ) + .. +"Elec Mech Data Ltg Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Elec Mech Data Ltg Wk" ) + .. +"Elec Data Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Elec Data Eqp Wk" ) + .. +"Mech Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Mech Eqp Wk" ) + .. +"Corr Lobb Occ Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Corr Lobb Occ Wk" ) + .. +"Corr Lobb Ltg Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Corr Lobb Ltg Wk" ) + .. +"Corr Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Corr Eqp Wk" ) + .. +"Lobb Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Lobb Eqp Wk" ) + .. +"Toilet Storage Occ Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Toilet Storage Occ Wk" ) + .. +"Toilet Storage Ltg Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Toilet Storage Ltg Wk" ) + .. +"Toilet Storage Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Toilet Storage Eqp Wk" ) + .. +"Stairs Occ Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Stairs Occ Wk" ) + .. +"Stairs Ltg Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Stairs Ltg Wk" ) + .. +"Stairs Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Stairs Eqp Wk" ) + .. +"Retail Occ Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Retail Occ Wk" ) + .. +"Retail Ltg Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Retail Ltg Wk" ) + .. +"Retail Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Retail Eqp Wk" ) + .. +"Restaurant Occ Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Restaurant Occ Wk" ) + .. +"Restaurant Ltg Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Restaurant Ltg Wk" ) + .. +"Restaurant Eqp Sch" = SCHEDULE-PD + TYPE = FRACTION + MONTH = ( 12 ) + DAY = ( 31 ) + WEEK-SCHEDULES = ( "Restaurant Eqp Wk" ) + .. diff --git a/tests/cli_test.py b/tests/cli_test.py index 75ac554..f2b9a12 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -1,12 +1,15 @@ """Test the CLI commands""" - +import json import os from click.testing import CliRunner -from honeybee_doe2.cli.translate import model_to_inp_file +from honeybee_energy.schedule.ruleset import ScheduleRuleset +from honeybee_doe2.cli.translate import model_to_inp_file, schedule_from_inp, \ + schedule_to_inp def test_model_to_inp_cli(): + """Test the translation of a Model to INP.""" runner = CliRunner() input_hb_model = './tests/assets/shade_test.hbjson' out_file = './tests/assets/cli_test.inp' @@ -20,4 +23,26 @@ def test_model_to_inp_cli(): assert result.exit_code == 0 assert os.path.isfile(out_file) - os.remove(out_file) \ No newline at end of file + os.remove(out_file) + + +def test_schedule_to_from_inp(): + runner = CliRunner() + input_hb_sch = './tests/assets/Schedules.inp' + + result = runner.invoke(schedule_from_inp, [input_hb_sch, '--list']) + assert result.exit_code == 0 + result_dict = json.loads(result.output) + schedules = [ScheduleRuleset.from_dict(sch) for sch in result_dict] + assert len(schedules) >= 36 + + output_hb_json = './tests/assets/schedules.json' + result = runner.invoke( + schedule_from_inp, [input_hb_sch, '--output-file', output_hb_json]) + assert result.exit_code == 0 + assert os.path.isfile(output_hb_json) + + result = runner.invoke(schedule_to_inp, [output_hb_json]) + assert result.exit_code == 0 + + os.remove(output_hb_json)