lirc python extension for asyncio
Project description
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 137542f8dc3d56742746deeeeb5091eca711bd681af9aae12f178c2b8b989757 |
|
MD5 | 554ff8defd7b34d934d280184f2fae11 |
|
BLAKE2b-256 | 44825886ffc986eed77e957cd37cd7fbda095f8aca113c674000f00921127726 |