An Indigo plugin for Zengge WiFi LED controllers — the ones sold under Magic Home, Magic Hue, FVTLED, LEDENET and a dozen other names, and set up with the Magic Home Pro app.
It talks to them directly on your own network. No cloud account, no app running in the background, no credentials to store anywhere.
These lights come in two incompatible kinds, and only one of them is reachable from Indigo.
Turn Bluetooth off on your phone, stay on your home wifi, and open the Magic Home app.
- The lights still work → a wifi controller. This plugin will drive it.
- The app cannot find them → a Bluetooth-only controller. This plugin cannot reach it, and nor can any other Indigo plugin. Nothing on your network can see it, because it is not on your network.
Some recent Zengge hardware — the
LEDnetWFfamily and various BL602-based controllers — dropped the wifi protocol entirely. There is no setting to turn it back on and no workaround.
- A native Indigo dimmer device, so the standard brightness slider and colour picker just work, along with everything that already understands a dimmer — control pages, triggers, schedules, HomeKit bridges, Alexa.
- Discovery by MAC address, so a controller keeps working when your router hands it a different IP.
- The controller's own 20 built-in patterns, and custom patterns of up to 16 colours that the controller stores and cycles by itself.
- Plugin-driven effects the controller cannot do on its own: smooth fades, slow colour drift around a palette, and a sunrise that climbs a perceptual ramp rather than a straight line.
Any controller that answers on TCP 5577 — bulbs, strip controllers and the deck-light controllers sold with kits. The plugin reads the model the controller reports and adjusts what it sends.
Developed against a FVTLED / Zengge RGBW controller (hardware AK001-ZJ21413, model byte 0x06, firmware v4). Other models are supported from a table of known types; an unrecognised one is driven with the common message shape and says so in the log rather than pretending it was recognised.
Bluetooth-only controllers are not supported — see the check at the top. If your lights only answer over Bluetooth they are not on your network at all, so there is nothing for this plugin to talk to.
An RGBW controller has one white channel, and it is the warm one. What the app offers as "cool white" is red, green and blue driven together — there is no second white channel to address. The plugin does the same thing, and gives you both as separate actions so you can pick.
The two are mutually exclusive on this hardware: the fixture shows its colour channels or its white one, never both. Asking for both applies whichever you evidently wanted, and says so once in the log.
- Go to the Releases page and download
MagicHome.indigoPlugin.zip - Unzip the downloaded file — you will get
MagicHome.indigoPlugin - Double-click
MagicHome.indigoPlugin— Indigo will install it automatically
- Plugins -> MagicHome -> Discover Controllers. Every controller on your network answers with its address, and they are listed in the Indigo log.
- New Device -> MagicHome -> Magic Home Light.
- Leave the finding method on Discovery and pick your controller from the list. It is named by the last six characters of its MAC address, the same way the Magic Home app names it.
- Save. The device fills in straight away.
- Optional, but worth it: Plugins → MagicHome → Configure, pick the light and press Run Demo. It runs through the three colour channels one at a time, both whites and a fade, then puts the light back exactly as it was — about fifteen seconds. Showing the channels separately is how you spot a strip wired in a different order, and showing both whites is how the warm/cool business stops being a surprise.
The controller must be on the same subnet as your Indigo server for discovery to find it. If you would rather pin an address, switch to A fixed IP address — but give the controller a DHCP reservation on your router first, or the device will stop working the day its lease changes.
| Action | What it does |
|---|---|
| Set Warm White | Drives the dedicated white channel |
| Set Cool White | Drives red, green and blue together, as the app does |
| Run Built-in Pattern | One of the controller's own 20 patterns, at a speed you choose |
| Load Custom Pattern | Up to 16 colours, stored in the controller and cycled by it |
| Fade To Colour | A smooth fade over as long as you like |
| Start Colour Drift | Wanders around a palette, holding each colour and crossfading |
| Start Sunrise | Ember to daylight over minutes, on a perceptual ramp |
| Flash | A short attention-getter that puts the previous colour back |
| Stop Effect | Stops a plugin-driven effect and leaves the lights be |
Palettes are written as R,G,B triples separated by a slash — 255,140,60 / 200,60,120 / 60,90,200.
The built-in patterns run on the controller. Fire one and the network goes quiet — nothing further crosses it, and they carry on through an Indigo restart. They are also strobes and hard jumps, which suit a party rather than a shelf.
The plugin effects are computed here and streamed as ordinary colour commands. They can be as slow and as smooth as you want — a twenty-second crossfade, a fifteen-minute sunrise — at the cost of a steady trickle of traffic while they run, and they stop if the plugin does.
Any manual command stops a running effect, so grabbing the brightness slider always wins.
| Setting | Default | Notes |
|---|---|---|
| Poll interval | 15s | How often each controller is asked what it is doing |
| Look for controllers at startup | on | |
| Re-check addresses | 15 min | Finds a controller its DHCP lease has moved |
| Effect smoothness | 20/sec | Measured ceiling is about 40; above 25 commands start being dropped |
| Debug logging | off |
The Configure dialog also carries a Run Demo button, and there is a Run Demo item in the plugin's menu that demos every light you have.
Worth knowing if you are ever debugging it.
- TCP 5577 carries commands and state. There is no authentication of any kind, so anything on your network can drive the lights. That is an argument for keeping these controllers on an IoT VLAN.
- UDP 48899 is discovery. A broadcast of
HF-A11ASSISTHREADmakes every controller answer with its IP, MAC and hardware id. - Messages are a few bytes with a plain sum as a checksum. A message of the wrong length is not rejected — it is read as a different command. The 9-byte form sent to an 8-byte controller switched a live unit off. The plugin keeps a table of which models take which.
- Controllers push their own state unprompted, wrapped in a
b0 b1 b2 b3header. One reply per request is not a safe assumption, so every state read scans for a frame and checks its checksum rather than trusting what arrives. - Sending a colour to a controller that is off turns it on.
| Protocol reference | The wire protocol, measured against real hardware — framing, commands, state, discovery, model table, and the several places where the published accounts and the controller disagree |
| Architecture | How the plugin is built and why, including the timer-slack problem that shapes the effects engine |
| Scripting | Driving it from Indigo Python, with worked examples |
| Troubleshooting | When it does not do what you expected |
Discovery finds nothing. The controller must be on the same subnet as the Indigo server — a broadcast does not cross a router. Run the sweep again before concluding anything; UDP broadcast on wifi is genuinely lossy.
The device says offline. Compare its address state against what Discover Controllers reports. A device set to discovery heals itself within a minute or two; one pinned to a fixed IP that has moved will not.
Colours are wrong. Strip controllers can be wired in any channel order — a strip wired GRB shows red where you asked for green. That is the wiring, and the Magic Home app has a setting for it.
An effect stutters. Lower the effect smoothness. Commands sent faster than the controller accepts are dropped rather than queued.
The full troubleshooting guide covers the rest.
Vibed into existence by CliveS, who knew what he wanted, argued until he got it, and tested it on a real house. Typed at inhuman speed by Claude (Anthropic), who mostly did as it was told.
© 2026 CliveS · MIT licence — copy it, fork it, bend it, break it, fix it, ship it. If it breaks, you get to keep both pieces.