Commit graph

32 commits

Author SHA1 Message Date
Sam
5d3d4f4015 MQTT-based live CPU/RAM metrics + remove auth from HA control
- Enrich server data with MQTT system topics (cpu_usage_percent,
  ram_usage_percent, temp, model etc.) published by Unraid MQTT Agent
- Works for both Daddelolymp and Adriahub topics
- MQTT overlay runs on every request (even cached) for fresh metrics
- Remove JWT auth from /api/ha/control — local dashboard doesn't need it
- Add cpu brand field to GraphQL query

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 22:41:16 +01:00
Sam
94727ebe70 Add Unraid GraphQL API support (6.12+) for server monitoring
The Unraid built-in API uses GraphQL at /graphql with x-api-key auth
instead of REST endpoints. Service now tries GraphQL first, then falls
back to legacy REST, then connectivity check.

Fetches: hostname, uptime, CPU cores/threads, RAM total, Docker
containers with status, array state, and share free space.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 22:30:05 +01:00
Sam
0d68933b85 Further filter technical switches (child locks, LED indicators, permit join)
Removes child lock toggles, motion sensor LED indicators, and
Zigbee2MQTT permit join from the smart-home dashboard view.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:40:25 +01:00
Sam
3235e6293a Filter out Unraid infrastructure entities from HA smart-home view
Exclude Docker container power switches, system service switches,
VM switches, and hardware monitoring sensors (disk/CPU/GPU temps)
from the dashboard. Only show actual smart-home entities.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:36:37 +01:00
Sam
f5b7c53f18 HA controls + wider layout: toggle lights/switches, cover controls, more sensors
- Backend: call_ha_service() for controlling entities via HA REST API
- Backend: POST /api/ha/control with JWT auth + cache invalidation
- Backend: Parse switches, binary_sensors, humidity, climate entities
- Frontend: HA card now xl:col-span-2 (double width)
- Frontend: Interactive toggles for lights/switches, cover up/stop/down
- Frontend: Temperature + humidity sensors, climate display, binary sensors
- Frontend: Two-column internal layout (controls left, sensors right)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:30:20 +01:00
Sam
4e7c1909ee Fix country matching: English→ISO code lookup for geocoding
"Rab,Croatia" now correctly matches Croatia (HR) instead of
Rabat (Morocco). Added country code mapping for common English
and German country names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:51:56 +01:00
Sam
ac63370876 Fix geocoding for "City,Country" format (e.g. Rab,Croatia)
Split location on comma, search for city name, then filter results
by country name/code to find the correct match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:48:45 +01:00
Sam
d3305a243c Weather: Replace wttr.in with Open-Meteo + structured logging
- Replace wttr.in (unreachable from Docker) with Open-Meteo API
  (free, no API key, reliable) with geocoding cache
- WMO weather codes mapped to German descriptions + emoji icons
- Add [WEATHER], [NEWS], [UNRAID], [DASHBOARD] log prefixes
- Structured integration status table on startup
- Suppress noisy httpx INFO logs (services log their own summaries)
- Add logging to unraid_service (was completely silent on errors)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:45:23 +01:00
Sam
94cf618e0d Fix: Setup-Wizard Redirect + market_news Migration
- Replace navigate() with window.location.href for full page reload
  after setup completion (fixes redirect loop back to /setup)
- Add migration 002: market_news table with indexes
- Remove unused useNavigate import

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:32:43 +01:00
Sam
c15176bff4 fix: replace passlib with direct bcrypt to fix password hashing crash
passlib 1.7.4 is incompatible with bcrypt>=4.1, causing a ValueError
during internal bug detection. Using bcrypt directly avoids this.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:20:36 +01:00
Sam
ee37b9bb31 polish: News step hint + n8n description clarify
News step now explains that sources are configured in n8n.
n8n step description clarified as optional webhook triggering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:11:42 +01:00
Sam
6651bfaf60 feat: Setup Wizard for first-run configuration
Container starts with only DB credentials. On first visit, a step-by-step
wizard guides through admin password, weather, HA, Vikunja, Unraid, MQTT,
n8n and news configuration. Backward-compat: ADMIN_PASSWORD env skips wizard.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:06:10 +01:00
Sam
e25d055ba2 polish: clean header, unified IBM Plex Sans typography
- Remove Daily Briefing title and live indicator from header
- Center clock prominently in header bar
- Switch all section headings to IBM Plex Sans (matching card titles)
- Remove unused Outfit font import

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 12:04:47 +01:00
Sam
e94a7706ab redesign: THERMAL warm brutalist dashboard UI
Complete visual redesign of all dashboard components with a warm
brutalist command terminal aesthetic. Features editorial section
numbering, IBM Plex typography, sharp zero-radius cards with colored
accent strips, film grain overlay, and data-glow effects.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 10:54:28 +01:00
Sam
f6a42c2dd2 feat: add Admin Panel with JWT auth, DB settings, and integration management
Complete admin backend with login, where all integrations (weather, news,
Home Assistant, Vikunja, Unraid, MQTT) can be configured via web UI instead
of ENV variables. Two-layer config: ENV seeds DB on first start, then DB
is source of truth. Auto-migration system on startup.

Backend: db.py shared pool, auth.py JWT, settings_service CRUD, seed_service,
admin router (protected), test_connections per integration, config.py rewrite.

Frontend: react-router v6, login page, admin layout with sidebar, 8 settings
pages (General, Weather, News, HA, Vikunja, Unraid, MQTT, ChangePassword),
shared IntegrationForm + TestButton components.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 10:37:30 +01:00
Sam
89ed0c6d0a feat: add MQTT integration for real-time entity updates
- aiomqtt async client with auto-reconnect and topic store
- MQTT router: GET /api/mqtt, GET /api/mqtt/topic/{path}, POST /api/mqtt/publish
- MQTT entities included in /api/all + WebSocket broadcast
- MqttCard frontend component with category filters, entity list
- Configurable via ENV: MQTT_HOST, MQTT_PORT, MQTT_USERNAME,
  MQTT_PASSWORD, MQTT_TOPICS (comma-separated or JSON array)
- Gracefully disabled when MQTT_HOST is not set

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 10:13:50 +01:00
Sam
9f7330e217 refactor: complete rewrite as React+FastAPI dashboard
Replace monolithic Jinja2 template with modern stack:

Backend (FastAPI):
- Modular router/service architecture
- Async PostgreSQL (asyncpg) for news from n8n pipeline
- Live Unraid server stats (2 servers via API)
- Home Assistant, Vikunja tasks, weather (wttr.in)
- WebSocket broadcast for real-time updates (15s)
- TTL cache per endpoint, all config via ENV vars

Frontend (React + Vite + TypeScript):
- Glassmorphism dark theme with Tailwind CSS
- Responsive grid: mobile/tablet/desktop/ultrawide
- Weather cards, hourly forecast, news with category tabs
- Server stats (CPU ring, RAM bar, Docker list)
- Home Assistant controls, task management
- Live clock, WebSocket connection indicator

Infrastructure:
- Multi-stage Dockerfile (node:22-alpine + python:3.11-slim)
- docker-compose with full ENV configuration
- Kaniko CI/CD pipeline for GitLab registry

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 01:48:51 +01:00
Sam
4bbc125a67 ci: allow branch pipelines for kaniko build 2026-03-02 00:36:52 +01:00
Sam
4860542d2b ci: switch daily briefing to kaniko registry build 2026-03-02 00:35:08 +01:00
Sam
9fd931a12f Use GitLab registry via local IP in CI 2026-03-01 22:44:44 +01:00
Sam
4fe644c517 UI: Remove 'Dashboard' text from inside the logo icon div 2026-02-13 13:57:06 +01:00
Sam
ee1c5bc5a4 UI: Rename to just 'Dashboard' and clean up header logo 2026-02-13 13:54:11 +01:00
Sam
c14cd60a32 UI: Move clock/date to right side, remove refresh button, and improve responsive layout 2026-02-13 12:58:24 +01:00
Sam
183b9528fe Fix: Absolute clock position - moved to background with -z-10 and opacity 2026-02-13 12:37:55 +01:00
Sam
0ad8470339 Update docker-compose.yml: add DASHBOARD_DATA_PATH and volume mount for data 2026-02-13 12:35:58 +01:00
Sam
076ee15c83 Add news and hourly weather to dashboard 2026-02-13 12:33:15 +01:00
Sam
320f273c3e Fix: Clock overlay in header - changed sm:flex to lg:flex, added z-0 2026-02-13 12:33:03 +01:00
Sam
79fb274b3b Update deploy stage tags to vm-deploy 2026-02-13 00:37:34 +01:00
Sam
231749f513 Trigger pipeline retry #2 2026-02-13 00:26:22 +01:00
Sam
8a2e6a9514 Trigger pipeline retry 2026-02-13 00:26:11 +01:00
Sam
58b2dd2730 Add GitLab CI/CD configuration 2026-02-13 00:25:22 +01:00
Sam
70c71105a1 Initial commit 2026-02-13 00:24:31 +01:00