# Command Center - Complete Setup Guide A Home Assistant touchscreen dashboard for Windows and Linux. --- ## Table of Contents 1. [Prerequisites](#1-prerequisites) 2. [Project Installation](#2-project-installation) 3. [Home Assistant Setup](#3-home-assistant-setup) 4. [Google Calendar Setup](#4-google-calendar-setup-optional) 5. [Camera Setup](#5-camera-setup) 6. [Entity Configuration](#6-entity-configuration) 7. [Building the Application](#7-building-the-application) 8. [Windows Deployment](#8-windows-deployment) 9. [Linux Deployment](#9-linux-deployment) 10. [First Launch](#10-first-launch) 11. [Troubleshooting](#11-troubleshooting) --- ## 1. Prerequisites ### Development Machine (to build the app) | Requirement | Windows | Linux | |-------------|---------|-------| | Node.js | v18+ from [nodejs.org](https://nodejs.org) | `sudo apt install nodejs npm` | | Git | [git-scm.com](https://git-scm.com) | `sudo apt install git` | | Code Editor | VS Code recommended | VS Code recommended | ### Touchscreen Device **Supported Platforms:** - Windows 10/11 PC or tablet - Linux PC (Ubuntu, Debian, Raspberry Pi OS) - Raspberry Pi 4 (4GB+ recommended) **Requirements:** - Touchscreen display (or mouse for testing) - Network access to Home Assistant - Network access to camera streams (if using cameras) --- ## 2. Project Installation ### Windows ```powershell # Open PowerShell and navigate to your projects folder cd C:\Projects # Clone or copy the project git clone command-center cd command-center # Install dependencies npm install ``` ### Linux ```bash # Navigate to your projects folder cd ~/projects # Clone or copy the project git clone command-center cd command-center # Install dependencies npm install ``` ### Verify Installation ```bash npm run dev ``` Open http://localhost:5173 in a browser. You should see the dashboard (it won't have data yet). --- ## 3. Home Assistant Setup ### Step 1: Create a Long-Lived Access Token The app needs a token to communicate with Home Assistant. 1. **Open Home Assistant** in your browser 2. **Click your username** (bottom-left corner of the sidebar) 3. **Scroll down** to "Long-Lived Access Tokens" section 4. **Click "Create Token"** 5. **Enter a name**: `Command Center` 6. **Click "OK"** 7. **IMPORTANT: Copy the token immediately!** You won't be able to see it again. Save this token somewhere safe - you'll need it when you first launch the app. ### Step 2: Find Your Entity IDs You need to know the exact entity IDs for your devices. 1. **Go to Developer Tools** (sidebar) → **States** 2. **Search for your entities** using the filter box 3. **Note down the entity IDs** for: - Thermostats (e.g., `climate.living_room_thermostat`) - Lights (e.g., `light.kitchen_main`) - Locks (e.g., `lock.front_door`) - Alarm panel (e.g., `alarm_control_panel.alarmo`) - Person entities (e.g., `person.john`) - Todo list (e.g., `todo.shopping_list`) **Tip:** Entity IDs are case-sensitive! ### Step 3: Set Up Alarmo (Optional) If you want alarm panel functionality: 1. **Install HACS** if you haven't: [hacs.xyz](https://hacs.xyz) 2. **Install Alarmo** from HACS 3. **Configure Alarmo**: Settings → Devices & Services → Alarmo 4. **Set up a PIN code** for arming/disarming 5. **Add sensors** to your alarm zones 6. **Note the entity ID** (usually `alarm_control_panel.alarmo`) --- ## 4. Google Calendar Setup (Optional) If you want to display your Google Calendar events. ### Step 1: Create a Google Cloud Project 1. Go to [Google Cloud Console](https://console.cloud.google.com/) 2. **Sign in** with your Google account 3. Click **"Select a project"** (top bar) → **"New Project"** 4. **Project name**: `Command Center` 5. Click **"Create"** 6. Wait for the project to be created, then select it ### Step 2: Enable the Google Calendar API 1. In the left sidebar, click **"APIs & Services"** → **"Library"** 2. Search for **"Google Calendar API"** 3. Click on **"Google Calendar API"** 4. Click **"Enable"** ### Step 3: Configure OAuth Consent Screen 1. Go to **"APIs & Services"** → **"OAuth consent screen"** 2. Select **"External"** → Click **"Create"** 3. Fill in the required fields: - **App name**: `Command Center` - **User support email**: Your email - **Developer contact email**: Your email 4. Click **"Save and Continue"** 5. On **Scopes** page, click **"Add or Remove Scopes"** 6. Find and check: `https://www.googleapis.com/auth/calendar.readonly` 7. Click **"Update"** → **"Save and Continue"** 8. On **Test users** page, click **"Add Users"** 9. **Add your Google email address** 10. Click **"Save and Continue"** → **"Back to Dashboard"** ### Step 4: Create OAuth Credentials 1. Go to **"APIs & Services"** → **"Credentials"** 2. Click **"Create Credentials"** → **"OAuth client ID"** 3. **Application type**: Select **"Desktop app"** 4. **Name**: `Command Center Desktop` 5. Click **"Create"** 6. **Copy the "Client ID"** (looks like: `123456789-xxxxx.apps.googleusercontent.com`) ### Step 5: Add to Environment File Add to your `.env` file: ```env VITE_GOOGLE_CLIENT_ID=123456789-xxxxx.apps.googleusercontent.com ``` --- ## 5. Camera Setup You have **two options** for viewing cameras: ### Option A: Use go2rtc (Recommended) If you already have go2rtc running (e.g., with Frigate), you can stream cameras directly. **In your `.env` file:** ```env VITE_GO2RTC_URL=http://192.168.1.241:1985 ``` **In `src/config/entities.ts`, configure your cameras:** ```typescript cameras: [ { name: 'FPE', displayName: 'Front Porch', go2rtcStream: 'FPE' }, { name: 'Backyard', displayName: 'Backyard', go2rtcStream: 'Backyard' }, // Stream names must match your go2rtc.yaml configuration ], ``` **Verify go2rtc is working:** - Open `http://your-go2rtc-ip:1985` in a browser - You should see a list of your camera streams - Click a stream to verify video plays ### Option B: Use External Camera Viewer App If you have a separate camera viewer application (like the one we created previously), you can: 1. **Disable the built-in camera overlay** by leaving the cameras array empty: ```typescript cameras: [], ``` 2. **Open your camera viewer app** separately when needed 3. **Or modify the camera button** in `Header.tsx` to launch your external app ### Option C: Use Home Assistant Camera Entities If your cameras are integrated into Home Assistant: 1. The app can display camera snapshots via HA camera entities 2. Configure camera entity IDs in `entities.ts` 3. Note: This provides snapshots, not live video streams --- ## 6. Entity Configuration ### Step 1: Create Environment File **Windows (PowerShell):** ```powershell Copy-Item .env.example .env notepad .env ``` **Linux:** ```bash cp .env.example .env nano .env ``` ### Step 2: Edit .env File ```env # Home Assistant - UPDATE THESE VITE_HA_URL=http://192.168.1.50:8123 VITE_HA_WS_URL=ws://192.168.1.50:8123/api/websocket # Frigate (optional - for person detection alerts) VITE_FRIGATE_URL=http://192.168.1.241:5000 # go2rtc (optional - for camera streams) VITE_GO2RTC_URL=http://192.168.1.241:1985 # Google Calendar (optional - from Step 4) VITE_GOOGLE_CLIENT_ID= # Screen timeout in milliseconds (5 minutes = 300000) VITE_SCREEN_IDLE_TIMEOUT=300000 ``` ### Step 3: Edit Entity Configuration Edit `src/config/entities.ts` with your actual entity IDs: ```typescript export const entitiesConfig: EntitiesConfig = { // THERMOSTATS - Update with your thermostat entity IDs thermostats: [ { entityId: 'climate.downstairs', // <-- Your entity ID name: 'Downstairs', location: 'downstairs', }, { entityId: 'climate.upstairs', // <-- Your entity ID name: 'Upstairs', location: 'upstairs', }, ], // LIGHTS - Group by room, update entity IDs lights: [ // Living Room { entityId: 'light.living_room_ceiling', name: 'Ceiling', room: 'Living Room' }, { entityId: 'light.living_room_lamp', name: 'Lamp', room: 'Living Room' }, // Kitchen { entityId: 'light.kitchen_main', name: 'Main', room: 'Kitchen' }, // Add more rooms and lights... ], // DOOR LOCKS - Update entity IDs locks: [ { entityId: 'lock.front_door_lock', name: 'Front Door', location: 'front' }, { entityId: 'lock.back_door_lock', name: 'Back Door', location: 'back' }, { entityId: 'lock.garage_entry', name: 'Garage', location: 'garage' }, ], // ALARM - Alarmo entity ID alarm: 'alarm_control_panel.alarmo', // PACKAGE DETECTION - Binary sensor for package notifications packageSensor: 'binary_sensor.package_detected', // TODO LIST - Home Assistant todo entity todoList: 'todo.shopping_list', // CAMERAS - go2rtc stream names (see Camera Setup section) cameras: [ { name: 'FPE', displayName: 'Front Porch', go2rtcStream: 'FPE', frigateCamera: 'FPE' }, { name: 'Backyard', displayName: 'Backyard', go2rtcStream: 'Backyard', frigateCamera: 'Backyard' }, // Add your cameras... ], // PERSON DETECTION - Frigate binary sensors that trigger alerts personDetectionEntities: [ 'binary_sensor.front_porch_person_occupancy', 'binary_sensor.backyard_person_occupancy', ], // PEOPLE TRACKING - Person entities with optional avatars people: [ { entityId: 'person.john', name: 'John', avatarUrl: '/avatars/john.jpg', // Place image in public/avatars/ }, { entityId: 'person.jane', name: 'Jane', avatarUrl: '/avatars/jane.jpg', }, ], }; ``` ### Step 4: Add Avatar Images (Optional) **Windows:** ```powershell mkdir public\avatars # Copy your avatar images to public\avatars\ ``` **Linux:** ```bash mkdir -p public/avatars cp ~/photos/john.jpg public/avatars/ cp ~/photos/jane.jpg public/avatars/ ``` --- ## 7. Building the Application ### Test in Development Mode First ```bash npm run dev ``` Open http://localhost:5173 and verify everything works. ### Build for Production **For Windows:** ```bash npm run build:win ``` Output: `dist/Command Center Setup-1.0.0.exe` **For Linux:** ```bash npm run build:linux ``` Output: `dist/command-center-1.0.0.AppImage` **For Current Platform:** ```bash npm run build ``` --- ## 8. Windows Deployment ### Option A: Run the Installer 1. Copy `dist/Command Center Setup-1.0.0.exe` to your Windows touchscreen device 2. Run the installer 3. The app will be installed to Program Files 4. Launch from Start Menu ### Option B: Portable Mode 1. Copy the entire `dist/win-unpacked` folder to your device 2. Run `Command Center.exe` directly ### Auto-Start on Windows 1. Press `Win + R`, type `shell:startup`, press Enter 2. Create a shortcut to the app in this folder 3. The app will start automatically on login ### Kiosk Mode on Windows **Using Windows Assigned Access (Windows 10/11 Pro):** 1. Create a dedicated user account for the kiosk 2. Go to Settings → Accounts → Family & other users 3. Set up a kiosk (Assigned Access) 4. Select the Command Center app **Using a startup script:** Create `start-kiosk.bat`: ```batch @echo off start "" "C:\Program Files\Command Center\Command Center.exe" --kiosk ``` ### Disable Screen Timeout (Windows) 1. Settings → System → Power & sleep 2. Set "Screen" and "Sleep" to "Never" Or via PowerShell: ```powershell powercfg /change monitor-timeout-ac 0 powercfg /change standby-timeout-ac 0 ``` --- ## 9. Linux Deployment ### Copy the App ```bash # From your build machine scp dist/command-center-1.0.0.AppImage user@touchscreen-device:~/ # On the touchscreen device chmod +x ~/command-center-1.0.0.AppImage ``` ### Install Dependencies ```bash sudo apt update sudo apt install -y libgtk-3-0 libnotify4 libnss3 libxss1 libasound2 unclutter ``` ### Create Startup Script ```bash nano ~/start-kiosk.sh ``` ```bash #!/bin/bash # Wait for display sleep 3 # Disable screen blanking xset s off xset -dpms xset s noblank # Hide cursor when idle unclutter -idle 3 -root & # Start the app ~/command-center-1.0.0.AppImage --no-sandbox ``` ```bash chmod +x ~/start-kiosk.sh ``` ### Auto-Start with Systemd ```bash sudo nano /etc/systemd/system/command-center.service ``` ```ini [Unit] Description=Command Center Kiosk After=graphical.target [Service] Type=simple User=YOUR_USERNAME Environment=DISPLAY=:0 ExecStart=/home/YOUR_USERNAME/start-kiosk.sh Restart=on-failure RestartSec=5 [Install] WantedBy=graphical.target ``` **Replace `YOUR_USERNAME` with your actual username!** ```bash sudo systemctl enable command-center.service sudo systemctl start command-center.service ``` ### Raspberry Pi Specific Setup **Enable auto-login:** ```bash sudo raspi-config # → System Options → Boot / Auto Login → Desktop Autologin ``` **Disable screen blanking:** ```bash sudo nano /etc/xdg/lxsession/LXDE-pi/autostart ``` Add: ``` @xset s off @xset -dpms @xset s noblank ``` --- ## 10. First Launch ### Step 1: Start the App Launch the application on your touchscreen device. ### Step 2: Enter Home Assistant Token 1. The app will show "Disconnected" status 2. Look for a **Settings** button (gear icon) or the connection status 3. Click to open settings 4. **Paste your Home Assistant token** (from Step 3.1) 5. Click **"Save & Connect"** ### Step 3: Verify Connection - Status should change to **"Connected"** (green) - Your thermostat temperatures should appear - Lights and locks should show their states ### Step 4: Connect Google Calendar (Optional) 1. Click **"Connect Google Calendar"** in the calendar widget 2. A browser window will open 3. Sign in with your Google account 4. Click **"Allow"** to grant calendar access 5. Close the browser window 6. Calendar events should now appear --- ## 11. Troubleshooting ### "Disconnected" - Can't Connect to Home Assistant | Check | Solution | |-------|----------| | URL correct? | Verify `VITE_HA_URL` matches your HA address | | Token valid? | Create a new token in HA if expired | | Network? | Ensure device can reach HA (try ping) | | Firewall? | Port 8123 must be accessible | | HTTPS? | If HA uses HTTPS, update URL to `https://` | ### Cameras Not Loading | Check | Solution | |-------|----------| | go2rtc running? | Open `http://go2rtc-ip:1985` in browser | | Stream names match? | Names in config must match go2rtc exactly | | Network access? | Device must reach go2rtc server | | CORS issues? | go2rtc should allow cross-origin requests | ### Entities Show "Loading..." | Check | Solution | |-------|----------| | Entity ID correct? | Check exact ID in HA Developer Tools | | Entity exists? | Search for it in HA States | | Case sensitive! | `climate.Living_Room` ≠ `climate.living_room` | ### Google Calendar Won't Connect | Check | Solution | |-------|----------| | Client ID set? | Check `.env` has `VITE_GOOGLE_CLIENT_ID` | | Test user added? | Your email must be in OAuth test users | | API enabled? | Google Calendar API must be enabled | | Popup blocked? | Allow popups for the app | ### App Crashes on Linux ```bash # Check logs journalctl -u command-center.service -f # Run manually to see errors DISPLAY=:0 ~/command-center-1.0.0.AppImage --no-sandbox 2>&1 ``` Common fixes: - Add `--no-sandbox` flag - Install missing dependencies: `sudo apt install libgtk-3-0 libnss3` ### Screen Goes Black / Sleeps **Windows:** - Settings → Power & sleep → Never **Linux:** ```bash xset s off && xset -dpms && xset s noblank ``` ### Touch Not Responding (Linux) ```bash # Check touch device detected xinput list # Calibrate touchscreen sudo apt install xinput-calibrator xinput_calibrator ``` --- ## Quick Reference ### Commands | Task | Command | |------|---------| | Development mode | `npm run dev` | | Build for Windows | `npm run build:win` | | Build for Linux | `npm run build:linux` | | Build for current OS | `npm run build` | ### Linux Service Commands | Task | Command | |------|---------| | Check status | `sudo systemctl status command-center` | | Start | `sudo systemctl start command-center` | | Stop | `sudo systemctl stop command-center` | | Restart | `sudo systemctl restart command-center` | | View logs | `journalctl -u command-center -f` | ### File Locations | File | Purpose | |------|---------| | `.env` | Environment variables (URLs, API keys) | | `src/config/entities.ts` | Entity ID configuration | | `public/avatars/` | Person avatar images | --- ## Network Architecture ``` ┌─────────────────────┐ │ Touchscreen │ │ (Command Center) │ └──────────┬──────────┘ │ ┌─────┴─────┐ │ │ ▼ ▼ ┌─────────┐ ┌─────────┐ │ Home │ │ go2rtc │ (Optional) │Assistant│ │ Cameras │ │ :8123 │ │ :1985 │ └─────────┘ └─────────┘ │ ▼ ┌─────────────────────┐ │ Smart Devices │ │ Lights, Locks, etc. │ └─────────────────────┘ ``` --- ## Support If you encounter issues: 1. Check the [Troubleshooting](#11-troubleshooting) section 2. Verify all entity IDs match exactly 3. Check browser console for errors (F12 → Console) 4. Review Home Assistant logs for connection issues