Gravar video da ESP32-CAM com Esphome

Caso queiram gravar um video de uma ESP camera que tenha Esphome a maneira mais simples que encontrei foi criar um shell_command que pode ser executado manualmente ou por exemplo numa automação.
Pois o serviço camera.record do HA não funciona com a mesma e o token da camera está sempre a ser alterado, obrigando a usar um template no shell_comand para o ir buscar.

Este é o shell_command em confirmation.yaml e é necessário também o ffmpeg ativo:

shell_command:
  camera_video: ffmpeg -i https://<oteu>.duckdns.org/api/camera_proxy_stream/camera.camera_1?token={{ state_attr('camera.camera_1','access_token') }} -t 10 -c:v libx264 -preset slow -crf 23 -c:a copy /config/www/cameras/video_{{ now().strftime("%Y_%m_%d__%H_%M_%S") }}.mp4


ffmpeg:

E esta é a programação da câmera:

esphome:
  name: cam1
  platform: ESP32
  board: esp32cam

wifi:
  ssid: !secret wifi_name
  password: !secret wifi_pass
  fast_connect: True
  manual_ip:
    static_ip: !secret ip_cam1
    gateway: !secret gateway
    subnet: !secret subnet

  ap:
    ssid: "Cam1"
    password: !secret wifi_pass

captive_portal:

logger:

api:
  password: !secret api_pass
  reboot_timeout: 0s

ota:

esp32_camera:

  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

  name: Camera 1

i2c:
  sda: 26
  scl: 27
  scan: False

output:
  - platform: gpio
    pin: GPIO4
    id: gpio_4

light:
  - platform: binary
    output: gpio_4
    name: "Camera 1 - Luz"
    
switch:
  - platform: restart
    name: "Camera 1 - Restart"

binary_sensor:
  - platform: status
    name: "Camera 1 - Status"
  
sensor:
  - platform: uptime
    name: "Camera 1 - Uptime Sensor"
    id: camera_1_uptime_sensor
  - platform: wifi_signal
    name: "Camera 1 - WiFi Signal Sensor"
    update_interval: 60s

text_sensor:
  - platform: template
    name: "Camera 1 - Uptime Sensor2"
    lambda: |-
      int seconds = (id(camera_1_uptime_sensor).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600); 
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 70s

  - platform: version
    name: "Camera 1 - ESPHome Version"

Neste caso faz um video de 10 seg, mas pode ser maior ou menor, basta no código do shell_command onde tem -t 10 colocar por exemplo -t 20 para criar um video de 20 seg.

O ficheiro .mp4 sera guardado na pasta /config/www/cameras com o nome video+“data”.mp4, o que tambem podem alterar.

O vídeo é criado apartir das imagens que a camera vai enviando automaticamente o que faz com que um vídeo de 10 seg na realidade sejam imagens de 30 seg ou mais o que dá a sensação que está a andar muito rápido, ou seja a camera envia em 10 segundos 10 imagem (frames) que no vídeo vão corresponder a 1 segundo (10 frames por segundo).

Depois uso o GalleryPanel para ter acesso facil aos videos.

O único problema que tenho no momento é que no telemóvel (android) não abre o video na APP do HA nem no Chrome, so usando o MXplayer ou o VLC.
Já tentei diferentes codecs no shell_command não deu com nenhum… Se alguém tiver uma solução agradeço…

Fica a partilha… Espero que seja útil para alguém.

1 Curtiu

Obrigado pela partilha. :+1:

Pelo que entendo esta técnica funciona também para outras câmaras não sendo exclusividade de uma câmara de Esp32, estou correto?

Penso que sim. As únicas câmeras que tenho de momento são duas esp32, não testei noutras mas pela lógica deve funcionar com qualquer uma.


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade