Browse Source

Ridiculous amount of documentation updates.

pyserial_fix
Scott Petersen 11 years ago
parent
commit
99f203db97
24 changed files with 2065 additions and 678 deletions
  1. +11
    -6
      README.md
  2. +95
    -77
      alarmdecoder/decoder.py
  3. +108
    -95
      alarmdecoder/devices.py
  4. +58
    -45
      alarmdecoder/messages.py
  5. +8
    -6
      alarmdecoder/util.py
  6. +73
    -22
      alarmdecoder/zonetracking.py
  7. +17
    -16
      docs/alarmdecoder.rst
  8. BIN
      docs/build/doctrees/alarmdecoder.doctree
  9. BIN
      docs/build/doctrees/environment.pickle
  10. BIN
      docs/build/doctrees/index.doctree
  11. +1
    -1
      docs/build/html/.buildinfo
  12. +677
    -0
      docs/build/html/_modules/alarmdecoder/decoder.html
  13. +2
    -1
      docs/build/html/_modules/index.html
  14. +17
    -16
      docs/build/html/_sources/alarmdecoder.txt
  15. +11
    -2
      docs/build/html/_sources/index.txt
  16. +710
    -339
      docs/build/html/alarmdecoder.html
  17. +250
    -25
      docs/build/html/genindex.html
  18. +6
    -12
      docs/build/html/index.html
  19. +3
    -11
      docs/build/html/modules.html
  20. BIN
      docs/build/html/objects.inv
  21. +5
    -0
      docs/build/html/py-modindex.html
  22. +1
    -1
      docs/build/html/searchindex.js
  23. +1
    -1
      docs/conf.py
  24. +11
    -2
      docs/index.rst

+ 11
- 6
README.md View File

@@ -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


+ 95
- 77
alarmdecoder/decoder.py View File

@@ -1,5 +1,7 @@
"""
Provides the full AlarmDecoder class.
Provides the main AlarmDecoder class.

.. _Alarm Decoder: http://www.alarmdecoder.com

.. moduleauthor:: Scott Petersen <scott@nutech.com>
"""
@@ -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.


+ 108
- 95
alarmdecoder/devices.py View File

@@ -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 <scott@nutech.com>
"""
@@ -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:


+ 58
- 45
alarmdecoder/messages.py View File

@@ -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 <scott@nutech.com>
"""

@@ -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


+ 8
- 6
alarmdecoder/util.py View File

@@ -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 <scott@nutech.com>
"""
@@ -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():


+ 73
- 22
alarmdecoder/zonetracking.py View File

@@ -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 <scott@nutech.com>
"""
@@ -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

+ 17
- 16
docs/alarmdecoder.rst View File

@@ -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


BIN
docs/build/doctrees/alarmdecoder.doctree View File


BIN
docs/build/doctrees/environment.pickle View File


BIN
docs/build/doctrees/index.doctree View File


+ 1
- 1
docs/build/html/.buildinfo View File

@@ -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

+ 677
- 0
docs/build/html/_modules/alarmdecoder/decoder.html View File

@@ -0,0 +1,677 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>alarmdecoder.decoder &mdash; alarmdecoder documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<link rel="top" title="alarmdecoder documentation" href="../../index.html" />
<link rel="up" title="Module code" href="../index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">alarmdecoder documentation</a> &raquo;</li>
<li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
</ul>
</div>

<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for alarmdecoder.decoder</h1><div class="highlight"><pre>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Provides the full AlarmDecoder class.</span>

<span class="sd">.. moduleauthor:: Scott Petersen &lt;scott@nutech.com&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>

<span class="kn">import</span> <span class="nn">time</span>

<span class="kn">from</span> <span class="nn">.event</span> <span class="kn">import</span> <span class="n">event</span>
<span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">InvalidMessageError</span>
<span class="kn">from</span> <span class="nn">.messages</span> <span class="kn">import</span> <span class="n">Message</span><span class="p">,</span> <span class="n">ExpanderMessage</span><span class="p">,</span> <span class="n">RFMessage</span><span class="p">,</span> <span class="n">LRRMessage</span>
<span class="kn">from</span> <span class="nn">.zonetracking</span> <span class="kn">import</span> <span class="n">Zonetracker</span>


<div class="viewcode-block" id="AlarmDecoder"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder">[docs]</a><span class="k">class</span> <span class="nc">AlarmDecoder</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> High-level wrapper around Alarm Decoder (AD2) devices.</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="c"># High-level Events</span>
<span class="n">on_arm</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the panel is armed.&#39;</span><span class="p">)</span>
<span class="n">on_disarm</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the panel is disarmed.&#39;</span><span class="p">)</span>
<span class="n">on_power_changed</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when panel power switches between AC and DC.&#39;</span><span class="p">)</span>
<span class="n">on_alarm</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the alarm is triggered.&#39;</span><span class="p">)</span>
<span class="n">on_fire</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when a fire is detected.&#39;</span><span class="p">)</span>
<span class="n">on_bypass</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when a zone is bypassed.&#39;</span><span class="p">)</span>
<span class="n">on_boot</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device finishes bootings.&#39;</span><span class="p">)</span>
<span class="n">on_config_received</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device receives its configuration.&#39;</span><span class="p">)</span>
<span class="n">on_zone_fault</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device detects a zone fault.&#39;</span><span class="p">)</span>
<span class="n">on_zone_restore</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device detects that a fault is restored.&#39;</span><span class="p">)</span>
<span class="n">on_low_battery</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device detects a low battery.&#39;</span><span class="p">)</span>
<span class="n">on_panic</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device detects a panic.&#39;</span><span class="p">)</span>
<span class="n">on_relay_changed</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when a relay is opened or closed on an expander board.&#39;</span><span class="p">)</span>

<span class="c"># Mid-level Events</span>
<span class="n">on_message</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when a message has been received from the device.&#39;</span><span class="p">)</span>
<span class="n">on_lrr_message</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when an LRR message is received.&#39;</span><span class="p">)</span>
<span class="n">on_rfx_message</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when an RFX message is received.&#39;</span><span class="p">)</span>

<span class="c"># Low-level Events</span>
<span class="n">on_open</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device has been opened.&#39;</span><span class="p">)</span>
<span class="n">on_close</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when the device has been closed.&#39;</span><span class="p">)</span>
<span class="n">on_read</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when a line has been read from the device.&#39;</span><span class="p">)</span>
<span class="n">on_write</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">Event</span><span class="p">(</span><span class="s">&#39;Called when data has been written to the device.&#39;</span><span class="p">)</span>

<span class="c"># Constants</span>
<span class="n">KEY_F1</span> <span class="o">=</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Represents panel function key #1&quot;&quot;&quot;</span>
<span class="n">KEY_F2</span> <span class="o">=</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Represents panel function key #2&quot;&quot;&quot;</span>
<span class="n">KEY_F3</span> <span class="o">=</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Represents panel function key #3&quot;&quot;&quot;</span>
<span class="n">KEY_F4</span> <span class="o">=</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="nb">unichr</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Represents panel function key #4&quot;&quot;&quot;</span>

<span class="n">BATTERY_TIMEOUT</span> <span class="o">=</span> <span class="mi">30</span>
<span class="sd">&quot;&quot;&quot;Timeout before the battery status reverts.&quot;&quot;&quot;</span>
<span class="n">FIRE_TIMEOUT</span> <span class="o">=</span> <span class="mi">30</span>
<span class="sd">&quot;&quot;&quot;Timeout before the fire status reverts.&quot;&quot;&quot;</span>

<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">device</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Constructor</span>

<span class="sd"> :param device: The low-level device used for this Alarm Decoder</span>
<span class="sd"> interface.</span>
<span class="sd"> :type device: Device</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span> <span class="o">=</span> <span class="n">device</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zonetracker</span> <span class="o">=</span> <span class="n">Zonetracker</span><span class="p">()</span>

<span class="bp">self</span><span class="o">.</span><span class="n">_battery_timeout</span> <span class="o">=</span> <span class="n">AlarmDecoder</span><span class="o">.</span><span class="n">BATTERY_TIMEOUT</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fire_timeout</span> <span class="o">=</span> <span class="n">AlarmDecoder</span><span class="o">.</span><span class="n">FIRE_TIMEOUT</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_power_status</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_alarm_status</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_bypass_status</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_armed_status</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fire_status</span> <span class="o">=</span> <span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_battery_status</span> <span class="o">=</span> <span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_panic_status</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_relay_status</span> <span class="o">=</span> <span class="p">{}</span>

<span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="mi">18</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configbits</span> <span class="o">=</span> <span class="mh">0xFF00</span>
<span class="bp">self</span><span class="o">.</span><span class="n">address_mask</span> <span class="o">=</span> <span class="mh">0x00000000</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_zone</span> <span class="o">=</span> <span class="p">[</span><span class="bp">False</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">)]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_relay</span> <span class="o">=</span> <span class="p">[</span><span class="bp">False</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">)]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="o">=</span> <span class="bp">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="o">=</span> <span class="bp">False</span>

<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Support for context manager __enter__.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span>

<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Support for context manager __exit__.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

<span class="k">return</span> <span class="bp">False</span>

<span class="nd">@property</span>
<div class="viewcode-block" id="AlarmDecoder.id"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.id">[docs]</a> <span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The ID of the Alarm Decoder device.</span>

<span class="sd"> :returns: The identification string for the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">id</span>
</div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">battery_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieves the timeout for restoring the battery status, in seconds.</span>

<span class="sd"> :returns: The battery status timeout</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_battery_timeout</span>

<span class="nd">@battery_timeout.setter</span>
<div class="viewcode-block" id="AlarmDecoder.battery_timeout"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.battery_timeout">[docs]</a> <span class="k">def</span> <span class="nf">battery_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets the timeout for restoring the battery status, in seconds.</span>

<span class="sd"> :param value: The timeout in seconds.</span>
<span class="sd"> :type value: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_battery_timeout</span> <span class="o">=</span> <span class="n">value</span>
</div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">fire_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieves the timeout for restoring the fire status, in seconds.</span>

<span class="sd"> :returns: The fire status timeout</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fire_timeout</span>

<span class="nd">@fire_timeout.setter</span>
<div class="viewcode-block" id="AlarmDecoder.fire_timeout"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.fire_timeout">[docs]</a> <span class="k">def</span> <span class="nf">fire_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets the timeout for restoring the fire status, in seconds.</span>

<span class="sd"> :param value: The timeout in seconds.</span>
<span class="sd"> :type value: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fire_timeout</span> <span class="o">=</span> <span class="n">value</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.open"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.open">[docs]</a> <span class="k">def</span> <span class="nf">open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">baudrate</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">no_reader_thread</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Opens the device.</span>

<span class="sd"> :param baudrate: The baudrate used for the device.</span>
<span class="sd"> :type baudrate: int</span>
<span class="sd"> :param no_reader_thread: Specifies whether or not the automatic reader</span>
<span class="sd"> thread should be started or not</span>
<span class="sd"> :type no_reader_thread: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_wire_events</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">baudrate</span><span class="o">=</span><span class="n">baudrate</span><span class="p">,</span> <span class="n">no_reader_thread</span><span class="o">=</span><span class="n">no_reader_thread</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.close"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Closes the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_device</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span> <span class="o">=</span> <span class="bp">None</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.send"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.send">[docs]</a> <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sends data to the Alarm Decoder device.</span>

<span class="sd"> :param data: The data to send.</span>
<span class="sd"> :type data: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.get_config"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.get_config">[docs]</a> <span class="k">def</span> <span class="nf">get_config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieves the configuration from the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">&quot;C</span><span class="se">\r</span><span class="s">&quot;</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.save_config"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.save_config">[docs]</a> <span class="k">def</span> <span class="nf">save_config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets configuration entries on the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">config_string</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="n">config_entries</span> <span class="o">=</span> <span class="p">[]</span>

<span class="c"># HACK: This is ugly.. but I can&#39;t think of an elegant way of doing it.</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;ADDRESS&#39;</span><span class="p">,</span>
<span class="s">&#39;{0}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)))</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;CONFIGBITS&#39;</span><span class="p">,</span>
<span class="s">&#39;{0:x}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">configbits</span><span class="p">)))</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;MASK&#39;</span><span class="p">,</span>
<span class="s">&#39;{0:x}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address_mask</span><span class="p">)))</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;EXP&#39;</span><span class="p">,</span>
<span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">&#39;Y&#39;</span> <span class="k">if</span> <span class="n">z</span> <span class="k">else</span> <span class="s">&#39;N&#39;</span> <span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_zone</span><span class="p">])))</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;REL&#39;</span><span class="p">,</span>
<span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">&#39;Y&#39;</span> <span class="k">if</span> <span class="n">r</span> <span class="k">else</span> <span class="s">&#39;N&#39;</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_relay</span><span class="p">])))</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;LRR&#39;</span><span class="p">,</span>
<span class="s">&#39;Y&#39;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="k">else</span> <span class="s">&#39;N&#39;</span><span class="p">))</span>
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;DEDUPLICATE&#39;</span><span class="p">,</span>
<span class="s">&#39;Y&#39;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="k">else</span> <span class="s">&#39;N&#39;</span><span class="p">))</span>

<span class="n">config_string</span> <span class="o">=</span> <span class="s">&#39;&amp;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">&#39;=&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">config_entries</span><span class="p">])</span>

<span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">&quot;C{0}</span><span class="se">\r</span><span class="s">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">config_string</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.reboot"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.reboot">[docs]</a> <span class="k">def</span> <span class="nf">reboot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reboots the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">&#39;=&#39;</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.fault_zone"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.fault_zone">[docs]</a> <span class="k">def</span> <span class="nf">fault_zone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">,</span> <span class="n">simulate_wire_problem</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Faults a zone if we are emulating a zone expander.</span>

<span class="sd"> :param zone: The zone to fault.</span>
<span class="sd"> :type zone: int</span>
<span class="sd"> :param simulate_wire_problem: Whether or not to simulate a wire fault.</span>
<span class="sd"> :type simulate_wire_problem: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="c"># Allow ourselves to also be passed an address/channel combination</span>
<span class="c"># for zone expanders.</span>
<span class="c">#</span>
<span class="c"># Format (expander index, channel)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">expander_idx</span><span class="p">,</span> <span class="n">channel</span> <span class="o">=</span> <span class="n">zone</span>

<span class="n">zone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zonetracker</span><span class="o">.</span><span class="n">expander_to_zone</span><span class="p">(</span><span class="n">expander_idx</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span>

<span class="n">status</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">simulate_wire_problem</span> <span class="k">else</span> <span class="mi">1</span>

<span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">&quot;L{0:02}{1}</span><span class="se">\r</span><span class="s">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">status</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="AlarmDecoder.clear_zone"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.clear_zone">[docs]</a> <span class="k">def</span> <span class="nf">clear_zone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Clears a zone if we are emulating a zone expander.</span>

<span class="sd"> :param zone: The zone to clear.</span>
<span class="sd"> :type zone: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">&quot;L{0:02}0</span><span class="se">\r</span><span class="s">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">zone</span><span class="p">))</span>
</div>
<span class="k">def</span> <span class="nf">_wire_events</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Wires up the internal device events.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">on_open</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_open</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">on_close</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_close</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">on_read</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_read</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_device</span><span class="o">.</span><span class="n">on_write</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_write</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zonetracker</span><span class="o">.</span><span class="n">on_fault</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_zone_fault</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zonetracker</span><span class="o">.</span><span class="n">on_restore</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_zone_restore</span>

<span class="k">def</span> <span class="nf">_handle_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parses messages from the panel.</span>

<span class="sd"> :param data: Panel data to parse.</span>
<span class="sd"> :type data: str</span>

<span class="sd"> :returns: An object representing the message.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">InvalidMessageError</span><span class="p">()</span>

<span class="n">msg</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">]</span>

<span class="k">if</span> <span class="n">header</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;!&#39;</span> <span class="ow">or</span> <span class="n">header</span> <span class="o">==</span> <span class="s">&#39;!KPE&#39;</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">Message</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">address_mask</span> <span class="o">&amp;</span> <span class="n">msg</span><span class="o">.</span><span class="n">mask</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_internal_states</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>

<span class="k">elif</span> <span class="n">header</span> <span class="o">==</span> <span class="s">&#39;!EXP&#39;</span> <span class="ow">or</span> <span class="n">header</span> <span class="o">==</span> <span class="s">&#39;!REL&#39;</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">ExpanderMessage</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="bp">self</span><span class="o">.</span><span class="n">_update_internal_states</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>

<span class="k">elif</span> <span class="n">header</span> <span class="o">==</span> <span class="s">&#39;!RFX&#39;</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_rfx</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="k">elif</span> <span class="n">header</span> <span class="o">==</span> <span class="s">&#39;!LRR&#39;</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_lrr</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="k">elif</span> <span class="n">data</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;!Ready&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_boot</span><span class="p">()</span>

<span class="k">elif</span> <span class="n">data</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;!CONFIG&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_config</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="k">return</span> <span class="n">msg</span>

<span class="k">def</span> <span class="nf">_handle_rfx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle RF messages.</span>

<span class="sd"> :param data: RF message to parse.</span>
<span class="sd"> :type data: str</span>

<span class="sd"> :returns: An object representing the RF message.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">RFMessage</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="bp">self</span><span class="o">.</span><span class="n">on_rfx_message</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>

<span class="k">return</span> <span class="n">msg</span>

<span class="k">def</span> <span class="nf">_handle_lrr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle Long Range Radio messages.</span>

<span class="sd"> :param data: LRR message to parse.</span>
<span class="sd"> :type data: str</span>

<span class="sd"> :returns: An object representing the LRR message.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">LRRMessage</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">event_type</span> <span class="o">==</span> <span class="s">&#39;ALARM_PANIC&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_panic_status</span> <span class="o">=</span> <span class="bp">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_panic</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">elif</span> <span class="n">msg</span><span class="o">.</span><span class="n">event_type</span> <span class="o">==</span> <span class="s">&#39;CANCEL&#39;</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_panic_status</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_panic_status</span> <span class="o">=</span> <span class="bp">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_panic</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>

<span class="bp">self</span><span class="o">.</span><span class="n">on_lrr_message</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>

<span class="k">return</span> <span class="n">msg</span>

<span class="k">def</span> <span class="nf">_handle_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handles received configuration data.</span>

<span class="sd"> :param data: Configuration string to parse.</span>
<span class="sd"> :type data: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_</span><span class="p">,</span> <span class="n">config_string</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;&gt;&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">setting</span> <span class="ow">in</span> <span class="n">config_string</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;&amp;&#39;</span><span class="p">):</span>
<span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="o">=</span> <span class="n">setting</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;=&#39;</span><span class="p">)</span>

<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;ADDRESS&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;CONFIGBITS&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configbits</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;MASK&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">address_mask</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;EXP&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_zone</span> <span class="o">=</span> <span class="p">[</span><span class="n">val</span><span class="p">[</span><span class="n">z</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;Y&#39;</span> <span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">)]</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;REL&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_relay</span> <span class="o">=</span> <span class="p">[</span><span class="n">val</span><span class="p">[</span><span class="n">r</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;Y&#39;</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">)]</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;LRR&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="o">=</span> <span class="p">(</span><span class="n">val</span> <span class="o">==</span> <span class="s">&#39;Y&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;DEDUPLICATE&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="o">=</span> <span class="p">(</span><span class="n">val</span> <span class="o">==</span> <span class="s">&#39;Y&#39;</span><span class="p">)</span>

<span class="bp">self</span><span class="o">.</span><span class="n">on_config_received</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">_update_internal_states</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Updates internal device states.</span>

<span class="sd"> :param message: Message to update internal states with.</span>
<span class="sd"> :type message: Message, ExpanderMessage, LRRMessage, or RFMessage</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_power_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_alarm_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone_bypass_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_armed_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_battery_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_fire_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>

<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ExpanderMessage</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_expander_status</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>

<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone_tracker</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_update_power_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the AC power state.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: Message</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">ac_power</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_power_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_power_status</span><span class="p">,</span> <span class="n">old_status</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">ac_power</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_power_status</span>

<span class="k">if</span> <span class="n">old_status</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_power_changed</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_power_status</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_power_status</span>

<span class="k">def</span> <span class="nf">_update_alarm_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the alarm state.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: Message</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">alarm_sounding</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_alarm_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_alarm_status</span><span class="p">,</span> <span class="n">old_status</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">alarm_sounding</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_alarm_status</span>

<span class="k">if</span> <span class="n">old_status</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_alarm</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_alarm_status</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_alarm_status</span>

<span class="k">def</span> <span class="nf">_update_zone_bypass_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the zone bypass state.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: Message</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">zone_bypassed</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bypass_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_bypass_status</span><span class="p">,</span> <span class="n">old_status</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">zone_bypassed</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bypass_status</span>

<span class="k">if</span> <span class="n">old_status</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_bypass</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_bypass_status</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bypass_status</span>

<span class="k">def</span> <span class="nf">_update_armed_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the armed state.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: Message</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="n">message_status</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">armed_away</span> <span class="o">|</span> <span class="n">message</span><span class="o">.</span><span class="n">armed_home</span>
<span class="k">if</span> <span class="n">message_status</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_armed_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_armed_status</span><span class="p">,</span> <span class="n">old_status</span> <span class="o">=</span> <span class="n">message_status</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_armed_status</span>

<span class="k">if</span> <span class="n">old_status</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_armed_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_arm</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_disarm</span><span class="p">()</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_armed_status</span>

<span class="k">def</span> <span class="nf">_update_battery_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the battery state.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: Message</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="n">last_status</span><span class="p">,</span> <span class="n">last_update</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_battery_status</span>
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">battery_low</span> <span class="o">==</span> <span class="n">last_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_battery_status</span> <span class="o">=</span> <span class="p">(</span><span class="n">last_status</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">battery_low</span> <span class="ow">is</span> <span class="bp">True</span> <span class="ow">or</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&gt;</span> <span class="n">last_update</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_battery_timeout</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_battery_status</span> <span class="o">=</span> <span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">battery_low</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_low_battery</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">battery_low</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_battery_status</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">_update_fire_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the fire alarm state.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: Message</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="n">last_status</span><span class="p">,</span> <span class="n">last_update</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fire_status</span>
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">fire_alarm</span> <span class="o">==</span> <span class="n">last_status</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fire_status</span> <span class="o">=</span> <span class="p">(</span><span class="n">last_status</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">fire_alarm</span> <span class="ow">is</span> <span class="bp">True</span> <span class="ow">or</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&gt;</span> <span class="n">last_update</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fire_timeout</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fire_status</span> <span class="o">=</span> <span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">fire_alarm</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_fire</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">fire_alarm</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fire_status</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">_update_expander_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses the provided message to update the expander states.</span>

<span class="sd"> :param message: The message to use to update.</span>
<span class="sd"> :type message: ExpanderMessage</span>

<span class="sd"> :returns: Boolean indicating the new status</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">ExpanderMessage</span><span class="o">.</span><span class="n">RELAY</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_relay_status</span><span class="p">[(</span><span class="n">message</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">channel</span><span class="p">)]</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">value</span>

<span class="bp">self</span><span class="o">.</span><span class="n">on_relay_changed</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_relay_status</span><span class="p">[(</span><span class="n">message</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">channel</span><span class="p">)]</span>

<span class="k">def</span> <span class="nf">_update_zone_tracker</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Trigger an update of the zonetracker.</span>

<span class="sd"> :param message: The message to update the zonetracker with.</span>
<span class="sd"> :type message: Message, ExpanderMessage, LRRMessage, or RFMessage</span>
<span class="sd"> &quot;&quot;&quot;</span>

<span class="c"># Retrieve a list of faults.</span>
<span class="c"># NOTE: This only happens on first boot or after exiting programming mode.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">ready</span> <span class="ow">and</span> <span class="s">&quot;Hit * for faults&quot;</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">&#39;*&#39;</span><span class="p">)</span>
<span class="k">return</span>

<span class="bp">self</span><span class="o">.</span><span class="n">_zonetracker</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_on_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler for opening the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_config</span><span class="p">()</span>

<span class="bp">self</span><span class="o">.</span><span class="n">on_open</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_on_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler for closing the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_close</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_on_read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler for reading from the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_read</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>

<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_message</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;data&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>
<span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_message</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_on_write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler for writing to the device.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_write</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_on_zone_fault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler for zone faults.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_zone_fault</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_on_zone_restore</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler for zone restoration.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_zone_restore</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
</pre></div>

</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">alarmdecoder documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013, Nu Tech Software Solutions, Inc..
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
</div>
</body>
</html>

+ 2
- 1
docs/build/html/_modules/index.html View File

@@ -45,7 +45,8 @@
<div class="body">
<h1>All modules for which code is available</h1>
<ul><li><a href="alarmdecoder/devices.html">alarmdecoder.devices</a></li>
<ul><li><a href="alarmdecoder/decoder.html">alarmdecoder.decoder</a></li>
<li><a href="alarmdecoder/devices.html">alarmdecoder.devices</a></li>
<li><a href="alarmdecoder/event/event.html">alarmdecoder.event.event</a></li>
<li><a href="alarmdecoder/messages.html">alarmdecoder.messages</a></li>
<li><a href="alarmdecoder/util.html">alarmdecoder.util</a></li>


+ 17
- 16
docs/build/html/_sources/alarmdecoder.txt View File

@@ -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


+ 11
- 2
docs/build/html/_sources/index.txt View File

@@ -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 <http://github.com/nutechsoftware/alarmdecoder>`_.

.. _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


+ 710
- 339
docs/build/html/alarmdecoder.html
File diff suppressed because it is too large
View File


+ 250
- 25
docs/build/html/genindex.html View File

@@ -55,7 +55,9 @@
| <a href="#D"><strong>D</strong></a>
| <a href="#E"><strong>E</strong></a>
| <a href="#F"><strong>F</strong></a>
| <a href="#G"><strong>G</strong></a>
| <a href="#I"><strong>I</strong></a>
| <a href="#K"><strong>K</strong></a>
| <a href="#L"><strong>L</strong></a>
| <a href="#M"><strong>M</strong></a>
| <a href="#N"><strong>N</strong></a>
@@ -67,7 +69,6 @@
| <a href="#U"><strong>U</strong></a>
| <a href="#V"><strong>V</strong></a>
| <a href="#W"><strong>W</strong></a>
| <a href="#X"><strong>X</strong></a>
| <a href="#Z"><strong>Z</strong></a>
</div>
@@ -83,7 +84,17 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.messages.ExpanderMessage.address">address (alarmdecoder.messages.ExpanderMessage attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.address">address (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.messages.ExpanderMessage.address">(alarmdecoder.messages.ExpanderMessage attribute)</a>
</dt>

</dl></dd>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.address_mask">address_mask (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

@@ -95,16 +106,24 @@
</dt>

<dt><a href="alarmdecoder.html#module-alarmdecoder.devices">alarmdecoder.devices (module)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder">AlarmDecoder (class in alarmdecoder.decoder)</a>
</dt>

<dt><a href="alarmdecoder.event.html#module-alarmdecoder.event">alarmdecoder.event (module)</a>
<dt><a href="alarmdecoder.html#module-alarmdecoder.decoder">alarmdecoder.decoder (module)</a>
</dt>

<dt><a href="alarmdecoder.html#module-alarmdecoder.devices">alarmdecoder.devices (module)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.event.html#module-alarmdecoder.event">alarmdecoder.event (module)</a>
</dt>

<dt><a href="alarmdecoder.event.html#module-alarmdecoder.event.event">alarmdecoder.event.event (module)</a>
</dt>

@@ -154,9 +173,17 @@
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.battery_low">battery_low (alarmdecoder.messages.Message attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.BATTERY_TIMEOUT">BATTERY_TIMEOUT (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.battery_timeout">battery_timeout (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.SerialDevice.BAUDRATE">BAUDRATE (alarmdecoder.devices.SerialDevice attribute)</a>
</dt>

@@ -196,18 +223,26 @@
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.chime_on">chime_on (alarmdecoder.messages.Message attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.CLEAR">CLEAR (alarmdecoder.zonetracking.Zone attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.CLEAR">CLEAR (alarmdecoder.zonetracking.Zone attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.clear_zone">clear_zone() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.close">close() (alarmdecoder.devices.Device method)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.close">close() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.close">(alarmdecoder.devices.Device method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.SerialDevice.close">(alarmdecoder.devices.SerialDevice method)</a>
</dt>

@@ -225,6 +260,10 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.configbits">configbits (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.cursor_location">cursor_location (alarmdecoder.messages.Message attribute)</a>
</dt>

@@ -235,6 +274,10 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.deduplicate">deduplicate (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.USBDevice.description">description (alarmdecoder.devices.USBDevice attribute)</a>
</dt>

@@ -259,6 +302,18 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.emulate_lrr">emulate_lrr (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.emulate_relay">emulate_relay (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.emulate_zone">emulate_zone (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.entry_delay_off">entry_delay_off (alarmdecoder.messages.Message attribute)</a>
</dt>

@@ -270,12 +325,12 @@
<dt><a href="alarmdecoder.html#alarmdecoder.messages.LRRMessage.event_data">event_data (alarmdecoder.messages.LRRMessage attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.messages.LRRMessage.event_type">event_type (alarmdecoder.messages.LRRMessage attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.event.html#alarmdecoder.event.event.EventHandler">EventHandler (class in alarmdecoder.event.event)</a>
</dt>
@@ -303,6 +358,14 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.fault_zone">fault_zone() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zonetracker.faulted">faulted (alarmdecoder.zonetracking.Zonetracker attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.USBDevice.find">find() (alarmdecoder.devices.USBDevice class method)</a>
</dt>

@@ -327,6 +390,14 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.fire_timeout">fire_timeout (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.FIRE_TIMEOUT">FIRE_TIMEOUT (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware">Firmware (class in alarmdecoder.util)</a>
</dt>

@@ -341,13 +412,29 @@
</dl></td>
</tr></table>

<h2 id="G">G</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.get_config">get_config() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

</dl></td>
</tr></table>

<h2 id="I">I</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.id">id (alarmdecoder.devices.Device attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.id">id (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.id">(alarmdecoder.devices.Device attribute)</a>
</dt>

</dl></dd>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.SerialDevice.interface">interface (alarmdecoder.devices.SerialDevice attribute)</a>
</dt>
@@ -375,6 +462,30 @@
</dl></td>
</tr></table>

<h2 id="K">K</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.KEY_F1">KEY_F1 (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.KEY_F2">KEY_F2 (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.KEY_F3">KEY_F3 (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.KEY_F4">KEY_F4 (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

</dl></td>
</tr></table>

<h2 id="L">L</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
@@ -411,6 +522,10 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.name">name (alarmdecoder.zonetracking.Zone attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.util.NoDeviceError">NoDeviceError</a>
</dt>

@@ -427,11 +542,37 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_alarm">on_alarm (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_arm">on_arm (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.USBDevice.DetectThread.on_attached">on_attached (alarmdecoder.devices.USBDevice.DetectThread attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_close">on_close (alarmdecoder.devices.Device attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_boot">on_boot (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_bypass">on_bypass (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_close">on_close (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_close">(alarmdecoder.devices.Device attribute)</a>
</dt>

</dl></dd>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_config_received">on_config_received (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

@@ -439,17 +580,61 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_disarm">on_disarm (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zonetracker.on_fault">on_fault (alarmdecoder.zonetracking.Zonetracker attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_open">on_open (alarmdecoder.devices.Device attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_fire">on_fire (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_low_battery">on_low_battery (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_lrr_message">on_lrr_message (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_read">on_read (alarmdecoder.devices.Device attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_message">on_message (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_open">on_open (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_open">(alarmdecoder.devices.Device attribute)</a>
</dt>

</dl></dd>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_panic">on_panic (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_power_changed">on_power_changed (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_read">on_read (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_read">(alarmdecoder.devices.Device attribute)</a>
</dt>

</dl></dd>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_relay_changed">on_relay_changed (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

@@ -457,15 +642,37 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_write">on_write (alarmdecoder.devices.Device attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_rfx_message">on_rfx_message (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.SerialDevice.open">open() (alarmdecoder.devices.SerialDevice method)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_write">on_write (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.Device.on_write">(alarmdecoder.devices.Device attribute)</a>
</dt>

</dl></dd>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_zone_fault">on_zone_fault (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.on_zone_restore">on_zone_restore (alarmdecoder.decoder.AlarmDecoder attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.open">open() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dd><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.devices.SerialDevice.open">(alarmdecoder.devices.SerialDevice method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.SocketDevice.open">(alarmdecoder.devices.SocketDevice method)</a>
</dt>

@@ -547,6 +754,10 @@
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.reboot">reboot() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.messages.ExpanderMessage.RELAY">RELAY (alarmdecoder.messages.ExpanderMessage attribute)</a>
</dt>

@@ -575,6 +786,14 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.save_config">save_config() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.send">send() (alarmdecoder.decoder.AlarmDecoder method)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.devices.USBDevice.serial_number">serial_number (alarmdecoder.devices.USBDevice attribute)</a>
</dt>

@@ -616,12 +835,12 @@
<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware.STAGE_DONE">STAGE_DONE (alarmdecoder.util.Firmware attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware.STAGE_LOAD">STAGE_LOAD (alarmdecoder.util.Firmware attribute)</a>
</dt>

</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware.STAGE_START">STAGE_START (alarmdecoder.util.Firmware attribute)</a>
</dt>
@@ -639,6 +858,10 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.status">status (alarmdecoder.zonetracking.Zone attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.STATUS">STATUS (alarmdecoder.zonetracking.Zone attribute)</a>
</dt>

@@ -681,6 +904,10 @@
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.timestamp">timestamp (alarmdecoder.zonetracking.Zone attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.messages.ExpanderMessage.type">type (alarmdecoder.messages.ExpanderMessage attribute)</a>
</dt>

@@ -747,21 +974,15 @@
</dl></td>
</tr></table>

<h2 id="X">X</h2>
<h2 id="Z">Z</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.messages.RFMessage.x">x (alarmdecoder.messages.RFMessage attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.messages.ExpanderMessage.ZONE">ZONE (alarmdecoder.messages.ExpanderMessage attribute)</a>
</dt>

</dl></td>
</tr></table>

<h2 id="Z">Z</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="alarmdecoder.html#alarmdecoder.messages.ExpanderMessage.ZONE">ZONE (alarmdecoder.messages.ExpanderMessage attribute)</a>
<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zone.zone">zone (alarmdecoder.zonetracking.Zone attribute)</a>
</dt>

@@ -775,6 +996,10 @@
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zonetracker.zones">zones (alarmdecoder.zonetracking.Zonetracker attribute)</a>
</dt>

<dt><a href="alarmdecoder.html#alarmdecoder.zonetracking.Zonetracker">Zonetracker (class in alarmdecoder.zonetracking)</a>
</dt>



+ 6
- 12
docs/build/html/index.html View File

@@ -50,24 +50,18 @@
<div class="section" id="welcome-to-alarmdecoder-s-documentation">
<h1>Welcome to alarmdecoder&#8217;s documentation!<a class="headerlink" href="#welcome-to-alarmdecoder-s-documentation" title="Permalink to this headline">¶</a></h1>
<p>Contents:</p>
<p>This is the API documentation for the <a class="reference external" href="http://www.alarmdecoder.com">Alarm Decoder</a> Python library. It provides support for interacting with the <a class="reference external" href="http://www.alarmdecoder.com">Alarm Decoder</a> (AD2) family of security alarm devices, including the <a class="reference external" href="http://www.alarmdecoder.com">AD2USB</a>, <a class="reference external" href="http://www.alarmdecoder.com">AD2SERIAL</a> and <a class="reference external" href="http://www.alarmdecoder.com">AD2PI</a>.</p>
<p>The source code, requirements and examples for this project may be found <a class="reference external" href="http://github.com/nutechsoftware/alarmdecoder">here</a>.</p>
<p>Table of Contents:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="alarmdecoder.html">alarmdecoder Package</a><ul>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#alarmdecoder-module"><tt class="docutils literal"><span class="pre">alarmdecoder</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.decoder"><tt class="docutils literal"><span class="pre">alarmdecoder</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.devices"><tt class="docutils literal"><span class="pre">devices</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.messages"><tt class="docutils literal"><span class="pre">messages</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.zonetracking"><tt class="docutils literal"><span class="pre">zonetracking</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.panels"><tt class="docutils literal"><span class="pre">panels</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.messages"><tt class="docutils literal"><span class="pre">messages</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#subpackages">Subpackages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="alarmdecoder.event.html">event Package</a><ul>
<li class="toctree-l4"><a class="reference internal" href="alarmdecoder.event.html#id1"><tt class="docutils literal"><span class="pre">event</span></tt> Package</a></li>
<li class="toctree-l4"><a class="reference internal" href="alarmdecoder.event.html#module-alarmdecoder.event.event"><tt class="docutils literal"><span class="pre">event</span></tt> Module</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>


+ 3
- 11
docs/build/html/modules.html View File

@@ -49,20 +49,12 @@
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="alarmdecoder.html">alarmdecoder Package</a><ul>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#alarmdecoder-module"><tt class="docutils literal"><span class="pre">alarmdecoder</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.decoder"><tt class="docutils literal"><span class="pre">alarmdecoder</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.devices"><tt class="docutils literal"><span class="pre">devices</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.messages"><tt class="docutils literal"><span class="pre">messages</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.zonetracking"><tt class="docutils literal"><span class="pre">zonetracking</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.panels"><tt class="docutils literal"><span class="pre">panels</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#module-alarmdecoder.messages"><tt class="docutils literal"><span class="pre">messages</span></tt> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="alarmdecoder.html#subpackages">Subpackages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="alarmdecoder.event.html">event Package</a><ul>
<li class="toctree-l4"><a class="reference internal" href="alarmdecoder.event.html#id1"><tt class="docutils literal"><span class="pre">event</span></tt> Package</a></li>
<li class="toctree-l4"><a class="reference internal" href="alarmdecoder.event.html#module-alarmdecoder.event.event"><tt class="docutils literal"><span class="pre">event</span></tt> Module</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>


BIN
docs/build/html/objects.inv View File


+ 5
- 0
docs/build/html/py-modindex.html View File

@@ -64,6 +64,11 @@
<td>
<tt class="xref">alarmdecoder</tt></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;
<a href="alarmdecoder.html#module-alarmdecoder.decoder"><tt class="xref">alarmdecoder.decoder</tt></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;


+ 1
- 1
docs/build/html/searchindex.js
File diff suppressed because it is too large
View File


+ 1
- 1
docs/conf.py View File

@@ -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.


+ 11
- 2
docs/index.rst View File

@@ -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 <http://github.com/nutechsoftware/alarmdecoder>`_.

.. _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


Loading…
Cancel
Save