INFO: Started server process [896609] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO: 192.168.5.30:63112 - "GET /api/status HTTP/1.1" 401 Unauthorized INFO: 192.168.5.30:63112 - "GET /login HTTP/1.1" 200 OK /home/devmatrix/projects/fan-controller-v2/web_server.py:149: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). self._sessions[token] = (username, datetime.utcnow() + timedelta(days=7)) INFO: 192.168.5.30:49451 - "POST /api/auth/login HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET / HTTP/1.1" 200 OK /home/devmatrix/projects/fan-controller-v2/web_server.py:156: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). if datetime.utcnow() > expiry: 2026-02-20 15:49:53,771 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /favicon.ico HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK 2026-02-20 15:50:02,664 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json 2026-02-20 15:50:02,666 - fan_controller - ERROR - IPMI command error: [Errno 2] No such file or directory: 'ipmitool' 2026-02-20 15:50:02,666 - fan_controller - ERROR - Failed to connect to IPMI INFO: 192.168.5.30:49451 - "POST /api/config/ipmi HTTP/1.1" 200 OK /home/devmatrix/projects/fan-controller-v2/web_server.py:156: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). if datetime.utcnow() > expiry: INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /favicon.ico HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 127.0.0.1:39328 - "GET /api/status HTTP/1.1" 401 Unauthorized INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK /home/devmatrix/projects/fan-controller-v2/web_server.py:149: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). self._sessions[token] = (username, datetime.utcnow() + timedelta(days=7)) INFO: 127.0.0.1:39340 - "POST /api/auth/login HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK 2026-02-20 15:50:24,002 - fan_controller - ERROR - IPMI command error: [Errno 2] No such file or directory: 'ipmitool' 2026-02-20 15:50:24,002 - fan_controller - ERROR - Failed to connect to IPMI INFO: 192.168.5.30:49451 - "POST /api/test HTTP/1.1" 200 OK /home/devmatrix/projects/fan-controller-v2/web_server.py:156: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). if datetime.utcnow() > expiry: 2026-02-20 15:50:25,685 - fan_controller - ERROR - IPMI command error: [Errno 2] No such file or directory: 'ipmitool' 2026-02-20 15:50:25,686 - fan_controller - ERROR - Failed to connect to IPMI INFO: 127.0.0.1:59364 - "POST /api/test HTTP/1.1" 200 OK /home/devmatrix/projects/fan-controller-v2/web_server.py:156: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). if datetime.utcnow() > expiry: INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET / HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET / HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK INFO: 192.168.5.30:49451 - "GET /api/status HTTP/1.1" 200 OK