A relatively sophisticated smarthome automation system that some friends and I worked on for our software engineering class for Fall 2021 at the University of Waterloo.
Client/Organization
Personal
Date
Dec 22, 2021
HomeNode is a smart home system that is radically cheaper than traditional products while offering many of the same functionalities, including monitoring and controlling many different factors of home living, home automation (ex: watering plants), and intruder detection.
GitHub for version control + collaborating code sharing
docker-compose for faster build times + pushed to docker hub
Digital Ocean droplet, server built by pulling the docker image from docker hub, then running it on the droplet
Backend
Backend server written in NodeJS with TypeScript
Express.js is the main library used for the server, to allow for middleware and routing
Index file connects to MongoDB using the mongoose library, listens on port 80 with the server, and sets up cronjobs
Server.js file sets up middleware for CORS, JSON, and serving static files.
The API routing passes data to the sensors, intruders, home, or users as specified, and calls functions for getting data, posting data, putting data, and deleting data, as specified.
Frontend
Created in React.js with TypeScript
UI was created using the npm library Chakra UI and code snippets from Choc UI
Axios used to send HTTP requests to communicate with the backend server
ReCharts was used to create the data visualizations
Raspberry Pi (Software perspective)
Sends requests and reads responses from the Arduinos using the serial library in Python
Converts the sensor data as Python objects with custom classes
JSON + Requests library to format and send data to the corresponding API endpoint
Arduino (Software perspective)
Algorithm to process raw sensor data and send significant average data to the central Raspberry Pi, by comparing to past data
Wokwi for testing and simulation
All Arduino boards are constantly checking the serial buffer to see if their respective address has been requested for data
Personal Contribution
I wrote code so that the raspberry PI reads from the serial line and converts that data into a Python dictionary. I implemented object-oriented programming to modularize the code and easily interface with all of the modules (intruder, sensors, and plants) as well as communicating with the server through the Python requests library. I also wrote unit tests and implemented continuous integration through GitHub actions for my Python code.