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) case furnaceAndCoil(FurnaceAndCoil) public var equipmentType: EquipmentType { switch self { case .airHandler: return .airHandler case .furnaceAndCoil: return .furnaceAndCoil } } public var externalStaticPressure: Double { switch self { case let .airHandler(airHandler): return airHandler.externalStaticPressure case let .furnaceAndCoil(furnaceAndCoil): return furnaceAndCoil.externalStaticPressure } } public struct AirHandler: Equatable { @Positive public var airflow: Double? @Positive public var returnPlenumPressure: Double? @Positive public var postFilterPressure: Double? @Positive public var postCoilPressure: Double? @Positive public var supplyPlenumPressure: Double? public init( airflow: Double? = nil, returnPlenumPressure: Double? = nil, postFilterPressure: Double? = nil, postCoilPressure: Double? = nil, supplyPlenumPressure: Double? = nil ) { self.airflow = airflow 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 } return ($returnPlenumPressure.positiveValue ?? 0) + postFilterAdder + ($supplyPlenumPressure.positiveValue ?? 0) } } public struct FurnaceAndCoil: Equatable { @Positive public var airflow: Double? @Positive public var returnPlenumPressure: Double? @Positive public var postFilterPressure: Double? @Positive public var preCoilPressure: Double? @Positive public var supplyPlenumPressure: Double? public init( airflow: Double? = nil, returnPlenumPressure: Double? = nil, postFilterPressure: Double? = nil, preCoilPressure: Double? = nil, supplyPlenumPressure: Double? = nil ) { self.airflow = airflow self.returnPlenumPressure = returnPlenumPressure self.postFilterPressure = postFilterPressure self.preCoilPressure = preCoilPressure self.supplyPlenumPressure = supplyPlenumPressure } public var externalStaticPressure: Double { ($postFilterPressure.positiveValue ?? 0) + ($preCoilPressure.positiveValue ?? 0) } } } //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 // } //} #if DEBUG extension EquipmentMeasurement { public static func mock(type equipmentType: EquipmentType) -> Self { switch equipmentType { case .airHandler: return .airHandler(.init( airflow: 1200, returnPlenumPressure: 0.3, postFilterPressure: 0.6, postCoilPressure: 0.9, supplyPlenumPressure: 0.2 )) case .furnaceAndCoil: return .furnaceAndCoil(.init( airflow: 1200, returnPlenumPressure: 0.3, postFilterPressure: 0.6, preCoilPressure: 0.4, supplyPlenumPressure: 0.1 )) } } } #endif