2026-03-21 01:22:32 +01:00
# Table of Content
2026-03-21 01:20:08 +01:00
2026-03-21 05:57:45 +01:00
1. [What's this project? ](#user-content-whats-this-project )
2. [Web UI ](#user-content-web-ui )
3. [BusyLight Buddy companion app ](#user-content-busylight-buddy-companion-app )
4. [Stream Deck plug-in ](#user-content-stream-deck-plug-in )
5. [BusyLight API ](#user-content-busylight-api )
6. [MuteDeck integration ](#user-content-mutedeck-integration )
7. [Electronic parts ](#user-content-electronic-parts )
8. [Firmware installation ](#user-content-firmware-installation )
9. [3D files - Enclosure ](#user-content-3d-files---enclosure )
10. [Wiring / Soldering ](#user-content-wiring--soldering )
11. [Tools & libs ](#user-content-tools--libs )
2026-03-21 01:22:32 +01:00
# What's this project?
**Let people know if they can bother you with light signals!**
A cheap, simple to build, nice looking and portable DIY **Busy Light ** .
It comes with a with a simplistic but neat **Web UI ** and a simple (but hopefully convenient) **Rest API ** .
2026-03-21 05:57:45 +01:00
| Controlled by Stream Deck with REST API | Light roll |
| --- | --- |
|  |  |
2026-03-21 01:22:32 +01:00
# Web UI
2026-03-21 05:57:45 +01:00
A very simplistic but neat UI is available on port `80` (thanks @nicolaeser ).
2026-03-21 01:22:32 +01:00
Default hostname is `igox-busylight` .
2026-03-21 05:57:45 +01:00
You can try to reach the web UI @ <http://igox-busylight.local>.
2026-03-21 01:22:32 +01:00
2026-03-21 05:57:45 +01:00
| What an neat UI ! 😄 |
| --- |
2026-03-21 01:22:32 +01:00
|  |
2026-03-21 05:57:45 +01:00
# BusyLight Buddy companion app
2026-03-21 01:22:32 +01:00
2026-03-21 05:57:45 +01:00
[BusyLight Buddy ](https://code.igox.org/iGoX/busylight-buddy ) is a free, open-source multiplatform companion app to control your BusyLight from your phone or computer — no browser needed.
2026-03-21 01:22:32 +01:00
2026-03-21 05:57:45 +01:00
Available for **iOS ** , **iPadOS ** , **Android ** , **macOS ** , and **Windows ** .
It features quick status presets, a custom color picker with saveable presets, a brightness slider, and background polling to keep the UI in sync with the device.
# Stream Deck plug-in
You can download a Stream Deck plugin to control your BusyLight:
2026-03-21 01:22:32 +01:00
Or directly from [here ](streamdeck-plugin/README.md ).
# BusyLight API
2026-03-21 05:57:45 +01:00
2026-03-21 01:22:32 +01:00
## End points
2026-03-21 05:57:45 +01:00
2026-03-21 01:22:32 +01:00
| Path | Method | Parameter | Description |
2026-03-21 05:57:45 +01:00
| --- | --- | --- | --- |
2026-03-21 01:22:32 +01:00
| /api/color | POST | `color` JSON object | Set the BusyLight color according to the `color` object passed in the request body. Return a `status` object. |
2026-03-21 05:57:45 +01:00
| /api/color | GET | n/a | Retreive the color currently displayed by the BusyLight. Return a `color` object. |
2026-03-21 01:22:32 +01:00
| /api/brightness | POST | `brightness` JSON object | Set the BusyLight brightness according to the `brightness` object passed in the request body. Return a `status` object. |
| /api/brightness | GET | n/a | Retreive the BusyLight brightness. Return a `brightness` object. |
| /api/status/on | POST / GET | n/a | Light up the BusyLight. White color. Return a `status` object. |
| /api/status/available | POST / GET | n/a | Set the BusyLight in `available` mode. Green color. Return a `status` object. |
| /api/status/away | POST / GET | n/a | Set the BusyLight in `away` mode. Yellow color. Return a `status` object. |
| /api/status/busy | POST / GET | n/a | Set the BusyLight in `busy` mode. Red color. Return a `status` object. |
| /api/status/off | POST / GET | n/a | Shutdown the BusyLight. Return a `status` object. |
2026-03-21 05:57:45 +01:00
| /api/status | GET | n/a | Retreive the current BusyLight status. Return a `status` object. |
| /api/blink | POST | `blink` JSON object | Make the BusyLight blink. Preserves current color, status and brightness. Return a `status` object. |
| /api/blink | GET | n/a | Retrieve the current BusyLight blink status. Return a `blink` object. |
| /api/blink/stop | POST | n/a | Stop the BusyLight blinking and restore previous state. Return a `status` object. |
| /api/debug | GET | n/a | Retreive the full BusyLight status. |
2026-03-21 01:22:32 +01:00
## JSON objects
2026-03-21 05:57:45 +01:00
2026-03-21 01:22:32 +01:00
### `color` object
2026-03-21 05:57:45 +01:00
```json
2026-03-21 01:22:32 +01:00
{
"r": 255,
"g": 0,
"b": 127,
"brightness": 0.5
}
```
2026-03-21 05:57:45 +01:00
`r` : RED color | integer | [0 .. 255]
`g` : GREEN color | integer | [0 .. 255]
`b` : BLUE color | integer | [0 .. 255]
`brightness` : LED brightness (optional) | float | [0.0 .. 1.0]
2026-03-21 01:22:32 +01:00
### `brightness` object
2026-03-21 05:57:45 +01:00
```json
2026-03-21 01:22:32 +01:00
{
"brightness": 0.5
}
```
2026-03-21 05:57:45 +01:00
`brightness` : LED brightness | float | [0.0 .. 1.0]
2026-03-21 01:22:32 +01:00
2026-03-21 05:57:45 +01:00
### `blink` object
```json
{
"isblinking": true,
"frequency": 2,
"duration": 5.0,
"remains": 3.2
}
2026-03-21 01:22:32 +01:00
```
2026-03-21 05:57:45 +01:00
`isblinking` : whether the BusyLight is currently blinking | boolean
`frequency` : blink frequency | integer | Hz
`duration` : total blink duration | float | seconds | 0 = endless
`remains` : remaining blink time | float | seconds | 0 if endless
### `status` object
```json
2026-03-21 01:22:32 +01:00
{
"status": "<STATUS>"
}
```
2026-03-21 05:57:45 +01:00
`<STATUS>` : `on` | `off` | `available` | `away` | `busy` | `colored` | `blinking`
2026-03-21 01:22:32 +01:00
# MuteDeck integration
2026-03-21 05:57:45 +01:00
2026-03-21 01:22:32 +01:00
The `POST api/mutedeck-webhook` endpoint aims to collect [MuteDeck ](https://mutedeck.com/help/docs/notifications.html#enabling-the-webhook-integration ) webhook callbacks.
It will automatically switch to the BusyLight in:
2026-03-21 05:57:45 +01:00
* busy mode (Red color) when entering a meeting with Mic `ON` **and ** camera `ON` .
* away mode (Yellow color) when entering a meeting with Mic `OFF` **and ** camera `ON` .
* away mode (Yellow color) if the mic is muted during a meeting.
* available mode (Green color) when exiting/closing a meeting.
| MuteDeck Configuration |
| --- |
2026-03-21 01:22:32 +01:00
|  |
# Electronic parts
2026-03-21 05:57:45 +01:00
| Parts | Links (Amazon - not affiliated) |
| --- | --- |
| Micro-controler | [D1 ESP32 Mini NodeMCU ](https://www.amazon.fr/dp/B0CDXB48DZ ) - USB C version |
| Led rings (x2) | [AZDelivery 5 x LED Ring 5V RGB compatible avec WS2812B 12-Bit 38mm ](https://www.amazon.fr/dp/B07V1GGKHV ) |
| Battery | [Anker PowerCore 5000mAh ](https://www.amazon.fr/dp/B01CU1EC6Y ) |
| USB A to USB C adapter | [USB A to USB C adapter ](https://www.amazon.fr/dp/B0BYK917NM ) |
2026-03-21 01:22:32 +01:00
# Firmware installation
2026-03-21 05:57:45 +01:00
**(1)** Flash your ESP32 with [Micropython ](https://micropython.org/download/ESP32_GENERIC/ ) **v1.24.1 ** .
2026-03-21 01:22:32 +01:00
2026-03-21 05:57:45 +01:00
**(2)** Install [microdot ](https://microdot.readthedocs.io/en/latest/index.html ) **v2.0.6 ** library on the ESP32. This can easily be done using [Thonny ](https://thonny.org ):
2026-03-21 01:22:32 +01:00
2026-03-21 05:57:45 +01:00
| Tools > Manage plug-ins | lib selection |
| --- | --- |
2026-03-21 01:22:32 +01:00
|  |  |
2026-03-21 05:57:45 +01:00
> ⚠️ **Compatibility note:** MicroPython v1.27 is **not compatible** with Microdot due to breaking changes in the underlying ESP-IDF v5.5. Use MicroPython **v1.24.1** with Microdot **v2.0.6**.
2026-03-21 01:22:32 +01:00
**(3)** Edit the `WIFI Configuration` section in the [boot.py ](ESP32/boot.py ) file.
2026-03-21 05:57:45 +01:00
**(4)** Copy the content of [ESP32 ](ESP32 ) folder with the modified `boot.py` file to the root of your ESP32 file system. Again, can easily be done using [Thonny ](https://thonny.org ):
2026-03-21 01:22:32 +01:00

**Done!**
# 3D files - Enclosure
2026-03-21 05:57:45 +01:00
All the required 3D files (STLs and f3d project) to 3D print the enclosure are available in the [3D-files-to-print ](3D-files-to-print ) folder.
2026-03-21 01:22:32 +01:00

# Wiring / Soldering

You can see a final assembly image [here ](3D-files-to-print/README.md ).
# Tools & libs
## Thonny
2026-03-21 05:57:45 +01:00
<https://thonny.org>
2026-03-21 01:22:32 +01:00
## Micropython
2026-03-21 05:57:45 +01:00
<https://micropython.org>
2026-03-21 01:22:32 +01:00
## Microdot
2026-03-21 05:57:45 +01:00
<https://microdot.readthedocs.io/en/latest/index.html>
2026-03-21 01:22:32 +01:00
## JSColor
2026-03-21 05:57:45 +01:00
<https://jscolor.com>