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.
- checksums.yaml +4 -4
- data/data/geometry/ASHRAE90120042007LargeHotel.osm +55 -55
- data/data/geometry/ASHRAE9012010LargeHotel.osm +56 -56
- data/data/geometry/ASHRAE9012010SuperMarket.osm +153 -153
- data/data/geometry/ASHRAE9012013Hospital.osm +815 -874
- data/data/geometry/ASHRAE9012013LargeHotel.osm +56 -56
- data/data/geometry/ASHRAE9012013LargeOffice.osm +12 -3
- data/data/geometry/ASHRAE9012013MediumOffice.osm +8 -16
- data/data/geometry/ASHRAE9012013MidriseApartment.osm +792 -792
- data/data/geometry/ASHRAE9012013SuperMarket.osm +152 -152
- data/data/geometry/ASHRAEHospital.osm +815 -874
- data/data/geometry/ASHRAELargeOffice.osm +58 -49
- data/data/geometry/ASHRAEMediumOffice.osm +12 -3
- data/data/geometry/ASHRAEMidriseApartment.osm +792 -792
- data/data/geometry/ASHRAESmallOffice.osm +4 -4
- data/data/geometry/ASHRAESuperMarket.osm +152 -152
- data/data/geometry/DOERefLargeOffice.osm +38 -29
- data/data/geometry/DOERefMidriseApartment.osm +792 -792
- data/data/geometry/DOERefPre1980SmallOffice.osm +4 -4
- data/data/geometry/DOERefSmallHotel.osm +4 -4
- data/data/geometry/DOERefWarehouse.osm +80 -30
- data/data/standards/OpenStudio_Standards.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_construction_sets.json +582 -238
- data/data/standards/OpenStudio_Standards_constructions.json +14 -14
- data/data/standards/OpenStudio_Standards_hvac_inference.json +741 -0
- data/data/standards/OpenStudio_Standards_prototype_inputs.json +12 -12
- data/data/standards/OpenStudio_Standards_schedules.json +1479 -622
- data/data/standards/OpenStudio_Standards_size_category.json +67 -0
- data/data/standards/OpenStudio_Standards_space_types.json +2640 -2032
- data/lib/openstudio-standards.rb +1 -0
- data/lib/openstudio-standards/btap/btap.rb +0 -1
- data/lib/openstudio-standards/btap/simmanager.rb +3 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +24 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +29 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +68 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +36 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +743 -730
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +7 -2
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +95 -170
- data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +34 -1
- data/lib/openstudio-standards/standards/standard.rb +2 -0
- data/lib/openstudio-standards/version.rb +1 -1
- 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
|
-
|
847
|
-
|
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
|
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
|
-
|
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(
|
1566
|
-
# if rules.size
|
1567
|
-
# OpenStudio
|
1568
|
-
# return false
|
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
|
-
|
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
|
1601
|
+
next unless meets_all_search_criteria
|
1625
1602
|
# If made it here, object matches all search criteria
|
1626
|
-
|
1603
|
+
matching_objects << object
|
1627
1604
|
end
|
1628
1605
|
|
1629
1606
|
# If capacity was specified, narrow down the matching objects
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
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
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
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
|
-
|
1655
|
-
|
1656
|
-
|
1657
|
-
|
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
|
-
|
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
|
-
#
|
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
|
-
|
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
|
-
|
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
|
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',
|
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__))
|
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.
|
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-
|
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
|