diff --git a/alarmdecoder/decoder.py b/alarmdecoder/decoder.py index 8832ab8..6345c50 100644 --- a/alarmdecoder/decoder.py +++ b/alarmdecoder/decoder.py @@ -20,30 +20,30 @@ class AlarmDecoder(object): """ # High-level Events - on_arm = event.Event('This event is called when the panel is armed.') - on_disarm = event.Event('This event is called when the panel is disarmed.') - on_power_changed = event.Event('This event is called when panel power switches between AC and DC.') - on_alarm = event.Event('This event is called when the alarm is triggered.') - on_fire = event.Event('This event is called when a fire is detected.') - on_bypass = event.Event('This event is called when a zone is bypassed.') - on_boot = event.Event('This event is called when the device finishes booting.') - on_config_received = event.Event('This event is called when the device receives its configuration.') - on_zone_fault = event.Event('This event is called when :py:class:`alarmdecoder.zonetracking.Zonetracker` detects a zone fault.') - on_zone_restore = event.Event('This event is called when :py:class:`alarmdecoder.zonetracking.Zonetracker` detects that a fault is restored.') - on_low_battery = event.Event('This event is called when the device detects a low battery.') - on_panic = event.Event('This event is called when the device detects a panic.') - on_relay_changed = event.Event('This event is called when a relay is opened or closed on an expander board.') + on_arm = event.Event("This event is called when the panel is armed.\n\n**Callback definition:** *def callback(device)*") + on_disarm = event.Event("This event is called when the panel is disarmed.\n\n**Callback definition:** *def callback(device)*") + on_power_changed = event.Event("This event is called when panel power switches between AC and DC.\n\n**Callback definition:** *def callback(device, status)*") + on_alarm = event.Event("This event is called when the alarm is triggered.\n\n**Callback definition:** *def callback(device, status)*") + on_fire = event.Event("This event is called when a fire is detected.\n\n**Callback definition:** *def callback(device, status)*") + on_bypass = event.Event("This event is called when a zone is bypassed. \n\n\n\n**Callback definition:** *def callback(device, status)*") + on_boot = event.Event("This event is called when the device finishes booting.\n\n**Callback definition:** *def callback(device)*") + on_config_received = event.Event("This event is called when the device receives its configuration. \n\n**Callback definition:** *def callback(device)*") + on_zone_fault = event.Event("This event is called when :py:class:`~alarmdecoder.zonetracking.Zonetracker` detects a zone fault.\n\n**Callback definition:** *def callback(device, zone)*") + on_zone_restore = event.Event("This event is called when :py:class:`~alarmdecoder.zonetracking.Zonetracker` detects that a fault is restored.\n\n**Callback definition:** *def callback(device, zone)*") + on_low_battery = event.Event("This event is called when the device detects a low battery.\n\n**Callback definition:** *def callback(device, status)*") + on_panic = event.Event("This event is called when the device detects a panic.\n\n**Callback definition:** *def callback(device, status)*") + on_relay_changed = event.Event("This event is called when a relay is opened or closed on an expander board.\n\n**Callback definition:** *def callback(device, message)*") # Mid-level Events - on_message = event.Event('This event is called when any message is received.') - on_lrr_message = event.Event('This event is called when an :py:class:`alarmdecoder.messages.LRRMessage` is received.') - on_rfx_message = event.Event('This event is called when an :py:class:`alarmdecoder.messages.RFMessage` is received.') + on_message = event.Event("This event is called when any message is received.\n\n**Callback definition:** *def callback(device, message)*") + on_lrr_message = event.Event("This event is called when an :py:class:`~alarmdecoder.messages.LRRMessage` is received.\n\n**Callback definition:** *def callback(device, message)*") + on_rfx_message = event.Event("This event is called when an :py:class:`~alarmdecoder.messages.RFMessage` is received.\n\n**Callback definition:** *def callback(device, message)*") # Low-level Events - on_open = event.Event('This event is called when the device has been opened.') - on_close = event.Event('This event is called when the device has been closed.') - on_read = event.Event('This event is called when a line has been read from the device.') - on_write = event.Event('This event is called when data has been written to the device.') + on_open = event.Event("This event is called when the device has been opened.\n\n**Callback definition:** *def callback(device)*") + on_close = event.Event("This event is called when the device has been closed.\n\n**Callback definition:** *def callback(device)*") + on_read = event.Event("This event is called when a line has been read from the device.\n\n**Callback definition:** *def callback(device, data)*") + on_write = event.Event("This event is called when data has been written to the device.\n\n**Callback definition:** *def callback(device, data)*") # Constants KEY_F1 = unichr(1) + unichr(1) + unichr(1) @@ -291,7 +291,7 @@ class AlarmDecoder(object): :param data: panel data to parse :type data: string - :returns: :py:class:`alarmdecoder.messages.Message` + :returns: :py:class:`~alarmdecoder.messages.Message` """ if data is None: raise InvalidMessageError() @@ -331,7 +331,7 @@ class AlarmDecoder(object): :param data: RF message to parse :type data: string - :returns: :py:class:`alarmdecoder.messages.RFMessage` + :returns: :py:class:`~alarmdecoder.messages.RFMessage` """ msg = RFMessage(data) @@ -346,7 +346,7 @@ class AlarmDecoder(object): :param data: LRR message to parse :type data: string - :returns: :py:class:`alarmdecoder.messages.LRRMessage` + :returns: :py:class:`~alarmdecoder.messages.LRRMessage` """ msg = LRRMessage(data) @@ -395,8 +395,8 @@ class AlarmDecoder(object): """ Updates internal device states. - :param message: :py:class:`alarmdecoder.messages.Message` to update internal states with - :type message: :py:class:`alarmdecoder.messages.Message`, :py:class:`alarmdecoder.messages.ExpanderMessage`, :py:class:`alarmdecoder.messages.LRRMessage`, or :py:class:`alarmdecoder.messages.RFMessage` + :param message: :py:class:`~alarmdecoder.messages.Message` to update internal states with + :type message: :py:class:`~alarmdecoder.messages.Message`, :py:class:`~alarmdecoder.messages.ExpanderMessage`, :py:class:`~alarmdecoder.messages.LRRMessage`, or :py:class:`~alarmdecoder.messages.RFMessage` """ if isinstance(message, Message): self._update_power_status(message) @@ -416,7 +416,7 @@ class AlarmDecoder(object): Uses the provided message to update the AC power state. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.Message` + :type message: :py:class:`~alarmdecoder.messages.Message` :returns: bool indicating the new status """ @@ -433,7 +433,7 @@ class AlarmDecoder(object): Uses the provided message to update the alarm state. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.Message` + :type message: :py:class:`~alarmdecoder.messages.Message` :returns: bool indicating the new status """ @@ -451,7 +451,7 @@ class AlarmDecoder(object): Uses the provided message to update the zone bypass state. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.Message` + :type message: :py:class:`~alarmdecoder.messages.Message` :returns: bool indicating the new status """ @@ -469,7 +469,7 @@ class AlarmDecoder(object): Uses the provided message to update the armed state. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.Message` + :type message: :py:class:`~alarmdecoder.messages.Message` :returns: bool indicating the new status """ @@ -491,7 +491,7 @@ class AlarmDecoder(object): Uses the provided message to update the battery state. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.Message` + :type message: :py:class:`~alarmdecoder.messages.Message` :returns: boolean indicating the new status """ @@ -511,7 +511,7 @@ class AlarmDecoder(object): Uses the provided message to update the fire alarm state. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.Message` + :type message: :py:class:`~alarmdecoder.messages.Message` :returns: boolean indicating the new status """ @@ -531,7 +531,7 @@ class AlarmDecoder(object): Uses the provided message to update the expander states. :param message: message to use to update - :type message: :py:class:`alarmdecoder.messages.ExpanderMessage` + :type message: :py:class:`~alarmdecoder.messages.ExpanderMessage` :returns: boolean indicating the new status """ @@ -545,10 +545,10 @@ class AlarmDecoder(object): def _update_zone_tracker(self, message): """ - Trigger an update of the :py:class:`alarmdecoder.messages.Zonetracker`. + Trigger an update of the :py:class:`~alarmdecoder.messages.Zonetracker`. :param message: message to update the zonetracker with - :type message: :py:class:`alarmdecoder.messages.Message`, :py:class:`alarmdecoder.messages.ExpanderMessage`, :py:class:`alarmdecoder.messages.LRRMessage`, or :py:class:`alarmdecoder.messages.RFMessage` + :type message: :py:class:`~alarmdecoder.messages.Message`, :py:class:`~alarmdecoder.messages.ExpanderMessage`, :py:class:`~alarmdecoder.messages.LRRMessage`, or :py:class:`~alarmdecoder.messages.RFMessage` """ # Retrieve a list of faults. diff --git a/alarmdecoder/devices.py b/alarmdecoder/devices.py index 50c73e1..4661bab 100644 --- a/alarmdecoder/devices.py +++ b/alarmdecoder/devices.py @@ -35,10 +35,10 @@ class Device(object): """ # Generic device events - on_open = event.Event('This event is called when the device has been opened.') - on_close = event.Event('This event is called when the device has been closed.') - on_read = event.Event('This event is called when a line has been read from the device.') - on_write = event.Event('This event is called when data has been written to the device.') + on_open = event.Event("This event is called when the device has been opened.\n\n**Callback definition:** *def callback(device)*") + on_close = event.Event("This event is called when the device has been closed.\n\n**Callback definition:** def callback(device)*") + on_read = event.Event("This event is called when a line has been read from the device.\n\n**Callback definition:** def callback(device, data)*") + on_write = event.Event("This event is called when data has been written to the device.\n\n**Callback definition:** def callback(device, data)*") def __init__(self): """ @@ -124,7 +124,7 @@ class Device(object): Constructor :param device: device used by the reader thread - :type device: :py:class:`alarmdecoder.devices.Device` + :type device: :py:class:`~alarmdecoder.devices.Device` """ threading.Thread.__init__(self) self._device = device @@ -177,7 +177,7 @@ class USBDevice(Device): Returns all FTDI devices matching our vendor and product IDs. :returns: list of devices - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ cls.__devices = [] @@ -209,7 +209,7 @@ class USBDevice(Device): :type device: tuple :returns: :py:class:`USBDevice` object utilizing the specified device - :raises: :py:class:`alarmdecoder.util.NoDeviceError` + :raises: :py:class:`~alarmdecoder.util.NoDeviceError` """ cls.find_all() @@ -228,9 +228,10 @@ class USBDevice(Device): """ Starts the device detection thread. - :param on_attached: function to be called when a device is attached + :param on_attached: function to be called when a device is attached **Callback definition:** *def callback(thread, device)* :type on_attached: function - :param on_detached: function to be called when a device is detached + :param on_detached: function to be called when a device is detached **Callback definition:** *def callback(thread, device)* + :type on_detached: function """ cls.__detect_thread = USBDevice.DetectThread(on_attached, on_detached) @@ -344,7 +345,7 @@ class USBDevice(Device): reader thread. :type no_reader_thread: bool - :raises: :py:class:`alarmdecoder.util.NoDeviceError` + :raises: :py:class:`~alarmdecoder.util.NoDeviceError` """ # Set up defaults if baudrate is None: @@ -398,7 +399,7 @@ class USBDevice(Device): :param data: data to write :type data: string - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ try: self._device.write_data(data) @@ -413,7 +414,7 @@ class USBDevice(Device): Reads a single character from the device. :returns: character read from the device - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ ret = None @@ -436,7 +437,7 @@ class USBDevice(Device): :type purge_buffer: bool :returns: line that was read - :raises: :py:class:`alarmdecoder.util.CommError`, :py:class:`alarmdecoder.util.TimeoutError` + :raises: :py:class:`~alarmdecoder.util.CommError`, :py:class:`~alarmdecoder.util.TimeoutError` """ def timeout_event(): @@ -496,16 +497,16 @@ class USBDevice(Device): """ Thread that handles detection of added/removed devices. """ - on_attached = event.Event('This event is called when an `AD2USB`_ device has been detected.') - on_detached = event.Event('This event is called when an `AD2USB`_ device has been removed.') + on_attached = event.Event("This event is called when an `AD2USB`_ device has been detected.\n\n**Callback definition:** def callback(thread, device*") + on_detached = event.Event("This event is called when an `AD2USB`_ device has been removed.\n\n**Callback definition:** def callback(thread, device*") def __init__(self, on_attached=None, on_detached=None): """ Constructor - :param on_attached: Function to call when a device is attached + :param on_attached: Function to call when a device is attached **Callback definition:** *def callback(thread, device)* :type on_attached: function - :param on_detached: Function to call when a device is detached + :param on_detached: Function to call when a device is detached **Callback definition:** *def callback(thread, device)* :type on_detached: function """ threading.Thread.__init__(self) @@ -568,7 +569,7 @@ class SerialDevice(Device): :type pattern: string :returns: list of devices - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ devices = [] @@ -626,7 +627,7 @@ class SerialDevice(Device): reader thread. :type no_reader_thread: bool - :raises: :py:class:`alarmdecoder.util.NoDeviceError` + :raises: :py:class:`~alarmdecoder.util.NoDeviceError` """ # Set up the defaults if baudrate is None: @@ -676,7 +677,7 @@ class SerialDevice(Device): :param data: data to write :type data: string - :raises: py:class:`alarmdecoder.util.CommError` + :raises: py:class:`~alarmdecoder.util.CommError` """ try: self._device.write(data) @@ -695,7 +696,7 @@ class SerialDevice(Device): Reads a single character from the device. :returns: character read from the device - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ ret = None @@ -718,7 +719,7 @@ class SerialDevice(Device): :type purge_buffer: bool :returns: line that was read - :raises: :py:class:`alarmdecoder.util.CommError`, :py:class:`alarmdecoder.util.TimeoutError` + :raises: :py:class:`~alarmdecoder.util.CommError`, :py:class:`~alarmdecoder.util.TimeoutError` """ def timeout_event(): @@ -895,7 +896,7 @@ class SocketDevice(Device): thread. :type no_reader_thread: bool - :raises: :py:class:`alarmdecoder.util.NoDeviceError`, :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.NoDeviceError`, :py:class:`~alarmdecoder.util.CommError` """ try: @@ -949,7 +950,7 @@ class SocketDevice(Device): :type data: string :returns: number of bytes sent - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ data_sent = None @@ -971,7 +972,7 @@ class SocketDevice(Device): Reads a single character from the device. :returns: character read from the device - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ data = None @@ -994,7 +995,7 @@ class SocketDevice(Device): :type purge_buffer: bool :returns: line that was read - :raises: :py:class:`alarmdecoder.util.CommError`, :py:class:`alarmdecoder.util.TimeoutError` + :raises: :py:class:`~alarmdecoder.util.CommError`, :py:class:`~alarmdecoder.util.TimeoutError` """ def timeout_event(): @@ -1046,7 +1047,7 @@ class SocketDevice(Device): """ Initializes our device as an SSL connection. - :raises: :py:class:`alarmdecoder.util.CommError` + :raises: :py:class:`~alarmdecoder.util.CommError` """ try: diff --git a/alarmdecoder/messages.py b/alarmdecoder/messages.py index 5a349c5..ceb6e84 100644 --- a/alarmdecoder/messages.py +++ b/alarmdecoder/messages.py @@ -115,7 +115,7 @@ class Message(BaseMessage): :param data: message data :type data: string - :raises: :py:class:`alarmdecoder.util.InvalidMessageError` + :raises: :py:class:`~alarmdecoder.util.InvalidMessageError` """ match = self._regex.match(data) @@ -196,7 +196,7 @@ class ExpanderMessage(BaseMessage): :param data: message data :type data: string - :raises: :py:class:`alarmdecoder.util.InvalidMessageError` + :raises: :py:class:`~alarmdecoder.util.InvalidMessageError` """ try: header, values = data.split(':') @@ -259,7 +259,7 @@ class RFMessage(BaseMessage): :param data: message data :type data: string - :raises: :py:class:`alarmdecoder.util.InvalidMessageError` + :raises: :py:class:`~alarmdecoder.util.InvalidMessageError` """ try: self.raw = data @@ -320,7 +320,7 @@ class LRRMessage(BaseMessage): :param data: message data to parse :type data: string - :raises: :py:class:`alarmdecoder.util.InvalidMessageError` + :raises: :py:class:`~alarmdecoder.util.InvalidMessageError` """ try: self.raw = data diff --git a/alarmdecoder/util.py b/alarmdecoder/util.py index d7cf2ea..2963736 100644 --- a/alarmdecoder/util.py +++ b/alarmdecoder/util.py @@ -62,7 +62,7 @@ class Firmware(object): :param progress_callback: callback function used to report progress :type progress_callback: function - :raises: :py:class:`alarmdecoder.util.NoDeviceError`, :py:class:`alarmdecoder.util.TimeoutError` + :raises: :py:class:`~alarmdecoder.util.NoDeviceError`, :py:class:`~alarmdecoder.util.TimeoutError` """ def do_upload(): diff --git a/alarmdecoder/zonetracking.py b/alarmdecoder/zonetracking.py index 3bf6f8b..798211a 100644 --- a/alarmdecoder/zonetracking.py +++ b/alarmdecoder/zonetracking.py @@ -72,8 +72,8 @@ class Zonetracker(object): Handles tracking of zones and their statuses. """ - on_fault = event.Event('This event is called when the device detects a zone fault.') - on_restore = event.Event('This event is called when the device detects that a fault is restored.') + on_fault = event.Event("This event is called when the device detects a zone fault.\n\n**Callback definition:** *def callback(device, zone)*") + on_restore = event.Event("This event is called when the device detects that a fault is restored.\n\n**Callback definition:** *def callback(device, zone)*") EXPIRE = 30 """Zone expiration timeout.""" @@ -129,7 +129,7 @@ class Zonetracker(object): Update zone statuses based on the current message. :param message: message to use to update the zone tracking - :type message: :py:class:`alarmdecoder.messages.Message` or :py:class:`alarmdecoder.messages.ExpanderMessage` + :type message: :py:class:`~alarmdecoder.messages.Message` or :py:class:`~alarmdecoder.messages.ExpanderMessage` """ if isinstance(message, ExpanderMessage): if message.type == ExpanderMessage.ZONE: diff --git a/docs/build/doctrees/alarmdecoder.doctree b/docs/build/doctrees/alarmdecoder.doctree index 3478f38..1a560fb 100644 Binary files a/docs/build/doctrees/alarmdecoder.doctree and b/docs/build/doctrees/alarmdecoder.doctree differ diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index cfaefb0..6dcbb78 100644 Binary files a/docs/build/doctrees/environment.pickle and b/docs/build/doctrees/environment.pickle differ diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index 044d182..a116e7c 100644 Binary files a/docs/build/doctrees/index.doctree and b/docs/build/doctrees/index.doctree differ diff --git a/docs/build/html/_sources/index.txt b/docs/build/html/_sources/index.txt index 1cc583f..9304521 100644 --- a/docs/build/html/_sources/index.txt +++ b/docs/build/html/_sources/index.txt @@ -3,17 +3,50 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to alarmdecoder's documentation! +Welcome to Alarm Decoder's documentation! ======================================== -This is the API documentation for the `Alarm Decoder`_ Python library. It provides support for interacting with the `Alarm Decoder`_ (AD2) family of security alarm devices, including the `AD2USB`_, `AD2SERIAL`_ and `AD2PI`_. - -The source code, requirements and examples for this project may be found `here `_. - .. _Alarm Decoder: http://www.alarmdecoder.com .. _AD2USB: http://www.alarmdecoder.com .. _AD2SERIAL: http://www.alarmdecoder.com .. _AD2PI: http://www.alarmdecoder.com +.. _examples: http://github.com/nutechsoftware/alarmdecoder/tree/master/examples + +This is the API documentation for the `Alarm Decoder`_ Python library. It provides support for interacting with the `Alarm Decoder`_ (AD2) family of security alarm devices, including the `AD2USB`_, `AD2SERIAL`_ and `AD2PI`_. + +The source code, requirements and examples for this project may be found `here `_. + +Please see the `examples`_ directory for more samples, but a basic one is included below:: + + import time + from alarmdecoder import AlarmDecoder + from alarmdecoder.devices import USBDevice + + def main(): + """ + Example application that prints messages from the panel to the terminal. + """ + try: + # Retrieve the first USB device + device = AlarmDecoder(USBDevice.find()) + + # Set up an event handler and open the device + device.on_message += handle_message + with device.open(): + while True: + time.sleep(1) + + except Exception, ex: + print 'Exception:', ex + + def handle_message(sender, message): + """ + Handles message events from the AlarmDecoder. + """ + print sender, message.raw + + if __name__ == '__main__': + main() Table of Contents: diff --git a/docs/build/html/alarmdecoder.html b/docs/build/html/alarmdecoder.html index f11d32d..fdf89b4 100644 --- a/docs/build/html/alarmdecoder.html +++ b/docs/build/html/alarmdecoder.html @@ -24,7 +24,7 @@ - +