Watch your fish with a Raspberry Pi camera

Remote video monitoring is easy with Raspberry Pi. On this #MagPiMonday, PJ Evans shows you how to use a waterproof camera case to get a unique view of some aquatic friends.

waterproof fish spying raspberry pi case
The case floats, like the fish, so some ingenuity is required to keep it in place

This tutorial was inspired by the Entaniya waterproof case for the Raspberry Pi Camera Module. This case protects the Camera Module without distorting the image. With it, we can submerge a camera into the depths of an aquarium and keep an eye on our fishy pals by streaming video. If that doesn’t appeal, you can adapt this tutorial to be able to monitor a video stream of anything you like, whether it be indoors or outdoors. Combined with Home Assistant, you can soon be monitoring your cameras from anywhere in the world.

01. Prepare you Raspberry Pi

For the best picture quality, a Raspberry Pi 4 is the perfect choice. That said, you’ll get good results from a Raspberry Pi Zero 2 W as well, and it’ll be easier to install. Whichever you choose, we recommend using the Raspberry Pi Lite (Legacy) OS. The project uses the raspivid tool, support for which is limited in the latest version of the OS. The Legacy ‘Buster’ image still has full compatibility. You can find it in Raspberry Pi Imager under ‘Raspberry Pi OS (Other)’. Set up Wi-Fi, and make sure everything is up-to-date with sudo apt -y update && sudo apt -y upgrade.

02. Install and configure your camera

With your Raspberry Pi disconnected from power, install the ribbon cable and Camera Module (we’ll get to the case later). The cable will work either way around; however, the blue side (the one without the exposed contacts) needs to be against the black clip at each end. Find the connector on your Raspberry Pi marked ‘CAMERA’, raise the clip, gently insert the cable, then press the clip down again. Repeat for the Camera Module. Power up your Raspberry Pi and, at the command line, run sudo raspi-config. Go to ‘Interfaces’, then ‘Camera’, and choose ‘Enable’. You’ll then need
to reboot.

waterproof fish spying raspberry pi case disassembled
Some assembly is required. The kit is straightforward to build and creates a watertight space for your camera

03. Test your setup

We’ve set up the camera first to check everything is working before we put it in a waterproof case. After the reboot, run the following command:

raspivid -f

All being well, you should see video from the camera on-screen for five seconds. If you don’t, check if the cable is inserted correctly, and that you’ve enabled the camera, as in Step 2. Now check the orientation. With the cable pointing up from the module, is the image the right way up? If not, you can switch it using this command:

v4l2-ctl --set-ctrl horizontal_flip=1

Finally, check everything is in focus and adjust the camera accordingly.

04. Install dependencies

We’re going to be using a real-time video streaming server to watch our fish (or whatever you’ve decided). This requires some supporting software so we can build and run it, so now is the time to get everything ready. Make sure you have run sudo apt -y update && sudo apt -y upgrade, as in Step 1. Enter the following command:

sudo apt install cmake liblog4cpp5-dev libv4l-dev git

This will install everything you need.

This little fish came a little close for comfort. Getting a clear image may take a few goes to get the best results
This little fish came a little close for comfort. Getting a clear image may take a few goes to get the best results

05. Build the video streaming server

Unfortunately, the streaming server is not available on APT, so we have to build it ourselves. This is straightforward, providing you enter the commands below carefully and in order. From the command line, enter the following:

 git clone 
 cmake .
 sudo make install

This will download the source code, prepare a configuration for Raspberry Pi, and then compile the software and install it. Once installed, you can then delete the v4l2rtspserver directory if you wish.

06. Test your video stream

Before we start filming the fish, let’s test if the video stream itself is working. On another computer, install VLC ( This is a multi-purpose video playback application that supports the server we are using. From your Raspberry Pi, run this command:

 v4l2rtspserver -W 640 -H 480 -F 15 -P 8554

You should see some text output on the screen. On the other computer, open VLC, click on ‘File’ then ‘Open network’. In the URL box, enter:


Replace with the IP address of your Raspberry Pi (use ip addr to find it). Click ‘Open’ and wait a few seconds. You will see a stream from the camera.

waterproof raspberry pi case for aquariums
The assembled case. Now the camera is protected from the elements, whether it be in a fish tank or outdoors

07. Start at boot

Now we have a working video stream, we need to make sure it always starts at boot time. A service file already exists for the server; we just need to change one line. Open the file with:

 sudo nano /lib/systemd/system/

Find the line starting with ‘ExecStart’ and change it so it reads as follows:

 ExecStart=/usr/local/bin/v4l2rtspserver -W 
640 -H 480 -F 15 -P 8554 /dev/video0

Check it’s exactly as written here, then use CTRL+X followed by Y and ENTER to save the file and close the editor. Now enable the service:

sudo systemctl enable v4l2rtspserver

To test it, reboot, and then use VLC again to open the stream.

08. Mount the camera in the case

Let’s turn our attention to the waterproof case. Following the included instructions, separate the base from the outer cover. Now open the supplied desiccant, and place both leaves in the centre of the base in the space provided. If any moisture gets in, these will absorb it, protecting your camera. Screw in the adapter mount for the camera, then carefully thread the connected ribbon cable through the slot. Finally, mount the camera to the adapter, being careful not to over-tighten the screws. Make sure the cable is fitted correctly.

Once your stream is running, you can add it to Home Assistant
Once your stream is running, you can add it to Home Assistant so you keep an eye on our fish anywhere

09. Install the camera cover

Locate the rubber O-ring and place it on the base so it sits in the ridge provided. Take the clear cover and place it over the base, and secure it with the M3 nuts and bolts. We recommend going across each one rather than around the base; it will ensure a more even fit. Again, be careful not to over-tighten the screws. Snap the outer cover over the clear cover. Take the small rubber grommet and, very carefully, feed the ribbon cable through, threading it through the grommet until it meets the base. Insert in the slot and secure with the metal plate. You now have a waterproof case.

10. Mount your waterproof camera

What happens next will require some initiative. Depending on what it is you want to monitor, this determines how you will set things up. For our aquarium project, you can either attach some rubber ‘suckers’ to keep the camera in place, or find a suitable place to rest it on the substrate or sand. For outdoor use, Entaniya sells a wall-mount adapter to make things easier. Either way, you still need to consider how to get the ribbon cable inside or out of the tank and to a safely installed Raspberry Pi. Your biggest restriction is the length of the cable itself.

11. Add to Home Assistant

One of the best ways of utilising this monitoring solution is Home Assistant, the popular home automation operating system. Luckily, support for a remote camera like this is baked right into the service. To add the stream in, you’ll need to be able to access and edit the configuration.yaml file. Add the following text:

  - platform: ffmpeg
    name: FishCam
    input: rtsp://:8554/unicast

As before, change to your Raspberry Pi’s address. Now restart Home Assistant. In your dashboard you can now add a ‘Picture Glance’ card using the newly created ‘FishCam’ entity. Now your fish can be viewed wherever you can access Home Assistant.

12. Next steps

There are many ways you can build on this project. If you’ve installed a Fish Cam in your aquarium, there’s lots more to do. Monitor the aquarium temperature with a 1-Wire temperature sensor and send alarms when things go awry. Or, use a flow sensor to keep an eye on the pump. If your interest lies more with remote monitoring, try adding presence detection or facial recognition to Home Assistant alongside the video feeds. Motion detection can be used to trigger recording or alerts. Outdoor cameras can be used to keep an eye on your backyard chickens or who’s at the front door. As ever, it’s over to you. 

The author would like to acknowledge, whose excellent video streaming tutorial informed this piece.

Print Friendly, PDF & Email

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Server Status

Aradippou Chat 1 Chat 2 Larnaca Limassol Nicosia

Chat Links

Official Links.

1. Chat 1.
2. Chat 2.

Alternative Mirror Links.

1. KiwiIRC 1.
2. KiwiIRC 2.

Other Web Clients.

1. IrcCloud.

Recent Posts

Related Posts:



Super Club Radio

Mighty Deals


CyIRC Tweets

Scroll Up
Fatal error: Uncaught WMAC\JSMin_UnterminatedStringException: WMAC\JSMin: Unterminated String at byte 1180: "+o.accessToken}}).then(e=>{if(!e.ok)throw e;return e});return a.catch(e=>{console.error(`Failed to logout chatrix session. deviceId: ${o.deviceId}`)}),a}})(); in /home/bszucbfe/public_html/wp-content/plugins/clearfy/components/minify-and-combine/includes/classes/ext/php/jsmin.php:215 Stack trace: #0 /home/bszucbfe/public_html/wp-content/plugins/clearfy/components/minify-and-combine/includes/classes/ext/php/jsmin.php(157): WMAC\JSMin->action(2) #1 /home/bszucbfe/public_html/wp-content/plugins/clearfy/components/minify-and-combine/includes/classes/ext/php/jsmin.php(96): WMAC\JSMin->min() #2 /home/bszucbfe/public_html/wp-content/plugins/clearfy/components/minify-and-combine/includes/classes/class-main.php(375): WMAC\JSMin::minify('(function(){"us...') #3 /home/bszucbfe/public_html/wp-includes/class-wp-hook.php(324): WMAC_PluginMain->jsSnippetcacher('(function(){"us...', '/home/bszucbfe/...') #4 /home/bszucbfe/public_h in /home/bszucbfe/public_html/wp-content/plugins/clearfy/components/minify-and-combine/includes/classes/ext/php/jsmin.php on line 215