Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page
Ask Your Question

Revision history [back]

OpenStudio enforces correspondance of the ScheduleTypeLimits when you try to set schedules.

  • If you try to assign a Schedule that does not have a ScheduleTypeLimits, it'll create and assign one for you (it'll always work)
  • If you try to assign a Schedule that has a ScheduleTypeLimits, it will check whether it's compatible, that is check the lower/upper limits and the Unit Type (it doesn't care whether it's continuous or discrete).

You can see the expected schedule type limits for the DefaultScheduleSet here in ScheduleTypeRegistry.cpp:

// className, scheduleDisplayName, scheduleRelationshipName, isContinuous, unitType, lowerLimitValue, upperLimitValue;
{"DefaultScheduleSet","Hours of Operation","hoursofOperationSchedule",false,"Availability",0.0,1.0},
{"DefaultScheduleSet","Number of People","numberofPeopleSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","People Activity Level","peopleActivityLevelSchedule",true,"ActivityLevel",0.0,OptionalDouble()},
{"DefaultScheduleSet","Lighting","lightingSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Electric Equipment","electricEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Gas Equipment","gasEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Hot Water Equipment","hotWaterEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Infiltration","infiltrationSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Steam Equipment","steamEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Other Equipment","otherEquipmentSchedule",true,"",OptionalDouble(),OptionalDouble()},

If you're curious:

TL;DR: DefaultScheduleSet will never accept any schedule with a "Temperature" unit type (which is what the default Temperature ScheduleTypeLimits has).

OpenStudio enforces correspondance of the ScheduleTypeLimits correspondence of the ScheduleTypeLimits when you try to set schedules.

  • If you try to assign a Schedule that does not have a ScheduleTypeLimits, ScheduleTypeLimits, it'll create and assign one for you (it'll always work)
  • If you try to assign a Schedule that has a ScheduleTypeLimits, ScheduleTypeLimits, it will check whether it's compatible, that is check the lower/upper limits and the Unit Type (it doesn't care whether it's continuous or discrete).

You can see the expected schedule type limits for the DefaultScheduleSet DefaultScheduleSet here in ScheduleTypeRegistry.cpp:

// className, scheduleDisplayName, scheduleRelationshipName, isContinuous, unitType, lowerLimitValue, upperLimitValue;
{"DefaultScheduleSet","Hours of Operation","hoursofOperationSchedule",false,"Availability",0.0,1.0},
{"DefaultScheduleSet","Number of People","numberofPeopleSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","People Activity Level","peopleActivityLevelSchedule",true,"ActivityLevel",0.0,OptionalDouble()},
{"DefaultScheduleSet","Lighting","lightingSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Electric Equipment","electricEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Gas Equipment","gasEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Hot Water Equipment","hotWaterEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Infiltration","infiltrationSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Steam Equipment","steamEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Other Equipment","otherEquipmentSchedule",true,"",OptionalDouble(),OptionalDouble()},

So indeeed, none have a unitType == "Temperature"


If you're curious:

TL;DR: DefaultScheduleSet will never accept any schedule with a "Temperature" unit type (which is what the default Temperature ScheduleTypeLimits has).


Explanation: Enforcing of ScheduleTypeLimits in OpenStudio

OpenStudio enforces correspondence of the ScheduleTypeLimits when you try to set schedules.

  • If you try to assign a Schedule that does not have a ScheduleTypeLimits, it'll create and assign one for you (it'll always work)
  • If you try to assign a Schedule that has a ScheduleTypeLimits, it will check whether it's compatible, that is check the lower/upper limits and the Unit Type (it doesn't care whether it's continuous or discrete).

You can see the expected schedule type limits for the DefaultScheduleSet here in ScheduleTypeRegistry.cpp:

// className, scheduleDisplayName, scheduleRelationshipName, isContinuous, unitType, lowerLimitValue, upperLimitValue;
{"DefaultScheduleSet","Hours of Operation","hoursofOperationSchedule",false,"Availability",0.0,1.0},
{"DefaultScheduleSet","Number of People","numberofPeopleSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","People Activity Level","peopleActivityLevelSchedule",true,"ActivityLevel",0.0,OptionalDouble()},
{"DefaultScheduleSet","Lighting","lightingSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Electric Equipment","electricEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Gas Equipment","gasEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Hot Water Equipment","hotWaterEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Infiltration","infiltrationSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Steam Equipment","steamEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Other Equipment","otherEquipmentSchedule",true,"",OptionalDouble(),OptionalDouble()},

So indeeed, none have a unitType == "Temperature"


Optional reading

Source code

If you're curious:


Demo using Ruby bindings

And if you need more proof, here's a demo using the ruby bindings:

I get a model, and retrieve a Temperature schedule.

[13] model(main)> sch = m.getScheduleRulesetByName("Medium Office Heating Setpoint Schedule").get
=> #<OpenStudio::Model::ScheduleRuleset:0x000055a9f1cf8398 @__swigtype__="_p_openstudio__model__ScheduleRuleset">
[9] model(main)> puts sch
OS:Schedule:Ruleset,
  {fb99be89-78c9-4473-a724-c19078c7a311}, !- Handle
  Medium Office Heating Setpoint Schedule, !- Name
  {4d58c6f5-7a17-476e-8c71-4472d4190115}, !- Schedule Type Limits Name
  {4201662b-b6bd-4cbb-98ec-b7e57b8406e0}, !- Default Day Schedule Name
  ,                                       !- Summer Design Day Schedule Name
  {8e5f2044-0cc5-4ff0-aeb6-0cbef560f87b}; !- Winter Design Day Schedule Name

=> nil
[14] model(main)> puts sch.scheduleTypeLimits.get
OS:ScheduleTypeLimits,
  {4d58c6f5-7a17-476e-8c71-4472d4190115}, !- Handle
  Temperature,                            !- Name
  -60,                                    !- Lower Limit Value
  200,                                    !- Upper Limit Value
  CONTINUOUS,                             !- Numeric Type
  Temperature;                            !- Unit Type

Now I create a DefaultScheduleSet and tries to assign this schedule to every slot in it:

[15] model(main)> d = DefaultScheduleSet.new(m)


[16] model(main)> d.setHoursofOperationSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Hours of Operation=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[17] model(main)> d.setNumberofPeopleSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Number of People=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[18] model(main)> d.setPeopleActivityLevelSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule People Activity Level=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[19] model(main)> d.setLightingSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Lighting=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[20] model(main)> d.setElectricEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Electric Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[21] model(main)> d.setGasEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Gas Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[22] model(main)> d.setHotWaterEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Hot Water Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[23] model(main)> d.setInfiltrationSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Infiltration=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[24] model(main)> d.setSteamEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Steam Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[25] model(main)> d.setOtherEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Other Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits

TL;DR: DefaultScheduleSet will never accept any schedule with a "Temperature" unit type (which is what the default Temperature ScheduleTypeLimits has).


Explanation: Enforcing of ScheduleTypeLimits in OpenStudio

OpenStudio enforces correspondence of the ScheduleTypeLimits when you try to set schedules.

  • If you try to assign a Schedule that does not have a ScheduleTypeLimits, it'll create and assign one for you (it'll always work)
  • If you try to assign a Schedule that has a ScheduleTypeLimits, it will check whether it's compatible, that is check the lower/upper limits and the Unit Type (it doesn't care whether it's continuous or discrete).

You can see the expected schedule type limits for the DefaultScheduleSet here in ScheduleTypeRegistry.cpp:

// className, scheduleDisplayName, scheduleRelationshipName, isContinuous, unitType, lowerLimitValue, upperLimitValue;
{"DefaultScheduleSet","Hours of Operation","hoursofOperationSchedule",false,"Availability",0.0,1.0},
{"DefaultScheduleSet","Number of People","numberofPeopleSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","People Activity Level","peopleActivityLevelSchedule",true,"ActivityLevel",0.0,OptionalDouble()},
{"DefaultScheduleSet","Lighting","lightingSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Electric Equipment","electricEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Gas Equipment","gasEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Hot Water Equipment","hotWaterEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Infiltration","infiltrationSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Steam Equipment","steamEquipmentSchedule",true,"",0.0,1.0},
{"DefaultScheduleSet","Other Equipment","otherEquipmentSchedule",true,"",OptionalDouble(),OptionalDouble()},

So indeeed, none have a unitType == "Temperature"


Optional reading

Source code

If you're curious:


Demo using Ruby bindings

And if you need more proof, here's a demo using the ruby bindings:

I get a model, and retrieve a Temperature schedule.

[13] model(main)> sch = m.getScheduleRulesetByName("Medium Office Heating Setpoint Schedule").get
=> #<OpenStudio::Model::ScheduleRuleset:0x000055a9f1cf8398 @__swigtype__="_p_openstudio__model__ScheduleRuleset">
[9] model(main)> puts sch
OS:Schedule:Ruleset,
  {fb99be89-78c9-4473-a724-c19078c7a311}, !- Handle
  Medium Office Heating Setpoint Schedule, !- Name
  {4d58c6f5-7a17-476e-8c71-4472d4190115}, !- Schedule Type Limits Name
  {4201662b-b6bd-4cbb-98ec-b7e57b8406e0}, !- Default Day Schedule Name
  ,                                       !- Summer Design Day Schedule Name
  {8e5f2044-0cc5-4ff0-aeb6-0cbef560f87b}; !- Winter Design Day Schedule Name

=> nil
[14] model(main)> puts sch.scheduleTypeLimits.get
OS:ScheduleTypeLimits,
  {4d58c6f5-7a17-476e-8c71-4472d4190115}, !- Handle
  Temperature,                            !- Name
  -60,                                    !- Lower Limit Value
  200,                                    !- Upper Limit Value
  CONTINUOUS,                             !- Numeric Type
  Temperature;                            !- Unit Type

Now I create a DefaultScheduleSet and tries to assign this schedule to every slot in it:

[15] model(main)> d = DefaultScheduleSet.new(m)
 

Note: to get the list of methods d.methods.grep(/^set.*Schedule/i).each {|m| puts "d.#{m.to_s}(sch)"}

[16] model(main)> d.setHoursofOperationSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Hours of Operation=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[17] model(main)> d.setNumberofPeopleSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Number of People=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[18] model(main)> d.setPeopleActivityLevelSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule People Activity Level=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[19] model(main)> d.setLightingSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Lighting=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[20] model(main)> d.setElectricEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Electric Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[21] model(main)> d.setGasEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Gas Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[22] model(main)> d.setHotWaterEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Hot Water Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[23] model(main)> d.setInfiltrationSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Infiltration=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[24] model(main)> d.setSteamEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Steam Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits
=> false
[25] model(main)> d.setOtherEquipmentSchedule(sch)
[openstudio.model.ModelObject] <0> For Object of type 'OS:DefaultScheduleSet' and named 'Default Schedule Set 1' cannot set Schedule Other Equipment=Medium Office Heating Setpoint Schedule because it has an incompatible ScheduleTypeLimits