Skip to content
Back to skills

Ha Conditional Cards

ASecurity

Implements conditional visibility for Home Assistant dashboard cards using state, numeric_state, screen, user, time, and/or conditions via Conditional Card wrapper and per-card visibility property. Use when asked to "hide card when", "show only if", "user-specific dashboard", "mobile vs desktop cards", "conditional visibility", or "show card based on state/time/user".

  • 666 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added February 8, 2026
documentationgosecuritydocumentation

Works with

  • cli

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add majiayu000/claude-skill-registry --skill ha-conditional-cards --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ha Conditional Cards?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ha Conditional Cards
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-ha-conditional-cards/badge)](https://www.skillsdirectory.com/skills/majiayu000-ha-conditional-cards)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ha-conditional-cards
description: |
  Implements conditional visibility for Home Assistant dashboard cards using state, numeric_state,
  screen, user, time, and/or conditions via Conditional Card wrapper and per-card visibility
  property. Use when asked to "hide card when", "show only if", "user-specific dashboard",
  "mobile vs desktop cards", "conditional visibility", or "show card based on state/time/user".

---

Works with Lovelace YAML dashboards and conditional/visibility card configurations.
# Home Assistant Conditional Cards

Control card visibility dynamically based on states, users, screen size, and complex conditions.

## Overview

Home Assistant provides two approaches for conditional visibility:
- **Conditional Card** (wrapper): Shows/hides entire card based on conditions
- **Per-Card Visibility**: Native `visibility` property on any card

Both support multiple condition types:
- **state**: Entity matches specific state
- **numeric_state**: Sensor value within range
- **screen**: Screen width/media queries
- **user**: Current user matches list
- **time**: Current time within range
- **and/or**: Complex logic combinations

## When to Use This Skill

Use this skill when you need to:
- Show cards only when specific conditions are met (person home, motion detected, temperature threshold)
- Create responsive dashboards with mobile vs desktop layouts
- Build user-specific views with different access levels
- Display time-based cards (daytime vs nighttime controls)
- Combine multiple conditions with AND/OR logic for complex visibility rules

Do NOT use when:
- You need to modify card content based on state (use template cards instead)
- Building static dashboards where all cards are always visible
- Checking entity attributes directly (create template sensor first)

## Quick Start

### Conditional Card (Wrapper)

```yaml
type: conditional
conditions:
  - condition: state
    entity: person.john
    state: home
card:
  type: entities
  entities:
    - light.bedroom
```

### Per-Card Visibility (Native)

```yaml
type: entities
entities:
  - light.bedroom
visibility:
  - condition: state
    entity: person.john
    state: home
```

## Usage

1. **Choose approach**: Use Conditional Card wrapper for complex logic, per-card visibility for simple conditions
2. **Select condition type**: state, numeric_state, screen, user, time, and/or
3. **Apply condition**: Add `conditions` to conditional card or `visibility` to any card
4. **Test in edit mode**: Exit edit mode to test visibility (cards always show when editing)
5. **Verify entity states**: Check Developer Tools → States to debug conditions

See Condition Types Reference below for all available conditions and syntax.

## Condition Types Reference

| Condition | Parameters | Use Case |
|-----------|------------|----------|
| `state` | `entity`, `state` | Show when entity has specific state |
| `numeric_state` | `entity`, `above`, `below` | Show when sensor in range |
| `screen` | `media_query` | Show based on screen width |
| `user` | `users` (list of user IDs) | Show for specific users only |
| `time` | `after`, `before` | Show during specific time window |
| `and` | List of conditions | All conditions must be true |
| `or` | List of conditions | At least one condition must be true |

## State Conditions

### Basic State Match

```yaml
type: conditional
conditions:
  - condition: state
    entity: binary_sensor.motion_living_room
    state: "on"
card:
  type: camera
  entity: camera.living_room
```

### Multiple State Options

```yaml
visibility:
  - condition: state
    entity: climate.living_room
    state_not:
      - "off"
      - unavailable
```

### State with Attributes (Workaround)

**Note:** Native conditional cards don't support attribute conditions. Create a template sensor instead.

```yaml
# In configuration.yaml
template:
  - sensor:
      - name: "AC Mode Cool"
        state: "{{ state_attr('climate.living_room', 'hvac_mode') == 'cool' }}"

# In dashboard
visibility:
  - condition: state
    entity: sensor.ac_mode_cool
    state: "True"
```

## Numeric State Conditions

### Temperature Range

```yaml
type: entities
entities:
  - climate.bedroom
visibility:
  - condition: numeric_state
    entity: sensor.temperature
    above: 18
    below: 30
```

### Above Threshold

```yaml
visibility:
  - condition: numeric_state
    entity: sensor.battery
    below: 20  # Show when battery < 20%
```

### Between Values

```yaml
visibility:
  - condition: numeric_state
    entity: sensor.humidity
    above: 40
    below: 60  # Show when 40% < humidity < 60%
```

## Screen/Responsive Conditions

### Mobile Only

```yaml
visibility:
  - condition: screen
    media_query: "(max-width: 600px)"
```

### Desktop Only

```yaml
visibility:
  - condition: screen
    media_query: "(min-width: 1280px)"
```

### Tablet Range

```yaml
visibility:
  - condition: screen
    media_query: "(min-width: 601px) and (max-width: 1279px)"
```

### Common Media Queries

```yaml
# Mobile (portrait)
media_query: "(max-width: 600px)"

# Tablet (portrait)
media_query: "(min-width: 601px) and (max-width: 900px)"

# Desktop
media_query: "(min-width: 1280px)"

# Landscape orientation
media_query: "(orientation: landscape)"

# Portrait orientation
media_query: "(orientation: portrait)"
```

## User Conditions

### Single User

```yaml
visibility:
  - condition: user
    users:
      - 1234567890abcdef  # User ID (not username)
```

### Multiple Users (Admin Access)

```yaml
type: entities
entities:
  - switch.advanced_settings
visibility:
  - condition: user
    users:
      - 1234567890abcdef  # Admin user 1
      - fedcba0987654321  # Admin user 2
```

**Finding User IDs:**
1. Go to Settings → People
2. Click on user
3. User ID is in the URL: `/config/person/USER_ID_HERE`

## Time Conditions

### During Daytime

```yaml
visibility:
  - condition: time
    after: "06:00:00"
    before: "22:00:00"
```

### Night Mode Cards

```yaml
visibility:
  - condition: time
    after: "22:00:00"
    before: "06:00:00"
```

### Business Hours

```yaml
visibility:
  - condition: time
    after: "09:00:00"
    before: "17:00:00"
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
```

## Complex Logic (AND/OR)

### AND Condition (All Must Be True)

```yaml
visibility:
  - condition: and
    conditions:
      - condition: state
        entity: person.john
        state: home
      - condition: numeric_state
        entity: sensor.temperature
        below: 18
      - condition: time
        after: "06:00:00"
        before: "23:00:00"
```

### OR Condition (At Least One Must Be True)

```yaml
visibility:
  - condition: or
    conditions:
      - condition: state
        entity: person.john
        state: home
      - condition: state
        entity: person.jane
        state: home
```

### Nested Logic

```yaml
visibility:
  - condition: and
    conditions:
      # Show during daytime...
      - condition: time
        after: "06:00:00"
        before: "22:00:00"
      # ...AND (someone is home OR security is armed)
      - condition: or
        conditions:
          - condition: state
            entity: person.john
            state: home
          - condition: state
            entity: alarm_control_panel.home
            state: armed_away
```

## Real-World Patterns

### Show Camera When Motion Detected

```yaml
type: conditional
conditions:
  - condition: state
    entity: binary_sensor.motion_living_room
    state: "on"
card:
  type: camera
  entity: camera.living_room
```

### Mobile vs Desktop Layout

```yaml
# Mobile: Compact view
type: custom:mushroom-chips-card
visibility:
  - condition: screen
    media_query: "(max-width: 600px)"

# Desktop: Detailed view
type: grid
columns: 3
visibility:
  - condition: screen
    media_query: "(min-width: 1280px)"
```

### User-Specific Controls

```yaml
type: entities
entities:
  - switch.developer_mode
visibility:
  - condition: user
    users:
      - 1234567890abcdef  # Admin user ID (Settings → People → URL)
```

For more patterns (low battery alerts, temperature warnings, occupied rooms, time-based controls), see `references/advanced-patterns.md`.

## Best Practices

1. **Combine approaches**: Use conditional card for complex logic, per-card visibility for simple conditions
2. **Test in edit mode**: Exit edit mode to test visibility (cards always visible when editing)
3. **Use helper entities**: Create template sensors for attribute-based or complex conditions
4. **Add buffer zones**: Use hysteresis for numeric conditions to prevent flapping
5. **Document user IDs**: Keep reference of user IDs for maintenance
6. **Screen conditions**: Use media queries for responsive mobile/desktop layouts

## Limitations

**Cannot check attributes directly** - Create template sensor to expose attribute as entity state.

**No template conditions** - Create template binary sensor instead.

**Always visible in edit mode** - Must exit edit mode to test visibility behavior.

For detailed workarounds, see `references/advanced-patterns.md`.

## Troubleshooting

| Issue | Solution |
|-------|----------|
| Card not hiding | Exit edit mode, check entity state, verify YAML indentation |
| User condition fails | Use user ID (not username), find in Settings → People → URL |
| Time condition fails | Use 24-hour format `"23:00:00"`, check HA timezone |
| Numeric condition fails | Verify sensor has numeric state (not "unknown") |
| Screen condition fails | Test on actual device (not browser resize) |

For detailed troubleshooting, see `references/advanced-patterns.md`.

## Supporting Files

- **references/advanced-patterns.md** - Complex logic patterns, real-world use cases, workarounds, detailed troubleshooting, best practices, common media queries

## Official Documentation

- [Conditional card - Home Assistant](https://www.home-assistant.io/dashboards/conditional/)
- [Card Visibility - Home Assistant](https://www.home-assistant.io/dashboards/cards/#card-visibility)
- [Template Sensors - Home Assistant](https://www.home-assistant.io/integrations/template/)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.