EnergyMe-Home is a fully open-source home energy monitoring system designed for DIY enthusiasts and embedded developers who want detailed, multi-circuit insights into their household power consumption. Built around the ESP32-S3 microcontroller and the ADE7953 energy measurement IC, this project combines custom hardware and robust firmware to deliver high-resolution data for up to 16 electrical circuits.
Hardware and firmware architecture of EnergyMe-Home
At the core of the hardware is the ESP32-S3, a powerful Wi-Fi and Bluetooth-enabled SoC known for its DSP capabilities and dual-core processor, coupled with the ADE7953 energy measurement IC. The PCB design (version 6.1) supports monitoring one main circuit sampled at high frequency and 15 branch circuits measured through multiplexing. This setup uses 333mV current transformers (CTs) with 3.5mm jack connectors, which simplifies sensor attachment and replacement.
The voltage sensing is handled by a ZMPT107-1 voltage transformer providing galvanic isolation, a critical design choice for safety and measurement accuracy. The hardware design, including PCB layouts, schematics, and BOMs, is fully open and licensed under CERN-OHL-S-2.0, encouraging builders to fabricate and modify their own boards.
On the firmware side, the system runs on FreeRTOS with the Arduino 3.x framework and is developed in C++ using PlatformIO. Its architecture is task-based, allowing concurrent handling of sensor data acquisition, network communication, and web interface updates without blocking the microcontroller.
The firmware features a web dashboard accessible over the local network that offers real-time monitoring, including a waveform analyzer that captures high-resolution voltage and current waveforms per channel. This oscilloscope-like functionality is impressive on a modest embedded platform. The system also supports token-based authentication, OTA firmware updates with MD5 verification and rollback capability, and crash recovery to enhance reliability in production.
Multi-protocol IoT integration and design tradeoffs
EnergyMe-Home supports a broad range of integration protocols, which is notable for a resource-constrained device like the ESP32-S3. It offers a REST API documented with Swagger for ease of integration, MQTT for lightweight pub/sub telemetry, Modbus TCP for industrial compatibility, and InfluxDB clients compatible with both v1.x and v2.x including SSL/TLS support. Additionally, there is integration with AWS IoT Core and a custom Home Assistant component, making it flexible for various smart home setups.
This multi-protocol approach shows a tradeoff between feature richness and firmware complexity. Supporting so many protocols on a single embedded system demands careful resource management and prioritization. The task-based FreeRTOS design helps mitigate this by isolating protocol handling and sensor reading into separate tasks.
The firmware’s codebase is surprisingly clean and well-structured for its scope. It includes mechanisms for OTA with rollback, which is not always standard in DIY projects but critical for long-term maintenance. The captive portal for WiFi setup improves DX by simplifying the initial configuration for end users who may not be comfortable editing configuration files or using serial interfaces.
The waveform analyzer is a standout feature, enabling users to see detailed electrical waveforms through the web UI. This capability typically requires expensive oscilloscopes or specialized hardware, so providing it on an ESP32-S3 platform is a technical accomplishment. The tradeoff here is that continuously high-frequency sampling and waveform processing can be demanding, so it is limited to the main circuit channel, with branch circuits sampled multiplexedly at lower frequency.
Getting started with EnergyMe-Home
The project provides detailed instructions for building and deploying the system:
- Order the PCB: Download the design files from the Schematics folder and order from your preferred PCB manufacturer
- Populate the board: Solder all components using the BOMs in
documentation/pcb/main_board/,documentation/pcb/top_board_1/, anddocumentation/pcb/top_board_2/ - Flash the firmware: Connect a USB-to-UART adapter to the UART pins and flash using PlatformIO
- Configure WiFi: Power on the device and connect to the captive portal to set up WiFi credentials
- Start monitoring: Access the web interface at
http://energyme.local(default credentials: admin/energyme)
The documentation also covers troubleshooting and detailed build instructions, which is essential given the hardware assembly requirements.
Verdict
EnergyMe-Home is a technically solid and thoughtfully designed open-source home energy monitoring system. It offers a rare combination of multi-circuit measurement, multi-protocol IoT integration, and rich features like waveform analysis on a modest embedded platform.
It’s best suited for practitioners comfortable with DIY electronics assembly, embedded firmware flashing, and network configuration. While the hardware assembly and initial setup may present a learning curve, the project’s comprehensive documentation and open licensing make it accessible for hobbyists and professionals alike.
Limitations include the complexity of the hardware build, the resource constraints of the ESP32-S3 that necessitate multiplexing branch circuits at lower sampling rates, and the potential challenges in maintaining and extending the firmware given its feature-rich design.
Overall, for those looking to build a robust, open, and extensible home energy monitor with insights down to waveform level, EnergyMe-Home is worth exploring.
Related Articles
- Waveshare Watch Rust firmware: efficient no_std embedded Rust for ESP32-S3 AMOLED smartwatch — A no_std Rust firmware replacing C/C++ for the Waveshare ESP32-S3 AMOLED smartwatch, achieving >99% CPU sleep with async
- electerm: an Electron-based multi-protocol terminal client with complex dev architecture — electerm is a cross-platform Electron terminal client supporting SSH, SFTP, FTP, and more, notable for its dual-process
- hw-smi: a minimal C++ hardware telemetry monitor using direct vendor APIs — hw-smi is a minimal C++ tool for CPU/GPU telemetry that bypasses OS layers to read metrics directly from vendor APIs. It
- Pulse: AI-powered unified monitoring for Proxmox, Docker, and Kubernetes — Pulse is a Go-based self-hosted dashboard that unifies monitoring for Proxmox, Docker, and Kubernetes. It features AI-dr
- SigNoz: OpenTelemetry-native observability with unified ClickHouse backend — SigNoz is an open-source observability platform that unifies logs, metrics, and traces using ClickHouse as a single data
→ GitHub Repo: jibrilsharafi/EnergyMe-Home ⭐ 248 · C++