From 99f203db97992116e80c8dc67af7692e63df88ee Mon Sep 17 00:00:00 2001 From: Scott Petersen Date: Tue, 10 Dec 2013 16:04:54 -0800 Subject: [PATCH] Ridiculous amount of documentation updates. --- README.md | 17 +- alarmdecoder/decoder.py | 172 +-- alarmdecoder/devices.py | 203 ++-- alarmdecoder/messages.py | 103 +- alarmdecoder/util.py | 14 +- alarmdecoder/zonetracking.py | 95 +- docs/alarmdecoder.rst | 33 +- docs/build/doctrees/alarmdecoder.doctree | Bin 250563 -> 358543 bytes docs/build/doctrees/environment.pickle | Bin 89325 -> 115944 bytes docs/build/doctrees/index.doctree | Bin 6141 -> 9171 bytes docs/build/html/.buildinfo | 2 +- .../html/_modules/alarmdecoder/decoder.html | 677 +++++++++++ docs/build/html/_modules/index.html | 3 +- docs/build/html/_sources/alarmdecoder.txt | 33 +- docs/build/html/_sources/index.txt | 13 +- docs/build/html/alarmdecoder.html | 1049 +++++++++++------ docs/build/html/genindex.html | 275 ++++- docs/build/html/index.html | 18 +- docs/build/html/modules.html | 14 +- docs/build/html/objects.inv | Bin 1378 -> 1733 bytes docs/build/html/py-modindex.html | 5 + docs/build/html/searchindex.js | 2 +- docs/conf.py | 2 +- docs/index.rst | 13 +- 24 files changed, 2065 insertions(+), 678 deletions(-) create mode 100644 docs/build/html/_modules/alarmdecoder/decoder.html diff --git a/README.md b/README.md index bdb1196..5a88236 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,28 @@ Alarm Decoder -================================================================== -#### Interface for the Alarm Decoder (AD2) device family #### +============= +#### Interface for the [Alarm Decoder](http://www.alarmdecoder.com) (AD2) device family #### -This Python library aims to provide a consistent interface for the entire Alarm -Decoder product line, including the AD2USB, AD2SERIAL and AD2PI devices. +This Python library aims to provide a consistent interface for the entire [Alarm +Decoder](http://www.alarmdecoder.com) product line, including the AD2USB, AD2SERIAL and AD2PI devices. This also includes devices that have been exposed via [ser2sock](http://github.com/nutechsoftware/ser2sock), which supports encryption via SSL/TLS. Installation ------------ -alarmdecoder can be installed through pip: +AlarmDecoder can be installed through pip: ```pip install alarmdecoder``` or from source: - ```python setup.py install``` + ``` + git clone http://github.com/nutechsoftware/alarmdecoder + python setup.py install + ``` Requirements ------------ +* An [Alarm Decoder](http://www.alarmdecoder.com) device: AD2USB, AD2SERIAL or AD2PI. +* Python 2.7 * [pyftdi](https://github.com/eblot/pyftdi) >= 0.9.0 * [pyusb](http://sourceforge.net/apps/trac/pyusb/) >= 1.0.0b1 * [pyserial](http://pyserial.sourceforge.net/) >= 2.7 diff --git a/alarmdecoder/decoder.py b/alarmdecoder/decoder.py index 89dfc9d..78612a9 100644 --- a/alarmdecoder/decoder.py +++ b/alarmdecoder/decoder.py @@ -1,5 +1,7 @@ """ -Provides the full AlarmDecoder class. +Provides the main AlarmDecoder class. + +.. _Alarm Decoder: http://www.alarmdecoder.com .. moduleauthor:: Scott Petersen """ @@ -14,34 +16,34 @@ from .zonetracking import Zonetracker class AlarmDecoder(object): """ - High-level wrapper around Alarm Decoder (AD2) devices. + High-level wrapper around `Alarm Decoder`_ (AD2) devices. """ # High-level Events - on_arm = event.Event('Called when the panel is armed.') - on_disarm = event.Event('Called when the panel is disarmed.') - on_power_changed = event.Event('Called when panel power switches between AC and DC.') - on_alarm = event.Event('Called when the alarm is triggered.') - on_fire = event.Event('Called when a fire is detected.') - on_bypass = event.Event('Called when a zone is bypassed.') - on_boot = event.Event('Called when the device finishes bootings.') - on_config_received = event.Event('Called when the device receives its configuration.') - on_zone_fault = event.Event('Called when the device detects a zone fault.') - on_zone_restore = event.Event('Called when the device detects that a fault is restored.') - on_low_battery = event.Event('Called when the device detects a low battery.') - on_panic = event.Event('Called when the device detects a panic.') - on_relay_changed = event.Event('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.') + 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.') # Mid-level Events - on_message = event.Event('Called when a message has been received from the device.') - on_lrr_message = event.Event('Called when an LRR message is received.') - on_rfx_message = event.Event('Called when an RFX message is received.') + 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.') # Low-level Events - on_open = event.Event('Called when the device has been opened.') - on_close = event.Event('Called when the device has been closed.') - on_read = event.Event('Called when a line has been read from the device.') - on_write = event.Event('Called when data has been written to the device.') + 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.') # Constants KEY_F1 = unichr(1) + unichr(1) + unichr(1) @@ -54,15 +56,31 @@ class AlarmDecoder(object): """Represents panel function key #4""" BATTERY_TIMEOUT = 30 - """Timeout before the battery status reverts.""" + """Default timeout (in seconds) before the battery status reverts.""" FIRE_TIMEOUT = 30 - """Timeout before the fire status reverts.""" + """Default tTimeout (in seconds) before the fire status reverts.""" + + # Attributes + address = 18 + """The keypad address in use by the device.""" + configbits = 0xFF00 + """The configuration bits set on the device.""" + address_mask = 0x00000000 + """The address mask configured on the device.""" + emulate_zone = [False for _ in range(5)] + """List containing the devices zone emulation status.""" + emulate_relay = [False for _ in range(4)] + """List containing the devices relay emulation status.""" + emulate_lrr = False + """The status of the devices LRR emulation.""" + deduplicate = False + """The status of message deduplication as configured on the device.""" def __init__(self, device): """ Constructor - :param device: The low-level device used for this Alarm Decoder + :param device: The low-level device used for this `Alarm Decoder`_ interface. :type device: Device """ @@ -105,9 +123,9 @@ class AlarmDecoder(object): @property def id(self): """ - The ID of the Alarm Decoder device. + The ID of the `Alarm Decoder`_ device. - :returns: The identification string for the device. + :returns: identification string for the device """ return self._device.id @@ -116,7 +134,7 @@ class AlarmDecoder(object): """ Retrieves the timeout for restoring the battery status, in seconds. - :returns: The battery status timeout + :returns: battery status timeout """ return self._battery_timeout @@ -125,7 +143,7 @@ class AlarmDecoder(object): """ Sets the timeout for restoring the battery status, in seconds. - :param value: The timeout in seconds. + :param value: timeout in seconds :type value: int """ self._battery_timeout = value @@ -135,7 +153,7 @@ class AlarmDecoder(object): """ Retrieves the timeout for restoring the fire status, in seconds. - :returns: The fire status timeout + :returns: fire status timeout """ return self._fire_timeout @@ -144,7 +162,7 @@ class AlarmDecoder(object): """ Sets the timeout for restoring the fire status, in seconds. - :param value: The timeout in seconds. + :param value: timeout in seconds :type value: int """ self._fire_timeout = value @@ -153,10 +171,10 @@ class AlarmDecoder(object): """ Opens the device. - :param baudrate: The baudrate used for the device. + :param baudrate: baudrate used for the device. Defaults to the lower-level device default. :type baudrate: int :param no_reader_thread: Specifies whether or not the automatic reader - thread should be started or not + thread should be started. :type no_reader_thread: bool """ self._wire_events() @@ -176,17 +194,17 @@ class AlarmDecoder(object): def send(self, data): """ - Sends data to the Alarm Decoder device. + Sends data to the `Alarm Decoder`_ device. - :param data: The data to send. - :type data: str + :param data: data to send + :type data: string """ if self._device: self._device.write(data) def get_config(self): """ - Retrieves the configuration from the device. + Retrieves the configuration from the device. Called automatically by :py:meth:`_on_open`. """ self.send("C\r") @@ -227,9 +245,9 @@ class AlarmDecoder(object): """ Faults a zone if we are emulating a zone expander. - :param zone: The zone to fault. + :param zone: zone to fault :type zone: int - :param simulate_wire_problem: Whether or not to simulate a wire fault. + :param simulate_wire_problem: Whether or not to simulate a wire fault :type simulate_wire_problem: bool """ @@ -250,7 +268,7 @@ class AlarmDecoder(object): """ Clears a zone if we are emulating a zone expander. - :param zone: The zone to clear. + :param zone: zone to clear :type zone: int """ self.send("L{0:02}0\r".format(zone)) @@ -270,10 +288,10 @@ class AlarmDecoder(object): """ Parses messages from the panel. - :param data: Panel data to parse. - :type data: str + :param data: panel data to parse + :type data: string - :returns: An object representing the message. + :returns: :py:class:`alarmdecoder.messages.Message` """ if data is None: raise InvalidMessageError() @@ -310,10 +328,10 @@ class AlarmDecoder(object): """ Handle RF messages. - :param data: RF message to parse. - :type data: str + :param data: RF message to parse + :type data: string - :returns: An object representing the RF message. + :returns: :py:class:`alarmdecoder.messages.RFMessage` """ msg = RFMessage(data) @@ -325,10 +343,10 @@ class AlarmDecoder(object): """ Handle Long Range Radio messages. - :param data: LRR message to parse. - :type data: str + :param data: LRR message to parse + :type data: string - :returns: An object representing the LRR message. + :returns: :py:class:`alarmdecoder.messages.LRRMessage` """ msg = LRRMessage(data) @@ -349,8 +367,8 @@ class AlarmDecoder(object): """ Handles received configuration data. - :param data: Configuration string to parse. - :type data: str + :param data: Configuration string to parse + :type data: string """ _, config_string = data.split('>') for setting in config_string.split('&'): @@ -377,8 +395,8 @@ class AlarmDecoder(object): """ Updates internal device states. - :param message: Message to update internal states with. - :type message: Message, ExpanderMessage, LRRMessage, or 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) @@ -397,10 +415,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the AC power state. - :param message: The message to use to update. - :type message: Message + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.Message` - :returns: Boolean indicating the new status + :returns: bool indicating the new status """ if message.ac_power != self._power_status: self._power_status, old_status = message.ac_power, self._power_status @@ -414,10 +432,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the alarm state. - :param message: The message to use to update. - :type message: Message + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.Message` - :returns: Boolean indicating the new status + :returns: bool indicating the new status """ if message.alarm_sounding != self._alarm_status: @@ -432,10 +450,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the zone bypass state. - :param message: The message to use to update. - :type message: Message + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.Message` - :returns: Boolean indicating the new status + :returns: bool indicating the new status """ if message.zone_bypassed != self._bypass_status: @@ -450,10 +468,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the armed state. - :param message: The message to use to update. - :type message: Message + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.Message` - :returns: Boolean indicating the new status + :returns: bool indicating the new status """ message_status = message.armed_away | message.armed_home @@ -472,10 +490,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the battery state. - :param message: The message to use to update. - :type message: Message + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.Message` - :returns: Boolean indicating the new status + :returns: boolean indicating the new status """ last_status, last_update = self._battery_status @@ -492,10 +510,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the fire alarm state. - :param message: The message to use to update. - :type message: Message + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.Message` - :returns: Boolean indicating the new status + :returns: boolean indicating the new status """ last_status, last_update = self._fire_status @@ -512,10 +530,10 @@ class AlarmDecoder(object): """ Uses the provided message to update the expander states. - :param message: The message to use to update. - :type message: ExpanderMessage + :param message: message to use to update + :type message: :py:class:`alarmdecoder.messages.ExpanderMessage` - :returns: Boolean indicating the new status + :returns: boolean indicating the new status """ if message.type == ExpanderMessage.RELAY: @@ -527,10 +545,10 @@ class AlarmDecoder(object): def _update_zone_tracker(self, message): """ - Trigger an update of the zonetracker. + Trigger an update of the :py:class:`alarmdecoder.messages.Zonetracker`. - :param message: The message to update the zonetracker with. - :type message: Message, ExpanderMessage, LRRMessage, or RFMessage + :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` """ # Retrieve a list of faults. diff --git a/alarmdecoder/devices.py b/alarmdecoder/devices.py index 76d5896..50c73e1 100644 --- a/alarmdecoder/devices.py +++ b/alarmdecoder/devices.py @@ -1,5 +1,16 @@ """ -Contains different types of devices belonging to the Alarm Decoder (AD2) family. +This module contains different types of devices belonging to the `Alarm Decoder`_ (AD2) family. + +* :py:class:`USBDevice`: Interfaces with the `AD2USB`_ device. +* :py:class:`SerialDevice`: Interfaces with the `AD2USB`_, `AD2SERIAL`_ or `AD2PI`_. +* :py:class:`SocketDevice`: Interfaces with devices exposed through `ser2sock`_ or another IP to Serial solution. + Also supports SSL if using `ser2sock`_. + +.. _ser2sock: http://github.com/nutechsoftware/ser2sock +.. _Alarm Decoder: http://www.alarmdecoder.com +.. _AD2USB: http://www.alarmdecoder.com +.. _AD2SERIAL: http://www.alarmdecoder.com +.. _AD2PI: http://www.alarmdecoder.com .. moduleauthor:: Scott Petersen """ @@ -20,14 +31,14 @@ from .event import event class Device(object): """ - Generic parent device to all Alarm Decoder (AD2) products. + Base class for all `Alarm Decoder`_ (AD2) device types. """ # Generic device events - on_open = event.Event('Called when the device has been opened') - on_close = event.Event('Called when the device has been closed') - on_read = event.Event('Called when a line has been read from the device') - on_write = event.Event('Called when data has been written to the device') + 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.') def __init__(self): """ @@ -58,7 +69,7 @@ class Device(object): """ Retrieve the device ID. - :returns: The identification string for the device. + :returns: identification string for the device """ return self._id @@ -67,8 +78,8 @@ class Device(object): """ Sets the device ID. - :param value: The device identification. - :type value: str + :param value: device identification string + :type value: string """ self._id = value @@ -76,7 +87,7 @@ class Device(object): """ Indicates whether or not the reader thread is alive. - :returns: Whether or not the reader thread is alive. + :returns: whether or not the reader thread is alive """ return self._read_thread.is_alive() @@ -112,8 +123,8 @@ class Device(object): """ Constructor - :param device: The device used by the reader thread. - :type device: devices.Device + :param device: device used by the reader thread + :type device: :py:class:`alarmdecoder.devices.Device` """ threading.Thread.__init__(self) self._device = device @@ -146,16 +157,16 @@ class Device(object): class USBDevice(Device): """ - AD2USB device exposed with PyFTDI's interface. + `AD2USB`_ device utilizing PyFTDI's interface. """ # Constants FTDI_VENDOR_ID = 0x0403 - """Vendor ID used to recognize AD2USB devices.""" + """Vendor ID used to recognize `AD2USB`_ devices.""" FTDI_PRODUCT_ID = 0x6001 - """Product ID used to recognize AD2USB devices.""" + """Product ID used to recognize `AD2USB`_ devices.""" BAUDRATE = 115200 - """Default baudrate for AD2USB devices.""" + """Default baudrate for `AD2USB`_ devices.""" __devices = [] __detect_thread = None @@ -166,7 +177,7 @@ class USBDevice(Device): Returns all FTDI devices matching our vendor and product IDs. :returns: list of devices - :raises: CommError + :raises: :py:class:`alarmdecoder.util.CommError` """ cls.__devices = [] @@ -181,24 +192,24 @@ class USBDevice(Device): @classmethod def devices(cls): """ - Returns a cached list of AD2USB devices located on the system. + Returns a cached list of `AD2USB`_ devices located on the system. - :returns: cached list of devices found. + :returns: cached list of devices found """ return cls.__devices @classmethod def find(cls, device=None): """ - Factory method that returns the requested USBDevice device, or the + Factory method that returns the requested :py:class:`USBDevice` device, or the first device. :param device: Tuple describing the USB device to open, as returned by find_all(). :type device: tuple - :returns: USBDevice object utilizing the specified device. - :raises: NoDeviceError + :returns: :py:class:`USBDevice` object utilizing the specified device + :raises: :py:class:`alarmdecoder.util.NoDeviceError` """ cls.find_all() @@ -217,9 +228,9 @@ 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 :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 :type on_detached: function """ cls.__detect_thread = USBDevice.DetectThread(on_attached, on_detached) @@ -244,7 +255,7 @@ class USBDevice(Device): """ Retrieves the interface used to connect to the device. - :returns: the interface used to connect to the device. + :returns: the interface used to connect to the device """ return self._interface @@ -253,8 +264,8 @@ class USBDevice(Device): """ Sets the interface used to connect to the device. - :param value: May specify either the serial number or the device index. - :type value: str or int + :param value: may specify either the serial number or the device index + :type value: string or int """ self._interface = value if isinstance(value, int): @@ -267,7 +278,7 @@ class USBDevice(Device): """ Retrieves the serial number of the device. - :returns: The serial number of the device. + :returns: serial number of the device """ return self._serial_number @@ -277,7 +288,7 @@ class USBDevice(Device): """ Sets the serial number of the device. - :param value: The serial number of the device. + :param value: serial number of the device :type value: string """ self._serial_number = value @@ -287,7 +298,7 @@ class USBDevice(Device): """ Retrieves the description of the device. - :returns: The description of the device. + :returns: description of the device """ return self._description @@ -296,7 +307,7 @@ class USBDevice(Device): """ Sets the description of the device. - :param value: The description of the device. + :param value: description of the device :type value: string """ self._description = value @@ -307,7 +318,7 @@ class USBDevice(Device): :param interface: May specify either the serial number or the device index. - :type interface: str or int + :type interface: string or int """ Device.__init__(self) @@ -327,13 +338,13 @@ class USBDevice(Device): """ Opens the device. - :param baudrate: The baudrate to use. + :param baudrate: baudrate to use :type baudrate: int - :param no_reader_thread: Whether or not to automatically start the + :param no_reader_thread: whether or not to automatically start the reader thread. :type no_reader_thread: bool - :raises: NoDeviceError + :raises: :py:class:`alarmdecoder.util.NoDeviceError` """ # Set up defaults if baudrate is None: @@ -384,10 +395,10 @@ class USBDevice(Device): """ Writes data to the device. - :param data: Data to write - :type data: str + :param data: data to write + :type data: string - :raises: CommError + :raises: :py:class:`alarmdecoder.util.CommError` """ try: self._device.write_data(data) @@ -401,8 +412,8 @@ class USBDevice(Device): """ Reads a single character from the device. - :returns: The character read from the device. - :raises: CommError + :returns: character read from the device + :raises: :py:class:`alarmdecoder.util.CommError` """ ret = None @@ -418,14 +429,14 @@ class USBDevice(Device): """ Reads a line from the device. - :param timeout: The read timeout. + :param timeout: read timeout :type timeout: float :param purge_buffer: Indicates whether to purge the buffer prior to reading. :type purge_buffer: bool - :returns: The line that was read. - :raises: CommError, TimeoutError + :returns: line that was read + :raises: :py:class:`alarmdecoder.util.CommError`, :py:class:`alarmdecoder.util.TimeoutError` """ def timeout_event(): @@ -477,7 +488,7 @@ class USBDevice(Device): """ Retrieves the FTDI device serial number. - :returns: string containing the device serial number. + :returns: string containing the device serial number """ return usb.util.get_string(self._device.usb_dev, 64, self._device.usb_dev.iSerialNumber) @@ -485,16 +496,16 @@ class USBDevice(Device): """ Thread that handles detection of added/removed devices. """ - on_attached = event.Event('Called when an AD2USB device has been detected.') - on_detached = event.Event('Called when an AD2USB device has been removed.') + 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.') 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 :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 :type on_detached: function """ threading.Thread.__init__(self) @@ -541,7 +552,7 @@ class USBDevice(Device): class SerialDevice(Device): """ - AD2USB or AD2SERIAL device exposed with the pyserial interface. + `AD2USB`_, `AD2SERIAL`_ or `AD2PI`_ device utilizing the PySerial interface. """ # Constants @@ -553,11 +564,11 @@ class SerialDevice(Device): """ Returns all serial ports present. - :param pattern: Pattern to search for when retrieving serial ports. - :type pattern: str + :param pattern: pattern to search for when retrieving serial ports + :type pattern: string :returns: list of devices - :raises: CommError + :raises: :py:class:`alarmdecoder.util.CommError` """ devices = [] @@ -577,7 +588,7 @@ class SerialDevice(Device): """ Retrieves the interface used to connect to the device. - :returns: the interface used to connect to the device. + :returns: interface used to connect to the device """ return self._port @@ -586,7 +597,7 @@ class SerialDevice(Device): """ Sets the interface used to connect to the device. - :param value: The name of the serial device. + :param value: name of the serial device :type value: string """ self._port = value @@ -595,8 +606,8 @@ class SerialDevice(Device): """ Constructor - :param interface: The device to open. - :type interface: str + :param interface: device to open + :type interface: string """ Device.__init__(self) @@ -609,13 +620,13 @@ class SerialDevice(Device): """ Opens the device. - :param baudrate: The baudrate to use with the device. + :param baudrate: baudrate to use with the device :type baudrate: int - :param no_reader_thread: Whether or not to automatically start the + :param no_reader_thread: whether or not to automatically start the reader thread. :type no_reader_thread: bool - :raises: NoDeviceError + :raises: :py:class:`alarmdecoder.util.NoDeviceError` """ # Set up the defaults if baudrate is None: @@ -662,10 +673,10 @@ class SerialDevice(Device): """ Writes data to the device. - :param data: The data to write. - :type data: str + :param data: data to write + :type data: string - :raises: CommError + :raises: py:class:`alarmdecoder.util.CommError` """ try: self._device.write(data) @@ -683,8 +694,8 @@ class SerialDevice(Device): """ Reads a single character from the device. - :returns: The character read from the device. - :raises: CommError + :returns: character read from the device + :raises: :py:class:`alarmdecoder.util.CommError` """ ret = None @@ -700,14 +711,14 @@ class SerialDevice(Device): """ Reads a line from the device. - :param timeout: The read timeout. + :param timeout: read timeout :type timeout: float :param purge_buffer: Indicates whether to purge the buffer prior to reading. :type purge_buffer: bool - :returns: The line that was read. - :raises: CommError, TimeoutError + :returns: line that was read + :raises: :py:class:`alarmdecoder.util.CommError`, :py:class:`alarmdecoder.util.TimeoutError` """ def timeout_event(): @@ -759,8 +770,8 @@ class SerialDevice(Device): class SocketDevice(Device): """ - Device that supports communication with an Alarm Decoder (AD2) that is - exposed via ser2sock or another Serial to IP interface. + Device that supports communication with an `Alarm Decoder`_ (AD2) that is + exposed via `ser2sock`_ or another Serial to IP interface. """ @property @@ -768,7 +779,7 @@ class SocketDevice(Device): """ Retrieves the interface used to connect to the device. - :returns: the interface used to connect to the device. + :returns: interface used to connect to the device """ return (self._host, self._port) @@ -777,7 +788,7 @@ class SocketDevice(Device): """ Sets the interface used to connect to the device. - :param value: Tuple containing the host and port to use. + :param value: Tuple containing the host and port to use :type value: tuple """ self._host, self._port = value @@ -787,7 +798,7 @@ class SocketDevice(Device): """ Retrieves whether or not the device is using SSL. - :returns: Whether or not the device is using SSL. + :returns: whether or not the device is using SSL """ return self._use_ssl @@ -796,7 +807,7 @@ class SocketDevice(Device): """ Sets whether or not SSL communication is in use. - :param value: Whether or not SSL communication is in use. + :param value: Whether or not SSL communication is in use :type value: bool """ self._use_ssl = value @@ -806,7 +817,7 @@ class SocketDevice(Device): """ Retrieves the SSL client certificate path used for authentication. - :returns: The certificate path + :returns: path to the certificate path or :py:class:`OpenSSL.crypto.X509` """ return self._ssl_certificate @@ -815,8 +826,8 @@ class SocketDevice(Device): """ Sets the SSL client certificate to use for authentication. - :param value: The path to the SSL certificate. - :type value: str + :param value: path to the SSL certificate or :py:class:`OpenSSL.crypto.X509` + :type value: string or :py:class:`OpenSSL.crypto.X509` """ self._ssl_certificate = value @@ -825,7 +836,7 @@ class SocketDevice(Device): """ Retrieves the SSL client certificate key used for authentication. - :returns: The key path + :returns: jpath to the SSL key or :py:class:`OpenSSL.crypto.PKey` """ return self._ssl_key @@ -834,8 +845,8 @@ class SocketDevice(Device): """ Sets the SSL client certificate key to use for authentication. - :param value: The path to the SSL key. - :type value: str + :param value: path to the SSL key or :py:class:`OpenSSL.crypto.PKey` + :type value: string or :py:class:`OpenSSL.crypto.PKey` """ self._ssl_key = value @@ -845,7 +856,7 @@ class SocketDevice(Device): Retrieves the SSL Certificate Authority certificate used for authentication. - :returns: The CA path + :returns: path to the CA certificate or :py:class:`OpenSSL.crypto.X509` """ return self._ssl_ca @@ -854,8 +865,8 @@ class SocketDevice(Device): """ Sets the SSL Certificate Authority certificate used for authentication. - :param value: The path to the SSL CA certificate. - :type value: str + :param value: path to the SSL CA certificate or :py:class:`OpenSSL.crypto.X509` + :type value: string or :py:class:`OpenSSL.crypto.X509` """ self._ssl_ca = value @@ -863,7 +874,7 @@ class SocketDevice(Device): """ Constructor - :param interface: Tuple containing the hostname and port of our target. + :param interface: Tuple containing the hostname and port of our target :type interface: tuple """ Device.__init__(self) @@ -878,13 +889,13 @@ class SocketDevice(Device): """ Opens the device. - :param baudrate: The baudrate to use + :param baudrate: baudrate to use :type baudrate: int - :param no_reader_thread: Whether or not to automatically open the reader + :param no_reader_thread: whether or not to automatically open the reader thread. :type no_reader_thread: bool - :raises: NoDeviceError, CommError + :raises: :py:class:`alarmdecoder.util.NoDeviceError`, :py:class:`alarmdecoder.util.CommError` """ try: @@ -934,11 +945,11 @@ class SocketDevice(Device): """ Writes data to the device. - :param data: The data to write. - :type data: str + :param data: data to write + :type data: string - :returns: The number of bytes sent. - :raises: CommError + :returns: number of bytes sent + :raises: :py:class:`alarmdecoder.util.CommError` """ data_sent = None @@ -959,8 +970,8 @@ class SocketDevice(Device): """ Reads a single character from the device. - :returns: The character read from the device. - :raises: CommError + :returns: character read from the device + :raises: :py:class:`alarmdecoder.util.CommError` """ data = None @@ -976,14 +987,14 @@ class SocketDevice(Device): """ Reads a line from the device. - :param timeout: The read timeout. + :param timeout: read timeout :type timeout: float :param purge_buffer: Indicates whether to purge the buffer prior to reading. :type purge_buffer: bool - :returns: The line that was read.: - :raises: CommError, TimeoutError + :returns: line that was read + :raises: :py:class:`alarmdecoder.util.CommError`, :py:class:`alarmdecoder.util.TimeoutError` """ def timeout_event(): @@ -1034,6 +1045,8 @@ class SocketDevice(Device): def _init_ssl(self): """ Initializes our device as an SSL connection. + + :raises: :py:class:`alarmdecoder.util.CommError` """ try: diff --git a/alarmdecoder/messages.py b/alarmdecoder/messages.py index bac1c30..5a349c5 100644 --- a/alarmdecoder/messages.py +++ b/alarmdecoder/messages.py @@ -1,7 +1,14 @@ """ -Message representations received from the panel through the Alarm Decoder (AD2) +Message representations received from the panel through the `Alarm Decoder`_ (AD2) devices. +* :py:class:`Message`: The standard and most common message received from a panel. +* :py:class:`ExpanderMessage`: Messages received from Relay or Zone expander modules. +* :py:class:`RFMessage`: Message received from an RF receiver module. +* :py:class:`LRRMessage`: Message received from a long-range radio module. + +.. _Alarm Decoder: http://www.alarmdecoder.com + .. moduleauthor:: Scott Petersen """ @@ -37,56 +44,56 @@ class Message(BaseMessage): """ ready = False - """Indicates whether or not the panel is in a ready state""" + """Indicates whether or not the panel is in a ready state.""" armed_away = False - """Indicates whether or not the panel is armed away""" + """Indicates whether or not the panel is armed away.""" armed_home = False - """Indicates whether or not the panel is armed home""" + """Indicates whether or not the panel is armed home.""" backlight_on = False - """Indicates whether or not the keypad backlight is on""" + """Indicates whether or not the keypad backlight is on.""" programming_mode = False - """Indicates whether or not we're in programming mode""" + """Indicates whether or not we're in programming mode.""" beeps = -1 - """Number of beeps associated with a message""" + """Number of beeps associated with a message.""" zone_bypassed = False - """Indicates whether or not a zone is bypassed""" + """Indicates whether or not a zone is bypassed.""" ac_power = False - """Indicates whether or not the panel is on AC power""" + """Indicates whether or not the panel is on AC power.""" chime_on = False - """Indicates whether or not the chime is enabled""" + """Indicates whether or not the chime is enabled.""" alarm_event_occurred = False - """Indicates whether or not an alarm event has occurred""" + """Indicates whether or not an alarm event has occurred.""" alarm_sounding = False - """Indicates whether or not an alarm is sounding""" + """Indicates whether or not an alarm is sounding.""" battery_low = False - """Indicates whether or not there is a low battery""" + """Indicates whether or not there is a low battery.""" entry_delay_off = False - """Indicates whether or not the entry delay is enabled""" + """Indicates whether or not the entry delay is enabled.""" fire_alarm = False - """Indicates whether or not a fire alarm is sounding""" + """Indicates whether or not a fire alarm is sounding.""" check_zone = False """Indicates whether or not there are zones that require attention.""" perimeter_only = False - """Indicates whether or not the perimeter is armed""" + """Indicates whether or not the perimeter is armed.""" numeric_code = None - """The numeric code associated with the message""" + """The numeric code associated with the message.""" text = None - """The human-readable text to be displayed on the panel LCD""" + """The human-readable text to be displayed on the panel LCD.""" cursor_location = -1 - """Current cursor location on the keypad""" + """Current cursor location on the keypad.""" mask = None - """Address mask this message is intended for""" + """Address mask this message is intended for.""" bitfield = None - """The bitfield associated with this message""" + """The bitfield associated with this message.""" panel_data = None - """The panel data field associated with this message""" + """The panel data field associated with this message.""" def __init__(self, data=None): """ Constructor - :param data: Message data to parse. - :type data: str + :param data: message data to parse + :type data: string """ BaseMessage.__init__(self) @@ -105,10 +112,10 @@ class Message(BaseMessage): """ Parse the message from the device. - :param data: The message data. - :type data: str + :param data: message data + :type data: string - :raises: InvalidMessageError + :raises: :py:class:`alarmdecoder.util.InvalidMessageError` """ match = self._regex.match(data) @@ -168,8 +175,8 @@ class ExpanderMessage(BaseMessage): """ Constructor - :param data: The message data to parse. - :type data: str + :param data: message data to parse + :type data: string """ BaseMessage.__init__(self) @@ -186,8 +193,10 @@ class ExpanderMessage(BaseMessage): """ Parse the raw message from the device. - :param data: The message data - :type data: str + :param data: message data + :type data: string + + :raises: :py:class:`alarmdecoder.util.InvalidMessageError` """ try: header, values = data.split(':') @@ -215,22 +224,22 @@ class RFMessage(BaseMessage): """ serial_number = None - """Serial number of the RF device""" + """Serial number of the RF device.""" value = -1 - """Value associated with this message""" + """Value associated with this message.""" battery = False - """Battery low indication""" + """Low battery indication""" supervision = False """Supervision required indication""" - loop = [False for x in range(4)] + loop = [False for _ in range(4)] """Loop indicators""" def __init__(self, data=None): """ Constructor - :param data: The message data to parse - :type data: str + :param data: message data to parse + :type data: string """ BaseMessage.__init__(self) @@ -247,8 +256,10 @@ class RFMessage(BaseMessage): """ Parses the raw message from the device. - :param data: The message data. - :type data: str + :param data: message data + :type data: string + + :raises: :py:class:`alarmdecoder.util.InvalidMessageError` """ try: self.raw = data @@ -280,16 +291,16 @@ class LRRMessage(BaseMessage): event_data = None """Data associated with the LRR message. Usually user ID or zone.""" partition = -1 - """The partition that this message applies to""" + """The partition that this message applies to.""" event_type = None - """The type of the event that occurred""" + """The type of the event that occurred.""" def __init__(self, data=None): """ Constructor - :param data: The message data to parse. - :type data: str + :param data: message data to parse + :type data: string """ BaseMessage.__init__(self) @@ -306,8 +317,10 @@ class LRRMessage(BaseMessage): """ Parses the raw message from the device. - :param data: The message data. - :type data: str + :param data: message data to parse + :type data: string + + :raises: :py:class:`alarmdecoder.util.InvalidMessageError` """ try: self.raw = data diff --git a/alarmdecoder/util.py b/alarmdecoder/util.py index 4a48e70..d7cf2ea 100644 --- a/alarmdecoder/util.py +++ b/alarmdecoder/util.py @@ -1,5 +1,7 @@ """ -Provides utility classes for the Alarm Decoder (AD2) devices. +Provides utility classes for the `Alarm Decoder`_ (AD2) devices. + +.. _Alarm Decoder: http://www.alarmdecoder.com .. moduleauthor:: Scott Petersen """ @@ -53,14 +55,14 @@ class Firmware(object): @staticmethod def upload(dev, filename, progress_callback=None): """ - Uploads firmware to an Alarm Decoder device. + Uploads firmware to an `Alarm Decoder`_ device. - :param filename: The firmware filename - :type filename: str - :param progress_callback: Callback function used to report progress. + :param filename: firmware filename + :type filename: string + :param progress_callback: callback function used to report progress :type progress_callback: function - :raises: NoDeviceError, 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 c9bfbc0..3bf6f8b 100644 --- a/alarmdecoder/zonetracking.py +++ b/alarmdecoder/zonetracking.py @@ -1,5 +1,7 @@ """ -Provides zone tracking functionality for the Alarm Decoder (AD2) device family. +Provides zone tracking functionality for the `Alarm Decoder`_ (AD2) device family. + +.. _Alarm Decoder: http://www.alarmdecoder.com .. moduleauthor:: Scott Petersen """ @@ -16,6 +18,7 @@ class Zone(object): Representation of a panel zone. """ + # Constants CLEAR = 0 """Status indicating that the zone is cleared.""" FAULT = 1 @@ -25,15 +28,25 @@ class Zone(object): STATUS = {CLEAR: 'CLEAR', FAULT: 'FAULT', CHECK: 'CHECK'} + # Attributes + zone = 0 + """Zone ID""" + name = '' + """Zone name""" + status = CLEAR + """Zone status""" + timestamp = None + """Timestamp of last update""" + def __init__(self, zone=0, name='', status=CLEAR): """ Constructor - :param zone: The zone number. + :param zone: zone number :type zone: int - :param name: Human readable zone name. - :type name: str - :param status: Initial zone state. + :param name: Human readable zone name + :type name: string + :param status: Initial zone state :type status: int """ self.zone = zone @@ -56,15 +69,53 @@ class Zone(object): class Zonetracker(object): """ - Handles tracking of zone and their statuses. + Handles tracking of zones and their statuses. """ - on_fault = event.Event('Called when the device detects a zone fault.') - on_restore = event.Event('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.') + on_restore = event.Event('This event is called when the device detects that a fault is restored.') EXPIRE = 30 """Zone expiration timeout.""" + @property + def zones(self): + """ + Returns the current list of zones being tracked. + + :returns: dictionary of :py:class:`Zone` being tracked + """ + return self._zones + + @zones.setter + def zones(self, value): + """ + Sets the current list of zones being tracked. + + :param value: new list of zones being tracked + :type value: dictionary of :py:class:`Zone` being tracked + """ + self._zones = value + + @property + def faulted(self): + """ + Retrieves the current list of faulted zones. + + :returns: list of faulted zones + """ + return self._zones_faulted + + @faulted.setter + def faulted(self, value): + """ + Sets the current list of faulted zones. + + :param value: new list of faulted zones + :type value: list of integers + """ + self._zones_faulted = value + def __init__(self): """ Constructor @@ -77,8 +128,8 @@ class Zonetracker(object): """ Update zone statuses based on the current message. - :param message: Message to use to update the zone tracking. - :type message: Message or ExpanderMessage + :param message: message to use to update the zone tracking + :type message: :py:class:`alarmdecoder.messages.Message` or :py:class:`alarmdecoder.messages.ExpanderMessage` """ if isinstance(message, ExpanderMessage): if message.type == ExpanderMessage.ZONE: @@ -159,12 +210,12 @@ class Zonetracker(object): """ Convert an address and channel into a zone number. - :param address: The expander address + :param address: expander address :type address: int - :param channel: The channel + :param channel: channel :type channel: int - :returns: The zone number associated with an address and channel. + :returns: zone number associated with an address and channel """ # TODO: This is going to need to be reworked to support the larger @@ -178,7 +229,7 @@ class Zonetracker(object): """ Clear all expired zones from our status list. - :param zone: current zone being processed. + :param zone: current zone being processed :type zone: int """ cleared_zones = [] @@ -251,11 +302,11 @@ class Zonetracker(object): """ Adds a zone to the internal zone list. - :param zone: The zone number. + :param zone: zone number :type zone: int - :param name: Human readable zone name. - :type name: str - :param status: The zone status. + :param name: human readable zone name + :type name: string + :param status: zone status :type status: int """ if not zone in self._zones: @@ -268,9 +319,9 @@ class Zonetracker(object): """ Updates a zones status. - :param zone: The zone number. + :param zone: zone number :type zone: int - :param status: The zone status. + :param status: zone status :type status: int :raises: IndexError @@ -293,9 +344,9 @@ class Zonetracker(object): """ Determine if a zone is expired or not. - :param zone: The zone number. + :param zone: zone number :type zone: int - :returns: Whether or not the zone is expired. + :returns: whether or not the zone is expired """ return time.time() > self._zones[zone].timestamp + Zonetracker.EXPIRE diff --git a/docs/alarmdecoder.rst b/docs/alarmdecoder.rst index 36fe308..f243a7e 100644 --- a/docs/alarmdecoder.rst +++ b/docs/alarmdecoder.rst @@ -1,10 +1,10 @@ alarmdecoder Package -================ +==================== :mod:`alarmdecoder` Module --------------------- +-------------------------- -.. automodule:: alarmdecoder.alarmdecoder +.. automodule:: alarmdecoder.decoder :members: :undoc-members: :show-inheritance: @@ -17,10 +17,10 @@ alarmdecoder Package :undoc-members: :show-inheritance: -:mod:`util` Module ------------------- +:mod:`messages` Module +---------------------- -.. automodule:: alarmdecoder.util +.. automodule:: alarmdecoder.messages :members: :undoc-members: :show-inheritance: @@ -33,26 +33,27 @@ alarmdecoder Package :undoc-members: :show-inheritance: -:mod:`panels` Module --------------------- +:mod:`util` Module +------------------ -.. automodule:: alarmdecoder.panels +.. automodule:: alarmdecoder.util :members: :undoc-members: :show-inheritance: -:mod:`messages` Module ----------------------- +:mod:`panels` Module +-------------------- -.. automodule:: alarmdecoder.messages +.. automodule:: alarmdecoder.panels :members: :undoc-members: :show-inheritance: -Subpackages ------------ +.. + Subpackages + ----------- -.. toctree:: + .. toctree:: - alarmdecoder.event + alarmdecoder.event diff --git a/docs/build/doctrees/alarmdecoder.doctree b/docs/build/doctrees/alarmdecoder.doctree index 74acdcf2d7b0424e6cc7c130254c3f2ab29992a5..337e269ec18dc08da12db86d9a1eab58175cd655 100644 GIT binary patch literal 358543 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

l&vI8>eq0w~Up-Al_^DzAO)ZsX4uR-A> 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

q?~#bqA0z8AV}O}GK_bXs6Vm7 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 O>mZW1<+!(uFaLif`u89J literal 250563 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 diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 3a0b59a85b42d38911ac732524ba78e41fc8e96e..6e0c43c8ab92020229a2444a468018a74c29e7e2 100644 GIT binary patch literal 115944 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 diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index 50092324eaddd607f41c488677fa37197e345922..044d18280130e37895129c49708471c1d76fed99 100644 GIT binary patch literal 9171 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 literal 6141 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 diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo index a32ac9b..4722afe 100644 --- a/docs/build/html/.buildinfo +++ b/docs/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 7e4354096f7282bd97dc9d3ef3f60c52 +config: d1da78485e879674427d47d917d46635 tags: a205e9ed8462ae86fdd2f73488852ba9 diff --git a/docs/build/html/_modules/alarmdecoder/decoder.html b/docs/build/html/_modules/alarmdecoder/decoder.html new file mode 100644 index 0000000..619cd87 --- /dev/null +++ b/docs/build/html/_modules/alarmdecoder/decoder.html @@ -0,0 +1,677 @@ + + + + + + + + alarmdecoder.decoder — alarmdecoder documentation + + + + + + + + + + + + +

+ +
+
+
+
+ +

Source code for alarmdecoder.decoder

+"""
+Provides the full AlarmDecoder class.
+
+.. moduleauthor:: Scott Petersen <scott@nutech.com>
+"""
+
+import time
+
+from .event import event
+from .util import InvalidMessageError
+from .messages import Message, ExpanderMessage, RFMessage, LRRMessage
+from .zonetracking import Zonetracker
+
+
+
[docs]class AlarmDecoder(object): + """ + High-level wrapper around Alarm Decoder (AD2) devices. + """ + + # High-level Events + on_arm = event.Event('Called when the panel is armed.') + on_disarm = event.Event('Called when the panel is disarmed.') + on_power_changed = event.Event('Called when panel power switches between AC and DC.') + on_alarm = event.Event('Called when the alarm is triggered.') + on_fire = event.Event('Called when a fire is detected.') + on_bypass = event.Event('Called when a zone is bypassed.') + on_boot = event.Event('Called when the device finishes bootings.') + on_config_received = event.Event('Called when the device receives its configuration.') + on_zone_fault = event.Event('Called when the device detects a zone fault.') + on_zone_restore = event.Event('Called when the device detects that a fault is restored.') + on_low_battery = event.Event('Called when the device detects a low battery.') + on_panic = event.Event('Called when the device detects a panic.') + on_relay_changed = event.Event('Called when a relay is opened or closed on an expander board.') + + # Mid-level Events + on_message = event.Event('Called when a message has been received from the device.') + on_lrr_message = event.Event('Called when an LRR message is received.') + on_rfx_message = event.Event('Called when an RFX message is received.') + + # Low-level Events + on_open = event.Event('Called when the device has been opened.') + on_close = event.Event('Called when the device has been closed.') + on_read = event.Event('Called when a line has been read from the device.') + on_write = event.Event('Called when data has been written to the device.') + + # Constants + KEY_F1 = unichr(1) + unichr(1) + unichr(1) + """Represents panel function key #1""" + KEY_F2 = unichr(2) + unichr(2) + unichr(2) + """Represents panel function key #2""" + KEY_F3 = unichr(3) + unichr(3) + unichr(3) + """Represents panel function key #3""" + KEY_F4 = unichr(4) + unichr(4) + unichr(4) + """Represents panel function key #4""" + + BATTERY_TIMEOUT = 30 + """Timeout before the battery status reverts.""" + FIRE_TIMEOUT = 30 + """Timeout before the fire status reverts.""" + + def __init__(self, device): + """ + Constructor + + :param device: The low-level device used for this Alarm Decoder + interface. + :type device: Device + """ + self._device = device + self._zonetracker = Zonetracker() + + self._battery_timeout = AlarmDecoder.BATTERY_TIMEOUT + self._fire_timeout = AlarmDecoder.FIRE_TIMEOUT + self._power_status = None + self._alarm_status = None + self._bypass_status = None + self._armed_status = None + self._fire_status = (False, 0) + self._battery_status = (False, 0) + self._panic_status = None + self._relay_status = {} + + self.address = 18 + self.configbits = 0xFF00 + self.address_mask = 0x00000000 + self.emulate_zone = [False for x in range(5)] + self.emulate_relay = [False for x in range(4)] + self.emulate_lrr = False + self.deduplicate = False + + def __enter__(self): + """ + Support for context manager __enter__. + """ + return self + + def __exit__(self, exc_type, exc_value, traceback): + """ + Support for context manager __exit__. + """ + self.close() + + return False + + @property +
[docs] def id(self): + """ + The ID of the Alarm Decoder device. + + :returns: The identification string for the device. + """ + return self._device.id +
+ @property + def battery_timeout(self): + """ + Retrieves the timeout for restoring the battery status, in seconds. + + :returns: The battery status timeout + """ + return self._battery_timeout + + @battery_timeout.setter +
[docs] def battery_timeout(self, value): + """ + Sets the timeout for restoring the battery status, in seconds. + + :param value: The timeout in seconds. + :type value: int + """ + self._battery_timeout = value +
+ @property + def fire_timeout(self): + """ + Retrieves the timeout for restoring the fire status, in seconds. + + :returns: The fire status timeout + """ + return self._fire_timeout + + @fire_timeout.setter +
[docs] def fire_timeout(self, value): + """ + Sets the timeout for restoring the fire status, in seconds. + + :param value: The timeout in seconds. + :type value: int + """ + self._fire_timeout = value +
+
[docs] def open(self, baudrate=None, no_reader_thread=False): + """ + Opens the device. + + :param baudrate: The baudrate used for the device. + :type baudrate: int + :param no_reader_thread: Specifies whether or not the automatic reader + thread should be started or not + :type no_reader_thread: bool + """ + self._wire_events() + self._device.open(baudrate=baudrate, no_reader_thread=no_reader_thread) + + return self +
+
[docs] def close(self): + """ + Closes the device. + """ + if self._device: + self._device.close() + + del self._device + self._device = None +
+
[docs] def send(self, data): + """ + Sends data to the Alarm Decoder device. + + :param data: The data to send. + :type data: str + """ + if self._device: + self._device.write(data) +
+
[docs] def get_config(self): + """ + Retrieves the configuration from the device. + """ + self.send("C\r") +
+
[docs] def save_config(self): + """ + Sets configuration entries on the device. + """ + config_string = '' + config_entries = [] + + # HACK: This is ugly.. but I can't think of an elegant way of doing it. + config_entries.append(('ADDRESS', + '{0}'.format(self.address))) + config_entries.append(('CONFIGBITS', + '{0:x}'.format(self.configbits))) + config_entries.append(('MASK', + '{0:x}'.format(self.address_mask))) + config_entries.append(('EXP', + ''.join(['Y' if z else 'N' for z in self.emulate_zone]))) + config_entries.append(('REL', + ''.join(['Y' if r else 'N' for r in self.emulate_relay]))) + config_entries.append(('LRR', + 'Y' if self.emulate_lrr else 'N')) + config_entries.append(('DEDUPLICATE', + 'Y' if self.deduplicate else 'N')) + + config_string = '&'.join(['='.join(t) for t in config_entries]) + + self.send("C{0}\r".format(config_string)) +
+
[docs] def reboot(self): + """ + Reboots the device. + """ + self.send('=') +
+
[docs] def fault_zone(self, zone, simulate_wire_problem=False): + """ + Faults a zone if we are emulating a zone expander. + + :param zone: The zone to fault. + :type zone: int + :param simulate_wire_problem: Whether or not to simulate a wire fault. + :type simulate_wire_problem: bool + """ + + # Allow ourselves to also be passed an address/channel combination + # for zone expanders. + # + # Format (expander index, channel) + if isinstance(zone, tuple): + expander_idx, channel = zone + + zone = self._zonetracker.expander_to_zone(expander_idx, channel) + + status = 2 if simulate_wire_problem else 1 + + self.send("L{0:02}{1}\r".format(zone, status)) +
+
[docs] def clear_zone(self, zone): + """ + Clears a zone if we are emulating a zone expander. + + :param zone: The zone to clear. + :type zone: int + """ + self.send("L{0:02}0\r".format(zone)) +
+ def _wire_events(self): + """ + Wires up the internal device events. + """ + self._device.on_open += self._on_open + self._device.on_close += self._on_close + self._device.on_read += self._on_read + self._device.on_write += self._on_write + self._zonetracker.on_fault += self._on_zone_fault + self._zonetracker.on_restore += self._on_zone_restore + + def _handle_message(self, data): + """ + Parses messages from the panel. + + :param data: Panel data to parse. + :type data: str + + :returns: An object representing the message. + """ + if data is None: + raise InvalidMessageError() + + msg = None + header = data[0:4] + + if header[0] != '!' or header == '!KPE': + msg = Message(data) + + if self.address_mask & msg.mask > 0: + self._update_internal_states(msg) + + elif header == '!EXP' or header == '!REL': + msg = ExpanderMessage(data) + + self._update_internal_states(msg) + + elif header == '!RFX': + msg = self._handle_rfx(data) + + elif header == '!LRR': + msg = self._handle_lrr(data) + + elif data.startswith('!Ready'): + self.on_boot() + + elif data.startswith('!CONFIG'): + self._handle_config(data) + + return msg + + def _handle_rfx(self, data): + """ + Handle RF messages. + + :param data: RF message to parse. + :type data: str + + :returns: An object representing the RF message. + """ + msg = RFMessage(data) + + self.on_rfx_message(message=msg) + + return msg + + def _handle_lrr(self, data): + """ + Handle Long Range Radio messages. + + :param data: LRR message to parse. + :type data: str + + :returns: An object representing the LRR message. + """ + msg = LRRMessage(data) + + if msg.event_type == 'ALARM_PANIC': + self._panic_status = True + self.on_panic(status=True) + + elif msg.event_type == 'CANCEL': + if self._panic_status is True: + self._panic_status = False + self.on_panic(status=False) + + self.on_lrr_message(message=msg) + + return msg + + def _handle_config(self, data): + """ + Handles received configuration data. + + :param data: Configuration string to parse. + :type data: str + """ + _, config_string = data.split('>') + for setting in config_string.split('&'): + key, val = setting.split('=') + + if key == 'ADDRESS': + self.address = int(val) + elif key == 'CONFIGBITS': + self.configbits = int(val, 16) + elif key == 'MASK': + self.address_mask = int(val, 16) + elif key == 'EXP': + self.emulate_zone = [val[z] == 'Y' for z in range(5)] + elif key == 'REL': + self.emulate_relay = [val[r] == 'Y' for r in range(4)] + elif key == 'LRR': + self.emulate_lrr = (val == 'Y') + elif key == 'DEDUPLICATE': + self.deduplicate = (val == 'Y') + + self.on_config_received() + + def _update_internal_states(self, message): + """ + Updates internal device states. + + :param message: Message to update internal states with. + :type message: Message, ExpanderMessage, LRRMessage, or RFMessage + """ + if isinstance(message, Message): + self._update_power_status(message) + self._update_alarm_status(message) + self._update_zone_bypass_status(message) + self._update_armed_status(message) + self._update_battery_status(message) + self._update_fire_status(message) + + elif isinstance(message, ExpanderMessage): + self._update_expander_status(message) + + self._update_zone_tracker(message) + + def _update_power_status(self, message): + """ + Uses the provided message to update the AC power state. + + :param message: The message to use to update. + :type message: Message + + :returns: Boolean indicating the new status + """ + if message.ac_power != self._power_status: + self._power_status, old_status = message.ac_power, self._power_status + + if old_status is not None: + self.on_power_changed(status=self._power_status) + + return self._power_status + + def _update_alarm_status(self, message): + """ + Uses the provided message to update the alarm state. + + :param message: The message to use to update. + :type message: Message + + :returns: Boolean indicating the new status + """ + + if message.alarm_sounding != self._alarm_status: + self._alarm_status, old_status = message.alarm_sounding, self._alarm_status + + if old_status is not None: + self.on_alarm(status=self._alarm_status) + + return self._alarm_status + + def _update_zone_bypass_status(self, message): + """ + Uses the provided message to update the zone bypass state. + + :param message: The message to use to update. + :type message: Message + + :returns: Boolean indicating the new status + """ + + if message.zone_bypassed != self._bypass_status: + self._bypass_status, old_status = message.zone_bypassed, self._bypass_status + + if old_status is not None: + self.on_bypass(status=self._bypass_status) + + return self._bypass_status + + def _update_armed_status(self, message): + """ + Uses the provided message to update the armed state. + + :param message: The message to use to update. + :type message: Message + + :returns: Boolean indicating the new status + """ + + message_status = message.armed_away | message.armed_home + if message_status != self._armed_status: + self._armed_status, old_status = message_status, self._armed_status + + if old_status is not None: + if self._armed_status: + self.on_arm() + else: + self.on_disarm() + + return self._armed_status + + def _update_battery_status(self, message): + """ + Uses the provided message to update the battery state. + + :param message: The message to use to update. + :type message: Message + + :returns: Boolean indicating the new status + """ + + last_status, last_update = self._battery_status + if message.battery_low == last_status: + self._battery_status = (last_status, time.time()) + else: + if message.battery_low is True or time.time() > last_update + self._battery_timeout: + self._battery_status = (message.battery_low, time.time()) + self.on_low_battery(status=message.battery_low) + + return self._battery_status[0] + + def _update_fire_status(self, message): + """ + Uses the provided message to update the fire alarm state. + + :param message: The message to use to update. + :type message: Message + + :returns: Boolean indicating the new status + """ + + last_status, last_update = self._fire_status + if message.fire_alarm == last_status: + self._fire_status = (last_status, time.time()) + else: + if message.fire_alarm is True or time.time() > last_update + self._fire_timeout: + self._fire_status = (message.fire_alarm, time.time()) + self.on_fire(status=message.fire_alarm) + + return self._fire_status[0] + + def _update_expander_status(self, message): + """ + Uses the provided message to update the expander states. + + :param message: The message to use to update. + :type message: ExpanderMessage + + :returns: Boolean indicating the new status + """ + + if message.type == ExpanderMessage.RELAY: + self._relay_status[(message.address, message.channel)] = message.value + + self.on_relay_changed(message=message) + + return self._relay_status[(message.address, message.channel)] + + def _update_zone_tracker(self, message): + """ + Trigger an update of the zonetracker. + + :param message: The message to update the zonetracker with. + :type message: Message, ExpanderMessage, LRRMessage, or RFMessage + """ + + # Retrieve a list of faults. + # NOTE: This only happens on first boot or after exiting programming mode. + if isinstance(message, Message): + if not message.ready and "Hit * for faults" in message.text: + self.send('*') + return + + self._zonetracker.update(message) + + def _on_open(self, sender, *args, **kwargs): + """ + Internal handler for opening the device. + """ + self.get_config() + + self.on_open(args, kwargs) + + def _on_close(self, sender, *args, **kwargs): + """ + Internal handler for closing the device. + """ + self.on_close(args, kwargs) + + def _on_read(self, sender, *args, **kwargs): + """ + Internal handler for reading from the device. + """ + self.on_read(args, kwargs) + + msg = self._handle_message(kwargs.get('data', None)) + if msg: + self.on_message(message=msg) + + def _on_write(self, sender, *args, **kwargs): + """ + Internal handler for writing to the device. + """ + self.on_write(args, kwargs) + + def _on_zone_fault(self, sender, *args, **kwargs): + """ + Internal handler for zone faults. + """ + self.on_zone_fault(*args, **kwargs) + + def _on_zone_restore(self, sender, *args, **kwargs): + """ + Internal handler for zone restoration. + """ + self.on_zone_restore(*args, **kwargs)
+
+ +
+
+
+
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/index.html b/docs/build/html/_modules/index.html index 040c13c..c29ff73 100644 --- a/docs/build/html/_modules/index.html +++ b/docs/build/html/_modules/index.html @@ -45,7 +45,8 @@

All modules for which code is available

-
  • alarmdecoder.devices
  • +
    • alarmdecoder.decoder
    • +
    • alarmdecoder.devices
    • alarmdecoder.event.event
    • alarmdecoder.messages
    • alarmdecoder.util
    • diff --git a/docs/build/html/_sources/alarmdecoder.txt b/docs/build/html/_sources/alarmdecoder.txt index 36fe308..f243a7e 100644 --- a/docs/build/html/_sources/alarmdecoder.txt +++ b/docs/build/html/_sources/alarmdecoder.txt @@ -1,10 +1,10 @@ alarmdecoder Package -================ +==================== :mod:`alarmdecoder` Module --------------------- +-------------------------- -.. automodule:: alarmdecoder.alarmdecoder +.. automodule:: alarmdecoder.decoder :members: :undoc-members: :show-inheritance: @@ -17,10 +17,10 @@ alarmdecoder Package :undoc-members: :show-inheritance: -:mod:`util` Module ------------------- +:mod:`messages` Module +---------------------- -.. automodule:: alarmdecoder.util +.. automodule:: alarmdecoder.messages :members: :undoc-members: :show-inheritance: @@ -33,26 +33,27 @@ alarmdecoder Package :undoc-members: :show-inheritance: -:mod:`panels` Module --------------------- +:mod:`util` Module +------------------ -.. automodule:: alarmdecoder.panels +.. automodule:: alarmdecoder.util :members: :undoc-members: :show-inheritance: -:mod:`messages` Module ----------------------- +:mod:`panels` Module +-------------------- -.. automodule:: alarmdecoder.messages +.. automodule:: alarmdecoder.panels :members: :undoc-members: :show-inheritance: -Subpackages ------------ +.. + Subpackages + ----------- -.. toctree:: + .. toctree:: - alarmdecoder.event + alarmdecoder.event diff --git a/docs/build/html/_sources/index.txt b/docs/build/html/_sources/index.txt index 41929e0..1cc583f 100644 --- a/docs/build/html/_sources/index.txt +++ b/docs/build/html/_sources/index.txt @@ -4,9 +4,18 @@ contain the root `toctree` directive. Welcome to alarmdecoder's documentation! -==================================== +======================================== -Contents: +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 + +Table of Contents: .. toctree:: :maxdepth: 4 diff --git a/docs/build/html/alarmdecoder.html b/docs/build/html/alarmdecoder.html index 2ac6071..5cc160a 100644 --- a/docs/build/html/alarmdecoder.html +++ b/docs/build/html/alarmdecoder.html @@ -24,7 +24,6 @@ - @@ -37,9 +36,6 @@
    • modules |
    • -
    • - next |
    • previous |
    • @@ -54,39 +50,382 @@

      alarmdecoder Package

      -
      -

      alarmdecoder Module

      +
      +

      alarmdecoder Module

      +

      Provides the main AlarmDecoder class.

      +
      +
      +class alarmdecoder.decoder.AlarmDecoder(device)[source]
      +

      Bases: object

      +

      High-level wrapper around Alarm Decoder (AD2) devices.

      +
      +
      +on_arm
      +

      This event is called when the panel is armed.

      +
      + +
      +
      +on_disarm
      +

      This event is called when the panel is disarmed.

      +
      + +
      +
      +on_power_changed
      +

      This event is called when panel power switches between AC and DC.

      +
      + +
      +
      +on_alarm
      +

      This event is called when the alarm is triggered.

      +
      + +
      +
      +on_fire
      +

      This event is called when a fire is detected.

      +
      + +
      +
      +on_bypass
      +

      This event is called when a zone is bypassed.

      +
      + +
      +
      +on_boot
      +

      This event is called when the device finishes booting.

      +
      + +
      +
      +on_config_received
      +

      This event is called when the device receives its configuration.

      +
      + +
      +
      +on_zone_fault
      +

      This event is called when alarmdecoder.zonetracking.Zonetracker detects a zone fault.

      +
      + +
      +
      +on_zone_restore
      +

      This event is called when alarmdecoder.zonetracking.Zonetracker detects that a fault is restored.

      +
      + +
      +
      +on_low_battery
      +

      This event is called when the device detects a low battery.

      +
      + +
      +
      +on_panic
      +

      This event is called when the device detects a panic.

      +
      + +
      +
      +on_relay_changed
      +

      This event is called when a relay is opened or closed on an expander board.

      +
      + +
      +
      +on_message
      +

      This event is called when any message is received.

      +
      + +
      +
      +on_lrr_message
      +

      This event is called when an alarmdecoder.messages.LRRMessage is received.

      +
      + +
      +
      +on_rfx_message
      +

      This event is called when an alarmdecoder.messages.RFMessage is received.

      +
      + +
      +
      +on_open
      +

      This event is called when the device has been opened.

      +
      + +
      +
      +on_close
      +

      This event is called when the device has been closed.

      +
      + +
      +
      +on_read
      +

      This event is called when a line has been read from the device.

      +
      + +
      +
      +on_write
      +

      This event is called when data has been written to the device.

      +
      + +
      +
      +KEY_F1 = u'\x01\x01\x01'
      +

      Represents panel function key #1

      +
      + +
      +
      +KEY_F2 = u'\x02\x02\x02'
      +

      Represents panel function key #2

      +
      + +
      +
      +KEY_F3 = u'\x03\x03\x03'
      +

      Represents panel function key #3

      +
      + +
      +
      +KEY_F4 = u'\x04\x04\x04'
      +

      Represents panel function key #4

      +
      + +
      +
      +BATTERY_TIMEOUT = 30
      +

      Default timeout (in seconds) before the battery status reverts.

      +
      + +
      +
      +FIRE_TIMEOUT = 30
      +

      Default tTimeout (in seconds) before the fire status reverts.

      +
      + +
      +
      +address = 18
      +

      The keypad address in use by the device.

      +
      + +
      +
      +configbits = 65280
      +

      The configuration bits set on the device.

      +
      + +
      +
      +address_mask = 0
      +

      The address mask configured on the device.

      +
      + +
      +
      +emulate_zone = [False, False, False, False, False]
      +

      List containing the devices zone emulation status.

      +
      + +
      +
      +emulate_relay = [False, False, False, False]
      +

      List containing the devices relay emulation status.

      +
      + +
      +
      +emulate_lrr = False
      +

      The status of the devices LRR emulation.

      +
      + +
      +
      +deduplicate = False
      +

      The status of message deduplication as configured on the device.

      +
      + +
      +
      +id[source]
      +

      The ID of the Alarm Decoder device.

      + +++ + + + +
      Returns:identification string for the device
      +
      + +
      +
      +battery_timeout[source]
      +

      Retrieves the timeout for restoring the battery status, in seconds.

      + +++ + + + +
      Returns:battery status timeout
      +
      + +
      +
      +fire_timeout[source]
      +

      Retrieves the timeout for restoring the fire status, in seconds.

      + +++ + + + +
      Returns:fire status timeout
      +
      + +
      +
      +open(baudrate=None, no_reader_thread=False)[source]
      +

      Opens the device.

      + +++ + + + +
      Parameters:
        +
      • baudrate (int) – baudrate used for the device. Defaults to the lower-level device default.
      • +
      • no_reader_thread (bool) – Specifies whether or not the automatic reader +thread should be started.
      • +
      +
      +
      + +
      +
      +close()[source]
      +

      Closes the device.

      +
      + +
      +
      +send(data)[source]
      +

      Sends data to the Alarm Decoder device.

      + +++ + + + +
      Parameters:data (string) – data to send
      +
      + +
      +
      +get_config()[source]
      +

      Retrieves the configuration from the device. Called automatically by _on_open().

      +
      + +
      +
      +save_config()[source]
      +

      Sets configuration entries on the device.

      +
      + +
      +
      +reboot()[source]
      +

      Reboots the device.

      +
      + +
      +
      +fault_zone(zone, simulate_wire_problem=False)[source]
      +

      Faults a zone if we are emulating a zone expander.

      + +++ + + + +
      Parameters:
        +
      • zone (int) – zone to fault
      • +
      • simulate_wire_problem (bool) – Whether or not to simulate a wire fault
      • +
      +
      +
      + +
      +
      +clear_zone(zone)[source]
      +

      Clears a zone if we are emulating a zone expander.

      + +++ + + + +
      Parameters:zone (int) – zone to clear
      +
      + +
      +

      devices Module

      -

      Contains different types of devices belonging to the Alarm Decoder (AD2) family.

      +

      This module contains different types of devices belonging to the Alarm Decoder (AD2) family.

      +
      class alarmdecoder.devices.Device[source]

      Bases: object

      -

      Generic parent device to all Alarm Decoder (AD2) products.

      +

      Base class for all Alarm Decoder (AD2) device types.

      on_open
      -

      Called when the device has been opened

      +

      This event is called when the device has been opened.

      on_close
      -

      Called when the device has been closed

      +

      This event is called when the device has been closed.

      on_read
      -

      Called when a line has been read from the device

      +

      This event is called when a line has been read from the device.

      on_write
      -

      Called when data has been written to the device

      +

      This event is called when data has been written to the device.

      @@ -97,7 +436,7 @@ -Returns:The identification string for the device. +Returns:identification string for the device @@ -111,7 +450,7 @@ -Returns:Whether or not the reader thread is alive. +Returns:whether or not the reader thread is alive @@ -160,23 +499,23 @@
      class alarmdecoder.devices.USBDevice(interface=0)[source]

      Bases: alarmdecoder.devices.Device

      -

      AD2USB device exposed with PyFTDI’s interface.

      +

      AD2USB device utilizing PyFTDI’s interface.

      FTDI_VENDOR_ID = 1027
      -

      Vendor ID used to recognize AD2USB devices.

      +

      Vendor ID used to recognize AD2USB devices.

      FTDI_PRODUCT_ID = 24577
      -

      Product ID used to recognize AD2USB devices.

      +

      Product ID used to recognize AD2USB devices.

      BAUDRATE = 115200
      -

      Default baudrate for AD2USB devices.

      +

      Default baudrate for AD2USB devices.

      @@ -189,7 +528,7 @@ Returns:list of devices -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -198,12 +537,12 @@
      classmethod devices()[source]
      -

      Returns a cached list of AD2USB devices located on the system.

      +

      Returns a cached list of AD2USB devices located on the system.

      - +
      Returns:cached list of devices found.
      Returns:cached list of devices found
      @@ -212,7 +551,7 @@
      classmethod find(device=None)[source]
      -

      Factory method that returns the requested USBDevice device, or the +

      Factory method that returns the requested USBDevice device, or the first device.

      @@ -221,9 +560,9 @@ first device.

      - + - +
      Parameters:device (tuple) – Tuple describing the USB device to open, as returned by find_all().
      Returns:USBDevice object utilizing the specified device.
      Returns:USBDevice object utilizing the specified device
      Raises :NoDeviceError
      Raises :alarmdecoder.util.NoDeviceError
      @@ -238,8 +577,8 @@ by find_all(). Parameters:
        -
      • on_attached (function) – function to be called when a device is attached.
      • -
      • on_detached (function) – function to be called when a device is detached.
      • +
      • on_attached (function) – function to be called when a device is attached
      • +
      • on_detached (function) – function to be called when a device is detached
      @@ -261,7 +600,7 @@ by find_all(). -Returns:The serial number of the device. +Returns:serial number of the device @@ -275,7 +614,7 @@ by find_all(). -Returns:The description of the device. +Returns:description of the device @@ -289,7 +628,7 @@ by find_all(). -Returns:the interface used to connect to the device. +Returns:the interface used to connect to the device @@ -304,13 +643,13 @@ by find_all(). Parameters:
        -
      • baudrate (int) – The baudrate to use.
      • -
      • no_reader_thread (bool) – Whether or not to automatically start the +
      • baudrate (int) – baudrate to use
      • +
      • no_reader_thread (bool) – whether or not to automatically start the reader thread.
      -Raises :

      NoDeviceError

      +Raises :

      alarmdecoder.util.NoDeviceError

      @@ -331,9 +670,9 @@ reader thread. -Parameters:data (str) – Data to write +Parameters:data (string) – data to write -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -347,9 +686,9 @@ reader thread. -Returns:The character read from the device. +Returns:character read from the device -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -364,16 +703,16 @@ reader thread. Parameters:
        -
      • timeout (float) – The read timeout.
      • +
      • timeout (float) – read timeout
      • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
      -Returns:

      The line that was read.

      +Returns:

      line that was read

      -Raises :

      CommError, TimeoutError

      +Raises :

      alarmdecoder.util.CommError, alarmdecoder.util.TimeoutError

      @@ -388,13 +727,13 @@ reading.
      on_attached
      -

      Called when an AD2USB device has been detected.

      +

      This event is called when an AD2USB device has been detected.

      on_detached
      -

      Called when an AD2USB device has been removed.

      +

      This event is called when an AD2USB device has been removed.

      @@ -417,7 +756,7 @@ reading.
      class alarmdecoder.devices.SerialDevice(interface=None)[source]

      Bases: alarmdecoder.devices.Device

      -

      AD2USB or AD2SERIAL device exposed with the pyserial interface.

      +

      AD2USB, AD2SERIAL or AD2PI device utilizing the PySerial interface.

      BAUDRATE = 19200
      @@ -432,11 +771,11 @@ reading. -Parameters:pattern (str) – Pattern to search for when retrieving serial ports. +Parameters:pattern (string) – pattern to search for when retrieving serial ports Returns:list of devices -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -450,7 +789,7 @@ reading. -Returns:the interface used to connect to the device. +Returns:interface used to connect to the device @@ -465,13 +804,13 @@ reading. Parameters:
        -
      • baudrate (int) – The baudrate to use with the device.
      • -
      • no_reader_thread (bool) – Whether or not to automatically start the +
      • baudrate (int) – baudrate to use with the device
      • +
      • no_reader_thread (bool) – whether or not to automatically start the reader thread.
      -Raises :

      NoDeviceError

      +Raises :

      alarmdecoder.util.NoDeviceError

      @@ -492,9 +831,9 @@ reader thread. -Parameters:data (str) – The data to write. +Parameters:data (string) – data to write -Raises :CommError +Raises :py:class:alarmdecoder.util.CommError @@ -508,9 +847,9 @@ reader thread. -Returns:The character read from the device. +Returns:character read from the device -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -525,16 +864,16 @@ reader thread. Parameters:
        -
      • timeout (float) – The read timeout.
      • +
      • timeout (float) – read timeout
      • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
      -Returns:

      The line that was read.

      +Returns:

      line that was read

      -Raises :

      CommError, TimeoutError

      +Raises :

      alarmdecoder.util.CommError, alarmdecoder.util.TimeoutError

      @@ -547,8 +886,8 @@ reading.
      class alarmdecoder.devices.SocketDevice(interface=('localhost', 10000))[source]

      Bases: alarmdecoder.devices.Device

      -

      Device that supports communication with an Alarm Decoder (AD2) that is -exposed via ser2sock or another Serial to IP interface.

      +

      Device that supports communication with an Alarm Decoder (AD2) that is +exposed via ser2sock or another Serial to IP interface.

      interface[source]
      @@ -557,7 +896,7 @@ exposed via ser2sock or another Serial to IP interface.

      -Returns:the interface used to connect to the device. +Returns:interface used to connect to the device @@ -571,7 +910,7 @@ exposed via ser2sock or another Serial to IP interface.

      -Returns:Whether or not the device is using SSL. +Returns:whether or not the device is using SSL @@ -585,7 +924,7 @@ exposed via ser2sock or another Serial to IP interface.

      -Returns:The certificate path +Returns:path to the certificate path or OpenSSL.crypto.X509 @@ -599,7 +938,7 @@ exposed via ser2sock or another Serial to IP interface.

      -Returns:The key path +Returns:jpath to the SSL key or OpenSSL.crypto.PKey @@ -614,7 +953,7 @@ authentication.

      -Returns:The CA path +Returns:path to the CA certificate or OpenSSL.crypto.X509 @@ -629,13 +968,13 @@ authentication.

      Parameters:
        -
      • baudrate (int) – The baudrate to use
      • -
      • no_reader_thread (bool) – Whether or not to automatically open the reader +
      • baudrate (int) – baudrate to use
      • +
      • no_reader_thread (bool) – whether or not to automatically open the reader thread.
      -Raises :

      NoDeviceError, CommError

      +Raises :

      alarmdecoder.util.NoDeviceError, alarmdecoder.util.CommError

      @@ -656,11 +995,11 @@ thread. -Parameters:data (str) – The data to write. +Parameters:data (string) – data to write -Returns:The number of bytes sent. +Returns:number of bytes sent -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -674,9 +1013,9 @@ thread. -Returns:The character read from the device. +Returns:character read from the device -Raises :CommError +Raises :alarmdecoder.util.CommError @@ -691,16 +1030,16 @@ thread. Parameters:
        -
      • timeout (float) – The read timeout.
      • +
      • timeout (float) – read timeout
      • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
      -Returns:

      The line that was read.:

      +Returns:

      line that was read

      -Raises :

      CommError, TimeoutError

      +Raises :

      alarmdecoder.util.CommError, alarmdecoder.util.TimeoutError

      @@ -710,298 +1049,116 @@ reading.
      -
      -

      util Module

      -

      Provides utility classes for the Alarm Decoder (AD2) devices.

      -
      -
      -exception alarmdecoder.util.NoDeviceError[source]
      -

      Bases: exceptions.Exception

      -

      No devices found.

      +
      +

      messages Module

      +

      Message representations received from the panel through the Alarm Decoder (AD2) +devices.

      +
        +
      • Message: The standard and most common message received from a panel.
      • +
      • ExpanderMessage: Messages received from Relay or Zone expander modules.
      • +
      • RFMessage: Message received from an RF receiver module.
      • +
      • LRRMessage: Message received from a long-range radio module.
      • +
      +
      +
      +class alarmdecoder.messages.BaseMessage[source]
      +

      Bases: object

      +

      Base class for messages.

      +
      +
      +raw = None
      +

      The raw message text

      -
      -
      -exception alarmdecoder.util.CommError[source]
      -

      Bases: exceptions.Exception

      -

      There was an error communicating with the device.

      -
      -
      -exception alarmdecoder.util.TimeoutError[source]
      -

      Bases: exceptions.Exception

      -

      There was a timeout while trying to communicate with the device.

      +
      +
      +class alarmdecoder.messages.Message(data=None)[source]
      +

      Bases: alarmdecoder.messages.BaseMessage

      +

      Represents a message from the alarm panel.

      +
      +
      +ready = False
      +

      Indicates whether or not the panel is in a ready state.

      -
      -
      -exception alarmdecoder.util.InvalidMessageError[source]
      -

      Bases: exceptions.Exception

      -

      The format of the panel message was invalid.

      +
      +
      +armed_away = False
      +

      Indicates whether or not the panel is armed away.

      -
      -
      -class alarmdecoder.util.Firmware[source]
      -

      Bases: object

      -

      Represents firmware for the Alarm Decoder devices.

      -
      -STAGE_START = 0
      -
      - -
      -
      -STAGE_WAITING = 1
      -
      - -
      -
      -STAGE_BOOT = 2
      -
      - -
      -
      -STAGE_LOAD = 3
      -
      - -
      -
      -STAGE_UPLOADING = 4
      -
      - -
      -
      -STAGE_DONE = 5
      -
      - -
      -
      -static upload(dev, filename, progress_callback=None)[source]
      -

      Uploads firmware to an Alarm Decoder device.

      - --- - - - - - -
      Parameters:
        -
      • filename (str) – The firmware filename
      • -
      • progress_callback (function) – Callback function used to report progress.
      • -
      -
      Raises :

      NoDeviceError, TimeoutError

      -
      -
      - -
      - -
      -
      -

      zonetracking Module

      -

      Provides zone tracking functionality for the Alarm Decoder (AD2) device family.

      -
      -
      -class alarmdecoder.zonetracking.Zone(zone=0, name='', status=0)[source]
      -

      Bases: object

      -

      Representation of a panel zone.

      -
      -
      -CLEAR = 0
      -

      Status indicating that the zone is cleared.

      -
      - -
      -
      -FAULT = 1
      -

      Status indicating that the zone is faulted.

      -
      - -
      -
      -CHECK = 2
      -

      Status indicating that there is a wiring issue with the zone.

      -
      - -
      -
      -STATUS = {0: 'CLEAR', 1: 'FAULT', 2: 'CHECK'}
      -
      - -
      - -
      -
      -class alarmdecoder.zonetracking.Zonetracker[source]
      -

      Bases: object

      -

      Handles tracking of zone and their statuses.

      -
      -
      -on_fault
      -

      Called when the device detects a zone fault.

      -
      - -
      -
      -on_restore
      -

      Called when the device detects that a fault is restored.

      -
      - -
      -
      -EXPIRE = 30
      -

      Zone expiration timeout.

      -
      - -
      -
      -update(message)[source]
      -

      Update zone statuses based on the current message.

      - --- - - - -
      Parameters:message (Message or ExpanderMessage) – Message to use to update the zone tracking.
      -
      - -
      -
      -expander_to_zone(address, channel)[source]
      -

      Convert an address and channel into a zone number.

      - --- - - - - - -
      Parameters:
        -
      • address (int) – The expander address
      • -
      • channel (int) – The channel
      • -
      -
      Returns:

      The zone number associated with an address and channel.

      -
      -
      - -
      - -
      -
      -

      panels Module

      -

      Representations of Panels and their templates.

      -
      -
      -

      messages Module

      -

      Message representations received from the panel through the Alarm Decoder (AD2) -devices.

      -
      -
      -class alarmdecoder.messages.BaseMessage[source]
      -

      Bases: object

      -

      Base class for messages.

      -
      -
      -raw = None
      -

      The raw message text

      -
      - -
      - -
      -
      -class alarmdecoder.messages.Message(data=None)[source]
      -

      Bases: alarmdecoder.messages.BaseMessage

      -

      Represents a message from the alarm panel.

      -
      -
      -ready = False
      -

      Indicates whether or not the panel is in a ready state

      -
      - -
      -
      -armed_away = False
      -

      Indicates whether or not the panel is armed away

      -
      - -
      -
      -armed_home = False
      -

      Indicates whether or not the panel is armed home

      -
      +
      +armed_home = False
      +

      Indicates whether or not the panel is armed home.

      +
      backlight_on = False
      -

      Indicates whether or not the keypad backlight is on

      +

      Indicates whether or not the keypad backlight is on.

      programming_mode = False
      -

      Indicates whether or not we’re in programming mode

      +

      Indicates whether or not we’re in programming mode.

      beeps = -1
      -

      Number of beeps associated with a message

      +

      Number of beeps associated with a message.

      zone_bypassed = False
      -

      Indicates whether or not a zone is bypassed

      +

      Indicates whether or not a zone is bypassed.

      ac_power = False
      -

      Indicates whether or not the panel is on AC power

      +

      Indicates whether or not the panel is on AC power.

      chime_on = False
      -

      Indicates whether or not the chime is enabled

      +

      Indicates whether or not the chime is enabled.

      alarm_event_occurred = False
      -

      Indicates whether or not an alarm event has occurred

      +

      Indicates whether or not an alarm event has occurred.

      alarm_sounding = False
      -

      Indicates whether or not an alarm is sounding

      +

      Indicates whether or not an alarm is sounding.

      battery_low = False
      -

      Indicates whether or not there is a low battery

      +

      Indicates whether or not there is a low battery.

      entry_delay_off = False
      -

      Indicates whether or not the entry delay is enabled

      +

      Indicates whether or not the entry delay is enabled.

      fire_alarm = False
      -

      Indicates whether or not a fire alarm is sounding

      +

      Indicates whether or not a fire alarm is sounding.

      @@ -1013,43 +1170,43 @@ devices.

      perimeter_only = False
      -

      Indicates whether or not the perimeter is armed

      +

      Indicates whether or not the perimeter is armed.

      numeric_code = None
      -

      The numeric code associated with the message

      +

      The numeric code associated with the message.

      text = None
      -

      The human-readable text to be displayed on the panel LCD

      +

      The human-readable text to be displayed on the panel LCD.

      cursor_location = -1
      -

      Current cursor location on the keypad

      +

      Current cursor location on the keypad.

      mask = None
      -

      Address mask this message is intended for

      +

      Address mask this message is intended for.

      bitfield = None
      -

      The bitfield associated with this message

      +

      The bitfield associated with this message.

      panel_data = None
      -

      The panel data field associated with this message

      +

      The panel data field associated with this message.

      @@ -1102,27 +1259,22 @@ devices.

      class alarmdecoder.messages.RFMessage(data=None)[source]

      Bases: alarmdecoder.messages.BaseMessage

      Represents a message from an RF receiver.

      -
      -
      -x = 3
      -
      -
      serial_number = None
      -

      Serial number of the RF device

      +

      Serial number of the RF device.

      value = -1
      -

      Value associated with this message

      +

      Value associated with this message.

      battery = False
      -

      Battery low indication

      +

      Low battery indication

      @@ -1153,29 +1305,257 @@ devices.

      partition = -1
      -

      The partition that this message applies to

      +

      The partition that this message applies to.

      event_type = None
      -

      The type of the event that occurred

      +

      The type of the event that occurred.

      -
      -

      Subpackages

      -
      -
        -
      • event Package
          -
        • event Package
        • -
        • event Module
        • +
          +

          zonetracking Module

          +

          Provides zone tracking functionality for the Alarm Decoder (AD2) device family.

          +
          +
          +class alarmdecoder.zonetracking.Zone(zone=0, name='', status=0)[source]
          +

          Bases: object

          +

          Representation of a panel zone.

          +
          +
          +CLEAR = 0
          +

          Status indicating that the zone is cleared.

          +
          + +
          +
          +FAULT = 1
          +

          Status indicating that the zone is faulted.

          +
          + +
          +
          +CHECK = 2
          +

          Status indicating that there is a wiring issue with the zone.

          +
          + +
          +
          +STATUS = {0: 'CLEAR', 1: 'FAULT', 2: 'CHECK'}
          +
          + +
          +
          +zone = 0
          +

          Zone ID

          +
          + +
          +
          +name = ''
          +

          Zone name

          +
          + +
          +
          +status = 0
          +

          Zone status

          +
          + +
          +
          +timestamp = None
          +

          Timestamp of last update

          +
          + +
          + +
          +
          +class alarmdecoder.zonetracking.Zonetracker[source]
          +

          Bases: object

          +

          Handles tracking of zones and their statuses.

          +
          +
          +on_fault
          +

          This event is called when the device detects a zone fault.

          +
          + +
          +
          +on_restore
          +

          This event is called when the device detects that a fault is restored.

          +
          + +
          +
          +EXPIRE = 30
          +

          Zone expiration timeout.

          +
          + +
          +
          +zones
          +

          Returns the current list of zones being tracked.

          + +++ + + + +
          Returns:dictionary of Zone being tracked
          +
          + +
          +
          +faulted
          +

          Retrieves the current list of faulted zones.

          + +++ + + + +
          Returns:list of faulted zones
          +
          + +
          +
          +update(message)[source]
          +

          Update zone statuses based on the current message.

          + +++ + + + +
          Parameters:message (alarmdecoder.messages.Message or alarmdecoder.messages.ExpanderMessage) – message to use to update the zone tracking
          +
          + +
          +
          +expander_to_zone(address, channel)[source]
          +

          Convert an address and channel into a zone number.

          + +++ + + + + + +
          Parameters:
            +
          • address (int) – expander address
          • +
          • channel (int) – channel
          - +
          Returns:

          zone number associated with an address and channel

          +
          +
          + +
          + +
          +
          +

          util Module

          +

          Provides utility classes for the Alarm Decoder (AD2) devices.

          +
          +
          +exception alarmdecoder.util.NoDeviceError[source]
          +

          Bases: exceptions.Exception

          +

          No devices found.

          +
          + +
          +
          +exception alarmdecoder.util.CommError[source]
          +

          Bases: exceptions.Exception

          +

          There was an error communicating with the device.

          +
          + +
          +
          +exception alarmdecoder.util.TimeoutError[source]
          +

          Bases: exceptions.Exception

          +

          There was a timeout while trying to communicate with the device.

          +
          + +
          +
          +exception alarmdecoder.util.InvalidMessageError[source]
          +

          Bases: exceptions.Exception

          +

          The format of the panel message was invalid.

          +
          + +
          +
          +class alarmdecoder.util.Firmware[source]
          +

          Bases: object

          +

          Represents firmware for the Alarm Decoder devices.

          +
          +
          +STAGE_START = 0
          +
          + +
          +
          +STAGE_WAITING = 1
          +
          + +
          +
          +STAGE_BOOT = 2
          +
          + +
          +
          +STAGE_LOAD = 3
          +
          + +
          +
          +STAGE_UPLOADING = 4
          +
          + +
          +
          +STAGE_DONE = 5
          +
          + +
          +
          +static upload(dev, filename, progress_callback=None)[source]
          +

          Uploads firmware to an Alarm Decoder device.

          + +++ + + + + + +
          Parameters:
            +
          • filename (string) – firmware filename
          • +
          • progress_callback (function) – callback function used to report progress
          +
          Raises :

          alarmdecoder.util.NoDeviceError, alarmdecoder.util.TimeoutError

          +
          +
          + +
          +
          +
          +

          panels Module

          +

          Representations of Panels and their templates.

      @@ -1188,15 +1568,12 @@ devices.

      Table Of Contents

      @@ -1204,9 +1581,6 @@ devices.

      Previous topic

      Welcome to alarmdecoder’s documentation!

      -

      Next topic

      -

      event Package

      This Page

      • modules |
      • -
      • - next |
      • previous |
      • diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index e92fc80..1cf6cde 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -55,7 +55,9 @@ | D | E | F + | G | I + | K | L | M | N @@ -67,7 +69,6 @@ | U | V | W - | X | Z
      @@ -83,7 +84,17 @@ -
      address (alarmdecoder.messages.ExpanderMessage attribute) +
      address (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      + +
      (alarmdecoder.messages.ExpanderMessage attribute) +
      + +
      + +
      address_mask (alarmdecoder.decoder.AlarmDecoder attribute)
      @@ -95,16 +106,24 @@ -
      alarmdecoder.devices (module) +
      AlarmDecoder (class in alarmdecoder.decoder)
      -
      alarmdecoder.event (module) +
      alarmdecoder.decoder (module) +
      + + +
      alarmdecoder.devices (module)
      +
      alarmdecoder.event (module) +
      + +
      alarmdecoder.event.event (module)
      @@ -154,9 +173,17 @@
      battery_low (alarmdecoder.messages.Message attribute)
      + +
      BATTERY_TIMEOUT (alarmdecoder.decoder.AlarmDecoder attribute) +
      +
      +
      battery_timeout (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      BAUDRATE (alarmdecoder.devices.SerialDevice attribute)
      @@ -196,18 +223,26 @@
      chime_on (alarmdecoder.messages.Message attribute)
      + +
      CLEAR (alarmdecoder.zonetracking.Zone attribute) +
      +
      -
      CLEAR (alarmdecoder.zonetracking.Zone attribute) +
      clear_zone() (alarmdecoder.decoder.AlarmDecoder method)
      -
      close() (alarmdecoder.devices.Device method) +
      close() (alarmdecoder.decoder.AlarmDecoder method)
      +
      (alarmdecoder.devices.Device method) +
      + +
      (alarmdecoder.devices.SerialDevice method)
      @@ -225,6 +260,10 @@ +
      configbits (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      cursor_location (alarmdecoder.messages.Message attribute)
      @@ -235,6 +274,10 @@
      +
      deduplicate (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      description (alarmdecoder.devices.USBDevice attribute)
      @@ -259,6 +302,18 @@ + -
      +
      emulate_lrr (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      emulate_relay (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      emulate_zone (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      entry_delay_off (alarmdecoder.messages.Message attribute)
      @@ -270,12 +325,12 @@
      event_data (alarmdecoder.messages.LRRMessage attribute)
      +
      event_type (alarmdecoder.messages.LRRMessage attribute)
      -
      EventHandler (class in alarmdecoder.event.event)
      @@ -303,6 +358,14 @@ +
      fault_zone() (alarmdecoder.decoder.AlarmDecoder method) +
      + + +
      faulted (alarmdecoder.zonetracking.Zonetracker attribute) +
      + +
      find() (alarmdecoder.devices.USBDevice class method)
      @@ -327,6 +390,14 @@ +
      fire_timeout (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      FIRE_TIMEOUT (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      Firmware (class in alarmdecoder.util)
      @@ -341,13 +412,29 @@
      +

      G

      + + +
      + +
      get_config() (alarmdecoder.decoder.AlarmDecoder method) +
      + +
      +

      I

      -
      id (alarmdecoder.devices.Device attribute) +
      id (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      + +
      (alarmdecoder.devices.Device attribute)
      +
      interface (alarmdecoder.devices.SerialDevice attribute)
      @@ -375,6 +462,30 @@
      +

      K

      + + + +
      + +
      KEY_F1 (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      KEY_F2 (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      + +
      KEY_F3 (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      KEY_F4 (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      +

      L

      @@ -411,6 +522,10 @@
      +
      name (alarmdecoder.zonetracking.Zone attribute) +
      + +
      NoDeviceError
      @@ -427,11 +542,37 @@
      +
      on_alarm (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_arm (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      on_attached (alarmdecoder.devices.USBDevice.DetectThread attribute)
      -
      on_close (alarmdecoder.devices.Device attribute) +
      on_boot (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_bypass (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_close (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      + +
      (alarmdecoder.devices.Device attribute) +
      + +
      + +
      on_config_received (alarmdecoder.decoder.AlarmDecoder attribute)
      @@ -439,17 +580,61 @@ +
      on_disarm (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      on_fault (alarmdecoder.zonetracking.Zonetracker attribute)
      -
      on_open (alarmdecoder.devices.Device attribute) +
      on_fire (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_low_battery (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_lrr_message (alarmdecoder.decoder.AlarmDecoder attribute)
      -
      on_read (alarmdecoder.devices.Device attribute) +
      on_message (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_open (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      + +
      (alarmdecoder.devices.Device attribute) +
      + +
      + +
      on_panic (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_power_changed (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_read (alarmdecoder.decoder.AlarmDecoder attribute) +
      + +
      + +
      (alarmdecoder.devices.Device attribute) +
      + +
      + +
      on_relay_changed (alarmdecoder.decoder.AlarmDecoder attribute)
      @@ -457,15 +642,37 @@ -
      on_write (alarmdecoder.devices.Device attribute) +
      on_rfx_message (alarmdecoder.decoder.AlarmDecoder attribute)
      -
      open() (alarmdecoder.devices.SerialDevice method) +
      on_write (alarmdecoder.decoder.AlarmDecoder attribute)
      +
      (alarmdecoder.devices.Device attribute) +
      + +
      + +
      on_zone_fault (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      on_zone_restore (alarmdecoder.decoder.AlarmDecoder attribute) +
      + + +
      open() (alarmdecoder.decoder.AlarmDecoder method) +
      + +
      + +
      (alarmdecoder.devices.SerialDevice method) +
      + +
      (alarmdecoder.devices.SocketDevice method)
      @@ -547,6 +754,10 @@
      +
      reboot() (alarmdecoder.decoder.AlarmDecoder method) +
      + +
      RELAY (alarmdecoder.messages.ExpanderMessage attribute)
      @@ -575,6 +786,14 @@ + -
      +
      save_config() (alarmdecoder.decoder.AlarmDecoder method) +
      + + +
      send() (alarmdecoder.decoder.AlarmDecoder method) +
      + +
      serial_number (alarmdecoder.devices.USBDevice attribute)
      @@ -616,12 +835,12 @@
      STAGE_DONE (alarmdecoder.util.Firmware attribute)
      +
      STAGE_LOAD (alarmdecoder.util.Firmware attribute)
      -
      STAGE_START (alarmdecoder.util.Firmware attribute)
      @@ -639,6 +858,10 @@ +
      status (alarmdecoder.zonetracking.Zone attribute) +
      + +
      STATUS (alarmdecoder.zonetracking.Zone attribute)
      @@ -681,6 +904,10 @@
      +
      timestamp (alarmdecoder.zonetracking.Zone attribute) +
      + +
      type (alarmdecoder.messages.ExpanderMessage attribute)
      @@ -747,21 +974,15 @@
      -

      X

      +

      Z

      -
      -
      x (alarmdecoder.messages.RFMessage attribute) +
      ZONE (alarmdecoder.messages.ExpanderMessage attribute)
      -
      - -

      Z

      - - + + +
      -
      ZONE (alarmdecoder.messages.ExpanderMessage attribute) +
      zone (alarmdecoder.zonetracking.Zone attribute)
      @@ -775,6 +996,10 @@ +
      zones (alarmdecoder.zonetracking.Zonetracker attribute) +
      + +
      Zonetracker (class in alarmdecoder.zonetracking)
      diff --git a/docs/build/html/index.html b/docs/build/html/index.html index 2caf0e4..bffcd64 100644 --- a/docs/build/html/index.html +++ b/docs/build/html/index.html @@ -50,24 +50,18 @@

      Welcome to alarmdecoder’s documentation!

      -

      Contents:

      +

      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.

      +

      Table of Contents:

      diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html index 0d97bc4..28bef02 100644 --- a/docs/build/html/modules.html +++ b/docs/build/html/modules.html @@ -49,20 +49,12 @@
      diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index 7e14e500e52ba034f95fb1e5e262a189e245a20a..3bfc8ad336b6426a3cb0f3ae46e805500b88a64b 100644 GIT binary patch delta 1629 zcmV-j2BP`m3dIeOdw*L?bK^D)zVEN_OnZ%{+xE0KCsuYnn~gJy+%|jR&=PEOLWvrZ zvg7{xQm@3eq%;O`vDbPa0112mK5#RYiadpviLvPy$yXpJSDz=v;VNry1Y4WQUnW0P zT1uGAt4p6YkPp1nU2WfJ9yP#qvORsUxz;}R*gWvSH}Hu|u79%>5|x4u+Ha@Jm#q2Y zzfDdasNZjHUHv+_I(-{5W*H8=31`B6zqBsb<<(6ESB_h43k2NCcz-fH(5=rXUh z0=re|$ArD=(|_s`6rhC@0Gg>>9x8F%S}j(kh0D}?RLL{gR!LRB#i|VoN~AL2ZDg`_ zHaY`6%v(NQwes(|F8-~i= ze9)$6Co=Oqx*WkJN<{4hw?b!ot|54gr(Z)hTik~vNPInA&Z24TBaCcaf(~O)!1o%y z7i)4}nSbH{cjY`+ip|#gCCQTo!Nk;nV%GWpfl0Nef?N$NrR=4eojCG^yEK5(tzA9{ zeHTTYw7LRiDYx85;A^#1YNNDU@`PJ~^oQX*Tt7r(^MzZ`1MA@CE}TYGwp~x-IEm1Wp$+jEHeE^C}jCC)uGq$B`ttbZz4>bj4lbF_B~WNvgZLC?*Ob>l$Wbc~%f@==EX|lh}CV zw0{J3e+nkiqM%H3kd=~KU{Y%mgKy*6oION~+43f4^BJMvHO;z1q6EYah3I1d=f`l- za6UENNLCZMdyulN%78>#oluP`^Ry*`d?glIZ8Xm^CyqHV2g+;(Z9-&Lu`aoyh`r

      u3G!!&N*sQL6jJAD*kWk3h309B>z@aeteRdgv_5wY^o(!VX;Wcv zT;=}&KQ6n!(`Ras{6N=f{uSQO7Jm`8(HxnJpsJ9uopFsd%ic&}3LOasNvEj`WpJG= z;wB`>xZ4WnTLdO;@m(@Yxh30F2Z$n}oHQU~cR*Up|1u=&H;Shn?dL&Ao+pwhyqi9e z5EKb3)E+d=AY;d62}DF<#WR!Cs#OVAQnUJX@kBX%z%E^XkSgq2fFy;0@PD6&c@z?w zdtpH}e6sR_Kz%V1}lqiIg<8GcGUdJ<~=;*mUujvLi^l;vf%0!_(-AnWtD zJd9)*2iEO-_{461r`m;D+8?Boe|so^RK3rnj8+s*XC9;RF<-7r8~hw~6muz8(}O#B zzmdT9o^L%TB+m>vEAMw-SbrK~=u80D*7Hz6&sqmh4yO{9;6@{ZO@q(Lyt=ZvSB)gH zT7Lyl7(&mjOF&k!6B{5qKZ{}ZhL1i=;2JrQ8pFLm30DuzRh>r!Y92a%6k75F#hxCA z0!qW7>i+NPJjR_OIS&T!^5J|e<`4-x7V8D7%h~$iBvxCY)@#b6=~mA`RxZ}f3|)YA z8JoOE`bl-3*uRz?HXC1X_gXIk*1B>ND&tUr-|xj;@W;zX>JvEV;%1x#@~@TZBahAa b69br+|5u#>2k<(3(N#Ym1j7FS?B4Su?za*C delta 1271 zcmVbK5u!zV}ynX7?J+_S%~hE3IdpI3vru+g>;{1=}1`qK2gG zxW9g>hvkRlv?6g)B8kEPAn@S>=u{>=OW=K^P4Y$16^PNp=TUxqNShbI)}-Q((Thw9 z0i$X8=+g$Wo{vsXn=k668mMC1>xK2RX4#@%@J2WAi3+OH1b>)JKn1Xe%+yz_&zH1T z;IC27qDoS|;Nj2F!?m0gw6?>803D-eZxqjDrquijQhbyi& zNNYhDb&%Go6+NF6(?t$y&oy`2slIp)6g{A9`r2YAp+d9?;u6_saWV&-{O}3Jj#>k= zzeKL!nXB|b6$FcT{52$#`D=*c@W=6T5{+XYVNOQ1UVjF~sc4ibGsYQ&+W2IwV zRYe3yLX8*NwI!)gS}GzWqs9~O&N>dX^0FEQKkSVQ06fVw4V99r{21ODcUa8)a z+S8I*AAc!GP~fD@7Lru?(|CI@ig&zK-GFipt?=FQM*F0-JxP@P*OOITY8J?hSdm65 zkMb~-ZuC`!<=bpNo=jiA`lfLs&t9V#!%@N0EF4D|`J7U{!{Ssp2wGAWr$F!X_~U#Y zqa@-*R3Y%F1T<4TcSO)m-{u%Z&*SAR_9iMwy?>5<2MO8A6fnZN24pRZENNO6Ux~Sr z8%5L9iX+zTfQfg|Kq@hk{A}u(6UDwIe?)K(X`Oxvl;LY`D?eb7uFL*J8%rseUt(QR zO3j>ly7#Y#Rt{*BVl)vh92kPG?cd zMt_SV!u7=pZX4n-=;?Uhz`H>yE-roA4G7yb<0g19E-zFE|!g6~mK7K@UzEzPXsF+i_@tCHp4x9}s(>bn0F?cQnQL_B)S z5T2xi;s!?&!X)V$VVuZ71r9M!K^6wBU4Jes4_O^^8|hA^`7V(v@`M_9E_$0sQ8*ia zN1>yPvZJ52;*p1*BSnbUad_8p(=u<&*(;PwTuHp%YkRxVkf*HOCwDy z2w5Ncd53>>y!KD{I+;fZr)v!d`fztVjopU)x1PhDQCQ%xiS9bT>g=kmGj>lC5cEjo zdX4!@iXEW+FvGc1xm#dN^S--vsQ%1T@g|L=NDK`Qrv hGL@)~S?g(zOM^W0D5lrfUXz1U(fv)J_#c>R4Uu|?fF1w< diff --git a/docs/build/html/py-modindex.html b/docs/build/html/py-modindex.html index 6064500..50f6b5c 100644 --- a/docs/build/html/py-modindex.html +++ b/docs/build/html/py-modindex.html @@ -64,6 +64,11 @@

      alarmdecoder
          + alarmdecoder.decoder +
          diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index ae78dc9..8ae2a6f 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,terms:{represent:1,all:[1,0],code:1,entri:1,zone_bypass:1,text:1,sent:1,recogn:1,arm:1,ssl_kei:1,socketdevic:1,through:1,human:1,stage_don:1,data:1,find:1,backlight:1,paramet:1,raw:1,current:1,baudrat:1,locat:1,expos:1,also:0,readabl:1,except:1,identif:1,whether:1,add:0,program:1,serialdevic:1,bypass:1,on_read:1,match:1,sourc:[1,0],"return":1,string:1,serial_numb:1,format:1,read:1,numeric_cod:1,stop:1,ssl:1,lcd:1,lrr:1,progress:1,report:1,detach:1,requir:1,enabl:1,ad2:1,name:1,earg:0,list:1,upload:1,authent:1,factori:1,"try":1,provid:1,expand:1,stage_wait:1,mode:1,timeout:1,contain:1,found:1,alarm_event_occur:1,expandermessag:1,page:3,certif:1,nodeviceerror:1,on_open:1,request:1,"static":1,connect:1,usbdevic:1,on_writ:1,our:1,charact:1,read_lin:1,event:1,stop_read:1,pyseri:1,index:3,statu:1,detect:1,parent:1,purge_buff:1,pattern:1,ad2seri:1,callback:1,content:3,pyftdi:1,written:1,reader:1,"new":0,awai:1,method:1,localhost:1,ser2sock:1,process:1,perimet:1,run:1,timeouterror:1,kei:1,state:1,numer:1,gener:1,stage_load:1,cursor_loc:1,entry_delay_off:1,like:0,on_clos:1,base:[1,0],ssl_certif:1,address:1,path:1,"byte":1,armed_hom:1,valu:1,describ:1,fire_alarm:1,search:[1,3],actual:1,zone:1,thread:1,fault:1,readthread:1,stage_start:1,prior:1,rais:1,loop:1,fals:1,find_al:1,ad2usb:1,first:1,oper:0,rang:1,via:1,vid:1,appli:1,keypad:1,"float":1,number:1,automat:1,filenam:1,read_timeout:1,"long":1,famili:1,batteri:1,chime:1,open:1,on_attach:1,differ:1,from:1,usb:1,commun:1,detectthread:1,support:1,system:1,been:1,beep:1,attach:1,singl:1,handler:0,call:[1,0],on_detach:1,start_detect:1,ac_pow:1,interfac:1,stage_upload:1,type:1,start:1,low:1,"function":[1,0],no_reader_thread:1,fire:[1,0],tupl:1,commerror:1,chime_on:1,convert:1,specifi:1,stage_boot:1,rfmessag:1,flag:1,indic:1,relai:1,expander_to_zon:1,line:1,repres:1,cach:1,present:1,must:0,sound:1,none:[1,0],sender:0,retriev:1,on_restor:1,restor:1,"default":1,remov:[1,0],purg:1,displai:1,dev:1,stop_detect:1,cursor:1,defin:0,"while":1,kwarg:0,can:0,str:1,error:1,battery_low:1,alarm:1,radio:1,expir:1,backlight_on:1,"int":1,descript:1,arg:0,pid:1,templat:1,bitfield:1,check_zon:1,on_fault:1,itself:0,exist:0,aliv:1,ftdi_vendor_id:1,home:1,close:1,vendor:1,ftdi_product_id:1,alarm_sound:1,serial:1,delai:1,readi:1,panel_data:1,progress_callback:1,author:1,receiv:1,anoth:1,belong:1,when:1,invalid:1,port:1,write:1,field:1,client:1,bool:1,which:1,occur:1,instead:0,you:0,event_data:1,channel:1,updat:1,status:1,product:1,relat:1,intend:1,firmwar:1,supervis:1,buffer:1,expans:1,decod:1,event_typ:1,ftdi:1,partit:1,perimeter_onli:1,wire:1,power:1,user:1,attent:1,basemessag:1,eventhandl:0,associ:1,"class":[1,0],check:1,armed_awai:1,handl:1,classmethod:1,doc:0,clear:1,mask:1,object:[1,0],ssl_ca:1,issu:1,lrrmessag:1,is_reader_al:1,obj:0,thi:1,programming_mod:1,track:1,func:0,invalidmessageerror:1,usual:1},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:classmethod","5":"py:exception","6":"py:staticmethod"},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","classmethod","Python class method"],"5":["py","exception","Python exception"],"6":["py","staticmethod","Python static method"]},filenames:["alarmdecoder.event","alarmdecoder","modules","index"],titles:["event Package","alarmdecoder Package","alarmdecoder","Welcome to alarmdecoder’s documentation!"],objects:{"alarmdecoder.messages.LRRMessage":{partition:[1,3,1,""],event_data:[1,3,1,""],event_type:[1,3,1,""]},"alarmdecoder.messages.BaseMessage":{raw:[1,3,1,""]},"alarmdecoder.messages.ExpanderMessage":{RELAY:[1,3,1,""],ZONE:[1,3,1,""],value:[1,3,1,""],address:[1,3,1,""],type:[1,3,1,""],channel:[1,3,1,""]},"alarmdecoder.event.event":{EventHandler:[0,1,1,""],Event:[0,1,1,""]},"alarmdecoder.zonetracking.Zone":{STATUS:[1,3,1,""],FAULT:[1,3,1,""],CLEAR:[1,3,1,""],CHECK:[1,3,1,""]},"alarmdecoder.devices.SerialDevice":{write:[1,2,1,""],BAUDRATE:[1,3,1,""],read:[1,2,1,""],read_line:[1,2,1,""],find_all:[1,6,1,""],"interface":[1,3,1,""],close:[1,2,1,""],open:[1,2,1,""]},"alarmdecoder.zonetracking":{Zonetracker:[1,1,1,""],Zone:[1,1,1,""]},"alarmdecoder.zonetracking.Zonetracker":{on_restore:[1,3,1,""],EXPIRE:[1,3,1,""],expander_to_zone:[1,2,1,""],update:[1,2,1,""],on_fault:[1,3,1,""]},"alarmdecoder.devices.Device.ReadThread":{READ_TIMEOUT:[1,3,1,""],stop:[1,2,1,""],run:[1,2,1,""]},"alarmdecoder.event":{event:[0,0,1,""]},"alarmdecoder.messages":{Message:[1,1,1,""],LRRMessage:[1,1,1,""],RFMessage:[1,1,1,""],ExpanderMessage:[1,1,1,""],BaseMessage:[1,1,1,""]},"alarmdecoder.devices":{Device:[1,1,1,""],SocketDevice:[1,1,1,""],USBDevice:[1,1,1,""],SerialDevice:[1,1,1,""]},"alarmdecoder.devices.USBDevice.DetectThread":{run:[1,2,1,""],stop:[1,2,1,""],on_attached:[1,3,1,""],on_detached:[1,3,1,""]},alarmdecoder:{zonetracking:[1,0,1,""],messages:[1,0,1,""],devices:[1,0,1,""],util:[1,0,1,""],panels:[1,0,1,""],event:[0,0,1,""]},"alarmdecoder.devices.SocketDevice":{ssl_certificate:[1,3,1,""],ssl_key:[1,3,1,""],read:[1,2,1,""],ssl_ca:[1,3,1,""],read_line:[1,2,1,""],ssl:[1,3,1,""],write:[1,2,1,""],"interface":[1,3,1,""],close:[1,2,1,""],open:[1,2,1,""]},"alarmdecoder.devices.USBDevice":{write:[1,2,1,""],BAUDRATE:[1,3,1,""],description:[1,3,1,""],read:[1,2,1,""],DetectThread:[1,1,1,""],stop_detection:[1,4,1,""],devices:[1,4,1,""],start_detection:[1,4,1,""],read_line:[1,2,1,""],find_all:[1,4,1,""],FTDI_VENDOR_ID:[1,3,1,""],serial_number:[1,3,1,""],"interface":[1,3,1,""],close:[1,2,1,""],FTDI_PRODUCT_ID:[1,3,1,""],open:[1,2,1,""],find:[1,4,1,""]},"alarmdecoder.messages.Message":{backlight_on:[1,3,1,""],alarm_event_occurred:[1,3,1,""],programming_mode:[1,3,1,""],text:[1,3,1,""],bitfield:[1,3,1,""],armed_home:[1,3,1,""],alarm_sounding:[1,3,1,""],ready:[1,3,1,""],zone_bypassed:[1,3,1,""],panel_data:[1,3,1,""],check_zone:[1,3,1,""],numeric_code:[1,3,1,""],battery_low:[1,3,1,""],chime_on:[1,3,1,""],entry_delay_off:[1,3,1,""],perimeter_only:[1,3,1,""],fire_alarm:[1,3,1,""],ac_power:[1,3,1,""],beeps:[1,3,1,""],mask:[1,3,1,""],armed_away:[1,3,1,""],cursor_location:[1,3,1,""]},"alarmdecoder.devices.Device":{stop_reader:[1,2,1,""],on_open:[1,3,1,""],on_write:[1,3,1,""],ReadThread:[1,1,1,""],on_close:[1,3,1,""],on_read:[1,3,1,""],close:[1,2,1,""],is_reader_alive:[1,2,1,""],id:[1,3,1,""]},"alarmdecoder.messages.RFMessage":{battery:[1,3,1,""],value:[1,3,1,""],supervision:[1,3,1,""],serial_number:[1,3,1,""],x:[1,3,1,""],loop:[1,3,1,""]},"alarmdecoder.event.event.EventHandler":{fire:[0,2,1,""],add:[0,2,1,""],remove:[0,2,1,""]},"alarmdecoder.util.Firmware":{STAGE_LOAD:[1,3,1,""],upload:[1,6,1,""],STAGE_BOOT:[1,3,1,""],STAGE_START:[1,3,1,""],STAGE_UPLOADING:[1,3,1,""],STAGE_WAITING:[1,3,1,""],STAGE_DONE:[1,3,1,""]},"alarmdecoder.util":{CommError:[1,5,1,""],Firmware:[1,1,1,""],TimeoutError:[1,5,1,""],NoDeviceError:[1,5,1,""],InvalidMessageError:[1,5,1,""]}},titleterms:{subpackag:1,alarmdecod:[1,2,3],welcom:3,modul:[1,0],devic:1,zonetrack:1,util:1,packag:[1,0],messag:1,indic:3,tabl:3,document:3,event:0,panel:1}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{represent:2,all:[0,2],code:[3,2],on_boot:2,stage_don:2,backlight:2,zone:2,messagesexpandermessag:[],readabl:2,send:2,program:2,x03:2,x02:2,x01:2,sent:2,x04:2,sourc:[0,2,3],string:2,clear_zon:2,fals:2,on_messag:2,perimeter_onli:2,lrr:2,level:2,list:2,upload:2,"try":2,emul:2,expandermessag:2,second:2,port:2,supervis:2,ad2seri:[3,2],current:2,"new":0,method:2,ser2sock:2,full:[],timeouterror:2,gener:[],usbdevic:2,entry_delay_off:2,here:3,on_config_receiv:2,address:2,path:2,valu:2,fire_alarm:2,search:[3,2],sender:0,prior:2,invalidmessageerror:2,via:2,vid:2,appli:2,filenam:2,api:3,famili:[3,2],from:2,describ:2,commun:2,is_reader_al:2,handler:0,call:[0,2],type:2,relat:2,stage_boot:2,pkei:2,flag:2,indic:[],relai:2,actual:2,cach:2,serialdevic:2,must:0,none:[0,2],retriev:2,key_f2:2,on_restor:2,restor:2,dev:2,kwarg:0,can:0,aliv:2,backlight_on:2,process:2,templat:2,high:2,cursor_loc:2,serial:2,occur:2,delai:2,progress_callback:2,secur:3,anoth:2,simulate_wire_problem:2,write:2,purg:2,instead:0,panic:2,updat:2,product:2,recogn:2,x509:2,ftdi:2,befor:2,attent:2,mai:3,data:2,github:[],classmethod:2,ssl_ca:2,issu:2,callback:2,"switch":2,ttimeout:2,socketdevic:2,disarm:2,jpath:2,through:2,paramet:2,bypass:2,on_read:2,main:2,"return":2,python:3,timestamp:2,on_bypass:2,detach:2,name:2,revert:2,on_pan:2,authent:2,stage_wait:2,mode:2,timeout:2,found:[3,2],earg:0,nodeviceerror:2,"static":2,connect:2,our:2,read_lin:2,event:[],ad2pi:[3,2],reboot:2,content:3,reader:2,factori:2,written:2,standard:2,on_clos:2,base:[0,2],dictionari:2,"byte":2,armed_hom:2,on_detach:2,key_f4:2,key_f1:2,nutechsoftwar:[],key_f3:2,emulate_relai:2,openssl:2,readthread:2,get_config:2,on_rfx_messag:2,find_al:2,ad2usb:[3,2],first:2,oper:0,rang:2,number:2,on_writ:2,configbit:2,open:2,on_power_chang:2,differ:2,associ:2,interact:3,system:2,wrapper:2,attach:2,start_detect:2,on_open:2,battery_low:2,specifi:2,rfmessag:2,on_fir:2,provid:[3,2],remov:[0,2],charact:2,project:3,str:[],save_config:2,ani:2,bitfield:2,raw:2,on_fault:2,expir:2,programming_mod:2,also:[0,2],exampl:3,which:2,event_data:2,channel:2,zone_bypass:2,index:3,pyftdi:2,object:[0,2],most:2,detect:2,basemessag:2,"class":[0,2],armed_awai:2,doc:0,clear:2,request:2,emulate_lrr:2,on_low_batteri:2,text:2,ssl_kei:2,radio:2,find:2,locat:2,configur:2,solut:2,fault_zon:2,should:2,serial_numb:2,stop:2,ssl:2,report:2,requir:[3,2],enabl:2,rfx:[],whether:2,common:2,partit:2,contain:2,alarm_event_occur:2,certif:2,set:2,keypad:2,ac_pow:2,on_alarm:2,perimet:2,arg:0,close:2,arm:2,stop_read:2,pyseri:2,statu:2,wire:2,parent:[],pattern:2,state:2,between:2,progress:2,awai:2,kei:2,numer:2,last:2,fault:2,com:[],batteri:2,identif:2,detectthread:2,been:2,beep:2,trigger:2,no_reader_thread:2,fire:[0,2],commerror:2,chime_on:2,convert:2,func:0,present:2,sound:2,check_zon:2,dedupl:2,cursor:2,defin:0,"while":2,stage_upload:2,error:2,loop:2,readi:2,itself:0,ftdi_vendor_id:2,on_zone_fault:2,alarm_sound:2,panel_data:2,author:2,receiv:2,belong:2,handl:2,decod:[3,2],status:2,finish:2,http:[],expans:2,rais:2,user:2,expand:2,lower:2,entri:2,client:2,thi:[3,2],usual:2,boot:2,human:2,baudrat:2,expos:2,field:2,"_on_open":2,except:2,on_attach:2,add:0,board:2,match:2,vendor:2,around:2,format:2,read:2,numeric_cod:2,lcd:2,bit:2,ad2:[3,2],like:0,singl:2,page:3,www:[],crypto:2,thread:2,toctre:[],fire_timeout:2,home:2,librari:3,buffer:2,localhost:2,run:2,power:2,event_typ:2,stage_load:2,ssl_certif:2,usb:2,expander_to_zon:2,simul:2,stage_start:2,includ:3,address_mask:2,"float":2,automat:2,chime:2,support:[3,2],on_relay_chang:2,"long":2,start:2,interfac:2,low:2,stop_detect:2,"function":[0,2],tupl:2,eventhandl:0,line:2,emulate_zon:2,"default":2,displai:2,purge_buff:2,alarm:[3,2],"int":2,mask:2,pid:2,repres:2,on_zone_restor:2,exist:0,read_timeout:2,ftdi_product_id:2,check:2,battery_timeout:2,when:2,invalid:2,on_disarm:2,bool:2,you:0,maxdepth:[],intend:2,firmwar:2,track:2,on_arm:2,descript:2,lrrmessag:2,on_lrr_messag:2,obj:0},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:exception","5":"py:classmethod","6":"py:staticmethod"},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","exception","Python exception"],"5":["py","classmethod","Python class method"],"6":["py","staticmethod","Python static method"]},filenames:["alarmdecoder.event","modules","alarmdecoder","index"],titles:["event Package","alarmdecoder","alarmdecoder Package","Welcome to alarmdecoder’s documentation!"],objects:{"alarmdecoder.messages.LRRMessage":{partition:[2,3,1,""],event_data:[2,3,1,""],event_type:[2,3,1,""]},"alarmdecoder.messages.BaseMessage":{raw:[2,3,1,""]},"alarmdecoder.messages.ExpanderMessage":{RELAY:[2,3,1,""],ZONE:[2,3,1,""],value:[2,3,1,""],address:[2,3,1,""],type:[2,3,1,""],channel:[2,3,1,""]},"alarmdecoder.event.event":{EventHandler:[0,1,1,""],Event:[0,1,1,""]},"alarmdecoder.zonetracking.Zone":{status:[2,3,1,""],STATUS:[2,3,1,""],name:[2,3,1,""],zone:[2,3,1,""],timestamp:[2,3,1,""],CLEAR:[2,3,1,""],FAULT:[2,3,1,""],CHECK:[2,3,1,""]},"alarmdecoder.devices.SerialDevice":{read_line:[2,2,1,""],BAUDRATE:[2,3,1,""],read:[2,2,1,""],write:[2,2,1,""],find_all:[2,6,1,""],"interface":[2,3,1,""],close:[2,2,1,""],open:[2,2,1,""]},"alarmdecoder.zonetracking":{Zonetracker:[2,1,1,""],Zone:[2,1,1,""]},"alarmdecoder.zonetracking.Zonetracker":{faulted:[2,3,1,""],on_restore:[2,3,1,""],update:[2,2,1,""],zones:[2,3,1,""],on_fault:[2,3,1,""],EXPIRE:[2,3,1,""],expander_to_zone:[2,2,1,""]},"alarmdecoder.devices.Device.ReadThread":{READ_TIMEOUT:[2,3,1,""],stop:[2,2,1,""],run:[2,2,1,""]},"alarmdecoder.event":{event:[0,0,1,""]},"alarmdecoder.messages":{Message:[2,1,1,""],LRRMessage:[2,1,1,""],RFMessage:[2,1,1,""],ExpanderMessage:[2,1,1,""],BaseMessage:[2,1,1,""]},"alarmdecoder.devices":{Device:[2,1,1,""],SocketDevice:[2,1,1,""],USBDevice:[2,1,1,""],SerialDevice:[2,1,1,""]},"alarmdecoder.devices.USBDevice.DetectThread":{stop:[2,2,1,""],run:[2,2,1,""],on_attached:[2,3,1,""],on_detached:[2,3,1,""]},alarmdecoder:{zonetracking:[2,0,1,""],messages:[2,0,1,""],devices:[2,0,1,""],util:[2,0,1,""],decoder:[2,0,1,""],panels:[2,0,1,""],event:[0,0,1,""]},"alarmdecoder.decoder.AlarmDecoder":{configbits:[2,3,1,""],on_rfx_message:[2,3,1,""],fault_zone:[2,2,1,""],on_open:[2,3,1,""],save_config:[2,2,1,""],on_alarm:[2,3,1,""],on_arm:[2,3,1,""],on_boot:[2,3,1,""],fire_timeout:[2,3,1,""],close:[2,2,1,""],open:[2,2,1,""],id:[2,3,1,""],on_power_changed:[2,3,1,""],BATTERY_TIMEOUT:[2,3,1,""],KEY_F1:[2,3,1,""],KEY_F2:[2,3,1,""],KEY_F3:[2,3,1,""],on_message:[2,3,1,""],reboot:[2,2,1,""],send:[2,2,1,""],on_zone_restore:[2,3,1,""],on_disarm:[2,3,1,""],on_fire:[2,3,1,""],on_write:[2,3,1,""],on_read:[2,3,1,""],on_lrr_message:[2,3,1,""],KEY_F4:[2,3,1,""],clear_zone:[2,2,1,""],on_zone_fault:[2,3,1,""],on_config_received:[2,3,1,""],FIRE_TIMEOUT:[2,3,1,""],on_close:[2,3,1,""],on_bypass:[2,3,1,""],address:[2,3,1,""],battery_timeout:[2,3,1,""],on_panic:[2,3,1,""],on_relay_changed:[2,3,1,""],on_low_battery:[2,3,1,""],emulate_lrr:[2,3,1,""],deduplicate:[2,3,1,""],emulate_zone:[2,3,1,""],get_config:[2,2,1,""],address_mask:[2,3,1,""],emulate_relay:[2,3,1,""]},"alarmdecoder.devices.SocketDevice":{ssl_certificate:[2,3,1,""],ssl_key:[2,3,1,""],read:[2,2,1,""],ssl_ca:[2,3,1,""],read_line:[2,2,1,""],ssl:[2,3,1,""],write:[2,2,1,""],"interface":[2,3,1,""],close:[2,2,1,""],open:[2,2,1,""]},"alarmdecoder.devices.USBDevice":{write:[2,2,1,""],BAUDRATE:[2,3,1,""],description:[2,3,1,""],read:[2,2,1,""],DetectThread:[2,1,1,""],stop_detection:[2,5,1,""],devices:[2,5,1,""],start_detection:[2,5,1,""],read_line:[2,2,1,""],find_all:[2,5,1,""],FTDI_VENDOR_ID:[2,3,1,""],serial_number:[2,3,1,""],"interface":[2,3,1,""],close:[2,2,1,""],FTDI_PRODUCT_ID:[2,3,1,""],open:[2,2,1,""],find:[2,5,1,""]},"alarmdecoder.messages.Message":{backlight_on:[2,3,1,""],alarm_event_occurred:[2,3,1,""],programming_mode:[2,3,1,""],text:[2,3,1,""],bitfield:[2,3,1,""],armed_home:[2,3,1,""],alarm_sounding:[2,3,1,""],ready:[2,3,1,""],zone_bypassed:[2,3,1,""],panel_data:[2,3,1,""],check_zone:[2,3,1,""],numeric_code:[2,3,1,""],battery_low:[2,3,1,""],chime_on:[2,3,1,""],entry_delay_off:[2,3,1,""],perimeter_only:[2,3,1,""],fire_alarm:[2,3,1,""],ac_power:[2,3,1,""],beeps:[2,3,1,""],mask:[2,3,1,""],armed_away:[2,3,1,""],cursor_location:[2,3,1,""]},"alarmdecoder.devices.Device":{stop_reader:[2,2,1,""],on_open:[2,3,1,""],on_write:[2,3,1,""],ReadThread:[2,1,1,""],on_close:[2,3,1,""],on_read:[2,3,1,""],close:[2,2,1,""],is_reader_alive:[2,2,1,""],id:[2,3,1,""]},"alarmdecoder.messages.RFMessage":{battery:[2,3,1,""],value:[2,3,1,""],loop:[2,3,1,""],supervision:[2,3,1,""],serial_number:[2,3,1,""]},"alarmdecoder.decoder":{AlarmDecoder:[2,1,1,""]},"alarmdecoder.event.event.EventHandler":{fire:[0,2,1,""],add:[0,2,1,""],remove:[0,2,1,""]},"alarmdecoder.util.Firmware":{STAGE_LOAD:[2,3,1,""],upload:[2,6,1,""],STAGE_BOOT:[2,3,1,""],STAGE_START:[2,3,1,""],STAGE_UPLOADING:[2,3,1,""],STAGE_WAITING:[2,3,1,""],STAGE_DONE:[2,3,1,""]},"alarmdecoder.util":{CommError:[2,4,1,""],Firmware:[2,1,1,""],TimeoutError:[2,4,1,""],NoDeviceError:[2,4,1,""],InvalidMessageError:[2,4,1,""]}},titleterms:{subpackag:[],alarmdecod:[3,1,2],welcom:3,modul:[0,2],devic:2,zonetrack:2,util:2,packag:[0,2],messag:2,indic:3,tabl:3,document:3,event:0,panel:2}}) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index e06150d..8c2a7eb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -123,7 +123,7 @@ html_theme = 'default' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ['static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. diff --git a/docs/index.rst b/docs/index.rst index 41929e0..1cc583f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,9 +4,18 @@ contain the root `toctree` directive. Welcome to alarmdecoder's documentation! -==================================== +======================================== -Contents: +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 + +Table of Contents: .. toctree:: :maxdepth: 4