My boring Blog

Home page di Mauro Frigerio

Timelapse in Home Assistant

24-01-2021 Tempo di lettura 3 minuti Article

In Home Assistant visualizzo alcune immagini di webcam presenti in zona della mia casa in montagna. A volte è interessante capire com’è stato la meteo nelle ultime ore.

Così ho cercando un po’ su internet alcune possibili soluzioni, ma non ho trovato un’integrazione utile. Così ho esteso la ricerca e ho trovato questo spunto.

Idea di base

La webcam è configurata come camera generic e un automazione salva a cadenza regolare le immagini in una cartella specifica. Durante la notte un’altra automazione crea il timelapse e cancella i file delle immagini.

Configurazione di base

Prima di tutto si deve aggiungere la seguente configurazione nel file configuration.yaml per permettere di salvare le foto della webcam. Nel esempio sotto la cartella è /config/photo. Questo esempio si riferisce ad hass.io, altrimenti potrebbe essere necessario togliere la cartella /config.

homeassistant:
  allowlist_external_dirs:
    - "/config/photo/"

Automazione - salvare foto webcam

Questa automazione permette di scaricare ogni 30 minuti una foto della webcam scelta. La condizione scatta le foto solo quando c’è luce, io ho aggiunto anche però qualche foto prima dell’alba e dopo il tramonto.

Le foto sono salvate in una cartella dedicata e hanno un nome in base alla data e l’ora (per ordinarle in seguito).


alias: Take photo from webcam
description: ''
trigger:
  - platform: time_pattern
    minutes: /30
condition:
  - condition: sun
    before: sunset
    before_offset: '01:00:00'
    after: sunrise
    after_offset: '-01:00:00'
action:
  - service: camera.snapshot
    data:
      filename: >-
        /config/photo/webcam1/webcam1_{{ now().strftime("%Y%m%d-%H%M") }}        
    entity_id: camera.generic_camera
mode: single

Configurazione - comandi shell

Nella configurazione di HA aggiungere il seguente comando per generare il timelapse con ffmpeg (il coltellino svizzero della conversione video). Le opzioni importanti da modificare sono (per generare un video mp4):

  1. -framerate: in questo esempio il video verrà generato con 2 immagini al secondo
  2. -i: la cartella e il formato delle immagini scaricate
  3. -crf: la qualità del video generato, il valore deve essere tra 0 e 51
  4. -y: il nome e la cartella dove creare il video

Il secondo comando disponibile serve per cancellare le foto una volta generato il timelapse.

shell_command:
  timelapse_webcam1: 'ffmpeg -framerate 2 -pattern_type glob -i "/config/photo/webcam1/*.jpg" -c:v libx264 -crf 30 -pix_fmt yuv420p -y /config/www/webcam1/webcam1.mp4'
  delete_files_webcam1: 'rm -f /config/photo/webcam1/*.jpg'

Automazione - generare timelapse e cancellare file

Questa è l’automazione che si occupa di far eseguire i comandi descritti in precedenza. Nel mio caso faccio eseguire l’automazione durante la notte. Tra un comando ho aggiunto un ritardo di 30 min.

alias: 'Generate timelapse '
description: ''
trigger:
  - platform: time
    at: '00:30:00'
condition: []
action:
  - service: shell_command.timelapse_webcam1
    data: {}
  - delay: '00:30:00'
  - service: shell_command.delete_files_webcam1
    data: {}
mode: single

Pagina HTML e visualizzazione in Lovelace

Questo è l’ultimo capitolo che permette di visualizzare nella schermata di Lovelace il video del timelapse creato. Aggiungere nella cartella /config/www/webcam1 il seguente file HTML chiamandolo webcam1.html.

<!DOCTYPE html>
<html>
    <head>
        <title>Webcam1 timelapse</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdn.plyr.io/3.6.3/plyr.css">

        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
    </head>
    <body>
        <video id="player" poster="video.jpg" autoplay loop muted>
            <source src="webcam1.mp4" type="video/mp4" size="720">
        </video>
        <script src="https://cdn.plyr.io/3.6.3/plyr.js"></script>
        <script>const player = new Plyr('#player');</script>
    </body>
</html>

Nella dashboard di Lovelance basta aggiungere una card per un iframe con i seguenti valori. Nell’URL della card del iframe si deve sostituire la cartella di base /config/www/ con /local/.

type: iframe
url: /local/webcam1/webcam1.html
aspect_ratio: 80%
title: Timelapse Webcam1

Conclusione

Grazie a questa configurazione ogni volta che si apre la dashboard il video del timelapse parte automaticamente. Il video però si riferisce alle immagini del giorno precedente. Se si dispone di abbastanza potenza di calcolo è possibile eseguire regolarmente la generazione del video, on-demand è però difficile.