Use proper fan propeller icons and improve icon rendering
This commit is contained in:
parent
bd0ba4a53d
commit
c631d9132e
129
server.log
129
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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
<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">
|
||||
<circle cx="12" cy="12" r="3"/>
|
||||
<path d="M12 2v4"/>
|
||||
<path d="M12 18v4"/>
|
||||
<path d="M4.93 4.93l2.83 2.83"/>
|
||||
<path d="M16.24 16.24l2.83 2.83"/>
|
||||
<path d="M2 12h4"/>
|
||||
<path d="M18 12h4"/>
|
||||
<path d="M4.93 19.07l2.83-2.83"/>
|
||||
<path d="M16.24 7.76l2.83-2.83"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 435 B |
|
|
@ -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"):
|
|||
<div class="value" id="val-temp">-</div>
|
||||
</div>
|
||||
<div class="status-item" id="status-fans">
|
||||
<div class="icon"><img src="/icons/wifi.svg" alt=""></div>
|
||||
<div class="icon"><img src="/icons/fan-propeller.svg" alt=""></div>
|
||||
<div class="label">Fan Speed</div>
|
||||
<div class="value" id="val-fans">-</div>
|
||||
</div>
|
||||
|
|
@ -542,7 +542,7 @@ def get_html(theme="dark"):
|
|||
|
||||
<!-- Fans -->
|
||||
<div class="card">
|
||||
<h2><img src="/icons/viewfinder-circle.svg" class="icon-svg" alt=""> Fans</h2>
|
||||
<h2><img src="/icons/fan-propeller.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/viewfinder-circle.svg" class="icon-svg" alt=""> Fans</button>
|
||||
<button class="tab" onclick="showTab('fans')"><img src="/icons/fan-propeller.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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue