Async Python library to interface with iAlarm-MK alarm panels locally
Project description
🚨 Open iAlarm-MK Local API
Asynchronous Python library for iAlarm-MK alarm panels via the local Meian protocol
Features • Installation • Quick Start • Documentation • Push Events • Examples • Testing
Features
Performance
- Built with asyncio for non-blocking operations
- Efficient TCP communication over the Meian binary protocol
- TCP keep-alive to prevent idle connection drops
Reliability
- Framed two-phase read: large MK7 responses (>1024 bytes) always received in full
- Graceful error propagation with full detail preserved
- Auto-close socket on connection failure
- Auto-reconnect: each command retries once on connection drop
- Concurrent-safe: internal
asyncio.Lockserializes all commands (Home Assistant coordinator safe) - Application-level keepalive: polls status every 30 s to prevent panel idle timeouts
Developer Friendly
- Type-safe dataclasses:
AlarmStatusModel,ZoneModel,NetworkInfoModel - Async context manager support
- Comprehensive logging at every step
Full Control
- Arm Away, Arm Stay, Arm Partial, Disarm, Cancel Alarm
- Read all zones with status (open, bypassed, low battery, signal loss)
- Read network info (name, MAC, IP)
Installation
pip install open-ialarm-mk-local-api
Quick Start
import asyncio
from open_ialarm_mk_local_api import IAlarmMkClient
async def main():
async with IAlarmMkClient("192.168.1.100", 8000, "admin", "secret") as client:
status = await client.get_status()
print(f"Status: {status.status.name}")
zones = await client.get_zones()
for zone in zones:
print(f" [{zone.index:3d}] {zone.name} - {'OPEN' if zone.is_open else 'ok'}")
asyncio.run(main())
Panel Port
| Model | Default TCP port |
|---|---|
| iAlarm MK7 | 8000 |
| iAlarm MK2 | 18034 |
Documentation
Configuration
Constructor Parameters: IAlarmMkClient
| Parameter | Type | Default | Description |
|---|---|---|---|
host |
str |
required | IP address of the panel |
port |
int |
required | TCP port (8000 for MK7, 18034 for MK2) |
username |
str |
required | Login username |
password |
str |
required | Login password |
timeout |
float |
10.0 |
Socket timeout in seconds |
keepalive_interval |
int | None |
30 |
Seconds between keepalive polls; None to disable |
Connection Management
Connect / Disconnect
await client.connect()
await client.disconnect()
Context Manager (recommended)
async with IAlarmMkClient("192.168.1.100", 8000, "admin", "pass") as client:
status = await client.get_status()
Alarm Control
await client.arm_away() # Arm all zones
await client.arm_stay() # Perimeter zones only
await client.arm_partial() # Partial arm
await client.disarm() # Disarm
await client.cancel_alarm() # Cancel active alarm
Data Models
AlarmStatusModel
| Field | Type | Description |
|---|---|---|
status |
AlarmStatusEnum |
Current panel status |
AlarmStatusEnum
| Value | Name | Description |
|---|---|---|
0 |
ARMED_AWAY |
Armed, all zones |
1 |
DISARMED |
Disarmed |
2 |
ARMED_STAY |
Armed, stay mode |
3 |
CANCEL |
Alarm cancelled |
4 |
TRIGGERED |
Alarm triggered |
5 |
ALARM_ARMING |
Arming in progress |
6 |
UNAVAILABLE |
Status unknown |
8 |
ARMED_PARTIAL |
Armed, partial |
ZoneModel
| Field / Property | Type | Description |
|---|---|---|
index |
int |
Zone index |
name |
str |
Zone name |
zone_type |
int |
Zone type code |
status |
ZoneStatusEnum |
Raw status bitmask |
is_open |
bool |
Zone is faulted / open |
is_bypassed |
bool |
Zone is bypassed |
low_battery |
bool |
Low battery detected |
signal_loss |
bool |
Wireless signal lost |
Note:
is_openreflects the physical open/close state only when "Check magnets" (zone monitoring) is enabled for that zone in the iAlarm app. When disabled, the panel does not report fault status andis_openwill always returnFalseregardless of the physical state of the zone.
NetworkInfoModel
| Field | Type | Description |
|---|---|---|
name |
str |
Panel device name |
mac |
str |
MAC address |
ip |
str |
IP address |
Error Handling
| Exception | When raised |
|---|---|
IAlarmMkConnectionError |
TCP failure, timeout, malformed panel response, or unexpected error during login |
IAlarmMkLoginError |
Panel rejected credentials |
IAlarmMkAlarmError |
Panel returned a non-zero error code for a command |
from open_ialarm_mk_local_api import IAlarmMkConnectionError, IAlarmMkLoginError
try:
async with IAlarmMkClient("192.168.1.100", 8000, "admin", "pass") as client:
await client.arm_away()
except IAlarmMkLoginError:
print("Wrong credentials")
except IAlarmMkConnectionError as e:
print(f"Connection failed: {e}")
Real-Time Push Events
For real-time alarm events (triggered, armed, disarmed) use IAlarmMkPushClient. It opens a dedicated TCP connection to the panel and invokes a callback for every event received. The connection is re-established automatically if it drops.
import asyncio
from open_ialarm_mk_local_api import IAlarmMkPushClient
def on_event(event: dict):
print("Panel event:", event)
async def main():
client = IAlarmMkPushClient("192.168.1.100", 8000, "admin", on_event)
await client.subscribe() # blocks until client.cancel() is called
asyncio.run(main())
Constructor Parameters: IAlarmMkPushClient
| Parameter | Type | Description |
|---|---|---|
host |
str |
IP address of the panel |
port |
int |
TCP port (same as IAlarmMkClient) |
username |
str |
Login username |
on_event |
Callable[[dict], None] |
Callback invoked for each push event received |
Methods & Properties
| Name | Description |
|---|---|
await subscribe() |
Connect and listen for events. Reconnects automatically. Blocks until cancel() is called. |
cancel() |
Stop the subscription loop and close the connection. |
connected |
bool — True when the push TCP connection is currently open. |
Note: Use
IAlarmMkPushClientalongsideIAlarmMkClient— they can both connect to the panel on the same port simultaneously. The command connection handles polling and control; the push client delivers real-time events reliably without batching delays.
Examples
Run any example directly from the repo root (no install needed):
python3 examples/get_status.py --host 192.168.1.100 --user admin --password password
python3 examples/arm_away.py --host 192.168.1.100 --user admin --password password arm-partial
python3 examples/subscribe_events.py --host 192.168.1.100 --user admin
Integration test against a real panel
python3 examples/integration_test.py --host 192.168.1.100 --user admin --password password
# skip arm/disarm on a live production panel:
python3 examples/integration_test.py --host 192.168.1.100 --user admin --password password --skip-arm
Testing
python -m pytest tests/
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file open_ialarm_mk_local_api-1.0.4.tar.gz.
File metadata
- Download URL: open_ialarm_mk_local_api-1.0.4.tar.gz
- Upload date:
- Size: 28.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e253b8fffe82b6440da8216cbf54fac436f9540668371deb35881fb00d4845b
|
|
| MD5 |
d771b04c18e8cc5a138bbb8176661f56
|
|
| BLAKE2b-256 |
c0c2b600297a189978ea6b1b3b2dbdfa4823ffab6a21b3dce0e04829f1befab5
|
Provenance
The following attestation bundles were made for open_ialarm_mk_local_api-1.0.4.tar.gz:
Publisher:
publish.yml on VoidElle/open-ialarm-mk-local-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_ialarm_mk_local_api-1.0.4.tar.gz -
Subject digest:
8e253b8fffe82b6440da8216cbf54fac436f9540668371deb35881fb00d4845b - Sigstore transparency entry: 1804220818
- Sigstore integration time:
-
Permalink:
VoidElle/open-ialarm-mk-local-api@ede48165418c2a8002d5d3ec659b98458cf1a233 -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/VoidElle
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ede48165418c2a8002d5d3ec659b98458cf1a233 -
Trigger Event:
release
-
Statement type:
File details
Details for the file open_ialarm_mk_local_api-1.0.4-py3-none-any.whl.
File metadata
- Download URL: open_ialarm_mk_local_api-1.0.4-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
041df7e609e2488b2fce197fab5fed17228535e6b76a58290fe417710e90d7f6
|
|
| MD5 |
a5218134fb3df12e841dc317c51079f5
|
|
| BLAKE2b-256 |
458a3558ab40110394a59a94025eb2b9399b291e936f95a21bf027a4b8691a6c
|
Provenance
The following attestation bundles were made for open_ialarm_mk_local_api-1.0.4-py3-none-any.whl:
Publisher:
publish.yml on VoidElle/open-ialarm-mk-local-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_ialarm_mk_local_api-1.0.4-py3-none-any.whl -
Subject digest:
041df7e609e2488b2fce197fab5fed17228535e6b76a58290fe417710e90d7f6 - Sigstore transparency entry: 1804220833
- Sigstore integration time:
-
Permalink:
VoidElle/open-ialarm-mk-local-api@ede48165418c2a8002d5d3ec659b98458cf1a233 -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/VoidElle
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ede48165418c2a8002d5d3ec659b98458cf1a233 -
Trigger Event:
release
-
Statement type: