I wanted to share an open-source hardware project I’ve been working on to solve a very specific problem I had with my Home Assistant setup, hoping it might be useful to someone else here.
The Problem:
I have a standard USB UPS, and I wanted to monitor it in Home Assistant to trigger automations based on battery level or power outages. The traditional route is to plug it into a dedicated Raspberry Pi, a NAS, or an always-on PC running a Network UPS Tools (NUT) server.
I really didn’t want to dedicate a Raspberry Pi (which is overkill) or waste electricity on a larger machine 24/7 just to act as a simple USB-to-Network bridge.
The Solution:
I wrote a custom firmware for the ESP32-S3. Because the S3 chip has native USB OTG Host capabilities, I was able to make it act as a complete, standalone NUT Server over Wi-Fi.
You simply flash the ESP32, plug it directly into the UPS via USB, and connect it to your Wi-Fi network.
Main Features:
Native HA Integration: It works flawlessly with the official Home Assistant NUT integration. You just point HA to the ESP32’s IP address.
Low Power & Cost-Effective: You only need a basic ESP32-S3 board (around $5). No heavy OS overhead, no SD card corruption risks.
Built-in Web Dashboard: It serves a clean web interface to check real-time data and UPS descriptors locally.
3D Printable Case: I also designed a custom 3D enclosure so the final result looks clean and professional next to the server rack.
The project is entirely open-source. You can find all the code, the 3D STL files, setup instructions, and a list of currently supported UPS models on my GitHub repository:
I’m currently looking for feedback and to expand the list of supported/tested UPS models. If you have a USB UPS and decide to give this a try, please let me know how it goes or open an issue on GitHub if you encounter any problems with your specific model!
I’ve been wondering how hard this might be to do for a while as using even a Pi3 is a sledgehammer to crack a nut (pardon the pun). Now you’ve done it - and from the looks in a very nice way - I’ve just ordered a suitable ESP32-S3 board to try this out.
I have two CyberPower BR1200ELCD-UK UPSes. One is protecting my servers so can be connected to one of them. The other is protecting the incoming Internet connection gear and while I could run NUT on my main OpenWrt gateway/firewall I like the stand-alone idea. Currently I’m using a Pi3.
I’ll tell you something funny: I bought a Pi Zero because, like you, a regular Pi seemed overkill. It worked beautifully, except… I bought the model without WiFi. It didn’t even occur to me that such Pis existed
Regarding the UPS, there are a few similar projects. I’ve tried this one before. I’m specifically linking to a solution to a problem that also affected me. This solution just popped up today! It’s a hardware issue affecting some models, like the Back-UPS RS 1500G I have. You need to add a connection between the GND on the ESP S3 and the grounding screw on the UPS. This may be needed regardless of the ESP firmware project you use, so just FYI.
Reading around a bit, it seems some ESP32-S3 boards don’t provide 5V on the USB VBUS pin when in USB host mode by default and some UPSes won’t play unless they see that. There’s generally a solder bridge you have to close to enable it.
I’ll find out if that affects me when my module rocks up and report.
As stated in my project’s readme, you need to create a solder bridge on the two pads marked “OTG” on the back of the board to make it work as a host and provide 5V to the connected device.
Yes, exactly. I have one UPS near my Home Assistant server connected directly via USB, but I also have another one located further away that I use to power the router and a few other small devices.
would this work with the above? or clones of it?
It would also be cool if the LCD can also be used to display all the same info that is exposed so that we can also make a “portable” UPS diagnostic device.
Yes, that board (ESP32-S3-USB-OTG) or its clones should work perfectly fine, as they are based on the ESP32-S3 and feature a native USB Host port which is required for this project.
Regarding the LCD: currently, the firmware doesn’t support external displays, as all the data is exposed via the built-in Web UI and the NUT protocol over Wi-Fi. Using the LCD to make it a “portable” UPS diagnostic device is a really cool idea! Unfortunately, I don’t currently own that specific board, so it is impossible for me to implement and properly test the display functionality right now.
Yes, adding a toggle in the web UI is definitely feasible!
However, please note that software can only control and disable the programmable RGB LED (NeoPixel). The other discrete LEDs on the board (such as the red power LED and the TX/RX activity LEDs) are hardwired and cannot be turned off via firmware without physically modifying the board.
If you are still interested in having this feature added for the RGB LED, please feel free to open a feature request on our GitHub repository: