
EV Parking Scraper
A scraper for EV spots to have accurate timing for unofficially imposed time limits.
On April 23rd of 2025, after being in University for a bit over a year, I had realised that I wasted a lot of time trying to find a parking space. There are reserved EV charging parking spaces at the university, but they are often occupied. There is a University imposed 4-hour limit on parking in these spaces.
Which led me to think about how I can make it easier to find out when a charging spot may become available. My university uses a EV charging company called Chargepoint, and they have an app that shows if a charging spot is available or not. You can use the app to setup notifications when a specific charger becomes available, but it does not allow you to view when the charger last changed statuses (e.g. from occupied to available, or available to occupied).
Now given the fact that the chargers are connected to the internet, and the app is able to show the current status of the chargers, I figured that there must be a way to get this information from the app and store it somewhere so that I can see when a charger last changed statuses. As much as I wanted to setup a MITM proxy to intercept traffic from my iPhone while using the app, I did some digging and found they had a Chargepoint Driver Station Map website which is almost identical to the app. At least for the features I actually cared about and the website is accessible from any device with a web browser. I was able to use the developer tools in my browser to inspect the network traffic and found that the website was making requests to an API endpoint that returned the current status of the chargers in JSON format.
Version One
My first version of this was using a simple NodeJS cron job that would fetch and store the status into a Postgres database every minute. At the time I wasn't sure if this was really going to be a continued project so I cobbled it together with Garfana which was already running on my server. I created a simple dashboard that would show the current-ish (within 1-3 minutes) availability of every charger, and a timestamp of when it last changed, and a calculation of how long it has been in that state.

And that was version one of the project. Simple cron, simple dashboard, and it worked.
Fall 2025
In Fall of 2025, I took a "Web Application Development" class, and in that class I was forced to make a web application using an API. I figured that I could use this as an opportunity to make a web app for this project. Only issue I had was that I had to use an API and I didn't have one, as the Grafana dashboard was making pure SQL queries to the database. So I made a simple Hono-based API that would return the data I had stored, which wasn't much, but it was enough to get the job done.
I then made a simple web application that would show the current status of the chargers, and also show a history of the chargers. The web application was a bit more complex than the Grafana dashboard, but it had a lot more features, such as: marking a row as red when the spot is occupied, or has been available for over 15 minutes without being used during enforced 4-hour limit hours. The latter was pretty important to include as there are times where a non-electric car would take the spot as there's no other available parking (and they were likely late to class), and the plug would then report as available while the spot is physically occupied.
I actually used that dashboard till recently (September 28th, 2026).
Version Two
You may have noticed that I said version one, and that is because as of September 28th, 2026, I had rewritten the project. The first version was a bit of a hack, and was missing the most critical piece of information, which was the individual port status updates. The first version would only show the latest status of the charger, which is fine if you only care about the availability of the charger as a whole, but if you wanted to know the status of each port, then you would be out of luck. For example, if the left port was occupied for 3 hours, and then the right port had someone unplug and then someone else came and plugged in, now you've lost the most important information about the left port (which is HOW LONG the port has been occupied for). As the left plug was occupied for 3 hours, and will likely leave within the next hour due to the imposed 4-hour limit.
So priority one, was to make sure the new version would be able to track and show every plug/port on every charger station.
Priority two was to make sure the web app was actually real-time. As with the first version, you had to wait for the 15-second auto-refresh which would occasionally stop working, and you would have to refresh the page manually. This was a bit of a pain, as you would have to sit there and watch the page for a while to see if a charger became available. So I kept falling back to the ChargePoint app or the older Grafana dashboard.
Given those priorities, the project was rewritten, the database was wiped and restructured, and the API was rewritten to support the new database structure. The web application was also rewritten to support the new API and database structure. Now that I had the updated app, I still had an issue with the auto-refresh, and I wanted to make sure that the web app was actually real-time. So I implemented websockets into the API and web application, which allowed for real-time updates of the charger status.
To make the API capable of handling real-time updates, I implemented a Redis Pub/sub that would allow the tracker service to push updates to the API service, which would then have the web app users subscribed via websockets. Honestly the best upgrade to the project, as it allows for a much better user experience and actually works as intended when you sit there watching the site instead of the ChargePoint app or their Driver Station Map website.

I may update this project once again in the future, but for now, this is the current state of the project, as of October 6th, 2026.