aiolirc
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
Metadata
Release files for aiolirc 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| aiolirc-0.1.2.tar.gz | 61.5 kB | Without provenance | Details |
Release files / aiolirc-0.1.2.tar.gz
| Download URL | aiolirc-0.1.2.tar.gz |
|---|---|
| Size | 61.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
137542f8dc3d56742746deeeeb5091eca711bd681af9aae12f178c2b8b989757
|
|
BLAKE2b-256 checksum How to use checksums |
44825886ffc986eed77e957cd37cd7fbda095f8aca113c674000f00921127726
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for aiolirc 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.