A cross-platform Python application that detects Microsoft Teams and Zoom meeting status via window titles and reports to Home Assistant (inspired by RobertD502/TeamsStatusMacOS), and vibe-coded with Claude.
Note: This application currently sends status updates to a specific Home Assistant script (
send_to_led_sign) designed for an MQTT-connected LED sign. Future versions will support updating a Home Assistant helper entity directly, allowing you to use the meeting status in any automation you want.
- Cross-platform support: Windows, macOS, and Linux
- Detects meetings from Microsoft Teams and Zoom
- Executable verification: Only detects meetings from actual Teams/Zoom processes, preventing false positives from other applications with similar window titles
- Reports status to Home Assistant via webhook
- Only sends updates when status changes (not polling Home Assistant constantly)
- Configurable via environment variables or JSON config file
- Python 3.10+
- Home Assistant with a long-lived access token
- Platform-specific requirements:
- Linux:
wmctrlorxdotool - macOS: No additional requirements (uses AppleScript)
- Windows:
pywin32andpsutil(optional, falls back to PowerShell)
- Linux:
git clone https://github.com/thewrz/MeetingStatus.git
cd MeetingStatuspip install -r requirements.txtLinux (Arch/Manjaro):
sudo pacman -S wmctrlLinux (Debian/Ubuntu):
sudo apt install wmctrlmacOS: No additional tools needed.
Windows: The pywin32 and psutil packages are automatically installed from requirements.txt.
- In Home Assistant, click on your profile (lower left corner)
- Scroll down to "Long-Lived Access Tokens"
- Click "Create Token"
- Give it a name and save the token
Create a script in Home Assistant called send_to_led_sign that accepts a JSON payload with text and color fields. The meeting status detector will call this script with:
- In meeting:
{"text": "MEET", "color": "red"} - Not in meeting:
{"text": "FREE", "color": "cyan"}
Copy the example config and edit it:
cp config.example.json config.jsonEdit config.json:
{
"ha_url": "http://your-ha-instance:8123",
"ha_token": "your-long-lived-access-token",
"poll_interval_seconds": 2,
"detectors": ["teams", "zoom"]
}Or use environment variables:
export HA_URL="http://your-ha-instance:8123"
export HA_TOKEN="your-long-lived-access-token"
export MEETING_STATUS_POLL_INTERVAL=2
export MEETING_STATUS_DETECTORS="teams,zoom"python -m meeting_status --once -vpython -m meeting_status --dry-run -vpython -m meeting_status| Option | Description |
|---|---|
-c, --config FILE |
Path to config file |
-v, --verbose |
Enable verbose logging |
--dry-run |
Print status without sending to Home Assistant |
--once |
Run once and exit (don't poll continuously) |
Create ~/.config/systemd/user/meeting-status.service:
[Unit]
Description=Meeting Status Detector
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/MeetingStatus
ExecStart=/usr/bin/python -m meeting_status
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.targetEnable and start:
systemctl --user enable meeting-status
systemctl --user start meeting-statusCreate ~/Library/LaunchAgents/com.meeting-status.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.meeting-status</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python3</string>
<string>-m</string>
<string>meeting_status</string>
</array>
<key>WorkingDirectory</key>
<string>/path/to/MeetingStatus</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>Load the service:
launchctl load ~/Library/LaunchAgents/com.meeting-status.plist- Open Task Scheduler
- Create a new task
- Set trigger to "At log on"
- Set action to run
python -m meeting_statusin the MeetingStatus directory - Enable "Run whether user is logged on or not"
The application polls for visible windows at a configurable interval (default: 2 seconds). For each window, it checks:
- Process verification: The window must belong to an actual Teams or Zoom executable
- Title pattern matching: The window title must match patterns indicating an active meeting
This two-step approach prevents false positives from other applications that might have similar window titles (e.g., a text file named "zoom meeting.txt").
Microsoft Teams patterns:
- "Meeting with" or "Meeting in"
- "Call with"
- Timer showing call duration (e.g., "00:05:23")
Zoom patterns:
- "Zoom Meeting"
- "Zoom Webinar"
When the meeting status changes, the application sends a request to the Home Assistant send_to_led_sign script.
- Support for updating a Home Assistant helper entity (input_boolean or input_select) directly, enabling flexible use in any automation
- Additional meeting application detectors (Google Meet, Webex, etc.)
MIT License - see LICENSE for details.