openstudio-standards 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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