Skip to main content

A Python library to communicate with Risco Cloud.

Project description

PyRisco

A python interface to Risco alarm systems through Risco Cloud.

Installation

You can install pyrisco from PyPI:

pip3 install pyrisco

Python 3.11 and above are supported.

How to use

Cloud

Push updates via SSE (recommended)

Pyrisco can subscribe to Risco Cloud's Server-Sent Events stream and push state changes to your callbacks as they happen, without polling.

import asyncio
from pyrisco import RiscoCloud

r = RiscoCloud("<username>", "<password>", "<pincode>")

async def on_state(alarm):
    print(alarm.partitions[0].armed)
    print(alarm.zones[0].triggered)

async def on_error(error):
    print(f"SSE error: {error}, reconnecting in 5s...")
    await asyncio.sleep(5)
    await r.login()
    await r.subscribe_states()

async def main():
    await r.login()
    r.add_state_handler(on_state)
    r.add_error_handler(on_error)
    await r.subscribe_states()
    await asyncio.Future()  # run forever

asyncio.run(main())

Both add_state_handler and add_error_handler return a callable that removes the handler when called.

After subscribe_states() is started, calls to get_state() return the latest cached state without making a network request.

Polling

You can also poll for state manually:

import asyncio
from pyrisco import RiscoCloud

async def test_cloud():
    r = RiscoCloud("<username>", "<password>", "<pincode>")

    # you can also pass your own session to login. It will not be closed    
    await r.login()
    alarm = await r.get_state()
    # partitions and zones are zero-based in Cloud
    print(alarm.partitions[0].armed)
    
    events = await r.get_events("2020-06-17T00:00:00Z", 10)
    print(events[0].name)
    
    print(alarm.zones[0].name)
    print(alarm.zones[0].triggered)
    print(alarm.zones[0].bypassed)
    
    # arm partition 0
    await r.partitions[0].arm()
    
    # and disarm it
    await r.partitions[0].disarm()
    
    # Partial arming
    await r.partitions[0].partial_arm()
    
    # Group arming
    await r.partitions[0].group_arm("B")
    # or a zero based index
    await r.partitions[0].group_arm(1)
    
    # Don't forget to close when you're done
    await r.close()

asyncio.run(test_cloud())

RiscoCloud fallback mode

Pyrisco will instruct RiscoCloud to request updates from your control panel, if there is an issue RiscoCloud will return a 72 error code, if this happens,

  • pyrisco will try a second time in fallback mode, which will request the last known state from RiscoCloud.
  • A flag named assumed_control_panel_state will be set to True on the Alarm object to indicate that the state is assumed, rather than obtained from the panel. Assumed states could be stale.

Local

import asyncio
from pyrisco import RiscoLocal

async def test_local():
    # r = RiscoLocal("<host>", <port>, "<pincode>")
    r = RiscoLocal("<host>", 1000, "<pincode>")

    await r.connect()
    
    # Register handlers
    async def _error(error):
      print(f'Error handler: {error}')
    remove_error = r.add_error_handler(_error)
    async def _event(event):
      print(f'Event handler: {event}')
    remove_event = r.add_event_handler(_event)
    async def _default(command, result, *params):
      print(f'Default handler: {command}, {result}, {params}')
    remove_default = r.add_default_handler(_default)
    async def _zone(zone_id, zone):
      print(f'Zone handler: {zone_id}, {vars(zone)}')
    remove_zone = r.add_zone_handler(_zone)
    async def _partition(partition_id, partition):
      print(f'Partition handler: {partition_id}, {vars(partition)}')
    remove_partition = r.add_partition_handler(_partition)
    
    await r.connect()
    # partitions and zones are one-based in Cloud
    print(r.partitions[1].armed)
    
    
    print(r.zones[1].name)
    print(r.zones[1].triggered)
    print(r.zones[1].bypassed)
    
    # arm partition 1
    await r.partitions[1].arm()
    
    # and disarm it
    await r.partitions[1].disarm()
    
    # Partial arming
    await r.partitions[1].partial_arm()
    
    # Group arming
    await r.partitions[1].group_arm("B")
    # or a zero based index
    await r.partitions[1].group_arm(1)
    
    # Don't forget to close when you're done
    await r.disconnect()

asyncio.run(test_local())

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

pyrisco-0.7.1.tar.gz (21.6 kB view details)

Uploaded Source

Built Distribution

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

pyrisco-0.7.1-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file pyrisco-0.7.1.tar.gz.

File metadata

  • Download URL: pyrisco-0.7.1.tar.gz
  • Upload date:
  • Size: 21.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyrisco-0.7.1.tar.gz
Algorithm Hash digest
SHA256 455e1d8686dd99672043c0d152d03b61ebd5b5647e7a9e649b4861e60c209227
MD5 cbafced76ae562f7f093e7b2f8e85b10
BLAKE2b-256 d9e552750ac4da1bdd087c26281de9e0e0d190eba0cc17d308d8dd462ab39f04

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrisco-0.7.1.tar.gz:

Publisher: release.yml on OnFreund/pyrisco

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

File details

Details for the file pyrisco-0.7.1-py3-none-any.whl.

File metadata

  • Download URL: pyrisco-0.7.1-py3-none-any.whl
  • Upload date:
  • Size: 21.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyrisco-0.7.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e4787223170931c8a6fe1f22ad4ce61ac8921ae7b0187d1dffab35d77539aec7
MD5 93ab2c7566c4ab67bb1d339cbfd47df4
BLAKE2b-256 26363103cd322a36c74ba73052647ebc5957c9db32aa9a90bb3e9d9e2bf34fbe

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrisco-0.7.1-py3-none-any.whl:

Publisher: release.yml on OnFreund/pyrisco

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