This integration is not affiliated with Pima.
The integration creates binary_sensor entities for Pima Force alarm system zones. The sensors turn on when the zone is "open" (i.e., triggers the alarm when it's armed). This is a read-only integration and does not have the ability to control or change the alarm system. It reads SIA events with ADM-CID payload sent from the alarm. The integration does not require additional hardware.
Note: a guide to controlling Pima Force (outside of this read-only integration) is available here.
HACS is the preferred and easiest way to install the component and can be done using this My button:
Otherwise, download pima_force.zip from the latest release, extract and copy the content under custom_components directory.
A Home Assistant restart is required once the integration files are copied (either by HACS or manually).
The integration should also be added to the configuration. This can be done using this My button:
There are 2 fields:
Port: the port to listen for incoming events. The default is10001, which is also the default port in the alarm. It should be kept as is unless there is a specific reason not to.Zone names: An ordered list of zone names as defined in the alarm system. The integration does not have access to the alarm’s configured zone names, so they must be entered manually and in the correct order. If a specific zone in the alarm is not used, there should be a corresponding empty item on the list to preserve zone number alignment. For example, if the alarm has 3 zones: 1=door, 2=[not used], 3=window, the list should bedoor, [empty], window.
After the component is installed, it can be reconfigured using the Configure dialog, which can be accessed via this My button:
![]() |
|---|
There are 3 sets of codes:
- Regular user code: the code to arm / disarm the system and configure basic settings (e.g. bypass zones).
- Master user code: opens additional options in the user menu.
- Master technician code: a different menu used by installers to set up the system.
This setup can be done only with the master technician code. User codes, either regular or master, are not enough. Please make sure you know the master technician code before proceeding. The rest of the instructions assume you entered the technician menu by entering the master technician code.
The alarm's keypad has limited capabilities, so here are a few tips on how to use it:
- Press star (
*) to change from capital letters to small letters and then to numbers (circular). Only numbers (and dots) will be used for this configuration. - When entering numbers, pressing twice on the number one (
1) produces a dot (.). - Pressing twice on the hash key (
#) clears the value. - After changing a value, press enter (
⏎) to exit (and not the back key↺). - To save a changed configuration, press back (
↺) multiple times until exiting from the main menu. The alarm will reboot.
Home Assistant IP:port should be configured as a Central Monitoring Station (CMS) in the alarm's configuration. The alarm sends the events to its monitoring stations. There are 4 different settings which should be configured (please read carefully, or it won't work):
System Configuration => CMS & Communications => Monitoring Stations => CMS 1 => Communication Paths => Network (Ethernet) => Network Addresses:IP 1: enter Home Assistant's IP address, e.g.192.168.1.100.Port 1: the port which is configured for the integration. The default port is the same in the alarm and the integration (10001) so there is no need to change it.
System Configuration => CMS & Communications => Monitoring Stations => CMS 1 => Communication Paths => Network (Ethernet) => Account IDs:Partition 1: enter a 6-character account ID. The actual value is ignored, but must be present.111111will do (or anything else).
System Configuration => CMS & Communications => Monitoring Stations => CMS 1 => Communication Paths => Network (Ethernet):Account ID length: change it from 16 to 6 so it matches the length of the account ID entered in the previous step.Disable encryption: this is not checked by default. Press enter (⏎) to disable encryption (which is not supported).
System Configuration => CMS & Communications => Monitoring Stations => CMS 1 => Event Reporting:Zone/output Toggle: this is not checked by default. Press enter (⏎) to set the alarm to send events on zone status changes. Without this option selected, the relevant events won't be sent and the integration will not be notified when a zone is open or closed.
The integration creates a binary sensor for each zone. It skips zones with an empty name (but it takes empty zones into account for numbering correctly the rest of the zones).
The entity_id has the format of binary_sensor.pima_force_<port>_zone<#>. For example: binary_sensor.pima_force_10001_zone5.
The default device class is Door, but it can be changed by customizing the entity. It's not required to change the device class and it doesn't impact the underline implementation. It can be done for UI purposes, like changing the icon and displayed state (which is translated based on the device class).
Each sensor exposes attributes (timestamps are local time, ISO 8601):
zone: zone number from the configured list.last_set: last time the zone state was set (including test services).last_open: last time the zone reported open.last_close: last time the zone reported closed.
The state is restored after Home Assistant restarts, but events that occur during downtime can be missed. For example, if a door opens while Home Assistant is rebooting, the sensor will still show "closed" (off) until the next change. Because the alarm only sends events on changes (not periodically), any mismatch is corrected the next time that zone reports a change.
Here is an example of a markdown card which lists all zones sorted by their last status change:
- title: Zone Status History
type: markdown
content: |
| Zone | Set | Open | Closed |
|------|-----|------|--------|
{% for sensor in states.binary_sensor |
selectattr('entity_id', 'in', integration_entities('pima_force')) |
sort(attribute='attributes.friendly_name') |
sort(attribute='attributes.last_set', reverse=True)
-%}
| {{ sensor.attributes.friendly_name.split()[2:] | join(' ') }} |
{{- as_timestamp(sensor.attributes.last_set) | timestamp_custom('%H:%M:%S %d/%m/%y', true) }} |
{{- (as_timestamp(sensor.attributes.last_open) | timestamp_custom('%H:%M:%S %d/%m/%y', true)) if sensor.attributes.last_open else '' }} |
{{- as_timestamp(sensor.attributes.last_close) | timestamp_custom('%H:%M:%S %d/%m/%y', true) }} |
{% endfor %}![]() |
|---|
The sensors can be used also in automation rules. For example,
alias: Safe is open
triggers:
- trigger: state
entity_id: binary_sensor.pima_force_10001_zone999 # safe's zone
to: "on"
actions:
- action: notify.mobile_app
data:
title: Alarm System
message: Safe is open!Here is a more sophisticated example, which combines also the alarm panel entity (not created by this integration):
alias: Alarm is triggered
triggers:
- trigger: state
entity_id: alarm_control_panel.home_alarm_panel
to: triggered
actions:
- variables:
start: "{{ now() | as_timestamp - 2 }}"
- repeat:
until:
- condition: template
value_template: "{{ last_set > start }}"
sequence:
- delay:
milliseconds: 500
- variables:
entity_id: |-
{{
states.binary_sensor |
selectattr('entity_id', 'in', integration_entities('pima_force')) |
sort(attribute='attributes.last_set', reverse=True) |
first |
attr('entity_id')
}}
last_set: "{{ state_attr(entity_id, 'last_set') | as_timestamp }}"
zone: "{{ state_attr(entity_id, 'friendly_name').split()[2:] | join(' ') }}"
- action: notify.mobile_app
data:
title: 🚨🚨 Alarm System 🚨🚨
message: "The alarm was triggered by the zone: {{ zone }}"Additional automation ideas can be:
- Turning on lights using motion sensors.
- Use motion sensors for presence (or absence) detection.
- Notify on door sensors, for example, when the backyard door (the pool area) is open.
The integration exposes services to read and update the configured zone names. It also provides testing-only actions that can simulate zone state changes in Home Assistant.
Returns the zone name list for a specific config entry. Empty items are preserved
to keep zone numbering aligned with the alarm. The response payload contains
zones, an ordered list of strings.
service: pima_force.get_zones
data:
config_entry_id: 1234567890abcdef1234567890abcdefReplaces the zone name list for a specific config entry. Provide an ordered list of strings; use empty strings for unused zones.
service: pima_force.set_zones
data:
config_entry_id: 1234567890abcdef1234567890abcdef
zones:
- Front Door
- ""
- Back DoorMarks a zone as open in Home Assistant without sending anything to the alarm system.
Use this only for testing automations and dashboards. The zone stays open until the alarm explicitly reports otherwise or pima_force.set_closed action is performed.
service: pima_force.set_open
target:
entity_id: binary_sensor.pima_force_10001_zone5Marks a zone as closed in Home Assistant without sending anything to the alarm system.
Use this only for testing automations and dashboards. The zone stays closed until the alarm explicitly reports otherwise or pima_force.set_open action is performed.
service: pima_force.set_closed
target:
entity_id: binary_sensor.pima_force_10001_zone5Below are some troubleshooting tips, mainly focused on the initial setup:
- After configuring the alarm, verify its status. If the alarm has a communication issue with its CMS (in this case, the integration), an error message should appear on the keypad screen.
- Enable debug logging for the integration and check whether the log contains entries indicating that SIA messages are being received and processed:
[pysiaalarm.base_server] Incoming line: 9A940041"ADM-CID"0141R1L0#AAAAAA[#AAAAAA|1760 01 032]_17:04:37,02-12-2026
[pysiaalarm.event] Content matches: {'account': 'AAAAAA', 'event_qualifier': '1', 'event_type': '760', 'partition': '01', 'ri': '032', 'xdata': None, 'timestamp': '17:04:37,02-12-2026'}
[pysiaalarm.aio.server] Incoming event: Content: #AAAAAA|1760 01 032]_17:04:37,02-12-2026, Zone (ri): 032, Code: YN, Message: , Account: AAAAAA, Receiver: R1, Line: L0, Timestamp: 2026-02-12 17:04:37+00:00, Length: 0041, Sequence: 0141, CRC: 9A94, Calc CRC: 9A94, Encrypted Content: None, Full Message: "ADM-CID"0141R1L0#AAAAAA[#AAAAAA|1760 01 032]_17:04:37,02-12-2026.
[pysiaalarm.aio.server] Outgoing line: b'\n53C40018"ACK"0141R1L0#AAAAAA[KC]\r'
-
Delete the configuration:
- Open the integration page (my-link), click the 3‑dot menu (⋮), and select Delete.
-
Remove the integration files:
- If the integration was installed via HACS, follow the official HACS removal instructions.
- Otherwise, manually delete the integration’s folder
custom_components/pima_force.
📌 A Home Assistant core restart is required in both cases to fully apply the removal.
If you want to contribute to this, please read the Contribution guidelines.

