====== Doorbell ======
[[https://fr.aliexpress.com/item/1005002488501278.html?spm=a2g0o.productlist.0.0.3fd216eftYmjNU&algo_pvid=1f7b861c-5dff-4e47-b28b-74e50af365fb&algo_exp_id=1f7b861c-5dff-4e47-b28b-74e50af365fb-8&pdp_ext_f=%7B%22sku_id%22%3A%2212000020840038573%22%7D|ESP32CAM]]
[[https://esphome.io/components/esp32_camera.html|Esphome camera component]]
[[https://github.com/crossan007/esphome/tree/feature/rtsp-server|Esphome RTSPserver github]]
{{:projects:iotaiuto:esp32cam.png?400|}}
Per la prima scrittura:
- connettere uno dei pin di IO a GND, come mostrato in figura
- attaccare l'USB
- dare i permessi alla porta, esempio: chmod 660 /dev/ttyUSB0
- riavviare esphome
- uploadare la configurazione
Per le scritture wireless non serve che GND sia connesso a un pin di IO
Configurazione base per camera e led
esphome:
name: esp-citofono
platform: ESP32
board: esp32dev
# Enable logging
logger:
# Enable Home Assistant API
api:
wifi:
ssid: "wifi ssid"
password: "password"
esp32_camera:
name: Videocamera citofono
external_clock:
pin: GPIO0
frequency: 20MHz
i2c_pins:
sda: GPIO26
scl: GPIO27
data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35]
vsync_pin: GPIO25
href_pin: GPIO23
pixel_clock_pin: GPIO22
power_down_pin: GPIO32
max_framerate: 5 fps
# Flashlight CHECK PIN
output:
- platform: gpio
pin: GPIO4
id: gpio_4
light:
- platform: binary
output: gpio_4
name: doorbell light
sensor:
- platform: wifi_signal
name: doorbell wifi signal
update_interval: 30s
- platform: uptime
name: doorbell uptime
===== RTSP Server =====
Installazione del fork di esphome, che sostituirà esphome originale
mkdir esphome_rtsp
cd esphome_rtsp
git clone https://github.com/crossan007/esphome
cd esphome
checkout feature/rtsp-server
pip install .
esphome ~/config dashboard
Aggiungere alla configurazione di esp32cam:
esp32_camera:
# id per rtsp server
id: cam
external_clock:
pin: GPIO0
...
...
rtsp_server:
port: 8675
camera: cam
Visualizzare stream RTSP con VLC:\\
VLC menu -> Media -> Open network stream -> rtsp://indirizzo_ip_esp:8675
===== HTTP Server =====
In alternativa si può usare anche questo componente http e convertire successivamente in rtsp quando lo stream passa per il raspberry.
Nel mio caso stranamente ha dato risultati migliori.
https://github.com/ayufan/esphome-components#25-esp32_camera_web_server
===== Conversione del video =====
La camera manda una sequenza di immagini JPEG con framerate variabile. Per mostrarle su Alexa è necessario convertirle in uno stream video con codec H264 (più leggero) o MPEG4. Dato che la potenza dell'esp è limitata è meglio affidare questo compito al raspberry.
- Lanciare un server rtsp sul raspberry, ad esempio https://github.com/aler9/rtsp-simple-server (togliere i servizi inutili nella configurazione)
- sudo apt-get install ffmpeg
- Lanciare uno tra questi comandi sul raspberry per prendere il flusso della camera, convertirlo in video e lanciare lo stream sul server rtsp
Formato H264 (più compresso)
ffmpeg -use_wallclock_as_timestamps 1 -i http://indirizzo_ip_esp32cam:8080 -c:v libx264 -preset veryslow -tune zerolatency -movflags +faststart -pix_fmt yuv420p -disposition:v:0 default -r 5 -g 1 -f rtsp rtsp://indirizzo_ip_raspberry:8443/stream
Formato MPEG4
ffmpeg -use_wallclock_as_timestamps 1 -i http://192.168.1.254:8080 -c:v mpeg4 -tune zerolatency -movflags +faststart -pix_fmt yuv420p -disposition:v:0 default -r 5 -g 1 -f rtsp rtsp://indirizzo_ip_raspberry:8443/stream
Modificare framerate (-r) e gop (-g) a piacere
Mentre ffmpeg è in esecuzione è importante guardare il numero di frame duplicate e droppate da ffmpeg nella barra di stato, e aggiustare il framerate di conseguenza (modificarlo anche nella configurazione esphome della camera)
Il preset veryslow comprime molto e tiene leggera la banda. Se la speed di ffmpeg va sotto a x1 si può usare un preset più veloce per alleggerire il lavoro al processore.
==== Monocle ====
- Installare la skill Monocle su Alexa
- Accedere a https://portal.monoclecam.com/
- Aggiungere un feed e configurarlo
URL: rtsp://ip_locale_raspberry:8443/stream
Name: citofono
Authentication: None
Video resolution: Quella inserita nella configurazione della camera
Video codec: H264
Audio codec: None
Tags: @proxy
L'url è quello del server rtsp su cui ffmpeg manda il video convertito
Aggiungere il tag @proxy solo se si vuole utilizzare il Monocle Gateway, ovvero il sistema di redirect che esce dalla rete locale per far arrivare il flusso dal dominio di monocle
Per installare Monocle Gateway sul raspberry seguire questa guida: https://monoclecam.com/monocle-gateway/install/linux-raspi