Refactor to remove redundancies
This commit is contained in:
@@ -7,6 +7,9 @@
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import PromiseKit
|
||||
import Alamofire
|
||||
import SwiftyJSON
|
||||
import RealmSwift
|
||||
|
||||
@UIApplicationMain
|
||||
@@ -14,21 +17,212 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
|
||||
var window: UIWindow?
|
||||
let baseURL : String = "https://henrypump.meshify.com/api/v3"
|
||||
var user : User?
|
||||
|
||||
let channelDataTypes: [Int : String] = [
|
||||
0: "Unknown",
|
||||
1: "Float",
|
||||
2: "String",
|
||||
3: "Integer",
|
||||
4: "Boolean",
|
||||
5: "DateTime",
|
||||
6: "Timespan",
|
||||
7 :"File",
|
||||
8: "LatLng"
|
||||
]
|
||||
|
||||
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
|
||||
// Override point for customization after application launch.
|
||||
|
||||
// Chameleon.setGlobalThemeUsingPrimaryColor(UIColor.flatSkyBlue(), with: UIContentStyle.contrast)
|
||||
// print(Realm.Configuration.defaultConfiguration.fileURL)
|
||||
//
|
||||
// do {
|
||||
// _ = try Realm()
|
||||
// } catch {
|
||||
// print("Error initializing Realm: \(error)")
|
||||
// }
|
||||
//
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
//MARK: - Data Methods
|
||||
|
||||
// func getAddresses() ->Promise<Any> {
|
||||
// let realm = try! Realm()
|
||||
// let url = "\(baseURL)/addresses"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
// return Promise { promise in
|
||||
// Alamofire.request(url, method: .get, headers: headers)
|
||||
// .validate()
|
||||
// .responseJSON { response in
|
||||
// switch response.result {
|
||||
//
|
||||
// case .success:
|
||||
// let addressesJSON : JSON = JSON(response.result.value!)
|
||||
// for(_, json) : (String, JSON) in addressesJSON {
|
||||
// do {
|
||||
// try realm.write {
|
||||
// let addr = Address()
|
||||
// addr.id = json["id"].intValue
|
||||
// addr.apartment = json["id"].stringValue
|
||||
// addr.city = json["city"].stringValue
|
||||
// addr.country = json["country"].stringValue
|
||||
// addr.lat = json["lat"].doubleValue
|
||||
// addr.long = json["long"].doubleValue
|
||||
// addr.state = json["state"].stringValue
|
||||
// addr.street1 = json["street1"].stringValue
|
||||
// addr.street2 = json["street2"].stringValue
|
||||
// addr.zip = json["zip"].stringValue
|
||||
// addr.zoneId = json["zoneid"].intValue
|
||||
// realm.add(addr, update: true)
|
||||
// }
|
||||
// } catch {
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// promise.fulfill(true)
|
||||
// case .failure(let error):
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// func getDevices(gateways : Results<Gateway>, deviceTypes : Results<DeviceType>) ->Promise<Any> {
|
||||
// let realm = try! Realm()
|
||||
// let url = "\(baseURL)/devices"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
// return Promise { promise in
|
||||
// Alamofire.request(url, method: .get, headers: headers)
|
||||
// .validate()
|
||||
// .responseJSON { response in
|
||||
//
|
||||
// switch response.result {
|
||||
//
|
||||
// case .success:
|
||||
// let devicesJSON : JSON = JSON(response.result.value!)
|
||||
// for(_, json) : (String, JSON) in devicesJSON {
|
||||
// do {
|
||||
// try realm.write {
|
||||
// let dev = Device()
|
||||
// dev.companyId = json["companyId"].intValue
|
||||
// dev.deviceTypeId = json["deviceTypeId"].intValue
|
||||
// dev.gatewayId = json["gatewayId"].intValue
|
||||
// dev.id = json["id"].intValue
|
||||
// dev.macAddress = json["macAddress"].stringValue
|
||||
// dev.techName = json["techname"].stringValue
|
||||
// dev.tenantId = json["tenantId"].intValue
|
||||
// dev.vanityName = json["vanityName"].stringValue
|
||||
//
|
||||
// let pGateway = gateways.filter("id == %d", dev.gatewayId).first
|
||||
// let pDeviceType = deviceTypes.filter("id == %d", dev.deviceTypeId).first
|
||||
//
|
||||
// realm.add(dev, update: true)
|
||||
// pGateway?.devices.append(dev)
|
||||
// pDeviceType?.devices.append(dev)
|
||||
// }
|
||||
// } catch {
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// promise.fulfill(true)
|
||||
// case .failure(let error):
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// func getGateways(addresses : Results<Address>) -> Promise<Any> {
|
||||
//
|
||||
// let realm = try! Realm()
|
||||
// let url = "\(baseURL)/gateways"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
// return Promise { promise in
|
||||
// Alamofire.request(url, method: .get, headers: headers)
|
||||
// .responseJSON { response in
|
||||
// switch response.result {
|
||||
//
|
||||
// case .success:
|
||||
// let gatewaysJSON : JSON = JSON(response.result.value!)
|
||||
// for(_, json) : (String, JSON) in gatewaysJSON {
|
||||
//
|
||||
// do {
|
||||
// try realm.write {
|
||||
// let gtw = Gateway()
|
||||
// gtw.addressId = json["addressId"].intValue
|
||||
// gtw.companyId = json["companyId"].intValue
|
||||
// gtw.diaVersion = json["diaVersion"].stringValue
|
||||
// gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
|
||||
// gtw.gatewayTypeId = json["gatewayTypeId"].intValue
|
||||
// gtw.id = json["id"].intValue
|
||||
// gtw.macAddress = json["macAddress"].stringValue
|
||||
// gtw.name = json["name"].stringValue
|
||||
// gtw.panId = json["panId"].stringValue
|
||||
// gtw.tenantId = json["tenantId"].intValue
|
||||
// gtw.userId = json["userId"].intValue
|
||||
//
|
||||
// let associatedAddress = addresses.filter("id == %d", gtw.addressId).first
|
||||
//
|
||||
// gtw.address = associatedAddress
|
||||
// realm.add(gtw, update: true)
|
||||
// }
|
||||
// } catch {
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// promise.fulfill(true)
|
||||
// case .failure(let error):
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// func getDeviceTypes() -> Promise<Any> {
|
||||
// let realm = try! Realm()
|
||||
// let url = "\(baseURL)/devicetypes"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
// return Promise { promise in
|
||||
// Alamofire.request(url, method: .get, headers: headers)
|
||||
// .responseJSON { response in
|
||||
// switch response.result {
|
||||
//
|
||||
// case .success:
|
||||
// let deviceTypesJson : JSON = JSON(response.result.value!)
|
||||
// for(_, json) : (String, JSON) in deviceTypesJson {
|
||||
// do {
|
||||
// try realm.write {
|
||||
// let dt = DeviceType()
|
||||
// dt.companyId = json["CompanyId"].intValue
|
||||
// dt.id = json["id"].intValue
|
||||
// dt.imgUrl = json["imgUrl"].stringValue
|
||||
// dt.name = json["name"].stringValue
|
||||
// dt.note = json["note"].stringValue
|
||||
// dt.tenantId = json["tenantId"].intValue
|
||||
// dt.vanityName = json["vanityName"].stringValue
|
||||
// realm.add(dt, update: true)
|
||||
// }
|
||||
// } catch {
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// promise.fulfill(true)
|
||||
// case .failure(let error):
|
||||
// promise.reject(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -15,30 +15,16 @@ import SVProgressHUD
|
||||
|
||||
class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
|
||||
let realm = try! Realm()
|
||||
|
||||
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
let channelDataTypes = (UIApplication.shared.delegate as! AppDelegate).channelDataTypes
|
||||
|
||||
let formatter = DateFormatter()
|
||||
|
||||
|
||||
|
||||
|
||||
var user : User?
|
||||
var thisDevice : Device?
|
||||
var thisChannel : Channel?
|
||||
|
||||
var channelHistory : [ChannelHistoryValue] = [ChannelHistoryValue]()
|
||||
|
||||
let channelDataTypes: [Int : String] = [
|
||||
0: "Unknown",
|
||||
1: "Float",
|
||||
2: "String",
|
||||
3: "Integer",
|
||||
4: "Boolean",
|
||||
5: "DateTime",
|
||||
6: "Timespan",
|
||||
7 :"File",
|
||||
8: "LatLng"
|
||||
]
|
||||
|
||||
@IBOutlet weak var deviceNameLabel: UILabel!
|
||||
@IBOutlet weak var nameLabel: UILabel!
|
||||
@IBOutlet weak var helpDescriptionLabel: UILabel!
|
||||
@@ -57,8 +43,9 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
|
||||
setupChannelDisplay()
|
||||
SVProgressHUD.show()
|
||||
firstly {
|
||||
getChannelHistory()
|
||||
}.done { _ in
|
||||
getChannelHistory(deviceId: (self.thisDevice?.id)!, channelId: (self.thisChannel?.id)!, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.done { (hist) in
|
||||
self.channelHistory = hist
|
||||
self.historyTableView.reloadData()
|
||||
SVProgressHUD.dismiss()
|
||||
}.catch { error in
|
||||
@@ -70,7 +57,6 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
|
||||
if segue.identifier == "openHistoryGraph" {
|
||||
let destinationVC = segue.destination as! HistoryGraphViewController
|
||||
destinationVC.channelHistory = channelHistory
|
||||
destinationVC.user = user
|
||||
destinationVC.thisChannel = thisChannel
|
||||
}
|
||||
}
|
||||
@@ -112,10 +98,11 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
|
||||
// what will happen once the user clicks the add item button on our UIAlert
|
||||
SVProgressHUD.show()
|
||||
firstly {
|
||||
self.writeChannelValue(value: textField.text!)
|
||||
writeChannelValue(deviceId: (self.thisDevice?.id)!, channelName: (self.thisChannel?.name)!, value: textField.text!, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then{ _ in
|
||||
self.getChannelHistory()
|
||||
}.done { _ in
|
||||
getChannelHistory(deviceId: (self.thisDevice?.id)!, channelId: (self.thisChannel?.id)!, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.done { (hist) in
|
||||
self.channelHistory = hist
|
||||
self.historyTableView.reloadData()
|
||||
SVProgressHUD.dismiss()
|
||||
}.catch { error in
|
||||
@@ -134,77 +121,50 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
|
||||
present(alert, animated: true, completion: nil)
|
||||
}
|
||||
|
||||
func getChannelHistory() -> Promise<Any> {
|
||||
let url = "\(baseURL)/devices/\(thisDevice!.id)/values/\(thisChannel!.id)"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { promise in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let channelHistoryJSON : JSON = JSON(response.result.value!)
|
||||
self.channelHistory.removeAll()
|
||||
for(_, json) : (String, JSON) in channelHistoryJSON {
|
||||
let chHistVal = ChannelHistoryValue()
|
||||
chHistVal.timestamp = Date(timeIntervalSince1970: Double(json["timestamp"].intValue))
|
||||
chHistVal.value = json["value"].stringValue
|
||||
self.channelHistory.append(chHistVal)
|
||||
}
|
||||
self.channelHistory.reverse()
|
||||
promise.fulfill(true)
|
||||
case .failure(let error):
|
||||
promise.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func writeChannelValue(value : String) -> Promise<Any> {
|
||||
let timestamp: Int = Int(Date().timeIntervalSince1970)
|
||||
let channelName = thisChannel?.name
|
||||
var channelJson : JSON = JSON()
|
||||
channelJson["name"].string = channelName
|
||||
channelJson["timestamp"].int = timestamp
|
||||
channelJson["value"].string = value
|
||||
|
||||
var listJson = JSON()
|
||||
listJson.arrayObject = [channelJson]
|
||||
|
||||
let url = "\(baseURL)/devices/\(thisDevice!.id)/values"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
|
||||
|
||||
return Promise { promise in
|
||||
Alamofire.request(url, method: .put, parameters: [:], encoding: listJson.rawString()!, headers: headers)
|
||||
.response { response in
|
||||
if response.response?.statusCode == 200 {
|
||||
promise.fulfill(true)
|
||||
} else {
|
||||
promise.reject(String(response.response!.statusCode) as! Error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// func writeChannelValue(value : String) -> Promise<Any> {
|
||||
// let timestamp: Int = Int(Date().timeIntervalSince1970)
|
||||
// let channelName = thisChannel?.name
|
||||
// var channelJson : JSON = JSON()
|
||||
// channelJson["name"].string = channelName
|
||||
// channelJson["timestamp"].int = timestamp
|
||||
// channelJson["value"].string = value
|
||||
//
|
||||
// var listJson = JSON()
|
||||
// listJson.arrayObject = [channelJson]
|
||||
//
|
||||
// let url = "\(baseURL)/devices/\(thisDevice!.id)/values"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
//
|
||||
//
|
||||
// return Promise { promise in
|
||||
// Alamofire.request(url, method: .put, parameters: [:], encoding: listJson.rawString()!, headers: headers)
|
||||
// .response { response in
|
||||
// if response.response?.statusCode == 200 {
|
||||
// promise.fulfill(true)
|
||||
// } else {
|
||||
// promise.reject(String(response.response!.statusCode) as! Error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
extension String: ParameterEncoding {
|
||||
|
||||
public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
|
||||
var request = try urlRequest.asURLRequest()
|
||||
request.httpBody = data(using: .utf8, allowLossyConversion: false)
|
||||
return request
|
||||
}
|
||||
|
||||
}
|
||||
//extension String: ParameterEncoding {
|
||||
//
|
||||
// public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
|
||||
// var request = try urlRequest.asURLRequest()
|
||||
// request.httpBody = data(using: .utf8, allowLossyConversion: false)
|
||||
// return request
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
|
||||
@@ -16,11 +16,10 @@ import SVProgressHUD
|
||||
class DeviceDetailViewController: UITableViewController {
|
||||
let realm = try! Realm()
|
||||
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
|
||||
var thisDevice : Device?
|
||||
var user : User?
|
||||
var deviceTypes : Results<DeviceType>?
|
||||
|
||||
var selectedChannel : Channel?
|
||||
|
||||
override func viewDidLoad() {
|
||||
@@ -43,9 +42,9 @@ class DeviceDetailViewController: UITableViewController {
|
||||
// tableView.addSubview(refreshControl!)
|
||||
|
||||
firstly {
|
||||
getChannels(deviceTypeId: thisDevice!.deviceTypeId)
|
||||
getChannels(deviceTypeId: thisDevice!.deviceTypeId, baseURL: baseURL, authToken: (user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getChannelValues(deviceId: self.thisDevice!.id)
|
||||
getChannelValues(deviceId: self.thisDevice!.id, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.done { _ in
|
||||
self.tableView.reloadData()
|
||||
SVProgressHUD.dismiss()
|
||||
@@ -59,9 +58,9 @@ class DeviceDetailViewController: UITableViewController {
|
||||
@objc func refresh() {
|
||||
SVProgressHUD.show()
|
||||
firstly {
|
||||
getChannels(deviceTypeId: thisDevice!.deviceTypeId)
|
||||
getChannels(deviceTypeId: thisDevice!.deviceTypeId, baseURL: baseURL, authToken: (user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getChannelValues(deviceId: self.thisDevice!.id)
|
||||
getChannelValues(deviceId: self.thisDevice!.id, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.done { _ in
|
||||
self.tableView.reloadData()
|
||||
SVProgressHUD.dismiss()
|
||||
@@ -102,7 +101,6 @@ class DeviceDetailViewController: UITableViewController {
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "goToChannelView" {
|
||||
let destinationVC = segue.destination as! ChannelDetailViewController
|
||||
destinationVC.user = user!
|
||||
destinationVC.thisDevice = thisDevice!
|
||||
destinationVC.thisChannel = selectedChannel!
|
||||
|
||||
@@ -112,92 +110,92 @@ class DeviceDetailViewController: UITableViewController {
|
||||
|
||||
//MARK: - Data Methods
|
||||
|
||||
func getChannels(deviceTypeId: Int) -> Promise<Any> {
|
||||
let url = "\(baseURL)/devicetypes/\(deviceTypeId)/channels"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let channelsJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in channelsJSON {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let ch = Channel()
|
||||
ch.channelType = json["channelType"].intValue
|
||||
ch.dataType = json["dataType"].intValue
|
||||
ch.defaultValue = json["defaultValue"].stringValue
|
||||
ch.deviceTypeId = json["deviceTypeId"].intValue
|
||||
ch.fromMe = json["fromMe"].boolValue
|
||||
ch.helpExplanation = json["helpExplanation"].stringValue
|
||||
ch.id = json["id"].intValue
|
||||
ch.io = json["io"].boolValue
|
||||
ch.name = json["name"].stringValue
|
||||
ch.regex = json["regex"].stringValue
|
||||
ch.regexErrMsg = json["regexErrMsg"].stringValue
|
||||
ch.subTitle = json["subTitle"].stringValue
|
||||
|
||||
let pDeviceType = self.deviceTypes?.filter("id == %d", ch.deviceTypeId).first
|
||||
|
||||
self.realm.add(ch, update: true)
|
||||
pDeviceType?.channels.append(ch)
|
||||
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// func getChannels(deviceTypeId: Int) -> Promise<Any> {
|
||||
// let url = "\(baseURL)/devicetypes/\(deviceTypeId)/channels"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
// return Promise { seal in
|
||||
// Alamofire.request(url, method: .get, headers: headers)
|
||||
// .responseJSON { response in
|
||||
// switch response.result {
|
||||
//
|
||||
// case .success:
|
||||
// let channelsJSON : JSON = JSON(response.result.value!)
|
||||
// for(_, json) : (String, JSON) in channelsJSON {
|
||||
// do {
|
||||
// try self.realm.write {
|
||||
// let ch = Channel()
|
||||
// ch.channelType = json["channelType"].intValue
|
||||
// ch.dataType = json["dataType"].intValue
|
||||
// ch.defaultValue = json["defaultValue"].stringValue
|
||||
// ch.deviceTypeId = json["deviceTypeId"].intValue
|
||||
// ch.fromMe = json["fromMe"].boolValue
|
||||
// ch.helpExplanation = json["helpExplanation"].stringValue
|
||||
// ch.id = json["id"].intValue
|
||||
// ch.io = json["io"].boolValue
|
||||
// ch.name = json["name"].stringValue
|
||||
// ch.regex = json["regex"].stringValue
|
||||
// ch.regexErrMsg = json["regexErrMsg"].stringValue
|
||||
// ch.subTitle = json["subTitle"].stringValue
|
||||
//
|
||||
// let pDeviceType = self.deviceTypes?.filter("id == %d", ch.deviceTypeId).first
|
||||
//
|
||||
// self.realm.add(ch, update: true)
|
||||
// pDeviceType?.channels.append(ch)
|
||||
//
|
||||
// }
|
||||
// } catch {
|
||||
// seal.reject(error)
|
||||
// }
|
||||
// }
|
||||
// seal.fulfill(true)
|
||||
// case .failure(let error):
|
||||
// seal.reject(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
func getChannelValues(deviceId: Int) -> Promise<Any> {
|
||||
let url = "\(baseURL)/devices/\(deviceId)/values"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { prom in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let channelValJSON : JSON = JSON(response.result.value!)
|
||||
|
||||
for(chName, json) : (String, JSON) in channelValJSON {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let chv = ChanValue()
|
||||
chv.uid = "\(deviceId).\(chName)"
|
||||
chv.name = chName
|
||||
chv.value = json["value"].stringValue
|
||||
chv.timestamp = json["timestamp"].intValue
|
||||
|
||||
self.realm.add(chv, update: true)
|
||||
self.thisDevice!.values.append(chv)
|
||||
|
||||
}
|
||||
} catch {
|
||||
prom.reject(error)
|
||||
}
|
||||
}
|
||||
prom.fulfill(true)
|
||||
case .failure(let error):
|
||||
prom.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// func getChannelValues(deviceId: Int) -> Promise<Any> {
|
||||
// let url = "\(baseURL)/devices/\(deviceId)/values"
|
||||
// let headers : HTTPHeaders = [
|
||||
// "Authorization": user!.authToken
|
||||
// ]
|
||||
//
|
||||
// return Promise { prom in
|
||||
// Alamofire.request(url, method: .get, headers: headers)
|
||||
// .responseJSON { response in
|
||||
// switch response.result {
|
||||
//
|
||||
// case .success:
|
||||
// let channelValJSON : JSON = JSON(response.result.value!)
|
||||
//
|
||||
// for(chName, json) : (String, JSON) in channelValJSON {
|
||||
// do {
|
||||
// try self.realm.write {
|
||||
// let chv = ChanValue()
|
||||
// chv.uid = "\(deviceId).\(chName)"
|
||||
// chv.name = chName
|
||||
// chv.value = json["value"].stringValue
|
||||
// chv.timestamp = json["timestamp"].intValue
|
||||
//
|
||||
// self.realm.add(chv, update: true)
|
||||
// self.thisDevice!.values.append(chv)
|
||||
//
|
||||
// }
|
||||
// } catch {
|
||||
// prom.reject(error)
|
||||
// }
|
||||
// }
|
||||
// prom.fulfill(true)
|
||||
// case .failure(let error):
|
||||
// prom.reject(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
func loadData() -> Promise<Void> {
|
||||
return Promise { promise in
|
||||
|
||||
@@ -16,7 +16,7 @@ import SVProgressHUD
|
||||
class DeviceListViewController: UITableViewController {
|
||||
let realm = try! Realm()
|
||||
|
||||
var user : User?
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
var addresses : Results<Address>?
|
||||
var gateways : Results<Gateway>?
|
||||
var devices : Results<Device>?
|
||||
@@ -49,13 +49,13 @@ class DeviceListViewController: UITableViewController {
|
||||
func loadJSONData() -> Promise<Void>{
|
||||
return Promise { promise in
|
||||
firstly {
|
||||
self.getDeviceTypes()
|
||||
getDeviceTypes(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getAddresses()
|
||||
getAddresses(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getGateways()
|
||||
getGateways(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getDevices()
|
||||
getDevices(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.done{ _ in
|
||||
promise.fulfill(())
|
||||
}.catch { error in
|
||||
@@ -100,14 +100,8 @@ class DeviceListViewController: UITableViewController {
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "openMapView" {
|
||||
let destinationVC = segue.destination as! MapViewController
|
||||
destinationVC.user = user!
|
||||
}
|
||||
|
||||
if segue.identifier == "openDeviceDetailView" {
|
||||
let destinationVC = segue.destination as! DeviceDetailViewController
|
||||
destinationVC.user = user!
|
||||
destinationVC.thisDevice = selectedDevice!
|
||||
}
|
||||
}
|
||||
@@ -127,191 +121,6 @@ class DeviceListViewController: UITableViewController {
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Data Methods
|
||||
|
||||
func getAddresses() ->Promise<Any> {
|
||||
let url = "\(baseURL)/addresses"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.validate()
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let addressesJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in addressesJSON {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let addr = Address()
|
||||
addr.id = json["id"].intValue
|
||||
addr.apartment = json["id"].stringValue
|
||||
addr.city = json["city"].stringValue
|
||||
addr.country = json["country"].stringValue
|
||||
addr.lat = json["lat"].doubleValue
|
||||
addr.long = json["long"].doubleValue
|
||||
addr.state = json["state"].stringValue
|
||||
addr.street1 = json["street1"].stringValue
|
||||
addr.street2 = json["street2"].stringValue
|
||||
addr.zip = json["zip"].stringValue
|
||||
addr.zoneId = json["zoneid"].intValue
|
||||
self.realm.add(addr, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func getDevices() ->Promise<Any> {
|
||||
let url = "\(baseURL)/devices"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.validate()
|
||||
.responseJSON { response in
|
||||
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let devicesJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in devicesJSON {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let dev = Device()
|
||||
dev.companyId = json["companyId"].intValue
|
||||
dev.deviceTypeId = json["deviceTypeId"].intValue
|
||||
dev.gatewayId = json["gatewayId"].intValue
|
||||
dev.id = json["id"].intValue
|
||||
dev.macAddress = json["macAddress"].stringValue
|
||||
dev.techName = json["techname"].stringValue
|
||||
dev.tenantId = json["tenantId"].intValue
|
||||
dev.vanityName = json["vanityName"].stringValue
|
||||
|
||||
let pGateway = self.gateways?.filter("id == %d", dev.gatewayId).first
|
||||
let pDeviceType = self.deviceTypes?.filter("id == %d", dev.deviceTypeId).first
|
||||
|
||||
self.realm.add(dev, update: true)
|
||||
pGateway?.devices.append(dev)
|
||||
pDeviceType?.devices.append(dev)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func getGateways() -> Promise<Any> {
|
||||
let url = "\(baseURL)/gateways"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let gatewaysJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in gatewaysJSON {
|
||||
|
||||
do {
|
||||
try self.realm.write {
|
||||
let gtw = Gateway()
|
||||
gtw.addressId = json["addressId"].intValue
|
||||
gtw.companyId = json["companyId"].intValue
|
||||
gtw.diaVersion = json["diaVersion"].stringValue
|
||||
gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
|
||||
gtw.gatewayTypeId = json["gatewayTypeId"].intValue
|
||||
gtw.id = json["id"].intValue
|
||||
gtw.macAddress = json["macAddress"].stringValue
|
||||
gtw.name = json["name"].stringValue
|
||||
gtw.panId = json["panId"].stringValue
|
||||
gtw.tenantId = json["tenantId"].intValue
|
||||
gtw.userId = json["userId"].intValue
|
||||
|
||||
let associatedAddress = self.addresses?.filter("id == %d", gtw.addressId).first
|
||||
|
||||
gtw.address = associatedAddress
|
||||
self.realm.add(gtw, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func getDeviceTypes() -> Promise<Any> {
|
||||
let url = "\(baseURL)/devicetypes"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let deviceTypesJson : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in deviceTypesJson {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let dt = DeviceType()
|
||||
dt.companyId = json["CompanyId"].intValue
|
||||
dt.id = json["id"].intValue
|
||||
dt.imgUrl = json["imgUrl"].stringValue
|
||||
dt.name = json["name"].stringValue
|
||||
dt.note = json["note"].stringValue
|
||||
dt.tenantId = json["tenantId"].intValue
|
||||
dt.vanityName = json["vanityName"].stringValue
|
||||
self.realm.add(dt, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Realm Functions
|
||||
|
||||
func loadRealmData() -> Promise<Void> {
|
||||
|
||||
@@ -10,25 +10,17 @@ import UIKit
|
||||
import SwiftChart
|
||||
|
||||
class HistoryGraphViewController: UIViewController, ChartDelegate{
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
let channelDataTypes = (UIApplication.shared.delegate as! AppDelegate).channelDataTypes
|
||||
|
||||
@IBOutlet weak var leftConstraint: NSLayoutConstraint!
|
||||
@IBOutlet weak var lineChart: Chart!
|
||||
@IBOutlet weak var label: UILabel!
|
||||
|
||||
var thisChannel : Channel?
|
||||
var channelHistory : [ChannelHistoryValue] = [ChannelHistoryValue]()
|
||||
var user : User?
|
||||
var dateFormatter = DateFormatter()
|
||||
|
||||
let channelDataTypes: [Int : String] = [
|
||||
0: "Unknown",
|
||||
1: "Float",
|
||||
2: "String",
|
||||
3: "Integer",
|
||||
4: "Boolean",
|
||||
5: "DateTime",
|
||||
6: "Timespan",
|
||||
7 :"File",
|
||||
8: "LatLng"
|
||||
]
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
@@ -28,7 +28,7 @@ extension String {
|
||||
class LoginViewController: UIViewController {
|
||||
|
||||
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
|
||||
var user : User?
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
|
||||
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Auth.plist")
|
||||
|
||||
@@ -51,7 +51,7 @@ class LoginViewController: UIViewController {
|
||||
firstly {
|
||||
fetchCurrentUser(authToken: authToken)
|
||||
}.done { fetchedUser in
|
||||
self.user = fetchedUser
|
||||
(UIApplication.shared.delegate as! AppDelegate).user = fetchedUser
|
||||
self.saveAuth()
|
||||
SVProgressHUD.dismiss()
|
||||
SVProgressHUD.showSuccess(withStatus: "Login Success")
|
||||
@@ -100,15 +100,9 @@ class LoginViewController: UIViewController {
|
||||
|
||||
|
||||
@IBAction func logOutPressed(_ sender: UIBarButtonItem) {
|
||||
user = User()
|
||||
(UIApplication.shared.delegate as! AppDelegate).user = User()
|
||||
saveAuth()
|
||||
}
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "logInSegue" {
|
||||
let destinationVC = segue.destination as! DeviceListViewController
|
||||
destinationVC.user = user
|
||||
}
|
||||
}
|
||||
|
||||
func saveAuth(){
|
||||
let encoder = PropertyListEncoder()
|
||||
@@ -132,7 +126,7 @@ class LoginViewController: UIViewController {
|
||||
firstly {
|
||||
fetchCurrentUser(authToken: storedUser.authToken)
|
||||
}.done { currentUser in
|
||||
self.user = currentUser
|
||||
(UIApplication.shared.delegate as! AppDelegate).user = currentUser
|
||||
SVProgressHUD.dismiss()
|
||||
SVProgressHUD.showSuccess(withStatus: "Found User!")
|
||||
self.performSegue(withIdentifier: "logInSegue", sender: nil)
|
||||
|
||||
@@ -17,8 +17,8 @@ import SVProgressHUD
|
||||
class MapDetailViewController: UIViewController, MKMapViewDelegate, UITableViewDataSource, UITableViewDelegate {
|
||||
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
|
||||
let realm = try! Realm()
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
|
||||
var user : User?
|
||||
var gateway: Gateway?
|
||||
var devices : Results<Device>?
|
||||
var selectedDevice : Device?
|
||||
@@ -113,7 +113,6 @@ class MapDetailViewController: UIViewController, MKMapViewDelegate, UITableViewD
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "openDeviceDetailView" {
|
||||
let destinationVC = segue.destination as! DeviceDetailViewController
|
||||
destinationVC.user = user!
|
||||
destinationVC.thisDevice = selectedDevice!
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,8 @@ class MapViewController: UIViewController, MKMapViewDelegate {
|
||||
let realm = try! Realm()
|
||||
|
||||
let locationManager = CLLocationManager()
|
||||
let user = (UIApplication.shared.delegate as! AppDelegate).user
|
||||
|
||||
|
||||
|
||||
var user : User?
|
||||
var addresses : Results<Address>?
|
||||
var gateways : Results<Gateway>?
|
||||
var devices : Results<Device>?
|
||||
@@ -42,13 +40,13 @@ class MapViewController: UIViewController, MKMapViewDelegate {
|
||||
SVProgressHUD.show()
|
||||
loadData()
|
||||
firstly {
|
||||
getDeviceTypes()
|
||||
getDeviceTypes(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getAddresses()
|
||||
getAddresses(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getGateways()
|
||||
getGateways(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.then { _ in
|
||||
self.getDevices()
|
||||
getDevices(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
|
||||
}.done { _ in
|
||||
self.showMarkersOnMap()
|
||||
SVProgressHUD.dismiss()
|
||||
@@ -111,201 +109,10 @@ class MapViewController: UIViewController, MKMapViewDelegate {
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "openDetailView" {
|
||||
let destinationVC = segue.destination as! MapDetailViewController
|
||||
destinationVC.user = user!
|
||||
destinationVC.gateway = selectedGateway
|
||||
}
|
||||
|
||||
if segue.identifier == "openListView" {
|
||||
let destinationVC = segue.destination as! DeviceListViewController
|
||||
destinationVC.user = user!
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Data Methods
|
||||
|
||||
func getAddresses() ->Promise<Any> {
|
||||
let url = "\(baseURL)/addresses"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.validate()
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let addressesJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in addressesJSON {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let addr = Address()
|
||||
addr.id = json["id"].intValue
|
||||
addr.apartment = json["apartment"].stringValue
|
||||
addr.city = json["city"].stringValue
|
||||
addr.country = json["country"].stringValue
|
||||
addr.lat = json["lat"].doubleValue
|
||||
addr.long = json["long"].doubleValue
|
||||
addr.state = json["state"].stringValue
|
||||
addr.street1 = json["street1"].stringValue
|
||||
addr.street2 = json["street2"].stringValue
|
||||
addr.zip = json["zip"].stringValue
|
||||
addr.zoneId = json["zoneid"].intValue
|
||||
self.realm.add(addr, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func getDevices() ->Promise<Any> {
|
||||
let url = "\(baseURL)/devices"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.validate()
|
||||
.responseJSON { response in
|
||||
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let devicesJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in devicesJSON {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let dev = Device()
|
||||
dev.companyId = json["companyId"].intValue
|
||||
dev.deviceTypeId = json["deviceTypeId"].intValue
|
||||
dev.gatewayId = json["gatewayId"].intValue
|
||||
dev.id = json["id"].intValue
|
||||
dev.macAddress = json["macAddress"].stringValue
|
||||
dev.techName = json["techname"].stringValue
|
||||
dev.tenantId = json["tenantId"].intValue
|
||||
dev.vanityName = json["vanityName"].stringValue
|
||||
|
||||
let pGateway = self.gateways?.filter("id == %d", dev.gatewayId).first
|
||||
let pDeviceType = self.deviceTypes?.filter("id == %d", dev.deviceTypeId).first
|
||||
|
||||
self.realm.add(dev, update: true)
|
||||
pGateway?.devices.append(dev)
|
||||
pDeviceType?.devices.append(dev)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func getGateways() -> Promise<Any> {
|
||||
let url = "\(baseURL)/gateways"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let gatewaysJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in gatewaysJSON {
|
||||
|
||||
do {
|
||||
try self.realm.write {
|
||||
let gtw = Gateway()
|
||||
gtw.addressId = json["addressId"].intValue
|
||||
gtw.companyId = json["companyId"].intValue
|
||||
gtw.diaVersion = json["diaVersion"].stringValue
|
||||
gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
|
||||
gtw.gatewayTypeId = json["gatewayTypeId"].intValue
|
||||
gtw.id = json["id"].intValue
|
||||
gtw.macAddress = json["macAddress"].stringValue
|
||||
gtw.name = json["name"].stringValue
|
||||
gtw.panId = json["panId"].stringValue
|
||||
gtw.tenantId = json["tenantId"].intValue
|
||||
gtw.userId = json["userId"].intValue
|
||||
|
||||
let associatedAddress = self.addresses?.filter("id == %d", gtw.addressId).first
|
||||
gtw.address = associatedAddress
|
||||
self.realm.add(gtw, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func getDeviceTypes() -> Promise<Any> {
|
||||
let url = "\(baseURL)/devicetypes"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": user!.authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let deviceTypesJson : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in deviceTypesJson {
|
||||
do {
|
||||
try self.realm.write {
|
||||
let dt = DeviceType()
|
||||
dt.companyId = json["CompanyId"].intValue
|
||||
dt.id = json["id"].intValue
|
||||
dt.imgUrl = json["imgUrl"].stringValue
|
||||
dt.name = json["name"].stringValue
|
||||
dt.note = json["note"].stringValue
|
||||
dt.tenantId = json["tenantId"].intValue
|
||||
dt.vanityName = json["vanityName"].stringValue
|
||||
self.realm.add(dt, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Realm Functions
|
||||
|
||||
func loadData() {
|
||||
|
||||
358
pocloud/Controller/MeshifyFunctions.swift
Normal file
358
pocloud/Controller/MeshifyFunctions.swift
Normal file
@@ -0,0 +1,358 @@
|
||||
//
|
||||
// MeshifyFunctions.swift
|
||||
// pocloud
|
||||
//
|
||||
// Created by Patrick McDonagh on 5/29/18.
|
||||
// Copyright © 2018 patrickjmcd. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
import Alamofire
|
||||
import SwiftyJSON
|
||||
import PromiseKit
|
||||
|
||||
func getDeviceTypes(baseURL : String, authToken : String) -> Promise<Any> {
|
||||
let realm = try! Realm()
|
||||
let url = "\(baseURL)/devicetypes"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let deviceTypesJson : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in deviceTypesJson {
|
||||
do {
|
||||
try realm.write {
|
||||
let dt = DeviceType()
|
||||
dt.companyId = json["CompanyId"].intValue
|
||||
dt.id = json["id"].intValue
|
||||
dt.imgUrl = json["imgUrl"].stringValue
|
||||
dt.name = json["name"].stringValue
|
||||
dt.note = json["note"].stringValue
|
||||
dt.tenantId = json["tenantId"].intValue
|
||||
dt.vanityName = json["vanityName"].stringValue
|
||||
realm.add(dt, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func getAddresses(baseURL : String, authToken : String) ->Promise<Any> {
|
||||
let realm = try! Realm()
|
||||
let url = "\(baseURL)/addresses"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.validate()
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let addressesJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in addressesJSON {
|
||||
do {
|
||||
try realm.write {
|
||||
let addr = Address()
|
||||
addr.id = json["id"].intValue
|
||||
addr.apartment = json["id"].stringValue
|
||||
addr.city = json["city"].stringValue
|
||||
addr.country = json["country"].stringValue
|
||||
addr.lat = json["lat"].doubleValue
|
||||
addr.long = json["long"].doubleValue
|
||||
addr.state = json["state"].stringValue
|
||||
addr.street1 = json["street1"].stringValue
|
||||
addr.street2 = json["street2"].stringValue
|
||||
addr.zip = json["zip"].stringValue
|
||||
addr.zoneId = json["zoneid"].intValue
|
||||
realm.add(addr, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func getGateways(baseURL : String, authToken : String) -> Promise<Any> {
|
||||
let realm = try! Realm()
|
||||
let url = "\(baseURL)/gateways"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let gatewaysJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in gatewaysJSON {
|
||||
|
||||
do {
|
||||
try realm.write {
|
||||
let gtw = Gateway()
|
||||
gtw.addressId = json["addressId"].intValue
|
||||
gtw.companyId = json["companyId"].intValue
|
||||
gtw.diaVersion = json["diaVersion"].stringValue
|
||||
gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
|
||||
gtw.gatewayTypeId = json["gatewayTypeId"].intValue
|
||||
gtw.id = json["id"].intValue
|
||||
gtw.macAddress = json["macAddress"].stringValue
|
||||
gtw.name = json["name"].stringValue
|
||||
gtw.panId = json["panId"].stringValue
|
||||
gtw.tenantId = json["tenantId"].intValue
|
||||
gtw.userId = json["userId"].intValue
|
||||
|
||||
let associatedAddress = realm.objects(Address.self).filter("id == %d", gtw.addressId).first
|
||||
|
||||
gtw.address = associatedAddress
|
||||
realm.add(gtw, update: true)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getDevices(baseURL : String, authToken : String) ->Promise<Any> {
|
||||
let realm = try! Realm()
|
||||
let url = "\(baseURL)/devices"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.validate()
|
||||
.responseJSON { response in
|
||||
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let devicesJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in devicesJSON {
|
||||
do {
|
||||
try realm.write {
|
||||
let dev = Device()
|
||||
dev.companyId = json["companyId"].intValue
|
||||
dev.deviceTypeId = json["deviceTypeId"].intValue
|
||||
dev.gatewayId = json["gatewayId"].intValue
|
||||
dev.id = json["id"].intValue
|
||||
dev.macAddress = json["macAddress"].stringValue
|
||||
dev.techName = json["techname"].stringValue
|
||||
dev.tenantId = json["tenantId"].intValue
|
||||
dev.vanityName = json["vanityName"].stringValue
|
||||
|
||||
let pGateway = realm.objects(Gateway.self).filter("id == %d", dev.gatewayId).first
|
||||
let pDeviceType = realm.objects(DeviceType.self).filter("id == %d", dev.deviceTypeId).first
|
||||
|
||||
realm.add(dev, update: true)
|
||||
pGateway?.devices.append(dev)
|
||||
pDeviceType?.devices.append(dev)
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getChannels(deviceTypeId: Int, baseURL : String, authToken : String) -> Promise<Any> {
|
||||
let realm = try! Realm()
|
||||
let url = "\(baseURL)/devicetypes/\(deviceTypeId)/channels"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { seal in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let channelsJSON : JSON = JSON(response.result.value!)
|
||||
for(_, json) : (String, JSON) in channelsJSON {
|
||||
do {
|
||||
try realm.write {
|
||||
let ch = Channel()
|
||||
ch.channelType = json["channelType"].intValue
|
||||
ch.dataType = json["dataType"].intValue
|
||||
ch.defaultValue = json["defaultValue"].stringValue
|
||||
ch.deviceTypeId = json["deviceTypeId"].intValue
|
||||
ch.fromMe = json["fromMe"].boolValue
|
||||
ch.helpExplanation = json["helpExplanation"].stringValue
|
||||
ch.id = json["id"].intValue
|
||||
ch.io = json["io"].boolValue
|
||||
ch.name = json["name"].stringValue
|
||||
ch.regex = json["regex"].stringValue
|
||||
ch.regexErrMsg = json["regexErrMsg"].stringValue
|
||||
ch.subTitle = json["subTitle"].stringValue
|
||||
|
||||
let pDeviceType = realm.objects(DeviceType.self).filter("id == %d", ch.deviceTypeId).first
|
||||
|
||||
realm.add(ch, update: true)
|
||||
pDeviceType?.channels.append(ch)
|
||||
|
||||
}
|
||||
} catch {
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
seal.fulfill(true)
|
||||
case .failure(let error):
|
||||
seal.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func getChannelValues(deviceId: Int, baseURL : String, authToken : String) -> Promise<Any> {
|
||||
let realm = try! Realm()
|
||||
let url = "\(baseURL)/devices/\(deviceId)/values"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { prom in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let channelValJSON : JSON = JSON(response.result.value!)
|
||||
|
||||
for(chName, json) : (String, JSON) in channelValJSON {
|
||||
do {
|
||||
try realm.write {
|
||||
let chv = ChanValue()
|
||||
chv.uid = "\(deviceId).\(chName)"
|
||||
chv.name = chName
|
||||
chv.value = json["value"].stringValue
|
||||
chv.timestamp = json["timestamp"].intValue
|
||||
|
||||
realm.add(chv, update: true)
|
||||
realm.objects(Device.self).filter("id == %d", deviceId).first?.values.append(chv)
|
||||
}
|
||||
} catch {
|
||||
prom.reject(error)
|
||||
}
|
||||
}
|
||||
prom.fulfill(true)
|
||||
case .failure(let error):
|
||||
prom.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getChannelHistory(deviceId: Int, channelId : Int, baseURL : String, authToken : String) -> Promise<[ChannelHistoryValue]> {
|
||||
let url = "\(baseURL)/devices/\(deviceId)/values/\(channelId)"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
return Promise { promise in
|
||||
Alamofire.request(url, method: .get, headers: headers)
|
||||
.responseJSON { response in
|
||||
switch response.result {
|
||||
|
||||
case .success:
|
||||
let channelHistoryJSON : JSON = JSON(response.result.value!)
|
||||
var channelHistory = [ChannelHistoryValue]()
|
||||
for(_, json) : (String, JSON) in channelHistoryJSON {
|
||||
let chHistVal = ChannelHistoryValue()
|
||||
chHistVal.timestamp = Date(timeIntervalSince1970: Double(json["timestamp"].intValue))
|
||||
chHistVal.value = json["value"].stringValue
|
||||
channelHistory.append(chHistVal)
|
||||
}
|
||||
channelHistory.reverse()
|
||||
promise.fulfill(channelHistory)
|
||||
case .failure(let error):
|
||||
promise.reject(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func writeChannelValue(deviceId: Int, channelName: String, value : String, baseURL : String, authToken : String) -> Promise<Any> {
|
||||
let timestamp: Int = Int(Date().timeIntervalSince1970)
|
||||
var channelJson : JSON = JSON()
|
||||
channelJson["name"].string = channelName
|
||||
channelJson["timestamp"].int = timestamp
|
||||
channelJson["value"].string = value
|
||||
|
||||
var listJson = JSON()
|
||||
listJson.arrayObject = [channelJson]
|
||||
|
||||
let url = "\(baseURL)/devices/\(deviceId)/values"
|
||||
let headers : HTTPHeaders = [
|
||||
"Authorization": authToken
|
||||
]
|
||||
|
||||
|
||||
|
||||
return Promise { promise in
|
||||
Alamofire.request(url, method: .put, parameters: [:], encoding: listJson.rawString()!, headers: headers)
|
||||
.response { response in
|
||||
if response.response?.statusCode == 200 {
|
||||
promise.fulfill(true)
|
||||
} else {
|
||||
promise.reject(String(response.response!.statusCode) as! Error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension String: ParameterEncoding {
|
||||
|
||||
public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
|
||||
var request = try urlRequest.asURLRequest()
|
||||
request.httpBody = data(using: .utf8, allowLossyConversion: false)
|
||||
return request
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
21
pocloud/Controller/NavigationController.swift
Normal file
21
pocloud/Controller/NavigationController.swift
Normal file
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// NavigationController.swift
|
||||
// pocloud
|
||||
//
|
||||
// Created by Patrick McDonagh on 5/29/18.
|
||||
// Copyright © 2018 patrickjmcd. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ChameleonFramework
|
||||
|
||||
class NavigationController: UINavigationController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
// Do any additional setup after loading the view.
|
||||
self.navigationBar.tintColor = UIColor.flatSkyBlue()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="iJg-Zc-arO">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="iJg-Zc-arO">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
@@ -655,10 +655,11 @@
|
||||
<!--Navigation Controller-->
|
||||
<scene sceneID="zCd-ds-i4W">
|
||||
<objects>
|
||||
<navigationController id="iJg-Zc-arO" sceneMemberID="viewController">
|
||||
<navigationController id="iJg-Zc-arO" customClass="NavigationController" customModule="pocloud" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="eWM-wh-jgG">
|
||||
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<color key="barTintColor" red="0.90823972225189209" green="0.92638683319091797" blue="0.9317171573638916" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</navigationBar>
|
||||
<connections>
|
||||
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="d2l-6j-5nr"/>
|
||||
|
||||
Reference in New Issue
Block a user