Skip to content
Back to skills

Ha Entities

ASecurity

Home Assistant entity and domain management. Use when working with entity IDs, device classes, customizations, template entities, groups, or understanding entity naming conventions and domain-specific attributes.

  • 58 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added February 8, 2026
toolsshellreactgit

Works with

  • cli

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add laurigates/claude-plugins --skill ha-entities --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ha Entities?

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

Security grade badge for Ha Entities
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/laurigates-ha-entities/badge)](https://www.skillsdirectory.com/skills/laurigates-ha-entities)

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
---
model: haiku
created: 2025-02-01
modified: 2025-02-01
reviewed: 2025-02-01
name: ha-entities
description: |
  Home Assistant entity and domain management. Use when working with entity IDs,
  device classes, customizations, template entities, groups, or understanding
  entity naming conventions and domain-specific attributes.
allowed-tools: Read, Edit, Write, Grep, Glob, TodoWrite
---

# Home Assistant Entities

## When to Use This Skill

| Use this skill when... | Use ha-automations instead when... |
|------------------------|-----------------------------------|
| Understanding entity domains | Creating automation rules |
| Customizing entities | Working with triggers/actions |
| Creating template sensors | Writing automation conditions |
| Setting up groups | Working with scripts/scenes |
| Working with device classes | Handling events |

## Entity ID Structure

```
domain.object_id
```

**Examples:**
- `light.living_room_ceiling`
- `sensor.outdoor_temperature`
- `binary_sensor.front_door_contact`
- `switch.garden_irrigation`

## Common Domains

| Domain | Description | Example |
|--------|-------------|---------|
| `light` | Lighting control | `light.kitchen` |
| `switch` | On/off switches | `switch.outlet` |
| `sensor` | Numeric sensors | `sensor.temperature` |
| `binary_sensor` | On/off sensors | `binary_sensor.motion` |
| `climate` | HVAC control | `climate.thermostat` |
| `cover` | Blinds, garage doors | `cover.garage` |
| `lock` | Door locks | `lock.front_door` |
| `media_player` | Media devices | `media_player.tv` |
| `camera` | Camera feeds | `camera.front_yard` |
| `vacuum` | Robot vacuums | `vacuum.roomba` |
| `fan` | Fan control | `fan.bedroom` |
| `alarm_control_panel` | Alarm systems | `alarm_control_panel.home` |
| `person` | People tracking | `person.john` |
| `device_tracker` | Device location | `device_tracker.phone` |
| `weather` | Weather info | `weather.home` |
| `input_boolean` | Virtual toggle | `input_boolean.guest_mode` |
| `input_number` | Virtual number | `input_number.target_temp` |
| `input_select` | Virtual dropdown | `input_select.house_mode` |
| `input_text` | Virtual text | `input_text.message` |
| `input_datetime` | Virtual date/time | `input_datetime.alarm` |
| `input_button` | Virtual button | `input_button.reset` |
| `automation` | Automations | `automation.motion_light` |
| `script` | Scripts | `script.morning_routine` |
| `scene` | Scenes | `scene.movie_night` |
| `group` | Entity groups | `group.all_lights` |
| `timer` | Countdown timers | `timer.laundry` |
| `counter` | Counters | `counter.guests` |
| `zone` | Geographic zones | `zone.home` |
| `sun` | Sun position | `sun.sun` |

## Device Classes

### Binary Sensor Device Classes

| Class | On State | Off State |
|-------|----------|-----------|
| `battery` | Low | Normal |
| `battery_charging` | Charging | Not charging |
| `cold` | Cold | Normal |
| `connectivity` | Connected | Disconnected |
| `door` | Open | Closed |
| `garage_door` | Open | Closed |
| `gas` | Gas detected | Clear |
| `heat` | Hot | Normal |
| `light` | Light detected | No light |
| `lock` | Unlocked | Locked |
| `moisture` | Wet | Dry |
| `motion` | Motion detected | Clear |
| `occupancy` | Occupied | Clear |
| `opening` | Open | Closed |
| `plug` | Plugged in | Unplugged |
| `power` | Power detected | No power |
| `presence` | Home | Away |
| `problem` | Problem | OK |
| `running` | Running | Not running |
| `safety` | Unsafe | Safe |
| `smoke` | Smoke detected | Clear |
| `sound` | Sound detected | Clear |
| `tamper` | Tampering | Clear |
| `update` | Update available | Up-to-date |
| `vibration` | Vibration | Clear |
| `window` | Open | Closed |

### Sensor Device Classes

| Class | Unit | Description |
|-------|------|-------------|
| `apparent_power` | VA | Apparent power |
| `aqi` | - | Air quality index |
| `atmospheric_pressure` | hPa | Atmospheric pressure |
| `battery` | % | Battery level |
| `carbon_dioxide` | ppm | CO2 concentration |
| `carbon_monoxide` | ppm | CO concentration |
| `current` | A | Electric current |
| `data_rate` | Mbps | Data transfer rate |
| `data_size` | GB | Data size |
| `distance` | m | Distance |
| `duration` | s | Time duration |
| `energy` | kWh | Energy consumption |
| `frequency` | Hz | Frequency |
| `gas` | m³ | Gas consumption |
| `humidity` | % | Relative humidity |
| `illuminance` | lx | Light level |
| `irradiance` | W/m² | Solar irradiance |
| `moisture` | % | Moisture level |
| `monetary` | € | Monetary value |
| `nitrogen_dioxide` | µg/m³ | NO2 concentration |
| `nitrogen_monoxide` | µg/m³ | NO concentration |
| `ozone` | µg/m³ | O3 concentration |
| `ph` | - | pH level |
| `pm1` | µg/m³ | PM1 concentration |
| `pm10` | µg/m³ | PM10 concentration |
| `pm25` | µg/m³ | PM2.5 concentration |
| `power` | W | Power consumption |
| `power_factor` | % | Power factor |
| `precipitation` | mm | Precipitation |
| `precipitation_intensity` | mm/h | Precipitation rate |
| `pressure` | hPa | Pressure |
| `reactive_power` | var | Reactive power |
| `signal_strength` | dBm | Signal strength |
| `sound_pressure` | dB | Sound level |
| `speed` | m/s | Speed |
| `sulphur_dioxide` | µg/m³ | SO2 concentration |
| `temperature` | °C | Temperature |
| `timestamp` | - | Timestamp |
| `volatile_organic_compounds` | µg/m³ | VOC concentration |
| `voltage` | V | Voltage |
| `volume` | L | Volume |
| `water` | L | Water consumption |
| `weight` | kg | Weight |
| `wind_speed` | m/s | Wind speed |

## Entity Customization

### customize.yaml

```yaml
# Single entity
light.living_room:
  friendly_name: "Living Room Light"
  icon: mdi:ceiling-light

# Binary sensor
binary_sensor.front_door:
  friendly_name: "Front Door"
  device_class: door

# Sensor
sensor.outdoor_temperature:
  friendly_name: "Outdoor Temperature"
  device_class: temperature
  unit_of_measurement: "°C"

# Hide entity from UI
sensor.internal_counter:
  hidden: true
```

### Glob Customization

```yaml
# Customize all entities matching pattern
customize_glob:
  "light.*_ceiling":
    icon: mdi:ceiling-light

  "sensor.*_temperature":
    device_class: temperature
    unit_of_measurement: "°C"

  "binary_sensor.*_motion":
    device_class: motion

  "switch.outlet_*":
    icon: mdi:power-socket-eu
```

## Template Entities

### Template Sensors

```yaml
template:
  - sensor:
      # Simple state
      - name: "Average Temperature"
        unit_of_measurement: "°C"
        device_class: temperature
        state: >-
          {{ ((states('sensor.living_room_temp') | float +
               states('sensor.bedroom_temp') | float +
               states('sensor.kitchen_temp') | float) / 3) | round(1) }}

      # With attributes
      - name: "Power Usage"
        unit_of_measurement: "W"
        device_class: power
        state: "{{ states('sensor.energy_meter_power') }}"
        attributes:
          cost_per_hour: >-
            {{ (states('sensor.energy_meter_power') | float * 0.15 / 1000) | round(2) }}
          daily_estimate: >-
            {{ (states('sensor.energy_meter_power') | float * 24 / 1000) | round(1) }}

      # Availability
      - name: "Solar Power"
        unit_of_measurement: "W"
        device_class: power
        state: "{{ states('sensor.inverter_power') }}"
        availability: "{{ states('sensor.inverter_power') != 'unavailable' }}"
```

### Template Binary Sensors

```yaml
template:
  - binary_sensor:
      - name: "Anyone Home"
        device_class: presence
        state: >-
          {{ is_state('person.user1', 'home') or
             is_state('person.user2', 'home') }}

      - name: "House Secure"
        device_class: safety
        state: >-
          {{ is_state('lock.front_door', 'locked') and
             is_state('lock.back_door', 'locked') and
             is_state('cover.garage', 'closed') }}
        icon: >-
          {% if is_state('binary_sensor.house_secure', 'on') %}
            mdi:shield-check
          {% else %}
            mdi:shield-alert
          {% endif %}

      - name: "Washing Machine Running"
        device_class: running
        state: "{{ states('sensor.washer_power') | float > 10 }}"
        delay_off:
          minutes: 5
```

### Template Switches

```yaml
template:
  - switch:
      - name: "Guest Mode"
        state: "{{ is_state('input_boolean.guest_mode', 'on') }}"
        turn_on:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.guest_mode
          - service: notify.mobile_app
            data:
              message: "Guest mode enabled"
        turn_off:
          - service: input_boolean.turn_off
            target:
              entity_id: input_boolean.guest_mode
```

### Template Buttons

```yaml
template:
  - button:
      - name: "Restart Server"
        press:
          - service: shell_command.restart_server
          - service: notify.admin
            data:
              message: "Server restart initiated"
```

### Template Numbers

```yaml
template:
  - number:
      - name: "Volume"
        min: 0
        max: 100
        step: 5
        state: "{{ state_attr('media_player.tv', 'volume_level') | float * 100 }}"
        set_value:
          - service: media_player.volume_set
            target:
              entity_id: media_player.tv
            data:
              volume_level: "{{ value / 100 }}"
```

## Groups

### Basic Groups

```yaml
group:
  all_lights:
    name: "All Lights"
    entities:
      - light.living_room
      - light.bedroom
      - light.kitchen
      - light.bathroom

  downstairs_lights:
    name: "Downstairs Lights"
    entities:
      - light.living_room
      - light.kitchen
      - light.hallway
```

### Light Groups (Native)

```yaml
light:
  - platform: group
    name: "All Downstairs Lights"
    unique_id: downstairs_lights
    entities:
      - light.living_room
      - light.kitchen
      - light.hallway
```

### Cover Groups

```yaml
cover:
  - platform: group
    name: "All Blinds"
    unique_id: all_blinds
    entities:
      - cover.living_room_blinds
      - cover.bedroom_blinds
      - cover.kitchen_blinds
```

## Utility Meter

```yaml
utility_meter:
  daily_energy:
    source: sensor.energy_meter_total
    name: "Daily Energy"
    cycle: daily

  monthly_energy:
    source: sensor.energy_meter_total
    name: "Monthly Energy"
    cycle: monthly
    tariffs:
      - peak
      - offpeak

  weekly_water:
    source: sensor.water_meter_total
    name: "Weekly Water"
    cycle: weekly
```

## Counters and Timers

### Counters

```yaml
counter:
  coffee_count:
    name: "Coffees Today"
    initial: 0
    step: 1
    minimum: 0
    maximum: 20
    restore: false

  visitors:
    name: "Visitor Count"
    initial: 0
    step: 1
```

### Timers

```yaml
timer:
  laundry:
    name: "Laundry Timer"
    duration: "01:30:00"
    restore: true

  cooking:
    name: "Cooking Timer"
    duration: "00:30:00"
    icon: mdi:stove
```

## State Attributes

### Common Attributes

| Domain | Common Attributes |
|--------|-------------------|
| `light` | `brightness`, `color_temp`, `rgb_color`, `hs_color`, `effect` |
| `climate` | `temperature`, `current_temperature`, `hvac_action`, `preset_mode` |
| `media_player` | `volume_level`, `media_title`, `media_artist`, `source` |
| `cover` | `current_position`, `current_tilt_position` |
| `weather` | `temperature`, `humidity`, `pressure`, `wind_speed`, `forecast` |
| `person` | `source`, `latitude`, `longitude`, `gps_accuracy` |
| `sun` | `elevation`, `azimuth`, `next_rising`, `next_setting` |

### Accessing Attributes

```yaml
# In templates
{{ state_attr('light.living_room', 'brightness') }}
{{ state_attr('climate.thermostat', 'current_temperature') }}
{{ state_attr('sun.sun', 'elevation') }}

# In conditions
condition:
  - condition: numeric_state
    entity_id: light.living_room
    attribute: brightness
    above: 100
```

## Entity Registry

### Finding Entity Information

```yaml
# Developer Tools > States
# Shows all entities with current state and attributes

# Developer Tools > Services
# Test services with entity targets

# Configuration > Entities
# UI for managing entity settings
```

### Entity Naming Best Practices

| Pattern | Example | Description |
|---------|---------|-------------|
| `domain.room_device` | `light.living_room_ceiling` | Room + device type |
| `domain.room_device_number` | `light.kitchen_spot_1` | With numbering |
| `domain.location_type` | `sensor.outdoor_temperature` | Location + measurement |
| `domain.device_measurement` | `sensor.washer_power` | Device + what it measures |

## Quick Reference

### State Functions

| Function | Description | Example |
|----------|-------------|---------|
| `states('entity')` | Get state | `states('sensor.temp')` |
| `state_attr('entity', 'attr')` | Get attribute | `state_attr('light.x', 'brightness')` |
| `is_state('entity', 'value')` | Check state | `is_state('light.x', 'on')` |
| `is_state_attr('entity', 'attr', 'val')` | Check attribute | `is_state_attr('climate.x', 'hvac_action', 'heating')` |
| `states.domain` | All entities in domain | `states.light` |
| `expand('group.x')` | Expand group members | `expand('group.all_lights')` |

### Filter Functions

```yaml
# Count entities in state
{{ states.light | selectattr('state', 'eq', 'on') | list | count }}

# Get entities matching criteria
{{ states.sensor | selectattr('attributes.device_class', 'eq', 'temperature') | list }}

# Average of multiple sensors
{{ expand('group.temperature_sensors') | map(attribute='state') | map('float') | average }}
```

## Agentic Optimizations

| Context | Command |
|---------|---------|
| Find entity usage | `grep -r "entity_id:" config/ --include="*.yaml"` |
| List customizations | `grep -rA2 "^[a-z_]*\\..*:" config/customize.yaml` |
| Find template sensors | `grep -rB2 "platform: template" config/ --include="*.yaml"` |
| Find groups | `grep -rA5 "^group:" config/ --include="*.yaml"` |
| List domains used | `grep -roh "[a-z_]*\\." config/ --include="*.yaml" \| sort -u` |

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…