Skip to main content

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

Python Version License Version Tests

FeaturesInstallationQuick StartDocumentationPush EventsExamplesTesting


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.Lock serializes 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_open reflects 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 and is_open will always return False regardless 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 boolTrue when the push TCP connection is currently open.

Note: Use IAlarmMkPushClient alongside IAlarmMkClient — 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

open_ialarm_mk_local_api-1.0.4.tar.gz (28.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

open_ialarm_mk_local_api-1.0.4-py3-none-any.whl (24.3 kB view details)

Uploaded Python 3

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

Hashes for open_ialarm_mk_local_api-1.0.4.tar.gz
Algorithm Hash digest
SHA256 8e253b8fffe82b6440da8216cbf54fac436f9540668371deb35881fb00d4845b
MD5 d771b04c18e8cc5a138bbb8176661f56
BLAKE2b-256 c0c2b600297a189978ea6b1b3b2dbdfa4823ffab6a21b3dce0e04829f1befab5

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file open_ialarm_mk_local_api-1.0.4-py3-none-any.whl.

File metadata

File hashes

Hashes for open_ialarm_mk_local_api-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 041df7e609e2488b2fce197fab5fed17228535e6b76a58290fe417710e90d7f6
MD5 a5218134fb3df12e841dc317c51079f5
BLAKE2b-256 458a3558ab40110394a59a94025eb2b9399b291e936f95a21bf027a4b8691a6c

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page