summaryrefslogtreecommitdiff
path: root/watchos/InfiniSolar/InfiniSolar WatchKit Extension/RoomState.swift
diff options
context:
space:
mode:
Diffstat (limited to 'watchos/InfiniSolar/InfiniSolar WatchKit Extension/RoomState.swift')
-rw-r--r--watchos/InfiniSolar/InfiniSolar WatchKit Extension/RoomState.swift84
1 files changed, 84 insertions, 0 deletions
diff --git a/watchos/InfiniSolar/InfiniSolar WatchKit Extension/RoomState.swift b/watchos/InfiniSolar/InfiniSolar WatchKit Extension/RoomState.swift
new file mode 100644
index 0000000..f387b8b
--- /dev/null
+++ b/watchos/InfiniSolar/InfiniSolar WatchKit Extension/RoomState.swift
@@ -0,0 +1,84 @@
+//
+// RoomState.swift
+// InfiniSolar WatchKit Extension
+//
+// Created by Evgeny Zinoviev on 09.08.2021.
+//
+
+import Alamofire
+import SwiftyJSON
+
+extension Double {
+ /// Rounds the double to decimal places value
+ func rounded(toPlaces places:Int) -> Double {
+ let divisor = pow(10.0, Double(places))
+ return (self * divisor).rounded() / divisor
+ }
+}
+
+
+public class RoomState: ObservableObject {
+ @Published var temp: Double
+ @Published var rh: Double
+ @Published var error: Bool
+
+ var timer: Timer?
+ var request: DataRequest?
+
+ init() {
+ self.error = false
+ self.timer = nil
+ self.request = nil
+
+ self.temp = 0
+ self.rh = 0
+ }
+
+ func start() {
+ if self.timer != nil {
+ self.stop()
+ }
+
+ self.timer = Timer.scheduledTimer(timeInterval: 5,
+ target: self,
+ selector: #selector(fetch),
+ userInfo: nil,
+ repeats: true)
+ self.timer?.fire()
+ }
+
+ func stop() {
+ if self.request != nil {
+ self.request?.cancel()
+ self.request = nil
+ }
+
+ self.error = false
+ self.timer?.invalidate()
+ self.timer = nil
+ }
+
+ @objc func fetch() {
+ self.request = AF.request("http://192.168.5.223:8381/read/").responseJSON { response in
+ self.request = nil
+
+ switch response.result {
+ case .success(let value):
+ let j = JSON(value)
+ self.temp = (j["temp"].double ?? 0).rounded(toPlaces: 2)
+ self.rh = (j["humidity"].double ?? 0).rounded(toPlaces: 2)
+
+ case .failure(let error):
+ switch (error) {
+ case .explicitlyCancelled:
+ break
+
+ default:
+ self.error = true
+ self.timer?.invalidate()
+ self.timer = nil
+ }
+ }
+ }
+ }
+}