feat: Begins hvac system performance

This commit is contained in:
2025-02-27 22:41:37 -05:00
parent dc01477c3e
commit 7cd02971a3
15 changed files with 341 additions and 16 deletions

View File

@@ -42,3 +42,15 @@ public enum DehumidifierSize {
}
}
}
#if DEBUG
public extension DehumidifierSize.Response {
static var mock: Self {
.init(requiredCapacity: 100, pintsPerDay: 100, recommendedSize: 100, recommendedUrl: "#", warnings: [
"A warning.", "B warning"
])
}
}
#endif

View File

@@ -0,0 +1,87 @@
import PsychrometricClient
public enum HVACSystemPerformance {
public struct Request: Codable, Equatable, Sendable {
public let altitude: Double?
public let airflow: Double
public let returnAirTemperature: Double
public let returnAirHumidity: Double
public let supplyAirTemperature: Double
public let supplyAirHumidity: Double
public let systemSize: Double
public init(
altitude: Double? = nil,
airflow: Double,
returnAirTemperature: Double,
returnAirHumidity: Double,
supplyAirTemperature: Double,
supplyAirHumidity: Double,
systemSize: Double
) {
self.altitude = altitude
self.airflow = airflow
self.returnAirTemperature = returnAirTemperature
self.returnAirHumidity = returnAirHumidity
self.supplyAirTemperature = supplyAirTemperature
self.supplyAirHumidity = supplyAirHumidity
self.systemSize = systemSize
}
}
public struct Response: Codable, Equatable, Sendable {
public let returnAirProperties: PsychrometricProperties
public let supplyAirProperties: PsychrometricProperties
public let capacity: Capacity
public let systemMetrics: SystemMetrics
public init(
returnAirProperties: PsychrometricProperties,
supplyAirProperties: PsychrometricProperties,
capacity: HVACSystemPerformance.Capacity,
systemMetrics: HVACSystemPerformance.SystemMetrics
) {
self.returnAirProperties = returnAirProperties
self.supplyAirProperties = supplyAirProperties
self.capacity = capacity
self.systemMetrics = systemMetrics
}
}
public struct Capacity: Codable, Equatable, Sendable {
public let total: Double
public let sensible: Double
public let latent: Double
public var shr: Double { sensible / total }
public init(total: Double, sensible: Double, latent: Double) {
self.total = total
self.sensible = sensible
self.latent = latent
}
}
public struct SystemMetrics: Codable, Equatable, Sendable {
public let cfmPerTon: Double
public let targetTemperatureSplit: Double
public let actualTemperatureSplit: Double
public let condensationRate: Double
public init(
cfmPerTon: Double,
targetTemperatureSplit: Double,
actualTemperatureSplit: Double,
condensationRate: Double
) {
self.cfmPerTon = cfmPerTon
self.targetTemperatureSplit = targetTemperatureSplit
self.actualTemperatureSplit = actualTemperatureSplit
self.condensationRate = condensationRate
}
}
}

View File

@@ -0,0 +1,11 @@
public enum HVACSystemSize: Double, Codable, Equatable, Sendable {
case one = 1
case oneAndAHalf = 1.5
case two = 2
case twoAndAHalf = 2.5
case three = 3
case threeAndAHalf = 3.5
case four = 4
case fourAndAHalf = 4.5
case five = 5
}

View File

@@ -24,6 +24,7 @@ public extension SiteRoute {
enum Api: Equatable, Sendable {
case calculateDehumidifierSize(DehumidifierSize.Request)
case calculateHVACSystemPerformance(HVACSystemPerformance.Request)
case calculateMoldRisk(MoldRisk.Request)
static let rootPath = Path { "api"; "v1" }
@@ -34,6 +35,11 @@ public extension SiteRoute {
Method.post
Body(.json(DehumidifierSize.Request.self))
}
Route(.case(Self.calculateHVACSystemPerformance)) {
Path { "api"; "v1"; "calculateHVACSystemPerformance" }
Method.post
Body(.json(HVACSystemPerformance.Request.self))
}
Route(.case(Self.calculateMoldRisk)) {
Path { "api"; "v1"; "calculateMoldRisk" }
Method.post
@@ -48,6 +54,7 @@ public extension SiteRoute {
case index
case dehumidifierSize(DehumidifierSize)
case hvacSystemPerformance(HVACSystemPerformance)
case moldRisk(MoldRisk)
public static let router = OneOf {
@@ -57,6 +64,9 @@ public extension SiteRoute {
Route(.case(Self.dehumidifierSize)) {
DehumidifierSize.router
}
Route(.case(Self.hvacSystemPerformance)) {
HVACSystemPerformance.router
}
Route(.case(Self.moldRisk)) {
MoldRisk.router
}
@@ -66,7 +76,7 @@ public extension SiteRoute {
case index
case submit(Routes.DehumidifierSize.Request)
static let rootPath = "dehumidifier-size"
static let rootPath = "dehumidifier-sizing"
public static let router = OneOf {
Route(.case(Self.index)) {
@@ -88,6 +98,36 @@ public extension SiteRoute {
}
}
public enum HVACSystemPerformance: Equatable, Sendable {
case index
case submit(Routes.HVACSystemPerformance.Request)
static let rootPath = "hvac-system-performance"
public static let router = OneOf {
Route(.case(Self.index)) {
Path { rootPath }
Method.get
}
Route(.case(Self.submit)) {
Path { rootPath }
Method.post
Body {
FormData {
Optionally { Field("altitude") { Double.parser() } }
Field("airflow") { Double.parser() }
Field("returnAirTemperature") { Double.parser() }
Field("returnAirHumidity") { Double.parser() }
Field("supplyAirTemperature") { Double.parser() }
Field("supplyAirHumidity") { Double.parser() }
Field("systemSize") { Double.parser() }
}
.map(.memberwise(Routes.HVACSystemPerformance.Request.init))
}
}
}
}
public enum MoldRisk: Equatable, Sendable {
case index
case submit(Routes.MoldRisk.Request)