Controllers
Topics
Quick Overview
from core.controller import Controller
from core.redis_manager import redis_manager
import json
import time
class DeviceController(Controller):
@staticmethod
async def handle_control(device_id, payload, client):
"""Handle device control commands with Redis caching"""
command = payload.get('command')
# Check rate limiting info from middleware
rate_limit_info = payload.get('rate_limit', {})
remaining_requests = rate_limit_info.get('remaining', 0)
# Log the command with rate limit info
print(f"Controlling device {device_id}: {command} (Rate limit remaining: {remaining_requests})")
# Cache command history in Redis
history_key = f"device:{device_id}:commands"
command_entry = {
"command": command,
"timestamp": time.time(),
"remaining_rate_limit": remaining_requests
}
# Add to command history (keep last 100 commands)
if redis_manager.is_enabled():
history = await redis_manager.get_json(history_key) or []
history.append(command_entry)
if len(history) > 100:
history = history[-100:]
await redis_manager.set_json(history_key, history, ex=86400) # 24 hours
# Process the command
if command == 'restart':
result = await DeviceController.restart_device(device_id)
elif command == 'shutdown':
result = await DeviceController.shutdown_device(device_id)
else:
result = {"error": "Unknown command"}
# Publish response
response_topic = f"devices/{device_id}/control/response"
client.publish(response_topic, json.dumps(result))
return resultController Features
Next Steps
Last updated