USB-webcam koppelen aan Raspberry Pi en snapshots maken met Home Assistant

Home automation, ook wel domotica genoemd, draait om het automatiseren van apparaten in woningen. Whirlwind volgt deze ontwikkelingen met interesse en schrijft uit eigen ervaring zo nu en dan een artikel over dit onderwerp. In dit artikel koppelen we een USB-webcam aan Raspberry Pi zodat deze als een IP-camera functioneert en vervolgens laten we domotica-software Home Assistant ieder uur een snapshot maken.

Installatie

We gebruiken FFmpeg om het beeld van de webcam te streamen over het lokale netwerk. Installeer FFmpeg als volgt.

sudo apt-get update
sudo apt-get install ffmpeg

FFmpeg bevat FFserver. FFserver maakt de videostream bereikbaar voor andere computers in het netwerk. Open het configuratiebestand van FFserver als volgt.

sudo nano /etc/ffserver.conf

Plaats de volgende instellingen in het configuratiebestand van FFserver.

HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 10
MaxClients 10
MaxBandWidth 10000
CustomLog -

<Feed camera.ffm>
File /tmp/camera.ffm
FileMaxSize 5000K
</Feed>

<Stream camera.mpeg>
Feed camera.ffm
Format mpeg
VideoBitRate 4096
VideoBufferSize 4096
VideoFrameRate 5
VideoSize 640x480
VideoQMin 5
VideoQMax 51
NoAudio
Strict -1
</Stream>

Testen

Start FFserver met het volgende commando:

ffserver & ffmpeg -v verbose -r 5 -s 640x480 -f video4linux2 -i /dev/video0 http://localhost:8090/camera.ffm

De bovenstaande parameters betekenen het volgende: 

  • -v staat voor loglevel en toont informatie over de werking van FFserver
  • -r staat voor framerate, het aantal beelden per seconde
  • -s staat voor resolutie, in dit geval 640 x 480 pixels
  • -f staat voor output file format, in dit geval video4linux2
  • -i staat voor input, in dit geval /dev/video0
  • Als laatste de FFserver URL waarop de stream zichtbaar moet zijn

FFmpeg kan beëindigd worden door op q te drukken. Overigens wordt FFserver daarmee niet beëindigd; dat moet handmatig gebeuren. Om FFserver te beëindigen, moet eerst het ID opgezocht worden waaronder FFserver draait:

sudo netstat -nlp | grep 8090

Achter LISTEN staat het ID, bijvoorbeeld 3661.
Voer het volgende commando in om FFserver te beëindigen:

kill 3661

Automatisch starten

Maak als volgt een service aan indien je FFserver automatisch wilt starten bij het opstarten van de Raspberry Pi.

sudo nano /etc/systemd/system/ffserver.service

Plaats het volgende in ffserver.service:

[Unit]
Description=FFMPEG server

[Service]
User=pi
ExecStart=/usr/bin/ffserver

[Install]
WantedBy=multi-user.target

Maak ffmpeg.service met de volgende inhoud aan indien je FFmpeg automatisch wilt starten.

[Unit]
Description=FFMPEG
After=ffserver.service

[Service]
User=pi
ExecStart=/usr/bin/ffmpeg -v verbose -r 5 -s 640x480 -f video4linux2 -i /dev/video0 http://localhost:8090/camera.ffm
Restart=always
RestartSec=15

[Install]
WantedBy=multi-user.target

Herlaad als volgt systemd en stel in dat de FFserver en FFmpeg services gestart moeten worden bij het opstarten van de Raspberry Pi:

sudo systemctl daemon-reload
sudo systemctl enable ffserver.service
sudo systemctl enable ffmpeg.service

Bekijk de status van de services met:

sudo service ffserver status
sudo service ffmpeg status

Webcam koppelen aan Home Assistant

Voeg het onderstaande toe aan de configuratie van Home Assistant om het camerabeeld zichtbaar te maken. Mocht je de webcam gekoppeld hebben aan een andere computer dan waarop Home Assistant draait, dan dient FFmpeg ook op die computer geïnstalleerd te worden.

camera:
  - platform: ffmpeg
    input: 'http://localhost:8090/camera.mpeg'

Herstart Home Assistant. In de interface verschijnt een snapshot van de webcam die om de paar seconden wordt bijgewerkt. Klik op de snapshot om het bewegende beeld te bekijken.

Automatisch snapshots maken

De volgende automation voor Home Assistant maakt ieder uur, tussen 8 uur ’s ochtends en 10 uur ’s avonds, een snapshot. Dit gebeurt om 8.00 uur, 9.00 uur, enzovoort.

De map waarin de snapshots opgeslagen moeten worden, dient als volgt vermeld te zijn in de configuratie van Home Assistant. Zonder deze vermelding worden de snapshots niet opgeslagen.

  whitelist_external_dirs:     '/home/homeassistant/.homeassistant/webcam'

De automation is als volgt:

- alias: Webcam
  trigger:
    platform: time
    minutes: 0
    seconds: 0
  condition:
    condition: time
    after: '08:00:00'
    before: '22:00:00'
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
      - sat
      - sun
  action:
    service: camera.snapshot
    data:
      entity_id: camera.ffmpeg
      filename: '/home/homeassistant/.homeassistant/webcam/webcam_{{ now().strftime("%d-%m-%Y_%H-%M-%S") }}.jpg'

Met deze beelden kan bijvoorbeeld een timelapse-video worden gemaakt. De losse beelden worden dan snel achter elkaar afgespeeld.