Integrar el Reactor ARC en Home Assistant

Integrar el Reactor ARC (versión Jarvis)

Si eres un ‘friki’ de Iron Man, prepárate porque hoy vamos a integrar el Reactor ARC en Home Assistant con Jarvis en su interior.

🥑 Si estás empezando con ESPHome, te recomiendo que veas el taller de la academia para sacarle el máximo partido!
Esphome para novatos

¿Qué es el Reactor ARC?

Ya, sé que la duda ofende si eres fan de Tony Stark, pero permíteme que haga una brevísima introducción. El Reactor Arc es un dispositivo diseñado inicialmente por Howard Stark, y posteriormente adaptado por su hijo, Tony. Este es capaz de proporcionar una gran cantidad de energía y posteriormente fue miniaturizado por Tony Stark para llevarlo en el pecho y ser la fuente del poder de Iron Man.

Nuestro Reactor ARC

No hace falta decir que a los ‘frikis’ de la tecnología nos encantan este tipo de dispositivos, por lo que este tenía que ser uno de los primeros modelos tras empezar con la impresora 3D. Si buscas por internet comprobarás que hay montones de modelos que puedes imprimir, pero en aguacatec queríamos diseñar uno específicamente pensado para nuestra domótica. Con este objetivo, hemos conseguido integrar el Reactor ARC en Home Assistant.

Las funciones de nuestro Reactor ARC son las siguientes:

  • Jarvis como asistente de voz. Gracias al nuevo soporte que he diseñado, a todo lo que te expliqué en esta entrada sobre cómo crear tu asistente local y otros ajustes que vamos a ver, conseguiremos tener el mismo asistente que Tony Stark llamándole con las palabras «Hey Jarvis».
  • Emitir notificaciones luminosas. Es decir, empezar a brillar con distintos colores y efectos cuando suceden cosas (por ejemplo, parpadear cuando acaba la lavadora, iluminarse en color rojo cuando nos estamos quedando sin batería o mostrar un efecto arcoiris cuando ha terminado nuestra impresora 3D).
  • Soporte de carga para smartwatch. En mi caso lo utilizaré con mi Amazfit GTR3 desde el que controlo Home Assistant.
  • No obstante, puesto que funciona con una placa ESP lo podemos modificar para alojar los sensores que queramos e integrarlos con ESPHome.

Quiero uno!!

Si ya estás impaciente por integrar el Reactor ARC, empezaré por decirte cómo conseguirlo:

  • Constrúyelo tú mismo. Si tienes al alcance una impresora 3D puedes descargar nuestro modelo y hacerlo tú mismo. Recuerda que si eres Patreon de aguacatec tienes acceso ilimitado a todos nuestros modelos 3D, entre otras ventajas. Ten en cuenta lo siguiente a la hora de imprimir el modelo:
    • Te recomiendo encarecidamente que utilices filamento transparente para imprimir las piezas que hacen de difusor. Esto hará que el efecto luminoso sea mucho más impresionante.
    • Utiliza un ‘spray’ de pintura color cobre sobre las piezas que simulan el cable para darle ese efecto realista.
    • Aunque se trata de un diseño modular pensado para encajar con las propias piezas, puedes usar pegamento de contacto entre algunas piezas para darle mayor solidez. En todo caso, no bloquees el acceso al interior del reactor!
🥑 Si no encuentras un adaptador para tu smartwatch, pídenoslo!
  • Consíguelo con aguacoins. Si ya tienes unos cuantos aguacoins en tu monedero, puedes recibirlo en casa listo para ser montado por 3 aguacoins.

Componentes del Reactor ARC

Antes de integrar el Reactor ARC en Home Assistant, repasemos los componentes necesarios:

  • Primero y más importante, la estructura de nuestro Reactor ARC.
  • Una placa ESP32 S3 N16R8. Esta placa es una variación de las placas ESP32 que permiten usar Micro Wake Word.
  • Un micro INMP441, para dar las órdenes a nuestro asistente.
  • Un anillo de 16 LEDs WS2812B. Es importante que elijas bien el modelo, ya que necesitamos que sea el modelo de 16 LEDs para que encaje perfectamente en el reactor, y que se trate de LEDs direccionables para poder crear efectos luminosos.
  • Un cable USB-C para alimentar la placa de DATOS (con un cable de carga no vas a poder instalar el software).

-71%
Placa de desarrollo de ESP32-S3, módulo Wifi 2,4G para Arduino ESP IDF ESP32-S3-WROOM-1 N8R2 N16R8, 44 pines tipo C 8M PSRAM ESP32 S3
Aliexpress
5,76€ 19,88€
Placa de desarrollo de ESP32-S3, módulo Wifi 2,4G para Arduino ESP IDF ESP32-S3-WROOM-1 N8R2 N16R8, 44 pines tipo C 8M PSRAM ESP32 S3
-66%
Módulo de micrófono omnidireccional en vivo MH-ET, interfaz I2S INMP441 MEMS, alta precisión, baja potencia, volumen Ultra pequeño para ESP32
Aliexpress
3,16€ 9,31€
Módulo de micrófono omnidireccional en vivo MH-ET, interfaz I2S INMP441 MEMS, alta precisión, baja potencia, volumen Ultra pequeño para ESP32
-5%
Anillo de píxeles direccionable, módulos Led WS2812B, 8/16/24/35/45 Leds, WS2812 IC RGB, a todo Color, redondo, círculo Led DC5V
Aliexpress
2,24€ 2,37€
Anillo de píxeles direccionable, módulos Led WS2812B, 8/16/24/35/45 Leds, WS2812 IC RGB, a todo Color, redondo, círculo Led DC5V
-2%
USLION-Cable USB tipo C de carga rápida 7A, Cable de datos para MacBook, Xiaomi, Samsung, Cable USB C a USB C para Huawei
Aliexpress
1,77€ 1,81€
USLION-Cable USB tipo C de carga rápida 7A, Cable de datos para MacBook, Xiaomi, Samsung, Cable USB C a USB C para Huawei
*Algún precio puede haber cambiado desde la última revisión
  • Un altavoz integrado en Home Assistant para reproducir las respuestas del asistente (bien sea un altavoz local o uno de tus altavoces inteligentes).
  • Haber instalado ESPHome en Home Assistant.
  • Haber configurado Assist en Home Assistant. Puedes usar los complementos «oficiales» de Piper (‘Text to speech’) y Whisper (‘Speech to text’) tal y como se explica en la guía enlazada. No obstante, también puedes utilizar otros complementos como el de Microsoft, para mejorar el reconocimiento de voz, o el de Eleven Labs, para escuchar voces más naturales y fluidas.

Montaje e instalación

Conexión del micro

Como siempre lo primero que te recomiendo es que consultes el ‘pinout’ (o distribución de pines) de la placa. En este caso, usaremos la ESP32 S3 N16R8 cuyo ‘pinout’ es el siguiente.

pinout

Empezaremos por soldar directamente el micro a nuestra placa, con el siguiente esquema de conexión.

  • SCK (verde) irá conectado al pin GPIO2 de la placa.
  • WS (naranja) irá conectado al pin GPIO3 de la placa.
  • SD (amarillo) irá conectado al pin GPIO4 de la placa.
  • L/R (blanco) y GND (negro) irán conectados al pin GND (‘ground’ o tierra) de la placa.
  • VDD (rojo) irá conectado al pin de alimentación 3v3 de la placa
micro

En este caso concreto quiero que no utilices más cable del necesario, ya que la idea es economizar el espacio de la base del Reactor ARC. Puesto que el micro irá en la parte frontal, trata de conseguir algo como lo que ves en esta imagen.

micro

Conexión del Anillo LED

Como cualquier tira LED WS2812B nuestro anillo tiene los siguientes pines, que también vamos a soldar directamene a la placa (por lo que tendrás que cortar el adaptador que trae en el extremo de los cables de entrada, a la izquierda).

  • El cable rojo proporciona la alimentación a 5 voltios, por lo que irá al pin correspondiente (5V)
  • El cable blanco es el de la conexión de tierra o ‘ground’, e irá conectado a dicho pin (GND)
  • El cable verde proporciona los datos e irá conectado al GPIO9.
  • Te recomiendo que cortes los cables de salida (a la derecha, identificados con la leyenda ‘DO’ de ‘data output’), ya que no los vamos a utilizar. También cortar las pequeñas pestañitas de cartón que suelen tener estos anillos en el interior, para que encaje bien en su pieza.
  • Adicionalmente, en la placa tendrás que aplicar una pequeña soldadura para unir los circuitos indicados como ‘RGB(para mandar la información al anillo LED) y ‘IN-OUT(para habilitar la salida de 5V). Si te fijas de cerca, tienen una pequeña endidura que impide el contacto del circuito. Te he marcado la situación de ambos con un círculo rojo en la imagen del ‘pinout’ que he incluido más arriba. Si no ves alguno de estos puentes, es que ya viene hecho internamente.
⚠️ Antes de soldar los cables a la placa (o al anillo), tendrás que pasar los cables del anillo LED por el orificio de la base y colocar el anillo en su sitio. Si no lo haces ahora después no será posible y tendrás que deshacer la soldadura por alguno de los extremos.

De esta forma ya puedes colocar la placa en la base, taparla con el soporte y terminar de montar el Reactor ARC. El último paso en el montaje, si lo vas a utilizar como cargador de smartwatch, es pasar el cable USB por el orificio y acoplar al núcleo el adaptador correspondiente a tu reloj.

Respecto a la configuración de la placa, no hay problema ya que vas a poder acceder a los puertos USB-C desde la parte trasera o levantando la tapa.

Configuración de ESPHome

Ya tenemos listos los componentes que necesitamos para integrar el Reactor ARC en Home Assistant. Ahora tenemos que ‘flashear’ la placa con ESPHome y la configuración correspondiente. Para ello sigue estos pasos:

  1. Conecta la placa a tu ordenador a través del puerto USB-C.
  2. En Home Assistant, accede al complemento de ESPHome desde el menú lateral y pulsa en «New device». Pulsa en «Continue» y dale un nombre (por ejemplo, «Jarvis Assistant»).
  3. Pulsa en «Next» y a continuación selecciona la opción «ESP32-S3» como tipo de dispositivo. Verás que en el fondo se ha creado un nuevo dispositivo.
  4. Pulsa en «Skip» y haz clic en el enlace «Edit» del bloque correspondiente al dispositivo que acabas de crear.
  5. Reemplaza el código por defecto con el siguiente, haciendo los siguientes cambios:
    • Ajusta el ‘name’ y ‘friendly-name’ como el nombre que le quieras dar a tu asistente.
    • Añade la información que te había generado el complemento en el apartado ‘api’ (‘encryption key’). Haz lo mismo para el campo ‘password’ bajo el apartado ‘ota’, y para los campos ‘ssid’ y ‘password’ bajo el apartado ‘ap’.
    • Si por algún motivo hubieras utilizado pines diferentes en el cableado de los componentes, ajusta la distribución de los pines el código. En caso contrario no debes preocuparte por ello.
    • En la parte final del código, indica la entidad ‘media_player’ correspondiente al altavoz por el que quieras que te hable el asistente (si quieres utilizar Alexa como reproductor, utiliza el servicio ‘notify.alexa_media’ que te proporciona la integración Alexa Media Player).
    • Un par de líneas más abajo, indica la entidad del servicio ‘text-to-speech’ (o ‘tts’) que quieres utilizar en las respuestas del asistente. En mi caso voy a utilizar la integración de ElevenLabs, ya que me gusta las voces naturales y fluidas que tiene.
esphome:
  name: aguacatec-assistant
  friendly_name: Aguacatec Assistant
  platformio_options:
    board_build.flash_mode: dio
  on_boot:
    - light.turn_on:
        id: led_ring
        effect: "Pulse"
        brightness: 80%
        red: 72%
        green: 89%
        blue: 93%
    - delay: 2s
    - light.turn_off:
        id: led_ring
esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
      CONFIG_AUDIO_BOARD_CUSTOM: "y"
   
psram:
  mode: octal # Please change this to quad for N8R2 and octal for N16R8
  speed: 80MHz

# Enable Home Assistant API
api:
  encryption:
    key: "zfsYMSI7npNasfsdaasddsfJpP3zDXj/FsdfdsdfsajPXo="
  on_client_connected:
        then:
          - delay: 50ms
          - micro_wake_word.start:
  on_client_disconnected:
        then:
          - voice_assistant.stop: 

logger:

ota:
  - platform: esphome
    password: "36asadfdsdfs97ba37sdffsd413b31dsfd1"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Aguacatec-Assistant"
    password: "dsffdngasdfdsai9"

captive_portal:

light:
  - platform: esp32_rmt_led_strip
    id: led_ring
    rgb_order: GRB
    pin: GPIO09
    num_leds: 16
    rmt_channel: 1
    chipset: ws2812
    name: "Led Ring"
    effects:
      - pulse:
      - addressable_scan:
          move_interval: 50ms
          scan_width: 1
# Audio and Voice Assistant Config          
i2s_audio:
  - id: i2s_in # For microphone
    i2s_lrclk_pin: GPIO3  #WS 
    i2s_bclk_pin: GPIO2 #SCK

microphone:
  - platform: i2s_audio
    id: va_mic
    adc_type: external
    i2s_din_pin: GPIO4 #SD
    channel: left
    pdm: false
    i2s_audio_id: i2s_in
    bits_per_sample: 32bit
    
micro_wake_word:
  on_wake_word_detected:    
    - voice_assistant.start:
        wake_word: !lambda return wake_word;
        silence_detection: true
    - light.turn_on:
        id: led_ring
        effect: "Pulse"
        red: 72%
        green: 89%
        blue: 93%
        brightness: 80%
  models: hey_jarvis
    
voice_assistant:
  id: va
  microphone: va_mic
  auto_gain: 31dBFS
  noise_suppression_level: 2
  volume_multiplier: 4.0
  on_stt_end:
       then: 
         - light.turn_off: led_ring
  on_error:
          - micro_wake_word.start:  
  on_end:
        then:
          - light.turn_off: led_ring
          - wait_until:
              not:
                voice_assistant.is_running:
          - micro_wake_word.start:  
  on_tts_start:                                    
    - light.turn_on:
        id: led_ring
        effect: "Scan"
        red: 72%
        green: 89%
        blue: 93%
        brightness: 80%
    - homeassistant.service:
        service: tts.speak
        data:
          media_player_entity_id: media_player.aguacatec_player
          message: !lambda 'return x;'
          entity_id: tts.elevenlabs_tts
    - light.turn_off:
        id: led_ring
  1. Cuando hayas terminado de editar el código pulsa en «Save» e «Install». Selecciona la opción «Manual download» y espera a que el código se compile (ten paciencia, que tarda un ratillo).
  2. Cuando termine, selecciona la opción «Modern format» para descargar el fichero ‘.bin’ correspondiente.
  3. Ahora ve a la página de ESPHome y pulsa en «Connect». En la ventana emergente selecciona tu placa y pulsa en «Conectar».
  4. Ahora pulsa en «Install» y selecciona el fichero ‘.bin’ obtenido en el paso 7. De nuevo, pulsa en «Install».
⚠️ Si se genera un error en la instalación, inténtalo de nuevo mientras pulsas un pequeño botón que hay en la placa que indica 'boot' hasta que comience la instalación. Como alternativa, desconecta el cable USB-C y conéctalo al otro puerto de la placa. Si aun así el error permanece es probable que necesites instalar los 'drivers' para placas ESP.
  1. Vuelve a Home Assistant y ve a Ajustes > Dispositivos y servicios. Lo normal es que tu dispositivo haya sido descubierto y aparezca en la parte superior, esperando únicamente a que pulses el botón de «Configurar». De lo contrario pulsa en el botón de «Añadir integración», busca «ESPHome» e introduce la IP de tu placa en el campo ‘Host’.
  2. Al añadir tu dispositivo ya aparecerá dentro del bloque de «ESPHome» entre tus integraciones. Accede al dispositivo y selec
    • Detección de fin de habla. Selecciona la opción «agresivo».
    • Tubería de Assist. Selecciona el ‘pipeline’ que hayas configurado para tu asistente. Por cierto, también tienes que acceder a Ajustes > Asistentes de voz, pulsar sobre tu ‘pipeline’ y bajar hasta el apartado de «Palabra de activación» para dejarlo vacío (ya que, como hemos visto, vamos a utilizar el componente MicroWakeWord desde el propio dispositivo).
🥑 Mis opciones favoritas son la de Microsoft para el componente STT y ElevenLabs para el componente TTS. Con esta combinación, junto a la MicroWakeWord he conseguido un rendimiento muy bueno! 
  1. Para terminar ve a Ajustes > Dispositivos y servicios > ESPHome. Pulsa sobre el enlace «Configurar» correspondiente al dispositivo de tu asistente. En la ventana emergente marca la casilla «Permitir que el dispositivo realice llamadas de servicio de Home Assistant» y pulsa en «Enviar». Esto va a permitir que el asistente emita el audio por otros altavoces.

Voz personalizada e inteligencia artificial

Tras integrar el Reactor ARC, ahora vamos a dotar a nuestro asistente de dos detalles que van a terminar de convertirlo en Jarvis.

  • Voz personalizada. Si quieres que la voz de tu asistente se parezca más a la original de Jarvis, te recomiendo que revises esta entrada sobre cómo añadir voces a ElevenLabs. En concreto te recomiendo que esta voz a tu biblioteca personal (es la que puedes esuchcar en el video de demostracion). También puedes encontrarla buscando «Martin Osborne 6» en la librería de voces.
  • Inteligencia artificial. Jarvis no sería el mismo si no fuera capaz de hablarnos de cualquier cosa, por eso vamos a incluir como agente de conversación a una inteligencia artificial. Para ello puedes usar tanto Google AI como OpenAI.
🥑 Si estás configurando Assist, te recomiendo que veas el taller de la academia para sacarle el máximo partido!

¿Dudas?¿necesitas ayuda? entra aquí
Y si te ha gustado, compártelo! 🙂
Contenido exclusivo de Aguacatec
Send this to a friend