Use favicon (blue fan) for logo and fan icons, add thermometer icon for temps

This commit is contained in:
devmatrix 2026-02-20 19:55:04 +00:00
parent 379e214f59
commit cd50fff372
3 changed files with 112 additions and 44 deletions

View File

@ -1,44 +1,109 @@
INFO: Started server process [67655]
INFO: Started server process [68185]
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:38442 - "GET / HTTP/1.1" 200 OK
INFO: 127.0.0.1:36660 - "GET / HTTP/1.1" 200 OK
INFO: 192.168.5.30:57225 - "GET /login HTTP/1.1" 200 OK
INFO: 192.168.5.30:57225 - "GET /login HTTP/1.1" 200 OK
INFO: 192.168.5.30:57225 - "GET /login HTTP/1.1" 200 OK
INFO: 192.168.5.30:57225 - "GET /favicon.ico HTTP/1.1" 200 OK
INFO: 192.168.5.30:57869 - "GET /api/status HTTP/1.1" 401 Unauthorized
INFO: 192.168.5.30:57869 - "GET /login HTTP/1.1" 200 OK
INFO: 192.168.5.30:57869 - "GET /icons/fan.svg HTTP/1.1" 304 Not Modified
/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:53339 - "POST /api/auth/login HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET / HTTP/1.1" 200 OK
INFO: 192.168.5.30:58782 - "POST /api/auth/login HTTP/1.1" 200 OK
INFO: 192.168.5.30:58782 - "GET / HTTP/1.1" 200 OK
INFO: 192.168.5.30:58782 - "GET /icons/fan-propeller.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:
2026-02-20 19:51:41,305 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json
INFO: 192.168.5.30:52800 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /icons/fan.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:60479 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:56386 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:50879 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:52800 - "GET /icons/clock.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:50546 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:53339 - "GET /icons/fire.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:50879 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:56386 - "GET /icons/fan-propeller.svg HTTP/1.1" 200 OK
INFO: 192.168.5.30:60479 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:52800 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:53339 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:53339 - "GET /favicon.ico HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:53339 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:52:52,583 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /favicon.ico HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 127.0.0.1:46350 - "GET /login HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:54:08,518 - fan_controller - INFO - Connected to IPMI at 192.168.5.191
INFO: 192.168.5.30:59190 - "POST /api/test 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:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:54:27,369 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json
2026-02-20 19:54:27,369 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888
INFO: 192.168.5.30:59190 - "POST /api/config/http HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:54:30,668 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json
2026-02-20 19:54:30,834 - fan_controller - INFO - Manual fan control enabled
2026-02-20 19:54:30,994 - fan_controller - INFO - Connected to IPMI at 192.168.5.191
2026-02-20 19:54:30,994 - fan_controller - INFO - HTTP sensor client initialized for http://192.168.5.200:8888
2026-02-20 19:54:30,995 - fan_controller - INFO - IPMI Controller service started
INFO: 192.168.5.30:59190 - "POST /api/control/auto 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:59190 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:54:31,149 - fan_controller - INFO - Manual fan control enabled
/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:59190 - "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:59190 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:54:37,530 - fan_controller - INFO - Fan 0xff speed set to 27%
2026-02-20 19:54:37,531 - 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:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "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:59190 - "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:59190 - "GET /api/status HTTP/1.1" 200 OK
2026-02-20 19:54:53,287 - fan_controller - INFO - Fan 0xff speed set to 31%
2026-02-20 19:54:53,287 - fan_controller - INFO - All fans set to 31% (Temp 38.0°C)
INFO: 192.168.5.30:59190 - "GET / HTTP/1.1" 200 OK
INFO: 192.168.5.30:59190 - "GET /icons/fan.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:59190 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:51993 - "GET /icons/sun.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:64648 - "GET /icons/lock-closed.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:59631 - "GET /icons/arrow-right-on-rectangle.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:51865 - "GET /icons/clock.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:62718 - "GET /icons/server-stack.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:59190 - "GET /icons/fire.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:64648 - "GET /icons/list-bullet.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:51993 - "GET /icons/fan-propeller.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:59631 - "GET /icons/adjustments-horizontal.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:59190 - "GET /icons/document-text.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:62718 - "GET /icons/chart-bar.svg HTTP/1.1" 304 Not Modified
INFO: 192.168.5.30:62718 - "GET /favicon.ico HTTP/1.1" 200 OK
INFO: 192.168.5.30:62718 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:62718 - "GET /api/status HTTP/1.1" 200 OK
INFO: 192.168.5.30:62718 - "GET /login HTTP/1.1" 200 OK

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 4h-4v7.35a4 4 0 1 0 6.08 3.35c.5-.8.67-1.74.42-2.68A4 4 0 0 0 14 11.35V4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 259 B

View File

@ -477,7 +477,7 @@ def get_html(theme="dark"):
<div class="container">
<header>
<div class="header-top">
<h1><img src="/icons/fan.svg" class="icon-logo" alt=""> IPMI Controller</h1>
<h1><img src="/icons/favicon.svg" class="icon-logo" alt=""> IPMI Controller</h1>
<div class="header-actions">
<button class="secondary small" onclick="toggleTheme()"><img src="/icons/sun.svg" class="icon-svg" alt=""> Theme</button>
<button class="secondary small" onclick="showPasswordModal()"><img src="/icons/lock-closed.svg" class="icon-svg" alt=""> Password</button>
@ -497,12 +497,12 @@ def get_html(theme="dark"):
<div class="value" id="val-mode">-</div>
</div>
<div class="status-item" id="status-temp">
<div class="icon"><img src="/icons/fire.svg" alt=""></div>
<div class="icon"><img src="/icons/thermometer.svg" alt=""></div>
<div class="label">Max Temp</div>
<div class="value" id="val-temp">-</div>
</div>
<div class="status-item" id="status-fans">
<div class="icon"><img src="/icons/fan-propeller.svg" alt=""></div>
<div class="icon"><img src="/icons/favicon.svg" alt=""></div>
<div class="label">Fan Speed</div>
<div class="value" id="val-fans">-</div>
</div>
@ -534,7 +534,7 @@ def get_html(theme="dark"):
<!-- Temperatures -->
<div class="card">
<h2><img src="/icons/fire.svg" class="icon-svg" alt=""> Temperatures</h2>
<h2><img src="/icons/thermometer.svg" class="icon-svg" alt=""> Temperatures</h2>
<div class="temp-grid" id="temp-grid">
<div class="temp-item"><span>Loading...</span></div>
</div>
@ -542,7 +542,7 @@ def get_html(theme="dark"):
<!-- Fans -->
<div class="card">
<h2><img src="/icons/fan-propeller.svg" class="icon-svg" alt=""> Fans</h2>
<h2><img src="/icons/favicon.svg" class="icon-svg" alt=""> Fans</h2>
<div class="fan-grid" id="fan-grid">
<div class="fan-card">Loading...</div>
</div>
@ -554,7 +554,7 @@ def get_html(theme="dark"):
<button class="tab active" onclick="showTab('ipmi')"><span class="icon-svg"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="2" y="3" width="20" height="6" rx="2"/><rect x="2" y="11" width="20" height="6" rx="2"/><rect x="2" y="19" width="20" height="3" rx="1.5"/></svg></span>IPMI</button>
<button class="tab" onclick="showTab('http')"><span class="icon-svg"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></span>HTTP</button>
<button class="tab" onclick="showTab('control')"><span class="icon-svg"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg></span>Control</button>
<button class="tab" onclick="showTab('fans')"><img src="/icons/fan-propeller.svg" class="icon-svg" alt=""> Fans</button>
<button class="tab" onclick="showTab('fans')"><img src="/icons/favicon.svg" class="icon-svg" alt=""> Fans</button>
<button class="tab" onclick="showTab('curves')"><img src="/icons/chart-bar.svg" class="icon-svg" alt=""> Curves</button>
<button class="tab" onclick="showTab('logs')"><img src="/icons/document-text.svg" class="icon-svg" alt=""> Logs</button>
</div>
@ -1103,7 +1103,7 @@ LOGIN_HTML = '''<!DOCTYPE html>
</head>
<body>
<div class="login-box">
<h1><img src="/icons/fan.svg" class="icon-logo" alt=""> IPMI Controller</h1>
<h1><img src="/icons/favicon.svg" class="icon-logo" alt=""> IPMI Controller</h1>
<div class="error" id="error"></div>
<form id="login-form">
<div class="form-group">