Source code for honeybee_openstudio.hvac.standards.schedule

# coding=utf-8
"""Module taken from OpenStudio-standards.

https://github.com/NREL/openstudio-standards/blob/master/
lib/openstudio-standards/schedules/create.rb
"""
from __future__ import division

from honeybee_openstudio.openstudio import openstudio, openstudio_model, os_vector_len


[docs] def create_constant_schedule_ruleset(model, value, name=None, schedule_type_limit=None): """Create constant ScheduleRuleset with a given value. Args: model: [OpenStudio::Model::Model] OpenStudio model object value: [Double] the value to use, 24-7, 365 name: [String] the name of the schedule schedule_type_limit: [String] the name of a schedule type limit. options are Dimensionless, Temperature, Humidity Ratio, Fraction, Fractional, OnOff, and Activity """ # check to see if schedule exists with same name and constant value and return if true if name is not None: existing_sch = model.getScheduleRulesetByName(name) if existing_sch.is_initialized(): existing_sch = existing_sch.get() existing_day_sch_vals = existing_sch.defaultDaySchedule().values() if os_vector_len(existing_day_sch_vals) == 1: if abs(existing_day_sch_vals[0] - value) < 1.0e-6: return existing_sch # create ScheduleRuleset schedule = openstudio_model.ScheduleRuleset(model) schedule.defaultDaySchedule().addValue(openstudio.Time(0, 24, 0, 0), value) # set name if name is not None: schedule.setName(name) schedule.defaultDaySchedule().setName('{} Default'.format(name)) # set schedule type limits if schedule_type_limit is not None: sch_type_limits_obj = create_schedule_type_limits( model, standard_schedule_type_limit=schedule_type_limit) schedule.setScheduleTypeLimits(sch_type_limits_obj) return schedule
[docs] def create_schedule_type_limits( model, standard_schedule_type_limit=None, name=None, lower_limit_value=None, upper_limit_value=None, numeric_type=None, unit_type=None): """Create a ScheduleTypeLimits object for a schedule. Args: model: [OpenStudio::Model::Model] OpenStudio model object. standard_schedule_type_limit: [String] the name of a standard schedule type limit with predefined limits. Options are Dimensionless, Temperature, Humidity Ratio, Fraction, Fractional, OnOff, and Activity. name: [String] the name of the schedule type limits. lower_limit_value: [double] the lower limit value for the schedule type. upper_limit_value: [double] the upper limit value for the schedule type. numeric_type: [String] the numeric type, options are Continuous or Discrete. unit_type: [String] the unit type, options are defined in EnergyPlus I/O reference. """ if standard_schedule_type_limit is None: if lower_limit_value is None or upper_limit_value is None or \ numeric_type is None or unit_type is None: msg = 'If calling create_schedule_type_limits without a ' \ 'standard_schedule_type_limit, you must specify all properties ' \ 'of ScheduleTypeLimits.' print(msg) return None schedule_type_limits = openstudio_model.scheduleTypeLimits(model) if name is not None: schedule_type_limits.setName(name) if lower_limit_value is not None: schedule_type_limits.setLowerLimitValue(lower_limit_value) if upper_limit_value is not None: schedule_type_limits.setUpperLimitValue(upper_limit_value) if numeric_type is not None: schedule_type_limits.setNumericType(numeric_type) if unit_type is not None: schedule_type_limits.setUnitType(unit_type) else: schedule_type_limits = model.getScheduleTypeLimitsByName( standard_schedule_type_limit) if not schedule_type_limits.is_initialized(): stl_name = standard_schedule_type_limit.lower() if stl_name == 'dimensionless': schedule_type_limits = openstudio_model.ScheduleTypeLimits(model) schedule_type_limits.setName('Dimensionless') schedule_type_limits.setLowerLimitValue(0.0) schedule_type_limits.setUpperLimitValue(1000.0) schedule_type_limits.setNumericType('Continuous') schedule_type_limits.setUnitType('Dimensionless') elif stl_name == 'temperature': schedule_type_limits = openstudio_model.ScheduleTypeLimits(model) schedule_type_limits.setName('Temperature') schedule_type_limits.setLowerLimitValue(0.0) schedule_type_limits.setUpperLimitValue(100.0) schedule_type_limits.setNumericType('Continuous') schedule_type_limits.setUnitType('Temperature') elif stl_name == 'humidity ratio': schedule_type_limits = openstudio_model.ScheduleTypeLimits(model) schedule_type_limits.setName('Humidity Ratio') schedule_type_limits.setLowerLimitValue(0.0) schedule_type_limits.setUpperLimitValue(0.3) schedule_type_limits.setNumericType('Continuous') schedule_type_limits.setUnitType('Dimensionless') elif stl_name in ('fraction', 'fractional'): schedule_type_limits = openstudio_model.ScheduleTypeLimits(model) schedule_type_limits.setName('Fraction') schedule_type_limits.setLowerLimitValue(0.0) schedule_type_limits.setUpperLimitValue(1.0) schedule_type_limits.setNumericType('Continuous') schedule_type_limits.setUnitType('Dimensionless') elif stl_name == 'onoff': schedule_type_limits = openstudio_model.ScheduleTypeLimits(model) schedule_type_limits.setName('OnOff') schedule_type_limits.setLowerLimitValue(0) schedule_type_limits.setUpperLimitValue(1) schedule_type_limits.setNumericType('Discrete') schedule_type_limits.setUnitType('Availability') elif stl_name == 'activity': schedule_type_limits = openstudio_model.ScheduleTypeLimits(model) schedule_type_limits.setName('Activity') schedule_type_limits.setLowerLimitValue(70.0) schedule_type_limits.setUpperLimitValue(1000.0) schedule_type_limits.setNumericType('Continuous') schedule_type_limits.setUnitType('ActivityLevel') else: msg = 'Invalid standard_schedule_type_limit for method ' \ 'create_schedule_type_limits.' raise ValueError(msg) else: schedule_type_limits = schedule_type_limits.get() return schedule_type_limits
[docs] def model_add_schedule(model, schedule_name): """Get a schedule from the Model or always on schedule if it does not exist.""" if schedule_name is None or schedule_name == '': return model.alwaysOnDiscreteSchedule() schedule = model.getScheduleByName(schedule_name) if schedule.is_initialized(): return schedule.get() return model.alwaysOnDiscreteSchedule()