Skip to main content

lirc python extension for asyncio

Project description

http://img.shields.io/pypi/v/aiolirc.svg https://img.shields.io/badge/license-GPLv3-brightgreen.svg

Jump To

About

Asynchronous messaging using python’s new facility(async-await syntax), introduced in version 3.5 is so fun!

So, I decided to provide an asynchronous context manager and iterator wrapper for Linux Infra-Red Remote Control(LIRC).

Happily, the Cython is working well with asyncio. So the lirc_client C extension has been made by cython’s extenstion type.

In addition, an IRCDispatcher type and a listen_for decorator have been provided.

Install

$ apt-get install liblircclient-dev python3.5-dev build-essential
$ pip install cython
$ pip install aiolirc

Quick Start

The simplest way to use this library is the famous very_quickstart function as follows:

from aiolirc import very_quickstart, listen_for

@listen_for('play')
async def do_play(loop):
    ...
    # Do play stuff

very_quickstart('my-prog')  # my-prog is configured in your lircrc file.

Another coroutine function named quickstart is also available.This lets you have control over the event loop life-cycle:

import asyncio
from aiolirc import quickstart

main_loop = asyncio.get_event_loop()
try:
    main_loop.run_until_complete(quickstart(loop=main_loop))
except KeyboardInterrupt:
    print('CTRL+C detected. terminating...')
    return 1
finally:
    if not main_loop.is_closed():
        main_loop.close()

The IRCDispatcher

Constructor

def __init__(self, source: LIRCClient, loop: asyncio.BaseEventLoop=None):

Example of usage

import asyncio

from aiolirc.lirc_client import LIRCClient
from aiolirc.dispatcher import IRCDispatcher, listen_for

@listen_for('amp power', repeat=5)
async def amp_power(loop):
    ...
    # Do your stuff

@listen_for('amp source')
async def amp_source(loop):
    ...
    # Do your stuff


async with LIRCClient('my-prog') as client:
    dispatcher = IRCDispatcher(client)
    await dispatcher.listen()

The LIRCClient

Constructor

def __cinit__(self, lircrc_prog, *, lircrc_file='~/.config/lircrc', loop=None, check_interval=.05, verbose=False,
    blocking=False):

To advance control over the messages received from lirc, asychronously iter over an instance of the LIRCClient after calling LIRCClient.lirc_init(). And make sure the LIRCClient.lirc_deinit() has been called after finishing your work with LIRCClient:

from aiolirc.lirc_client import LIRCClient

client = LIRCClient('my-prog')
try:
    client.lirc_init()
    async for cmd in client:
        print(cmd)
finally:
    client.lirc_deinit()

You may use the LIRCClient as an asynchronous context manager as described as follows, to automatically call the LIRCClient.lirc_init() and LIRCClient.lirc_deinit() functions, and also acquiring a lock to prevent multiple instances of the LIRCClient from reading messages from lirc_client wrapper:

from aiolirc.lirc_client import LIRCClient

async with LIRCClient('my-prog') as client:
    async for cmd in client:
        print(cmd)

Systemd

Create a main.py:

import sys
import asyncio

from aiolirc import IRCDispatcher, LIRCClient

async def launch(self) -> int:

    async with LIRCClient('my-prog', lircrc_file='path/to/lircrc', check_interval=.06) as client:
        dispatcher = IRCDispatcher(client)
        result = (await asyncio.gather(dispatcher.listen(), return_exceptions=True))[0]

    if isinstance(result, Exception):
        raise result

    return 0

def main(self):

    main_loop = asyncio.get_event_loop()
    try:
        return main_loop.run_until_complete(launch())
    except KeyboardInterrupt:
        print('CTRL+C detected.')
        return 1
    finally:
        if not main_loop.is_closed():
            main_loop.close()

if __name__ == '__main__':
    sys.exit(main())

/etc/systemd/system/aiolirc.service file:

[Unit]
Description=aiolirc

[Service]
ExecStart=python3.5 /path/to/main.py
User=user
Group=group

[Install]
WantedBy=multi-user.target

systemctl:

$ systemctl enable aiolirc
$ systemctl start aiolirc
$ systemctl restart aiolirc

$ ps -Af | grep 'main.py'

$ systemctl stop aiolirc

Change Log

0.1.0

  • README.rst

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

aiolirc-0.1.2.tar.gz (61.5 kB view details)

Uploaded Source

File details

Details for the file aiolirc-0.1.2.tar.gz.

File metadata

  • Download URL: aiolirc-0.1.2.tar.gz
  • Upload date:
  • Size: 61.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for aiolirc-0.1.2.tar.gz
Algorithm Hash digest
SHA256 137542f8dc3d56742746deeeeb5091eca711bd681af9aae12f178c2b8b989757
MD5 554ff8defd7b34d934d280184f2fae11
BLAKE2b-256 44825886ffc986eed77e957cd37cd7fbda095f8aca113c674000f00921127726

See more details on using hashes here.

Supported by

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