diff --git a/data/config.json b/data/config.json deleted file mode 100644 index 9d8f00f..0000000 --- a/data/config.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "ipmi_host": "192.168.5.191", - "ipmi_username": "root", - "ipmi_password": "calvin", - "ipmi_port": 623, - "http_sensor_enabled": true, - "http_sensor_url": "http://192.168.5.200:8888", - "http_sensor_timeout": 10, - "enabled": true, - "poll_interval": 10, - "fan_update_interval": 10, - "min_speed": 10, - "max_speed": 100, - "panic_temp": 85.0, - "panic_speed": 100, - "panic_on_no_data": true, - "no_data_timeout": 60, - "primary_sensor": "cpu", - "sensor_preference": "auto", - "fans": {}, - "fan_groups": {}, - "active_curve": "Performance", - "fan_curves": { - "Balanced": { - "points": [ - { - "temp": 30, - "speed": 10 - }, - { - "temp": 35, - "speed": 12 - }, - { - "temp": 40, - "speed": 15 - }, - { - "temp": 45, - "speed": 20 - }, - { - "temp": 50, - "speed": 30 - }, - { - "temp": 55, - "speed": 40 - }, - { - "temp": 60, - "speed": 55 - }, - { - "temp": 65, - "speed": 70 - }, - { - "temp": 70, - "speed": 85 - }, - { - "temp": 75, - "speed": 95 - }, - { - "temp": 80, - "speed": 100 - } - ], - "sensor_source": "cpu", - "applies_to": "all" - }, - "Silent": { - "points": [ - { - "temp": 30, - "speed": 5 - }, - { - "temp": 40, - "speed": 10 - }, - { - "temp": 50, - "speed": 15 - }, - { - "temp": 55, - "speed": 25 - }, - { - "temp": 60, - "speed": 35 - }, - { - "temp": 65, - "speed": 50 - }, - { - "temp": 70, - "speed": 70 - }, - { - "temp": 75, - "speed": 85 - }, - { - "temp": 80, - "speed": 100 - } - ], - "sensor_source": "cpu", - "applies_to": "all" - }, - "Performance": { - "points": [ - { - "temp": 30, - "speed": 20 - }, - { - "temp": 35, - "speed": 25 - }, - { - "temp": 40, - "speed": 35 - }, - { - "temp": 45, - "speed": 45 - }, - { - "temp": 50, - "speed": 55 - }, - { - "temp": 55, - "speed": 70 - }, - { - "temp": 60, - "speed": 85 - }, - { - "temp": 65, - "speed": 95 - }, - { - "temp": 70, - "speed": 100 - } - ], - "sensor_source": "cpu", - "applies_to": "all" - }, - "Default": { - "points": [ - { - "temp": 30, - "speed": 15 - }, - { - "temp": 40, - "speed": 25 - }, - { - "temp": 50, - "speed": 40 - }, - { - "temp": 60, - "speed": 60 - }, - { - "temp": 70, - "speed": 80 - }, - { - "temp": 80, - "speed": 100 - } - ], - "sensor_source": "cpu", - "applies_to": "all" - } - }, - "theme": "dark" -} \ No newline at end of file diff --git a/data/users.json b/data/users.json deleted file mode 100644 index eb8443e..0000000 --- a/data/users.json +++ /dev/null @@ -1 +0,0 @@ -{"users": {"admin": "ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae"}} \ No newline at end of file diff --git a/server.log b/server.log index 951c102..caf1f0e 100644 --- a/server.log +++ b/server.log @@ -1,549 +1,8 @@ -INFO: Started server process [71515] +INFO: Started server process [74745] INFO: Waiting for application startup. -2026-02-20 20:06:54,388 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json -2026-02-20 20:06:54,388 - __main__ - INFO - Auto-starting fan control (enabled in config) -2026-02-20 20:06:54,546 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 -2026-02-20 20:06:54,546 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888 -2026-02-20 20:06:54,547 - fan_controller - INFO - IPMI Controller service started INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) -INFO: 192.168.5.30:61891 - "GET /api/status HTTP/1.1" 401 Unauthorized -2026-02-20 20:06:54,707 - fan_controller - INFO - Manual fan control enabled -INFO: 192.168.5.30:61891 - "GET /login HTTP/1.1" 200 OK -INFO: 192.168.5.30:61891 - "GET /icons/favicon.svg HTTP/1.1" 304 Not Modified -2026-02-20 20:06:59,911 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:06:59,911 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:153: 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:52052 - "POST /api/auth/login HTTP/1.1" 200 OK -INFO: 192.168.5.30:52052 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:52052 - "GET /icons/auto-mode.svg HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55325 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /icons/thermometer.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:63188 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:07:15,453 - fan_controller - INFO - Fan 0xff speed set to 25% -2026-02-20 20:07:15,453 - fan_controller - INFO - All fans set to 25% (Temp 35.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 127.0.0.1:50858 - "GET /icons/auto-mode.svg HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:07:30,915 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:07:30,915 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:07:45,964 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:07:45,965 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:63188 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:09:03,867 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:09:03,867 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:09:19,798 - fan_controller - INFO - Fan 0xff speed set to 31% -2026-02-20 20:09:19,799 - fan_controller - INFO - All fans set to 31% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55296 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:09:35,346 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:09:35,347 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:09:50,823 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:09:50,823 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:10:06,006 - fan_controller - INFO - Fan 0xff speed set to 31% -2026-02-20 20:10:06,006 - fan_controller - INFO - All fans set to 31% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:57942 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:57942 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:10:54,206 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:10:54,206 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:64073 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:13:15,599 - fan_controller - INFO - Fan 0xff speed set to 25% -2026-02-20 20:13:15,600 - fan_controller - INFO - All fans set to 25% (Temp 35.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:13:32,024 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:13:32,025 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:13:48,155 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:13:48,156 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:14:04,773 - fan_controller - INFO - Fan 0xff speed set to 25% -2026-02-20 20:14:04,774 - fan_controller - INFO - All fans set to 25% (Temp 35.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:14:20,306 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:14:20,307 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:14:36,209 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:14:36,209 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:14:51,615 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:14:51,616 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:15:22,579 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:15:22,579 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:15:37,470 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:15:37,470 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:50577 - "GET /icons/favicon.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:50577 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60159 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:57390 - "GET /icons/auto-mode.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:59075 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:55085 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:51598 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:50577 - "GET /icons/thermometer.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:57390 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60159 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:51598 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:59075 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:59075 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:15:52,508 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:15:52,508 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:16:39,127 - fan_controller - INFO - Fan 0xff speed set to 25% -2026-02-20 20:16:39,127 - fan_controller - INFO - All fans set to 25% (Temp 35.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:16:55,091 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:16:55,092 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:17:11,182 - fan_controller - INFO - Fan 0xff speed set to 25% -2026-02-20 20:17:11,182 - fan_controller - INFO - All fans set to 25% (Temp 35.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:17:26,052 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:17:26,052 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:17:41,039 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:17:41,040 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:18:13,111 - fan_controller - INFO - Fan 0xff speed set to 31% -2026-02-20 20:18:13,111 - fan_controller - INFO - All fans set to 31% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:18:28,096 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:18:28,097 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:18:44,743 - fan_controller - INFO - Fan 0xff speed set to 29% -2026-02-20 20:18:44,743 - fan_controller - INFO - All fans set to 29% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 20:19:00,200 - fan_controller - INFO - Fan 0xff speed set to 27% -2026-02-20 20:19:00,201 - fan_controller - INFO - All fans set to 27% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:160: 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:59075 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:59075 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:54411 - "GET /api/status HTTP/1.1" 401 Unauthorized +INFO: 192.168.5.30:54411 - "GET /login HTTP/1.1" 200 OK +INFO: 192.168.5.30:54411 - "GET /icons/favicon.svg HTTP/1.1" 304 Not Modified +INFO: 127.0.0.1:58102 - "GET / HTTP/1.1" 200 OK diff --git a/web_server.py b/web_server.py index d478ca4..8e2961d 100644 --- a/web_server.py +++ b/web_server.py @@ -742,6 +742,47 @@ def get_html(theme="dark"): + +