Martin Koksrud Bekkelund

Martin Koksrud Bekkelund

Teknologi • Samfunn • Politikk

CloudCam

12.09.17

Her får du oppskriften på hvordan du bruker et webkamera til å ta bilder gjennom dagen, og en hjemmelaget skytjeneste til å lage en time-lapse av bildene når dagen er slutt.

For en tid tilbake kunne du lese om hvordan jeg benyttet en Raspberry Pi og et billig kamera til å lage mitt eget webkamera på hytta. Senere kunne du også lese om driftsleverandøren DigitalOcean som leverer skytjenester så enkle i bruk at selv far kan forstå dem.

Med kombinasjonen av Raspberry Pi på hytta og DigitalOcean, har jeg nå helautomatisert produksjonen av time-lapse-filmer i skyen. Ikke bare for kameraet jeg har montert til Raspberry Pi, men også for de tre andre kameraene som tar stillbilder på hytta.

Denne beskrivelsen gir ingen eksakt steg-for-steg-forklaring. Du trenger basiskunnskaper i bruk av terminal og forståelse for enkel programmering med Bash. Feil kan forekomme, finner du noen må du gjerne si i fra på GitHub.

Hva er laget?

Hvert minutt tar et webkamera jeg har stående på hytta et bilde. Gjennom en hel dag blir det en del bilder, og når dagen er slutt setter jeg dem sammen til en time-lapse-film som jeg kan se dagen etter. Alt skjer automagisk.

Den nyeste filmen kan jeg se i en hvilken som helst nettleser, på en hvilken som helst maskin, mobil eller nettbrett. Det samme kan jeg med det siste bildet webkameraet har tatt.

Her ser du et eksempel.

Hva er prosessen?

CloudCam

Jeg beskriver prosessen fra start til slutt, fra der bildet oppstår til du kan se en ferdig time-lapse. Imidlertid er det ikke mulig å følge denne veiledningen kronologisk. Du må starte bakfra. Eksempelvis kan du ikke starte å laste opp bilder fra webkameraet til Raspberry Pi-en før du har satt opp en FTP-server på den.

På webkameraet

De fleste webkamera i dag kan laste opp stillbilder via FTP eller SFTP. I innstillingene til webkameraet angir man adressen bildene skal lastes opp til, samt et brukernavn og passord.

I mitt tilfelle skal bildene lastes opp fra webkameraet til en Raspberry Pi i det lokale nettverket, som (også) fungerer som FTP-server, slik du ser av illustrasjonen over.

Webkameraet skal pekes til IP-adressen til Raspberry Pi-en, for eksempel 127.0.0.2.

Noen webkamera kan laste opp bilder med fast filnavn eller tidsstemplet filnavn, det vil si for eksempel enten webkamera.jpg eller 2017-05-17_133742.jpg. Angi at kameraet skal laste opp et bilde med tidsstemplet filnavn, slik at du får en sekvens av bilder.

En av fordelene med å laste opp bilder til en lokal FTP-server, er at man reduserer ekstern trafikk som potensielt kan benyttes som en angrepsvektor dersom du, som meg, har eldre kamera som ikke støtter SFTP.

En annen fordel er at du kan redusere båndbreddebruken, ved å la Raspberry Pi-en komprimere bildene idet de transporteres videre. Jeg skriver kan, da JPEG-bilder gjerne er komprimert fra før og ytterligere komprimering ikke nødvendigvis sparer deg for mye båndbredde.

På Raspberry Pi

Raspberry Pi-en bør du gi en fast IP-adresse, slik at den ikke endrer seg over tid. Dette gjør du typisk i ruteren som administrerer IP-adressene dine.

På Raspberry Pi skal du sette opp en FTP-server, slik at den kan ta i mot bilder fra webkameraet. Raspberry Pi Foundation har laget en utmerket beskrivelse av hvordan du går frem, steg for steg.

Nå har du en FTP-server som er klar til å ta i mot bilder fra webkameraet. Har du fulgt anvisningen til Raspberry Pi Foundation, heter mappen /home/pi/FTP/. Har du flere kamera kan du i denne mappen lage en mappe til hvert kamera, så holder du bildene adskilt, for eksempel /home/pi/FTP/kameranavn/.

Nå må bildene overføres fra Raspberry Pi-en til en server på internett. Jeg har valgt å ta de til en webserver først, for så å hente de videre til en annen server for produksjon av time-lapse. Dette fordi jeg ikke bare skal benytte dem til time-lapse, men også fordi jeg vil se på dem gjennom dagen for å se hvordan været er på hytta akkurat nå. Da trenger jeg en webserver jeg ikke selv drifter, denslags overlater jeg til profesjonelle.

Før du går videre trenger du å opprette et par med krypteringsnøkler mellom Raspberry Pi-en og webserveren du skal overføre bilder til. Du kan benytte beskrivelsen jeg skrev sist, under avsnittet «Opprette kryptografisk nøkkelpar».

På Raspberry Pi-en lager jeg et Bash-skript som ser ut som følger.

#!/bin/bash

# Last opp bilder og slett dem deretter
sudo rsync --remove-source-files -z /home/pi/FTP/kameranavn/*.jpg brukernavn@eksempel.no:CloudCam/kameranavn/log/

Last ned…
Bash • 211 bytes • 85 Antall nedlastinger

Skriptet benytter rsync for å overføre filer. Når rsync benyttes på denne måten, med brukernavn@eksempel.no, benyttes automagisk SSH for overføringen med nøkkelparet du har generert.

Parameteret --remove-source-files betyr at filene skal slettes fra Raspberry Pi-en etter overføring. Parameteret -z betyr at overføringen skal komprimeres, så sparer du båndbredde.

Skriptet lagrer jeg som /home/pi/Kode/cron_rsync_kameranavn.sh. Deretter åpner jeg et terminalvindu og skriver chmod +x /home/pi/Kode/cron_rsync_kameranavn.sh for å gjøre skriptet kjørbart som et program.

Dette skriptet kjører jeg med cron hvert minutt. For å redigere crontab, tabellen med oversikt over cron-jobber som kjøres, skriver du crontab -e i et terminalvindu på Raspberry Pi-en.

I crontab legger du inn følgende linje.

*/1 * * * * /home/pi/Kode/cron_rsync_kameranavn.sh

Nå kjører skriptet hvert minutt hele døgnet. Da kopieres samtlige bilder av formatet JPEG (med filendelsen .jpg) fra mappen /home/pi/FTP/kameranavn/ på Raspberry Pi-en til en mappe på webserveren som heter /CloudCam/kameranavn/log/. Nå vil alle bilder havne i denne mappen fortløpende.

På webserveren

Som nevnt tidligere ønsker jeg å se på det til enhver tid siste bilde som er tatt, slik at jeg kan se på været på fjellet akkurat nå. Men når webkameraet tar tidsstemplede bilder på formatet 2017-05-17_133742.jpg, vil det ikke være mulig å vise siste bilde når filnavnet hele tiden er dynamisk.

Dermed kjører jeg et Bash-skript på webserveren hvert minutt. Skriptet ser ut som følger.

#!/bin/bash

cp $(ls -t /CloudCam/kameranavn/log/* | head -1) /CloudCam/kameranavn/kameranavn.jpg

Last ned…
Bash • 200 bytes • 79 Antall nedlastinger

Dette skriptet tar en kopi av den nyeste filen i mappen /CloudCam/kameranavn/log/ og lagrer kopien som /CloudCam/kameranavn/kameranavn.jpg. Skriptet kjøres hvert minutt med cron, etter samme prinsipp som beskrevet over. Kan hende har driftsleverandøren du benytter for webserveren en egen programvare som administrerer cron-jobber for deg.

Nå har du kontinuerlig påfyll av nye bilder fra webkameraet, via Raspberry Pi-en, til en webserver. Du får også en kopi av det nyeste bildet som du kan titte på hver gang du vil vite hvordan været på fjellet er.

Så til magien.

En server hos DigitalOcean

For å produsere en time-lapse trenger du en programvare som du kan kjøre gjennom et Bash-skript som en cron-jobb. Selv benytter jeg FFmpeg til formålet. FFmpeg er en svært funksjonsrik pakke med programmer for å behandle multimedia-filer som f.eks. filmer.

Sannsynligheten for at du har en webserver som kjører FFmpeg er liten dersom du benytter en relativt standardisert driftsleverandør. Det er her DigitalOcean kommer inn i bildet.

Hos DigitalOcean trenger du en server, kalt en Droplet, og en disk, kalt Block storage. Du setter dem opp som tidligere beskrevet. Jeg benytter Ubuntu som operativsystem.

Serverforberedelser

Når du har satt opp disse, er det er par ting du trenger å fikse.

Det første du trenger å fikse er å sette opp et par med krypteringsnøkler, slik at du kan kopiere filer frem og tilbake mellom webserveren din og DigitalOcean uten brukernavn og passord. DigitalOcean har en fin beskrivelse. Husk å stenge for root-tilgang med passord til slutt.

Det andre du trenger å fikse er å holde klokka på serveren oppdatert til enhver tid. Hvis ikke blir det rot når time-lapse-filmene skal produseres. Først angir du hvilken tidssone du befinner deg i, ved å skrive sudo dpkg-reconfigure tzdata i terminalen. Deretter setter du opp NTP ved å skrive først sudo apt-get update og deretter sudo apt-get install ntp.

Det tredje du bør gjøre er å lese DigitalOceans utmerkede veiledning for hva du bør ha dekket i ditt serveroppsett.

Det fjerde du bør gjøre er at du kan og bør holde all programvare på serveren oppdatert ved å skrive sudo apt-get update && sudo apt-get dist-upgrade i terminalen. DigitalOceans Ubuntu-versjon forteller deg om noe kan oppgraderes når du logger inn. Du må blant annet gjøre dette før du får installert FFmpeg.

Deretter bør du lære deg litt om screens. Det er terminalvinduets variant av VNC eller tilsvarende. Jeg bruker ikke screens aktivt på denne serveren, men kan hende du finner behov for det.

Installasjon av FFmpeg og opprettelse av mapper

For å installere FFmpeg skriver du sudo apt-get install libav-tools i terminalen. Enkelt og greit.

Deretter lager jeg en mappestruktur på den tilkoblede disken som følger.

/mnt/disknavn/CloudCam/kameranavn/input

Her lagrer jeg alle bilder som skal benyttes til å lage time-lapse.

/mnt/disknavn/CloudCam/kameranavn/backup

Her lagrer jeg en komprimert backup av alle bildene før jeg lager time-lapse.

/mnt/disknavn/CloudCam/kameranavn/output

Her lagrer jeg den endelige time-lapse-filmen.

/mnt/disknavn/Kode

Her lagrer jeg alle skript jeg trenger.

Nå har du alt du trenger for å produsere time-lapse-filmer. Alt du trenger er bildene som ligger på webserveren.

Produksjon av time-lapse

Jeg har, ikke overraskende, laget et Bash-skript som henter bilder fra webserveren, tar en backup av bildene, lager en time-lapse, sletter bildene og laster den ferdige time-lapse-filmen tilbake til webserveren. Skriptet ser ut som følger.

#!/bin/bash

# hent bilder fra webserveren og slett dem derfra
rsync --remove-source-files -e ssh brukernavn@eksempel.no:/CloudCam/kameranavn/log/*.jpg /mnt/disknavn/CloudCam/kameranavn/input/

# tidsstemplet tar.gz (zip-ish) for backup
tar -czf /mnt/disknavn/CloudCam/kameranavn/backup/kameranavn_backup_$(date +%Y-%m-%d).tar.gz /mnt/disknavn/CloudCam/kameranavn/input/*.jpg

# Lage tidsstemplet time-lapse
# 30 indikerer bilder per sekund og finnes to steder
avconv -r 30 -i /mnt/disknavn/CloudCam/kameranavn/input/%*.jpg -r 30 -vcodec libx264 -crf 20 -g 15 /mnt/disknavn/CloudCam/kameranavn/output/kameranavn_daglig_$(date +%Y-%m-%d).mp4

# Slette input-filer
rm /mnt/disknavn/CloudCam/kameranavn/input/*.jpg

# Kopiere timelapse til webserveren
scp /mnt/disknavn/CloudCam/kameranavn/output/01_zavio_daglig_$(date +%Y-%m-%d).mp4 brukernavn@eksempel.no:/CloudCam/kameranavn/kameranavn_daglig.mp4

Last ned…
Bash • 1 kB • 67 Antall nedlastinger

Skriptet lagrer jeg som /mnt/disknavn/Kode/cron_daglig_kameranavn.sh og gjør det kjørbart med chmod +x /mnt/disknavn/Kode/cron_daglig_kameranavn.sh.

Deretter skal dette skriptet kjøres daglig. Jeg kjører det litt før midnatt hver dag, slik at jeg kan sette riktig dato på filene som produseres. Med crontab -e redigerer du crontab og legger inn følgende linje.

30 23 * * * /mnt/disknavn/Kode/cron_daglig_kameranavn.sh

Det vil si at skriptet kjøres klokken 23.30 hver kveld.

Hvis alt nå går som det skal, så vil du til enhver tid se den siste produserte time-lapse på https://eksempel.no/CloudCam/kameranavn/kameranavn_daglig.mp4. Du vil også kunne se det til enhver tid siste bilde på https://eksempel.no/CloudCam/kameranavn/kameranavn.jpg.

That’s it! Dette var en veldig grov beskrivelse av hva som skal til. Hvis jeg ikke har begått noen store skrivefeil i beskrivelsen, og hvis du har gjort som beskrevet, skal alt fungere. Hvis ikke setter jeg stor pris på om du bruker GitHub til å melde feil eller har andre innspill.

Martin skriver regelmessig om teknologiledelse og hvordan teknologi, samfunn og politikk påvirker hverandre. Få nye artikler via e-post:

Flere artikler

Enda flere artikler? Besøk arkivet.

Lest av Martin

Om Martin

Martin Koksrud Bekkelund

Dette er Martin Koksrud Bekkelund sitt private nettsted, hvor han skriver om teknologiledelse og hvordan teknologi, samfunn og politikk påvirker hverandre. Martin arbeider til daglig som direktør for produkt- og forretningsutvikling i et av Norges største selskaper. Les mer...

 

Facebook Twitter Instagram LinkedIn GitHub SlideShare Martin Koksrud Bekkelunds RSS-kanal

© 1995-2017 Martin Koksrud Bekkelund
OpphavsrettRSS og abonnementKontakt