Home Assistant Manager Expert-level Home Assistant configuration management with efficient workflows, remote CLI access, and verification protocols. Core Capabilities Remote Home Assistant instance management via SSH and hass-cli Smart deployment workflows (git-based and rapid iteration) Configuration validation and safety checks Automation testing and verification Log analysis and error detection Reload vs restart optimization Lovelace dashboard development and optimization Template syntax patterns and debugging Tablet-optimized UI design Prerequisites Before starting, verify the environment has: SSH access to Home Assistant instance ( root@homeassistant.local ) hass-cli installed locally Environment variables loaded (HASS_SERVER, HASS_TOKEN) Git repository connected to HA /config directory Context7 MCP server with Home Assistant docs (recommended) Remote Access Patterns Using hass-cli (Local, via REST API) All hass-cli commands use environment variables automatically:
List entities
hass-cli state list
Get specific state
hass-cli state get sensor.entity_name
Call services
hass-cli service call automation.reload hass-cli service call automation.trigger --arguments entity_id = automation.name Using SSH for HA CLI
Check configuration validity
ssh root@homeassistant.local "ha core check"
Restart Home Assistant
ssh root@homeassistant.local "ha core restart"
View logs
ssh root@homeassistant.local "ha core logs"
Tail logs with grep
ssh root@homeassistant.local "ha core logs | grep -i error | tail -20" Deployment Workflows Standard Git Workflow (Final Changes) Use for changes you want in version control:
1. Make changes locally
2. Check validity
ssh root@homeassistant.local "ha core check"
3. Commit and push
git add file.yaml git commit -m "Description" git push
4. CRITICAL: Pull to HA instance
ssh root@homeassistant.local "cd /config && git pull"
5. Reload or restart
hass-cli service call automation.reload
if reload sufficient
OR
ssh root@homeassistant.local "ha core restart"
if restart needed
6. Verify
hass-cli state get sensor.new_entity ssh root@homeassistant.local "ha core logs | grep -i error | tail -20" Rapid Development Workflow (Testing/Iteration) Use scp for quick testing before committing:
1. Make changes locally
2. Quick deploy
scp automations.yaml root@homeassistant.local:/config/
3. Reload/restart
hass-cli service call automation.reload
4. Test and iterate (repeat 1-3 as needed)
5. Once finalized, commit to git
git add automations.yaml git commit -m "Final tested changes" git push When to use scp: 🚀 Rapid iteration and testing 🔄 Frequent small adjustments 🧪 Experimental changes 🎨 UI/Dashboard work When to use git: ✅ Final tested changes 📦 Version control tracking 🔒 Important configs 👥 Changes to document Reload vs Restart Decision Making ALWAYS assess if reload is sufficient before requiring a full restart. Can be reloaded (fast, preferred): ✅ Automations: hass-cli service call automation.reload ✅ Scripts: hass-cli service call script.reload ✅ Scenes: hass-cli service call scene.reload ✅ Template entities: hass-cli service call template.reload ✅ Groups: hass-cli service call group.reload ✅ Themes: hass-cli service call frontend.reload_themes Require full restart: ❌ Min/Max sensors and platform-based sensors ❌ New integrations in configuration.yaml ❌ Core configuration changes ❌ MQTT sensor/binary_sensor platforms Automation Verification Workflow ALWAYS verify automations after deployment: Step 1: Deploy git add automations.yaml && git commit -m "..." && git push ssh root@homeassistant.local "cd /config && git pull" Step 2: Check Configuration ssh root@homeassistant.local "ha core check" Step 3: Reload hass-cli service call automation.reload Step 4: Manually Trigger hass-cli service call automation.trigger --arguments entity_id = automation.name Why trigger manually? Instant feedback (don't wait for scheduled triggers) Verify logic before production Catch errors immediately Step 5: Check Logs sleep 3 ssh root@homeassistant.local "ha core logs | grep -i 'automation_name' | tail -20" Success indicators: Initialized trigger AutomationName Running automation actions Executing step ... No ERROR or WARNING messages Error indicators: Error executing script Invalid data for call_service TypeError , Template variable warning Step 6: Verify Outcome For notifications: Ask user if they received it Check logs for mobile_app messages For device control: hass-cli state get switch.device_name For sensors: hass-cli state get sensor.new_sensor Step 7: Fix and Re-test if Needed If errors found: Identify root cause from error messages Fix the issue Re-deploy (steps 1-2) Re-verify (steps 3-6) Dashboard Management Dashboard Fundamentals What are Lovelace Dashboards? JSON files in .storage/ directory (e.g., .storage/lovelace.control_center ) UI configuration for Home Assistant frontend Optimizable for different devices (mobile, tablet, wall panels) Critical Understanding: Creating dashboard file is NOT enough - must register in .storage/lovelace_dashboards Dashboard changes don't require HA restart (just browser refresh) Use panel view for full-screen content (maps, cameras) Use sections view for organized multi-card layouts Dashboard Development Workflow Rapid Iteration with scp (Recommended for dashboards):
1. Make changes locally
vim .storage/lovelace.control_center
2. Deploy immediately (no git commit yet)
scp .storage/lovelace.control_center root@homeassistant.local:/config/.storage/
3. Refresh browser (Ctrl+F5 or Cmd+Shift+R)
No HA restart needed!
4. Iterate: Repeat 1-3 until perfect
5. Commit when stable
git add .storage/lovelace.control_center git commit -m "Update dashboard layout" git push ssh root@homeassistant.local "cd /config && git pull" Why scp for dashboards: Instant feedback (no HA restart) Iterate quickly on visual changes Commit only stable versions Creating New Dashboard Complete workflow:
Step 1: Create dashboard file
cp .storage/lovelace.my_home .storage/lovelace.new_dashboard
Step 2: Register in lovelace_dashboards
Edit .storage/lovelace_dashboards to add:
{ "id" : "new_dashboard" , "show_in_sidebar" : true, "icon" : "mdi:tablet-dashboard" , "title" : "New Dashboard" , "require_admin" : false, "mode" : "storage" , "url_path" : "new-dashboard" }
Step 3: Deploy both files
scp .storage/lovelace.new_dashboard root@homeassistant.local:/config/.storage/ scp .storage/lovelace_dashboards root@homeassistant.local:/config/.storage/
Step 4: Restart HA (required for registry changes)
ssh root@homeassistant.local "ha core restart" sleep 30
Step 5: Verify appears in sidebar
Update .gitignore to track:
Exclude .storage/ by default
.storage /
Include dashboard files
! .storage / lovelace.new_dashboard ! .storage / lovelace_dashboards View Types Decision Matrix Use Panel View when: Displaying full-screen map (vacuum, cameras) Single large card needs full width Want zero margins/padding Minimize scrolling Use Sections View when: Organizing multiple cards Need responsive grid layout Building multi-section dashboards Layout Example: // Panel view - full width, no margins { "type" : "panel" , "title" : "Vacuum Map" , "path" : "map" , "cards" : [ { "type" : "custom:xiaomi-vacuum-map-card" , "entity" : "vacuum.dusty" } ] } // Sections view - organized, has ~10% margins { "type" : "sections" , "title" : "Home" , "sections" : [ { "type" : "grid" , "cards" : [ ... ] } ] } Card Types Quick Reference Mushroom Cards (Modern, Touch-Optimized): { "type" : "custom:mushroom-light-card" , "entity" : "light.living_room" , "use_light_color" : true , "show_brightness_control" : true , "collapsible_controls" : true , "fill_container" : true } Best for tablets and touch screens Animated, colorful icons Built-in slider controls Mushroom Template Card (Dynamic Content): { "type" : "custom:mushroom-template-card" , "primary" : "All Doors" , "secondary" : "{% set sensors = ['binary_sensor.front_door'] %}\n{% set open = sensors | select('is_state', 'on') | list | length %}\n{{ open }} / {{ sensors | length }} open" , "icon" : "mdi:door" , "icon_color" : "{% if open > 0 %}red{% else %}green{% endif %}" } Use Jinja2 templates for dynamic content Color-code status with icon_color Multi-line templates use \n in JSON Tile Card (Built-in, Modern): { "type" : "tile" , "entity" : "climate.thermostat" , "features" : [ { "type" : "climate-hvac-modes" , "hvac_modes" : [ "heat" , "cool" , "fan_only" , "off" ] } , { "type" : "target-temperature" } ] } No custom cards required Built-in features for controls Common Template Patterns Counting Open Doors: {% set door_sensors = [ 'binary_sensor.front_door' , 'binary_sensor.back_door' ] %} {% set open = door_sensors | select ( 'is_state' , 'on' ) | list | length %} {{ open }} / {{ door_sensors | length }} open Color-Coded Days Until: {% set days = state_attr ( 'sensor.bin_collection' , 'daysTo' ) | int %} {% if days <= 1 %} red {% elif days <= 3 %} amber {% elif days <= 7 %} yellow {% else %} grey {% endif %} Conditional Display: {% set bins = [ ] %} {% if days and days | int <= 7 %} {% set bins = bins + [ 'Recycling' ] %} {% endif %} {% if bins %} This week: {{ bins | join ( ', ' ) }} {% else %} None this week {% endif %} IMPORTANT: Always use | int or | float to avoid type errors when comparing Tablet Optimization Screen-specific layouts: 11-inch tablets: 3-4 columns Touch targets: minimum 44x44px Minimize scrolling: Use panel view for full-screen Visual feedback: Color-coded status (red/green/amber) Grid Layout for Tablets: { "type" : "grid" , "columns" : 3 , "square" : false , "cards" : [ { "type" : "custom:mushroom-light-card" , "entity" : "light.living_room" } , { "type" : "custom:mushroom-light-card" , "entity" : "light.bedroom" } ] } Common Dashboard Pitfalls Problem 1: Dashboard Not in Sidebar Cause: File created but not registered Fix: Add to .storage/lovelace_dashboards and restart HA Problem 2: "Configuration Error" in Card Cause: Custom card not installed, wrong syntax, template error Fix: Check HACS for card installation Check browser console (F12) for details Test templates in Developer Tools → Template Problem 3: Auto-Entities Fails Cause: card_param not supported by card type Fix: Use cards that accept entities parameter: ✅ Works: entities , vertical-stack , horizontal-stack ❌ Doesn't work: grid , glance (without specific syntax) Problem 4: Vacuum Map Has Margins/Scrolling Cause: Using sections view (has margins) Fix: Use panel view for full-width, no scrolling Problem 5: Template Type Errors Error: TypeError: '<' not supported between instances of 'str' and 'int' Fix: Use type filters: states('sensor.days') | int < 7 Dashboard Debugging 1. Browser Console (F12): Check for red errors when loading dashboard Common: "Custom element doesn't exist" → Card not installed 2. Validate JSON Syntax: python3 -m json.tool .storage/lovelace.control_center
/dev/null 3. Test Templates: Home Assistant → Developer Tools → Template Paste template to test before adding to dashboard 4. Verify Entities: hass-cli state get binary_sensor.front_door 5. Clear Browser Cache: Hard refresh: Ctrl+F5 or Cmd+Shift+R Try incognito window Real-World Examples Quick Controls Dashboard Section { "type" : "grid" , "title" : "Quick Controls" , "cards" : [ { "type" : "custom:mushroom-template-card" , "primary" : "All Doors" , "secondary" : "{% set doors = ['binary_sensor.front_door', 'binary_sensor.back_door'] %}\n{% set open = doors | select('is_state', 'on') | list | length %}\n{{ open }} / {{ doors | length }} open" , "icon" : "mdi:door" , "icon_color" : "{% if open > 0 %}red{% else %}green{% endif %}" } , { "type" : "tile" , "entity" : "climate.thermostat" , "features" : [ { "type" : "climate-hvac-modes" , "hvac_modes" : [ "heat" , "cool" , "fan_only" , "off" ] } , { "type" : "target-temperature" } ] } ] } Individual Light Cards (Touch-Friendly) { "type" : "grid" , "title" : "Lights" , "columns" : 3 , "cards" : [ { "type" : "custom:mushroom-light-card" , "entity" : "light.office_studio" , "name" : "Office" , "use_light_color" : true , "show_brightness_control" : true , "collapsible_controls" : true } ] } Full-Screen Vacuum Map { "type" : "panel" , "title" : "Vacuum" , "path" : "vacuum-map" , "cards" : [ { "type" : "custom:xiaomi-vacuum-map-card" , "vacuum_platform" : "Tasshack/dreame-vacuum" , "entity" : "vacuum.dusty" } ] } Common Commands Quick Reference
Configuration
ssh root@homeassistant.local "ha core check" ssh root@homeassistant.local "ha core restart"
Logs
ssh root@homeassistant.local "ha core logs | tail -50" ssh root@homeassistant.local "ha core logs | grep -i error | tail -20"
State/Services
hass-cli state list hass-cli state get entity.name hass-cli service call automation.reload hass-cli service call automation.trigger --arguments entity_id = automation.name
Deployment
git add . && git commit -m "..." && git push ssh root@homeassistant.local "cd /config && git pull" scp file.yaml root@homeassistant.local:/config/
Dashboard deployment
scp .storage/lovelace.my_dashboard root@homeassistant.local:/config/.storage/ python3 -m json.tool .storage/lovelace.my_dashboard
/dev/null
Validate JSON
Quick test cycle
scp automations.yaml root@homeassistant.local:/config/ hass-cli service call automation.reload hass-cli service call automation.trigger --arguments entity_id = automation.name ssh root@homeassistant.local "ha core logs | grep -i 'automation' | tail -10" Best Practices Summary Always check configuration before restart: ha core check Prefer reload over restart when possible Test automations manually after deployment Check logs for errors after every change Use scp for rapid iteration , git for final changes Verify outcomes - don't assume it worked Use Context7 for current documentation Test templates in Dev Tools before adding to dashboards Validate JSON syntax before deploying dashboards Test on actual device for tablet dashboards Color-code status for visual feedback (red/green/amber) Commit only stable versions - test with scp first Workflow Decision Tree Configuration Change Needed ├─ Is this final/tested? │ ├─ YES → Use git workflow │ └─ NO → Use scp workflow ├─ Check configuration valid ├─ Deploy (git pull or scp) ├─ Needs restart? │ ├─ YES → ha core restart │ └─ NO → Use appropriate reload ├─ Verify in logs └─ Test outcome Dashboard Change Needed ├─ Make changes locally ├─ Deploy via scp for testing ├─ Refresh browser (Ctrl+F5) ├─ Test on target device ├─ Iterate until perfect └─ Commit to git when stable This skill encapsulates efficient Home Assistant management workflows developed through iterative optimization and real-world dashboard development. Apply these patterns to any Home Assistant instance for reliable, fast, and safe configuration management.