OpenVPN on a Raspberry Pi

My parents and I, who come from the Netherlands, have recently bought a cabin in Norway. We have a lot of wishes and ideas for this cabin, but one of the first projects I started on right after we signed the contract was the setup of a VPN server on a Raspberry Pi. The goal is to have any device connecting to the WiFi in the cabin appearing to be in the Netherlands, so that my parents can ‘work from home’ from the cabin and can stream Dutch TV and Dutch Netflix. For this to work, we need a router that can act as a VPN Client and a VPN Server to connect to.

By having the router connecting to the VPN Server, any device that connects to the router will also be connected via the same tunnel to the internet. By installing the VPN server on a Raspberry Pi, I can just ship a readily installed unit to the Netherlands with minimal setup steps for my parents while they remain 100% in control of their VPN endpoint. This is important to ensure that for example Netflix will not block their stream, as any data appears to come from their own home instead of a (known) VPN provider.

For this project we use the following components:

I recently bought an Asus RT-AC66U B1 router, which I know can act as a VPN Client. The Asus 4G-AC68U is a model from the same product line, which also includes a 4G simcard slot.

Software-wise, we only need only a handful of services/programs:

  • The latest Raspbian Lite
  • PiVPN
  • A Dynamic DNS provider, I’m using Google Domains
  • ddclient

Setup

The first step is obviously to flash Raspbian on an SD-card and shuf it into the Raspberry. I’m using Raspbian Lite since we know exactly which software packages we are going to use, and any dependencies will be installed with them. This will keep the overall system performance as high as possible.

After setting up Raspbian, we use SSH to log in as root and install PiVPN. PiVPN will install either OpenVPN or WireGuard, in our case OpenVPN as this is also supported in the Asus router. I have set up the IP configuration to be dynamic, so it can adapt to the setup in my parent’s house once it arrives in the post. Other than that I’ve used the standard settings, obviously choosing the right DNS Provider (Google Domains). I had also set up a Dynamic DNS entry in Google Domains prior to the Raspberry Pi installation, which will be used for this VPN setup.

Dynamic IP lookup

Since I don’t know the public IP address of my parents house (and they might have a dynamic IP address that changes every once in a while), one can use Dynamic DNS. Basically, Dynamic DNS checks the current public IP address of the host and sends this to a pre-configured DNS provider. The provider matches the IP address, for example 185.176.244.205, to a subdomain name, for example cloud.jessendelft.org. This way, anytime a device tries to find cloud.jessendelft.org they only have to ask the DNS provider, which will then provide them with the correct public IP address. To achieve this on the Raspberry Pi we can use ddclient. ddclient only needs to know a few basic parameters such as the login credentials of the DNS provider and does the rest by itself. It runs as a deamon in the background, automatically checking and updating the current public IP address in the DNS register.

I generated two OpenVPN configuration files which can be uploaded to VPN Clients and allows them to connect to the server, one for the Asus router and one for my private PC so I can test & debug the entire setup. These configuration files include instructions to use one of my subdomains to find the current public IP address of the OpenVPN Server in the Netherlands. This keeps the setup easy and flexible.

Lastly, I entered the Wi-Fi credentials of my parents house in a file called ‘wpa-supplicant.conf’ and placed this in the /boot/ folder of the Raspberry Pi, so they can use it both in wired and wireless mode. After running a few tests it was then ready to send it in the post, and hope that all works! I also included a guide for my father to set up the required port forwarding in his router in the Netherlands, so the VPN Server can be found from the internet.

Testing the setup

When the Raspberry Pi had arrived in the Netherlands it was time to put it to the test. We forwarded the required port in the router, gave it a static local IP address and attempted to connect from Norway.

Connecting was successful!
However, the test-pc did not have internet access.

The VPN Server in its natural habitat.

Some debugging later revealed that the ethernet port did not have the default eth0 name, but something more tropical. Changing the name of the ethernet port in the configuration (iptables) fixed the problem and allowed internet access through the VPN tunnel. Hooray!

Lastly we installed Log2Ram, which limits the logging done to the SD-card to extend the lifetime of the system. SD-cards can get corrupted when written too often to, so in order to limit the amount of write cycles Log2Ram will save all logs in RAM memory and only once a day write the entire logfiles to the SD-card.

A reboot to make sure everything works and it was finally time to check the speed of the connection!

Speedtest over 4G

Honestly, this is 10x as high as expected when we started on this project so we’re certainly very happy about this! This will allow my parents to comfortably travel to their cabin and use the internet, while they appear to be in the Netherlands.

Playing with Grafana & InfluxDB

In my search for a way to display the data being collected by Homey I often have seen Grafana as an option. Grafana is a tool to visualize data in graphs, gauges, tables, etc. It reads data from a database, is very responsive and easy to work with. As a bonus, FreeNAS offers a community plug-in which has both Grafana and InfluxDB installed and ready to go, so I could easily set up a jail to try it out.

Homey by itself does not log any data. To have it upload its variables to the InfluxDB database I just had to install the InfluxDB App, fill in the IP address of the Grafana jail & credentials of the database, et voila! From the Grafana interface I started seeing the potential Query fields being populated with all the data that Homey had to offer. Not much time after that, I had my first Dashboard populated with energy measurements, real-time power consumption and temperature data from different rooms in the house. With a little more playing around this Dasboard was shown as an iframe on my Magic Mirror.

Grafana dashboard shown as an iframe on the Magic Mirror

After doing this I realized that FreeNAS is also a great source of data (CPU usage, network & HDD speeds, RAM usage etc.) and a place where I’d like to get some more overview of what’s happening. Naturally, a quick Google-search yielded tons of people who had done this before, and I followed this guide to get FreeNAS to upload its data to a separate InfluxDB database and create a Dashboard in Grafana. I then used this dashboard as an inspiration to create a similar one for Homey and by the end of the day I had 3 different dashboards which give me a neat insight in how well my core-components from my smart home are working.

An additional line in the reverse proxy configuration and the Grafana jail was accessible through the internet. Curious on how it looks? You can find it here: cloud.jessendelft.org/grafana/.
Username: viewer
Password: viewer123

I am not sure yet if I want to keep using this system, as I ultimately want some form of 2D/3D interactive map of my house to show this information. As an interim solution though, this is quite nice and I was surprised by how easy it was to include this in my system. I like the fact that all the ground-work is up and running (FreeNAS, Reverse Proxy, Homey, etc.), and that it apparently is working so well that it is easy to build layers of complexity upon them with for example the Grafana dashboards. If you have comments/ideas on what I can do with my data, or how I can improve my system even more, please let me know in the comments!

Cheers!
Jesper

Steampunk Taptower build

I can’t believe this project took me almost a year to complete! In August 2019 I was browsing around Thingiverse for some cool idea’s to 3D print, when I found a Steampunk Tap Handle made by Fuzzie/The Beergineer:

I knew I wanted this as well, so I 3D printed the parts, spray-painted them and assembled them together with some scrap tubing and 8mm screwing rods. I also had some leftover APA102 LED strip from the Ambilight system laying around which could be used to light up the tap handle, and I ordered a couple of Arduino Nano’s to control this LED strip.

The assembled beer tab, with multi-colored LED’s on the inside.

The prototype was up and running rather quickly. I put the Arduino on a breadboard, connected the light strip to it and uploaded the code from The Beergineer. Before it worked though I made some changes to the code, which can be found on Bitbucket (including the changelog). Most notably I introduced interrupt-based reading of the push button opposed to polling it. This push button is used to change the light pattern shown inside the tab handle. I also programmed it so that every time the button is pressed, the new state is written to EEPROM so the same light pattern is shown after a power outage. Lastly I changed the main loop from an if-else loop (which had 4 if-statements) to a switch, to prevent unnecessary calculations.

Arduino Nano on a breadboard. Note the beautiful ‘push button’, aka red wire with capacitor.

And it was at this moment where this project ended up in a moving box, and didn’t find it’s way out until June 2020…

Installation

Almost 10 months after I started this project I dug up the beer tap as we would be going to our cabin during the holiday, which is where I planned on installing this. Before installation the Arduino was put inside a plastic box and covered in hot glue, to give it some resistance against rain. I soldered the wires to the headers, installed a push button on the outside of the case and put a Molex connector on the wires to make installation easy. Additionally I added a switch connected to the Arduino, which can turn the LED’s inside the handle on and off.

IMG_20200630_154312
IMG_20200701_131908
On the top: planning the box-layout.
On the bottom: components are in place.

 

At our cabin we have a refrigerator with a beer tab on top. Installation was a matter of unscrewing the old tab and screwing on the new tab.

IMG_20200704_151937
IMG_20200704_153851
IMG_20200705_195329
Installation of the Steampunk Beer Tab.

 

During the night, the LED’s inside the Tab Handle create a very cool looking scene:

IMG_20200725_223256
IMG_20200725_223221
IMG_20200725_223210
The Beer Tab at night, showing different light patterns.

 

I think this was a fun little project to do. Unfortunately I wasn’t able to properly hide the cables as the metal in the tab tower was too strong to drill through with the tools we had available at the cabin. Therefore, they run on top to the black box which holds the Arduino. Other than that, I am very happy with the result.

Cheers! And don’t forget, keep Beergineering!

Jesper

Home NAS Server Setup

This website runs on an Intel NUC.

Actually, a lot of things are now running on this little NUC. Before showing you exactly what processes/services are running, please allow me to explain why I have this NUC in the first place.

Home Assistant and the NUC

In our previous house I was running Home Assistant on a Raspberry Pi. Home Assistant is a piece of software that can observe, control and automate nearly anything that can be part of a smart home. In my case, I had the following devices connected to it:

Linking all these devices together required something more robust than a Raspberry Pi, hence why in April 2019 I bought an Intel NUC NUC6CAYH. This little fellah has an Intel Cerion CPU, place for a maximum of 2x 4GB of DDR3L RAM, can house a 2.5″ hard drive and has a 1Gb ethernet port. I figured that this was a very good alternative for a Raspberry Pi, whilst also keeping my wallet in mind.

This NUC ran Home Assistant (or HA for short) very reliably, although the HA software itself needed quite some maintenance, up until we moved in December 2019. The NUC disappeared in a box, and at the new house I bought an Athom Homey to take over the task of HA in an attempt to limit the amount of maintenance work. This is why I had a NUC laying around when I decided to start setting up a Home Server in January 2020.

First step: Setting up a NAS file server

When I started on this project I knew nothing about file- or NAS servers, but I imagined that there would be open source software out there that could help me out. I had decided that I did not want to buy new hardware, as things could be tested on the NUC first to see if it would be good enough.

Two names that kept popping up were FreeNAS and Unraid. They both looked equally good candidates for me, so I picked the one that felt like it had the best chance of succeeding -> FreeNAS. Over the last couple of months I have been very happy with this choice. FreeNAS is running very stable and is in my opinion easy to use. The initial file server setup was a breeze, and in no-time I had a functioning NAS server which could be accessed through a PC with Windows Explorer (via a Samba share).

FreeNAS has a functionality which are called ‘Jails’. Jails are, very shortly explained, little isolated operating systems that use the same kernel as the hosts operating system. This means that they are more lightweight to run than a Virtual Machine as they dynamically share available RAM, CPU & HDD space between the host and other jails, but simultaneously are compartmentalized from the host. Processes run inside the jail can only access files inside the jail, and processes/files inside the jail are not aware of any file outside the jail. An additional (much better) introduction to jails can be found here. All in all, they are a perfect place to run additional programs/services without the risk of breaking my entire NAS system.

The current setup

The current HW setup, including PS4 Pro and Philips Hue bridge

Hardware

The current hardware today is, as I mentioned, running on an Intel NUC. This includes:

The HDD’s are set up in a mirrored configuration. That means that all data is copied on both drives, giving me an effective storage capacity of 2 TB whilst also protecting myself from a disk failure. This is also called a RAID 1 setup.

FreeNAS Software setup

The current setup is running 3 jails, 1 Virtual Machine, a samba share and some additional smaller services inside FreeNAS:

FreeNAS services setup
  • The Samba share allows us to access files on the server when we’re on the home network.
  • The website that you see right now is running inside a Jail.
  • A second jail contains NextCloud. NextCloud mainly allows for automatic synchronization of pictures and videos from my phone to the server.
  • Since there are multiple websites that I want to access from this web-address there is a jail set up that acts as a Reverse Proxy server.
  • Lastly I have a virtual machine that runs PiHole. PiHole is software that blocks advertisements on my home network. Unfortunately it cannot run (yet) inside a FreeNAS jail as it does not support FreeBSD, the operating system FreeNAS runs on.

So how do all these services work together? Well, that’s a different view:

Networking flow

Starting from the bottom, there are the NextCloud storage, this blog and the magic mirror which are accessible through the internet via the reverse proxy. There is also the Samba share which is accessible only on the local network for privacy reasons.

In the middle of the picture is the router which obviously has access to the internet. All DNS requests are however forwarded to PiHole. A DNS request is a request for a name server to translate the domain name of a website (for example jessendelft.org) to an address (for example 217.197.166.65), in order to connect to that address. PiHole blocks any requests to known advertisement addresses so that these requests never get resolved, which means they will not load. This way there is network-wide ad-blocking for all devices connected to it.

I have some plans of integrating Octoprint into the Reverse Proxy once my 3D printer is back up&running. I also want to move PiHole to a jail to free up some RAM and HDD space which are now reserved by the Virtual Machine.
If you have any more ideas on what I can do to improve my setup, please let me know!

Ambilight System

This build is based upon the guide from GreatScott! I had seen his video on Youtube back in December 2016 in which he added his own ambilight lighting system to an older TV. In short, ambilights light up the wall behind a TV or other monitor according to what is shown on the TV. This will extend the TV’s colors beyond the actual screen, creating a more immerse viewing experience. Sounded great for gaming!

Back in those days ambilight systems did exist on some premium Philips TV’s, but plug-and-play systems like the Philips Hue Play to add ambilights to your existing TV were not around yet. This project looked very simple and seemed to have a great effect, which is why I also wanted to try it (we’re talking early 2017 here). I was especially curious to see how responsive the LED’s would be, and if they could keep up with fast moving objects on the TV.

The build

For the build we need a few components that are easily sourced through eBay:

  • HDMI Splitter.
  • 30cm HDMI cable.
  • HDMI2AV converter.
  • USB Video Grabber.
  • APA102 strip which is long enough to go around your TV.
  • Power supply.
  • Various small wires for data and power distribution.
Schematic overview of components, borrowed from GreatScott!

I replaced the Raspberry Pi Zero from the overview for a Raspberry Pi 3 model B, which I had laying around. This also had WiFi built in, which meant I could scrap the separate WiFi receiver.

My TV is a 49″ Sharp Aquos, which could house a whopping 194 LED around the edges!

Installation of the components. The LED strip, Power supply, Raspberry Pi, and HDMI splitter are in place, as well as a power distribution box.

After everything was wired up it was time to set up the Raspberry Pi. Firstly, I downloaded the latest version of Raspbian and flashed this to the SD card. Then I connected it to my WiFi network so I could access it over SSH without the need for an additional Ethernet cable. After this setup was complete I could download and set up HyperCon. This piece of software is truly awesome as it takes care of all the aspects of the project (read out the USB grabber, do the image analytics and controls the LED’s), and in addition provides a remote interface which you can use to show different animations.

Setup is also very easy with the included Configuration Tool. In this tool you can set up the position of your LED’s, configure your grabber and finetune the colors of the LEDs:

HyperCon configuration tool, showing my specific LED setup.

After uploading the configuration file to the Raspberry Pi and starting the included running rainbow animation, which is perfect to run as a test, the result looked like this:

HyperCon Rainbow test. Looking fancy already!

The result

The goal of this project was to increase my gaming experience. For this, the responsiveness of the LEDs needed to be high enough. I never actually measured the response time, but in the video below you can check out the result. As for my own opinion, I think it is more than good enough, especially if I consider that this is a DIY project and offers much more LED’s than the commercially available products back in 2017.

3D printed case

This setup has run without changes for around 2.5 years behind my TV. In September 2018 I wanted to try and design a 3D printable housing which could house both the HDMI splitter, HDMI2AV converter and USB Video Grabber. I came up with the following design:

Case V1 v10
Case V1 v11

Unfortunately I don’t have pictures of the end result. It looked good and the setup worked like this for a few months, although I noticed that the housing would get very warm when the system was in use. Eventually either the HDMI2AV board or the USB Video Grabber broke, as the LEDs one day did not came on. I was able to test the HDMI splitter by attaching either outputs to my TV, which showed that it was outputting a signal on both lines. The Raspberry Pi also still worked, as I could control the LED’s via the Hypercon webinterface.

I never came around to fixing this issue, and eventually removed the entire system when we started to use this TV as our main room TV and I got another TV for the gaming.

Would I advice this?

All in all, this is still a relatively easy and fun project. I think it works extremely well for a DIY project, and I would definitely recommend it if you are into gaming or watch a lot of movies, and would like to enhance your viewing experience.

Tagged : / / /

Magic Mirror Build #3 – Upgrades

Since I originally built my mirror it received multiple upgrades, both in hardware and in software. In this post, I will attempt to describe the changes I have done over the years.

Modifying the original software

As I mentioned earlier the first software that I installed was the original MagicMirror software by Michael Teeuw. This software was able to show the following things:

  • The time
  • The weather
  • Compliments
  • News headlines

This of course was already very nice. However, I wanted to make the software a bit more my own. I therefore modified it to include a line which showed the song I listened to last. This was managed by linking up my Spotify with Last.fm. Spotify would ‘scrobble’ (a fancy word for logging) the song to Last.fm. The mirror would poll (ask) Last.fm every 10 seconds which song was scrobbled last and display this on the mirror. The end result looked like this:

2015-10-06 16.50.59

Me being happy with my first mirror!

Upgrading the hardware

The original mirror had a Raspberry Pi 1 model B to show the content of the screen. The reason I didn’t have the Raspberry Pi 2 even though it was released in February 2015, was that I had actually salvaged the RPi 1b from another project. A year earlier (April 2014), I had tried to set up a media server/TV receiver inside a beer-crate that I had rebuild into a boombox:

2014-04-01 12.41.37
2014-04-01 12.45.29
2014-04-01 12.46.14

However due to the weight of the screen & Raspberry Pi, and limited reception due to the fact that I could not fit a large enough antenna, I decided to scrap this part of the boombox.

Using the Raspberry Pi 1 model B in the mirror was fine, as it was also running the original Magic Mirror software (not yet MagicMirror²). This original hardware setup ran for about 2 years, way into 2017.

2017 – New software, new Raspberry Pi

In 2017 I revisited the project and found out about the new MagicMirror² software. Firstly I decided the RPi 1b has had it’s best time, and it was time to replace this with a new Raspberry Pi 3 (not really for any good reason, but just because I wanted something fancier). Secondly, I installed the new software on the mirror, which allowed me to do much more with the system, as this new software relied on modules that could easily be added and/or removed from the system. This meant that first of all, there were now a whole lot of people around the world collaborating on this project and making fancy modules that could do all sorts of things. Secondly, since the structure of the software was greatly improved, it became much easier to add, edit and maintain the entire setup.

raspberry-pi-2011-12-arm-board_e041ffb858d0a3b7b064d32c150c7aae
raspeberry-pi-3-b-plus_048517a8fc3655104ecd437aa38d9511

Raspberry Pi 1 model B vs. Raspberry Pi 3B+

Later, after it came out, I upgraded the Raspberry Pi again to a 3B+. Since I updated to MagicMirror² I have tried many different modules, although I never wrote them on a list and most of them I have therefore also forgotten again.

February 2019 – Screen update

Ever since I build the mirror I wasn’t very satisfied with the original TV screen. The resolution of the screen was 720p, and since it was such an old TV I imagined it used quite a lot of power. I have a BenQ G2412HD that I have used as a second PC monitor for years which has performed extremely well in my opinion. It also has physical buttons to control the screen, which means they are probably mounted on a separate PCB and easy to put it in a new case. So, a perfect candidate for me to replace the TV screen with.

I did not want to use my own screen for this (just in case I messed up and ended up with no screen at all). Luckily I was able to find one second-handed online. It had glue residues on the side, which obviously did not matter to me (the original casing would be removed anyway).

Second-hand BenQ G2412HD

Replacing the screen turned out to be easier than expected. This was mostly because there were not really any unforeseen challenges. Everything was screwed/clamped together (no glue was used inside), and the buttons were placed on a separate circuit board which made it easy to extract and relocate them.

To mount the new screen and aluminium box that contained the screen control board in the case, I designed and 3D printed a small bracket which was able to hold the aluminium box in place inside the mirror’s case.

Design of the 3D printed bracket

I had also the wish to move the location of the Raspberry Pi. In the old setup the Raspberry Pi was located on the top. This meant that the heat produced by the TV screen would pass by and heat up the Raspberry Pi, and it would often operate at +60ºC. In the new setup the Raspberry Pi sits in the bottom of the screen inside an aluminium box (which houses all the other electronics as well), which means that cooler air is used to cool the Raspberry Pi and should thus reduce the operating temperature.

2015-10-02 23.21.41_rpi
IMG_20200422_132552_cut

Old vs. new backside. The location of the Raspberry Pi is shown with a red square.

With the Raspberry Pi in the bottom the operating temperature dropped down to ~50ºC while operating.

As mentioned, all the electronics of the new screen are located inside an aluminium box. This box came with the BenQ screen and turned out to be higher than the old TV control board, which meant I had to extend the case a bit. To achieve this, 4 small wooden blocks were placed in the corners of the mirror. I believe this also improves overall cooling of the system, as it allows more air to flow past the back of the mirror.

With all the changes the front side also looked different:

2015-10-06 16.51.08
71703325_2749199848426233_4822439737224593408_o

Old vs. new frontside

I was quite blown away by the difference a 1080p screen makes. Suddenly, the clarity was much better and I had to increase some of the fonts because they were too small to read.

Current setup

To showcase the mirror to people when I’m not at home, I have set up two instances of the Magic Mirror software. The first one is only accessible by the local filesystem and takes care of everything that is being shown on the physical mirror. The second one is running in ‘server only’ mode, and can be accessed over the internet. This remote one has some more restrictions, and much of my private information has been removed.

Check out the remote instance here

My current (local) setup consists of the following modules:

As a finisher, I’ll show you how all of that together looks:

Cheers!

Magic Mirror Build #2 – Getting things to work

After having learned from my Previous Attempt, I now decided it was best to take some smaller steps. I still had the Raspberry Pi, and was quickly able to buy another old TV for very cheap. I moved this TV in a similar fashion as previously, but this time I would focus on getting the software up&running first.

The first test

Installing the software wasn’t very difficult, I just had to Follow Michael Teeuw’s guide on how to set up the Raspberry, and then Install his software. After having done this, I found myself looking at a copy of the Magic Mirror!

Hooray, something works!

I then tried the cheap eBay foil again. Still, the results I got from this were far from satisfying. It looks like I’m going to have to pull out my wallet and get myself a real one-way mirror…

Second time trying the cheap eBay foil. Again, not a satisfying result.

The frame

Now that I had ordered a real mirror (bey bey savings), I had some time left to focus on the aesthetics of my mirror. So, I removed the casing of the TV and tried to build a decent looking frame around it.

Building the case

I was quite impressed with how this looked, and after a paintjob I was getting quite happy with it.

Wrap up & result

Now, it was only a matter of waiting for my mirror. When that finally came in, I could screw/glue it all together, and I had myself a Magic Mirror!

You look sexy!

Check out the updates here!

Magic Mirror Build #1 – First Attempt

In June 2015 I stumbled upon a blogpost by Michael Teeuw, the creator of the original Magic Mirror. He holds a blog at michaelteeuw.nl called Xonay Labs. Admittedly, most of my current website is inspired by his website, but as a starter this was the first project I also decided to attempt. If you haven’t seen it, take a look at his original project and blog, I’m sure that if you like the stuff I’m doing, you’ll love his site!

So, let’s get to the build:

July 2015 – First Build

A magic mirror works by having a screen behind a so called one-way mirror. A one-way mirror reflects a certain percentage of the light that hits it, while it also lets some of it through. This means that if we put a one-way mirror in front of a display and display some white text on a black background, the text will shine through the mirror and shows up between our reflection! Awesome, right?

 

There are a few things we’re gonna need for this build:

  • A Raspberry Pi to run the software (which we again will credit to Michael Teeuw).
  • A display to tell us how sexy we look today.
  • A one-way mirror.

Also, being a student at the time meant that I wanted to do this project as cheap as possible. So first, I ordered myself some one-way mirror foil on eBay (which was €5,- compared to an actual mirror that costed €200,-). In addition, I bought a Raspberry Pi and an old TV-screen that I picked up using my motorbike:

Very professional transportation of the TV screen.

Being very (over-)confident of myself, I decided that I’d be able to take apart the TV and different layers of the LCD panel, and glue the foil right onto the top layer of the LCD panel. The disassembly went rather well, but after I glued the foil on the display I was rather disappointed with the mirror-effect. Also, after I assembled the TV back together I found that the LCD panel was broken.

Here I found out that this project is going to take some re-work and smaller steps…

Check out part 2 here!

Tagged : / / /