A lightweight, self-hosted dashboard for monitoring Honeywell Total Connect Comfort (TCC) thermostats. Polls your thermostat on a configurable interval and stores temperature readings in a local SQLite database, then serves a clean web dashboard with live stats and historical charts. Optionally sends Matrix notifications when temperature thresholds are breached.
- Live polling of temperature and heat setpoint from the TCC API
- Real-time dashboard with current stats that auto-refresh via HTMX
- Temperature trend charts for the last 24 hours or 7 days (Chart.js)
- Calendar history view -- click any day to see that day's readings
- Matrix notifications -- get alerted when temperature goes above or below configurable thresholds
- End-to-end encryption -- Matrix bot supports E2EE with auto-accept emoji verification
- SQLite storage with WAL mode for lightweight, zero-config persistence
- Docker Compose deployment -- one command to build and run
-
Clone the repo:
git clone https://github.com/sudoAPWH/TCC-Monitor.git cd TCC-Monitor -
Create your
.envfile:cp .env.example .env
Edit
.envand fill in your TCC credentials and device ID. You can find your device ID in the URL when viewing your thermostat on mytotalconnectcomfort.com. Make sure to setTZto your timezone (e.g.America/Chicago) -- timestamps will show in UTC otherwise. -
Run with Docker Compose:
docker compose up -d
-
Open the dashboard at http://localhost:8080
All configuration is done through environment variables (set in .env):
| Variable | Required | Default | Description |
|---|---|---|---|
TCC_USERNAME |
Yes | -- | Your TCC account email |
TCC_PASSWORD |
Yes | -- | Your TCC account password |
TCC_DEVICE_ID |
Yes | -- | Thermostat device ID |
POLL_INTERVAL |
No | 10m |
How often to poll (Go duration, e.g. 5m, 30s) |
DB_PATH |
No | tcc-monitor.db |
Path to the SQLite database file |
LISTEN_ADDR |
No | :8080 |
Address and port for the web server |
APP_TITLE |
No | TCC Monitor |
Dashboard title shown in the header and browser tab |
TZ |
No | UTC |
Timezone for displayed timestamps (e.g. America/Chicago) |
| Variable | Required | Default | Description |
|---|---|---|---|
MATRIX_HOMESERVER |
No | -- | Matrix server URL (e.g. https://matrix.example.com) |
MATRIX_USERNAME |
No | -- | Bot account username |
MATRIX_PASSWORD |
No | -- | Bot account password |
MATRIX_ROOM_ID |
No | -- | Room ID to send alerts to (e.g. !abc123:example.com) |
MATRIX_PICKLE_KEY |
No | tcc-monitor |
Encryption key for the crypto store |
If MATRIX_HOMESERVER, MATRIX_USERNAME, and MATRIX_PASSWORD are all set, the bot will connect to Matrix and send alerts when thresholds are breached. If any are missing, the app runs normally without notifications.
Thresholds are configured from the Alert Settings section on the dashboard:
- Low Threshold -- alert when temperature drops below this value
- High Threshold -- alert when temperature rises above this value
- Cooldown -- minimum time between alerts (default 30 minutes)
On first start, the bot creates an unverified Matrix session. To verify it:
- Open Element (or another Matrix client) and find the bot's session
- Start verification -- the bot will auto-accept and auto-confirm the emoji match
- Confirm the emojis on your side
The verified session persists across restarts.
| Endpoint | Description |
|---|---|
GET / |
Dashboard page |
GET /api/current |
Latest reading as JSON |
GET /api/readings?hours=24 |
Readings for the last N hours (24 or 168) |
GET /api/readings/day?date=YYYY-MM-DD |
All readings for a specific date |
GET /api/calendar?year=YYYY&month=MM |
Days with data for a given month |
GET /api/settings |
Current alert thresholds and cooldown |
POST /api/settings |
Update alert thresholds and cooldown |
- Go -- backend and polling
- SQLite (via modernc.org/sqlite) -- storage
- mautrix-go -- Matrix client with E2EE
- HTMX -- live partial updates
- Chart.js -- temperature charts
- Tailwind CSS -- styling
- Docker (distroless) -- deployment