|
|
|
|
@@ -1,8 +1,5 @@
|
|
|
|
|
import Foundation
|
|
|
|
|
|
|
|
|
|
#warning("Make values non-optional")
|
|
|
|
|
#warning("Need to make air handler external static handle large filter pressure drops.")
|
|
|
|
|
#warning("Add an exterenal static pressure strategy for if the filter is built-in or external")
|
|
|
|
|
public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
|
|
|
|
|
case airHandler(AirHandler)
|
|
|
|
|
@@ -17,7 +14,7 @@ public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var externalStaticPressure: Double {
|
|
|
|
|
public var externalStaticPressure: Positive<Double> {
|
|
|
|
|
switch self {
|
|
|
|
|
case let .airHandler(airHandler):
|
|
|
|
|
return airHandler.externalStaticPressure
|
|
|
|
|
@@ -26,47 +23,75 @@ public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var manufacturersIncludedFilterPressureDrop: Positive<Double> {
|
|
|
|
|
switch self {
|
|
|
|
|
case let .airHandler(airHandler):
|
|
|
|
|
return airHandler.$manufacturersIncludedFilterPressureDrop
|
|
|
|
|
case let .furnaceAndCoil(furnaceAndCoil):
|
|
|
|
|
return furnaceAndCoil.$manufacturersIncludedFilterPressureDrop
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public struct AirHandler: Equatable {
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var airflow: Double?
|
|
|
|
|
public var airflow: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var returnPlenumPressure: Double?
|
|
|
|
|
public var manufacturersIncludedFilterPressureDrop: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var returnPlenumPressure: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var postFilterPressure: Double?
|
|
|
|
|
public var postFilterPressure: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var postCoilPressure: Double?
|
|
|
|
|
public var postCoilPressure: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var supplyPlenumPressure: Double?
|
|
|
|
|
public var supplyPlenumPressure: Double
|
|
|
|
|
|
|
|
|
|
public init(
|
|
|
|
|
airflow: Double? = nil,
|
|
|
|
|
returnPlenumPressure: Double? = nil,
|
|
|
|
|
postFilterPressure: Double? = nil,
|
|
|
|
|
postCoilPressure: Double? = nil,
|
|
|
|
|
supplyPlenumPressure: Double? = nil
|
|
|
|
|
airflow: Double,
|
|
|
|
|
manufacturersIncludedFilterPressureDrop: Double,
|
|
|
|
|
returnPlenumPressure: Double,
|
|
|
|
|
postFilterPressure: Double,
|
|
|
|
|
postCoilPressure: Double,
|
|
|
|
|
supplyPlenumPressure: Double
|
|
|
|
|
) {
|
|
|
|
|
self.airflow = airflow
|
|
|
|
|
self.manufacturersIncludedFilterPressureDrop = manufacturersIncludedFilterPressureDrop
|
|
|
|
|
self.returnPlenumPressure = returnPlenumPressure
|
|
|
|
|
self.postFilterPressure = postFilterPressure
|
|
|
|
|
self.postCoilPressure = postCoilPressure
|
|
|
|
|
self.supplyPlenumPressure = supplyPlenumPressure
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var externalStaticPressure: Double {
|
|
|
|
|
var postFilterAdder = 0.0
|
|
|
|
|
if let postFilterPressure = $postFilterPressure.positiveValue,
|
|
|
|
|
postFilterPressure > 0.1
|
|
|
|
|
{
|
|
|
|
|
postFilterAdder = postFilterPressure - 0.1
|
|
|
|
|
|
|
|
|
|
public init(
|
|
|
|
|
airflow: Positive<Double>,
|
|
|
|
|
manufacturersIncludedFilterPressureDrop: Positive<Double>,
|
|
|
|
|
returnPlenumPressure: Positive<Double>,
|
|
|
|
|
postFilterPressure: Positive<Double>,
|
|
|
|
|
postCoilPressure: Positive<Double>,
|
|
|
|
|
supplyPlenumPressure: Positive<Double>
|
|
|
|
|
) {
|
|
|
|
|
self._airflow = airflow
|
|
|
|
|
self._manufacturersIncludedFilterPressureDrop = manufacturersIncludedFilterPressureDrop
|
|
|
|
|
self._returnPlenumPressure = returnPlenumPressure
|
|
|
|
|
self._postFilterPressure = postFilterPressure
|
|
|
|
|
self._postCoilPressure = postCoilPressure
|
|
|
|
|
self._supplyPlenumPressure = supplyPlenumPressure
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var externalStaticPressure: Positive<Double> {
|
|
|
|
|
var postFilterAdder = Positive<Double>.zero
|
|
|
|
|
if $postFilterPressure > $manufacturersIncludedFilterPressureDrop {
|
|
|
|
|
postFilterAdder = $postFilterPressure - $manufacturersIncludedFilterPressureDrop
|
|
|
|
|
}
|
|
|
|
|
return ($returnPlenumPressure.positiveValue ?? 0)
|
|
|
|
|
return $returnPlenumPressure
|
|
|
|
|
+ postFilterAdder
|
|
|
|
|
+ ($supplyPlenumPressure.positiveValue ?? 0)
|
|
|
|
|
+ $supplyPlenumPressure
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -145,7 +170,7 @@ public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
.init(
|
|
|
|
|
airflow: checkAirflow(value: measurement.airflow, tons: tons),
|
|
|
|
|
coilPressureDrop: .init(
|
|
|
|
|
wrappedValue: (measurement.$postCoilPressure.positiveValue - measurement.$postFilterPressure.positiveValue) ?? 0,
|
|
|
|
|
wrappedValue: (measurement.$postCoilPressure.positiveValue - measurement.$postFilterPressure.positiveValue),
|
|
|
|
|
.result(.good())
|
|
|
|
|
),
|
|
|
|
|
externalStaticPressure: checkExternalStaticPressure(
|
|
|
|
|
@@ -155,7 +180,8 @@ public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
filterPressureDrop: .init(
|
|
|
|
|
value: measurement.$postFilterPressure.positiveValue - measurement.$returnPlenumPressure.positiveValue,
|
|
|
|
|
budget: budgets.filterBudget,
|
|
|
|
|
ratedPressures: ratedPressures
|
|
|
|
|
ratedPressures: ratedPressures,
|
|
|
|
|
ignoreMinimum: true
|
|
|
|
|
),
|
|
|
|
|
returnPlenumPressure: .init(
|
|
|
|
|
value: measurement.$returnPlenumPressure.positiveValue,
|
|
|
|
|
@@ -163,7 +189,7 @@ public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
ratedPressures: ratedPressures
|
|
|
|
|
),
|
|
|
|
|
supplyPlenumPressure: .init(
|
|
|
|
|
value: measurement.$supplyPlenumPressure.positiveValue ?? 0,
|
|
|
|
|
value: measurement.$supplyPlenumPressure.positiveValue,
|
|
|
|
|
budget: budgets.supplyPlenumBudget,
|
|
|
|
|
ratedPressures: ratedPressures
|
|
|
|
|
)
|
|
|
|
|
@@ -211,61 +237,61 @@ public enum EquipmentMeasurement: Equatable {
|
|
|
|
|
public struct FurnaceAndCoil: Equatable {
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var airflow: Double?
|
|
|
|
|
public var airflow: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var returnPlenumPressure: Double?
|
|
|
|
|
public var manufacturersIncludedFilterPressureDrop: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var returnPlenumPressure: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var postFilterPressure: Double?
|
|
|
|
|
public var postFilterPressure: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var preCoilPressure: Double?
|
|
|
|
|
public var preCoilPressure: Double
|
|
|
|
|
|
|
|
|
|
@Positive
|
|
|
|
|
public var supplyPlenumPressure: Double?
|
|
|
|
|
public var supplyPlenumPressure: Double
|
|
|
|
|
|
|
|
|
|
public init(
|
|
|
|
|
airflow: Double? = nil,
|
|
|
|
|
returnPlenumPressure: Double? = nil,
|
|
|
|
|
postFilterPressure: Double? = nil,
|
|
|
|
|
preCoilPressure: Double? = nil,
|
|
|
|
|
supplyPlenumPressure: Double? = nil
|
|
|
|
|
airflow: Double,
|
|
|
|
|
manufacturersIncludedFilterPressureDrop: Double,
|
|
|
|
|
returnPlenumPressure: Double,
|
|
|
|
|
postFilterPressure: Double,
|
|
|
|
|
preCoilPressure: Double,
|
|
|
|
|
supplyPlenumPressure: Double
|
|
|
|
|
) {
|
|
|
|
|
self.airflow = airflow
|
|
|
|
|
self.manufacturersIncludedFilterPressureDrop = manufacturersIncludedFilterPressureDrop
|
|
|
|
|
self.returnPlenumPressure = returnPlenumPressure
|
|
|
|
|
self.postFilterPressure = postFilterPressure
|
|
|
|
|
self.preCoilPressure = preCoilPressure
|
|
|
|
|
self.supplyPlenumPressure = supplyPlenumPressure
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var externalStaticPressure: Double {
|
|
|
|
|
($postFilterPressure.positiveValue ?? 0) + ($preCoilPressure.positiveValue ?? 0)
|
|
|
|
|
|
|
|
|
|
public init(
|
|
|
|
|
airflow: Positive<Double>,
|
|
|
|
|
manufacturersIncludedFilterPressureDrop: Positive<Double>,
|
|
|
|
|
returnPlenumPressure: Positive<Double>,
|
|
|
|
|
postFilterPressure: Positive<Double>,
|
|
|
|
|
preCoilPressure: Positive<Double>,
|
|
|
|
|
supplyPlenumPressure: Positive<Double>
|
|
|
|
|
) {
|
|
|
|
|
self._airflow = airflow
|
|
|
|
|
self._manufacturersIncludedFilterPressureDrop = manufacturersIncludedFilterPressureDrop
|
|
|
|
|
self._returnPlenumPressure = returnPlenumPressure
|
|
|
|
|
self._postFilterPressure = postFilterPressure
|
|
|
|
|
self._preCoilPressure = preCoilPressure
|
|
|
|
|
self._supplyPlenumPressure = supplyPlenumPressure
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var externalStaticPressure: Positive<Double> {
|
|
|
|
|
($postFilterPressure - $manufacturersIncludedFilterPressureDrop) + $preCoilPressure
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//extension EquipmentMeasurement.AirHandler {
|
|
|
|
|
//
|
|
|
|
|
// public enum Key: String, Equatable, CaseIterable {
|
|
|
|
|
// case returnPlenumPressure
|
|
|
|
|
// case postFilterPressure
|
|
|
|
|
// case postCoilPressure
|
|
|
|
|
// case supplyPlenumPressure
|
|
|
|
|
// case airflow
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
//
|
|
|
|
|
//extension EquipmentMeasurement.FurnaceAndCoil {
|
|
|
|
|
//
|
|
|
|
|
// public enum Key: String, Equatable, CaseIterable {
|
|
|
|
|
// case returnPlenumPressure
|
|
|
|
|
// case postFilterPressure
|
|
|
|
|
// case preCoilPressure
|
|
|
|
|
// case supplyPlenumPressure
|
|
|
|
|
// case airflow
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
fileprivate extension Flagged {
|
|
|
|
|
|
|
|
|
|
init(
|
|
|
|
|
@@ -303,11 +329,11 @@ fileprivate extension Flagged {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fileprivate func checkExternalStaticPressure(
|
|
|
|
|
value: Double,
|
|
|
|
|
value: Positive<Double>,
|
|
|
|
|
ratedPressures: RatedStaticPressures
|
|
|
|
|
) -> Flagged {
|
|
|
|
|
.init(
|
|
|
|
|
wrappedValue: value,
|
|
|
|
|
wrappedValue: value.positiveValue,
|
|
|
|
|
.rated(ratedPressures)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
@@ -330,6 +356,7 @@ extension EquipmentMeasurement {
|
|
|
|
|
case .airHandler:
|
|
|
|
|
return .airHandler(.init(
|
|
|
|
|
airflow: 1200,
|
|
|
|
|
manufacturersIncludedFilterPressureDrop: 0.1,
|
|
|
|
|
returnPlenumPressure: 0.3,
|
|
|
|
|
postFilterPressure: 0.6,
|
|
|
|
|
postCoilPressure: 0.9,
|
|
|
|
|
@@ -339,6 +366,7 @@ extension EquipmentMeasurement {
|
|
|
|
|
case .furnaceAndCoil:
|
|
|
|
|
return .furnaceAndCoil(.init(
|
|
|
|
|
airflow: 1200,
|
|
|
|
|
manufacturersIncludedFilterPressureDrop: 0.0,
|
|
|
|
|
returnPlenumPressure: 0.3,
|
|
|
|
|
postFilterPressure: 0.6,
|
|
|
|
|
preCoilPressure: 0.4,
|
|
|
|
|
|