présentation de homekit

21
HomeKit Framework Carlos Raventos Martial Lienert

Upload: cocoaheads-france

Post on 19-Mar-2017

499 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Présentation de HomeKit

HomeKit Framework

Carlos Raventos Martial Lienert

Page 2: Présentation de HomeKit

Produits MFi

Station météo

Caméras : Welcome, Presence

+ HomeKit

Thermostat

Healthy Home Coach

Page 3: Présentation de HomeKit

Plan

Finalité

Technologies impliquées, spécificités

Configuration initiale d’un accessoire

Contrôle

Retour d’expérience

Page 4: Présentation de HomeKit

Finalité

Concerne les accessoires de contrôle de la maison : Thermostats, Prises, Interrupteurs, Ampoules, Fenêtres, volets, sensors, etc.

Coordonner et contrôler des accessoires de différents fabricants, avec :

➔Apps tierces iOS, watchOS, tvOS : Framework Homekit

➔Siri

➔Apple Home : automations

Page 5: Présentation de HomeKit

Technologies impliquées

Base de données partagée : iCloud (structure de la maison, nommage)

Clés cryptographiques partagées à travers iCloud Keychain

HomeKit Accessory Protocol : entre un contrôleur (iPhone, Apple TV) et un accessoire (BLE, IP)

Framework : Découverte, contrôle, monitoring accessoires

Page 6: Présentation de HomeKit

Spécificités

Pas de compte utilisateur à créer

Pas de serveur tiers

Securité end to end:

➔Clés stockées seulement dans iOS et l’accessoire

➔Un seul master

Accès distant avec Apple TV et iPad

Page 7: Présentation de HomeKit

Hiérarchie de données

HMHome

HMRoom

HMAccessory

HMService

HMCharacteristic

Page 8: Présentation de HomeKit

Configuration initiale

WiFi

Créer/choisir une maison

Appairage Homekit

Créer/choisir une pièce

Nommer les services contrôlables

Page 9: Présentation de HomeKit

WiFi avant iOS 10 : EAWiFiUnconfiguredAccessoryBrowser

let externalAccessoryBrowser = EAWiFiUnconfiguredAccessoryBrowser(delegate: self, queue: dispatch_get_main_queue()) externalAccessoryBrowser.startSearchingForUnconfiguredAccessoriesMatchingPredicate(nil)

// MARK: EAWiFiUnconfiguredAccessoryBrowserDelegate Methods func accessoryBrowser(browser: EAWiFiUnconfiguredAccessoryBrowser, didFindUnconfiguredAccessories accessories: Set<EAWiFiUnconfiguredAccessory>) { } func accessoryBrowser(browser: EAWiFiUnconfiguredAccessoryBrowser, didRemoveUnconfiguredAccessories accessories: Set<EAWiFiUnconfiguredAccessory>) { } func accessoryBrowser(browser: EAWiFiUnconfiguredAccessoryBrowser, didUpdateState state: EAWiFiUnconfiguredAccessoryBrowserState) { } func accessoryBrowser(browser: EAWiFiUnconfiguredAccessoryBrowser, didFinishConfiguringAccessory accessory: EAWiFiUnconfiguredAccessory, withStatus status: EAWiFiUnconfiguredAccessoryConfigurationStatus) {

if status == .Success { // store accessory name and proceed to add to HMHome

} }

externalAccessoryBrowser.configureAccessory(accessory, withConfigurationUIOnViewController: self)

Page 10: Présentation de HomeKit

WiFi depuis iOS 10 : HMAccessoryBrowser

let accessoryBrowser = HMAccessoryBrowser() accessoryBrowser.delegate = self accessoryBrowser.startSearchingForNewAccessories()

// MARK: HMAccessoryBrowserDelegate Methods func accessoryBrowser(browser: HMAccessoryBrowser, didFindNewAccessory accessory: HMAccessory) { } func accessoryBrowser(browser: HMAccessoryBrowser, didRemoveNewAccessory accessory: HMAccessory) { }

var home: HMHome? = HMHomeManager().primaryHome home?.addAccessory(accessory) { error in

if let error = error { // handle error } else {

// Once it's successfully added to the home, add it to the room that's selected. }

}

Page 11: Présentation de HomeKit

Appairage HomeKit : HMAccessoryBrowser

Page 12: Présentation de HomeKit

Créer/choisir une pièce

//func home(home: HMHome, assignAccessory accessory: HMAccessory, toRoom room: HMRoom) { home.assignAccessory(accessory, toRoom: room) { error in

if let error = error { //displayError(error)

} else { //update view

} //}

Page 13: Présentation de HomeKit

Nommer les services

//func updateName(name: String, forAccessory accessory: HMAccessory) { accessory.updateName(name) { error in

if let error = error { //displayError(error)

} else { //update view

} //}

Page 14: Présentation de HomeKit

Observe Home Database updates

public protocol HMHomeManagerDelegate : NSObjectProtocol { optional public func homeManagerDidUpdateHomes(_ manager: HMHomeManager) optional public func homeManagerDidUpdatePrimaryHome(_ manager: HMHomeManager) optional public func homeManager(_ manager: HMHomeManager, didAddHome: HMHome) optional public func homeManager(_ manager: HMHomeManager, didRemoveHome: HMHome) }

Page 15: Présentation de HomeKit

Observe Home Database updates

public protocol HMHomeDelegate : NSObjectProtocol { optional public func homeDidUpdateName(_ home: HMHome) optional public func home(_ home: HMHome, didAddAccessory: HMAccessory) optional public func home(_ home: HMHome, didRemoveAccessory: HMAccessory) optional public func home(_ home: HMHome, didUpdateRoom: HMRoom, forAccessory: HMAccessory) optional public func home(_ home: HMHome, didAddRoom: HMRoom) optional public func home(_ home: HMHome, didRemoveRoom: HMRoom) // (... a lot more) }

Page 16: Présentation de HomeKit

Observe Home Database updates

public protocol HMHomeDelegate : NSObjectProtocol { optional public func homeDidUpdateName(_ home: HMHome) optional public func home(_ home: HMHome, didAddAccessory: HMAccessory) optional public func home(_ home: HMHome, didRemoveAccessory: HMAccessory) optional public func home(_ home: HMHome, didUpdateRoom: HMRoom, forAccessory: HMAccessory) optional public func home(_ home: HMHome, didAddRoom: HMRoom) optional public func home(_ home: HMHome, didRemoveRoom: HMRoom) // (... a lot more) } // Notifications are only received // if the database is modified by // another device/app !

Page 17: Présentation de HomeKit

Contrôle de l’accessoire

Actions possibles:

Lire une caractéristique

Ecrire une caractéristique

Ecouter les notifications

Créer des scènes (écritures groupées de caractéristiques)

Triggers (Réagir aux changements de valeur des caractéristiques)

Page 18: Présentation de HomeKit

Contrôle de l’accessoire

import HomeKit

var lightBulb: HMAccessory?

// Get the PowerState characteristic through the LightBulb service let lightBulbOn = lightBulb?.services.first(where: { (service) -> Bool in service.serviceType == HMServiceTypeLightbulb })?.characteristics.first(where: { (characteristic) -> Bool in characteristic.characteristicType == HMCharacteristicTypePowerState })

Page 19: Présentation de HomeKit

Lecture d’une caractéristique

// func readValue(completionHandler completion: @escaping (Error?) -> Void) // var value: Any? { get } lightBulbOn?.readValue(completionHandler: { (error) in if let error = error { // Handle the error } else if let isOn = lightBulbOn?.value as? Bool { print("Light bulb is \(isOn ? "ON" : "OFF")") } })

Page 20: Présentation de HomeKit

Ecriture d’une caractéristique

// func writeValue(_ value: Any?, completionHandler completion: @escaping (Error?) -> Void) lightBulbOn?.writeValue(false, completionHandler: { (error) in if let error = error { // Handle the error } else { print("Light bulb is OFF") } })

Page 21: Présentation de HomeKit

Notifications

// func enableNotification(_ enable: Bool, completionHandler completion: @escaping (Error?) -> Void) lightBulbOn?.enableNotification(true, completionHandler: { (error) in if let error = error { // Handle error } else { print("Notifications are enabled") } }) class AccDelegate : NSObject, HMAccessoryDelegate { public func accessory(_ accessory: HMAccessory, service: HMService, didUpdateValueForCharacteristic: HMCharacteristic) { if let isOn = characteristic.value as? Bool { print("Light bulb is now \(isOn ? "ON" : "OFF")") } } }

let delegate = AccDelegate() lightBulb?.delegate = delegate;