189 lines
5.8 KiB
Markdown
189 lines
5.8 KiB
Markdown
---
|
|
## Mission Control Dashboard (Python) — Consolidating
|
|
|
|
**Status:** 🔄 Combined with Next.js version — See TLC project
|
|
**Location:** `C:\web\htdocs\mission-control-py`
|
|
**URL:** http://localhost:5050
|
|
**URL (network):** http://192.168.0.34:5050
|
|
**Tech:** Python/Flask + MySQL + Home Assistant API
|
|
|
|
---
|
|
|
|
### Quick Reference
|
|
|
|
| Command | Where |
|
|
|---------|-------|
|
|
| Run server | `cd C:\web\htdocs\mission-control-py && python app.py` |
|
|
| Restart | Server auto-reloads on file changes |
|
|
| Port | 5050 (Frigate-safe) |
|
|
|
|
---
|
|
|
|
### Pages
|
|
|
|
| Route | File | Purpose |
|
|
|-------|------|---------|
|
|
| `/` | `dashboard.html` | Home: Gateway status, Cron jobs, Weather, Projects, Tasks |
|
|
| `/admin` | `admin.html` | CRUD for Projects/Tasks in MySQL |
|
|
| `/news` | `news.html` | Last 10 news briefs (JSON archive) |
|
|
| `/alerts` | `alerts.html` | System alerts from Job Verifier cron |
|
|
| `/calendar` | `calendar.html` | HA calendar + 24 F1 races |
|
|
| `/memory` | `memory.html` | Memory file stats, cleanup candidates |
|
|
|
|
---
|
|
|
|
### File Structure
|
|
|
|
```
|
|
mission-control-py/
|
|
├── app.py # Main Flask app, routes
|
|
├── api/
|
|
│ ├── gateway.py # get_gateway_status(), get_cron_jobs()
|
|
│ ├── ha_calendar.py # HA calendar API wrapper
|
|
│ └── memory_files.py # Memory file scanner
|
|
├── templates/
|
|
│ ├── base.html # Master template
|
|
│ ├── dashboard.html # Home page
|
|
│ ├── admin.html # Admin CRUD
|
|
│ ├── news.html # News briefs archive
|
|
│ ├── alerts.html # System alerts
|
|
│ ├── calendar.html # HA calendar
|
|
│ └── memory.html # Memory file stats
|
|
├── static/
|
|
│ └── style.css # All styles
|
|
├── outputs/
|
|
│ ├── news/ # YYYY-MM-DD.json, latest.json
|
|
│ └── alerts/ # latest.json
|
|
└── models/
|
|
└── models.py # Project, Task (MySQL)
|
|
```
|
|
|
|
---
|
|
|
|
### Features
|
|
|
|
#### Caching (5-minute TTL)
|
|
- Gateway status cached in `_cache` dict
|
|
- Cron jobs cached
|
|
- Weather cached
|
|
- Location: `app.py` → `_CACHE_TTL = timedelta(minutes=5)`
|
|
|
|
#### Weather
|
|
- Source: `weather.home` HA entity
|
|
- API: `GET /api/states/weather.home`
|
|
- Location: `get_weather()` in `app.py`
|
|
- Fallback: Shows "--" if HA unavailable
|
|
|
|
#### Calendar
|
|
- Source: HA `calendar.appointments` entity
|
|
- Fetch API: `GET /api/calendars/calendar.appointments?start=...&end=...`
|
|
- Add API: `POST /api/services/calendar/create_event`
|
|
- Location: `api/ha_calendar.py`
|
|
- **Known Issue:** Date range filter may not work correctly (March 3 event not showing)
|
|
|
|
#### News Briefs
|
|
- Source: Cron job output JSON
|
|
- Files: `outputs/news/latest.json` + `outputs/news/YYYY-MM-DD.json`
|
|
- Format: `{title, date, generated_at, content, sources, summary}`
|
|
- Crontab: Daily 8 AM → `openclaw cron run 3cf50074-...`
|
|
|
|
#### Alerts
|
|
- Source: Job Verifier cron output JSON
|
|
- File: `outputs/alerts/latest.json`
|
|
- Format: `{date, generated_at, alerts: [{level, message, time, ...}]}`
|
|
- Crontab: Daily 9 AM → `openclaw cron run 8e2b06ee-...`
|
|
|
|
#### Memory Files
|
|
- Source: `C:\Users\admin\.openclaw\workspace\memory\*.md`
|
|
- Features: Line count, TODO count, cleanup scoring
|
|
- Location: `api/memory_files.py`
|
|
|
|
---
|
|
|
|
### Known Issues & Fixes
|
|
|
|
| Issue | Status | Fix |
|
|
|-------|--------|-----|
|
|
| Calendar events beyond 10 days not showing | **KNOWN** | Date range filter bug — March 3 event (11 days out) not displaying |
|
|
| Double "°F" in weather | FIXED | Strip HA unit before adding; `get_weather()` in `app.py` |
|
|
| Calendar agent creates cron jobs instead of calendar events | **KNOWN** | Agent using `cron.add` instead of `ha_calendar.add()` — needs fix |
|
|
|
|
---
|
|
|
|
### HA API Reference
|
|
|
|
**Base URL:** `http://192.168.0.39:8123`
|
|
**Token:** See `TOOLS.md` or `api/ha_calendar.py`
|
|
|
|
| Endpoint | Method | Description |
|
|
|----------|--------|-------------|
|
|
| `/api/states/weather.home` | GET | Current weather state |
|
|
| `/api/calendars` | GET | List calendars |
|
|
| `/api/calendars/calendar.appointments` | GET | Get appointments (params: `start`, `end`) |
|
|
| `/api/services/calendar/create_event` | POST | Add event (body: `entity_id`, `summary`, `start_date_time`, `end_date_time`) |
|
|
|
|
**Auth:** Header `Authorization: Bearer <token>`
|
|
|
|
---
|
|
|
|
### Cron Jobs Integrated
|
|
|
|
| Job Name | ID | Schedule | Output |
|
|
|----------|-----|----------|--------|
|
|
| Daily News Brief | `3cf50074-8736-423e-ac41-6e6fb807bfee` | 0 8 * * * (8 AM) | JSON + Discord + /news |
|
|
| Job Verifier Daily | `8e2b06ee-f2ea-4b33-ae39-23cf04b1a657` | 0 9 * * * (9 AM) | JSON + /alerts |
|
|
|
|
---
|
|
|
|
### Configuration
|
|
|
|
**MySQL Connection:**
|
|
- Database: `alexai`
|
|
- Tables: `projects`, `tasks`
|
|
- Config: `config.py` → `SQLALCHEMY_DATABASE_URI`
|
|
|
|
**HA Token:**
|
|
- In `api/ha_calendar.py` and `app.py`
|
|
- Falls back to env var `HA_TOKEN`
|
|
|
|
---
|
|
|
|
### Debugging Tips
|
|
|
|
1. **Check HA directly:**
|
|
```bash
|
|
python -c "
|
|
import requests
|
|
r = requests.get('http://192.168.0.39:8123/api/calendars/calendar.appointments',
|
|
params={'start': '2026-03-03T00:00:00', 'end': '2026-03-04T00:00:00'},
|
|
headers={'Authorization': 'Bearer <token>'})
|
|
print(r.json())
|
|
"
|
|
```
|
|
|
|
2. **Test API directly:**
|
|
```python
|
|
from api.ha_calendar import get_calendar_events, add_calendar_event
|
|
events = get_calendar_events('calendar.appointments', days=14)
|
|
print([e['summary'] for e in events])
|
|
```
|
|
|
|
3. **Clear cache:** Restart server (auto-reloads)
|
|
|
|
4. **Check logs:** Terminal output shows "Starting Mission Control..."
|
|
|
|
---
|
|
|
|
### Changes Log
|
|
|
|
| Date | Change |
|
|
|------|--------|
|
|
| 2026-02-19 | Initial build, 5 pages |
|
|
| 2026-02-20 | Added weather, calendar, memory, F1 races (24 races added) |
|
|
| 2026-02-20 | Fixed double °F in weather |
|
|
| 2026-02-20 | Calendar agent created (has bug - creates cron instead of events) |
|
|
|
|
---
|
|
|
|
**Last Updated:** 2026-02-20
|
|
**Maintainer:** Corey's Agent |