feat: Initial filter pressure drop views, calculations need implemented.

This commit is contained in:
2025-03-02 21:51:52 -05:00
parent a8022ec80a
commit 67488e06a9
17 changed files with 610 additions and 97 deletions

View File

@@ -1,8 +1,10 @@
public enum ClimateZone: String, Codable, Equatable, Sendable {
case dry
public enum ClimateZone: String, CaseIterable, Codable, Equatable, Sendable {
// NOTE: Keep in this order.
case hotHumid
case marine
case moist
case dry
case marine
public var zoneIdentifiers: [String] {
switch self {
@@ -26,6 +28,6 @@ public enum ClimateZone: String, Codable, Equatable, Sendable {
}
public var label: String {
return "\(rawValue.capitalized) (\(zoneIdentifiers.joined(separator: ",")))"
return "\(self == .hotHumid ? "Hot Humid" : rawValue.capitalized) (\(zoneIdentifiers.joined(separator: ", ")))"
}
}

View File

@@ -4,20 +4,25 @@ public enum FilterPressureDrop {
Calculate filter pressure drop and sizing based on system requirements.
"""
public enum Mode: String, CaseIterable, Codable, Equatable, Sendable {
case basic
case fanLaw
}
public enum Request: Codable, Equatable, Sendable {
case basic(Basic)
case fanLaw(FanLaw)
public struct Basic: Codable, Equatable, Sendable {
let systemSize: HVACSystemSize
let systemSize: Double
let climateZone: ClimateZone
let filterType: FilterType
let filterWidth: Double
let filterHeight: Double
public init(
systemSize: HVACSystemSize,
systemSize: Double,
climateZone: ClimateZone,
filterType: FilterPressureDrop.FilterType,
filterWidth: Double,
@@ -58,22 +63,30 @@ public enum FilterPressureDrop {
}
}
public enum Result: Codable, Equatable, Sendable {
public enum Response: Codable, Equatable, Sendable {
case basic(Basic)
case fanLaw(FanLaw)
public struct Basic: Codable, Equatable, Sendable {
let filterArea: Double
let feetPerMinute: Double
let initialPressureDrop: Double
let maxPressureDrop: Double
public let filterArea: Double
public let feetPerMinute: Double
public let initialPressureDrop: Double
public let maxPressureDrop: Double
public let warnings: [String]
public init(filterArea: Double, feetPerMinute: Double, initialPressureDrop: Double, maxPressureDrop: Double) {
public init(
filterArea: Double,
feetPerMinute: Double,
initialPressureDrop: Double,
maxPressureDrop: Double,
warnings: [String]
) {
self.filterArea = filterArea
self.feetPerMinute = feetPerMinute
self.initialPressureDrop = initialPressureDrop
self.maxPressureDrop = maxPressureDrop
self.warnings = warnings
}
}
@@ -98,7 +111,7 @@ public enum FilterPressureDrop {
}
}
public enum FilterType: String, Codable, Equatable, Sendable {
public enum FilterType: String, CaseIterable, Codable, Equatable, Sendable {
case fiberglass
case pleatedBasic
case pleatedBetter
@@ -114,3 +127,34 @@ public enum FilterPressureDrop {
}
}
}
#if DEBUG
public extension FilterPressureDrop.Response {
static func mock(mode: FilterPressureDrop.Mode) -> Self {
switch mode {
case .basic:
return .basic(.init(
filterArea: 3.47,
feetPerMinute: 230,
initialPressureDrop: 0.2,
maxPressureDrop: 0.15,
warnings: [
"""
Intial pressure drop is more than 50% of maximum allowable.
Consider using a larger filter or different type with lower intial pressure drop.
"""
]
))
case .fanLaw:
return .fanLaw(.init(
predictedPressureDrop: 0.127,
velocityRatio: 1.13,
pressureRatio: 1.27,
faceVelocity: 259
))
}
}
}
#endif

View File

@@ -1,4 +1,4 @@
public enum HVACSystemSize: Double, Codable, Equatable, Sendable {
public enum HVACSystemSize: Double, CaseIterable, Codable, Equatable, Sendable {
case one = 1
case oneAndAHalf = 1.5
case two = 2