A Home Security Dashboard: Status, Alerts, Cards, Buttons, and Event History

A Home Security Dashboard: Status, Alerts, Cards, Buttons, and Event History

Module 18 · Lesson 11

A Home Security Dashboard: Status, Alerts, Cards, Buttons, and Event History

In earlier lessons you built the logic: notifications, flooding, home modes, a supporting alarm, and failure monitoring. Now you'll bring it together on one screen: a dashboard that answers a single question: is the house secure?

This isn't a lesson about "pretty UI." A security dashboard is a daily-use tool: you check status in the morning, run tests in the evening, and click acknowledge during an alarm: with no hunting for entities in settings.

Plan on about 90 to 105 minutes. Start with the summary sensor. Then add sections one at a time.

The rule for this lesson
The dashboard should be shorter than your memory.
One screen, one status message, quick tests, and alarm acknowledgment.

A real-life problem: you know something's wrong: but you don't know where to look

You have dozens of entities scattered across Home Assistant: home mode on one card, flooding on another, the alarm test somewhere in Developer Tools. The push says "ALARM," but you have to click through five different views to understand the context. Under stress, that's too slow.

A security dashboard solves this through hierarchy: at the top, one home_security_status sensor; below it, sections organized by topic; and at the bottom, an event history.

What belongs on the dashboard

1. Overall status: one message: OK, alarm, offline, no internet.

2. Home mode and the alarm: home_mode, home_alarm_armed, disarming.

3. Openings: the critical_openings group from Lesson 6.

4. Flooding and water: flood_sensors, the water valve from Lesson 4.

5. Weather and windows: alerts from Lesson 7, if you have them.

6. System failures: offline sensors, internet, monitoring from Lesson 10.

7. Tests and acknowledgment: test buttons and intrusion_alarm_acknowledged.

8. History: a logbook of the last 24 hours.

What's actually the risk

A dashboard as decoration: it looks nice, but nobody opens it: zero value.

Too many entities on one card: you don't see the problem, because it drowns in detail.

No acknowledgment button: during an alarm, you go hunting for the entity in Developer Tools.

Tests with no description: you click something without knowing what: and the full escalation fires.

No mobile view: the dashboard works on a computer, but not on your phone on the way home.

The summary sensor: home_security_status

Before adding cards, build one template sensor that gathers the most important signals from the whole module. It's the first thing you see on the dashboard.

template:
  - sensor:
      - name: "Home security status"
        unique_id: home_security_status
        icon: >
          {% if is_state('input_boolean.life_alarm_active', 'on')
             or is_state('input_boolean.flood_alarm_active', 'on')
             or is_state('input_boolean.intrusion_alarm_active', 'on') %}
          mdi:alarm-light
          {% elif expand('group.flood_sensors') | selectattr('state', 'eq', 'on') | list | count > 0 %}
          mdi:water-alert
          {% elif expand('group.critical_openings') | selectattr('state', 'eq', 'on') | list | count > 0
                and is_state('input_select.home_mode', 'Away') %}
          mdi:door-open
          {% elif states('sensor.critical_sensors_offline') | int(0) > 0 %}
          mdi:access-point-off
          {% elif is_state('binary_sensor.internet_available', 'off') %}
          mdi:web-off
          {% elif is_state('input_boolean.home_alarm_armed', 'on') %}
          mdi:shield-lock
          {% else %}
          mdi:shield-check
          {% endif %}
        state: >
          {% if is_state('input_boolean.life_alarm_active', 'on')
             or is_state('input_boolean.flood_alarm_active', 'on')
             or is_state('input_boolean.intrusion_alarm_active', 'on') %}
          Alarm active
          {% elif expand('group.flood_sensors') | selectattr('state', 'eq', 'on') | list | count > 0 %}
          Flooding detected
          {% elif expand('group.critical_openings') | selectattr('state', 'eq', 'on') | list | count > 0
                and is_state('input_select.home_mode', 'Away') %}
          Open entries in Away mode
          {% elif states('sensor.critical_sensors_offline') | int(0) > 0 %}
          Sensors offline: {{ states('sensor.critical_sensors_offline') }}
          {% elif is_state('binary_sensor.internet_available', 'off') %}
          No internet
          {% elif is_state('input_boolean.home_alarm_armed', 'on') %}
          Alarm armed: no active problem detected
          {% else %}
          No problems detected (HA layer)
          {% endif %}

A group doesn't always show a readable history of its members in Logbook: keep a variant listing the specific entities instead.

The order of the conditions matters. We show an active alarm and a real threat first, e.g. flooding or open entries in Away mode. Only after that do we show system failures, like an offline sensor or no internet. If you don't have one of the groups: remove the corresponding block from the template.

Optional: in a more advanced version, you can add a separate text sensor or attributes with the cause, e.g. which sensors are offline. In this lesson we stick with a short message, since the dashboard needs to stay readable.

A single status message hides simultaneous problems (e.g. flooding + no internet). Add a counter or a list of active problems. Don't write a bare "OK": "No problems detected" or "No active alarm detected" reads better. The status doesn't check smoke-detector batteries, the UPS, SMS, or Zigbee until you add them to the template.

OK doesn't mean "nothing can happen"
An OK state means: "on this dashboard, I don't currently see a problem within what we're monitoring." A certified smoke detector still works independently of HA.

How to create the dashboard view

In Home Assistant: Settings → Dashboards → Add dashboard → name it, e.g. Security. Add a Home Status view. In the editor, switch each card to YAML mode: paste in the ready-made blocks below.

In the Companion mobile app, set this dashboard as the default, or add a shortcut to your phone's home screen. The security dashboard should be reachable in two taps.

Card 1: overall status

type: glance
title: Security status
entities:
  - entity: sensor.home_security_status
    name: Home
  - entity: sensor.critical_sensors_offline
    name: Offline
  - entity: binary_sensor.internet_available
    name: Internet
show_name: true
show_icon: true
state_color: true

Card 2: home mode and the alarm

type: entities
title: Home mode and alarm
entities:
  - entity: input_select.home_mode
    name: Home mode
  - entity: input_boolean.automatic_home_modes
    name: Automatic modes
  - entity: input_boolean.home_alarm_armed
    name: Alarm armed
  - entity: input_boolean.disarming_in_progress
    name: Disarming in progress

If you added the input_boolean.automatic_arming helper in Lesson 9, you can add it to this card as an extra row. The dashboard should only show entities that actually exist.

Card 3: critical openings

type: entities
title: Critical openings
entities:
  - entity: group.critical_openings
    name: All openings
  - entity: binary_sensor.front_door
  - entity: binary_sensor.living_room_window
  - entity: binary_sensor.garage_gate
  - entity: binary_sensor.garden_gate
  - entity: input_boolean.leaving_home_in_progress
    name: Leaving in progress

Card 4: flooding and water

type: entities
title: Flooding and water
entities:
  - entity: group.flood_sensors
    name: Flood sensors
  - entity: switch.water_valve
    name: Water valve
  - entity: input_boolean.auto_close_water_on_flood
    name: Auto close water on flood

The helper's name has to match Lesson 4. If yours has a different name, swap the entity on the card. If you don't have a water valve: remove those entities. The flood_sensors group is enough for a quick overview.

Card 5: weather and windows (optional)

type: entities
title: Weather and windows
entities:
  - entity: input_boolean.weather_alerts_windows
    name: Weather alerts
  - entity: input_boolean.airing_in_progress
    name: Airing in progress
  - entity: input_number.wind_threshold_skylights
    name: Wind threshold
  - entity: input_number.frost_threshold_windows
    name: Frost threshold
  - entity: input_number.heat_threshold_windows
    name: Heat threshold

Skip this card if you didn't complete Lesson 7. The dashboard should only show what you actually have in the system.

Card 6: system failures

type: entities
title: System failures
entities:
  - entity: input_boolean.failure_monitoring_enabled
    name: Failure monitoring
  - entity: sensor.critical_sensors_offline
    name: Sensors offline
  - entity: group.critical_sensors
    name: Critical list
  - entity: input_number.battery_alert_threshold
    name: Battery threshold

Card 7: alarm and escalation

You're extending the card from Lesson 3. This holds the escalation helpers and the stop buttons: the most important controls during a real alarm.

type: entities
title: Alarm and escalation
entities:
  - entity: input_boolean.life_alarm_active
    name: Life alarm active
  - entity: input_boolean.flood_alarm_active
    name: Flood alarm active
  - entity: input_boolean.intrusion_alarm_active
    name: Intrusion alarm active
  - entity: input_boolean.life_alarm_acknowledged
    name: Acknowledge (life)
  - entity: input_boolean.flood_alarm_acknowledged
    name: Acknowledge (flood)
  - entity: input_boolean.intrusion_alarm_acknowledged
    name: Acknowledge (intrusion)
  - entity: input_boolean.alarm_event_closed
    name: Close the event
  - entity: input_boolean.alarm_sms_enabled
    name: SMS alerting
  - entity: script.security_alarm_stop
    name: Stop siren / lights
    icon: mdi:alarm-off

Acknowledgment has to be visible
Put the intrusion_alarm_acknowledged helper on this card, not tucked away in Developer Tools. Every second counts during an alarm.

Acknowledge isn't always the same as stop
The intrusion_alarm_acknowledged helper tells the system: "I know about the alarm, don't keep repeating it." The script.security_alarm_stop script stops local responses, like a siren or lights. Show both elements on the dashboard, but label them clearly.

Technical helpers ≠ a household member's UI
Keep the daily panel to buttons with a plain description of what they do. Move raw helpers (tests, SMS, modes) to an admin section. Don't put an escalation script that requires title/message on the everyday card: running it with no data sends an empty alarm.

Card 8: tests: a separate section

Keep every test helper from the module together. That way you know a click here might trigger an escalation or a simulation: not something you'd mix up with an everyday toggle.

type: entities
title: "Tests: use carefully"
entities:
  - type: section
    label: Security module tests
  - entity: input_boolean.security_notifications_test
    name: Notification test (L2)
  - entity: input_boolean.security_alarm_test
    name: Escalation test (L3)
  - entity: input_boolean.flood_test
    name: Flood test (L4)
  - entity: input_boolean.away_opening_test
    name: Away opening test (L6)
  - entity: input_boolean.weather_alert_test
    name: Weather alert test (L7)
  - entity: input_boolean.automatic_modes_test
    name: Home mode test (L8)
  - entity: input_boolean.home_alarm_test
    name: Home alarm test (L9)
  - entity: input_boolean.system_failure_test
    name: System failure test (L10)

Your test entity names might look different: swap in your own from earlier lessons. If you skipped a given lesson, remove the corresponding row.

Tests aren't everyday toggles
The "Tests" section should sit at the bottom of the dashboard with a clear title. The escalation test from Lesson 3 can trigger a siren and SMS: warn the household before clicking.

Run alarm tests during the day, after warning the household. The tests section is on the dashboard so you test deliberately, not by accident.

Card 9: event history: the logbook

The logbook shows what happened over the last several hours: sensor state changes, alarm activations, acknowledgments. It's the first place to check after a false alarm: "what triggered, and when?"

type: logbook
title: Security history: 24 h
entities:
  - input_boolean.life_alarm_active
  - input_boolean.flood_alarm_active
  - input_boolean.intrusion_alarm_active
  - input_boolean.home_alarm_armed
  - input_select.home_mode
  - group.flood_sensors
  - group.critical_openings
  - group.critical_sensors
hours_to_show: 24
collapse: 5

Don't add every entity in the house to the logbook: only the ones tied to security. Otherwise the history becomes unreadable.

A group doesn't always tell you everything
A group shows that something in that category changed state, but after a false alarm you often want to know exactly which sensor triggered it. If a logbook with groups is too general, add the most important individual entities to it, e.g. the front door, the washer flood sensor, and the garage gate.

A variant with specific entities: instead of groups, or alongside them:

type: logbook
title: Security history: 24 h
entities:
  - input_boolean.life_alarm_active
  - input_boolean.flood_alarm_active
  - input_boolean.intrusion_alarm_active
  - input_boolean.home_alarm_armed
  - input_select.home_mode
  - binary_sensor.front_door
  - binary_sensor.living_room_window
  - binary_sensor.kitchen_flood
  - binary_sensor.bathroom_flood
  - sensor.critical_sensors_offline
hours_to_show: 24
collapse: 5

Optional: a conditional card while an alarm is active

When an alarm is active, you can show a large message at the top of the dashboard. A conditional card only appears when its condition is met.

type: conditional
conditions:
  - condition: or
    conditions:
      - entity: input_boolean.life_alarm_active
        state: "on"
      - entity: input_boolean.flood_alarm_active
        state: "on"
      - entity: input_boolean.intrusion_alarm_active
        state: "on"
card:
  type: vertical-stack
  cards:
    - type: markdown
      content: >
        ## ALARM ACTIVE

        Acknowledge the response or stop the escalation.
        Use the buttons in the Alarm and Escalation section.
    - type: entities
      entities:
        - entity: input_boolean.life_alarm_acknowledged
          name: "I'M RESPONDING (life)"
        - entity: input_boolean.flood_alarm_acknowledged
          name: "I'M RESPONDING (flood)"
        - entity: input_boolean.intrusion_alarm_acknowledged
          name: "I'M RESPONDING (intrusion)"
        - entity: input_boolean.alarm_event_closed
          name: Close the event
        - entity: script.security_alarm_stop
          name: Stop the siren

The mobile view

On your phone, set the Security view as the first one in the Companion app, or add it to your favorites. The glance card with the overall status should sit right at the top: visible with no scrolling.

You can also add the alarm-acknowledgment button as an entity shortcut on an Android home screen: that's even faster than opening the dashboard.

Available options depend on your phone and app version. What matters most isn't whether you use an Android shortcut, but whether you can open the dashboard under stress without hunting through menus.

How to test the dashboard

1. Open the dashboard on your phone and computer. Check that home_security_status shows no problems detected.

2. Switch home mode to Away. Check that the mode card and the sensor update.

3. Run system_failure_test from the tests card. The status sensor and logbook should show activity.

4. Run the escalation test from Lesson 3. Check that the conditional card appears and that the active alarm helper shows up.

5. Acknowledge the alarm and stop the escalation from the dashboard: with no need for Developer Tools.

6. Scroll through the logbook: can you see the recent events with no noise from the rest of the house?

Common mistakes

Everything on one card: 40 entities: you can't spot the alarm between the light switches.

No summary sensor: you have to piece together the picture from five cards yourself.

Tests next to everyday toggles: someone clicks the test instead of the home mode.

A logbook with the whole house: the history is useless under hundreds of light-switch entries.

A dashboard only on the computer: during an alarm you're away from home with no access to acknowledge it.

What not to do

Don't build a dashboard from entities you don't have: empty cards confuse more than a missing card.

Don't treat "no problems detected" as a life-safety guarantee: it's a summary of the HA layer.

Don't bury escalation tests at the bottom with no description: these aren't "buttons to experiment with."

Practical assignment

☐ Add the home_security_status template sensor from this lesson.

☐ Create the Security dashboard with Cards 1-9 (skip sections you don't have).

☐ Add the conditional card for an active alarm.

☐ Set the dashboard as the default in the mobile app.

☐ Test acknowledging the alarm and stopping the escalation entirely from the dashboard.

☐ Check the logbook after the test: is the history readable?

Key takeaways

One status sensor at the top: everything else is detail.

Sections by topic: mode, openings, flooding, failures, tests.

Alarm acknowledgment has to sit at the front, not in Developer Tools.

Tests stay separate: with a clear warning.

The logbook is post-event history: security entities only.

What's next

In Lesson 12, the mini project closing out this module, you'll put together your own home security plan: a risk map, a sensor list, response scenarios, and a monthly test schedule. The dashboard from this lesson will be the hub for that plan.

After this lesson, you no longer have to hop around Home Assistant looking for answers. You open one screen: and you know exactly what state your home's security is in.

Finished this lesson?