Presence Light

What should the door light say?

Come on in

No timer — stays until you change it

Take a break

Pauses whatever is running now. When the break ends, your previous status and its remaining time come right back.

Google Calendar

Connected. Nothing on your calendars right now, so the light stays green unless you override it.

All calendars shared into your Google account are included (holidays are ignored). Events with a Zoom or Teams link, or a title starting with "MEETING", turn the bulb red for the scheduled time; everything else goes blue. Any button above overrides the calendar until its timer ends.

Color preview

Today

Building the timeline…

Loading settings…

Connect your Kasa bulbs

TP-Link retired the old Kasa cloud login, so the lights are driven by a tiny helper that runs on a computer on the same Wi-Fi as your bulbs. It watches this dashboard and recolors the bulbs within a few seconds.

  1. Download the agent:
  2. Run pip install python-kasa requests
  3. Run python kasa-agent.py --url /api/public/status

Start it automatically at login

  1. Put the .bat file in the same folder as kasa-agent.py.
  2. Right-click it → Edit, and replace PUT_YOUR_KASA_PASSWORD_HERE with your Kasa password, then save.
  3. Double-click it once to confirm the bulb responds.
  4. Press Win + R, type shell:startup, press Enter.
  5. Right-click the .bat → Copy, then right-click inside the Startup folder → Paste shortcut. It now runs every time you log in.

On a Mac instead? and follow the comments inside it.

Seeing nothing in the terminal? Run python kasa-agent.py --list to see which bulbs it finds, then target one directly with --host 192.168.1.42.

The script now targets your color bulb Busy Light (10.0.0.27) by default, so it skips discovery and the switches entirely. If its IP ever changes, pass --host NEW.IP.ADDRESS.

The dashboard URL is baked into the script, so you can also just double-click kasa-agent.py — the window now stays open and shows what it found. On Windows use py instead of python.

Any device or automation can read your status from /api/public/status.