Teletekst is oeroud, maar nog springlevend. Vooral pagina 101 is een vast onderdeel van mijn dagelijkse routine.
Teletekst is al decennia lang een begrip voor een kort overzicht van het laatste nieuws, sport, weer en verkeer etc. Eerst was het alleen beschikbaar op de televisie, maar later ook op internet via de browser of een mobiele app. Op Teletekst pagina 101 krijg je in één oogopslag en in 9 regels het laatste binnen- en buitenlandse nieuws te zien.
Teletekstmachine
Ik wilde het laatste nieuws nog sneller zien, zonder zelfs een browser of app te starten, of Google Assistent lastig te vallen. Een onlangs aangeschaft e-paper display van Waveshare bracht mij daarom op het idee van een klein schermpje dat gekoppeld aan een Pi Zero W aan de rand van de monitor wordt bevestigd. Je kunt er natuurlijk ook voor kiezen om het aan de spiegel in de badkamer te monteren. De e-paper heeft geen backlight en straalt dus geen hinderlijk licht uit. Bovendien is hij erg zuinig, want hij verbruikt alleen stroom voor het verversen van de scherminhoud.
Wat je leert
- Plan van aanpak maken
- Tekst uit een website extraheren
- E-paper display aansturen
Dit heb je nodig
- Waveshare 2.13″ E-Ink display HAT for RaspberryPi
- Raspberry Pi Zero W met GPIO-pinheader gesoldeerd), of een andere Pi
- Raspbian Stretch
Plan van aanpak
Zoals bij ieder project beginnen we met een plan van aanpak. Wat zijn de benodigde stappen? Dat zijn er vijf.
- Stap één: de bron van de webpagina downloaden en in een bestand opslaan.
- Stap twee: de negen regels met nieuwsberichten als kale tekst uit de code van de website vissen en in een bestand opslaan.
- Stap drie: de inhoud van dit laatste bestand in Python inlezen en in een lijst zetten.
- Stap vier: de negen regels met de juiste opmaak voor het kleine scherm naar de controller van de e-paper display sturen.
- Stap vijf: hoe vaak de inhoud van het scherm ververst wordt, bepalen we met de taakplanner cron. Bijvoorbeeld ieder half uur en dan alleen overdag van 0:700 uur tot 23:00 uur.
Aan de slag
Het e-paper scherm van Waveshare is direct op de GPIO-pinnen van een Pi te drukken. Maar je kunt ook het handige meegeleverde kabelsetje gebruiken om het scherm aan te sluiten. Daarmee blijven de ongebruikte GPIO-pinnen vrij voor andere aansluitingen. In dit artikel vind je een tabel met de aansluitingen voor het kabelsetje.
Voor het overzicht en om de code makkelijker te testen, gebruiken we drie aparte scripts. Voor stap een en twee ieder een bash-script (teletekstdownload.sh en teletekstextractie.sh) . Stap drie en vier combineren we in een Python 2-script (teletekst2epaper.py) en voor de rest is er een regeltje in crontab nodig.
De scripts zijn hier te vinden.
Als je de bron van de website van Teletekst pagina 101 bekijkt, staat die vol html en JavaScript-code. Nergens zijn de berichtregels te vinden. Gelukkig bestaat er een andere pagina waar dat wel het geval is, https://teletekst-data.nos.nl/webplus?p=101. Met wget -O is de webpagina snel gedownload naar een bestand (“teletekst.download”).
Het opzoeken en kopiëren van de betreffende nieuwsregels naar het bestand “teletekst.txt” doen we met het programma sed. We hoeven sed alleen maar te laten zoeken naar de tag <span class=”cyan “> waar iedere nieuwsregel mee begint en de bijbehorende sluittag </span>.
De laatste stappen doen we met Python
Teletekst.txt bevat precies de negen regels kale tekst die we nodig hebben. In het eerste deel van het Python-script teletekst2epaper.py zetten we die regels in een lijst om ze in het tweede deel regel voor regel op te maken voor de display. Het tweede deel is gebaseerd op de demo (main.py) van Waveshare om tekstregels regel op het scherm te zetten.
Omdat de regels te lang zijn voor de korte kant van de display hebben we het beeld een kwart slag gedraaid. Dat doen we door bij het initialiseren van het nieuwe image vertikaal en horizontaal (epd2in13.EPD_HEIGHT, epd2in13.EPD_WIDTH) om te wisselen.
Zoals altijd geldt dat je vrij kunt experimenteren, bijvoorbeeld met een ander font of fontgrootte. Je vind de fonts in /usr/share/fonts/truetype/ .
Tot slot: automatiseren met cron
Als alle scripts naar behoren werken, kun je bijvoorbeeld met de job scheduler cron de boel automatiseren. Maar eerst zetten we de commando’s om de drie scripts te starten bij elkaar in een extra bash-script. We noemen het teletekststart.sh. Vergeet niet om dit net als de andere bash-scripts uitvoerbaar te maken met
sudo chmod +x teletekststart.sh
De bedoeling is dat vanaf 7 uur ’s morgens tot 11 uur ’s avonds op elk heel en op elk half uur de scherminhoud ververst wordt. Dat kan met twee regels in crontab. Start de editor met crontab -e en voeg onderaan de volgende regels toe:
0 7-23 * * * /home/pi/teletekst/teletekststart.sh 30 7-22 * * * /home/pi/teletekst/teletekststart.sh
Iedere wijziging in crontab wordt na het opslaan meteen actief.
Opmerking: bijzondere tekens gaan de mist in
Accenten op letters in de nieuwsregels, zoals trema’s, verschijnen op de display met hun html-code. Bijvoorbeeld “Californië” verschijnt als “Californië”. Met wat extra code is dat natuurlijk recht te zetten.
Tip 1: test de afzonderlijke scripts eerst apart
Probeer de afzonderlijke scripts eerst in de juiste volgorde apart uit, je kunt dan aan de output van de commando’s zien of en wat er misging.
Tip 2: Maak een apart cronlog voor dit project aan
Standaard zet cron zijn logmeldingen in het systeemlog /var/log/syslog. Het is handiger om voor dit project een apart cronlog aan te maken. Zet dat bijvoorbeeld in de directory van het project en noem het teletekst.log. Voeg achter elke regel in crontab die met dit project te maken heeft de volgende instructie toe:
> /home/pi/teletekst/teletekst.log 2>&1
Hiermee wordt alleen de laatste melding in het log bewaard. Wil je alle meldingen bewaren, gebruik dan >> in plaats van > aan het begin van de bovenstaande instructie.
Vervolgens kun je met de handige tool tail de meldingen in het log live volgen. Open een terminal en voer daarin het onderstaande commando uit:
tail -f /home/pi/teletekst/teletekst.log