Let’s start with the homepage of the UI. It’s made in React with Mantine as the component layer. In fact - the frontend was mostly coded by AI, mostly because I did the backend by hand and I’ve coded enough frontends for the year. It’s not public, i

Eiffel Tower Control

Not too long ago, I built a LEGO Eiffel Tower in my apartment and installed a Brickstuff light kit on it. This light kit is extremely impressive by light kit standards - with 500+ LEDs and full Wi-Fi control via WLED via APIs, MQTT, etc etc.

The real Eiffel Tower automatically switches on at sunset and sparkles on the hour until…12 AM in the winter, 1 AM in the summer (but the last sparkle is dark), and 1 AM during the holidays. It’s got a weird schedule that I’m still figuring out. But, I want my LEGO Eiffel Tower to light up just like the actual Eiffel Tower (6 hours behind of course, I don’t need a light show at 11 AM Eastern during the winter).

Eiffel Tower Control solves this problem by being a smart cronjob system. Every night, it generates a list of jobs for the day, determined by which schedule the tower is (supposed) to be on, when sunset is, and using WLED presets that I programmed, can change the lighting of the tower via HTTP.

This control is exposed via another API, which is then consumed by the Eiffel Tower Control frontend so I can see (and control) the cronjob system from my phone, tablet, or laptop.

It’s been a fun, hacky project that controls what is now a centerpiece in my apartment, and makes great use of the premium light kit I bought.

Timeframe: December 2025

 Let’s start with the homepage of the UI. It’s made in React with Mantine as the component layer. In fact - the frontend was mostly coded by AI, mostly because I did the backend by hand and I’ve coded enough frontends for the year. It’s not public, i

Let’s start with the homepage of the UI. It’s made in React with Mantine as the component layer. In fact - the frontend was mostly coded by AI, mostly because I did the backend by hand and I’ve coded enough frontends for the year. It’s not public, it does the trick, and the AI did an okay job (if not for a LOT of coaxing it). I also didn’t pay a dime (thanks Gemini CLI!), so that’s a win in my book.

The first box is Tower Status, which shows if the tower’s cronjob schedule is running, paused, or stopped. The buttons below can pause the schedule until the next day, or stop it entirely and prevent new cronjobs from being generated (useful for vacations, etc). A button to generate cronjobs is present mostly in case job generation screwed up, or if I made a change to job generation and need to redo it for the day.

Below that shows the current preset on the tower (pulled from the WLED controller), and the operating mode. There’s currently a normal and summer operating mode - but this needs refinement since my initial approach doesn’t seem to reflect reality too well (apparently the lights run longer in the evening). Anyway, usually the tower is SUPPOSED to turn off at 11:45 PM, but in the summer, turns off at 1 AM with a final sparkle in the dark until 1:05 AM. Then, Eiffel Tower Control tries to recreate this depending on the time of year.

Below that is the list of upcoming jobs to execute, which includes which preset it’ll be set to, the execution time, and options to pause & delete a specific cronjob.

 At the bottom of the page lists the cronjobs that were executed (anything that isn’t in a scheduled state). The badge will change if a cronjob was paused at execution time, if the job failed, etc.  There are two fields on the backend for scheduled e

At the bottom of the page lists the cronjobs that were executed (anything that isn’t in a scheduled state). The badge will change if a cronjob was paused at execution time, if the job failed, etc.

There are two fields on the backend for scheduled execution time vs actual execution time, this uses the latter, so it’s useful to see if cronjobs are getting executed at the right time.

Screenshot 2025-12-29 at 6.29.17 PM.png
 Next up is the presets page, which is where WLED presets are mapped into system presets for Eiffel Tower Control.  Now, I could’ve relied on the preset system built into WLED, but the Eiffel Tower comes with a lot of very cool (but not very useful t

Next up is the presets page, which is where WLED presets are mapped into system presets for Eiffel Tower Control.

Now, I could’ve relied on the preset system built into WLED, but the Eiffel Tower comes with a lot of very cool (but not very useful to realism) presets loaded by Brickstuff. This is meant to pare that down to a much more manageable list for the context of Eiffel Tower Control.

The five system level presets here are simple enough - and there’s an add preset button in case things change in the future.

 This is what the modal looks like to add a new preset. It’s very similar for editing a preset as well.

This is what the modal looks like to add a new preset. It’s very similar for editing a preset as well.

 For any presets that are non system presets, edit & delete buttons will appear next to the preset.

For any presets that are non system presets, edit & delete buttons will appear next to the preset.

 Finally, this is the system settings page. This is where stuff like the presets used for lighting effects can be configured, the WLED controller IP, and also has controls for system state as well.  Overall, Eiffel Tower Control has been a very fun p

Finally, this is the system settings page. This is where stuff like the presets used for lighting effects can be configured, the WLED controller IP, and also has controls for system state as well.

Overall, Eiffel Tower Control has been a very fun project that I’ll continue working on as I get the lighting schedule down pat!