HomeKit finalmente está en libertad, permitiendo el control de voz a través de Siri para un puñado de dispositivos domésticos inteligentes de consumo.
Tristemente, me refiero a un puñado literal: cualquier cosa que ya hayas comprado probablemente no sea compatible. Sin embargo, el protocolo ya se ha diseñado por ingeniería inversa y está disponible un emulador de fuente abierta para la API HomeKit: o en inglés simple, ahora puede crear dispositivos HomeKit "falsos", y Siri los controlará como cualquier otro accesorio HomeKit oficial.
Hoy, vamos a crear una luz controlable por Wi-Fi y controlarla con Siri. Aquí hay una demostración.
Esto es lo que necesitará:
- Raspberry Pi (he usado un RPi2, hay una pequeña diferencia en las versiones de Node para instalar dada la arquitectura ARM actualizada - ver notas más adelante).
- Un intermediario MQTT instalado en la Raspberry Pi. Consulte la sección "Instalar Mosquitto en su Pi" en mi Guía OpenHAB, parte 2 Guía para principiantes de OpenHAB Parte 2: ZWave, MQTT, reglas y gráficos Guía para principiantes de OpenHAB Parte 2: ZWave, MQTT, reglas y gráficos OpenHAB, el software de automatización del hogar de código abierto, supera con creces las capacidades de otros sistemas de automatización del hogar en el mercado, pero no es fácil configurarlo. De hecho, puede ser francamente frustrante. Lee mas . No necesita instalarse específicamente en el Pi; incluso puede usar un servidor MQTT basado en la nube, pero dado que necesitamos un Pi para este tutorial de todos modos, es conveniente.
- NodeMCU v2 (compatible con Arduino)
- LED Neopixel (recomendaría 4 píxeles para probar, luego puede agregar una fuente de alimentación externa y agregar tantos como quiera)
Instalación del puente HomeKit
Vamos a instalar una aplicación NodeJS llamada HAP-NodeJS en la Raspberry Pi: esto formará un puente entre las solicitudes de HomeKit y los dispositivos de Wi-Fi. Configuraremos este puente con un accesorio por ahora, pero puede agregar tantos como desee.
De hecho, estoy instalando esto en mi servidor doméstico existente con OpenHAB. Espero conectar los dos juntos en una fecha posterior, pero por ahora, sé que pueden coexistir en el mismo Raspberry Pi. Si estás haciendo lo mismo, por si acaso, haz una copia de seguridad clónica de tu tarjeta Pi SD actual. Clona fácilmente tu tarjeta SD para obtener información sobre Raspberry Pi Compila fácilmente tu tarjeta SD para obtener una Computación Raspberry Pi sin problemas Ya sea que tengas una Tarjeta SD o varias, una cosa que necesitarás es la capacidad de hacer una copia de seguridad de tus tarjetas para evitar los problemas que ocurren cuando tu Raspberry Pi no se inicia. Lee mas . Si todo sale mal, puedes restaurarlo.
Comience haciendo una actualización completa desde la Terminal o una sesión SSH Configuración de su Raspberry Pi para uso sin cabeza con SSH Configuración de su Raspberry Pi para uso sin cabeza con SSH Raspberry Pi puede aceptar comandos SSH cuando está conectado a una red local (ya sea por Ethernet o Wi-Fi), lo que le permite configurarlo fácilmente. Los beneficios de SSH van más allá de alterar el examen diario ... Leer más.
sudo apt-get update sudo apt-get upgrade
Es posible que deba hacer eso dos veces si ha pasado un tiempo.
Ahora instale algunos paquetes principales que necesitaremos:
sudo apt-get install npm git-core libnss-mdns libavahi-compat-libdnssd-dev
A continuación, vamos a instalar la última versión de NodeJS. Puede que tengas la tentación de hacer esto con apt-get, pero no lo hagas, esa versión es realmente antigua y no funcionará. En su lugar, visite nodejs.org, busque el directorio download / release / latest-v5.x.0 / y compruebe cuál es el enlace para la última versión. Está buscando linux-armv7l para Raspberry Pi 2, o linuxarmv6l para los modelos RPi originales. Luego, ajustando las URL y los nombres de directorio según sea necesario, descárgalo e instálalo usando los siguientes comandos.
wget https://nodejs.org/download/release/latest-v5.x.0/node-v5.5.0-linux-armv7l.tar.gz tar -xvf node-v5.5.0-linux-armv7l.tar.gz cd node-v5.5.0-linux-armv7l sudo cp -R * / usr / local
Confirmar escribiendo
versión del nodo
Y debería ver v.5.5 (o lo último que haya descargado).
A continuación, tenemos algunos módulos de nodo para instalar.
sudo npm install -g npm sudo npm install -g nodo-gyp
En ese primer comando, en realidad estamos usando el Administrador de paquetes de nodo (npm) para instalar una versión más nueva de sí mismo. ¡Inteligente!
Ahora, para descargar el emulador HomeKit llamado HAP-NodeJS:
git clone https://github.com/KhaosT/HAP-NodeJS.git cd HAP-NodeJS npm reconstruir sudo npm instalar node-persist sudo npm instalar srp
En este punto, ejecuté este error: " #error Esta versión del nodo / NAN / v8 requiere un compilador C ++ 11 ". Si eso le sucede, instale un compilador de C ++ más reciente con los comandos:
sudo apt-get install gcc-4.8 g ++ - 4.8 sudo actualización-alternativas --install / usr / bin / gccgcc / usr / bin / gcc-4.6 20 sudo actualización-alternativas --install / usr / bin / gcc gcc / usr / bin / gcc-4.8 50 sudo update-alternatives --install / usr / bin / g ++ g ++ /usr/bin/g++-4.6 20 sudo update-alternatives --install / usr / bin / g ++ g ++ / usr / bin / g ++ - 4.8 50
Ahora no deberías tener un problema. Continúa ejecutando estos comandos, uno por uno:
sudo npm instalar srp sudo npm instalar mdns --unsafe-perm sudo npm instalar depurar sudo npm instalar ed25519 --unsafe-permanente sudo npm instalar curve25519 --unsafe-permanente
Eso debería ser todo. Intenta ejecutar el emulador con:
nodo Core.js
Si recibe errores que dicen que no puede encontrar tal o cual módulo, simplemente use el comando sudo npm install de nuevo, y coloque el nombre del módulo que falta. Suponiendo que todo está bien, debería ver algunas advertencias y su puente HomeKit se ejecutará. Así es como se ve el éxito:
Puede ver inmediatamente que ya ha creado un conjunto de 6 dispositivos falsos. Los usaremos como punto de partida para nuestra propia luz de Wi-Fi más tarde, pero los usaremos por ahora para probar. También puede ver más información de depuración si inicia el servidor con:
DEBUG = * node Core.js
Ahora salta a un dispositivo Apple capaz de ejecutar Siri. Apple, curiosamente, no ofrece una aplicación HomeKit estándar, excepto para desarrolladores registrados, así que descargue la aplicación gratuita Elgato Eve, una aplicación de administración HomeKit que le permite agregar dispositivos (incluso los que no son de Elgato) a su red HomeKit.
La primera vez que inicie la aplicación, tendrá que ponerle nombre a su casa, seguir adelante y revisarla. Luego, selecciona "Agregar accesorio". ¡Ignora el mensaje de estar cerca de él!
Le indicará que busque un "Código de configuración HomeKit" único a continuación. Ignora eso y presiona "Agregar a [nombre de tu casa]".
También le indicará que el dispositivo no está certificado. De hecho no lo es. Adelante de todos modos. Cuando llegue a la pantalla solicitando un código de accesorio ...
Elija ingresar el código manualmente y escriba lo siguiente:
031-45-154
Esto se puede encontrar / cambiar en el archivo Light_accessory.js, pero más sobre eso más adelante. Agregue este accesorio a su habitación predeterminada, llámalo Luz falsa y siga caminando por los cuadros de diálogo para elegir el icono, etc.
Finalmente, regrese a la sesión SSH donde tiene HAP-NodeJS ejecutándose. Es posible que ya haya visto un mensaje que dice "¿Estamos encendidos?": Esa es la encuesta de la aplicación Elgato para conocer el estado de la luz. Abra Siri y dígale que "Encienda la luz falsa", luego intente apagarlo de nuevo. Con suerte, verá algunos mensajes de depuración de HAP-NodeJS para mostrar que recibió los comandos.
¿Estamos en? No. ¡Encendiendo la luz! Apagando la luz!
Fantástico, ese es el primer paso. Ahora necesitaremos una luz real, antes de volver a configurar el puente nuevamente.
Construyendo una luz de Wi-Fi
El lado del hardware de este paso es sorprendentemente simple si comenzamos con solo cuatro Neopixels, ya que podemos alimentarlos directamente desde la placa de desarrollo NodeMCU y su conexión USB. Si tiene una tira más larga, no se preocupe: hemos definido esto en el software, por lo que el resto simplemente no se enciende.
Conecte el cable de alimentación rojo de un cable de Neopixel al pin de VIN, tierra azul a GND, y el cable de señal verde al pin marcado D2 en el NodeMCU. Tenga mucho cuidado con la polaridad: si mezcla el suelo y el VIN, enviará una oleada de poder a través de su tablero, y lo destruirá en el proceso.
Si tu entorno Arduino aún no está configurado para funcionar con ESP8266, sigue y sigue la guía en mi ESP8266: Arduino Killer Conoce al asesino de Arduino: ESP8266 Conoce al asesino de Arduino: ESP8266 ¿Qué pasa si te digo que hay un desarrollador compatible con Arduino? placa con Wi-Fi incorporado por menos de $ 10? Bueno, lo hay. Lea la guía más y luego regrese después de que haya confirmado que está funcionando. Instale estas bibliotecas adicionales:
- PubSubClient de lmroy
- NeoPixels de Adafruit
El código que estamos usando es una modificación del usuario de Github Aditya Tannu's: eliminé la funcionalidad de actualización innecesaria por aire, agregué algunas funciones de HSV que faltaban, y facilité la creación de más luces al solo cambiar un variable única Si no puede ver el código incrustado debajo, lo encontrará en este Gist.
Actualice las siguientes líneas con su propia información de red y un nombre único para cada accesorio que cree (host).
const char * ssid = "...."; const char * password = "..."; const char * host = "officelight"; IPAddress MQTTserver (192, 168, 1, 99);
La dirección IP de este dispositivo se obtiene automáticamente a través de DHCP; no importa si cambia, ya que nos estamos conectando al mismo servidor MQTT cada vez.
Por ahora solo usamos 4 Neopixels, pero puede aumentar el número más tarde si los alimenta desde una fuente externa. Suba el código y probemos: use su cliente MQTT favorito para enviar comandos (ajuste el nombre del host en las siguientes instrucciones si lo ha cambiado) .
- Puede enviarlo al canal de usuario oficial de root para activarlo. Envía cualquier otro valor a ese canal para apagarlo.
- Puede enviar un número de 0-360 a officelight / hue para cambiar el color. Estamos utilizando el espacio de color HSV, por lo que 0 y 360 son rojos, 120 es verde y 240 es azul.
- Envía un valor porcentual para el brillo (0-100, no incluye el símbolo%).
- Lo mismo para la saturación. Un valor de 100 estará completamente saturado (es decir, un color sólido) y cero será blanco puro, independientemente del tono especificado.
Una vez que hayas confirmado que tu lámpara de iluminación impulsada por MQTT está funcionando, sigue adelante.
Configurar un nuevo accesorio HomeKit
Vuelva a la Raspberry Pi y finalice la aplicación HAP-NodeJS si aún no lo ha hecho. Navega al directorio / accessories . Para hacerlo más fácil, puede descargar directamente el código que ya se ha emparejado al accesorio "officelight" escribiendo lo siguiente:
wget https://gist.githubusercontent.com/jamesabruce/a6607fa9d93e41042fee/raw/12e4fd1d1c2624e7540ba5e17c3e79bc6bdec5fd/Officelight_accessory.js
Esencialmente, este es un duplicado del accesorio de luz predeterminado, con algunos nombres de variables modificados (una vez más, adaptado del trabajo de Adysan, simplificado para facilitar el uso). Esto es lo que debe saber para crear sus propios accesorios personalizados basados en esto.
- Todos los accesorios deben tener el nombre * _accessory.js
- Cambie la dirección IP en la variable de opciones en la parte superior de su servidor MQTT
- Si tiene un nombre de dispositivo diferente, busque / reemplace todas las instancias de " officelight " con su nombre único de dispositivo. Puede hacer una búsqueda / reemplazo en Nano presionando CTRL y \, escribiendo el término para buscar, el término para reemplazar, luego presione A (es decir, todas las instancias). Examine cada uno de estos para conocer con precisión qué variables se están actualizando.
- Cree un nombre de usuario hexadecimal único para el accesorio ( light.username = "1B: 2B: 3C: 5D: 6E: FF"; )
- No cambie el código PIN. Sigue un formato específico y, a menos que sepa lo que está haciendo, no podrá emparejarse. No hay problema con mantenerlos iguales entre las luces.
- Puede darle a su dispositivo un "nombre Siri" diferente al agregarlos a la aplicación Elgato Eve, y editarlos en cualquier momento para que no se quede con su elección inicial. No es necesario editar los archivos de configuración o reiniciar el servidor.
- Una vez que tenga múltiples accesorios, puede usar la aplicación Elgato Eve para agruparlos por habitación, o para crear escenas específicas que consisten en múltiples acciones complejas. Las escenas pueden consistir en varias acciones, como: encender la luz de la oficina, atenuarla al 25%, volverla roja y activar la cafetera.
Tendrá que agregar su nuevo accesorio a través de su aplicación HomeKit de nuevo.
Finalmente, queremos ejecutar nuestra aplicación HAP-NodeJS siempre que se reinicie el Pi. Agregue lo siguiente a su archivo etc / rc.local, justo antes de la salida 0 .
nodo sudo /home/pi/HAP-NodeJS/Core.js </ dev / null &
Puede ver que he combinado esto con algunos otros comandos que ya configuré para iniciar al arrancar.
Si esta es la primera vez que usa rc.local, puede necesitar configurarlo como ejecutable:
sudo chmod 755 /etc/rc.local
Si por alguna razón necesita ejecutarlo en modo de depuración de nuevo, puede eliminar la aplicación de nodo en ejecución con:
nodo killall
Un último paso: vaya al directorio de accesorios y elimine GarageDoorOpener_accessory.js . En el momento de escribir esto, esto tiene errores y hará que el servidor se rompa después de un tiempo.
¿Qué controlarás con Siri?
Ahora que tiene lo básico, no hay límite para lo que puede controlar: si puede codificarlo en Javascript, puede crear su propio archivo de accesorios. Hay mucho potencial aquí, creo que te divertirás mucho. Déjame saber en los comentarios lo que se te ocurra.