openstudio-standards 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAE90120042007LargeHotel.osm +55 -55
  3. data/data/geometry/ASHRAE9012010LargeHotel.osm +56 -56
  4. data/data/geometry/ASHRAE9012010SuperMarket.osm +153 -153
  5. data/data/geometry/ASHRAE9012013Hospital.osm +815 -874
  6. data/data/geometry/ASHRAE9012013LargeHotel.osm +56 -56
  7. data/data/geometry/ASHRAE9012013LargeOffice.osm +12 -3
  8. data/data/geometry/ASHRAE9012013MediumOffice.osm +8 -16
  9. data/data/geometry/ASHRAE9012013MidriseApartment.osm +792 -792
  10. data/data/geometry/ASHRAE9012013SuperMarket.osm +152 -152
  11. data/data/geometry/ASHRAEHospital.osm +815 -874
  12. data/data/geometry/ASHRAELargeOffice.osm +58 -49
  13. data/data/geometry/ASHRAEMediumOffice.osm +12 -3
  14. data/data/geometry/ASHRAEMidriseApartment.osm +792 -792
  15. data/data/geometry/ASHRAESmallOffice.osm +4 -4
  16. data/data/geometry/ASHRAESuperMarket.osm +152 -152
  17. data/data/geometry/DOERefLargeOffice.osm +38 -29
  18. data/data/geometry/DOERefMidriseApartment.osm +792 -792
  19. data/data/geometry/DOERefPre1980SmallOffice.osm +4 -4
  20. data/data/geometry/DOERefSmallHotel.osm +4 -4
  21. data/data/geometry/DOERefWarehouse.osm +80 -30
  22. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  23. data/data/standards/OpenStudio_Standards_construction_sets.json +582 -238
  24. data/data/standards/OpenStudio_Standards_constructions.json +14 -14
  25. data/data/standards/OpenStudio_Standards_hvac_inference.json +741 -0
  26. data/data/standards/OpenStudio_Standards_prototype_inputs.json +12 -12
  27. data/data/standards/OpenStudio_Standards_schedules.json +1479 -622
  28. data/data/standards/OpenStudio_Standards_size_category.json +67 -0
  29. data/data/standards/OpenStudio_Standards_space_types.json +2640 -2032
  30. data/lib/openstudio-standards.rb +1 -0
  31. data/lib/openstudio-standards/btap/btap.rb +0 -1
  32. data/lib/openstudio-standards/btap/simmanager.rb +3 -10
  33. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +24 -0
  34. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +29 -4
  35. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +68 -3
  37. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +1 -1
  38. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +36 -0
  39. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +743 -730
  40. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +7 -2
  41. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +1 -1
  42. data/lib/openstudio-standards/standards/Standards.Model.rb +95 -170
  43. data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
  44. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +34 -1
  45. data/lib/openstudio-standards/standards/standard.rb +2 -0
  46. data/lib/openstudio-standards/version.rb +1 -1
  47. metadata +5 -2
@@ -843,8 +843,13 @@ class Standard
843
843
 
844
844
  # rename zone equipment list objects
845
845
  model.getZoneHVACEquipmentLists.each do |obj|
846
- zone = obj.thermalZone
847
- obj.setName("#{zone.name.to_s} Zone HVAC Equipment List")
846
+ begin
847
+ zone = obj.thermalZone
848
+ obj.setName("#{zone.name.to_s} Zone HVAC Equipment List")
849
+ rescue StandardError => e
850
+ OpenStudio.logFree(OpenStudio::Warn, "openstudio.model.Model", "Removing ZoneHVACEquipmentList #{obj.name}; missing thermal zone.")
851
+ obj.remove
852
+ end
848
853
  end
849
854
 
850
855
  return model
@@ -840,7 +840,7 @@ class Standard
840
840
  'climate_zone' => climate_zone,
841
841
  'data_center' => is_dc
842
842
  }
843
- econ_limits = model_find_object(standards_data['economizers'], search_criteria, nil)
843
+ econ_limits = model_find_object(standards_data['economizers'], search_criteria)
844
844
  if econ_limits.nil?
845
845
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "Cannot find economizer limits for #{template}, #{climate_zone}, assuming no economizer required.")
846
846
  return economizer_required
@@ -1183,7 +1183,11 @@ class Standard
1183
1183
  # @param array_of_zones [Array] an array of Hashes for each zone, with the keys 'zone',
1184
1184
  def model_eliminate_outlier_zones(model, array_of_zones, key_to_inspect, tolerance, field_name, units)
1185
1185
  # Sort the zones by the desired key
1186
- array_of_zones = array_of_zones.sort_by { |hsh| hsh[key_to_inspect] }
1186
+ begin
1187
+ array_of_zones = array_of_zones.sort_by {|hsh| hsh[key_to_inspect]}
1188
+ rescue ArgumentError => e
1189
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', "Unable to sort array_of_zones by #{key_to_inspect} due to #{e.message}, defaulting to order that was passed")
1190
+ end
1187
1191
 
1188
1192
  # Calculate the area-weighted average
1189
1193
  total = 0.0
@@ -1560,50 +1564,23 @@ class Standard
1560
1564
  # @param search_criteria [Hash] hash of search criteria
1561
1565
  # @param capacity [Double] capacity of the object in question. If capacity is supplied,
1562
1566
  # the objects will only be returned if the specified capacity is between the minimum_capacity and maximum_capacity values.
1567
+ # @param date [<OpenStudio::Date>] date of the object in question. If date is supplied,
1568
+ # the objects will only be returned if the specified date is between the start_date and end_date.
1569
+ # @param area [Double] area of the object in question. If area is supplied,
1570
+ # the objects will only be returned if the specified area is between the minimum_area and maximum_area values.
1571
+ # @param num_floors [Double] capacity of the object in question. If num_floors is supplied,
1572
+ # the objects will only be returned if the specified num_floors is between the minimum_floors and maximum_floors values.
1563
1573
  # @return [Array] returns an array of hashes, one hash per object. Array is empty if no results.
1564
1574
  # @example Find all the schedule rules that match the name
1565
- # rules = model_find_objects(self, standards_data['schedules'], {'name'=>schedule_name})
1566
- # if rules.size == 0
1567
- # OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Cannot find data for schedule: #{schedule_name}, will not be created.")
1568
- # return false #TODO change to return empty optional schedule:ruleset?
1575
+ # rules = model_find_objects(standards_data['schedules'], 'name' => schedule_name)
1576
+ # if rules.size.zero?
1577
+ # OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Cannot find data for schedule: #{schedule_name}, will not be created.")
1578
+ # return false
1569
1579
  # end
1570
- def model_find_objects(hash_of_objects, search_criteria, capacity = nil)
1571
- # matching_objects = hash_of_objects.clone
1572
- # #new
1573
- # puts "searching"
1574
- # puts search_criteria
1575
- # raise ("hash of objects is nil or empty. #{hash_of_objects}") if hash_of_objects.nil? || hash_of_objects.empty? || matching_objects[0].nil?
1576
- #
1577
- # search_criteria.each do |key,value|
1578
- # puts "#{key}-#{value}"
1579
- # puts matching_objects.size
1580
- # #if size has already reduced to zero. Get out of loop.
1581
- # break if matching_objects.size == 0
1582
- # #if there are no keys that match, skip search... (This seems odd)
1583
- # next unless matching_objects[0].has_key?(key)
1584
- # matching_objects.select!{ |k| k[key] == value }
1585
- # end
1586
- # if not capacity.nil?
1587
- # puts "Capacity = #{capacity}"
1588
- # capacity = capacity + (capacity * 0.01) if capacity == capacity.round
1589
- # matching_objects.select!{|k| capacity.to_f > k['minimum_capacity'].to_f}
1590
- # matching_objects.select!{|k| capacity.to_f <= k['maximum_capacity'].to_f}
1591
- # end
1592
- #
1593
- #
1594
- # # Check the number of matching objects found
1595
- # if matching_objects.size == 0
1596
- # OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Find objects search criteria returned no results. Search criteria: #{search_criteria}, capacity = #{capacity}. Called from #{caller(0)[1]}.")
1597
- #
1598
- # end
1599
- # new_matching_objects = matching_objects
1600
-
1601
- # old
1602
- desired_object = nil
1603
- search_criteria_matching_objects = []
1604
- matching_objects = []
1580
+ def model_find_objects(hash_of_objects, search_criteria, capacity = nil, date = nil, area = nil, num_floors = nil)
1605
1581
 
1606
- if hash_of_objects.is_a?(Hash) and hash_of_objects.key?('table')
1582
+ matching_objects = []
1583
+ if hash_of_objects.is_a?(Hash) && hash_of_objects.key?('table')
1607
1584
  hash_of_objects = hash_of_objects['table']
1608
1585
  end
1609
1586
 
@@ -1621,64 +1598,77 @@ class Standard
1621
1598
  end
1622
1599
  end
1623
1600
  # Skip objects that don't meet all search criteria
1624
- next if meets_all_search_criteria == false
1601
+ next unless meets_all_search_criteria
1625
1602
  # If made it here, object matches all search criteria
1626
- search_criteria_matching_objects << object
1603
+ matching_objects << object
1627
1604
  end
1628
1605
 
1629
1606
  # If capacity was specified, narrow down the matching objects
1630
- if capacity.nil?
1631
- matching_objects = search_criteria_matching_objects
1632
- else
1607
+ unless capacity.nil?
1608
+ # Skip objects that don't have fields for minimum_capacity and maximum_capacity
1609
+ matching_objects = matching_objects.reject { |object| !object.key?('minimum_capacity') || !object.key?('maximum_capacity') }
1610
+
1611
+ # Skip objects that don't have values specified for minimum_capacity and maximum_capacity
1612
+ matching_objects = matching_objects.reject { |object| object['minimum_capacity'].nil? || object['maximum_capacity'].nil? }
1613
+
1633
1614
  # Round up if capacity is an integer
1634
1615
  if capacity == capacity.round
1635
1616
  capacity += (capacity * 0.01)
1636
1617
  end
1637
- search_criteria_matching_objects.each do |object|
1638
- # Skip objects that don't have fields for minimum_capacity and maximum_capacity
1639
- next if !object.key?('minimum_capacity') || !object.key?('maximum_capacity')
1640
- # Skip objects that don't have values specified for minimum_capacity and maximum_capacity
1641
- next if object['minimum_capacity'].nil? || object['maximum_capacity'].nil?
1642
- # Skip objects whose the minimum capacity is below the specified capacity
1643
- next if capacity.to_f <= object['minimum_capacity'].to_f
1644
- # Skip objects whose max
1645
- next if capacity.to_f > object['maximum_capacity'].to_f
1646
- # Found a matching object
1647
- matching_objects << object
1648
- end
1649
- # If no object was found, round the capacity down a little
1650
- # to avoid issues where the number fell between the limits
1651
- # in the json file.
1652
- if matching_objects.size.zero?
1618
+ # Skip objects whose the minimum capacity is below or maximum capacity above the specified capacity
1619
+ matching_capacity_objects = matching_objects.reject { |object| capacity.to_f <= object['minimum_capacity'].to_f || capacity.to_f > object['maximum_capacity'].to_f }
1620
+
1621
+ # If no object was found, round the capacity down in case the number fell between the limits in the json file.
1622
+ if matching_capacity_objects.size.zero?
1653
1623
  capacity *= 0.99
1654
- search_criteria_matching_objects.each do |object|
1655
- # Skip objects that don't have fields for minimum_capacity and maximum_capacity
1656
- next if !object.key?('minimum_capacity') || !object.key?('maximum_capacity')
1657
- # Skip objects that don't have values specified for minimum_capacity and maximum_capacity
1658
- next if object['minimum_capacity'].nil? || object['maximum_capacity'].nil?
1659
- # Skip objects whose the minimum capacity is below the specified capacity
1660
- next if capacity <= object['minimum_capacity'].to_f
1661
- # Skip objects whose max
1662
- next if capacity > object['maximum_capacity'].to_f
1663
- # Found a matching object
1664
- matching_objects << object
1665
- end
1624
+ # Skip objects whose minimum capacity is below or maximum capacity above the specified capacity
1625
+ matching_objects = matching_objects.reject { |object| capacity.to_f <= object['minimum_capacity'].to_f || capacity.to_f > object['maximum_capacity'].to_f }
1626
+ else
1627
+ matching_objects = matching_capacity_objects
1666
1628
  end
1667
1629
  end
1668
1630
 
1631
+ # If date was specified, narrow down the matching objects
1632
+ unless date.nil?
1633
+ # Skip objects that don't have fields for start_date and end_date
1634
+ matching_objects = matching_objects.reject { |object| !object.key?('start_date') || !object.key?('end_date') }
1635
+
1636
+ # Skip objects whose start date is earlier than the specified date
1637
+ matching_objects = matching_objects.reject { |object| date <= Date.parse(object['start_date']) }
1638
+
1639
+ # Skip objects whose end date is later than the specified date
1640
+ matching_objects = matching_objects.reject { |object| date > Date.parse(object['end_date']) }
1641
+ end
1642
+
1643
+ # If area was specified, narrow down the matching objects
1644
+ unless area.nil?
1645
+ # Skip objects that don't have fields for minimum_area and maximum_area
1646
+ matching_objects = matching_objects.reject { |object| !object.key?('minimum_area') || !object.key?('maximum_area') }
1647
+
1648
+ # Skip objects that don't have values specified for minimum_area and maximum_area
1649
+ matching_objects = matching_objects.reject { |object| object['minimum_area'].nil? || object['maximum_area'].nil? }
1650
+
1651
+ # Skip objects whose minimum area is below or maximum area is above area
1652
+ matching_objects = matching_objects.reject { |object| area.to_f <= object['minimum_area'].to_f || area.to_f > object['maximum_area'].to_f }
1653
+ end
1654
+
1655
+ # If area was specified, narrow down the matching objects
1656
+ unless num_floors.nil?
1657
+ # Skip objects that don't have fields for minimum_floors and maximum_floors
1658
+ matching_objects = matching_objects.reject { |object| !object.key?('minimum_floors') || !object.key?('maximum_floors') }
1659
+
1660
+ # Skip objects that don't have values specified for minimum_floors and maximum_floors
1661
+ matching_objects = matching_objects.reject { |object| object['minimum_floors'].nil? || object['maximum_floors'].nil? }
1662
+
1663
+ # Skip objects whose minimum floors is below or maximum floors is above num_floors
1664
+ matching_objects = matching_objects.reject { |object| num_floors.to_f < object['minimum_floors'].to_f || num_floors.to_f > object['maximum_floors'].to_f }
1665
+ end
1666
+
1669
1667
  # Check the number of matching objects found
1670
1668
  if matching_objects.size.zero?
1671
- desired_object = nil
1672
- # OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Find objects search criteria returned no results. Search criteria: #{search_criteria}, capacity = #{capacity}. Called from #{caller(0)[1]}.")
1669
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Model', "Find objects search criteria returned no results. Search criteria: #{search_criteria}. Called from #{caller(0)[1]}.")
1673
1670
  end
1674
1671
 
1675
- # if new_matching_objects != matching_objects
1676
- # puts "new..."
1677
- # puts new_matching_objects
1678
- # puts "is not.."
1679
- # puts matching_objects
1680
- # raise ("Hell")
1681
- # end
1682
1672
  return matching_objects
1683
1673
  end
1684
1674
 
@@ -1688,8 +1678,13 @@ class Standard
1688
1678
  # @param hash_of_objects [Hash] hash of objects to search through
1689
1679
  # @param search_criteria [Hash] hash of search criteria
1690
1680
  # @param capacity [Double] capacity of the object in question. If capacity is supplied,
1691
- # the objects will only be returned if the specified capacity is between
1692
- # the minimum_capacity and maximum_capacity values.
1681
+ # the objects will only be returned if the specified capacity is between the minimum_capacity and maximum_capacity values.
1682
+ # @param date [<OpenStudio::Date>] date of the object in question. If date is supplied,
1683
+ # the objects will only be returned if the specified date is between the start_date and end_date.
1684
+ # @param area [Double] area of the object in question. If area is supplied,
1685
+ # the objects will only be returned if the specified area is between the minimum_area and maximum_area values.
1686
+ # @param num_floors [Double] capacity of the object in question. If num_floors is supplied,
1687
+ # the objects will only be returned if the specified num_floors is between the minimum_floors and maximum_floors values.
1693
1688
  # @return [Hash] Return tbe first matching object hash if successful, nil if not.
1694
1689
  # @example Find the motor that meets these size criteria
1695
1690
  # search_criteria = {
@@ -1697,96 +1692,15 @@ class Standard
1697
1692
  # 'number_of_poles' => 4.0,
1698
1693
  # 'type' => 'Enclosed',
1699
1694
  # }
1700
- # motor_properties = self.model.find_object(motors, search_criteria, 2.5)
1701
- def model_find_object(hash_of_objects, search_criteria, capacity = nil, date = nil)
1702
- # new_matching_objects = model_find_objects(self, hash_of_objects, search_criteria, capacity)
1703
-
1704
- if hash_of_objects.is_a?(Hash) and hash_of_objects.key?('table')
1705
- hash_of_objects = hash_of_objects['table']
1706
- end
1707
- desired_object = nil
1708
- search_criteria_matching_objects = []
1709
- matching_objects = []
1710
-
1711
- # Compare each of the objects against the search criteria
1712
- hash_of_objects.each do |object|
1713
- meets_all_search_criteria = true
1714
- search_criteria.each do |key, value|
1715
- # Don't check non-existent search criteria
1716
- next unless object.key?(key)
1717
- # Stop as soon as one of the search criteria is not met
1718
- # 'Any' is a special key that matches anything
1719
- unless object[key] == value || object[key] == 'Any'
1720
- meets_all_search_criteria = false
1721
- break
1722
- end
1723
- end
1724
- # Skip objects that don't meet all search criteria
1725
- next unless meets_all_search_criteria
1726
- # If made it here, object matches all search criteria
1727
- search_criteria_matching_objects << object
1728
- end
1729
-
1730
- # If capacity was specified, narrow down the matching objects
1731
- if capacity.nil?
1732
- matching_objects = search_criteria_matching_objects
1733
- else
1734
- # Round up if capacity is an integer
1735
- if capacity == capacity.round
1736
- capacity += (capacity * 0.01)
1737
- end
1738
- search_criteria_matching_objects.each do |object|
1739
- # Skip objects that don't have fields for minimum_capacity and maximum_capacity
1740
- next if !object.key?('minimum_capacity') || !object.key?('maximum_capacity')
1741
- # Skip objects that don't have values specified for minimum_capacity and maximum_capacity
1742
- next if object['minimum_capacity'].nil? || object['maximum_capacity'].nil?
1743
- # Skip objects whose the minimum capacity is below the specified capacity
1744
- next if capacity <= object['minimum_capacity'].to_f
1745
- # Skip objects whose max
1746
- next if capacity > object['maximum_capacity'].to_f
1747
- # Found a matching object
1748
- matching_objects << object
1749
- end
1750
- # If no object was found, round the capacity down a little
1751
- # to avoid issues where the number fell between the limits
1752
- # in the json file.
1753
- if matching_objects.size.zero?
1754
- capacity *= 0.99
1755
- search_criteria_matching_objects.each do |object|
1756
- # Skip objects that don't have fields for minimum_capacity and maximum_capacity
1757
- next if !object.key?('minimum_capacity') || !object.key?('maximum_capacity')
1758
- # Skip objects that don't have values specified for minimum_capacity and maximum_capacity
1759
- next if object['minimum_capacity'].nil? || object['maximum_capacity'].nil?
1760
- # Skip objects whose the minimum capacity is below the specified capacity
1761
- next if capacity <= object['minimum_capacity'].to_f
1762
- # Skip objects whose max
1763
- next if capacity > object['maximum_capacity'].to_f
1764
- # Found a matching object
1765
- matching_objects << object
1766
- end
1767
- end
1768
- end
1695
+ # motor_properties = self.model.find_object(motors, search_criteria, capacity: 2.5)
1696
+ def model_find_object(hash_of_objects, search_criteria, capacity = nil, date = nil, area = nil, num_floors = nil)
1769
1697
 
1770
- # If date was specified, narrow down the matching objects
1771
- unless date.nil?
1772
- date_matching_objects = []
1773
- matching_objects.each do |object|
1774
- # Skip objects that don't have fields for minimum_capacity and maximum_capacity
1775
- next if !object.key?('start_date') || !object.key?('end_date')
1776
- # Skip objects whose the start date is earlier than the specified date
1777
- next if date <= Date.parse(object['start_date'])
1778
- # Skip objects whose end date is beyond the specified date
1779
- next if date > Date.parse(object['end_date'])
1780
- # Found a matching object
1781
- date_matching_objects << object
1782
- end
1783
- matching_objects = date_matching_objects
1784
- end
1698
+ matching_objects = model_find_objects(hash_of_objects, search_criteria, capacity, date, area, num_floors)
1785
1699
 
1786
1700
  # Check the number of matching objects found
1787
1701
  if matching_objects.size.zero?
1788
1702
  desired_object = nil
1789
- # OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Find object search criteria returned no results. Search criteria: #{search_criteria}, capacity = #{capacity}. Called from #{caller(0)[1]}")
1703
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Model', "Find object search criteria returned no results. Search criteria: #{search_criteria}. Called from #{caller(0)[1]}")
1790
1704
  elsif matching_objects.size == 1
1791
1705
  desired_object = matching_objects[0]
1792
1706
  else
@@ -2219,6 +2133,17 @@ class Standard
2219
2133
 
2220
2134
  end
2221
2135
 
2136
+ # If the construction is fenestration,
2137
+ # also set the frame type for use in future lookups
2138
+ if construction.isFenestration
2139
+ case standards_construction_type
2140
+ when 'Metal framing (all other)'
2141
+ standards_info.setFenestrationFrameType('Metal Framing')
2142
+ when 'Nonmetal framing (all)'
2143
+ standards_info.setFenestrationFrameType('Non-Metal Framing')
2144
+ end
2145
+ end
2146
+
2222
2147
  # If the construction has a skylight framing material specified,
2223
2148
  # get the skylight frame material properties and add frame to
2224
2149
  # all skylights in the model.
@@ -96,7 +96,7 @@ class Standard
96
96
 
97
97
  # Make sure there is one floor surface
98
98
  if floor_surface.nil?
99
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Space', "Could not find a floor in space #{name.get}, cannot determine daylighted areas.")
99
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Space', "Could not find a floor in space #{space.name}, cannot determine daylighted areas.")
100
100
  return result
101
101
  end
102
102
 
@@ -38,7 +38,7 @@ class NRELZNEReady2017 < ASHRAE901
38
38
 
39
39
  # logic for multizone VAV Reheat systems
40
40
  if air_loop_hvac_multizone_vav_system?(air_loop_hvac) && air_loop_hvac_terminal_reheat?(air_loop_hvac)
41
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "Applying multizone VAV Reheat system controls.")
41
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', 'Applying multizone VAV Reheat system controls.')
42
42
 
43
43
  # economizer controls
44
44
  air_loop_hvac_apply_economizer_limits(air_loop_hvac, climate_zone)
@@ -80,6 +80,27 @@ class NRELZNEReady2017 < ASHRAE901
80
80
  end
81
81
  end
82
82
 
83
+ # Unoccupied shutdown
84
+ if air_loop_hvac_unoccupied_fan_shutoff_required?(air_loop_hvac)
85
+ air_loop_hvac_enable_unoccupied_fan_shutoff(air_loop_hvac)
86
+ else
87
+ air_loop_hvac.setAvailabilitySchedule(air_loop_hvac.model.alwaysOnDiscreteSchedule)
88
+ end
89
+
90
+ # Motorized OA damper
91
+ if air_loop_hvac_motorized_oa_damper_required?(air_loop_hvac, climate_zone)
92
+ # Assume that the availability schedule has already been
93
+ # set to reflect occupancy and use this for the OA damper.
94
+ air_loop_hvac_add_motorized_oa_damper(air_loop_hvac, 0.15, air_loop_hvac.availabilitySchedule)
95
+ else
96
+ air_loop_hvac_remove_motorized_oa_damper(air_loop_hvac)
97
+ end
98
+
99
+ # Optimum Start
100
+ if air_loop_hvac_optimum_start_required?(air_loop_hvac)
101
+ air_loop_hvac_enable_optimum_start(air_loop_hvac)
102
+ end
103
+
83
104
  end
84
105
 
85
106
  # Determine whether or not this system is required to have an economizer.
@@ -419,4 +440,16 @@ class NRELZNEReady2017 < ASHRAE901
419
440
  return is_sat_reset_required
420
441
  end
421
442
  end
443
+
444
+ # Determine if a motorized OA damper is required
445
+ def air_loop_hvac_motorized_oa_damper_required?(air_loop_hvac, climate_zone)
446
+ motorized_oa_damper_required = true
447
+ return motorized_oa_damper_required
448
+ end
449
+
450
+ # Determines if optimum start control is required.
451
+ def air_loop_hvac_optimum_start_required?(air_loop_hvac)
452
+ opt_start_required = true
453
+ return opt_start_required
454
+ end
422
455
  end
@@ -106,6 +106,8 @@ class Standard
106
106
  standards_files << 'OpenStudio_Standards_refrigerated_cases.json'
107
107
  standards_files << 'OpenStudio_Standards_walkin_refrigeration.json'
108
108
  standards_files << 'OpenStudio_Standards_refrigeration_compressors.json'
109
+ standards_files << 'OpenStudio_Standards_hvac_inference.json'
110
+ standards_files << 'OpenStudio_Standards_size_category.json'
109
111
  # standards_files << 'OpenStudio_Standards_unitary_hps.json'
110
112
  # Combine the data from the JSON files into a single hash
111
113
  top_dir = File.expand_path('../../..', File.dirname(__FILE__))
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.2.3'.freeze
16
+ VERSION = '0.2.4'.freeze
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Parker
@@ -21,7 +21,7 @@ authors:
21
21
  autorequire:
22
22
  bindir: bin
23
23
  cert_chain: []
24
- date: 2018-09-04 00:00:00.000000000 Z
24
+ date: 2018-09-29 00:00:00.000000000 Z
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: minitest-reporters
@@ -637,6 +637,7 @@ files:
637
637
  - data/standards/OpenStudio_Standards_heat_pumps.json
638
638
  - data/standards/OpenStudio_Standards_heat_pumps_heating.json
639
639
  - data/standards/OpenStudio_Standards_heat_rejection.json
640
+ - data/standards/OpenStudio_Standards_hvac_inference.json
640
641
  - data/standards/OpenStudio_Standards_materials.json
641
642
  - data/standards/OpenStudio_Standards_motors.json
642
643
  - data/standards/OpenStudio_Standards_necb_climate_zones.json
@@ -648,6 +649,7 @@ files:
648
649
  - data/standards/OpenStudio_Standards_refrigerated_cases.json
649
650
  - data/standards/OpenStudio_Standards_refrigeration_compressors.json
650
651
  - data/standards/OpenStudio_Standards_schedules.json
652
+ - data/standards/OpenStudio_Standards_size_category.json
651
653
  - data/standards/OpenStudio_Standards_space_types.json
652
654
  - data/standards/OpenStudio_Standards_standards.json
653
655
  - data/standards/OpenStudio_Standards_templates.json
@@ -1371,6 +1373,7 @@ files:
1371
1373
  - lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb
1372
1374
  - lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb
1373
1375
  - lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb
1376
+ - lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb
1374
1377
  - lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb
1375
1378
  - lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb
1376
1379
  - lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb