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.
- 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
|