eugenetriguba/lirc

View on GitHub
docs/source/usage.rst

Summary

Maintainability
Test Coverage
#####
Usage
#####

Once you've installed the ``lirc`` python package, there will be a number
of things you can now import from it to get started.

.. code-block:: python

  from lirc import Client, LircdConnection

The most relevant of these is ``Client``, since this is the main class
you will be using. ``LircdConnection`` is the object that is used to configure
the connection to LIRC when you initialize the ``Client``.

If you want to catch any of the exceptions, those are all under ``lirc.exceptions``.

.. code-block:: python

  from lirc.exceptions import (
    LircError,
    LircdSocketError,
    LircdConnectionError,
    LircdInvalidReplyPacketError,
    LircdCommandFailureError,
    UnsupportedOperatingSystemError
  )

***********************
Initializing the Client
***********************

.. code-block:: python

  import lirc

  client = lirc.Client()

  print(client.version())
  >>> '0.10.1'

To use this package, we instantiate a ``Client``. By initializing it
with no arguments, the ``Client`` will attempt to connect to the lirc
daemon with the default connection parameters for your operating system.

However, if you've instantiated the ``Client`` without any arguments,
you don't get any errors, and you recieve a response from the ``version()``
command, you are connected to the daemon. Most people should not need to
change the default parameters.

Overriding LIRC Defaults on Initialization
==========================================

However, what if we the defaults don't work for us or we have a more complex setup?

Let's say we're on Windows and we want to connect over TCP to a remote LIRC server
on another Windows machine. So we've passed in an ``address`` to override the default
so it doesn't look for the daemon on the localhost. ``socket`` and ``timeout`` are
passed in just to show that we can, these are already the defaults on Windows.

.. code-block:: python

  import socket
  from lirc import Client, LircdConnection

  client = Client(
    connection=LircdConnection(
      address=("10.16.30.2", 8765),
      socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM),
      timeout=5.0
    )
  )

The ``Client`` takes in one optional keyword argument: connection.
This connection must be a ``LircdConnection``. This connection, if not
specified manually, will have default values to connecting to lircd for
the operating system you are using.

The ``address`` specifies how to reach the lircd daemon. On Windows,
we pass a ``(hostname, port)`` tuple since we connect over TCP such as
``('localhost', 8765)``. However on Linux and macOS, we pass in the path
to the socket on the filesystem as a string.

The ``socket`` is the connection type. On Linux/macOS, it will default to a UNIX
domain socket connection. On Windows, ``socket.socket(socket.AF_INET, socket.SOCK_STREAM)``
is used for a connection over TCP.

Lastly, ``timeout`` specifies the amount of time to wait when reading from the socket
for a response.

LIRC Initialization Defaults per Operating System
=================================================

From the options we may pass into the ``LircdConnection``, ``address``
and ``socket`` will change depending on the operating system you are using.
The ``timeout`` always defaults to 5.0 (seconds).

On Linux, this will attempt to connect to the lircd socket at
``/var/run/lirc/lircd`` and create a socket using ``AF_UNIX`` and
``SOCK_STREAM``.

On macOS, it will be almost identical to Linux except that all the paths
will be prefixed by ``/opt/local/`` so the connection to the lircd
socket will instead be at ``/opt/local/var/run/lirc/lircd``. The socket that
is created will be the same.

However if we are on Windows, we can't use unix domain sockets. Instead,
WinLIRC uses TCP to communicate with the lirc daemon. So instead of a string
for the address, it defaults to a tuple of ``("localhost", 8765)``, which is the
default connection parameters for WinLIRC. The first part contains the address
whereas the second is the port. Furthermore, the socket that is created uses
``AF_INET`` and ``SOCK_STREAM`` instead so we can connect over TCP.

****************
Sending IR Codes
****************

In order to send IR signals with our remote, one option we have
is that we can use the ``send_once`` method on the ``lirc.Client``.

.. code-block:: python

  import lirc

  client = lirc.Client()
  client.send_once('our-remote-name', 'key-in-the-remote-file')

Using the ``send_once()`` method is quite simple. For any method,
such as this one, that takes in a remote and a key, the parameters
are always in that order with the remote name first and then the key
name. Because the ``send_once`` method does not get any meaningful data
back from lircd, there is no return value from it. Instead, as is the case
for most methods here that don't have a meaningful return value, a
``lirc.exceptions.LircdCommandFailureError`` is raised if the command we
sent failed.

Furthermore, we can also send the key in rapid succession. This is useful
if we, say, want to go to channel 33.

.. code-block:: python

  import lirc

  client = lirc.Client()
  client.send_once('our-remote-name', 'key_3', repeat_count=1)

We can also send IR codes using ``send_start`` and ``send_stop``.
``send_start`` works in a similar manner to ``send_once``. The
difference is that with ``send_start``, IR codes are continually
sent until a ``send_stop`` call.

.. code-block:: python

  import time
  import lirc

  client = lirc.Client()
  client.send_start('our-remote-name', 'key_right')
  time.sleep(5)
  client.send_stop()

In this example, we see that we can start sending our 'key_right'
signal for 5 seconds and then call ``send_stop`` to stop that. Notice
that we didn't pass any arguments to ``send_stop``. This is because by
default, the ``Client`` will keep track of the last remote name and
remote key that was used with ``send_start``. Optionally, we could of
made it explicit.

.. code-block:: python

  client.send_stop('our-remote-name', 'key_right')

This allows you to have multiple ``send_start``s running at the same time,
since you can explicitly pass in which remote and key to stop.