Files
openclaw-workspace/memory/projects/mission-control-python.md
2026-04-11 09:45:12 -05:00

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