🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""WebSocket endpoint routes."""
|
|
from fastapi import APIRouter, WebSocket, WebSocketDisconnect
|
|
from .manager import ws_manager
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.websocket("/events")
|
|
async def websocket_endpoint(websocket: WebSocket):
|
|
"""WebSocket endpoint for real-time event streaming.
|
|
|
|
Events include:
|
|
- connected: Initial connection confirmation
|
|
- system_stats: CPU, memory, temperature updates (every 5s)
|
|
- pm3_devices: Device list on connect/disconnect
|
|
- pm3_status: PM3 connection status changes
|
|
- ups_battery: Battery level updates
|
|
- ups_warning: Low battery warning
|
|
- ups_critical: Critical battery level
|
|
- ups_shutdown: Shutdown initiated
|
|
- ups_config_required: UPS needs configuration
|
|
- update_available: New version available
|
|
- update_downloading: Download progress
|
|
"""
|
|
await ws_manager.connect(websocket)
|
|
try:
|
|
while True:
|
|
# Keep connection alive by waiting for messages or disconnect
|
|
# Client doesn't send data, but we need to detect disconnection
|
|
try:
|
|
await websocket.receive_text()
|
|
except WebSocketDisconnect:
|
|
break
|
|
finally:
|
|
await ws_manager.disconnect(websocket)
|