diff --git a/data/config.json b/data/config.json index e2049ba..83b78d4 100644 --- a/data/config.json +++ b/data/config.json @@ -18,7 +18,14 @@ "primary_sensor": "cpu", "sensor_preference": "auto", "fans": {}, - "fan_groups": {}, + "fan_groups": { + "1 & 2": { + "fan_ids": [ + "0x00", + "0x01" + ] + } + }, "active_curve": "Balanced", "fan_curves": { "Balanced": { diff --git a/server.log b/server.log index 153a7d4..d2f87ac 100644 --- a/server.log +++ b/server.log @@ -1,468 +1,307 @@ -INFO: Started server process [86031] +INFO: Started server process [101298] 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: 127.0.0.1:52194 - "GET / HTTP/1.1" 200 OK -INFO: 127.0.0.1:52206 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:65213 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:65213 - "GET /icons/favicon.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:65213 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:49755 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:60215 - "POST /api/setup/test-ipmi HTTP/1.1" 200 OK -INFO: 192.168.5.30:60215 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:60215 - "POST /api/setup/test-http HTTP/1.1" 200 OK -2026-02-20 21:14:12,721 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json -2026-02-20 21:14:12,969 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 -2026-02-20 21:14:12,969 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888 -/home/devmatrix/projects/fan-controller-v2/web_server.py:154: 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). +INFO: 127.0.0.1:54560 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:64163 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:64163 - "GET /icons/favicon.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:64163 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 192.168.5.30:52794 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 192.168.5.30:56655 - "POST /api/setup/test-ipmi HTTP/1.1" 200 OK +INFO: 192.168.5.30:56655 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 192.168.5.30:56655 - "POST /api/setup/test-http HTTP/1.1" 200 OK +2026-02-20 22:20:12,413 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 22:20:12,563 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 +2026-02-20 22:20:12,563 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888 +2026-02-20 22:20:12,563 - __main__ - INFO - Setup complete - auto fan control enabled, starting service... +2026-02-20 22:20:12,718 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 +2026-02-20 22:20:12,875 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 +2026-02-20 22:20:12,875 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888 +2026-02-20 22:20:12,876 - fan_controller - INFO - IPMI Controller service started +2026-02-20 22:20:12,876 - __main__ - INFO - Fan control service started successfully +/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). self._sessions[token] = (username, datetime.utcnow() + timedelta(days=7)) -INFO: 192.168.5.30:60215 - "POST /api/setup HTTP/1.1" 200 OK -INFO: 192.168.5.30:60215 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:60215 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:56655 - "POST /api/setup HTTP/1.1" 200 OK +INFO: 192.168.5.30:56655 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:56655 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60215 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:49551 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:57842 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60455 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:49786 - "GET /icons/auto-mode.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:50500 - "GET /icons/thermometer.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60215 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:49551 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:57842 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60455 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "POST /api/test HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:58779 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:59906 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:60838 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:56655 - "GET /icons/thermometer.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:52699 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:49400 - "GET /icons/auto-mode.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:60838 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:59906 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:58779 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:52699 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified +2026-02-20 22:20:13,043 - fan_controller - INFO - Manual fan control enabled +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:21:00,661 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json -2026-02-20 21:21:00,824 - fan_controller - INFO - Manual fan control enabled -2026-02-20 21:21:00,981 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 -2026-02-20 21:21:00,981 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888 -2026-02-20 21:21:00,983 - fan_controller - INFO - IPMI Controller service started -INFO: 192.168.5.30:60455 - "POST /api/control/auto HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:21:01,180 - fan_controller - INFO - Manual fan control enabled -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:20:19,802 - fan_controller - INFO - Fan 0xff speed set to 14% +2026-02-20 22:20:19,802 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:21:07,293 - fan_controller - INFO - Fan 0xff speed set to 13% -2026-02-20 21:21:07,293 - fan_controller - INFO - All fans set to 13% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:20:35,769 - fan_controller - INFO - Fan 0xff speed set to 15% +2026-02-20 22:20:35,770 - fan_controller - INFO - All fans set to 15% (Temp 40.0°C) +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 127.0.0.1:57826 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:20:50,970 - fan_controller - INFO - Fan 0xff speed set to 14% +2026-02-20 22:20:50,971 - fan_controller - INFO - All fans set to 14% (Temp 39.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:21:37,253 - fan_controller - INFO - Fan 0xff speed set to 14% -2026-02-20 21:21:37,253 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:21:07,072 - fan_controller - INFO - Fan 0xff speed set to 13% +2026-02-20 22:21:07,073 - fan_controller - INFO - All fans set to 13% (Temp 37.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:21:53,341 - fan_controller - INFO - Fan 0xff speed set to 13% -2026-02-20 21:21:53,342 - fan_controller - INFO - All fans set to 13% (Temp 36.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=light HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:21:22,471 - fan_controller - INFO - Fan 0xff speed set to 14% +2026-02-20 22:21:22,471 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /?theme=dark HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:22:03,963 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +INFO: 192.168.5.30:52699 - "POST /api/fans/groups HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +2026-02-20 22:23:04,090 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 22:23:04,287 - fan_controller - INFO - Fan 0xff speed set to 14% +INFO: 192.168.5.30:52699 - "POST /api/control/manual HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:24:12,026 - fan_controller - INFO - Fan 0xff speed set to 14% -2026-02-20 21:24:12,026 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:23:06,092 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 22:23:06,291 - fan_controller - INFO - Automatic fan control restored +INFO: 192.168.5.30:52699 - "POST /api/control/auto HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:23:07,738 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 22:23:08,186 - fan_controller - INFO - Manual fan control enabled +INFO: 192.168.5.30:52699 - "POST /api/control/auto HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:23:26,377 - fan_controller - INFO - Fan 0xff speed set to 15% +2026-02-20 22:23:26,377 - fan_controller - INFO - All fans set to 15% (Temp 40.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:24:57,318 - fan_controller - INFO - Fan 0xff speed set to 13% -2026-02-20 21:24:57,318 - fan_controller - INFO - All fans set to 13% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:23:42,197 - fan_controller - INFO - Fan 0xff speed set to 14% +2026-02-20 22:23:42,197 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:25:13,055 - fan_controller - INFO - Fan 0xff speed set to 15% -2026-02-20 21:25:13,056 - fan_controller - INFO - All fans set to 15% (Temp 40.0°C) -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:25:28,522 - fan_controller - INFO - Fan 0xff speed set to 14% -2026-02-20 21:25:28,522 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:25:43,706 - fan_controller - INFO - Fan 0xff speed set to 13% -2026-02-20 21:25:43,706 - fan_controller - INFO - All fans set to 13% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:25:58,865 - fan_controller - INFO - Fan 0xff speed set to 14% -2026-02-20 21:25:58,866 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:24:58,799 - fan_controller - INFO - Fan 0xff speed set to 13% +2026-02-20 22:24:58,799 - fan_controller - INFO - All fans set to 13% (Temp 37.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:26:45,316 - fan_controller - INFO - Fan 0xff speed set to 13% -2026-02-20 21:26:45,316 - fan_controller - INFO - All fans set to 13% (Temp 37.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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). +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 22:25:30,481 - fan_controller - INFO - Fan 0xff speed set to 14% +2026-02-20 22:25:30,482 - fan_controller - INFO - All fans set to 14% (Temp 39.0°C) +/home/devmatrix/projects/fan-controller-v2/web_server.py:163: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -2026-02-20 21:27:00,582 - fan_controller - INFO - Fan 0xff speed set to 14% -2026-02-20 21:27:00,582 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -/home/devmatrix/projects/fan-controller-v2/web_server.py:161: 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:60455 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60455 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:52699 - "GET /api/status HTTP/1.1" 200 OK diff --git a/web_server.py b/web_server.py index ca84da5..a76bc20 100644 --- a/web_server.py +++ b/web_server.py @@ -220,6 +220,9 @@ THEMES = { color: #333 !important; border-color: #ccc !important; } + .status-item .icon img, .icon-svg, .icon-logo { + filter: none !important; + } """ }