⚙️ Technical Overview
Complete technical reference for the Forest of Light installation. This document explains how every system interconnects, from the master scheduler to individual LED pixels. Written for anyone who needs to operate, troubleshoot, or take over the installation.
Contents
Nightly startup/shutdown sequence
Full signal flow diagram
HA, Node-RED, Chataigne
LED sequence delivery
Chataigne DMX output
MadMapper + projectors
4 LaserCubes via MIDI + 4 KeoBin LA300 party lasers
Router, switches, Tailscale
All 8 protocols explained
What happens at 17:00
What happens at 21:30
Every device, IP, role
Common questions answered
1. How the Show Runs
The Forest of Light is a fully automated outdoor light and projection installation. Every night, Home Assistant triggers the entire show at 17:00 and shuts it down at 21:30. No human intervention is required for normal operation.
The Three Layers
The system is organized into three conceptual layers:
2. System Architecture
This diagram shows how every major system connects. Follow the arrows to trace any signal from trigger to physical output.
3. Control Layer
Three applications work together on the control layer. All three run on forest-mac1 (10.50.0.30), except Home Assistant which runs on a separate device (10.50.0.219).
| System | Host | Role | Key Integrations |
|---|---|---|---|
| Home Assistant | 10.50.0.219 | Master scheduler. Triggers all systems at 17:00 and 21:30. Monitors FPP device status via REST API (3-second polling). Sends projector service alerts to iPhone. | Node-RED (WS API), Govee (WiFi/LAN), Mobile App (push notifications) |
| Node-RED | forest-mac1 10.50.0.30 |
Integration bridge. Receives HA switch commands and translates them into FPP API calls, WebSocket messages to Macs, OSC messages to Chataigne, and TCP commands to the projector. Also hosts the network performance dashboard. | HA (WS API), Chataigne (OSC + WS), FPP (HTTP), Mac2/3/4 (WS 8080), Projector (TCP 10000), MadMapper (OSC 9090) |
| Chataigne | forest-mac1 10.50.0.30 |
Show control engine. Outputs DMX Art-Net to 13 zones, controls the Epson projector via TCP, triggers lasers via MIDI, and manages WebSocket communication. | Node-RED (WS + OSC), Art-Net nodes (.140-.154), Projector (TCP), MIDI (LaserCubes) |
How They Connect
/0, NOT /on. The /on trigger is defined but not connected to anything. Sending /on to the WebSocket server will do nothing.
4. Pixel Layer (FPP + NDB)
The pixel layer is responsible for all individually-addressable LED installations. It uses a two-tier architecture:
Tier 1: FPP Players (Sequence Playback)
Falcon Player (FPP) runs on 10 devices (5 Intel NUCs running Debian, 5 Raspberry Pis). Each FPP player is assigned to a zone and plays pre-rendered LED sequences (.fseq files). Sequences are triggered via Command Presets called by Node-RED over HTTP.
| Device | IP | Platform | Zone | Protocol Out |
|---|---|---|---|---|
| forest-pix1 | 10.50.0.11 | Debian NUC | Flowers | DDP |
| forest-pix2 | 10.50.0.12 | Debian NUC | Fire | DDP |
| forest-pix3 | 10.50.0.13 | Raspberry Pi | Mushrooms | DDP |
| forest-pix4 | 10.50.0.14 | Debian NUC | Huts | DDP |
| forest-pix5 | 10.50.0.15 | Debian NUC | Spring | DDP |
| forest-minipix1 | 10.50.0.20 | Raspberry Pi | Clocks | DDP |
| forest-minipix2 | 10.50.0.21 | Raspberry Pi | Rain | DDP |
| forest-minipix3 | 10.50.0.22 | Raspberry Pi | Garden Centre | DDP |
| forest-minipix5 | 10.50.0.24 | Raspberry Pi | Monsters | DDP |
| forest-minipix7 | 100.73.248.94 | Raspberry Pi | Sundial (remote) | DDP |
Tier 2: NDB Controllers (Pixel Output)
NDB controllers are custom ESP32-based LED drivers that receive DDP data from FPP players over Ethernet and output pixel data to WS2811/WS2812B LED strips. 27 are currently active across 9 zones, with IPs ranging from 10.50.0.50 to 10.50.0.84.
5. DMX Layer (Art-Net)
The DMX layer runs independently from the pixel layer. Chataigne outputs Art-Net (DMX over UDP) directly to 13 PKnight CR041R Art-Net nodes, which convert the data to DMX512. Each node feeds an ADJ DP-415R 4-channel dimmer/switch pack that simply switches mains power on or off to the connected fixtures. This is not intelligent lighting control β there is no colour or intensity modulation. Each zone is either fully on (DMX value 250, or 249 for Father Time) or fully off (value 0 or 1).
All modules use Universe 1 except Welcome (DMX6) which uses Universe 3 (also reachable via Node-RED sACN). The ON state sets each zone to DMX value 250 (Father Time uses 249). The OFF state sets zones to value 0 or 1.
DMX Zone Assignments
| Zone | IP (.1xx) | Fixtures Powered | Notes |
|---|---|---|---|
| DMX1 | .140 | 80 LED hoops (group 1 of 2) | Hoops split across 3 nodes, two channel groups per node |
| DMX2 | .141 | 80 LED hoops (group 2 of 2) | |
| DMX3 | .142 | 80 LED hoops (group 3 of 2) | |
| DMX4 | .143 | Plastic mushrooms, both sides of path | |
| DMX5 | .144 | Umbrellas + light balls (right side of flower path) | |
| DMX6 | .145 | Welcome sign + trees by saloon | Universe 3; also reachable via Node-RED sACN |
| DMX7 | .146 | Red trees + power supply to Fire projector hut | |
| DMX8 | .147 | Light balls (left side of flower path) | |
| DMX9 | .148 | Balls by Father Time | Uses value 249 (not 250) for ON state |
| DMX10 | .149 | Hay bales by garden centre | |
| DMX11 | .150 | Unused / skipped | |
| DMX12 | .151 | Unused / skipped | |
| DMX13 | .152 | 4Γ KeoBin LA300 party lasers aimed at disco ball | No intelligent control β switch on/off only |
| DMX14 | .153 | Green trees / stem by the doors | |
| DMX15 | .154 | Green trees by forest entrance |
See the DMX Art-Net Nodes page for the full node list and zone assignments.
6. Projection Layer
Three projectors display mapped content onto physical surfaces. All three run MadMapper 6.0.2 for projection mapping on separate Mac Minis.
| Projector | Mac | Software | Project | Surfaces | Output |
|---|---|---|---|---|---|
| Epson DHT8000 (10.50.0.5) | forest-mac2 | MadMapper | Butterfly-v6 | 9 (Wings, Quads, Lines) | Video |
| Optoma UHD50X (Flower) | forest-mac3 | MadMapper | Flowers | 7 (Masks, Quads) | Video + Laser |
| Optoma UHD50X (Fire) | forest-mac4 10.50.0.33 | MadMapper 6.0.2 | Fire | 5 (Quad-4, Monster2, Monster1, Group-1 [contains Quad-1, Quad-2]) | Video only (no laser) |
All three projection Macs (Mac2, Mac3, Mac4) run a local Chataigne instance for scheduled reboots. Mac2 and Mac3 additionally handle laser control:
- Mac2:
Projector.noisetteβ Scheduled reboot at 16:45 to refresh HDMI handshake to Epson projector. Handles LC1 laser via MIDI. - Mac3:
flower.noisetteβ Scheduled reboot at 14:30. Handles LC2 laser via MIDI. - Mac4:
Fire.noisetteβ Minimal config (OS module + WebSocket Server only, single reboot action). Scheduled reboot at 16:30 (DecβFeb 5), changed to 17:00 (Feb 6+). No laser connected.
Mac4 (Fire) spec differences: Mac4 runs at 1920Γ1080 / 30 fps (not 4K/60fps like Mac2 and Mac3). The player is FFMPEG Player (CPU) and the timeline mode is Conductor (not Scenes & Cues). Media files: fire-2025-10-16-05-05-22-ut.mov (1920Γ1080, 30fps, MPEG codec), _fire loop 1.mov, _fire loop 2.mov.
MadMapper sends OSC telemetry (play state, project name, FPS, output status) to Node-RED on UDP port 9090. If no message is received within 8 seconds, MadMapper is considered offline.
7. Laser Layer
The laser layer has two distinct types of units β 8 laser units total:
- 4 Wifi LaserCube 2.5W β intelligent, MIDI-controlled, full pattern/animation support.
- 4 KeoBin LA300 party lasers β non-addressable, powered via DMX13 (.152) through an ADJ DP-415R switch pack. These are aimed at a disco ball and have no intelligent control; they are simply switched on or off.
LC1 (Butterfly) is controlled by Mac2 via USB Ethernet dongle (10.0.0.x). LC2 (Flower) is controlled by Mac3 via USB Ethernet dongle (192.168.1.x). LC3 and LC4 (Saloon) are controlled directly by Mac1 (main Chataigne) via WiFi on the main 10.50.0.x network. All LaserCube units run firmware 0.23 at 30,000 pps DAC rate.
| LaserCube | Location | Controlled By | IP | Connection | MIDI | Interlock |
|---|---|---|---|---|---|---|
| LC1 | Butterfly | forest-mac2 | 10.0.0.10 | USB ETH (10.0.0.x) · Ethernet Server | C2 toggle, D0 ILDA pattern | Enabled |
| LC2 | Flower | forest-mac3 | 192.168.1.1 | USB ETH (192.168.1.x) · Ethernet Server | C1 toggle, D1 animation, E1 timeline | Enabled |
| LC3 | Saloon | forest-mac1 | 10.50.0.192 | WiFi (main network) · Ethernet Client | C0 toggle | Disabled |
| LC4 | Saloon | forest-mac1 | 10.50.0.193 | WiFi (main network) · Ethernet Client | Via LC3 | Enabled |
KeoBin LA300 Party Lasers (Disco Ball)
Four KeoBin LA300 party lasers are aimed at a disco ball. They have no network address and no intelligent control β they are powered by the ADJ DP-415R connected to DMX13 (.152). When Chataigne sets DMX13 to 250, the switch pack supplies mains power to all four units and they turn on automatically. They turn off when DMX13 is set to 0.
8. Network Infrastructure
All devices operate on the 10.50.0.x subnet via a TP-Link Archer BE230 router (10.50.0.1). Internet is provided by Starlink via DHCP (192.168.1.x). Two Wavlink AX3000 WiFi extenders (MeshLink) extend coverage.
| IP Range | Device Type | Count |
|---|---|---|
| .1 | Router | 1 |
| .5 | Epson DHT8000 Projector | 1 |
| .11 – .15 | FPP NUCs (pix1-5) | 5 |
| .20 – .24 | FPP RPis (minipix1-5) | 5 |
| .30 – .33 | Mac Minis | 4 |
| .50 – .84 | NDB Controllers | 35 (27 active) |
| .90 – .99 | Govee Aurora Panels | 10 |
| .100 – .101 | IP Cameras | 2 |
| .140 – .154 | DMX Art-Net Nodes | 13 |
| .192 – .193 | LaserCubes (Saloon) | 2 |
| .200 – .201 | MeshLink WiFi Extenders | 2 |
| .209, .219, .247 | Cameras + HA | 3 |
| .225 – .228 | Music Players | 4 |
Tailscale VPN — Remote Access
All 19 Forest devices run Tailscale for remote access via the opossum-mamba.ts.net tailnet. This allows full remote management from any Tailscale-connected device (laptop, phone, iPad) without port forwarding or exposing services to the internet.
| Feature | Details |
|---|---|
| Tailnet | opossum-mamba.ts.net |
| Subnet Router | Home Assistant (100.80.122.83) advertises 10.50.0.0/24 |
| Exit Node | Home Assistant — routes all traffic through the Forest network |
| Devices on Tailscale | 19 (4 Macs, 5 NUCs, 5 RPi players, 4 Music, 1 PatchBox) |
| Remote Device | Sundial (forest-minipix7) at 100.73.248.94 — only reachable via Tailscale |
ssh forestoflight@forest-mac1.opossum-mamba.ts.net) or local IP (e.g., http://10.50.0.30:1880 for Node-RED). Because Home Assistant acts as a subnet router, the entire 10.50.0.x network is accessible remotely — including devices that don't run Tailscale themselves (NDB controllers, DMX nodes, Govee panels, cameras).
See the Network Map for an interactive visual layout and the Network Devices page for full device details including all Tailscale IPs.
9. Protocol Reference
| Protocol | Transport | Used For | Source → Target |
|---|---|---|---|
| DDP | UDP | Pixel data from FPP to NDB controllers | FPP Players → NDB ESP32 |
| Art-Net | UDP | DMX data from Chataigne to lighting nodes | Chataigne → PKnight CR041R |
| WebSocket | TCP | Control commands between systems | Node-RED ↔ Chataigne, HA, Mac2/3/4 |
| TCP | TCP | Projector serial control | Chataigne → Epson (10.50.0.5:10000) |
| MIDI | USB | Laser trigger commands | Chataigne (Mac2/Mac3) → LaserCubes |
| OSC | UDP | Show state commands and telemetry | Node-RED → Chataigne (port 8000), MadMapper → Node-RED (port 9090) |
| REST/HTTP | TCP | FPP command presets and status polling | Node-RED → FPP, HA → FPP (3s poll) |
| MQTT | TCP | Remote device status (Sundial) | Sundial → MQTT Broker → HA |
10. What Happens at 17:00 (Startup)
When the clock hits 17:00, Home Assistant fires 4 automations simultaneously. Here's the cascade:
| Step | System | What Happens | Physical Result |
|---|---|---|---|
| 1 | HA | Turns on switch.nodered_8fc961d23470e091 (Forest Power) | — |
| 2 | Node-RED | Receives switch event, sends HTTP to all 10 FPP players: /api/command/Trigger%20Command%20Preset%20Slot/1 | FPP starts playing show sequences |
| 3 | Node-RED | Sends OSC /MasterStates/AllOn (value 1) to Chataigne on localhost:8000 | — |
| 4 | Node-RED | Sends WS message ON to forest-mac1:8080 | — |
| 5 | Chataigne | Receives WS /0 trigger, activates ALL ON state, sets 13 DMX zones to 250 | All DMX fixtures illuminate |
| 6 | HA | Turns on switch.nodered_d925137e9134a539 (DMX Power) | Art-Net output relay enabled |
| 7 | HA | Turns on input_boolean.butterfly_wings | — |
| 8 | Node-RED | Detects wings boolean change, sends WS /wingsOn to Chataigne | — |
| 9 | Chataigne | Sends TCP 0000\r (handshake) then C00\r (power on) to Epson projector | Epson projector powers on |
| 10 | Chataigne | Broadcasts ProjectorOn to all WS clients | — |
| 11 | HA | Turns on all 3 laser input_booleans | — |
| 12 | Node-RED | Sends WS laser to Mac2 and Mac3 | — |
| 13 | Chataigne (Mac2/3) | Fires MIDI Note On to LaserCubes | All 4 lasers arm and start patterns |
| 14 | HA | Turns on lights in "treeline" area | 10 Govee Aurora panels illuminate |
| 15 | FPP | Sequences play, sending DDP data to NDB controllers | All LED pixel installations animate |
| 16 | MadMapper | Already running on Mac2/Mac3/Mac4, projecting mapped content | Butterfly wings, flower, and fire projections visible |
Total time from trigger to full show: approximately 5–10 seconds for all systems to reach steady state. The Epson projector takes the longest (3-second TCP handshake delay).
11. What Happens at 21:30 (Shutdown)
The reverse process. HA fires 4 automations that cascade through the same systems:
| Step | Action | Result |
|---|---|---|
| 1 | HA turns off Forest Power + DMX Power switches | Node-RED sends FPP Preset Slot 2 (ALL OFF) + OSC AllOff to Chataigne |
| 2 | Chataigne sets all DMX zones to 0/1 | All DMX fixtures go dark |
| 3 | FPP players stop sequences | NDB controllers receive no more DDP data, LEDs go dark |
| 4 | HA turns off butterfly_wings | Chataigne sends TCP C01 to power off Epson projector |
| 5 | HA turns off all 3 laser booleans | LaserCubes disarm |
| 6 | HA turns off treeline lights | Govee Aurora panels turn off |
12. Device Inventory Summary
| Category | Count | Devices |
|---|---|---|
| Networking | 4 | 1 router (Archer BE230), 2 MeshLink WiFi extenders, 1 Starlink |
| Control Macs | 4 | Mac1 (Chataigne/Node-RED), Mac2 (Butterfly), Mac3 (Flowers), Mac4 (Fire) |
| FPP Players | 10 | 5 Debian NUCs (pix1-5), 5 Raspberry Pis (minipix1-3, 5, 7) |
| NDB Controllers | 27 active | ESP32-based LED drivers, 10.50.0.50–.84 |
| DMX Nodes | 13 | PKnight CR041R Art-Net nodes, 10.50.0.140–.154 |
| Dimmer Packs | 13 | ADJ DP-415R 4-channel dimmer/switch packs (one per DMX zone) |
| Projectors | 3 | 1 Epson DHT8000 (10.50.0.5), 2 Optoma UHD50X (Flower + Fire, HDMI only) |
| Lasers | 8 | 4 LaserCubes (LC1 Butterfly, LC2 Flower, LC3+4 Saloon) + 4 KeoBin LA300 party lasers (disco ball, via DMX13) |
| Govee Panels | 10 | Govee H7070 Aurora panels (10.50.0.90–.99) |
| Audio | 4 | Music1-4 Raspberry Pis (10.50.0.225–.228) |
| Cameras | 4 | IP cameras at .100, .101, .209, .247 |
| Other | 2 | Home Assistant (10.50.0.219), PatchBox/Monster Voice (.192) |
13. Frequently Asked Questions
- Check Home Assistant is running and reachable at 10.50.0.219
- Check the Automations page in HA — are the "Turn On" automations enabled?
- Check Node-RED is running on forest-mac1 (http://10.50.0.30:1880)
- Try manually toggling the Forest Power switch in HA
- If FPP players aren't responding, check network connectivity (can you ping 10.50.0.11?)
- Check the specific FPP player for that zone (see the device table above for IP mapping)
- Open the FPP web UI at
http://10.50.0.XX— is it showing "playing"? - Check HA sensors — does the zone show "playing" or "offline"?
- If the FPP player is online but LEDs are dark, the NDB controller may have lost power or network. Check the NDB's IP (10.50.0.50–.84 range)
- If only some pixels in a zone are dark, it's likely a physical wiring issue (data line or power supply)
- Check the projector: Is the Epson powered on? Try pinging 10.50.0.5
- Check HDMI: The most common issue is a lost HDMI handshake. Reboot forest-mac2 (or wait for the scheduled 16:45 reboot)
- Check MadMapper: Is it running on Mac2? Is the "Butterfly-v6" project open and playing?
- Check HA: Is
input_boolean.butterfly_wingsturned on? - Manual projector control: Send TCP commands via Node-RED — the projector flow has manual ON/OFF buttons on the dashboard
Open the Home Assistant dashboard and toggle these switches:
- Forest Power — controls all FPP players and DMX
- DMX Power — enables Art-Net output
- Butterfly Wings — enables/disables the projection
- Laser toggles — individual laser on/off
- Govee Auroras — controlled via the "treeline" area in HA
Alternatively, you can use the Node-RED dashboard at http://10.50.0.30:1880/dashboard
- Mac1 (Chataigne/Node-RED): SSH to
forestoflight@10.50.0.30and runsudo reboot. Warning: this will restart both Chataigne and Node-RED. - Mac2 (Butterfly): Use the HA button "Reboot Forest" or send WebSocket message "reboot" via Node-RED. Mac2 also reboots daily at 16:45 automatically.
- Mac3 (Flowers): Use the HA "Flower Projector" button or send WS "reboot". Reboots daily at 14:30.
- Mac4 (Fire): Use the HA "Fire Projector" button or send WS "reboot". Mac4 also reboots daily at 16:30 (DecβFeb 5) or 17:00 (Feb 6+).
- If a Mac is completely frozen, you'll need physical access to hold the power button.
DDP (Distributed Display Protocol) is used for pixel-level LED control. It sends raw channel data from FPP players to NDB controllers over UDP. It's optimized for high pixel counts (thousands of individually-addressable LEDs).
Art-Net is used for DMX fixture control. It sends DMX512 data from Chataigne to PKnight nodes over UDP. It's designed for traditional lighting fixtures (dimmers, moving heads, LED pars) with 512 channels per universe.
In the Forest of Light, DDP handles the addressable LED installations (mushrooms, flowers, rain, etc.) and Art-Net handles the DMX fixtures (hoops, umbrellas, red trees, etc.).
This is a common source of confusion:
/0— ALL ON. Sets all 13 DMX zones to 250. This is the actual trigger for turning lights on./off— ALL OFF. Sets all zones to 0 or 1./on— Does nothing. It's defined in the WebSocket server but not connected to any action. Do not use it./1— Does nothing. Also defined but unused.
The naming is counterintuitive (/0 = ON, /on = nothing), but this is how the Chataigne config is wired.
Mac2 has a USB Ethernet dongle creating a private 10.0.0.x network for LC1 (Butterfly, at 10.0.0.10). Mac3 has a USB Ethernet dongle creating a private 192.168.1.x network for LC2 (Flower, at 192.168.1.1). These private links provide low-latency control separate from the main network.
LC3 and LC4 (Saloon lasers) connect via WiFi on the main 10.50.0.x network (10.50.0.192 and .193). They do not use USB Ethernet.
Laser patterns are triggered via MIDI Note On messages from Chataigne. Mac2 uses Octave 2, Mac3 uses Octave 1.
- Chataigne (Mac1):
ForestofLigttDMX.noisette - Chataigne (Mac2):
Projector.noisette - Chataigne (Mac3):
flower.noisette - Chataigne (Mac4):
Fire.noisetteβ minimal config (OS + WebSocket Server modules, single reboot action) - MadMapper (Mac2):
Butterfly-v6project file - MadMapper (Mac3):
Flowersproject file - MadMapper (Mac4):
Fireproject file (1920Γ1080 / 30fps, FFMPEG Player CPU, Conductor timeline) - Node-RED (Mac1): Flows accessible at
http://10.50.0.30:1880 - Home Assistant:
configuration.yaml+automations.yamlat 10.50.0.219 - FPP Players: Web UI at
http://10.50.0.XXfor each player
The show is fully local and does not depend on internet connectivity. All control, sequencing, and output happens on the local 10.50.0.x network. The Starlink connection is only used for:
- Remote access (SSH, web UIs)
- Push notifications (projector alerts to iPhone)
- The Sundial remote device (Tailscale VPN)
If Starlink goes down, the show continues normally. You just can't access systems remotely or receive notifications.
New FPP Player:
- Flash FPP onto an SD card (RPi) or install on a NUC
- Assign a static IP in the 10.50.0.x range
- Upload sequences and configure playlists via the FPP web UI
- Add the device to Node-RED's FPP Command Presets flow (add a new HTTP request node)
- Add REST sensors in Home Assistant's
configuration.yaml
New NDB Controller:
- Flash the NDB firmware onto an ESP32
- Configure with a static IP in the 10.50.0.50–.84 range
- Configure it as a DDP output in the parent FPP player's channel output settings
- Wire the data output to WS2811/WS2812B LED strips
- Mac2 at 16:45 — Refreshes the HDMI handshake to the Epson projector. Without this, MadMapper may output video but the projector won't display it (lost HDMI negotiation).
- Mac3 at 14:30 — Ensures a clean state before the show. Earlier than Mac2 because it doesn't have the HDMI handshake issue.
- Mac4 at 16:30 / 17:00 — Ensures a clean state for the Fire projector (Optoma UHD50X). Originally set to 16:30 (DecβFeb 5); changed to 17:00 from Feb 6 onward. Mac4 had 142 total reboots during the season, with 89 clean operational nights, 20 issue nights (81.7% reliability excluding scheduled reboots); worst single day was Dec 18 with 3 unexpected reboots.
All three are managed by local Chataigne instances (Projector.noisette, flower.noisette, Fire.noisette) using the Time module. They fire before or at show hours (17:00) so the Macs are fully booted and applications loaded by showtime.
| System | URL / Access |
|---|---|
| Home Assistant | http://10.50.0.219:8123 |
| Node-RED Editor | http://10.50.0.30:1880 |
| Node-RED Dashboard | http://10.50.0.30:1880/dashboard |
| FPP Player (any) | http://10.50.0.XX (replace XX with device IP) |
| Chataigne | GUI app on forest-mac1 desktop (VNC or physical access) |
| MadMapper | GUI app on forest-mac2/mac3/mac4 desktop (VNC or physical access) |
| Router | http://10.50.0.1 |
The PatchBox is a Raspberry Pi running PatchBox OS at 10.50.0.192. It functions as the Monster Voice Changer — a real-time audio effects processor. It's part of the Monsters zone installation.