Home Buddy: Network Ad Blocker & Weather Station

by Pi_ster in Circuits > Raspberry Pi

7677 Views, 169 Favorites, 0 Comments

Home Buddy: Network Ad Blocker & Weather Station

P1290341.jpg

Hi Folks!

Aren't you fed up with web tracking and "personalized" ads ? Well... I am, so a few months ago, I decided to act. Fortunately, some people (who probably felt the same as me), hard coded a brilliant software to eradicate ads (thumbs up to Pi-hole). I won't go into details regarding Pi-hole ins and outs as the subject has already been thoroughly documented by others. Nonetheless I will provide you with the links I used to set it up.

As it felt really cool to have an add blocker running on my home network, I decided to build a proper casing for the Pi and add a few extra features using push buttons and an E-Paper display. The first button connects to the Pi-hole API and sends server stats to the monitor. The second button connects to the OpenWeatherMap API and displays forecasts of user-specified locations. If your wondering "Why bother !", well please give me credit for an easy to use tool that summarizes relevant information at the push of a button. The third and last button is used for a rather convenient feature, a power on / off switch (saving the need to SSH into the Pi via another device). When plugged in, the Pi will boot up by itself but will shutdown when the button is pressed. Pushing the button once again will power up the Pi. Please also note that the system will refresh itself periodically and display the network status.

Enough talking lets get cracking !

Supplies

For this project you will need the following parts :

  • 1 Raspberry Pi board. I used the Pi Zero WH for convenience.
  • 1 micro-USB power lead.
  • 1 E-Paper 1.54 inch black and white display. I got mine here.
  • 3 normally open push buttons. I got some here.
  • A set of M2.5 brass standoffs. I purchased a kit on Amazon here.
  • 1 transparent acrylic plexiglass (2 mm thick) to protect the E-Paper display.
  • 1 black acrylic sheet (5 mm thick) for the Pi Box lid.
  • 1 plywood sheet of 5 mm thick.
  • 6 female to female jumper wires. I bought some on Adafruit website.

Building the PiBox

P1120269.jpg
P1120286.jpg
P1120281.jpg
P1130290.jpg

Instead of building a brand new box from scratch, I repurposed a vintage drawer that was lying around in my garage. Its shape and color was to my liking and I had no other use for it at that point. With precaution, I took it apart, shortened the side and bottom panels and reassembled them together using wood glue. As you may not have the same drawer at your disposal (rather understandably), let me give you the dimensions.

PiBox outer dimensions : 120x120x90 mm (L,W,H) and corner radiuses of 15 mm

On the front panel I drilled 3 equally spaced M10 holes for the push buttons and cut a rectangular opening for the E-Paper display. The holes are spaced every 25 mm and the opening dimensions are 34x49 mm (W,H). I must mention that the front panel was too thick for the push buttons thus I made an adapter (a 4 mm long, 10 mm (OD), 7 mm (ID) rubber tube glued in each hole).

Having sorted out the buttons issue, I cut out a groove of 15x25 mm (L,W) on the front panel for the E-Paper connector. A final cut was made to the bottom plate top left corner for the power lead.

For the Pi Zero, I cut a 60x35 mm (L,W) rectangle out of a 5 mm plywood sheet, drilled M3 holes at each corner and fitted 4 brass standoffs (the Pi Zero mounting holes are on a 58 x 53 mm rectangle). I then drilled two M3 holes along the rectangle center-line and screwed the lot inside the PiBox.

For the E-Paper display, I cut two 60x20 mm rectangles out of a 5 mm plywood, drilled two M3 holes along the edges and screwed them on each side of the E-Paper opening. I then pre-positioned the monitor in the opening, marked the exact position of the mounting holes, drilled M3 holes at each marking and screw on brass standoffs.

After completing the box, I sanded it down and applied a dye to give it back its original color.

Wiring It Up

P1120268.jpg
P1130303.jpg
P1130304.jpg
P1130307.jpg
P1130308.jpg
GPIO-Pinout-Diagram-2.png

If you purchase the same buttons as I did, you'll first need to do some soldering. To simplify the wiring, I took some female to female jumper wires, cut them in half and soldered the naked wires to the buttons pins (using heat-shrink tubing). I then fitted the buttons in the M10 holes (through the rubber tubes) and tightened the nuts. By tightening them, the rubber tubes expand and lock the buttons in place.

With the buttons in place, I connected the wires to the Pi Zero GPIO pins as follows:

  • Button 1 : pin 5 (GPIO 3) & 6 (GND)
  • Button 2 : pin 33 (GPIO 13) & 34 (GND)
  • Button 3 : pin 39 (GND) & 40 (GPIO 21)

The numbers in bold correspond to the Pi physical board numbering (more information can be found on this website).

For the E-Paper display, 8 wires had to be connected. After a few google queries, I found instructions on this website which by the way, deserved a good old thumbs up. Then, I connected the wires to the following GPIO pins:

  • VCC (3.3V/5V power) : pin 17 (3.3V pin)
  • GND (Ground) : pin 20 (Ground pin)
  • DIN (Data in) : pin 19 (GPIO 10 / MOSI)
  • CLK (Clock) : pin 23 (GPIO 11 / SCLK)
  • CS (Chip selection) : pin 24 (GPIO 8 / CE0)
  • DC (Data/Command selection) : pin 22 (GPIO 25)
  • RST (Reset) : pin 11 (GPIO 17)
  • BUSY : pin 18 (GPIO24)

With the Pi nicely wired up, I screwed the Pi Zero and the display boards onto they respective supports.

For the sake of protection, I cut a 34x49 mm (W,H) rectangle out of a 2 mm transparent acrylic plexiglass, drilled M3 holes in each corner, and screwed it ontop of the monitor.

Software Setup

PiBox_displays.png

Building this project with a Pi Zero, it felt natural to install the Raspberry Pi OS Lite version. The GUI version would have been of no use and slowed the Pi down. To install the OS and access it remotely, you'll need to download a few software and create/edit some files. I'll spare you the long and boring explanations and share with you the video I've been following here.

Once the OS setup completed, I logged into the Pi Zero via SSH and installed pi-hole using the following command:

curl -sSL https://install.pi-hole.net | bash

This is the one-step automated installation method. There are other methods proposed on pi-hole website, so feel free to use the one you like best.

With the installation completed, I saved the Pi-hole web interface password (I recommend you doing the same) and installed ufw (which stands for Uncomplicated Firewall). As the Pi will be connecting to the web for may hours/days, a firewall was a wise feature to add. To do so, I typed in the following command:

sudo apt install ufw

Then, I opened the communication ports for pi-hole (as explained in the official documentation here)

sudo ufw allow 80/tcp
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 67/tcp
sudo ufw allow 67/udp
sudo ufw allow 546:547/udp

Allowed SSH

sudo ufw allow ssh

And finally, enabled the auto startup option. This will make sure the firewall is properly loaded after each boot. If you need more information, feel free to visit the ufw website here.

sudo ufw enable

With pi-hole up and running, I began programming the PiBox extra functionalities. To interact with the E-Paper display, push buttons and web APIs, I had to install a few python libraries and enable the Pi SPI interface. To do so, I typed in the following command:

sudo raspi-config

On the displayed menu I choose Interfacing Options > SPI > Yes. Then, I rebooted the Pi with:

sudo reboot

Once rebooted, I installed the following libraries:

sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install spidev
sudo pip install requests
sudo pip install schedule

From this point on, I went on the E-Paper display github repository, downloaded the demonstration codes, edited some of them for testing purposes, screwed a few up (inevitably) but helped me work my way up in writing a not-too-ugly script. The zipped project files (PiBox_project.tar.gz) are available for download at the end of this section.

Once downloaded, unzipped and copied to your Pi (e.g. in the /home/pi directory), you'll find:

  • The main.py file which is the executable.
  • The pic folder which contains the project icons (BMP files).
  • The lib folder which contains the E-Paper display and PiBox libraries (Class files).
  • The service folder which contains the auto startup at boot script.

Note that you'll need to edit a few lines of the main.py file for it to run properly.

Line 30 : Type the IP adress you set for pihole. E.g. "192.168.1.25"

pihole_address = "192.168.1.25"

Line 31 : Type in your OpenWeatherMap API key. You can get one by creating a free account on their website.

API_key = "Your API key here"

Line 32 : Enter the names and GPS coordinates (latitude and longitude) of the cities you wish to get weather forecasts for. For the sake of examples, I've pre-registered 3 cities in the script (Berlin,London and Paris) but you can add as many as you want.

cities_info = {'Berlin':[52.52437, 13.41053],'London':[51.50853, -0.12574],'Paris':[48.85341,2.3488]}

That's it, you're all set to run the script and enjoy the PiBox features. Navigate to the PiBox_project folder and run the following command:

sudo python main.py

If you wish to automate the script execution at boot, you'll need to create a service. Navigate to the service folder (PiBox_project/service), open the pibox.service file, go to line 7 and edit the path of the PiBox_project folder. Mine was in /home/pi/PiBox_project.

WorkingDirectory=/home/pi/PiBox_project

Once edited, save the file and copy it to the etc/systemd/system directory using this command:

sudo cp pibox.service /etc/systemd/system

You can now start and enable the service by typing:

sudo systemctl start pibox.service
sudo systemctl enable pibox.service

The script will now automatically startup each time you boot the Pi. Enjoy !

The Final Touch

P1130313.jpg
P1130316.jpg

Filled with the excitement of a fully operational system, I almost forgot a few details: to build a lid and root the power lead out properly. To do so, I drew the contours of the PiBox on a 5 mm thick black acrylic sheet and used a jigsaw to cut it out. I then drilled 4 countersunk M3 holes in each corner, and screwed the lid onto the PiBox. For the power lead, I cut a small groove (using a DREMEL) near one edge so that the PiBox would lie flat on its base.

A few last words:

If you wish to add extra features to your PiBox, simply go to the pibox class file (/PiBox_project/lib/pibox.py) and start programming new methods. For consistency purposes, make sure they return an image object (the one to be displayed). Also, If you plan to use new buttons, don't forget to declare the GPIO pin numbers (line 24) and the event detection callbacks in the init method (line 50). Then, in the executable file (/PiBox_project/main.py), add new else-if (elif) statements for each new method you wish to call.

Last but not least, you can use the E-Paper partial update method to display information more dynamically (without the need of a full screen refresh). This feature is included in the E-Paper library (PiBox_project/lib/waveshare_epd/epd1in54_V2.py) so feel free to use it. You can find examples on the E-Paper github repository.

Please beware that an excessive use of the partial update method can create ghosting and damage the display. A full refresh every so often is highly recommended (c.f. E-Paper FAQ page).

That's all for now folks. I'll let you get on with it !