diff --git a/HomeAssistant/HAAPI.swift b/HomeAssistant/HAAPI.swift index af5d38629..40fc90102 100644 --- a/HomeAssistant/HAAPI.swift +++ b/HomeAssistant/HAAPI.swift @@ -286,40 +286,42 @@ public class HomeAssistantAPI { Crashlytics.sharedInstance().recordError(error) } - if let zoneEntities: [Zone] = HomeAssistantAPI.sharedInstance.cachedEntities!.filter({ (entity) -> Bool in - return entity.Domain == "zone" - // swiftlint:disable:next force_cast - }) as? [Zone] { - for zone in zoneEntities { - if zone.TrackingEnabled == false { - print("Skipping zone set to not track!") - continue - } - do { - try Location.monitor(regionAt: zone.locationCoordinates(), radius: zone.Radius, enter: { _ in - print("Entered in region!") - self.submitLocation(updateType: LocationUpdateTypes.RegionEnter, - coordinates: zone.locationCoordinates(), - accuracy: 1, - zone: zone) - }, exit: { _ in - print("Exited from the region") - self.submitLocation(updateType: LocationUpdateTypes.RegionExit, - coordinates: zone.locationCoordinates(), - accuracy: 1, - zone: zone) - }, error: { req, error in - CLSLogv("Error in region monitoring: %@", getVaList([error.localizedDescription])) + if let cachedEntities = HomeAssistantAPI.sharedInstance.cachedEntities { + if let zoneEntities: [Zone] = cachedEntities.filter({ (entity) -> Bool in + return entity.Domain == "zone" + // swiftlint:disable:next force_cast + }) as? [Zone] { + for zone in zoneEntities { + if zone.TrackingEnabled == false { + print("Skipping zone set to not track!") + continue + } + do { + try Location.monitor(regionAt: zone.locationCoordinates(), radius: zone.Radius, enter: { _ in + print("Entered in region!") + self.submitLocation(updateType: LocationUpdateTypes.RegionEnter, + coordinates: zone.locationCoordinates(), + accuracy: 1, + zone: zone) + }, exit: { _ in + print("Exited from the region") + self.submitLocation(updateType: LocationUpdateTypes.RegionExit, + coordinates: zone.locationCoordinates(), + accuracy: 1, + zone: zone) + }, error: { req, error in + CLSLogv("Error in region monitoring: %@", getVaList([error.localizedDescription])) + Crashlytics.sharedInstance().recordError(error) + req.cancel() + }) + } catch let error { + CLSLogv("Error when setting up zones for tracking: %@", getVaList([error.localizedDescription])) Crashlytics.sharedInstance().recordError(error) - req.cancel() - }) - } catch let error { - CLSLogv("Error when setting up zones for tracking: %@", getVaList([error.localizedDescription])) - Crashlytics.sharedInstance().recordError(error) + } } } - } + } // let location = Location() // // self.getBeacons().then { beacons -> Void in diff --git a/HomeAssistant/Views/DevicesMapViewController.swift b/HomeAssistant/Views/DevicesMapViewController.swift index 8390b5d64..e1f7a3081 100644 --- a/HomeAssistant/Views/DevicesMapViewController.swift +++ b/HomeAssistant/Views/DevicesMapViewController.swift @@ -77,43 +77,41 @@ class DevicesMapViewController: UIViewController, MKMapViewDelegate { self.setToolbarItems([locateMeButton, flexibleSpace, segmentedControlButtonItem, flexibleSpace], animated: true) - if let zoneEntities: [Zone] = HomeAssistantAPI.sharedInstance.cachedEntities!.filter({ (entity) -> Bool in - return entity.Domain == "zone" - }) as? [Zone] { - for zone in zoneEntities { - let circle = HACircle.init(center: zone.locationCoordinates(), radius: CLLocationDistance(zone.Radius)) - circle.type = "zone" - mapView.add(circle) - } - } - - // swiftlint:disable:next line_length - if let deviceEntities: [DeviceTracker] = HomeAssistantAPI.sharedInstance.cachedEntities!.filter({ (entity) -> Bool in - return entity.Domain == "device_tracker" - }) as? [DeviceTracker] { - for device in deviceEntities { - if device.Latitude.value == nil || device.Longitude.value == nil { - continue - } - let dropPin = DeviceAnnotation() - dropPin.coordinate = device.locationCoordinates() - dropPin.title = device.Name - var subtitlePieces: [String] = [] - // if let changedTime = device.LastChanged { - // subtitlePieces.append("Last seen: "+changedTime.toRelativeString(abbreviated: true, - // maxUnits: 1)!+" ago") - // } - if let battery = device.Battery.value { - subtitlePieces.append("Battery: "+String(battery)+"%") + if let cachedEntities = HomeAssistantAPI.sharedInstance.cachedEntities { + if let zoneEntities: [Zone] = cachedEntities.filter({ (entity) -> Bool in + return entity.Domain == "zone" + }) as? [Zone] { + for zone in zoneEntities { + // swiftlint:disable:next line_length + let circle = HACircle.init(center: zone.locationCoordinates(), radius: CLLocationDistance(zone.Radius)) + circle.type = "zone" + mapView.add(circle) } - dropPin.subtitle = subtitlePieces.joined(separator: " / ") - dropPin.device = device - mapView.addAnnotation(dropPin) + } - if let radius = device.GPSAccuracy.value { - let circle = HACircle.init(center: device.locationCoordinates(), radius: radius) - circle.type = "device" - mapView.add(circle) + if let deviceEntities: [DeviceTracker] = cachedEntities.filter({ (entity) -> Bool in + return entity.Domain == "device_tracker" + }) as? [DeviceTracker] { + for device in deviceEntities { + if device.Latitude.value == nil || device.Longitude.value == nil { + continue + } + let dropPin = DeviceAnnotation() + dropPin.coordinate = device.locationCoordinates() + dropPin.title = device.Name + var subtitlePieces: [String] = [] + if let battery = device.Battery.value { + subtitlePieces.append("Battery: "+String(battery)+"%") + } + dropPin.subtitle = subtitlePieces.joined(separator: " / ") + dropPin.device = device + mapView.addAnnotation(dropPin) + + if let radius = device.GPSAccuracy.value { + let circle = HACircle.init(center: device.locationCoordinates(), radius: radius) + circle.type = "device" + mapView.add(circle) + } } } } diff --git a/HomeAssistant/Views/SettingsDetailViewController.swift b/HomeAssistant/Views/SettingsDetailViewController.swift index 77bcb5e1f..0d7d6c8c4 100644 --- a/HomeAssistant/Views/SettingsDetailViewController.swift +++ b/HomeAssistant/Views/SettingsDetailViewController.swift @@ -44,32 +44,36 @@ class SettingsDetailViewController: FormViewController { // } case "location": self.title = "Location Settings" - if let zoneEntities: [Zone] = HomeAssistantAPI.sharedInstance.cachedEntities!.filter({ (entity) -> Bool in - return entity.Domain == "zone" - }) as? [Zone] { - for zone in zoneEntities { - self.form - +++ Section(header: zone.Name, footer: "") { - $0.tag = zone.ID + if let cachedEntities = HomeAssistantAPI.sharedInstance.cachedEntities { + if let zoneEntities: [Zone] = cachedEntities.filter({ (entity) -> Bool in + return entity.Domain == "zone" + }) as? [Zone] { + for zone in zoneEntities { + self.form + +++ Section(header: zone.Name, footer: "") { + $0.tag = zone.ID + } + <<< SwitchRow { + $0.title = "Enter/exit tracked" + $0.value = zone.TrackingEnabled + $0.disabled = Condition(booleanLiteral: true) + } + <<< LocationRow { + $0.title = "Location" + $0.value = zone.location() + } + <<< LabelRow { + $0.title = "Radius" + $0.value = "\(Int(zone.Radius)) m" } - <<< SwitchRow { - $0.title = "Enter/exit tracked" - $0.value = zone.TrackingEnabled - $0.disabled = Condition(booleanLiteral: true) - } - <<< LocationRow { - $0.title = "Location" - $0.value = zone.location() - } - <<< LabelRow { - $0.title = "Radius" - $0.value = "\(Int(zone.Radius)) m" + } + if zoneEntities.count > 0 { + self.form + +++ Section(header: "", + footer: "To enable location tracking add track_ios: true to each zone") } } } - self.form - +++ Section(header: "", - footer: "To enable location tracking add track_ios: true to each zone") case "notifications": self.title = "Notification Settings"