From c631d9132e75af73a5bb51bd9b242eefe5ec440f Mon Sep 17 00:00:00 2001 From: devmatrix Date: Fri, 20 Feb 2026 19:48:27 +0000 Subject: [PATCH] Use proper fan propeller icons and improve icon rendering --- server.log | 129 ++++++++++----------------------- static/icons/fan-propeller.svg | 11 +++ web_server.py | 14 ++-- 3 files changed, 56 insertions(+), 98 deletions(-) create mode 100644 static/icons/fan-propeller.svg diff --git a/server.log b/server.log index 76cd4a2..baf603b 100644 --- a/server.log +++ b/server.log @@ -1,98 +1,45 @@ -INFO: Started server process [64990] +INFO: Started server process [66120] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) -INFO: 192.168.5.30:56691 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "POST /api/setup/test-ipmi HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "POST /api/setup/test-http HTTP/1.1" 200 OK -2026-02-20 19:42:26,004 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json -2026-02-20 19:42:26,006 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json -2026-02-20 19:42:26,179 - fan_controller - INFO - Connected to IPMI at 192.168.5.191 -2026-02-20 19:42:26,179 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888 +INFO: 192.168.5.30:49722 - "GET /api/status HTTP/1.1" 401 Unauthorized +INFO: 192.168.5.30:49722 - "GET /login HTTP/1.1" 200 OK +INFO: 127.0.0.1:42868 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 127.0.0.1:42870 - "GET / HTTP/1.1" 200 OK /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:55585 - "POST /api/setup HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:53288 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:55585 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:52997 - "GET /icons/wifi.svg HTTP/1.1" 200 OK -INFO: 192.168.5.30:61829 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:59884 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:54039 - "GET /icons/clock.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:59631 - "POST /api/auth/login HTTP/1.1" 200 OK +INFO: 192.168.5.30:59631 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:59631 - "GET /icons/fan.svg HTTP/1.1" 200 OK +INFO: 192.168.5.30:60198 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:61475 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:60157 - "GET /icons/clock.svg HTTP/1.1" 304 Not Modified /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:53288 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:53288 - "GET /icons/document-text.svg HTTP/1.1" 200 OK -INFO: 192.168.5.30:59884 - "GET /icons/viewfinder-circle.svg HTTP/1.1" 200 OK -INFO: 192.168.5.30:61829 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:54039 - "GET /icons/chart-bar.svg HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:55585 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:53971 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:53971 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:53971 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:53971 - "GET /icons/fire.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:62677 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:60990 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:55569 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60990 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:62677 - "GET /icons/wifi.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60301 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:53971 - "GET /icons/clock.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:50652 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:55569 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60301 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:60990 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:62677 - "GET /icons/viewfinder-circle.svg HTTP/1.1" 304 Not Modified -INFO: 192.168.5.30:62677 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62677 - "GET /login HTTP/1.1" 200 OK -INFO: 192.168.5.30:62677 - "GET /login HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "POST /api/auth/login HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET / HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /favicon.ico HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK -INFO: 192.168.5.30:62355 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 19:46:20,781 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json +INFO: 192.168.5.30:61475 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:59908 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:60198 - "GET /icons/wifi.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:50885 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:60157 - "GET /icons/fire.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:61475 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:59908 - "GET /icons/viewfinder-circle.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:59631 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:50885 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:50885 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:58311 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /icons/fan.svg HTTP/1.1" 304 Not Modified +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET / HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /login HTTP/1.1" 200 OK +INFO: 192.168.5.30:50885 - "GET /login HTTP/1.1" 200 OK diff --git a/static/icons/fan-propeller.svg b/static/icons/fan-propeller.svg new file mode 100644 index 0000000..c2fd1a5 --- /dev/null +++ b/static/icons/fan-propeller.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/web_server.py b/web_server.py index 9e0ad8a..8c4d9a8 100644 --- a/web_server.py +++ b/web_server.py @@ -277,10 +277,10 @@ def get_html(theme="dark"): transition: all 0.2s; }} .status-item:hover {{ transform: translateY(-2px); }} - .status-item .icon {{ width: 32px; height: 32px; margin: 0 auto 8px; }} - .status-item .icon img {{ width: 100%; height: 100%; filter: brightness(0) invert(1); }} - .icon-svg {{ width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 6px; filter: brightness(0) invert(1); }} - .icon-logo {{ width: 28px; height: 28px; display: inline-block; vertical-align: middle; margin-right: 8px; filter: brightness(0) invert(1); }} + .status-item .icon { width: 32px; height: 32px; margin: 0 auto 8px; } + .status-item .icon img { width: 100%; height: 100%; filter: brightness(0) invert(1); image-rendering: crisp-edges; image-rendering: -webkit-optimize-contrast; } + .icon-svg { width: 20px; height: 20px; display: inline-block; vertical-align: middle; margin-right: 6px; filter: brightness(0) invert(1); image-rendering: crisp-edges; image-rendering: -webkit-optimize-contrast; } + .icon-logo { width: 32px; height: 32px; display: inline-block; vertical-align: middle; margin-right: 8px; filter: brightness(0) invert(1); image-rendering: crisp-edges; image-rendering: -webkit-optimize-contrast; } .status-item .label {{ font-size: 0.75rem; color: var(--text-secondary); margin-bottom: 3px; }} .status-item .value {{ font-size: 1.1rem; font-weight: bold; }} .status-item .value.good {{ color: var(--accent-success); }} @@ -502,7 +502,7 @@ def get_html(theme="dark"):
-
-
+
Fan Speed
-
@@ -542,7 +542,7 @@ def get_html(theme="dark"):
-

Fans

+

Fans

Loading...
@@ -554,7 +554,7 @@ def get_html(theme="dark"): - +