HomeKit en Xamarin.iOS

HomeKit es el marco de Apple para controlar los dispositivos de automatización del hogar. En este artículo se presenta HomeKit y se trata la configuración de accesorios de prueba en el simulador de accesorios de HomeKit y la escritura de una aplicación xamarin.iOS sencilla para interactuar con estos accesorios.

Una aplicación habilitada para HomeKit de ejemplo

Apple presentó HomeKit en iOS 8 como una manera de integrar sin problemas varios dispositivos de automatización del hogar de diversos proveedores en una sola unidad coherente. Al promover un protocolo común para detectar, configurar y controlar dispositivos de automatización del hogar, HomeKit permite que los dispositivos de proveedores no relacionados trabajen juntos, todo ello sin que los proveedores individuales tengan que coordinar los esfuerzos.

Con HomeKit, puede crear una aplicación xamarin.iOS que controle cualquier dispositivo habilitado para HomeKit sin usar las API o las aplicaciones proporcionadas por el proveedor. Con HomeKit, puede hacer lo siguiente:

  • Descubra los nuevos dispositivos de automatización del hogar habilitados para HomeKit y agrégrélos a una base de datos que se conservará en todos los dispositivos iOS del usuario.
  • Configure, configure, muestre y controle cualquier dispositivo de la base de datos de configuración principal de HomeKit.
  • Comunicarse con cualquier dispositivo HomeKit preconfigurado y comando para realizar acciones individuales o trabajar en vivo, como encender todas las luces de la cocina.

Además de servir dispositivos en la base de datos de configuración principal a aplicaciones habilitadas para HomeKit, HomeKit proporciona acceso a los comandos de voz de Siri. Dada una configuración de HomeKit correctamente configurada, el usuario puede emitir comandos de voz como "Siri, encender las luces en la sala de estar".

Base de datos de configuración principal

HomeKit organiza todos los dispositivos de automatización de una ubicación determinada en una colección principal. Esta colección proporciona al usuario una manera de agrupar sus dispositivos de automatización del hogar en unidades organizadas lógicamente con etiquetas significativas y legibles para el usuario.

La colección principal se almacena en una base de datos de configuración principal de la que se hará una copia de seguridad y se sincronizará automáticamente en todos los dispositivos iOS del usuario. HomeKit proporciona las siguientes clases para trabajar con la base de datos de configuración principal:

  • HMHome - Este es el contenedor de nivel superior que contiene toda la información y las configuraciones de todos los dispositivos de automatización del hogar en una sola ubicación física (por ejemplo, una sola familia). El usuario podría tener más de una residencia, como su casa principal y una casa de vacaciones. O bien, pueden tener "casa" diferentes en la misma propiedad, como la casa principal y una casa de invitados sobre el aparcamiento. En cualquier caso, al menos un objeto debe configurarse y almacenarse antes de que se pueda especificar cualquier otra información HMHome de HomeKit. HMHome
  • HMRoom - Si bien es opcional, permite al usuario definir salas específicas dentro de una casa HMRoomHMHome () como: Cocina, Cómoda, Habitación o Sala de estar. El usuario puede agrupar todos los dispositivos de automatización del hogar de una ubicación específica de su casa en un elemento y actuar HMRoom sobre ellos como una unidad. Por ejemplo, pedir a Siri que apague las luces del interior.
  • HMAccessory - Representa un dispositivo de automatización individual habilitado para HomeKit físico que se ha instalado en la residencia del usuario (por ejemplo, un termostato inteligente). Cada HMAccessory se asigna a un HMRoom . Si el usuario no ha configurado ninguna sala, HomeKit asigna accesorios a una sala predeterminada especial.
  • HMService : representa un servicio proporcionado por un determinado, como el estado de encendido y apagado de una luz o su color (si se admite el cambio HMAccessory de color). Cada uno puede tener más de un servicio, como un abridor de puertas del aparcamiento HMAccessory que también incluye una luz. Además, un determinado podría tener servicios, como la actualización HMAccessory de firmware, que están fuera del control del usuario.
  • HMZone : permite al usuario agrupar una colección de objetos en zonas HMRoom lógicas, como, por ejemplo, Desenlazados, Insensivas o Insondes. Aunque es opcional, esto permite interacciones como pedir a Siri que apague todas las luces.

Aprovisionamiento de una aplicación HomeKit

Debido a los requisitos de seguridad impuestos por HomeKit, una aplicación de Xamarin.iOS que usa el marco HomeKit debe configurarse correctamente tanto en apple Portal para desarrolladores como en el archivo de proyecto de Xamarin.iOS.

Haga lo siguiente:

  1. Inicie sesión en apple Portal para desarrolladores.

  2. Haga clic en Certificados, Perfiles de identificadores.

  3. Si aún no lo ha hecho, haga clic en Identificadores y cree un identificador para la aplicación (por ejemplo, ), de lo contrario, edite el identificador existente.

  4. Asegúrese de que se ha comprobado el identificador especificado en el servicio HomeKit:

    Habilitación del servicio HomeKit para el identificador especificado

  5. Guarde los cambios.

  6. Haga clic en Provisioning ProfilesDevelopment (Desarrollo de perfiles de aprovisionamiento) y cree un nuevo perfil de aprovisionamiento de desarrollo para la aplicación:

    Creación de un nuevo perfil de aprovisionamiento de desarrollo para la aplicación

  7. Descargue e instale el nuevo perfil de aprovisionamiento o use Xcode para descargar e instalar el perfil.

  8. Edite las opciones del proyecto de Xamarin.iOS y asegúrese de que usa el perfil de aprovisionamiento que acaba de crear:

    Selección del perfil de aprovisionamiento que acaba de crear

  9. A continuación, edite el archivo Info.plist y asegúrese de que usa el identificador de aplicación que se usó para crear el perfil de aprovisionamiento:

    Establecer el identificador de la aplicación

  10. Por último, edite el archivo Entitlements.plist y asegúrese de que se ha seleccionado el derecho HomeKit:

    Habilitación del derecho HomeKit

  11. Guarde los cambios en todos los archivos.

Con esta configuración, la aplicación ya está lista para acceder a las API de HomeKit Framework. Para obtener información detallada sobre el aprovisionamiento, consulte nuestras guías de aprovisionamiento de dispositivos y aprovisionamiento de aplicaciones.

Importante

La prueba de una aplicación habilitada para HomeKit requiere un dispositivo iOS real que se haya aprovisionado correctamente para el desarrollo. HomeKit no se puede probar desde el simulador de iOS.

Simulador de accesorios de HomeKit

Para proporcionar una manera de probar todos los posibles dispositivos y servicios de automatización del hogar, sin tener que tener un dispositivo físico, Apple creó el simulador de accesorios de HomeKit. Con este simulador, puede configurar y configurar dispositivos HomeKit virtuales.

Instalación del simulador

Apple proporciona el simulador de accesorios de HomeKit como una descarga independiente de Xcode, por lo que deberá instalarlo antes de continuar.

Haga lo siguiente:

  1. En un explorador web, visite Descargas para desarrolladores de Apple

  2. Descargue las herramientas adicionales para Xcode xxx (donde xxx es la versión de Xcode que ha instalado):

    Descargar las herramientas adicionales para Xcode

  3. Abra la imagen de disco e instale las herramientas en el directorio Aplicaciones.

Con el simulador de accesorios de HomeKit instalado, se pueden crear accesorios virtuales para las pruebas.

Creación de accesorios virtuales

Para iniciar el simulador de accesorios de HomeKit y crear algunos accesorios virtuales, haga lo siguiente:

  1. En la carpeta Aplicaciones, inicie el simulador de accesorios de HomeKit:

    Simulador de accesorios de HomeKit

  2. Haga clic + en el botón y seleccione Nuevo +:

    Adición de un nuevo accesorio

  3. Rellene la información sobre el nuevo accesorios y haga clic en el botón Finalizar:

    Rellene la información sobre el nuevo accesorio.

  4. Haga clic en el botón Agregar servicio. y seleccione un tipo de servicio en la lista desplegable:

    Selección de un tipo de servicio en la lista desplegable

  5. Proporcione un nombre para el servicio y haga clic en el botón Finalizar:

    Escriba un nombre para el servicio.

  6. Puede proporcionar características opcionales para un servicio haciendo clic en el botón Agregar característica y configurando las opciones necesarias:

    Configuración de las opciones necesarias

  7. Repita los pasos anteriores para crear uno de cada tipo de dispositivo de automatización del hogar virtual compatible con HomeKit.

Con algunos accesorios de HomeKit virtuales de ejemplo creados y configurados, ahora puede consumir y controlar estos dispositivos desde la aplicación Xamarin.iOS.

Configuración del archivo Info.plist

Como novedad de iOS 10 (y superiores), el desarrollador deberá agregar la clave al archivo de la aplicación y proporcionar una cadena que declare por qué la aplicación quiere acceder a la base de datos NSHomeKitUsageDescriptionInfo.plist HomeKit del usuario. Esta cadena se presentará al usuario la primera vez que ejecute la aplicación:

Cuadro de diálogo de permiso HomeKit

Para establecer esta clave, haga lo siguiente:

  1. Haga doble clic en Info.plist el archivo del Info.plist para abrirlo para su edición.

  2. En la parte inferior de la pantalla, cambie a la vista Origen.

  3. Agregue una nueva entrada a la lista.

  4. En la lista desplegable, seleccione Privacidad - Descripción de uso de HomeKit:

    Seleccione Privacidad- Descripción de uso de HomeKit.

  5. Escriba una descripción de por qué la aplicación quiere acceder a la base de datos HomeKit del usuario:

    Escribir una descripción

  6. Guarde los cambios en el archivo.

Importante

Si no se establece la clave en el archivo, se producirá un error en la aplicación en modo silencioso (cerrado por el sistema en tiempo de ejecución) sin errores cuando se ejecuta en NSHomeKitUsageDescriptionInfo.plist iOS 10 (o superior). NSHomeKitUsageDescription

Conexión a HomeKit

Para comunicarse con HomeKit, la aplicación xamarin.iOS debe crear primero una instancia de la HMHomeManager clase . Home Manager es el punto de entrada central a HomeKit y es responsable de proporcionar una lista de las residencias disponibles, actualizar y mantener esa lista y devolver el hogar principal del usuario.

El objeto contiene toda la información sobre un hogar de entrega, incluidas las salas, grupos o zonas que puede contener, junto con cualquier accesorios de automatización del hogar HMHome que se hayan instalado. Para poder realizar cualquier operación en HomeKit, se debe crear y asignar al menos una HMHome como inicio principal.

La aplicación es responsable de comprobar si existe un inicio principal y de crear y asignar uno si no lo hace.

Adición de un administrador de inicio

Para agregar el reconocimiento de HomeKit a una aplicación xamarin.iOS, edite el archivo AppDelegate.cs para editarlo y hacer que sea parecido al siguiente:

using HomeKit;
...

public HMHomeManager HomeManager { get; set; }
...

public override void FinishedLaunching (UIApplication application)
{
    // Attach to the Home Manager
    HomeManager = new HMHomeManager ();
    Console.WriteLine ("{0} Home(s) defined in the Home Manager", HomeManager.Homes.Count());

    // Wire-up Home Manager Events
    HomeManager.DidAddHome += (sender, e) => {
        Console.WriteLine("Manager Added Home: {0}",e.Home);
    };

    HomeManager.DidRemoveHome += (sender, e) => {
        Console.WriteLine("Manager Removed Home: {0}",e.Home);
    };
    HomeManager.DidUpdateHomes += (sender, e) => {
        Console.WriteLine("Manager Updated Homes");
    };
    HomeManager.DidUpdatePrimaryHome += (sender, e) => {
        Console.WriteLine("Manager Updated Primary Home");
    };
}

Cuando se ejecute la aplicación por primera vez, se le preguntará al usuario si desea permitir que acceda a su información de HomeKit:

Se le preguntará al usuario si desea permitir que acceda a su información de HomeKit.

Si el usuario responde ok, la aplicación podrá trabajar con sus accesorios de HomeKit; de lo contrario, no lo hará y las llamadas a HomeKit producirán un error.

Con el Administrador de inicio en su lugar, a continuación, la aplicación deberá ver si se ha configurado un inicio principal y, si no, proporcionar una manera para que el usuario cree y asigne una.

Acceso a la página principal

Como se indicó anteriormente, se debe crear y configurar una página principal para que HomeKit esté disponible y es responsabilidad de la aplicación proporcionar una manera de que el usuario cree y asigne una página principal si aún no existe.

Cuando la aplicación se inicia o vuelve por primera vez desde el fondo, debe supervisar el evento de la clase para comprobar la existencia de DidUpdateHomesHMHomeManager un inicio principal. Si no existe, debe proporcionar una interfaz para que el usuario cree una.

El código siguiente se puede agregar a un controlador de vista para buscar el inicio principal:

using HomeKit;
...

public AppDelegate ThisApp {
    get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
...

// Wireup events
ThisApp.HomeManager.DidUpdateHomes += (sender, e) => {

    // Was a primary home found?
    if (ThisApp.HomeManager.PrimaryHome == null) {
        // Ask user to add a home
        PerformSegue("AddHomeSegue",this);
    }
};

Cuando el administrador de hogar realiza una conexión a HomeKit, se desencadena el evento, se cargan las casa existentes en la colección de familias del administrador y se carga la casa principal, si está DidUpdateHomes disponible.

Agregar una página principal

Si la propiedad de es después de un evento, debe proporcionar una manera de que el usuario cree y asigne un inicio PrimaryHomeHMHomeManager principal antes de nullDidUpdateHomes continuar.

Normalmente, la aplicación presentará un formulario para que el usuario asigne un nombre a una nueva página principal que, a continuación, se pasa al Administrador de inicio para que la configure como inicio principal. Para la aplicación de ejemplo HomeKitIntro, se creó una vista modal en Xcode Interface Builder llamada por el segue desde la interfaz principal de la aplicación.

Proporciona un campo de texto para que el usuario escriba un nombre para la nueva página principal y un botón para agregar la página principal. Cuando el usuario pulsa el botón Agregar inicio, el código siguiente llama al Administrador de inicio para agregar la página principal:

// Add new home to HomeKit
ThisApp.HomeManager.AddHome(HomeName.Text,(home,error) =>{
    // Did an error occur
    if (error!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Add Home Error",string.Format("Error adding {0}: {1}",HomeName.Text,error.LocalizedDescription),this);
        return;
    }

    // Make the primary house
    ThisApp.HomeManager.UpdatePrimaryHome(home,(err) => {
        // Error?
        if (err!=null) {
            // Inform user of error
            AlertView.PresentOKAlert("Add Home Error",string.Format("Unable to make this the primary home: {0}",err.LocalizedDescription),this);
            return ;
        }
    });

    // Close the window when the home is created
    DismissViewController(true,null);
});

El AddHome método intentará crear una nueva página principal y devolverla a la rutina de devolución de llamada dada. Si la propiedad no es , se ha producido un errornull error y debe presentarse al usuario. Los errores más comunes se deben a un nombre de inicio no único o a que el administrador de inicio no puede comunicarse con HomeKit.

Si la página principal se creó correctamente, debe llamar al método para establecer la nueva página UpdatePrimaryHome principal como inicio principal. De nuevo, si la propiedad no es , se ha producido un errornull error y debe presentarse al usuario.

También debe supervisar los eventos y del administrador de inicio y actualizar la interfaz de usuario de la DidAddHomeDidRemoveHome aplicación según sea necesario.

Importante

El método usado en el código de ejemplo anterior es una clase auxiliar de la aplicación HomeKitIntro que facilita el trabajo con AlertView.PresentOKAlert las alertas de iOS.

Búsqueda de nuevos accesorios

Una vez que se ha definido o cargado una página principal desde el Administrador de inicio, la aplicación xamarin.iOS puede llamar a para buscar los nuevos accesorios de automatización del hogar y agregarlos HMAccessoryBrowser a un hogar.

Llame al StartSearchingForNewAccessories método para empezar a buscar nuevos accesorios y el método cuando StopSearchingForNewAccessories termine.

Importante

StartSearchingForNewAccessories no se debe dejar en ejecución durante largos períodos de tiempo porque afectará negativamente a la duración de la batería y al rendimiento del dispositivo iOS. Apple sugiere llamar a después de un minuto o buscar solo cuando se presenta al usuario la interfaz de usuario buscar StopSearchingForNewAccessories accesorios.

Se llamará al evento cuando se descubran nuevos accesorios y se agregarán a DidFindNewAccessory la lista en el explorador de DiscoveredAccessories accesorios.

La lista contendrá una colección de objetos que definen un dispositivo de automatización del hogar habilitado para HomeKit y sus servicios disponibles, como las luces o el control de la DiscoveredAccessoriesHMAccessory puerta del interior.

Una vez que se ha encontrado el nuevo accesorios, debe presentarse al usuario para que pueda seleccionarlo y agregarlo a un hogar. Ejemplo:

Búsqueda de un nuevo accesorio

Llame al AddAccessory método para agregar el accesorio seleccionado a la colección de la casa. Por ejemplo:

// Add the requested accessory to the home
ThisApp.HomeManager.PrimaryHome.AddAccessory (_controller.AccessoryBrowser.DiscoveredAccessories [indexPath.Row], (err) => {
    // Did an error occur
    if (err !=null) {
        // Inform user of error
        AlertView.PresentOKAlert("Add Accessory Error",err.LocalizedDescription,_controller);
    }
});

Si la propiedad no es , se ha producido un errnull error y debe presentarse al usuario. De lo contrario, se le pedirá al usuario que escriba el código de instalación para que el dispositivo agregue:

Escriba el código de instalación del dispositivo que se agregará.

En el simulador de accesorios de HomeKit, este número se puede encontrar en el campo Código de instalación:

El campo Código de instalación del simulador de accesorios de HomeKit

En el caso de los accesorios reales de HomeKit, el código de instalación se imprimirá en una etiqueta en el propio dispositivo, en el cuadro de producto o en el manual de usuario del accesorios.

Debe supervisar el evento del explorador de accesorios y actualizar la interfaz de usuario para quitar un accesorio de la lista disponible una vez que el usuario lo haya agregado a su DidRemoveNewAccessory colección principal.

Trabajar con accesorios

Una vez que se ha establecido un hogar principal y se le han agregado accesorios, puede presentar una lista de accesorios (y, opcionalmente, salas) para que el usuario trabaje con él.

El HMRoom objeto contiene toda la información sobre una sala determinada y los accesorios que pertenecen a ella. Opcionalmente, las salas se pueden organizar en una o varias zonas. Un HMZone contiene toda la información sobre una zona determinada y todas las salas que pertenecen a ella.

Para este ejemplo, vamos a mantener las cosas sencillas y trabajaremos directamente con los accesorios de un hogar, en lugar de organizarlos en salas o zonas.

El HMHome objeto contiene una lista de accesorios asignados que se pueden presentar al usuario en su propiedad Accessories . Por ejemplo:

Accesorios de ejemplo

En este formulario, el usuario puede seleccionar un accesorios determinado y trabajar con los servicios que proporciona.

Trabajar con servicios

Cuando el usuario interactúa con un dispositivo de automatización del hogar habilitado para HomeKit determinado, suele ser a través de los servicios que proporciona. La Services propiedad de la clase contiene una colección de objetos que definen los servicios que ofrece un HMAccessoryHMService dispositivo.

Los servicios son cosas como luces, termostatos, aperturas de puertas, conmutadores o candados. Algunos dispositivos (como un abridor de puertas del aparcamiento) proporcionarán más de un servicio, como una luz y la capacidad de abrir o cerrar una puerta.

Además de los servicios específicos que proporciona un accesorio determinado, cada accesorio contiene un que define propiedades como su nombre, fabricante, modelo y Information Service número de serie.

Tipos de servicio de accesorios

Los siguientes tipos de servicio están disponibles a través HMServiceType de la enumeración :

  • AccessoryInformation: proporciona información sobre el dispositivo de automatización del hogar (accesorios) determinado.
  • AirQualitySensor: define un sensor de calidad del aire.
  • Batería: define el estado de la batería de un accesorios.
  • CarbonDioxideSensor: define un sensor de dióxido de carbono.
  • CarbonMonoxideSensor: define un sensor de monxido de carbono.
  • ContactSensor: define un sensor de contacto (por ejemplo, una ventana que se abre o cierra).
  • Door: define un sensor de estado de la puerta (por ejemplo, abierto o cerrado).
  • Ventilador: define un ventilador controlado de forma remota.
  • DoorDoorOpener: define un abrepuertas de cochera.
  • HumiditySensor: define un sensor de humedad.
  • LeakSensor: define un sensor de fuga (por ejemplo, para una cafetera de agua caliente o una máquina de cocina).
  • Bombilla: define una luz independiente o una luz que forma parte de otro accesorio (por ejemplo, un abridor de puertas del cocher).
  • LightSensor: define un sensor de luz.
  • LockManagement: define un servicio que administra un bloqueo de puerta automatizado.
  • LockMechanism: define un bloqueo controlado remoto (como un bloqueo de puerta).
  • MotionSensor: define un sensor de movimiento.
  • OccupancySensor: define un sensor de ocupación.
  • Salida: define una salida de pared controlada remotamente.
  • SecuritySystem: define un sistema de seguridad principal.
  • StatefulProgrammableSwitch: define un conmutador programable que permanece en un estado de entrega una vez desencadenado (como un conmutador de volteo).
  • StatelessProgrammableSwitch: define un conmutador programable que vuelve a su estado inicial después de desencadenarse (como un botón de inserción).
  • SmokeSensor: define un sensor de humo.
  • Switch: define un conmutador de encendido y apagado como un conmutador de pared estándar.
  • TemperatureSensor: define un sensor de temperatura.
  • Termostato: define un termostato inteligente que se usa para controlar un sistema HVAC.
  • Ventana: define una ventana automatizada que se puede abrir o cerrar de forma remota.
  • WindowCovering: define una cobertura de ventana controlada de forma remota, como las ventanas ocultas que se pueden abrir o cerrar.

Mostrar información del servicio

Después de cargar , HMAccessory puede consultar los objetos HNService individuales que proporciona y mostrar esa información al usuario:

Mostrar información del servicio

Siempre debe comprobar la Reachable propiedad de antes de intentar trabajar con HMAccessory ella. Un accesorio puede ser inaccesible; el usuario no está dentro del intervalo del dispositivo o si se ha desconectado.

Una vez seleccionado un servicio, el usuario puede ver o modificar una o varias características de ese servicio para supervisar o controlar un dispositivo de automatización del hogar determinado.

Trabajar con características

Cada objeto puede contener una colección de objetos que pueden proporcionar información sobre el estado del servicio (como una puerta abierta o cerrada) o permitir al usuario ajustar un estado (como establecer el color de una HMServiceHMCharacteristic luz).

HMCharacteristic no solo proporciona información sobre una característica y su estado, sino que también proporciona métodos para trabajar con el estado a través de HMCharacteristic ( HMCharacteristisMetadata ). Estos metadatos pueden proporcionar propiedades (como intervalos de valores mínimos y máximos) que son útiles al mostrar información al usuario o permitirle modificar estados.

La HMCharacteristicType enumeración proporciona un conjunto de valores de metadatos de características que se pueden definir o modificar de la manera siguiente:

  • AdminOnlyAccess
  • AirParticulateDensity
  • AirParticulateSize
  • AirQuality
  • AudioFeedback
  • BatteryLevel
  • Luminosidad
  • CarbonDioxideDetected
  • CarbonDioxideLevel
  • CarbonDioxidePeakLevel
  • CarbonMonoxideDetected
  • CarbonMonoxideLevel
  • CarbonMonoxidePeakLevel
  • ChargingState
  • ContactState
  • CoolingThreshold
  • CurrentDoorState
  • CurrentCooling Cooling
  • CurrentHorizontalTilt
  • CurrentLightLevel
  • CurrentLockMechanismState
  • CurrentPosition
  • CurrentRelativeHumidity
  • CurrentSecuritySystemState
  • CurrentTemperature
  • CurrentVerticalTilt
  • FirmwareVersion
  • HardwareVersion
  • DesenlazamientoEstado
  • Threshold Desalmado
  • HoldPosition
  • Matiz
  • Identificar
  • InputEvent
  • LeakDetected
  • LockManagementAutoSecureTimeout
  • LockManagementControlPoint
  • LockMechanismLastKnownAction
  • Registros
  • Fabricante
  • Modelado
  • MotionDetected
  • Nombre
  • Detected Desapercibido
  • Ocupación Detected
  • SalidaInUse
  • OutputState
  • PositionState
  • PowerState
  • RotationDirection
  • RotationSpeed
  • Saturación
  • SerialNumber
  • SmokeDetected
  • SoftwareVersion
  • StatusActive
  • StatusFault
  • StatusJammed
  • StatusLowBattery
  • StatusTampered
  • TargetDoorState
  • TargetCooling Cooling
  • TargetHorizontalTilt
  • TargetLockMechanismState
  • TargetPosition
  • TargetRelativeHumidity
  • TargetSecuritySystemState
  • TargetTemperature
  • TargetVerticalTilt
  • TemperatureUnits
  • Version

Trabajar con el valor de una característica

Para asegurarse de que la aplicación tiene el estado más reciente de una característica determinada, llame al ReadValue método de la clase HMCharacteristic . Si la propiedad no es , se ha producido un error y puede o errnull no presentarse al usuario.

La propiedad de la característica contiene el estado actual de la característica dada como y, como tal, no se puede trabajar ValueNSObject directamente con en C#.

Para leer el valor, se agregó la siguiente clase auxiliar a la aplicación de ejemplo HomeKitIntro:

using System;
using Foundation;
using System.Globalization;
using CoreGraphics;

namespace HomeKitIntro
{
    /// <summary>
    /// NS object converter is a helper class that helps to convert NSObjects into
    /// C# objects
    /// </summary>
    public static class NSObjectConverter
    {
        #region Static Methods
        /// <summary>
        /// Converts to an object.
        /// </summary>
        /// <returns>The object.</returns>
        /// <param name="nsO">Ns o.</param>
        /// <param name="targetType">Target type.</param>
        public static Object ToObject (NSObject nsO, Type targetType)
        {
            if (nsO is NSString) {
                return nsO.ToString ();
            }

            if (nsO is NSDate) {
                var nsDate = (NSDate)nsO;
                return DateTime.SpecifyKind ((DateTime)nsDate, DateTimeKind.Unspecified);
            }

            if (nsO is NSDecimalNumber) {
                return decimal.Parse (nsO.ToString (), CultureInfo.InvariantCulture);
            }

            if (nsO is NSNumber) {
                var x = (NSNumber)nsO;

                switch (Type.GetTypeCode (targetType)) {
                case TypeCode.Boolean:
                    return x.BoolValue;
                case TypeCode.Char:
                    return Convert.ToChar (x.ByteValue);
                case TypeCode.SByte:
                    return x.SByteValue;
                case TypeCode.Byte:
                    return x.ByteValue;
                case TypeCode.Int16:
                    return x.Int16Value;
                case TypeCode.UInt16:
                    return x.UInt16Value;
                case TypeCode.Int32:
                    return x.Int32Value;
                case TypeCode.UInt32:
                    return x.UInt32Value;
                case TypeCode.Int64:
                    return x.Int64Value;
                case TypeCode.UInt64:
                    return x.UInt64Value;
                case TypeCode.Single:
                    return x.FloatValue;
                case TypeCode.Double:
                    return x.DoubleValue;
                }
            }

            if (nsO is NSValue) {
                var v = (NSValue)nsO;

                if (targetType == typeof(IntPtr)) {
                    return v.PointerValue;
                }

                if (targetType == typeof(CGSize)) {
                    return v.SizeFValue;
                }

                if (targetType == typeof(CGRect)) {
                    return v.RectangleFValue;
                }

                if (targetType == typeof(CGPoint)) {
                    return v.PointFValue;
                }
            }

            return nsO;
        }

        /// <summary>
        /// Convert to string
        /// </summary>
        /// <returns>The string.</returns>
        /// <param name="nsO">Ns o.</param>
        public static string ToString(NSObject nsO) {
            return (string)ToObject (nsO, typeof(string));
        }

        /// <summary>
        /// Convert to date time
        /// </summary>
        /// <returns>The date time.</returns>
        /// <param name="nsO">Ns o.</param>
        public static DateTime ToDateTime(NSObject nsO){
            return (DateTime)ToObject (nsO, typeof(DateTime));
        }

        /// <summary>
        /// Convert to decimal number
        /// </summary>
        /// <returns>The decimal.</returns>
        /// <param name="nsO">Ns o.</param>
        public static decimal ToDecimal(NSObject nsO){
            return (decimal)ToObject (nsO, typeof(decimal));
        }

        /// <summary>
        /// Convert to boolean
        /// </summary>
        /// <returns><c>true</c>, if bool was toed, <c>false</c> otherwise.</returns>
        /// <param name="nsO">Ns o.</param>
        public static bool ToBool(NSObject nsO){
            return (bool)ToObject (nsO, typeof(bool));
        }

        /// <summary>
        /// Convert to character
        /// </summary>
        /// <returns>The char.</returns>
        /// <param name="nsO">Ns o.</param>
        public static char ToChar(NSObject nsO){
            return (char)ToObject (nsO, typeof(char));
        }

        /// <summary>
        /// Convert to integer
        /// </summary>
        /// <returns>The int.</returns>
        /// <param name="nsO">Ns o.</param>
        public static int ToInt(NSObject nsO){
            return (int)ToObject (nsO, typeof(int));
        }

        /// <summary>
        /// Convert to float
        /// </summary>
        /// <returns>The float.</returns>
        /// <param name="nsO">Ns o.</param>
        public static float ToFloat(NSObject nsO){
            return (float)ToObject (nsO, typeof(float));
        }

        /// <summary>
        /// Converts to double
        /// </summary>
        /// <returns>The double.</returns>
        /// <param name="nsO">Ns o.</param>
        public static double ToDouble(NSObject nsO){
            return (double)ToObject (nsO, typeof(double));
        }
        #endregion
    }
}

se NSObjectConverter usa siempre que la aplicación necesita leer el estado actual de una característica. Por ejemplo:

var value = NSObjectConverter.ToFloat (characteristic.Value);

La línea anterior convierte el valor en un que float se puede usar en el código de Xamarin C#.

Para modificar un HMCharacteristic , llame a su método y ajuste el nuevo valor en una WriteValueNSObject.FromObject llamada. Por ejemplo:

Characteristic.WriteValue(NSObject.FromObject(value),(err) =>{
    // Was there an error?
    if (err!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Update Error",err.LocalizedDescription,Controller);
    }
});

Si la err propiedad no es , se ha producido un error y debe null presentarse al usuario.

Prueba de cambios de valor de característica

Al trabajar con accesorios simulados y , las modificaciones en la propiedad se pueden HMCharacteristics supervisar dentro del simulador de accesorios de Value HomeKit.

Con la aplicación HomeKitIntro ejecutándose en hardware de dispositivo iOS real, los cambios en el valor de una característica se deben ver casi al instante en el simulador de accesorios de HomeKit. Por ejemplo, cambiar el estado de una luz en la aplicación de iOS:

Cambio del estado de una luz en una aplicación iOS

Debe cambiar el estado de la luz en el simulador de accesorios de HomeKit. Si el valor no cambia, compruebe el estado del mensaje de error al escribir nuevos valores de característica y asegúrese de que el accesorio sigue siendo accesible.

Características avanzadas de HomeKit

En este artículo se han abordado las características básicas necesarias para trabajar con accesorios HomeKit en una aplicación xamarin.iOS. Sin embargo, hay varias características avanzadas de HomeKit que no se tratan en esta introducción:

  • Salas: los accesorios habilitados para HomeKit pueden organizarse opcionalmente en salas por el usuario final. Esto permite que HomeKit presente accesorios de una manera fácil de entender y trabajar con el usuario. Para más información sobre cómo crear y mantener salas, consulte la documentación de HMRoom de Apple.
  • Zonas: las salas se pueden organizar opcionalmente en zonas por el usuario final. Una zona hace referencia a una colección de salas que el usuario podría tratar como una sola unidad. Por ejemplo: Ándes, Ándes o Ándes. De nuevo, esto permite que HomeKit presente y trabaje con accesorios de una manera que tenga sentido para el usuario final. Para más información sobre la creación y el mantenimiento de zonas, consulte la documentación de HMZone de Apple.
  • Acciones y conjuntos de acciones: las acciones modifican las características del servicio de accesorios y se pueden agrupar en conjuntos. Los conjuntos de acciones actúan como scripts para controlar un grupo de accesorios y coordinar sus acciones. Por ejemplo, un script de "Watch TV" podría cerrar las invidentes, apagar las luces y encender el televisor y su sistema de sonido. Para obtener más información sobre cómo crear y mantener acciones y conjuntos de acciones, consulte la documentación de HMAction y HMActionSet de Apple.
  • Desencadenadores: un desencadenador puede activar uno o varios conjunto de acciones cuando se cumple un conjunto determinado de condiciones. Por ejemplo, active la luz de portch y bloquee todas las puertas externas cuando esté oscuro fuera. Para más información sobre cómo crear y mantener desencadenadores, consulte la documentación de HMTrigger de Apple.

Dado que estas características usan las mismas técnicas presentadas anteriormente, deben ser fáciles de implementar siguiendo la guía HomeKitDeveloper deApple, las directrices de Interfaz de usuario HomeKit y la referencia del marco de Trabajo de HomeKit.

Directrices de revisión de aplicaciones de HomeKit

Antes de enviar una aplicación Xamarin.iOS habilitada para HomeKit a iTunes Conectar para su lanzamiento en iTunes App Store, asegúrese de seguir las directrices de Apple para las aplicaciones habilitadas para HomeKit:

  • El propósito principal de la aplicación debe ser la automatización del hogar si se usa el marco HomeKit.
  • El texto de marketing de la aplicación debe notificar a los usuarios que se está utilizando HomeKit y deben proporcionar una directiva de privacidad.
  • La recopilación de información de usuario o el uso de HomeKit para publicidad está estrictamente prohibido.

Para ver las directrices de revisión completa, consulte las directrices de revisión de App Store de Apple.

Novedades de iOS 9

Apple ha realizado los siguientes cambios y adiciones a HomeKit para iOS 9:

  • Mantener objetos existentes: si se modifica un accesorio existente, el Administrador de inicio ( ) le informará del elemento específico que se modificó.
  • Identificadores persistentes: todas las clases de HomeKit pertinentes ahora incluyen una propiedad para identificar de forma única un elemento determinado en aplicaciones habilitadas para HomeKit (o instancias de la misma aplicación).
  • Administración de usuarios: se ha agregado un controlador de vista integrado para proporcionar administración de usuarios sobre los usuarios que tienen acceso a los dispositivos HomeKit en la casa del usuario principal.
  • Funcionalidades de usuario: los usuarios de HomeKit ahora tienen un conjunto de privilegios que controlan qué funciones pueden usar en los accesorios habilitados para HomeKit y HomeKit. La aplicación solo debe mostrar las funcionalidades pertinentes al usuario actual. Por ejemplo, solo los administradores deben poder mantener a otros usuarios.
  • Escenas predefinidas: se han creado escenas predefinidas para cuatro eventos comunes que se producen para el usuario promedio de HomeKit: Get Up, Leave, Return, Go to Bed. Estas escenas predefinidas no se pueden eliminar de una página principal.
  • Escenas y Siri: Siri tiene una mayor compatibilidad con las escenas en iOS 9 y puede reconocer el nombre de cualquier escena definida en HomeKit. Un usuario puede ejecutar una escena simplemente hablando su nombre a Siri.
  • Categorías de accesorios: se ha agregado un conjunto de categorías predefinidas a todos los accesorios y ayuda a identificar el tipo de accesorio que se agrega a un hogar o en el que se trabaja desde dentro de la aplicación. Estas nuevas categorías están disponibles durante la configuración de accesorios.
  • Apple Watch soporte técnico: HomeKit ya está disponible para watchOS y el Apple Watch podrá controlar los dispositivos habilitados para HomeKit sin que iPhone esté cerca del reloj. HomeKit para watchOS admite las siguientes funcionalidades: Ver casa, controlar accesorios y ejecutar escenas.
  • Nuevo tipo de desencadenador de eventos: además de los desencadenadores de tipo temporizador admitidos en iOS 8, iOS 9 ahora admite desencadenadores de eventos basados en el estado del accesorio (como los datos del sensor) o la geolocalización. Los desencadenadores de NSPredicates eventos usan para establecer condiciones para su ejecución.
  • Acceso remoto: con el acceso remoto, el usuario ahora puede controlar sus accesorios de Automatización del hogar habilitados para HomeKit cuando están fuera de la casa en una ubicación remota. En iOS 8, esto solo se admite si el usuario tenía un Apple TV de tercera generación en el hogar. En iOS 9, esta limitación se eleva y se admite el acceso remoto a través de iCloud y el protocolo de accesorios HomeKit (HAP).
  • Nuevas Bluetooth de baja energía (BLE): HomeKit ahora admite más tipos de accesorios que se pueden comunicar a través del protocolo Bluetooth baja energía (BLE). Con la tunelización segura de HAP, un complemento HomeKit puede exponer otro Bluetooth Accessory en Wi-Fi (si está fuera del intervalo Bluetooth usuario). En iOS 9, BLE Accessories tiene compatibilidad completa con notificaciones y metadatos.
  • Nuevas categorías de accesorios: Apple ha agregado las siguientes nuevas categorías de accesorios en iOS 9: cubiertas de ventanas, puertas motorizadas y Windows, sistemas de alarma, sensores y conmutadores programables.

Para obtener más información sobre las nuevas características de HomeKit en iOS 9, consulte el vídeo Índice de HomeKit de Apple y Novedades de HomeKit.

Resumen

En este artículo se ha presentado el marco de automatización del hogar HomeKit de Apple. Se ha mostrado cómo configurar y configurar dispositivos de prueba mediante el simulador de accesorios de HomeKit y cómo crear una aplicación sencilla de Xamarin.iOS para detectar, comunicarse y controlar dispositivos de automatización del hogar mediante HomeKit.