A Home Assistant custom integration for Securitas Direct (also known as Verisure in some countries).
- Multiple installations — accounts with multiple installations (e.g. home + office) are fully supported. Each installation gets its own config entry and entities, with a shared API session to minimize login requests.
- Alarm control panel — arm, disarm, and monitor your alarm from Home Assistant.
- Configurable alarm state mappings — map each HA alarm button (Home, Away, Night, Vacation, Custom) to any Securitas alarm mode.
- Force arming — when arming is blocked by an exception (e.g. an open window), the integration fires a
securitas_arming_exceptionevent and (optionally) notifies you. Force-arm via mobile notification, thesecuritas.force_armservice, the custom alarm card, or your own automations. - Custom alarm card — a purpose-built Lovelace card with dynamic arm buttons, PIN keypad, and built-in force-arm UI, plus a badge.
- Refresh button — manually trigger an alarm status check.
- Perimeter alarm support — full support for installations with external/outdoor sensors.
- Sentinel sensors — temperature, humidity, and air quality sensors for each Sentinel device.
- Smart locks — lock and unlock smart door locks. Multiple locks per installation supported, with door-open (latch hold-back) and auto-lock configuration.
- Cameras — view the latest captured image from Securitas cameras, with a capture button to request new images on demand, and a custom camera card for easy display
- Custom camera card — a purpose-built Lovelace card to show photographs from the cameras with a refresh button to request a new photograph
- PIN code protection — optional local PIN code for arming and/or disarming the alarm from Home Assistant (independent of your Securitas account).
- Two-factor authentication — login via SMS verification code.
Warning: This release includes breaking changes. Please read before upgrading.
You will need to delete your existing installations and to re-add them after upgrading.
- Entity IDs have changed. Locks and cameras are listed as sub-devices alongside the alarm control panel, and sensors and are now listed as entities under the installation, rather than as top-level devices.
- "Check alarm panel" option removed — The integration now always uses the lightweight server-side status check for periodic polling. The more expensive panel query is still used for arm/disarm operations and the manual refresh button. If you had automations or scripts referencing this option, they will need to be updated.
- "Use 2FA" checkbox removed — 2FA is now handled automatically during setup. If your account requires 2FA, you will be prompted; if not, the step is skipped.
- Per-installation config entries — The integration now creates one config entry per installation instead of one per account. If your account has multiple installations, you add each one separately via the setup wizard (which now includes an installation picker step). Accounts with multiple installations previously had all installations bundled into a single config entry — this is no longer supported.
- Perimeter alarm auto-detection — The "Perimetral alarm" checkbox has been replaced by automatic detection from the installation's service attributes. Your existing perimeter setting is preserved during migration.
- Scan interval and API delay moved to Advanced section — These options are now in a collapsible "Advanced" section in the options flow. The "Delay to check arming and disarming operations" has been renamed to "Delay between API requests" and now applies to all API calls (not just arm/disarm polling).
- WiFi diagnostic sensor added — A new
wifi_connectedsensor is created per installation, showing the panel's WiFi connection status.
| Code | Country | Brand |
|---|---|---|
| AR | Argentina | Verisure |
| BR | Brazil | Verisure |
| CL | Chile | Verisure |
| ES | Spain | Securitas Direct |
| FR | France | Securitas Direct |
| GB | Great Britain | Verisure |
| IE | Ireland | Verisure |
| IT | Italy | Verisure |
| PT | Portugal | Verisure |
If your country is not listed, try default. If that doesn't work, open an issue.
Or manually:
- Install HACS if you don't have it already.
- Open the HACS dashboard in Home Assistant.
- Search for Securitas Direct Alarm.
- Click download.
Go to Settings → Integrations → Add Integration and search for Securitas Direct.
The setup flow is a multi-step wizard:
- Login — Enter your country, username, and password. 2FA is handled automatically if your account requires it.
- Installation — If your account has multiple installations, pick which one to configure. Repeat the setup flow to add additional installations. Perimeter support is auto-detected from the installation's services.
- Options — Set your PIN code, notification service, and optionally expand the Advanced section for scan interval and API delay settings.
- Mappings — Map each HA alarm button to a Securitas alarm mode.
| Option | Default | Description |
|---|---|---|
| Username | — | Your Securitas Direct account username. |
| Password | — | Your Securitas Direct account password. |
| Country Code | (auto) | Auto-detected from your HA locale. All supported countries available in dropdown. |
If your account requires 2FA, you will automatically be asked to select a phone number and enter the SMS code during setup.
After setup, you can change most settings via Settings → Integrations → Securitas Direct → Configure.
| Option | Default | Description |
|---|---|---|
| PIN Code | (empty) | Optional local PIN for the HA alarm panel. This PIN is not sent to Securitas — it only protects the panel in Home Assistant. Can be numeric or alphanumeric. |
| Require PIN to arm | No | When enabled, the PIN is also required to arm the alarm (not just to disarm). Has no effect if no PIN is set. |
| Notify service | (none) | A notify service to call when arming is blocked by an exception. Select a mobile app notify service to receive an actionable notification with Force Arm and Cancel buttons. |
| Built-in force-arm notifications | Yes | When enabled (default), the integration creates persistent and mobile notifications when arming is blocked. Disable this to handle the securitas_arming_exception event with your own automations instead. See Force Arming. |
| Update interval (Advanced) | 120s | How often (in seconds) the integration checks the alarm status. Set to 0 to disable automatic polling. |
| Delay between API requests (Advanced) | 2s | Minimum delay between consecutive API requests. Higher values reduce the risk of WAF rate limiting. |
Securitas Direct supports several alarm modes, but Home Assistant's alarm panel only has five buttons: Home, Away, Night, Vacation, and Custom Bypass. This integration lets you choose which Securitas mode each button activates.
| Mode | Description |
|---|---|
| Partial Day | Interior sensors armed (daytime) |
| Partial Night | Interior sensors armed (nighttime) |
| Total | All interior sensors armed |
| Perimeter Only | External/outdoor sensors only |
| Partial Day + Perimeter | Daytime interior + external sensors |
| Partial Night + Perimeter | Nighttime interior + external sensors |
| Total + Perimeter | All interior + external sensors |
| Not Used | Hides the button from the alarm panel |
The available modes depend on whether a Perimetral alarm has been detected. Standard installations only see the non-perimeter modes; perimeter installations see all modes.
Note: Your country may only support a single Partial mode, rather than a Partial Day and a Partial Night. In this case, use just Partial Day.
Each of the five HA alarm buttons can be mapped to any Securitas mode in the integration options. Set a button to "Not Used" to hide it from the alarm panel.
When the integration checks the alarm status, it translates the Securitas response back to the correct HA state using the same mapping. For example, if you mapped Away to "Total + Perimeter", then when Securitas reports "Total + Perimeter" the alarm panel will show "Armed Away".
When switching between modes (e.g. from "Armed Home" to "Armed Away + Perimeter" or to "Disarmed"), the integration automatically determines what changes need to be made to match the requested state.
Standard installations (no perimeter sensors):
| HA Button | Securitas Mode |
|---|---|
| Home | Partial Day |
| Away | Total |
| Night | Partial Night |
| Custom | Not Used (hidden) |
| Vacation | Not Used (hidden) |
Perimeter installations (external sensors enabled):
| HA Button | Securitas Mode |
|---|---|
| Home | Partial Day |
| Away | Total + Perimeter |
| Night | Partial Night |
| Custom | Perimeter Only |
| Vacation | Not Used (hidden) |
Note: Perimeter variants (e.g. "Partial Night + Perimeter") are available as options and can be assigned to any button via the integration options.
If your alarm is put into a Securitas state that you have not mapped to any HA button (e.g. the perimeter is armed via a physical panel but perimeter support is not enabled in the integration), the alarm entity will show as Custom Bypass. This is not an error — enable perimeter support or adjust your alarm state mappings in the integration options to resolve it.
To see which status code the alarm is reporting, enable debug logging.
When you arm the alarm and a sensor is in a fault state (e.g. a window is open), Securitas may block the arm and report a non-blocking exception. The integration handles this as follows:
- The alarm panel reverts to its previous state.
- The alarm entity attributes
force_arm_availableandarm_exceptionsare set. - A
securitas_arming_exceptionevent is fired on the Home Assistant event bus (always, regardless of settings). - The custom alarm card shows a warning listing the problematic sensors, with Force Arm and Cancel buttons.
- If Built-in force-arm notifications is enabled (default):
- A persistent notification appears listing the affected sensors.
- If a Notify service is configured, a mobile notification is sent with Force Arm and Cancel action buttons.
- Fix the issue (close the window, clear the fault) and arm again normally.
- Force arm to arm despite the exception. You can do this from:
- The Force Arm button in the mobile notification (if built-in notifications are enabled).
- The
securitas.force_armservice, targeted at the alarm panel entity. - The Force Arm button in the custom alarm card.
- Your own automation triggered by the
securitas_arming_exceptionevent.
The force-arm context expires after 180 seconds, so force-arming is only possible shortly after the exception occurs.
Every time arming is blocked by open sensors, the integration fires this event with the following data:
| Field | Description |
|---|---|
entity_id |
The alarm panel entity that failed to arm |
mode |
The HA alarm state that was attempted (e.g. armed_away, armed_home) |
zones |
List of open zone names (e.g. ["Kitchen window", "Bedroom sensor"]) |
details.installation |
The Securitas installation number |
details.exceptions |
Full exception list from the API with alias, zone_id, device_type |
This event fires regardless of the Built-in force-arm notifications toggle, so you can always build automations against it.
To write your own force-arm automations, disable Built-in force-arm notifications in the integration options, then create automations that listen for the securitas_arming_exception event. Some examples:
Auto force-arm when leaving home:
- id: securitas_auto_force_arm
alias: "Alarm: auto force-arm when leaving"
triggers:
- trigger: event
event_type: securitas_arming_exception
conditions:
- condition: template
value_template: "{{ trigger.event.data.mode == 'armed_away' }}"
actions:
- action: securitas.force_arm
target:
entity_id: "{{ trigger.event.data.entity_id }}"
mode: singleNotify with open zone details:
- id: securitas_notify_open_zones
alias: "Alarm: notify about open zones"
triggers:
- trigger: event
event_type: securitas_arming_exception
actions:
- action: notify.mobile_app_phone
data:
title: "Alarm blocked"
message: >
Cannot arm {{ trigger.event.data.mode }}.
Open zones: {{ trigger.event.data.zones | join(', ') }}
mode: singleDifferent behaviour per mode (force-arm for away, notify for night):
- id: securitas_smart_force_arm
alias: "Alarm: smart force-arm by mode"
triggers:
- trigger: event
event_type: securitas_arming_exception
actions:
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.event.data.mode == 'armed_away' }}"
sequence:
- action: notify.mobile_app_phone
data:
message: >
Open zones: {{ trigger.event.data.zones | join(', ') }}
— force-arming...
- action: securitas.force_arm
target:
entity_id: "{{ trigger.event.data.entity_id }}"
- conditions:
- condition: template
value_template: "{{ trigger.event.data.mode == 'armed_night' }}"
sequence:
- action: notify.mobile_app_phone
data:
title: "Cannot arm night mode"
message: >
Please close: {{ trigger.event.data.zones | join(', ') }}
mode: singleThe Notify service field accepts a single service name. To notify multiple people at once, create a notify group in your configuration.yaml:
notify:
- platform: group
name: Mobiles
services:
- service: mobile_app_your_phone
- service: mobile_app_partner_phoneThis registers a notify.mobiles service. After restarting Home Assistant, mobiles will appear in the Notify service dropdown in the integration options.
Note: Action buttons (Force Arm / Cancel) in the notification are tied to the installation number, so any household member who taps a button will trigger the correct action regardless of which device they use.
| Field | Description |
|---|---|
| Target entity | The Securitas alarm panel entity to force-arm. |
Example automation action:
action: securitas.force_arm
target:
entity_id: alarm_control_panel.my_homeThe integration ships with a custom Lovelace card (securitas-alarm-card) that is purpose-built for Securitas Direct. It goes beyond the standard HA alarm panel card by integrating the force-arm flow directly into the dashboard.
| Disarmed | Armed (Home) | Custom Mapping |
|---|---|---|
![]() |
![]() |
![]() |
| PIN Keypad | Force Arm |
|---|---|
![]() |
![]() |
- Dynamic arm buttons — reads
supported_featuresfrom the entity and only shows the modes that are actually configured. No unused buttons. - PIN keypad — when a PIN code is configured, a numeric keypad appears automatically on arm/disarm. Alphanumeric codes use a text input instead. Respects
code_arm_required(keypad only shown on arm if required, always shown on disarm). - Force-arm UI — when arming is blocked by an open sensor, the card automatically shows a warning with the sensor name(s) and Force Arm / Cancel buttons. No Template Binary Sensor helper required.
- Theme-aware — uses Home Assistant CSS variables and works correctly in both light and dark mode.
The card is registered automatically when the integration loads — no manual file copying or Lovelace resource configuration required.
To add the card to your dashboard, click Add Card → Search for "Securitas Alarm Card" and pick your alarm panel entity from the dropdown.
A compact Securitas Alarm Badge is also available for the badges section of your dashboard. It shows a state-specific shield icon that changes to an amber warning triangle when arming fails.
By default, tapping the badge opens the full alarm card in a popup overlay. You can also configure hold and double-tap actions — for example, to arm or disarm directly from the badge without opening the card. See Gesture Actions below.
To add the badge, click Add Badge → Search for "Securitas Alarm Badge" and pick your alarm panel entity from the dropdown.
A Securitas Alarm Chip is available for use inside a Mushroom Chips Card. Use type: securitas-alarm in your Mushroom chips config. It shows the same state-specific icon and color as the badge, in a Mushroom-compatible pill shape.
Tapping the chip opens the full alarm card in a popup overlay. Gesture actions (hold, double-tap) are supported via YAML — see Gesture Actions below.
type: custom:mushroom-chips-card
chips:
- type: securitas-alarm
entity: alarm_control_panel.my_alarmThe alarm card, badge, and chip all support configurable tap, hold, and double-tap actions. For the card and badge, these can be set in the visual editor under the Tap action, Hold action, and Double-tap action sections. For the chip, these actions are configured in YAML (see below).
| Action | Badge default | Chip default | Card default |
|---|---|---|---|
| Tap | Open alarm card | Open alarm card | (none) |
| Hold | Arm / Disarm | (none) | (none) |
| Double-tap | (none) | (none) | (none) |
Each action can be set to one of the following:
| Option | Description |
|---|---|
| None | Do nothing. |
| Navigate | Navigate to a dashboard path. A path selector appears to choose the destination. |
| Arm | Arm the alarm to a chosen state (Home, Away, Night, Custom, or Vacation). Only fires when disarmed. |
| Disarm | Disarm the alarm. Only fires when armed. |
Example: set Hold to Disarm on the badge to disarm with a long press, without opening the card popup.
The card and badge have a visual editor for gesture actions. The chip only supports YAML configuration:
type: custom:mushroom-chips-card
chips:
- type: securitas-alarm
entity: alarm_control_panel.my_alarm
tap_action:
action: more-info # default — opens alarm card popup
hold_action:
action: arm_or_disarm # arms when disarmed, disarms when armed
double_tap_action:
action: navigate
navigation_path: /lovelace/securityAvailable actions:
| Action | YAML value |
|---|---|
| None | action: none |
| Open alarm card | action: more-info |
| Navigate | action: navigate + navigation_path: /path |
| Arm or Disarm | action: arm_or_disarm (optionally + arm_state: armed_away etc.) |
If your installation includes Sentinel devices, the integration automatically creates temperature, humidity, and air quality sensors for each one.
If your installation includes smart door locks, the integration creates lock entities that you can lock and unlock from Home Assistant. Multiple locks per installation are supported — each lock gets its own entity.
Both Smartlock and Danalock-type locks are supported. The integration auto-detects which configuration API your lock uses, so no manual configuration is needed.
Lock features (latch hold-back time, auto-lock settings) are fetched from the lock configuration. When the lock supports latch hold-back, the entity exposes an "Open" action that unlatches the door without unlocking.
If the lock configuration cannot be fetched during startup (e.g. due to a temporary API outage), the lock entity is still created and works for lock/unlock operations. The integration retries the configuration fetch in the background, and the "Open" button will appear once the configuration is successfully retrieved.
If your installation includes Securitas cameras, the integration creates two camera entities per physical camera:
camera.<name>— the thumbnail image, updated after each capture.camera.<name>_full_image— the full-resolution image fetched from the API after each capture.
A Capture button entity is also created for each camera, allowing you to request a new image on demand.
QR-type cameras, YR-type PIR cameras, and YP/QP perimetral (outdoor) cameras are all supported. The camera entity exposes a capturing attribute that is true while a capture is in progress, which can be used in automations or displayed on the dashboard.
When the capture button is pressed, the integration checks whether any images were taken since the last update (e.g. via the Securitas app or web portal) and displays them immediately, even before the newly requested capture arrives.
Note: Images are fetched from the API queue and may take up to 30 seconds to appear after a capture completes, depending on queue depth.
The integration also ships with a custom Lovelace card (securitas-camera-card) purpose-built for Securitas cameras.
It shows the latest thumbnail image with:
- Capture button — shown in the top-right corner, requests a new photograph
- Timestamp overlay — displays when the image was taken, with a relative time and an absolute tooltip
- Click to open — clicking the image opens the HA more-info dialog. If a full-resolution image is available (auto-discovered from the same device), it opens the full-resolution entity; otherwise the thumbnail entity.
The card is registered automatically when the integration loads. To add it to your dashboard, click Add Card → Search for "Securitas Camera Card" and pick your camera entity from the dropdown.
type: custom:securitas-camera-card
entity: camera.sala # thumbnail entity (required)
name: Sala # optional — overrides the entity friendly name| Option | Required | Description |
|---|---|---|
entity |
Yes | The thumbnail camera entity (camera.<name>) |
name |
No | Display name shown on the card. Defaults to the HA device name. |
You can arm, disarm, and control the alarm from automations and scripts using the standard Home Assistant alarm actions:
action: alarm_control_panel.alarm_arm_away
target:
entity_id: alarm_control_panel.my_alarm
data:
code: "12345" # only needed if you have a PIN configuredReplace alarm_arm_away with the action for the mode you want:
| Action | Mode |
|---|---|
alarm_control_panel.alarm_arm_away |
Away |
alarm_control_panel.alarm_arm_home |
Home |
alarm_control_panel.alarm_arm_night |
Night |
alarm_control_panel.alarm_arm_vacation |
Vacation |
alarm_control_panel.alarm_arm_custom_bypass |
Custom |
alarm_control_panel.alarm_disarm |
Disarm |
Important: Only actions for modes you have mapped in the Alarm State Mappings will work. If you try to arm with an unmapped mode (e.g. calling
alarm_arm_homewhen Home is set to "Not Used"), the action will fail with an error. Check your mappings in Settings → Integrations → Securitas Direct → Configure → Submit (second page).
You can test which actions are available for your alarm in Settings → Developer Tools → Actions — type "arm alarm" to see the list.
- HTTP 403 errors / rate limiting — Securitas uses a web application firewall (WAF) that blocks requests if you poll too frequently. The integration retries once automatically, but if you see repeated 403 errors in the logs:
- Increase the update interval — Go to Settings → Integrations → Securitas Direct → Configure, expand the Advanced section, and increase the Update scan interval (default: 120 seconds). Try 180 or 300 seconds.
- Increase the API request delay — The Delay between API requests (default: 2 seconds) controls the minimum gap between consecutive API calls. Increasing this to 4–5 seconds reduces request bursts.
- If you have multiple installations on one account, each one polls independently, multiplying the request rate. All API requests to the same country domain are serialized through a shared queue, which helps, but the total volume still increases with each installation.
- Alarm shows wrong state after using the Securitas app — Periodic polling reads the last known status from the Securitas server, which may take a moment to reflect changes made via the app. Press the Refresh button to force an immediate panel check.
- Stale lock state after lock/unlock — If the lock shows the old state after a lock or unlock command and only self-corrects after the next periodic poll (~2 minutes), please open an issue with your debug logs. We are actively improving lock status polling and your logs will help.
- Cannot clear PIN code — In the options flow, clear the PIN field and save. The PIN will be removed.
- 2FA issues — If 2FA fails, remove and re-add the integration. You will be prompted for a new SMS code. If the error persists, try creating a new user via the Securitas/Verisure mobile app, then log in to the customer web portal for your country to accept the terms of use before using the new credentials in Home Assistant.
If you encounter a bug or unexpected behavior, please open an issue and include the following:
-
Home Assistant version and integration version (from Settings → Integrations → Securitas Direct).
-
Country code you are using.
-
Debug logs — enable debug logging from the UI: go to Settings → Integrations → Securitas Direct, click the three-dot menu, and select Enable debug logging. Reproduce the issue, then click Disable debug logging to download the log file.
If you need debug logs before the integration has been set up (e.g. during initial installation), run this action from Settings → Developer Tools → Actions:
action: logger.set_level data: custom_components.securitas: debug
Then retrieve the logs from Settings → System → Logs → three dots in the top right corner → Show full logs.
-
Steps to reproduce — what you did, what you expected, and what happened instead.
-
If the issue is about an unmapped alarm state, include the
protomResponsecode shown in the Securitas Direct integration log messages (after enabling debug logging and reproducing the issue).
It would be very helpful to include a HAR (HTTP Archive) file of the GraphQL requests sent by the Securitas website while you perform the task that is not working for you in Home Assistant, for instance setting the alarm, unlocking a lock, or taking a photograph with your camera.
To record the HAR file:
-
Log in to the Securitas Direct customer web site in your browser.
-
Open Developer Tools (press F12, or Ctrl+Shift+I / Cmd+Opt+I, or use the browser menu → More tools → Developer tools).
-
Navigate to the Network tab, tick the Preserve log checkbox, and filter on graphql.
-
Carry out the actions you want to record.
-
Click the Download icon to download the HAR file.
WARNING: The HAR file can contain sensitive or personal information. Either edit the file (it is just a JSON file) to remove that information, or ask for one of the developers' email addresses to send it directly to us.
You can also use this technique to capture GraphQL payloads if you'd like to help implement support for new operations.












