Módulo ESP32 con camara en Home Assistant
Vamos a integrar un módulo ESP32 con cámara, sensor de movimiento y pantalla en mi instalación de Home Assistant. La clave para este proyecto fue la implementación de ESPHome, una plataforma que simplifica la integración de dispositivos ESP32 en Home Assistant.
El modulo que tenía guardado hace un tiempo es el TTGO: LILYGO® TTGO T-Camera ESP32 WROVER cámara 0,96 OLED. Importante es que la versión de mi placa es 1.6.2. Eso sera relevante a la hora de identificar los diferentes pines de los periféricos.
Problemas Encuentros y Soluciones
1. Problema con el Flasheo y Windows
Al principio, me encontré con un problema al intentar cargar el programa en el ESP32. Por algún motivo en MacOS era imposible hace la carga del programa en el ESP32. Quizás los drivers USB/Serial. La solución fue cambiar a Windows. Desde Windows pude cargar los binario desde ESPHome.
2. Cambios en los Pines de la Cámara
Experimenté dificultades con los pines de la cámara, ya que estaban ligeramente diferentes a los estándar. Afortunadamente, encontré ejemplos útiles que me ayudaron a solucionar este problema. El la sección de links “Configuración Funcional para TTGO ESP32 Camera Board” Uno de los comentarios propone una configuración de PINs que sirve para la placa 1.6.2
Configuración de ESPHome
La configuración la hice toda a través de las herramientas de ESPHome. ESPHome es una plataforma de código abierto diseñada para simplificar la integración de dispositivos basados en ESP8266 y ESP32 con el ecosistema Home Assistant. Permite la configuración fácil y la programación de dispositivos IoT utilizando un formato YAML sencillo, lo que facilita la creación de firmware personalizado para una variedad de sensores, actuadores y otros componentes electrónicos.
Me base en la configuración de los links de recursos, pero finalmente adapté la configuración inicial de espHome con la de los posts de referencia. También añadí la configuración para poder enviar mensajes a la pantalla a través de una cola de MQTT. Esto último no tiene mucha utilidad pero era mi primera vez interactuando con MQTT.
esphome:
name: camera-1
esp32:
board: esp32dev
framework:
type: arduino
# Example configuration entry
mqtt:
broker: homeassistant
username: mosquitto
password: 432fr354g543r
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "fdsfdsfds+cKCuURB6GbFf4="
ota:
password: "fdsfdsfdsfds"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Camera-1 Fallback Hotspot"
password: "23243242d"
captive_portal:
# ttgo_camearv16 configuration
esp32_camera:
external_clock:
pin: GPIO4
frequency: 20MHz
i2c_pins:
sda: GPIO18
scl: GPIO23
data_pins: [GPIO34, GPIO13, GPIO14, GPIO35, GPIO39, GPIO38, GPIO37, GPIO36]
vsync_pin: GPIO5
href_pin: GPIO27
pixel_clock_pin: GPIO25
resolution: 640x480
jpeg_quality: 10
# Image settings
name: Camera 1
binary_sensor:
- platform: gpio
pin:
number: GPIO19
mode: INPUT
inverted: False
name: Camera 1 Motion
device_class: motion
filters:
- delayed_off: 1s
- platform: gpio
pin:
number: GPIO15
mode: INPUT_PULLUP
inverted: True
name: Camera 1 Button
filters:
- delayed_off: 50ms
- platform: status
name: Camera 1 Status
sensor:
- platform: wifi_signal
name: Camera 1 WiFi Signal
update_interval: 10s
- platform: uptime
name: Camera 1 Uptime
i2c:
sda: GPIO21
scl: GPIO22
# This file has to exists when compiling
font:
- file: "fonts/Roboto-Regular.ttf"
id: tnr1
size: 17
# Configuración para Mosquitto MQTT
text_sensor:
- platform: mqtt_subscribe
name: "Info for screen"
id: infocamera
topic: home/camera1_screen_text
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
address: 0x3C
rotation: 180
lambda: |-
it.printf(0, 0, id(tnr1), "%s", id(infocamera).state.c_str());
Antes de cargar espHome emite una key que habrá que introducir después para integrar el dispositivo, se tendrá que guardar hasta entonces.
Integrando MQTT para Pantalla
Para aprovechar al máximo la pantalla, decidí utilizar MQTT para mostrar información relevante. Configuré manualmente la conexión con el servidor MQTT y agregué el componente necesario para la pantalla. MQTT tiene que estar instalado en Home Assistant. Se puede hacer a través del addon de Mosquitto. Se instala muy fácil. Luego solo queda definir un TOPIC donde se escriben y leen los mensajes de la cola. En mi caso home/camera1_screen_text. No es necesario que tenga esta estructura. Peru la estructura con / ayuda a organizar diferentes estancias.
Utilicé este pequeño script para probar mi configuración de Mosquitto que habia instalado en Home Assistant. Este script lo ejecuté desde otro ordenador conectado a la red.
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("home/camera1_screen_text")
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set("mosquitto", "6Y2TRQuNtjPHqEvC")
client.connect("homeassistant", 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
Carcasa impresa en 3D
He realizado una modificación en la carcasa para mi proyecto del termostato, inspirado en el artículo Control de Calefacción con Home Assistant. La nueva tapa tiene los agujeros para la cámara, pantalla, botones y sensor de movimiento.
A continuación, puedes ver la foto de la nueva tapa:
El nuevo modelo no tenía las medidas adecuadas por tanto la placa no se cabia en el marco, pero como referencia, aquí están los enlaces a los archivos STL:
Asi se vé ya instalada
Configuración en Home Assistant
Aquí está la imagen de la configuración en HA, utilice una de las tarjetas predefinidas que pueden mostrar el video en la pantalla principal y ademas los botones para el sensor de movimiento y otras cosas que puedan haber en esa estancia (luces por ejemplo)
BONUS: Cámara autónoma
Es posible instalar un firmware que conecté la cámara a la red y asi poder acceder directamente a las imágenes. Se puede descargar desde “Documentación Original (YAML) - Importante para el Streaming” en los recursos de referencia.