Weten wanneer een strandwandeling erin zit of dat het strand juist onbegaanbaar is vanwege de vloed: hoe handig zou het zijn om een led-verlichte meter met de actuele getijdestanden te hebben. Die gaan we hier bouwen met behulp van webscraping, Python 3 en een 3d-printer.

Zeno Otten

Afbeelding3 matrix

Een groot deel van Nederland ligt onder de zeespiegel. Duinen en dijken houden het water veilig buiten. Toch is de informatie over de waterstanden in Nederland belangrijk en wordt door de opwarming van de aarde steeds significanter. Waterstanden of getijdedata worden nu bijvoorbeeld veel opgevraagd door zee- en waddenhavens, zeilverenigingen, strandtenten, vissers, strandwandelaars en reddingsbrigades, maar in de toekomst zal iedereen erin geïnteresseerd zijn.
Het idee van deze getijdethermometer ontstond tijdens een strandwandeling bij het Zeeuwse Westkapelle. Als ik toen had geweten dat het op dat moment volledig vloed was en het strand dus bijna niet meer te belopen viel, had ik de wandeling op een ander tijdstip gestart. Er is dus behoefte aan real-time data.
Getijde-informatie is op veel websites beschikbaar, maar om iedere keer de browser op te starten en te zoeken naar de juiste website en de gewenste informatie is erg onpraktisch. Vandaar deze thermometer die de status van eb of vloed en de actuele hoogte van de waterstand ten opzichte van (N)ormaal (A)msterdams (P)eil optisch weergeeft door middel van een lichtbalk met zes meer-kleurenleds. De data verkrijgen we met behulp van webscraping.

Westkapelle getijdenWEBSCRAPING
Webscrapen is een computertechniek waarbij een microcontroller of microcomputer wordt gebruikt om informatie van webpagina’s op het internet te lezen en eventueel te interpreteren zonder dat een gebruiker er invloed op heeft. In PC-Active 316 vanaf pagina 74 staat een uitgebreid artikel over dit onderwerp (klik ook hier). Het scrapen van websites die zijn geschreven in HTML-formaat, is relatief eenvoudig. Met een softwaretool zoals Beautiful Soup vind je al snel de gewenste informatie op een website (zie ook het voorbeeld Webscraping met Python op mijn eigen site.
De site Westkapelle.info toont in pure HTML het resultaat van verzamelde getijdedata van die plaats. Een scrape-programma kan eenvoudig die code en de inhoud ervan lezen en de getijdedata toepassen. Dit keer gaan we het echter moeilijk doen!
Tegenwoordig zijn de meeste websites veel dynamischer dan alleen HTML-code. Ze maken veelvuldig gebruik van bijvoorbeeld Java of andere scripttalen. Het wordt dan lastiger om met deze dynamica real-time te scrapen. Gelukkig zijn ook hiervoor speciale softwarebibliotheken ontwikkeld zoals Selenium, die goed om weten te gaan met dynamische en real-time gegenereerde data. In ons voorbeeld gebruiken we deze bibliotheek.

DE JUISTE DATA
Getijdegegevens worden nauwkeurig bijgehouden op deze webpagina van Rijkswaterstaat: waterinfo.rws.nl/?#!/kaart/astronomische-getij/info. Ons uitgangspunt voor deze workshop is zoals gezegd de locatie Westkapelle op Walcheren, het meest westelijke punt van Nederland. In Westkapelle is de vloed ongeveer 2,2 meter boven NAP en is het eb bij ongeveer -1,7 meter beneden NAP. De data worden op de website in een grafiek (of tabel) als functie van de tijd (interval Samen met een microcomputer (microcontroller kan ook) die met internet is verbonden en de softwarebibliotheken Beautiful Soup en Selenium haalt de getijdethermometer hier zijn informatie op en presenteert deze.

HARDWARE
De Raspberry Pi Zero-microcomputer (circa € 10,-) ondersteunt wifi en heeft daardoor internettoegang. Een volledige (gratis) Python 3-omgeving is standaard aanwezig op de Linux-distributie Raspbian, die op een sd-kaartje draait. Om een scrape-programma te schrijven, kun je kiezen uit meerdere editors, zoals Geanny, Idle of Thonny. Ook het aansturen van de hardware zoals meer-kleurenleds (WS2812 op Adafruit.com) wordt eenvoudig, omdat op de Raspberry Pi veel GPIO-pinnen toegankelijk zijn voor het aansluiten van hardware en die makkelijk te benaderen zijn via Python.

De Raspberry Pi Zero werkt met een spanning van 3.3 V. Ook de GPIO-pinnen werken met deze spanning. Interfacen van deze poorten betekent dat ook de aan te sluiten hardware met dit spanningsniveau overweg moet kunnen. Mijn programma GetijdePi gebruikt WS2821 meerkleuren-leds. Deze werken met een spanning van 5 V. De website van Adafruit doet meerdere suggesties met betrekking tot het aanpassen van de signaalniveaus tussen de GPIO-pinnen van de Raspberry Pi en de hardware. Wij kiezen voor de signaalaanpassing met een 74HCT125, zie de afbeelding hieronder.

Afbeelding1 GPIO pinnen

 

Afbeelding4 matrixVoor de thermometer heb ik een display gebouwd met de leds in een matrix van 5x6. Op deze wijze kan de thermometer nog in andere vormen worden gerealiseerd, bijvoorbeeld vijf leds breed in plaats van nu één led breed. Ook kunnen de overgebleven leds nog worden gebruikt om andere informatie weer te geven, zoals bijvoorbeeld springvloed.
De dertig leds heb ik in een 3d-geprint sjabloon geplaatst. Hieromheen heb ik een houten lijstje met houten achterkant gemaakt, zie de afbeelding rechts. Klik hier om dit beeld in hogere resolutie te downloaden. 
Met een rode respectievelijk groene led in de rechter bovenhoek van het display geeft de thermometer de status van de vloed en het eb weer. Een rode led in het midden van het display geeft aan dat de Raspberry Pi aan het opstarten is.

 

SOFTWARE
De software heb ik vanwege de snelheid en vanwege het ontwikkel- en debug-gemak eerst ontwikkeld op een Windows 11-pc, met Anaconda Spyder als editor en Python 3.8 als interpreter. Vervolgens heb ik het programma overgebracht naar de Raspberry Pi Zero en de hardware en aansturing van de GPIO geïmplementeerd. Het programma getijdePi.py wordt ter illustratie hieronder deels weergegeven. Het volledige programma vind je als downloadbaar tekstbestand onderaan deze workshop.

Allereerst worden met een ‘import’ enkele bibliotheken geladen, waaronder de webdriver (Selenium) en Beautiful Soup.

Getij Screenshot 1


Het installeren van Selenium en Beautiful Soup is even een klusje, maar de uitleg is te vinden op de Getting Started-pagina van Selenium en op deze Medium-site. De bibliotheek ‘board’ en ‘neopixel’ zijn nodig voor het aansturen van de ws2812-ledstrip.

Het stroomverbruik van de neopixels kan behoorlijk oplopen als er veel worden gebruikt en als de helderheid van de leds hoog wordt ingesteld. De 5V-voeding kan niet worden geleverd via de GPIO-pinnen van de Raspberry Pi. Een extra voeding is dus nodig (5V, 2A of meer), zeker wanneer de brightness-parameter (nu ingesteld op brightness=0.1) dichter bij 1 wordt gekozen. Doe dan ook een zonnebril op!

De volledige link van de website waterinfo.rws.nl die moet worden gescraped, wordt weergegeven in de url-parameter.
In de Readtable()-procedure wordt het daadwerkelijke scrapen uitgevoerd. Samen met de geïnstalleerde chromedriver-API voor Linux (onder Windows kan het ook) en de Selenium-webdriver worden de data opgehaald (driver.get(url)).
Met behulp van Beautiful Soup worden deze data afgegeven aan de variabele lijsten datum, tijd en hoogte. Eenmaal opgehaald, worden de data ook opgeslagen op de sd-kaart met de procedure saveData(). Indien het niet mogelijk zou zijn om de data op te halen (als je bijvoorbeeld geen internetverbinding hebt), dan worden de eerder opgeslagen data gebruikt voor weergave op de thermometer. Na het scrapen zijn de gegevens van de website bekend in het programma en kan de thermometer worden opgebouwd.

Getij Screenshot 2

In de procedure Analiseer() wordt via de vandaag(3)-procedure een index [p] berekend die staat voor het momentane tijdstip van de dag en die verwijst naar de bijbehorende waterstand (hoogte[p]) in de tabel. Deze waarde (in centimeters) gaat vervolgens naar de thermometer()-procedure. Bij het aanroepen van de procedure thermometer() wordt ook de maximale en minimale te verwachten waterhoogte van de locatie Westkapelle meegegeven.

 Getij screenshot 3


De main loop van het programma (while True) kijkt elke 600 seconden in de tabel. Indien het de volgende dag wordt (old_vandaag != vandaag(0)), dan wordt de website opnieuw gescraped en worden nieuwe data in de tabel geplaatst. Als laatste stap het programma worden de pixels van de thermometer ververst met de procedure pixels.show().

Getij screenshot 4 

 

OPSTARTEN PROGRAMMA GETIJDE.PI.PY
Een Raspberry Pi met bijvoorbeeld Rasbian als besturingssysteem erop geïnstalleerd, maakt het eenvoudig om een programma automatisch te laten starten wanneer de stekker in het stopcontact gaat. Het bestandje /etc/rc.local moet hiervoor worden aangepast met een editor. Voeg de regel toe (voor exit 0) die aangeeft dat in de directory/home/pi het bestandje startGetijdePi.sh staat.

Getij screenshot 5

In het bestandje startGetijdePi.sh staat vervolgens de regel python3 /home/pi/getijdePi.py die ervoor zorgt dat python opstart.

OPMERKINGEN
Webscraping is een interessante techniek die het mogelijk maakt om de (on?)eindige hoeveelheid aanwezige kennis en data op internet op een automatische manier op te halen, te verwerken en toe te passen zonder tussenkomst van een persoon. Dit biedt weer extra nieuwe mogelijkheden bij het gebruik van het Internet of Things in ons dagelijks leven.

Ons thermometerdisplay is uit te breiden met meer kleuren en meer leds. We gebruiken er hier tenslotte maar zes, terwijl er dertig kunnen worden aangestuurd. Die uitdaging laat ik aan de nabouwer van dit prototype.
In dit display kun je uiteraard ook nog een balkje van zes leds gebruiken om bijvoorbeeld een temperatuurmeting of energiemeting te doen of andere data te presenteren.
Een goedkope Raspberry Pi Zero-microcomputer voldoet zoals gezegd prima voor de taak van webscraping. Het opstarten van GetijdePi.py duurt weliswaar ongeveer tien minuten, maar vervolgens werkt het programma moeiteloos. Ik raad aan om voor het ontwikkelen van de (python-)software een wat sneller systeem te gebruiken. Dat mag ook een Windows-systeem zijn.

Hieronder vind je als Zip-bestanden Zeno Ottens complete python-programma (Kladblok) en een sjabloon voor een led matrix display (.stl-bestand), dat je met een 3d-printer kunt printen.  

 - Getijdepi.py

- ws2812 Led matrix (5x6)

zeno visser4 lr