Skip to content

Commit e920e31

Browse files
committed
AWSensor support for Measurement<Unit>
1 parent 38cde1c commit e920e31

12 files changed

Lines changed: 343 additions & 294 deletions

README.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -204,14 +204,18 @@ where SWKSensor is defined as:
204204
```swift
205205
/// Supported Service Types
206206
public enum SWKSensorType {
207+
case WindDirection
207208
case Temperature
208209
case AirQuality
210+
case WindSpeed
211+
case Radiation
212+
case RainRate
213+
case Humidity
214+
case RainDate
209215
case Pressure
210216
case Battery
211-
case Humidity
212217
case General
213218
case Rain
214-
case Wind
215219
}
216220

217221
///
@@ -224,12 +228,12 @@ public enum SWKSensorType {
224228
/// - _value: Current measurement for the sensor
225229
///
226230
open class SWKSensor {
227-
private let _type: SWKSensorType
228-
private let _description: String
229-
private let _sensorID: String
230-
private let _unit: String
231-
private let _name: String
232-
private var _value: Any
231+
internal var _type: SWKSensorType
232+
internal var _description: String
233+
internal var _sensorID: String
234+
internal var _unit: String
235+
internal var _name: String
236+
internal var _value: Any
233237

234238
.
235239
.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//
2+
// AWSensor.swift
3+
//
4+
//
5+
// Created by Mike Manzo on 5/30/20.
6+
//
7+
8+
import Foundation
9+
10+
open class AWSensor: SWKSensor {
11+
///
12+
/// Provides a simple way to "see" what ths device is reporting
13+
///
14+
override var prettyString: String {
15+
return String("\(_name): \(_value)")
16+
}
17+
18+
///
19+
/// A compact way to progamatically represent an AmbientWeather Sensor as defined in the API docs
20+
/// - Parameters:
21+
/// - _value: We are taking advantage of the fact that some of the AW sensors can have units that are convertible. Those that are fixed - are fixed.
22+
///
23+
required public init (type: SWKSensorType, name: String, sensorID: String, measurement: Any, unit: String, desc: String) {
24+
super.init(type: type, name: name, sensorID: sensorID, measurement: measurement, unit: unit, desc: desc)
25+
26+
switch type {
27+
case .Pressure:
28+
_value = Measurement(value: Double(measurement as! Float), unit: UnitPressure.inchesOfMercury)
29+
case .Temperature:
30+
_value = Measurement(value: Double(measurement as! Float), unit: UnitTemperature.fahrenheit)
31+
case .AirQuality:
32+
_value = Measurement(value: Double(measurement as! Float), unit: Unit(symbol: "µg/m^3"))
33+
case .WindSpeed:
34+
_value = Measurement(value: Double(measurement as! Float), unit: UnitSpeed.milesPerHour)
35+
case .RainRate:
36+
_value = Measurement(value: Double(measurement as! Float) , unit: Unit(symbol: "in/hr"))
37+
case .Rain:
38+
_value = Measurement(value: Double(measurement as! Float) , unit: UnitLength.inches)
39+
case .Humidity:
40+
_value = Measurement(value: Double(measurement as! Int), unit: Unit(symbol: "%"))
41+
case .WindDirection:
42+
_value = Measurement(value: Double(measurement as! Int), unit: UnitAngle.degrees)
43+
case .Radiation, .Battery, .RainDate, .General: // Unit-less
44+
break
45+
}
46+
}
47+
}

Sources/SwiftyWeatherKit/AmbientWeather/Extensions/AWStationData+AirQuality.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,64 +8,64 @@
88
import Foundation
99

1010
extension AWStationData {
11-
var AirQualitySensors: [SWKSensor] {
11+
var AirQualitySensors: [AWSensor] {
1212

13-
let sensors: [SWKSensor?] = [AirQualityOutdoor, AirQualityOutdoor24Avg, AirQualityIndoor,
13+
let sensors: [AWSensor?] = [AirQualityOutdoor, AirQualityOutdoor24Avg, AirQualityIndoor,
1414
AirQualityIndoor24Avg, UVIndex, SolarRadiation, CarbonDioxide]
1515
return sensors.compactMap{ $0 }
1616
}
1717

18-
var AirQualityOutdoor: SWKSensor? {
18+
var AirQualityOutdoor: AWSensor? {
1919
if airQualityOut != nil {
20-
return SWKSensor(type: .AirQuality, name: "Outdoor Air Quality", sensorID: "pm25", measurement: airQualityOut!, unit: "µg/m^3", desc: "PM2.5 Outdoor Air Quality")
20+
return AWSensor(type: .AirQuality, name: "Outdoor Air Quality", sensorID: "pm25", measurement: airQualityOut!, unit: "µg/m^3", desc: "PM2.5 Outdoor Air Quality")
2121
} else {
2222
return nil
2323
}
2424
}
2525

26-
var AirQualityOutdoor24Avg: SWKSensor? {
26+
var AirQualityOutdoor24Avg: AWSensor? {
2727
if airQualityOut24 != nil {
28-
return SWKSensor(type: .AirQuality, name: "24 Average Outdoor Air Quality", sensorID: "pm25_24h", measurement: airQualityOut24!, unit: "µg/m^3", desc: "PM2.5 Outdoor Air Quality Outdoor - 24 Hour Average")
28+
return AWSensor(type: .AirQuality, name: "24 Average Outdoor Air Quality", sensorID: "pm25_24h", measurement: airQualityOut24!, unit: "µg/m^3", desc: "PM2.5 Outdoor Air Quality Outdoor - 24 Hour Average")
2929
} else {
3030
return nil
3131
}
3232
}
3333

34-
var AirQualityIndoor: SWKSensor? {
34+
var AirQualityIndoor: AWSensor? {
3535
if airQualityIn != nil {
36-
return SWKSensor(type: .AirQuality, name: "Indoor Air Quality", sensorID: "pm25_in", measurement: airQualityIn!, unit: "µg/m^3", desc: "PM2.5 Indoor Air Quality")
36+
return AWSensor(type: .AirQuality, name: "Indoor Air Quality", sensorID: "pm25_in", measurement: airQualityIn!, unit: "µg/m^3", desc: "PM2.5 Indoor Air Quality")
3737
} else {
3838
return nil
3939
}
4040
}
4141

42-
var AirQualityIndoor24Avg: SWKSensor? {
42+
var AirQualityIndoor24Avg: AWSensor? {
4343
if airQualityIn24 != nil {
44-
return SWKSensor(type: .AirQuality, name: "24 Average Indoor Air Quality", sensorID: "pm25_in_24h", measurement: airQualityIn24!, unit: "µg/m^3", desc: "PM2.5 Indoor Air Quality - 24 Hour Average")
44+
return AWSensor(type: .AirQuality, name: "24 Average Indoor Air Quality", sensorID: "pm25_in_24h", measurement: airQualityIn24!, unit: "µg/m^3", desc: "PM2.5 Indoor Air Quality - 24 Hour Average")
4545
} else {
4646
return nil
4747
}
4848
}
4949

50-
var UVIndex: SWKSensor? {
50+
var UVIndex: AWSensor? {
5151
if uvIndex != nil {
52-
return SWKSensor(type: .AirQuality, name: "UV Index", sensorID: "uv", measurement: uvIndex!, unit: "None", desc: "Ultra-Violet Radiation Index")
52+
return AWSensor(type: .Radiation, name: "UV Index", sensorID: "uv", measurement: uvIndex!, unit: "None", desc: "Ultra-Violet Radiation Index")
5353
} else {
5454
return nil
5555
}
5656
}
5757

58-
var SolarRadiation: SWKSensor? {
58+
var SolarRadiation: AWSensor? {
5959
if solarRadiation != nil {
60-
return SWKSensor(type: .AirQuality, name: "Solar Radiation", sensorID: "solarradiation", measurement: solarRadiation!, unit: "W/m^2", desc: "Solar Radiation")
60+
return AWSensor(type: .AirQuality, name: "Solar Radiation", sensorID: "solarradiation", measurement: solarRadiation!, unit: "W/m^2", desc: "Solar Radiation")
6161
} else {
6262
return nil
6363
}
6464
}
6565

66-
var CarbonDioxide: SWKSensor? {
66+
var CarbonDioxide: AWSensor? {
6767
if carbonDioxide != nil {
68-
return SWKSensor(type: .AirQuality, name: "CO2 Level", sensorID: "co2", measurement: carbonDioxide!, unit: "ppm", desc: "Carbon Dioxide Level")
68+
return AWSensor(type: .AirQuality, name: "CO2 Level", sensorID: "co2", measurement: carbonDioxide!, unit: "ppm", desc: "Carbon Dioxide Level")
6969
} else {
7070
return nil
7171
}

Sources/SwiftyWeatherKit/AmbientWeather/Extensions/AWStationData+Battery.swift

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,97 +8,105 @@
88
import Foundation
99

1010
extension AWStationData {
11-
var BatterySensors: [SWKSensor] {
12-
let sensors: [SWKSensor?] = [BatterySensor, BatterySensor1, BatterySensor2, BatterySensor3,
11+
var BatterySensors: [AWSensor] {
12+
let sensors: [AWSensor?] = [BatterySensor, BatterySensor1, BatterySensor2, BatterySensor3,
1313
BatterySensor4, BatterySensor5, BatterySensor6, BatterySensor7,
1414
BatterySensor8, BatterySensor9, BatterySensor10]
1515
return sensors.compactMap{ $0 }
1616
}
1717

18-
var BatterySensor: SWKSensor? {
18+
var BatteryAirQuality: AWSensor? {
19+
if batteryAQS != nil {
20+
return AWSensor(type: .Battery, name: "Air Quality Battery Status", sensorID: "batt_25", measurement: batteryAQS!, unit: "None", desc: "PM2.5 Air Quality Sensor Battery Status")
21+
} else {
22+
return nil
23+
}
24+
}
25+
26+
var BatterySensor: AWSensor? {
1927
if batteryOut != nil {
20-
return SWKSensor(type: .Battery, name: "Outdoor Battery Status", sensorID: "battout", measurement: batteryOut!, unit: "None", desc: "Outdoor Battery Status")
28+
return AWSensor(type: .Battery, name: "Outdoor Battery Status", sensorID: "battout", measurement: batteryOut!, unit: "None", desc: "Outdoor Battery Status")
2129
} else {
2230
return nil
2331
}
2432
}
2533

26-
var BatterySensor1: SWKSensor? {
34+
var BatterySensor1: AWSensor? {
2735
if batteryOut1 != nil {
28-
return SWKSensor(type: .Battery, name: "Battery Status: 1", sensorID: "batt1", measurement: batteryOut1!, unit: "None", desc: "Outdoor Battery Status - Sensor #1")
36+
return AWSensor(type: .Battery, name: "Battery Status: 1", sensorID: "batt1", measurement: batteryOut1!, unit: "None", desc: "Outdoor Battery Status - Sensor #1")
2937
} else {
3038
return nil
3139
}
3240
}
3341

34-
var BatterySensor2: SWKSensor? {
42+
var BatterySensor2: AWSensor? {
3543
if batteryOut2 != nil {
36-
return SWKSensor(type: .Battery, name: "Battery Status: 2", sensorID: "batt2", measurement: batteryOut2!, unit: "None", desc: "Outdoor Battery Status - Sensor #2")
44+
return AWSensor(type: .Battery, name: "Battery Status: 2", sensorID: "batt2", measurement: batteryOut2!, unit: "None", desc: "Outdoor Battery Status - Sensor #2")
3745
} else {
3846
return nil
3947
}
4048
}
4149

42-
var BatterySensor3: SWKSensor? {
50+
var BatterySensor3: AWSensor? {
4351
if batteryOut3 != nil {
44-
return SWKSensor(type: .Battery, name: "Battery Status: 3", sensorID: "batt3", measurement: batteryOut3!, unit: "None", desc: "Outdoor Battery Status - Sensor #3")
52+
return AWSensor(type: .Battery, name: "Battery Status: 3", sensorID: "batt3", measurement: batteryOut3!, unit: "None", desc: "Outdoor Battery Status - Sensor #3")
4553
} else {
4654
return nil
4755
}
4856
}
4957

50-
var BatterySensor4: SWKSensor? {
58+
var BatterySensor4: AWSensor? {
5159
if batteryOut4 != nil {
52-
return SWKSensor(type: .Battery, name: "Battery Status: 4", sensorID: "batt4", measurement: batteryOut4!, unit: "None", desc: "Outdoor Battery Status - Sensor #4")
60+
return AWSensor(type: .Battery, name: "Battery Status: 4", sensorID: "batt4", measurement: batteryOut4!, unit: "None", desc: "Outdoor Battery Status - Sensor #4")
5361
} else {
5462
return nil
5563
}
5664
}
5765

58-
var BatterySensor5: SWKSensor? {
66+
var BatterySensor5: AWSensor? {
5967
if batteryOut5 != nil {
60-
return SWKSensor(type: .Battery, name: "Battery Status: 5", sensorID: "batt5", measurement: batteryOut5!, unit: "None", desc: "Outdoor Battery Status - Sensor #5")
68+
return AWSensor(type: .Battery, name: "Battery Status: 5", sensorID: "batt5", measurement: batteryOut5!, unit: "None", desc: "Outdoor Battery Status - Sensor #5")
6169
} else {
6270
return nil
6371
}
6472
}
6573

66-
var BatterySensor6: SWKSensor? {
74+
var BatterySensor6: AWSensor? {
6775
if batteryOut6 != nil {
68-
return SWKSensor(type: .Battery, name: "Battery Status: 6", sensorID: "batt6", measurement: batteryOut6!, unit: "None", desc: "Outdoor Battery Status - Sensor #6")
76+
return AWSensor(type: .Battery, name: "Battery Status: 6", sensorID: "batt6", measurement: batteryOut6!, unit: "None", desc: "Outdoor Battery Status - Sensor #6")
6977
} else {
7078
return nil
7179
}
7280
}
7381

74-
var BatterySensor7: SWKSensor? {
82+
var BatterySensor7: AWSensor? {
7583
if batteryOut7 != nil {
76-
return SWKSensor(type: .Battery, name: "Battery Status: 7", sensorID: "batt7", measurement: batteryOut7!, unit: "None", desc: "Outdoor Battery Status - Sensor #7")
84+
return AWSensor(type: .Battery, name: "Battery Status: 7", sensorID: "batt7", measurement: batteryOut7!, unit: "None", desc: "Outdoor Battery Status - Sensor #7")
7785
} else {
7886
return nil
7987
}
8088
}
8189

82-
var BatterySensor8: SWKSensor? {
90+
var BatterySensor8: AWSensor? {
8391
if batteryOut8 != nil {
84-
return SWKSensor(type: .Battery, name: "Battery Status: 8", sensorID: "batt8", measurement: batteryOut8!, unit: "None", desc: "Outdoor Battery Status - Sensor #8")
92+
return AWSensor(type: .Battery, name: "Battery Status: 8", sensorID: "batt8", measurement: batteryOut8!, unit: "None", desc: "Outdoor Battery Status - Sensor #8")
8593
} else {
8694
return nil
8795
}
8896
}
8997

9098

91-
var BatterySensor9: SWKSensor? {
99+
var BatterySensor9: AWSensor? {
92100
if batteryOut9 != nil {
93-
return SWKSensor(type: .Battery, name: "Battery Status: 9", sensorID: "batt9", measurement: batteryOut9!, unit: "None", desc: "Outdoor Battery Status - Sensor #9")
101+
return AWSensor(type: .Battery, name: "Battery Status: 9", sensorID: "batt9", measurement: batteryOut9!, unit: "None", desc: "Outdoor Battery Status - Sensor #9")
94102
} else {
95103
return nil
96104
}
97105
}
98106

99-
var BatterySensor10: SWKSensor? {
107+
var BatterySensor10: AWSensor? {
100108
if batteryOut10 != nil {
101-
return SWKSensor(type: .Battery, name: "Battery Status: 10", sensorID: "batt10", measurement: batteryOut10!, unit: "None", desc: "Outdoor Battery Status - Sensor #10")
109+
return AWSensor(type: .Battery, name: "Battery Status: 10", sensorID: "batt10", measurement: batteryOut10!, unit: "None", desc: "Outdoor Battery Status - Sensor #10")
102110
} else {
103111
return nil
104112
}

0 commit comments

Comments
 (0)