feat: Finishes economic balance point.

This commit is contained in:
2025-03-04 17:17:55 -05:00
parent 6c31a9db09
commit b58d053ba1
8 changed files with 226 additions and 15 deletions

View File

@@ -12,8 +12,29 @@ public enum HeatingBalancePoint {
}
public enum Request: Codable, Equatable, Sendable {
case economic(Economic)
case thermal(Thermal)
public struct Economic: Codable, Equatable, Sendable {
public let fuelType: FuelType
public let fuelCostPerUnit: Double
public let fuelAFUE: Double
public let costPerKW: Double
public init(
fuelType: HeatingBalancePoint.FuelType,
fuelCostPerUnit: Double,
fuelAFUE: Double,
costPerKW: Double
) {
self.fuelType = fuelType
self.fuelCostPerUnit = fuelCostPerUnit
self.fuelAFUE = fuelAFUE
self.costPerKW = costPerKW
}
}
public struct Thermal: Codable, Equatable, Sendable {
public let systemSize: Double
@@ -42,8 +63,32 @@ public enum HeatingBalancePoint {
}
public enum Response: Codable, Equatable, Sendable {
case economic(Economic)
case thermal(Thermal)
public struct Economic: Codable, Equatable, Sendable {
public let balancePointTemperature: Double
public let fuelCostPerMMBTU: Double
public let electricCostPerMMBTU: Double
public let copAtBalancePoint: Double
public let electricFuelRatio: Double
public init(
balancePointTemperature: Double,
fuelCostPerMMBTU: Double,
electricCostPerMMBTU: Double,
copAtBalancePoint: Double,
electricFuelRatio: Double
) {
self.balancePointTemperature = balancePointTemperature
self.fuelCostPerMMBTU = fuelCostPerMMBTU
self.electricCostPerMMBTU = electricCostPerMMBTU
self.copAtBalancePoint = copAtBalancePoint
self.electricFuelRatio = electricFuelRatio
}
}
public struct Thermal: Codable, Equatable, Sendable {
public let capacityAt47: Double
@@ -91,6 +136,26 @@ public enum HeatingBalancePoint {
}
}
}
public enum FuelType: String, CaseIterable, Codable, Equatable, Sendable {
case naturalGas
case propane
case oil
public var label: String {
switch self {
case .propane, .oil: return "\(rawValue.capitalized)"
case .naturalGas: return "Natural Gas"
}
}
public var units: String {
switch self {
case .propane, .oil: return "gallons"
case .naturalGas: return "therm"
}
}
}
}
#if DEBUG
@@ -99,7 +164,13 @@ public enum HeatingBalancePoint {
static func mock(mode: HeatingBalancePoint.Mode) -> Self {
switch mode {
case .economic:
fatalError()
return .economic(.init(
balancePointTemperature: -10.8,
fuelCostPerMMBTU: 27.6,
electricCostPerMMBTU: 38.1,
copAtBalancePoint: 2.24,
electricFuelRatio: 1.38
))
case .thermal:
return .thermal(.init(
capacityAt47: 24600,

View File

@@ -318,6 +318,17 @@ public extension SiteRoute {
Method.post
Body {
OneOf {
// Economic balance point
FormData {
Field("fuelType") { Routes.HeatingBalancePoint.FuelType.parser() }
Field("fuelCostPerUnit") { Double.parser() }
Field("fuelAFUE") { Double.parser() }
Field("costPerKW") { Double.parser() }
}
.map(.memberwise(Routes.HeatingBalancePoint.Request.Economic.init))
.map(.case(Routes.HeatingBalancePoint.Request.economic))
// Thermal Balance Point
FormData {
Field("systemSize") { Double.parser() }
Optionally { Field("capacityAt47") { Double.parser() } }