Summary
I developed this web app to control my home's entertainment, lighting, and HVAC systems. I used a React frontend with a Node.js backend to communicate with several APIs, combining several systems into a single cohesive interface. This was my first experience developing an application that not only served a practical purpose (as opposed to a simple web page) but was also relied on and used daily by my roommates to simplify their lives.
Application Capabilities
- Control the home's entertainment system&mdashcontrol multiple devices with asingle button touch, e.g. turn on the TV & receiver, set them to the correct inputs, and open Netflix on the Roku
- Control and see the current status of the home's lighting system
- Set the upstairs and downstairs thermostats to the desired temperature
Architecture
The application was powered by a Node.js server running on a Raspberry Pi, which served up a Create React App frontend. Deployment was done with a Docker container on a DigitalOcean droplet. I'm just kidding, that was Copilot's wishful thinking. I actually just ran an npm script that built the frontend locally and SSH'd it to the Pi.
Lessons Learned
This system is now retired since I moved, and I plan on making something like this again in the future. Here are some things I will do differently next time:
- I appreciate the value of a well-tuned CI/CD pipeline
- I will still use a standalone Node.js server running locally on a Raspberry Pi or other device, but I will deploy the frontend to an edge server
- I will use one of Next.js, Remix.run, Nuxt, or SvelteKit to build the frontend