HomeGenie Smart Light firmware Demo

Open media
The HomeGenie Smart Light is a firmware designed to drive advanced, highly responsive 1D/2D addressable LED systems. Supporting both linear strips and high-density matrices up to 64x64 (4096 pixels) in any physical configuration, it operates natively as a standalone ambient light, a music-reactive visualizer, or a programmable pixel-art display.
The Smart Light Controller relies on compact, modular breakout boards. Each component handles a dedicated role and plugs directly into the custom PCB shield using standard pin headers with zero soldering required during final assembly:

Waveshare ESP32-C3-Zero / ESP32-S3-Zero (with pre-soldered pin headers)
WS2812B 5050 RGB LED 1-Bit module breakout board, NeoPixel 1-LED PCB module
These components are standard, widely produced electronic modules that cost very little. They are readily available on major marketplaces (such as AliExpress, Amazon, or eBay) and can be snapped together in less than 5 minutes, making it an accessible, rewarding DIY build for anyone.
The HomeGenie Smart Light controller board features dedicated sockets to plug in the ESP32 module and the optional RGB LED module, along with a 10 cm cable with a JST connector for connecting an LED strip or matrix.
Assembly is quick and simple: just plug in the two modules and place the board into its translucent 3D-printed enclosure, which uses a completely screwless snap-fit design for easy assembly.
This project also includes a custom 3D-printed enclosure for a 16x16 LED matrix. It is specifically designed to maximize light output while minimizing dark lines between individual pixels.
The internal grid is an independent element positioned a few millimeters behind the front face, creating a subtle, natural diffusion that softens pixel boundaries and eliminates harsh grid shadows.
The enclosure consists of three parts:
Printing all three components takes approximately 4 hours on a Bambu Lab A1 mini using standard settings and white PLA+ filament. To achieve the exact diffusion effect shown in the videos, we recommend using the same filament brand (eSun White PLA+), as translucency can vary significantly between manufacturers.
Assembling the 16x16 LED matrix enclosure is quick, clean, and requires no glue. First, place the light grid inside the front diffuser cover. Next, gently flex the LED matrix so its side edges slide under the retaining tabs, resting flat against the grid while keeping any spare power wires tucked safely inside. Finally, place the back plate on top—making sure the input (DIN) and output (DOUT) cables exit through the dedicated side slots—and secure it firmly with six M2×6 screws.
Once assembled, you have a solid, lightweight display unit ready to connect directly to the Smart Light controller, or to be joined with additional panels for a wider display.
To join two panels side-by-side, place the three 3D-printed brackets across the side holes and secure each bracket with two M2×8 screws (6 screws total). These are 2 mm longer than the standard screws to account for the bracket thickness.
To protect your USB power supply and the controller itself, the firmware includes a configurable Max Power % limiter.
The DIY LED controller kit is physically rated for a maximum current of 3A (3 Amps). When driving a high number of pixels (up to 4096), you must reduce the "Max Power %" setting to ensure the total current draw never exceeds this 3A threshold. To utilize more power (e.g., running massive matrix panels at full white brightness), different hardware capable of handling more than 3A is required.
The 16x16 LED matrix (256 pixels) used in the demonstration examples fits perfectly within these safety limits using standard USB power supplies.
Max LED power % formula:
<power_supply_ampere> / (<number_of_pixels> * <ampere_per_pixel>) * 100 = <max_ampere_perc>
Example: With a 2A power supply and a LED strip of 144 pixels (0.04A each), the limit should be set to 35%:
2 / (144 * 0.04) * 100 = 34.7%

You can explore the system's real-time rendering capabilities and custom scripting engine directly in your browser. Use the interactive LED Matrix Emulator below to preview procedural patterns, browse pre-built pixel art, and upload animations directly to your physical HomeGenie device.
The 3D-printed controller housing and the 16x16 LED matrix frame shown above are ready-to-print, standalone designs—in fact, the controller itself already functions as a compact ambient light.
However, the real strength of HomeGenie lies in its versatility. Because it uses standard addressable LEDs, you are not limited to these default shapes: you can use the exact same controller to bring virtually any custom lamp, lit lithophane, neon-style sign, or decorative fixture to life.
To build custom fixtures or expand your setup, the HomeGenie controller is officially tested and optimized for WS2812B (5V) addressable LEDs. These are the most common, cost-effective, and widely supported digital RGB LEDs on the market.
WS2812B strips and matrices are readily available online and at electronics hobbyist retailers:
In addition to the official 3D-printable files included with this project, you can easily adapt thousands of creative community designs to work with the HomeGenie controller. A well-designed lamp body protects the electronics and diffuses the harsh, pinpoint light of individual LEDs into a soft, uniform glow.
You do not need to design every lamp from scratch. Popular 3D-printing repositories host thousands of free models designed specifically for WS2812B strips and 16x16 matrices.
Use these files to order the PCB and 3D-printed case from manufacturing services such as JLCPCB or PCBWay.
PCB Gerber download REVISION 1
Controller Case 3MF download REVISION 1
16x16 LED matrix casing 3MF REVISION 1Smart Light project files by G-Labs licensed under CC BY-NC 4.0
Before uploading the firmware, set the configuration fields to match your hardware:
If you installed the optional RGB module onto the controller shield:
You can flash the pre-compiled firmware directly to your connected ESP board using the tool below. Select the appropriate target model (e.g., ESP32-C3 or ESP32-S3) and click Create device.
Connect your ESP32/ESP8266 microcontroller to your computer via USB, select your firmware version, and click "Create device" to upload the HomeGenie Mini firmware.
Installing firmware directly from this page works only in browsers with Web Serial API enabled.
First, ensure that you do not have multiple ESP devices connected to your USB ports. Please connect only one device at a time.
If only one device is connected and the firmware uploader still fails to connect (or gets stuck at "Connecting..."), your device might need to be put into Boot Mode manually. (This is often required with development boards such as the classic ESP32-CAM).
START THIS PROCEDURE AFTER THE PORT SELECTION WINDOW APPEARS.Every HomeGenie Mini device includes a built-in Scheduler capable of executing lightweight JavaScript code for customized automation.
You can link multiple devices to control them as a group. For example, adjusting the brightness of a "Main Light" can automatically synchronize the brightness of a "Floor Lamp" and a "Ceiling Light".
In the video below, we demonstrate a simple, zero-code group linking using two preset scheduler tasks.
Alternatively, you can implement a highly optimized, single-task solution using a custom JavaScript action. The script triggers whenever the master light's brightness changes:
$$.boundModules.level = event.valueThe bound devices (boundModules) will automatically copy the master's active level (event.value) in real-time.
The complete source code and individual effect headers are available on GitHub:
In addition to the common Device API, the following modules and API endpoints are implemented by the color-light firmware.
C1 Module (Master Controller)This is the master module that controls all primary LED strip or matrix pixels simultaneously.
HomeAutomation.HomeGenie/C1
Status.Level (Current master brightness level, 0.0 to 1.0. For matrix styles, this dynamically scales the maximum height of the equalizers/waves).Status.ColorHsb (Current master color in HSV format. In music modes, H maps to high frequencies/notes, S maps to mid-frequencies, and V maps to bass/volume).Control.On (Turns all LEDs on to the previous state)Control.Off (Turns all LEDs off)Control.Toggle (Toggles the power state of the LEDs)Control.Level/<level>/<transition_ms> (Sets the master brightness level 0-100)Control.ColorHsb/<h>,<s>,<v>,<transition_seconds> (Sets the master color. Hue, saturation, and brightness are normalized values from 0.0 to 1.0; the optional transition parameter is in seconds).C2 Module (Auxiliary Controller LED)Controls the optional secondary RGB indicator on the controller board.
HomeAutomation.HomeGenie/C2
Control.OnControl.OffControl.ToggleControl.Level/<level>/<transition_ms>Control.ColorHsb/<h>,<s>,<v>,<transition_seconds>| Parameter Name | Description |
|---|---|
Status.Level | Current brightness level of the auxiliary LED (0.0 to 1.0) |
Status.ColorHsb | Current color of the auxiliary LED in HSV format |
LED.mode | Operational mode: status (diagnostic mirror) or independent |
Behavioral note: In status mode, the auxiliary LED mirrors primary animations and network status without triggering continuous module events. In independent mode, the C2 module accepts distinct color and level controls independently of the main LED strip.
L1 ... L<num> Modules (Individual Pixels)These modules control a single, specific LED corresponding to the index number <num>.
HomeAutomation.HomeGenie/L<num>
Status.Level (Current individual LED brightness level, 0.0 to 1.0)Status.ColorHsb (Current individual LED HSV color)Control.OnControl.OffControl.ToggleControl.Level/<level>/<transition_ms>Control.ColorHsb/<h>,<s>,<v>,<transition_seconds>Automation Module (Compiled Script Engine)This module manages the non-blocking execution of the compiled binary bytecode scripting engine.
HomeAutomation.HomeGenie/Automation
Script.Run/<script_text>row:col), region offsets (+length, +width:height rectangles), LEVEL scaling, HSB transitions, and control-flow instructions (#N, #REPEAT, #LOOP).Script.Clear