Zonsopgang en zonsondergang

Zonsopgang:

curl -s http://zonsondergang.info | grep -o '<span class="vandaag ">.............</span>' | grep -o "..:.. - ..:.." | cut -c 1-5

Zonsondergang:

curl -s http://zonsondergang.info | grep -o '<span class="vandaag ">.............</span>' | grep -o "..:.. - ..:.." | cut -c 9-13

Voorbeeld uitvoering tussen zonsopgang en zonsondergang:

sunrise=$(curl -s http://zonsondergang.info | grep -o '.............' | grep -o "..:.. - ..:.." | cut -c 1-5)
sunset=$(curl -s http://zonsondergang.info | grep -o '.............' | grep -o "..:.. - ..:.." | cut -c 9-13)

begin=$(date --date="$sunrise" +%s)
end=$(date --date="$sunset" +%s)
now=$(date +%s)

if [ "$begin" -le "$now" -a "$now" -le "$end" ]; then
    echo Checked daylight.. sun is still up..
    echo Doing some meaningful task that can stand daylight..
fi

Internet snelheidstest met Raspberry Pi

Om eenduidig de snelheid van een internetaansluiting vast te stellen zijn er verschillende meetmethoden. Eén hiervan is het gebruik van speedtest.net, een website waarmee de download- en uploadbandbreedte van een internetaansluiting kan worden gemeten.

Schermafdruk 2016-02-21 08.30.28

Deze vorm van internet snelheidsmeting is ook beschikbaar om periodiek vanaf een Raspberry Pi uit te voeren, in de vorm van speedtest-cli. Dit script heeft dezelfde functionaliteit als de interactieve meting via de website van speedtest.net, maar kan op een Raspberry Pi met bijvoorbeeld cron automatisch worden uitgevoerd. Installeer speedtest-cli als volgt:

wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
chmod a+rx speedtest_cli.py
sudo mv speedtest_cli.py /usr/local/bin/speedtest-cli
sudo chown root:root /usr/local/bin/speedtest-cli

Je kunt nu de snelheidstest handmatig opstarten met speedtest-cli:

pi@raspberrypi:~ $ speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from KPN...
Selecting best server based on latency...
Hosted by CJ2 Hosting & Development (Groningen) [2.06 km]: 54.695 ms
Testing download speed...
Download: 20.82 Mbit/s
Testing upload speed...
Upload: 1.71 Mbit/s

Om de meetwaarden in een bestandje te bewaren heb ik het volgende shell-script geschreven:

date +"%d-%m-%Y %T" >> /home/pi/speedtest.output; ip link | grep "state UP" | awk -F ":" '{print $2}' >> /home/pi/speedtest.output; /usr/local/bin/speedtest-cli | egrep 'Download|Upload' >> /home/pi/speedtest.output;
tail -4 speedtest.output

Dit script heb ik in de cron tabel opgenomen om ieder half uur een meting uit te voeren. Ik voer de metingen zowel bedraad, direct aan het modem, als op verschillende plaatsen draadloos uit om de effecten van meervoudige wifi-toegangspunten te bepalen.

Backup maken van Raspberry Pi SD kaart op een Mac

Wie verscheidene uren heeft geïnvesteerd in het downloaden en configureren van software op een Raspberry Pi komt aardig thuis van de koude kermis als op een zekere dag het (micro) SD kaartje ermee stopt. “Had ik maar een backup gemaakt”, denk je dan. Pas.

Het maken van een backup en het uitvoeren van een restore is met het ‘disk duplicator’ command line tooltje dd op een Mac een peuleschil. In ongeveer 5 minuten is een volledige 16 GB SD kaart veiliggesteld. Gebruik hiervoor de volgende stappen:

  • Plaats de (micro) SD kaart in de Mac
  • Open de terminal
  • Bepaal het devicenummer van de (micro) SD kaart, door een lijst opslagapparaten op te vragen met diskutil list. In de voorbeelden hieronder is het devicenummer aangegeven met n
  • Maak een backup met sudo dd if=/dev/rdiskn of=/pad/naar/backup.img bs=1m. Door het gebruik van sudo wordt om het wachtwoord van de beheerder van de Mac gevraagd
  • Het maken van een backup duurt, afhankelijk van de grootte van het SD kaartje, tussen de 100 en 400 seconden

Het uitvoeren van een restore gaat met dd op dezelfde manier, maar kost wat meer tijd om uit te voeren, zo tussen de 10 en 20 minuten. Om de melding ‘resource busy’ te voorkomen is het overigens nodig om van tevoren een unmountDisk uit te voeren:

  • diskutil list en bepaal het devicenummer van de (micro) SD kaart
  • diskutil unmountDisk /dev/diskn
  • sudo dd if=/pad/naar/backup.img of=/dev/rdiskn bs=1m

Een schijfkopie neemt zoveel ruimte in als de lege grootte van de SD kaart. Met gzip is daar wel wat vanaf te snoepen:

  • Backup: sudo dd if=/dev/rdiskn bs=1m | gzip > /pad/naar/backup.img
  • Restore: gzip -dc /pad/naar/backup.gz | sudo dd of=/dev/rdiskn bs=1m

Raspbian installatie op Raspberry Pi

Een nieuwe Raspberry Pi komt soms met een voorgeïnstalleerd besturingssysteem. Maar ook dan is het af en toe handig om opnieuw met een schone installatie te beginnen. Ik doorloop hiervoor de volgende stappen:

  • Formatteer een betrouwbare microSD kaart met behulp van het tooltje van SD Association op een Mac of Windows PC (microSD kaartjes worden vaak met een SD kaart adapter geleverd die in de meeste Macs en PC’s past)
  • Download de meest recente versie van NOOBS naar de Mac of Windows PC
  • Kopieer alle gedownloade en uitgepakte bestanden naar de root van het geformatteerde microSD kaartje
  • Plaats de microSD kaart nu in de Raspberry Pi en sluit dan de stroom aan, plus een (HDMI) monitor en een (USB) toetsenbord
  • Het microSD kaartje wordt nu geherformatteerd en het besturingssysteem NOOBS wordt uitgepakt. Dit neemt een minuutje in beslag. Na herstart volgt een keuzemenu
  • Kies in het menu voor het installeren van Raspbian. De installatie neemt ongeveer 10 minuten in beslag. Tijdens deze installatie is het mogelijk om een geschikte toetsenbordindeling te kiezen, zoals US
  • Voer enkele wijzigingen in raspi-config door: laat Raspbian in de command line modus opstarten, wijzig de datum- en tijdlocatie naar Europa/Amsterdam, zet ssh toegang aan, zet de camera aan (indien er een Raspberry Pi camera gebruikt wordt)
  • Herstart en stel vast dat de Raspberry Pi nu opstart in de command line modus. Soms lijkt de herstart niet goed te gaan, maak dan de USB kabel los en sluit deze na een paar seconden weer aan voor een koude herstart
  • Wijzig de instellingen voor wifi internettoegang

Na de installatie voer ik vaak enkele van de volgende aanpassingen door, afhankelijk van het gebruik van de Raspberry Pi:

  • Verwijder de X Server bestanden met sudo apt-get remove --auto-remove --purge 'libx11-.*' en ruim de overgebleven bibliotheken op met sudo apt-get autoremove --purge
  • Voer een update van de installatiebestanden uit met sudo apt-get update
  • Installeer de updates met sudo apt-get upgrade
  • Installeer ftp met sudo apt-get install ftp
  • Installeer ImageMagick’s convert met sudo apt-get install imagemagick
  • Zet de LED van de camera uit, door in /boot/config.txt de regel disable_camera_led=1 op te nemen
  • Maak een script om foto’s met de camera te nemen en deze op een server op te slaan, of foto’s met een USB webcam te maken

Het hele installatieproces duurt ongeveer een uur, inclusief de upgrades en updates.

Configureer wifi op een Raspberry Pi

Hoewel een Raspberry Pi vanaf de fabriek is voorzien van een bedrade 100 megabit netwerkaansluiting zullen veel toepassingen gebaat zijn bij draadloos internet. Er zijn verschillende kleine wifi modules op de markt waarmee de Raspberry Pi kan worden uitgebreid. De Edimax wifiplug is hiervan een voorbeeld.

Mijn /etc/network/interfaces configuratiebestand bevat de volgende instellingen:

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Het /etc/wpa_supplicant/wpa_supplicant.conf configuratiebestand bevat de definities van de draadloze netwerken waarmee verbonden moet kunnen worden:

cltr_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="netwerk1"
    psk="wachtwoord"
}

netwerk={
    ssid="open netwerk"
    key_mgmt=NONE
}

Na het herstarten wordt nu verbinding gemaakt met één van de opgegeven netwerken. Dit is een mooie gelegenheid om de installatie bij te werken, door eerst alle nieuwe beschikbare pakket op te halen:

sudo apt-get update

en daarna de nieuwe versies te installeren met:

sudo apt-get upgrade

SJ4000 foto’s bewerken en verzenden met Raspberry Pi

IMG_4681

Hoewel de cameramodule van de Rapsberry Pi prima foto’s maakt, is de beeldhoek van ongeveer 55 graden aan de krappe kant en laten de lichtgevoeligheid en resolutie wat te wensen over. Als je in het bezit bent van een (kloon) GoPro dan verwacht je betere beelden. Een SJ4000 bijvoorbeeld heeft een beeldhoek van ongeveer 170 graden en een resolutie van 4032×3024. Daarmee kun je aanzienlijk meer beeld tonen, hetgeen handig is in een beperkte ruimte zoals een woonkamer.

Mijn doel is om de SJ4000 te gebruiken in plaats van de Raspberry Pi cameramodule. Aan de softwarekant gebruikte ik op de Rapsberry Pi raspistill om de cameramodule te bedienen, voor een USB camera kun je hiervoor fswebcam gebruiken. Deze installeer je met sudo apt-get install fswebcam

Om de SJ4000 als USB webcam te gebruiken, volstaat het om bij het aansluiten aan de Raspberry Pi (met een USB kabel) op de SJ4000 de optie Use as PC Camera te kiezen. Als de boel gelijk lijkt te ontsporen (de rode LED van de Rapsberry Pi gaat knipperen, de camera gaat gelijk weer uit of doet rare dingen) dan is de voeding van de Raspberry Pi onvoldoende. De Raspberry Pi en SJ4000 nemen in dat geval gezamenlijk teveel stroom op.

Om te controleren of de opzet werkt, volstaat de instructie fswebcam -i 0 -r 1296x960 -d /dev/video0 afbeelding.jpg

De parameter -r laat de gewenste resolutie instellen. In het geval van de SJ4000 is dat 4032×3024 (12M),  3648×2736 (10M),  3264×2448 (8M) en 1296×960 (1.3M). Na enkele seconden is er een nieuwe afbeelding bewaard, genaamd afbeelding.jpg:

sj4000pic

De balk onder de afbeelding wordt door fswebcam toegevoegd, maar kan ook uit.

Foto’s maken met Raspberry Pi en uploaden via FTP

IMG_4102

Mijn Raspberry Pi B+ is uitgerust met een cameramodule, een Edimax WiFi dongle en een MC-RP002-CLR doorzichtige behuizing met uitsparing voor de camera. Met wat software moet het mogelijk zijn om periodiek een foto te maken en deze te uploaden naar een website. “Moet niet ingewikkeld zijn,” dacht ik nog. Zoekend op het internet kwam ik diverse oplossingen tegen, maar uiteindelijk heb ik mijn eigen koers gevaren met de volgende stappen:

  • Foto maken met raspistill
  • Optie foto bewerken met ImageMagick’s convert
  • Uploaden naar een website met ftp
  • Periodiek herhalen met cron

Vergeet niet de cameramodule aan te zetten in het raspi-config menu. Het programma raspistill maakt een foto met de cameramodule en bewaart deze foto als een JPG. Er zijn verschillende instellingen mogelijk, hieronder enkele belangrijke:

  • Resolutie, met parameter -md, van 640×480 (mode 6) tot 2592×1944 (mode 2) en 1920×1080 (mode 1)
  • JPG kwaliteit, met parameter -q, van 0 (lage kwaliteit en klein bestand) tot 100 (hoge kwaliteit en groot bestand)
  • EXIF informatie instellen, met parameter -x, zoals GPS metadata: -x GPS.GPSLatitude=53/1,9/1,0/1 -x GPS.GPSLongitude=4/1,51/1,34/1 voor N 53° 9′ 0″ en E 4° 51′ 34″. Overigens vereist de GPS-notatie enige bewerking
  • Naam van het uitvoerbestand, met parameter -o. Handig is hierbij om bestandsnamen te nummeren of uit datum-tijd te laten bestaan, met filename=$(date -u +"%Y%m%d%H%M%S").jpg

Met een basis ftp client is het eenvoudig genoeg om een bestand te uploaden naar een website, vooringenomen dat deze over een FTP-server beschikt. Het is nog wel bewerkelijk om de commando’s binnenin de ftp client in hetzelfde script op te nemen als de andere commando’s. Het geheim zit in het omleiden van de console input: ftp << EOF.

Voor een webpagina is het handig om een afbeelding met een vaste naam te hebben. De gemaakte foto wordt daarom altijd naar ‘latest.jpg’ gekopieerd, die daarmee overschreven wordt. Ik heb geen manier gevonden om via het ftp-protocol een bestandsnaam te kopiëren, anders dan de upload twee keer te doen. Da’s wel jammer, want de foto’s zijn aardig groot.

Script capload.sh:

filename=$(date -u +"%Y%m%d%H%M%S").jpg
host=ftp.myserver.nl
user=myusername
pass=mypassword
 
#Capture image
raspistill -o /tmp/$filename -md 2 -q 40
#Optional, include GPS coordinates
#raspistill -o /tmp/$filename -md 2 -q 40 -x GPS.GPSLatitude=53/1,9/1,0/1 -x GPS.GPSLongitude=4/1,51/1,34/1
#Transfer image
ftp -ivn $host << EOF user $user $pass
#Optional, uncomment when connecting succeeds, but uploading is not
#passive
put /tmp/$filename $filename
put /tmp/$filename latest.jpg
bye
EOF
#Remove transfered image file
#This is optional, as /tmp gets cleaned up after each reboot
rm /tmp/$filename

Ik gebruik de volgende cron job (crontab -e) om iedere vijftien minuten een foto te uploaden:

# Run the capload ('Capture Image and Upload') script every fifteen minutes
00 * * * * /home/pi/capload.sh
15 * * * * /home/pi/capload.sh
30 * * * * /home/pi/capload.sh
45 * * * * /home/pi/capload.sh

Hieronder een voorbeeld van een geuploade afbeelding:
Latest from Pi webcam

Soms is het handig om bestanden van een bepaalde leeftijd op te ruimen op de gebruikte ftp-server, om te voorkomen dat een schijf volloopt. Ik heb daar het volgende stukje opschooncode voor bedacht:

removefiles=$(date -d '7 days ago' +"%Y%m%d")*.jpg
mdel $removefiles