def from_standards_dict(cls, data):
    """Create a ScheduleRuleset from an OpenStudio standards gem dictionary.

    Args:
        data: A list of individual ScheduleDay dictionary descriptions from
            the standards gem that together define a complete ScheduleRuleset.
    """
    # map standards gem day types to integers
    _standards_gem_day_types = {
        'Sun': [1],
        'Mon': [2],
        'Tue': [3],
        'Wed': [4],
        'Thu': [5],
        'Fri': [6],
        'Sat': [7],
        'Hol': [8],
        'Wknd': [1, 7],
        'Wkdy': [2, 3, 4, 5, 6]
    }

    # empty variables to be replaced
    default_day = None
    holiday = None
    summer_day = None
    winter_day = None
    schedule_rules = []

    # build the ScheduleDay objects and determine rules for when to apply them
    for day_sch_dict in data:
        schedule_day = ScheduleDay.from_standards_dict(day_sch_dict)
        day_types = day_sch_dict['day_types'].split('|')
        if 'Default' in day_types:
            default_day = schedule_day.duplicate()
            default_day.identifier = '{}_Default'.format(
                schedule_day.identifier)
            day_types.remove('Default')
        if 'Hol' in day_sch_dict['day_types']:
            holiday = schedule_day.duplicate()
            holiday.identifier = '{}_Hol'.format(schedule_day.identifier)
            day_types.remove('Hol')
        if 'SmrDsn' in day_sch_dict['day_types']:
            summer_day = schedule_day.duplicate()
            summer_day.identifier = '{}_SmrDsn'.format(schedule_day.identifier)
            day_types.remove('SmrDsn')
        if 'WntrDsn' in day_sch_dict['day_types']:
            winter_day = schedule_day.duplicate()
            winter_day.identifier = '{}_WntrDsn'.format(
                schedule_day.identifier)
            day_types.remove('WntrDsn')
        if len(day_types
               ) != 0:  # there are rules for when to apply the schedule
            schedule_day.identifier = \
                '{}_{}'.format(schedule_day.identifier, '|'.join(day_types))
            rule = ScheduleRule(schedule_day)
            for apply_day in day_types:
                apply_dows = _standards_gem_day_types[apply_day]
                for dow in apply_dows:
                    rule.apply_day_by_dow(dow)
            rule.start_date = _process_date_string(day_sch_dict['start_date'])
            rule.end_date = _process_date_string(day_sch_dict['end_date'])
            schedule_rules.append(rule)

    # attempt to determine a ScheduleTypeLimit from the units and category
    schedule_type = _type_from_standards_gem(day_sch_dict['units'],
                                             day_sch_dict['category'])

    # check that there is a default day
    if default_day is None:  # just try to pick one of the rules to be the default
        try:
            default_day = schedule_rules[0].schedule_day
            del schedule_rules[0]
        except IndexError:
            raise ValueError('No default_day_schedule or schedule rules were '
                             'found in the standards gem dictionary.')

    # return the schedule
    return cls(data[0]['name'], default_day, schedule_rules, schedule_type,
               holiday, summer_day, winter_day)
Esempio n. 2
0
def test_schedule_rule_apply_day_by_dow():
    """Test the ScheduleRule apply_day_by_dow properties."""
    simple_office = ScheduleDay(
        'Simple Office Occupancy', [0, 1, 0],
        [Time(0, 0), Time(9, 0), Time(17, 0)])
    sched_rule = ScheduleRule(simple_office)

    assert not sched_rule.apply_sunday
    sched_rule.apply_day_by_dow(1)
    assert sched_rule.apply_sunday
    assert not sched_rule.apply_monday
    sched_rule.apply_day_by_dow(2)
    assert sched_rule.apply_monday
    assert not sched_rule.apply_tuesday
    sched_rule.apply_day_by_dow(3)
    assert sched_rule.apply_tuesday
    assert not sched_rule.apply_wednesday
    sched_rule.apply_day_by_dow(4)
    assert sched_rule.apply_wednesday
    assert not sched_rule.apply_thursday
    sched_rule.apply_day_by_dow(5)
    assert sched_rule.apply_thursday
    assert not sched_rule.apply_friday
    sched_rule.apply_day_by_dow(6)
    assert sched_rule.apply_friday
    assert not sched_rule.apply_saturday
    sched_rule.apply_day_by_dow(7)
    assert sched_rule.apply_saturday

    assert sched_rule.apply_weekday
    assert sched_rule.apply_weekend
    assert sched_rule.apply_all