@@ -48,7 +48,9 @@ | |||||
<ul><li><a href="pyad2usb/ad2usb.html">pyad2usb.ad2usb</a></li> | <ul><li><a href="pyad2usb/ad2usb.html">pyad2usb.ad2usb</a></li> | ||||
<li><a href="pyad2usb/devices.html">pyad2usb.devices</a></li> | <li><a href="pyad2usb/devices.html">pyad2usb.devices</a></li> | ||||
<li><a href="pyad2usb/event/event.html">pyad2usb.event.event</a></li> | <li><a href="pyad2usb/event/event.html">pyad2usb.event.event</a></li> | ||||
<li><a href="pyad2usb/messages.html">pyad2usb.messages</a></li> | |||||
<li><a href="pyad2usb/util.html">pyad2usb.util</a></li> | <li><a href="pyad2usb/util.html">pyad2usb.util</a></li> | ||||
<li><a href="pyad2usb/zonetracking.html">pyad2usb.zonetracking</a></li> | |||||
</ul> | </ul> | ||||
</div> | </div> | ||||
@@ -0,0 +1,289 @@ | |||||
<!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>pyad2usb.messages — pyad2usb 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="pyad2usb 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">pyad2usb documentation</a> »</li> | |||||
<li><a href="../index.html" accesskey="U">Module code</a> »</li> | |||||
</ul> | |||||
</div> | |||||
<div class="document"> | |||||
<div class="documentwrapper"> | |||||
<div class="bodywrapper"> | |||||
<div class="body"> | |||||
<h1>Source code for pyad2usb.messages</h1><div class="highlight"><pre> | |||||
<span class="sd">"""</span> | |||||
<span class="sd">Message representations received from the panel through the AD2USB.</span> | |||||
<span class="sd">"""</span> | |||||
<span class="kn">import</span> <span class="nn">re</span> | |||||
<div class="viewcode-block" id="Message"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.messages.Message">[docs]</a><span class="k">class</span> <span class="nc">Message</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Represents a message from the alarm panel.</span> | |||||
<span class="sd"> """</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">data</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Constructor</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">ready</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">armed_away</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">armed_home</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">backlight_on</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">programming_mode</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">beeps</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">zone_bypassed</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">ac_power</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">chime_on</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">alarm_event_occurred</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">alarm_sounding</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">battery_low</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">entry_delay_off</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">fire_alarm</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">check_zone</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">perimeter_only</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">numeric_code</span> <span class="o">=</span> <span class="s">""</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s">""</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">cursor_location</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">""</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="s">""</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span> <span class="o">=</span> <span class="s">""</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">panel_data</span> <span class="o">=</span> <span class="s">""</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">'("(?:[^"]|"")*"|[^,]*),("(?:[^"]|"")*"|[^,]*),("(?:[^"]|"")*"|[^,]*),("(?:[^"]|"")*"|[^,]*)'</span><span class="p">)</span> | |||||
<span class="k">if</span> <span class="n">data</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">_parse_message</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_parse_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">"""</span> | |||||
<span class="sd"> Parse the message from the device.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">m</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_regex</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> | |||||
<span class="k">if</span> <span class="n">m</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> | |||||
<span class="k">raise</span> <span class="n">util</span><span class="o">.</span><span class="n">InvalidMessageError</span><span class="p">(</span><span class="s">'Received invalid message: {0}'</span><span class="o">.</span><span class="n">format</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">bitfield</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">numeric_code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">panel_data</span><span class="p">,</span> <span class="n">alpha</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</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">mask</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">panel_data</span><span class="p">[</span><span class="mi">3</span><span class="p">:</span><span class="mi">3</span><span class="o">+</span><span class="mi">8</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">ready</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">armed_away</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">armed_home</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">3</span><span class="p">:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">backlight_on</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">5</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">programming_mode</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">6</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">beeps</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="mi">7</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">zone_bypassed</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">7</span><span class="p">:</span><span class="mi">8</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">ac_power</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">8</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">chime_on</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">9</span><span class="p">:</span><span class="mi">10</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">alarm_event_occurred</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">10</span><span class="p">:</span><span class="mi">11</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">alarm_sounding</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">11</span><span class="p">:</span><span class="mi">12</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">battery_low</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">12</span><span class="p">:</span><span class="mi">13</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">entry_delay_off</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">13</span><span class="p">:</span><span class="mi">14</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">fire_alarm</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">14</span><span class="p">:</span><span class="mi">15</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">check_zone</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">15</span><span class="p">:</span><span class="mi">16</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">perimeter_only</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">16</span><span class="p">:</span><span class="mi">17</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||||
<span class="c"># bits 17-20 unused.</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">alpha</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s">'"'</span><span class="p">)</span> | |||||
<span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">panel_data</span><span class="p">[</span><span class="mi">19</span><span class="p">:</span><span class="mi">21</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0x01</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">cursor_location</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">21</span><span class="p">:</span><span class="mi">23</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span> <span class="c"># Alpha character index that the cursor is on.</span> | |||||
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> String conversion operator.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">return</span> <span class="s">'msg > {0:0<9} [{1}{2}{3}] -- ({4}) {5}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mask</span><span class="p">),</span> <span class="mi">1</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ready</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">armed_away</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">armed_home</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">numeric_code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> | |||||
</div> | |||||
<div class="viewcode-block" id="ExpanderMessage"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.messages.ExpanderMessage">[docs]</a><span class="k">class</span> <span class="nc">ExpanderMessage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Represents a message from a zone or relay expansion module.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">ZONE</span> <span class="o">=</span> <span class="mi">0</span> | |||||
<span class="n">RELAY</span> <span class="o">=</span> <span class="mi">1</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">data</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Constructor</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">channel</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">raw</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="k">if</span> <span class="n">data</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">_parse_message</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> String conversion operator.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">expander_type</span> <span class="o">=</span> <span class="s">'UNKWN'</span> | |||||
<span class="k">if</span> <span class="bp">self</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">ZONE</span><span class="p">:</span> | |||||
<span class="n">expander_type</span> <span class="o">=</span> <span class="s">'ZONE'</span> | |||||
<span class="k">elif</span> <span class="bp">self</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="n">expander_type</span> <span class="o">=</span> <span class="s">'RELAY'</span> | |||||
<span class="k">return</span> <span class="s">'exp > [{0: <5}] {1}/{2} -- {3}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expander_type</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="bp">self</span><span class="o">.</span><span class="n">channel</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_parse_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">"""</span> | |||||
<span class="sd"> Parse the raw message from the device.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">header</span><span class="p">,</span> <span class="n">values</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">':'</span><span class="p">)</span> | |||||
<span class="n">address</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">','</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">raw</span> <span class="o">=</span> <span class="n">data</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">channel</span> <span class="o">=</span> <span class="n">channel</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span> | |||||
<span class="k">if</span> <span class="n">header</span> <span class="o">==</span> <span class="s">'!EXP'</span><span class="p">:</span> | |||||
<span class="bp">self</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">ZONE</span> | |||||
<span class="k">elif</span> <span class="n">header</span> <span class="o">==</span> <span class="s">'!REL'</span><span class="p">:</span> | |||||
<span class="bp">self</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> | |||||
</div> | |||||
<div class="viewcode-block" id="RFMessage"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.messages.RFMessage">[docs]</a><span class="k">class</span> <span class="nc">RFMessage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Represents a message from an RF receiver.</span> | |||||
<span class="sd"> """</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">data</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Constructor</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">raw</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">serial_number</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="k">if</span> <span class="n">data</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">_parse_message</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> String conversion operator.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">return</span> <span class="s">'rf > {0}: {1}'</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">serial_number</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_parse_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">"""</span> | |||||
<span class="sd"> Parses the raw message from the device.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">raw</span> <span class="o">=</span> <span class="n">data</span> | |||||
<span class="n">_</span><span class="p">,</span> <span class="n">values</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">':'</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">serial_number</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">','</span><span class="p">)</span> | |||||
</div> | |||||
<div class="viewcode-block" id="LRRMessage"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.messages.LRRMessage">[docs]</a><span class="k">class</span> <span class="nc">LRRMessage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Represent a message from a Long Range Radio.</span> | |||||
<span class="sd"> """</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">data</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Constructor</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">raw</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_data</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_partition</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_type</span> <span class="o">=</span> <span class="bp">None</span> | |||||
<span class="k">if</span> <span class="n">data</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">_parse_message</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> String conversion operator.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">return</span> <span class="s">'lrr > {0} @ {1} -- {2}'</span><span class="o">.</span><span class="n">format</span><span class="p">()</span> | |||||
<span class="k">def</span> <span class="nf">_parse_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">"""</span> | |||||
<span class="sd"> Parses the raw message from the device.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">raw</span> <span class="o">=</span> <span class="n">data</span> | |||||
<span class="n">_</span><span class="p">,</span> <span class="n">values</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">':'</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_event_data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_partition</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_type</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">','</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">pyad2usb documentation</a> »</li> | |||||
<li><a href="../index.html" >Module code</a> »</li> | |||||
</ul> | |||||
</div> | |||||
<div class="footer"> | |||||
© Copyright 2013, Author. | |||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1. | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,368 @@ | |||||
<!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>pyad2usb.zonetracking — pyad2usb 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="pyad2usb 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">pyad2usb documentation</a> »</li> | |||||
<li><a href="../index.html" accesskey="U">Module code</a> »</li> | |||||
</ul> | |||||
</div> | |||||
<div class="document"> | |||||
<div class="documentwrapper"> | |||||
<div class="bodywrapper"> | |||||
<div class="body"> | |||||
<h1>Source code for pyad2usb.zonetracking</h1><div class="highlight"><pre> | |||||
<span class="sd">"""</span> | |||||
<span class="sd">Provides zone tracking functionality for the AD2USB device family.</span> | |||||
<span class="sd">"""</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">.</span> <span class="kn">import</span> <span class="n">messages</span> | |||||
<div class="viewcode-block" id="Zone"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.zonetracking.Zone">[docs]</a><span class="k">class</span> <span class="nc">Zone</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Representation of a panel zone.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">CLEAR</span> <span class="o">=</span> <span class="mi">0</span> | |||||
<span class="sd">"""Status indicating that the zone is cleared."""</span> | |||||
<span class="n">FAULT</span> <span class="o">=</span> <span class="mi">1</span> | |||||
<span class="sd">"""Status indicating that the zone is faulted."""</span> | |||||
<span class="n">CHECK</span> <span class="o">=</span> <span class="mi">2</span> <span class="c"># Wire fault</span> | |||||
<span class="sd">"""Status indicating that there is a wiring issue with the zone."""</span> | |||||
<span class="n">STATUS</span> <span class="o">=</span> <span class="p">{</span> <span class="n">CLEAR</span><span class="p">:</span> <span class="s">'CLEAR'</span><span class="p">,</span> <span class="n">FAULT</span><span class="p">:</span> <span class="s">'FAULT'</span><span class="p">,</span> <span class="n">CHECK</span><span class="p">:</span> <span class="s">'CHECK'</span> <span class="p">}</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">zone</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">''</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">CLEAR</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Constructor</span> | |||||
<span class="sd"> :param zone: The zone number.</span> | |||||
<span class="sd"> :type zone: int</span> | |||||
<span class="sd"> :param name: Human readable zone name.</span> | |||||
<span class="sd"> :type name: str</span> | |||||
<span class="sd"> :param status: Initial zone state.</span> | |||||
<span class="sd"> :type status: int</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">zone</span> <span class="o">=</span> <span class="n">zone</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">status</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> | |||||
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> String conversion operator.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">return</span> <span class="s">'Zone {0} {1}'</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">zone</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Human readable representation operator.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">return</span> <span class="s">'Zone({0}, {1}, ts {2})'</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">zone</span><span class="p">,</span> <span class="n">Zone</span><span class="o">.</span><span class="n">STATUS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">)</span> | |||||
</div> | |||||
<div class="viewcode-block" id="Zonetracker"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.zonetracking.Zonetracker">[docs]</a><span class="k">class</span> <span class="nc">Zonetracker</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Handles tracking of zone and their statuses.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">on_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">'Called when the device detects a zone fault.'</span><span class="p">)</span> | |||||
<span class="n">on_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">'Called when the device detects that a fault is restored.'</span><span class="p">)</span> | |||||
<span class="n">EXPIRE</span> <span class="o">=</span> <span class="mi">30</span> | |||||
<span class="sd">"""Zone expiration timeout."""</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="sd">"""</span> | |||||
<span class="sd"> Constructor</span> | |||||
<span class="sd"> """</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones</span> <span class="o">=</span> <span class="p">{}</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span> <span class="o">=</span> <span class="p">[]</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_last_zone_fault</span> <span class="o">=</span> <span class="mi">0</span> | |||||
<div class="viewcode-block" id="Zonetracker.update"><a class="viewcode-back" href="../../pyad2usb.html#pyad2usb.zonetracking.Zonetracker.update">[docs]</a> <span class="k">def</span> <span class="nf">update</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">"""</span> | |||||
<span class="sd"> Update zone statuses based on the current message.</span> | |||||
<span class="sd"> :param message: Message to use to update the zone tracking.</span> | |||||
<span class="sd"> :type message: Message or ExpanderMessage</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">zone</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</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">messages</span><span class="o">.</span><span class="n">ExpanderMessage</span><span class="p">):</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">messages</span><span class="o">.</span><span class="n">ExpanderMessage</span><span class="o">.</span><span class="n">ZONE</span><span class="p">:</span> | |||||
<span class="n">zone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expander_to_zone</span><span class="p">(</span><span class="nb">int</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="nb">int</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="n">status</span> <span class="o">=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span> | |||||
<span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> | |||||
<span class="n">status</span> <span class="o">=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">FAULT</span> | |||||
<span class="k">elif</span> <span class="nb">int</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> | |||||
<span class="n">status</span> <span class="o">=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CHECK</span> | |||||
<span class="k">try</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span> | |||||
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_add_zone</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span> | |||||
<span class="k">else</span><span class="p">:</span> | |||||
<span class="c"># Panel is ready, restore all zones.</span> | |||||
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">ready</span><span class="p">:</span> | |||||
<span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">z</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="p">):</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_last_zone_fault</span> <span class="o">=</span> <span class="mi">0</span> | |||||
<span class="c"># Process fault</span> | |||||
<span class="k">elif</span> <span class="s">"FAULT"</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">text</span> <span class="ow">or</span> <span class="n">message</span><span class="o">.</span><span class="n">check_zone</span><span class="p">:</span> | |||||
<span class="c"># Apparently this representation can be both base 10</span> | |||||
<span class="c"># or base 16, depending on where the message came</span> | |||||
<span class="c"># from.</span> | |||||
<span class="k">try</span><span class="p">:</span> | |||||
<span class="n">zone</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">numeric_code</span><span class="p">)</span> | |||||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> | |||||
<span class="n">zone</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">numeric_code</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span> | |||||
<span class="c"># Add new zones and clear expired ones.</span> | |||||
<span class="k">if</span> <span class="n">zone</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_clear_zones</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span> | |||||
<span class="k">else</span><span class="p">:</span> | |||||
<span class="n">status</span> <span class="o">=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">FAULT</span> | |||||
<span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">check_zone</span><span class="p">:</span> | |||||
<span class="n">status</span> <span class="o">=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CHECK</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_add_zone</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> | |||||
<span class="c"># Save our spot for the next message.</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_last_zone_fault</span> <span class="o">=</span> <span class="n">zone</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_clear_expired_zones</span><span class="p">()</span> | |||||
</div> | |||||
<span class="k">def</span> <span class="nf">_clear_zones</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">"""</span> | |||||
<span class="sd"> Clear all expired zones from our status list.</span> | |||||
<span class="sd"> :param zone: current zone being processed.</span> | |||||
<span class="sd"> :type zone: int</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">cleared_zones</span> <span class="o">=</span> <span class="p">[]</span> | |||||
<span class="n">found_last</span> <span class="o">=</span> <span class="n">found_new</span> <span class="o">=</span> <span class="n">at_end</span> <span class="o">=</span> <span class="bp">False</span> | |||||
<span class="c"># First pass: Find our start spot.</span> | |||||
<span class="n">it</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="p">)</span> | |||||
<span class="k">try</span><span class="p">:</span> | |||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">found_last</span><span class="p">:</span> | |||||
<span class="n">z</span> <span class="o">=</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span> | |||||
<span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_last_zone_fault</span><span class="p">:</span> | |||||
<span class="n">found_last</span> <span class="o">=</span> <span class="bp">True</span> | |||||
<span class="k">break</span> | |||||
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span> | |||||
<span class="n">at_end</span> <span class="o">=</span> <span class="bp">True</span> | |||||
<span class="c"># Continue until we find our end point and add zones in</span> | |||||
<span class="c"># between to our clear list.</span> | |||||
<span class="k">try</span><span class="p">:</span> | |||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">at_end</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">found_new</span><span class="p">:</span> | |||||
<span class="n">z</span> <span class="o">=</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span> | |||||
<span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="n">zone</span><span class="p">:</span> | |||||
<span class="n">found_new</span> <span class="o">=</span> <span class="bp">True</span> | |||||
<span class="k">break</span> | |||||
<span class="k">else</span><span class="p">:</span> | |||||
<span class="n">cleared_zones</span> <span class="o">+=</span> <span class="p">[</span><span class="n">z</span><span class="p">]</span> | |||||
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span> | |||||
<span class="k">pass</span> | |||||
<span class="c"># Second pass: roll through the list again if we didn't find</span> | |||||
<span class="c"># our end point and remove everything until we do.</span> | |||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">found_new</span><span class="p">:</span> | |||||
<span class="n">it</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="p">)</span> | |||||
<span class="k">try</span><span class="p">:</span> | |||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">found_new</span><span class="p">:</span> | |||||
<span class="n">z</span> <span class="o">=</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span> | |||||
<span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="n">zone</span><span class="p">:</span> | |||||
<span class="n">found_new</span> <span class="o">=</span> <span class="bp">True</span> | |||||
<span class="k">break</span> | |||||
<span class="k">else</span><span class="p">:</span> | |||||
<span class="n">cleared_zones</span> <span class="o">+=</span> <span class="p">[</span><span class="n">z</span><span class="p">]</span> | |||||
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span> | |||||
<span class="k">pass</span> | |||||
<span class="c"># Actually remove the zones and trigger the restores.</span> | |||||
<span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">z</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">cleared_zones</span><span class="p">):</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_clear_expired_zones</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Update zone status for all expired zones.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="n">zones</span> <span class="o">=</span> <span class="p">[]</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">_zones</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span> | |||||
<span class="n">zones</span> <span class="o">+=</span> <span class="p">[</span><span class="n">z</span><span class="p">]</span> | |||||
<span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="n">zones</span><span class="p">:</span> | |||||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zones</span><span class="p">[</span><span class="n">z</span><span class="p">]</span><span class="o">.</span><span class="n">status</span> <span class="o">!=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zone_expired</span><span class="p">(</span><span class="n">z</span><span class="p">):</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_update_zone</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_add_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">name</span><span class="o">=</span><span class="s">''</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Adds a zone to the internal zone list.</span> | |||||
<span class="sd"> :param zone: The zone number.</span> | |||||
<span class="sd"> :type zone: int</span> | |||||
<span class="sd"> :param name: Human readable zone name.</span> | |||||
<span class="sd"> :type name: str</span> | |||||
<span class="sd"> :param status: The zone status.</span> | |||||
<span class="sd"> :type status: int</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">zone</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zones</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones</span><span class="p">[</span><span class="n">zone</span><span class="p">]</span> <span class="o">=</span> <span class="n">Zone</span><span class="p">(</span><span class="n">zone</span><span class="o">=</span><span class="n">zone</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span> | |||||
<span class="k">if</span> <span class="n">status</span> <span class="o">!=</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">on_fault</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_update_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">status</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Updates a zones status.</span> | |||||
<span class="sd"> :param zone: The zone number.</span> | |||||
<span class="sd"> :type zone: int</span> | |||||
<span class="sd"> :param status: The zone status.</span> | |||||
<span class="sd"> :type status: int</span> | |||||
<span class="sd"> :raises: IndexError</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">zone</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zones</span><span class="p">:</span> | |||||
<span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span><span class="s">'Zone does not exist and cannot be updated: </span><span class="si">%d</span><span class="s">'</span><span class="p">,</span> <span class="n">zone</span><span class="p">)</span> | |||||
<span class="k">if</span> <span class="n">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">_zones</span><span class="p">[</span><span class="n">zone</span><span class="p">]</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">status</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones</span><span class="p">[</span><span class="n">zone</span><span class="p">]</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> | |||||
<span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="n">Zone</span><span class="o">.</span><span class="n">CLEAR</span><span class="p">:</span> | |||||
<span class="k">if</span> <span class="n">zone</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="p">:</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">_zones_faulted</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span> | |||||
<span class="bp">self</span><span class="o">.</span><span class="n">on_restore</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span> | |||||
<span class="k">def</span> <span class="nf">_zone_expired</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">"""</span> | |||||
<span class="sd"> Determine if a zone is expired or not.</span> | |||||
<span class="sd"> :param zone: The zone number.</span> | |||||
<span class="sd"> :type zone: int</span> | |||||
<span class="sd"> :returns: Whether or not the zone is expired.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="k">if</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">_zones</span><span class="p">[</span><span class="n">zone</span><span class="p">]</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">+</span> <span class="n">Zonetracker</span><span class="o">.</span><span class="n">EXPIRE</span><span class="p">:</span> | |||||
<span class="k">return</span> <span class="bp">True</span> | |||||
<span class="k">return</span> <span class="bp">False</span> | |||||
<span class="k">def</span> <span class="nf">_expander_to_zone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">address</span><span class="p">,</span> <span class="n">channel</span><span class="p">):</span> | |||||
<span class="sd">"""</span> | |||||
<span class="sd"> Convert an address and channel into a zone number.</span> | |||||
<span class="sd"> :param address: The expander address</span> | |||||
<span class="sd"> :type address: int</span> | |||||
<span class="sd"> :param channel: The channel</span> | |||||
<span class="sd"> :type channel: int</span> | |||||
<span class="sd"> :returns: The zone number associated with an address and channel.</span> | |||||
<span class="sd"> """</span> | |||||
<span class="c"># TODO: This is going to need to be reworked to support the larger</span> | |||||
<span class="c"># panels without fixed addressing on the expanders.</span> | |||||
<span class="n">idx</span> <span class="o">=</span> <span class="n">address</span> <span class="o">-</span> <span class="mi">7</span> <span class="c"># Expanders start at address 7.</span> | |||||
<span class="k">return</span> <span class="n">address</span> <span class="o">+</span> <span class="n">channel</span> <span class="o">+</span> <span class="p">(</span><span class="n">idx</span> <span class="o">*</span> <span class="mi">7</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</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">pyad2usb documentation</a> »</li> | |||||
<li><a href="../index.html" >Module code</a> »</li> | |||||
</ul> | |||||
</div> | |||||
<div class="footer"> | |||||
© Copyright 2013, Author. | |||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1. | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -1,14 +1,6 @@ | |||||
pyad2usb Package | pyad2usb Package | ||||
================ | ================ | ||||
:mod:`pyad2usb` Package | |||||
----------------------- | |||||
.. automodule:: pyad2usb.__init__ | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
:mod:`ad2usb` Module | :mod:`ad2usb` Module | ||||
-------------------- | -------------------- | ||||
@@ -33,6 +25,30 @@ pyad2usb Package | |||||
:undoc-members: | :undoc-members: | ||||
:show-inheritance: | :show-inheritance: | ||||
:mod:`zonetracking` Module | |||||
-------------------------- | |||||
.. automodule:: pyad2usb.zonetracking | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
:mod:`panels` Module | |||||
-------------------- | |||||
.. automodule:: pyad2usb.panels | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
:mod:`messages` Module | |||||
---------------------- | |||||
.. automodule:: pyad2usb.messages | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
Subpackages | Subpackages | ||||
----------- | ----------- | ||||
@@ -90,6 +90,12 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.BATTERY_TIMEOUT">BATTERY_TIMEOUT (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.devices.SerialDevice.BAUDRATE">BAUDRATE (pyad2usb.devices.SerialDevice attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.devices.SerialDevice.BAUDRATE">BAUDRATE (pyad2usb.devices.SerialDevice attribute)</a> | ||||
</dt> | </dt> | ||||
@@ -106,6 +112,20 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zone.CHECK">CHECK (pyad2usb.zonetracking.Zone attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zone.CLEAR">CLEAR (pyad2usb.zonetracking.Zone attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.clear_zone">clear_zone() (pyad2usb.ad2usb.AD2USB method)</a> | |||||
</dt> | |||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.close">close() (pyad2usb.ad2usb.AD2USB method)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.close">close() (pyad2usb.ad2usb.AD2USB method)</a> | ||||
</dt> | </dt> | ||||
@@ -131,8 +151,6 @@ | |||||
<dt><a href="pyad2usb.html#pyad2usb.util.CommError">CommError</a> | <dt><a href="pyad2usb.html#pyad2usb.util.CommError">CommError</a> | ||||
</dt> | </dt> | ||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.create">create() (pyad2usb.ad2usb.Overseer class method)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.create">create() (pyad2usb.ad2usb.Overseer class method)</a> | ||||
</dt> | </dt> | ||||
@@ -174,7 +192,11 @@ | |||||
</dl></td> | </dl></td> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.ExpanderMessage">ExpanderMessage (class in pyad2usb.ad2usb)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.messages.ExpanderMessage">ExpanderMessage (class in pyad2usb.messages)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zonetracker.EXPIRE">EXPIRE (pyad2usb.zonetracking.Zonetracker attribute)</a> | |||||
</dt> | </dt> | ||||
</dl></td> | </dl></td> | ||||
@@ -200,6 +222,16 @@ | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zone.FAULT">FAULT (pyad2usb.zonetracking.Zone attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.fault_zone">fault_zone() (pyad2usb.ad2usb.AD2USB method)</a> | |||||
</dt> | |||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.find_all">find_all() (pyad2usb.ad2usb.Overseer class method)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.find_all">find_all() (pyad2usb.ad2usb.Overseer class method)</a> | ||||
</dt> | </dt> | ||||
@@ -213,13 +245,15 @@ | |||||
</dt> | </dt> | ||||
</dl></dd> | </dl></dd> | ||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.event.html#pyad2usb.event.event.EventHandler.fire">fire() (pyad2usb.event.event.EventHandler method)</a> | <dt><a href="pyad2usb.event.html#pyad2usb.event.event.EventHandler.fire">fire() (pyad2usb.event.event.EventHandler method)</a> | ||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.FIRE_TIMEOUT">FIRE_TIMEOUT (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.util.Firmware">Firmware (class in pyad2usb.util)</a> | <dt><a href="pyad2usb.html#pyad2usb.util.Firmware">Firmware (class in pyad2usb.util)</a> | ||||
</dt> | </dt> | ||||
@@ -280,7 +314,7 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.LRRMessage">LRRMessage (class in pyad2usb.ad2usb)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.messages.LRRMessage">LRRMessage (class in pyad2usb.messages)</a> | |||||
</dt> | </dt> | ||||
</dl></td> | </dl></td> | ||||
@@ -290,7 +324,7 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.Message">Message (class in pyad2usb.ad2usb)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.messages.Message">Message (class in pyad2usb.messages)</a> | |||||
</dt> | </dt> | ||||
</dl></td> | </dl></td> | ||||
@@ -314,6 +348,10 @@ | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_arm">on_arm (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.on_attached">on_attached (pyad2usb.ad2usb.Overseer attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.on_attached">on_attached (pyad2usb.ad2usb.Overseer attribute)</a> | ||||
</dt> | </dt> | ||||
@@ -344,12 +382,32 @@ | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_message">on_message (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_disarm">on_disarm (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zonetracker.on_fault">on_fault (pyad2usb.zonetracking.Zonetracker attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_fire">on_fire (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_low_battery">on_low_battery (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_lrr_message">on_lrr_message (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | </dt> | ||||
</dl></td> | </dl></td> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_message">on_message (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_open">on_open (pyad2usb.ad2usb.AD2USB attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_open">on_open (pyad2usb.ad2usb.AD2USB attribute)</a> | ||||
</dt> | </dt> | ||||
@@ -360,6 +418,10 @@ | |||||
</dl></dd> | </dl></dd> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_panic">on_panic (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_power_changed">on_power_changed (pyad2usb.ad2usb.AD2USB attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_power_changed">on_power_changed (pyad2usb.ad2usb.AD2USB attribute)</a> | ||||
</dt> | </dt> | ||||
@@ -374,7 +436,7 @@ | |||||
</dl></dd> | </dl></dd> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_status_changed">on_status_changed (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zonetracker.on_restore">on_restore (pyad2usb.zonetracking.Zonetracker attribute)</a> | |||||
</dt> | </dt> | ||||
@@ -388,6 +450,14 @@ | |||||
</dl></dd> | </dl></dd> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_zone_fault">on_zone_fault (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.on_zone_restore">on_zone_restore (pyad2usb.ad2usb.AD2USB attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.open">open() (pyad2usb.ad2usb.AD2USB method)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.open">open() (pyad2usb.ad2usb.AD2USB method)</a> | ||||
</dt> | </dt> | ||||
@@ -420,31 +490,39 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#module-pyad2usb.__init__">pyad2usb.__init__ (module)</a> | |||||
<dt><a href="pyad2usb.html#module-pyad2usb.ad2usb">pyad2usb.ad2usb (module)</a> | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#module-pyad2usb.ad2usb">pyad2usb.ad2usb (module)</a> | |||||
<dt><a href="pyad2usb.html#module-pyad2usb.devices">pyad2usb.devices (module)</a> | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#module-pyad2usb.devices">pyad2usb.devices (module)</a> | |||||
<dt><a href="pyad2usb.event.html#module-pyad2usb.event">pyad2usb.event (module)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.event.html#module-pyad2usb.event.event">pyad2usb.event.event (module)</a> | |||||
</dt> | </dt> | ||||
</dl></td> | </dl></td> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.event.html#module-pyad2usb.event">pyad2usb.event (module)</a> | |||||
<dt><a href="pyad2usb.html#module-pyad2usb.messages">pyad2usb.messages (module)</a> | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.event.html#module-pyad2usb.event.event">pyad2usb.event.event (module)</a> | |||||
<dt><a href="pyad2usb.html#module-pyad2usb.panels">pyad2usb.panels (module)</a> | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#module-pyad2usb.util">pyad2usb.util (module)</a> | <dt><a href="pyad2usb.html#module-pyad2usb.util">pyad2usb.util (module)</a> | ||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#module-pyad2usb.zonetracking">pyad2usb.zonetracking (module)</a> | |||||
</dt> | |||||
</dl></td> | </dl></td> | ||||
</tr></table> | </tr></table> | ||||
@@ -490,7 +568,7 @@ | |||||
</dl></td> | </dl></td> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.ExpanderMessage.RELAY">RELAY (pyad2usb.ad2usb.ExpanderMessage attribute)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.messages.ExpanderMessage.RELAY">RELAY (pyad2usb.messages.ExpanderMessage attribute)</a> | |||||
</dt> | </dt> | ||||
@@ -498,7 +576,7 @@ | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.RFMessage">RFMessage (class in pyad2usb.ad2usb)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.messages.RFMessage">RFMessage (class in pyad2usb.messages)</a> | |||||
</dt> | </dt> | ||||
@@ -518,11 +596,11 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.devices.SerialDevice">SerialDevice (class in pyad2usb.devices)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.save_config">save_config() (pyad2usb.ad2usb.AD2USB method)</a> | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.AD2USB.set_config">set_config() (pyad2usb.ad2usb.AD2USB method)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.devices.SerialDevice">SerialDevice (class in pyad2usb.devices)</a> | |||||
</dt> | </dt> | ||||
@@ -541,12 +619,12 @@ | |||||
<dt><a href="pyad2usb.html#pyad2usb.util.Firmware.STAGE_LOAD">STAGE_LOAD (pyad2usb.util.Firmware attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.util.Firmware.STAGE_LOAD">STAGE_LOAD (pyad2usb.util.Firmware attribute)</a> | ||||
</dt> | </dt> | ||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.util.Firmware.STAGE_START">STAGE_START (pyad2usb.util.Firmware attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.util.Firmware.STAGE_START">STAGE_START (pyad2usb.util.Firmware attribute)</a> | ||||
</dt> | </dt> | ||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.util.Firmware.STAGE_UPLOADING">STAGE_UPLOADING (pyad2usb.util.Firmware attribute)</a> | <dt><a href="pyad2usb.html#pyad2usb.util.Firmware.STAGE_UPLOADING">STAGE_UPLOADING (pyad2usb.util.Firmware attribute)</a> | ||||
</dt> | </dt> | ||||
@@ -560,6 +638,10 @@ | |||||
</dt> | </dt> | ||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zone.STATUS">STATUS (pyad2usb.zonetracking.Zone attribute)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.stop">stop() (pyad2usb.ad2usb.Overseer method)</a> | <dt><a href="pyad2usb.html#pyad2usb.ad2usb.Overseer.stop">stop() (pyad2usb.ad2usb.Overseer method)</a> | ||||
</dt> | </dt> | ||||
@@ -594,6 +676,10 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zonetracker.update">update() (pyad2usb.zonetracking.Zonetracker method)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.util.Firmware.upload">upload() (pyad2usb.util.Firmware static method)</a> | <dt><a href="pyad2usb.html#pyad2usb.util.Firmware.upload">upload() (pyad2usb.util.Firmware static method)</a> | ||||
</dt> | </dt> | ||||
@@ -630,7 +716,17 @@ | |||||
<table style="width: 100%" class="indextable genindextable"><tr> | <table style="width: 100%" class="indextable genindextable"><tr> | ||||
<td style="width: 33%" valign="top"><dl> | <td style="width: 33%" valign="top"><dl> | ||||
<dt><a href="pyad2usb.html#pyad2usb.ad2usb.ExpanderMessage.ZONE">ZONE (pyad2usb.ad2usb.ExpanderMessage attribute)</a> | |||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zone">Zone (class in pyad2usb.zonetracking)</a> | |||||
</dt> | |||||
<dt><a href="pyad2usb.html#pyad2usb.messages.ExpanderMessage.ZONE">ZONE (pyad2usb.messages.ExpanderMessage attribute)</a> | |||||
</dt> | |||||
</dl></td> | |||||
<td style="width: 33%" valign="top"><dl> | |||||
<dt><a href="pyad2usb.html#pyad2usb.zonetracking.Zonetracker">Zonetracker (class in pyad2usb.zonetracking)</a> | |||||
</dt> | </dt> | ||||
</dl></td> | </dl></td> | ||||
@@ -54,10 +54,12 @@ | |||||
<div class="toctree-wrapper compound"> | <div class="toctree-wrapper compound"> | ||||
<ul> | <ul> | ||||
<li class="toctree-l1"><a class="reference internal" href="pyad2usb.html">pyad2usb Package</a><ul> | <li class="toctree-l1"><a class="reference internal" href="pyad2usb.html">pyad2usb Package</a><ul> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#id1"><tt class="docutils literal"><span class="pre">pyad2usb</span></tt> Package</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.ad2usb"><tt class="docutils literal"><span class="pre">ad2usb</span></tt> Module</a></li> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.ad2usb"><tt class="docutils literal"><span class="pre">ad2usb</span></tt> Module</a></li> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.devices"><tt class="docutils literal"><span class="pre">devices</span></tt> Module</a></li> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.devices"><tt class="docutils literal"><span class="pre">devices</span></tt> Module</a></li> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.zonetracking"><tt class="docutils literal"><span class="pre">zonetracking</span></tt> Module</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.panels"><tt class="docutils literal"><span class="pre">panels</span></tt> Module</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.messages"><tt class="docutils literal"><span class="pre">messages</span></tt> Module</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#subpackages">Subpackages</a><ul> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#subpackages">Subpackages</a><ul> | ||||
<li class="toctree-l3"><a class="reference internal" href="pyad2usb.event.html">event Package</a><ul> | <li class="toctree-l3"><a class="reference internal" href="pyad2usb.event.html">event Package</a><ul> | ||||
<li class="toctree-l4"><a class="reference internal" href="pyad2usb.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="pyad2usb.event.html#id1"><tt class="docutils literal"><span class="pre">event</span></tt> Package</a></li> | ||||
@@ -49,10 +49,12 @@ | |||||
<div class="toctree-wrapper compound"> | <div class="toctree-wrapper compound"> | ||||
<ul> | <ul> | ||||
<li class="toctree-l1"><a class="reference internal" href="pyad2usb.html">pyad2usb Package</a><ul> | <li class="toctree-l1"><a class="reference internal" href="pyad2usb.html">pyad2usb Package</a><ul> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#id1"><tt class="docutils literal"><span class="pre">pyad2usb</span></tt> Package</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.ad2usb"><tt class="docutils literal"><span class="pre">ad2usb</span></tt> Module</a></li> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.ad2usb"><tt class="docutils literal"><span class="pre">ad2usb</span></tt> Module</a></li> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.devices"><tt class="docutils literal"><span class="pre">devices</span></tt> Module</a></li> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.devices"><tt class="docutils literal"><span class="pre">devices</span></tt> Module</a></li> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li> | ||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.zonetracking"><tt class="docutils literal"><span class="pre">zonetracking</span></tt> Module</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.panels"><tt class="docutils literal"><span class="pre">panels</span></tt> Module</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#module-pyad2usb.messages"><tt class="docutils literal"><span class="pre">messages</span></tt> Module</a></li> | |||||
<li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#subpackages">Subpackages</a><ul> | <li class="toctree-l2"><a class="reference internal" href="pyad2usb.html#subpackages">Subpackages</a><ul> | ||||
<li class="toctree-l3"><a class="reference internal" href="pyad2usb.event.html">event Package</a><ul> | <li class="toctree-l3"><a class="reference internal" href="pyad2usb.event.html">event Package</a><ul> | ||||
<li class="toctree-l4"><a class="reference internal" href="pyad2usb.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="pyad2usb.event.html#id1"><tt class="docutils literal"><span class="pre">event</span></tt> Package</a></li> | ||||
@@ -64,11 +64,6 @@ | |||||
<td> | <td> | ||||
<tt class="xref">pyad2usb</tt></td><td> | <tt class="xref">pyad2usb</tt></td><td> | ||||
<em></em></td></tr> | <em></em></td></tr> | ||||
<tr class="cg-1"> | |||||
<td></td> | |||||
<td> | |||||
<a href="pyad2usb.html#module-pyad2usb.__init__"><tt class="xref">pyad2usb.__init__</tt></a></td><td> | |||||
<em></em></td></tr> | |||||
<tr class="cg-1"> | <tr class="cg-1"> | ||||
<td></td> | <td></td> | ||||
<td> | <td> | ||||
@@ -89,11 +84,26 @@ | |||||
<td> | <td> | ||||
<a href="pyad2usb.event.html#module-pyad2usb.event.event"><tt class="xref">pyad2usb.event.event</tt></a></td><td> | <a href="pyad2usb.event.html#module-pyad2usb.event.event"><tt class="xref">pyad2usb.event.event</tt></a></td><td> | ||||
<em></em></td></tr> | <em></em></td></tr> | ||||
<tr class="cg-1"> | |||||
<td></td> | |||||
<td> | |||||
<a href="pyad2usb.html#module-pyad2usb.messages"><tt class="xref">pyad2usb.messages</tt></a></td><td> | |||||
<em></em></td></tr> | |||||
<tr class="cg-1"> | |||||
<td></td> | |||||
<td> | |||||
<a href="pyad2usb.html#module-pyad2usb.panels"><tt class="xref">pyad2usb.panels</tt></a></td><td> | |||||
<em></em></td></tr> | |||||
<tr class="cg-1"> | <tr class="cg-1"> | ||||
<td></td> | <td></td> | ||||
<td> | <td> | ||||
<a href="pyad2usb.html#module-pyad2usb.util"><tt class="xref">pyad2usb.util</tt></a></td><td> | <a href="pyad2usb.html#module-pyad2usb.util"><tt class="xref">pyad2usb.util</tt></a></td><td> | ||||
<em></em></td></tr> | <em></em></td></tr> | ||||
<tr class="cg-1"> | |||||
<td></td> | |||||
<td> | |||||
<a href="pyad2usb.html#module-pyad2usb.zonetracking"><tt class="xref">pyad2usb.zonetracking</tt></a></td><td> | |||||
<em></em></td></tr> | |||||
</table> | </table> | ||||
@@ -75,6 +75,13 @@ | |||||
You can add handler also by using ‘+=’ operator.</p> | You can add handler also by using ‘+=’ operator.</p> | ||||
</dd></dl> | </dd></dl> | ||||
<dl class="method"> | |||||
<dt id="pyad2usb.event.event.EventHandler.remove"> | |||||
<tt class="descname">remove</tt><big>(</big><em>func</em><big>)</big><a class="reference internal" href="_modules/pyad2usb/event/event.html#EventHandler.remove"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pyad2usb.event.event.EventHandler.remove" title="Permalink to this definition">¶</a></dt> | |||||
<dd><p>Remove existing event handler function.</p> | |||||
<p>You can remove handler also by using ‘-=’ operator.</p> | |||||
</dd></dl> | |||||
<dl class="method"> | <dl class="method"> | ||||
<dt id="pyad2usb.event.event.EventHandler.fire"> | <dt id="pyad2usb.event.event.EventHandler.fire"> | ||||
<tt class="descname">fire</tt><big>(</big><em>earg=None</em><big>)</big><a class="reference internal" href="_modules/pyad2usb/event/event.html#EventHandler.fire"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pyad2usb.event.event.EventHandler.fire" title="Permalink to this definition">¶</a></dt> | <tt class="descname">fire</tt><big>(</big><em>earg=None</em><big>)</big><a class="reference internal" href="_modules/pyad2usb/event/event.html#EventHandler.fire"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pyad2usb.event.event.EventHandler.fire" title="Permalink to this definition">¶</a></dt> | ||||
@@ -83,13 +90,6 @@ You can add handler also by using ‘+=’ operator.</p> | |||||
e.fire(earg).</p> | e.fire(earg).</p> | ||||
</dd></dl> | </dd></dl> | ||||
<dl class="method"> | |||||
<dt id="pyad2usb.event.event.EventHandler.remove"> | |||||
<tt class="descname">remove</tt><big>(</big><em>func</em><big>)</big><a class="reference internal" href="_modules/pyad2usb/event/event.html#EventHandler.remove"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pyad2usb.event.event.EventHandler.remove" title="Permalink to this definition">¶</a></dt> | |||||
<dd><p>Remove existing event handler function.</p> | |||||
<p>You can remove handler also by using ‘-=’ operator.</p> | |||||
</dd></dl> | |||||
</dd></dl> | </dd></dl> | ||||
</div> | </div> | ||||
@@ -304,3 +304,5 @@ epub_copyright = u'2013, Author' | |||||
# If false, no index is generated. | # If false, no index is generated. | ||||
#epub_use_index = True | #epub_use_index = True | ||||
autodoc_member_order = 'bysource' |
@@ -1,14 +1,6 @@ | |||||
pyad2usb Package | pyad2usb Package | ||||
================ | ================ | ||||
:mod:`pyad2usb` Package | |||||
----------------------- | |||||
.. automodule:: pyad2usb.__init__ | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
:mod:`ad2usb` Module | :mod:`ad2usb` Module | ||||
-------------------- | -------------------- | ||||
@@ -33,6 +25,30 @@ pyad2usb Package | |||||
:undoc-members: | :undoc-members: | ||||
:show-inheritance: | :show-inheritance: | ||||
:mod:`zonetracking` Module | |||||
-------------------------- | |||||
.. automodule:: pyad2usb.zonetracking | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
:mod:`panels` Module | |||||
-------------------- | |||||
.. automodule:: pyad2usb.panels | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
:mod:`messages` Module | |||||
---------------------- | |||||
.. automodule:: pyad2usb.messages | |||||
:members: | |||||
:undoc-members: | |||||
:show-inheritance: | |||||
Subpackages | Subpackages | ||||
----------- | ----------- | ||||
@@ -1,5 +1 @@ | |||||
""" | |||||
The PyAD2USB module. | |||||
""" | |||||
__all__ = ['ad2usb', 'devices', 'util'] | __all__ = ['ad2usb', 'devices', 'util'] |
@@ -1,5 +1,9 @@ | |||||
""" | """ | ||||
Provides the full AD2USB class and factory. | Provides the full AD2USB class and factory. | ||||
.. moduleauthor:: Scott Petersen <scott@nutech.com> | |||||
""" | """ | ||||
import time | import time | ||||
@@ -28,6 +32,9 @@ class Overseer(object): | |||||
def find_all(cls): | def find_all(cls): | ||||
""" | """ | ||||
Returns all AD2USB devices located on the system. | Returns all AD2USB devices located on the system. | ||||
:returns: list of devices found | |||||
:raises: util.CommError | |||||
""" | """ | ||||
cls.__devices = devices.USBDevice.find_all() | cls.__devices = devices.USBDevice.find_all() | ||||
@@ -37,6 +44,8 @@ class Overseer(object): | |||||
def devices(cls): | 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. | |||||
""" | """ | ||||
return cls.__devices | return cls.__devices | ||||
@@ -44,6 +53,12 @@ class Overseer(object): | |||||
def create(cls, device=None): | def create(cls, device=None): | ||||
""" | """ | ||||
Factory method that returns the requested AD2USB device, or the first device. | Factory method that returns the requested AD2USB device, or the first device. | ||||
:param device: Tuple describing the USB device to open, as returned by find_all(). | |||||
:type device: tuple | |||||
:returns: AD2USB object utilizing the specified device. | |||||
:raises: util.NoDeviceError | |||||
""" | """ | ||||
cls.find_all() | cls.find_all() | ||||
@@ -61,6 +76,11 @@ class Overseer(object): | |||||
def __init__(self, attached_event=None, detached_event=None): | def __init__(self, attached_event=None, detached_event=None): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param attached_event: Event to trigger when a device is attached. | |||||
:type attached_event: function | |||||
:param detached_event: Event to trigger when a device is detached. | |||||
:type detached_event: function | |||||
""" | """ | ||||
self._detect_thread = Overseer.DetectThread(self) | self._detect_thread = Overseer.DetectThread(self) | ||||
@@ -96,6 +116,9 @@ class Overseer(object): | |||||
def get_device(self, device=None): | def get_device(self, device=None): | ||||
""" | """ | ||||
Factory method that returns the requested AD2USB device, or the first device. | Factory method that returns the requested AD2USB device, or the first device. | ||||
:param device: Tuple describing the USB device to open, as returned by find_all(). | |||||
:type device: tuple | |||||
""" | """ | ||||
return Overseer.create(device) | return Overseer.create(device) | ||||
@@ -106,6 +129,9 @@ class Overseer(object): | |||||
def __init__(self, overseer): | def __init__(self, overseer): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param overseer: Overseer object to use with the thread. | |||||
:type overseer: Overseer | |||||
""" | """ | ||||
threading.Thread.__init__(self) | threading.Thread.__init__(self) | ||||
@@ -178,16 +204,25 @@ class AD2USB(object): | |||||
# Constants | # Constants | ||||
F1 = unichr(1) + unichr(1) + unichr(1) | F1 = unichr(1) + unichr(1) + unichr(1) | ||||
"""Represents panel function key #1""" | |||||
F2 = unichr(2) + unichr(2) + unichr(2) | F2 = unichr(2) + unichr(2) + unichr(2) | ||||
"""Represents panel function key #2""" | |||||
F3 = unichr(3) + unichr(3) + unichr(3) | F3 = unichr(3) + unichr(3) + unichr(3) | ||||
"""Represents panel function key #3""" | |||||
F4 = unichr(4) + unichr(4) + unichr(4) | F4 = unichr(4) + unichr(4) + unichr(4) | ||||
"""Represents panel function key #4""" | |||||
BATTERY_TIMEOUT = 30 | BATTERY_TIMEOUT = 30 | ||||
"""Timeout before the battery status reverts.""" | |||||
FIRE_TIMEOUT = 30 | FIRE_TIMEOUT = 30 | ||||
"""Timeout before the fire status reverts.""" | |||||
def __init__(self, device): | def __init__(self, device): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param device: The low-level device used for this AD2USB interface. | |||||
:type device: devices.Device | |||||
""" | """ | ||||
self._device = device | self._device = device | ||||
self._zonetracker = zonetracking.Zonetracker() | self._zonetracker = zonetracking.Zonetracker() | ||||
@@ -212,12 +247,23 @@ class AD2USB(object): | |||||
def id(self): | def id(self): | ||||
""" | """ | ||||
The ID of the AD2USB device. | The ID of the AD2USB device. | ||||
:returns: The identification string for the device. | |||||
""" | """ | ||||
return self._device.id | return self._device.id | ||||
def open(self, baudrate=None, interface=None, index=None, no_reader_thread=False): | def open(self, baudrate=None, interface=None, index=None, no_reader_thread=False): | ||||
""" | """ | ||||
Opens the device. | Opens the device. | ||||
:param baudrate: The baudrate used for the device. | |||||
:type baudrate: int | |||||
:param interface: The interface used for the device. | |||||
:type interface: varies depends on device type.. FIXME | |||||
:param index: Interface index.. can probably remove. FIXME | |||||
:type index: int | |||||
:param no_reader_thread: Specifies whether or not the automatic reader thread should be started or not | |||||
:type no_reader_thread: bool | |||||
""" | """ | ||||
self._wire_events() | self._wire_events() | ||||
self._device.open(baudrate=baudrate, interface=interface, index=index, no_reader_thread=no_reader_thread) | self._device.open(baudrate=baudrate, interface=interface, index=index, no_reader_thread=no_reader_thread) | ||||
@@ -274,6 +320,11 @@ class AD2USB(object): | |||||
def fault_zone(self, zone, simulate_wire_problem=False): | def fault_zone(self, zone, simulate_wire_problem=False): | ||||
""" | """ | ||||
Faults a zone if we are emulating a zone expander. | Faults a zone if we are emulating a zone expander. | ||||
:param zone: The zone to fault. | |||||
:type zone: int | |||||
:param simulate_wire_problem: Whether or not to simulate a wire fault. | |||||
:type simulate_wire_problem: bool | |||||
""" | """ | ||||
# Allow ourselves to also be passed an address/channel combination | # Allow ourselves to also be passed an address/channel combination | ||||
# for zone expanders. | # for zone expanders. | ||||
@@ -289,6 +340,9 @@ class AD2USB(object): | |||||
def clear_zone(self, zone): | def clear_zone(self, zone): | ||||
""" | """ | ||||
Clears a zone if we are emulating a zone expander. | Clears a zone if we are emulating a zone expander. | ||||
:param zone: The zone to clear. | |||||
:type zone: int | |||||
""" | """ | ||||
self._device.write("L{0:02}0\r".format(zone)) | self._device.write("L{0:02}0\r".format(zone)) | ||||
@@ -306,6 +360,11 @@ class AD2USB(object): | |||||
def _handle_message(self, data): | def _handle_message(self, data): | ||||
""" | """ | ||||
Parses messages from the panel. | Parses messages from the panel. | ||||
:param data: Panel data to parse. | |||||
:type data: str | |||||
:returns: An object representing the message. | |||||
""" | """ | ||||
if data is None: | if data is None: | ||||
return None | return None | ||||
@@ -338,6 +397,11 @@ class AD2USB(object): | |||||
def _handle_lrr(self, data): | def _handle_lrr(self, data): | ||||
""" | """ | ||||
Handle Long Range Radio messages. | Handle Long Range Radio messages. | ||||
:param data: LRR message to parse. | |||||
:type data: str | |||||
:returns: An object representing the LRR message. | |||||
""" | """ | ||||
msg = messages.LRRMessage(data) | msg = messages.LRRMessage(data) | ||||
@@ -358,6 +422,9 @@ class AD2USB(object): | |||||
def _handle_config(self, data): | def _handle_config(self, data): | ||||
""" | """ | ||||
Handles received configuration data. | Handles received configuration data. | ||||
:param data: Configuration string to parse. | |||||
:type data: str | |||||
""" | """ | ||||
_, config_string = data.split('>') | _, config_string = data.split('>') | ||||
for setting in config_string.split('&'): | for setting in config_string.split('&'): | ||||
@@ -385,6 +452,9 @@ class AD2USB(object): | |||||
def _update_internal_states(self, message): | def _update_internal_states(self, message): | ||||
""" | """ | ||||
Updates internal device states. | Updates internal device states. | ||||
:param message: Message to update internal states with. | |||||
:type message: Message, ExpanderMessage, LRRMessage, or RFMessage | |||||
""" | """ | ||||
if isinstance(message, messages.Message): | if isinstance(message, messages.Message): | ||||
if message.ac_power != self._power_status: | if message.ac_power != self._power_status: | ||||
@@ -447,6 +517,9 @@ class AD2USB(object): | |||||
def _update_zone_tracker(self, message): | def _update_zone_tracker(self, message): | ||||
""" | """ | ||||
Trigger an update of the zonetracker. | Trigger an update of the zonetracker. | ||||
:param message: The message to update the zonetracker with. | |||||
:type message: Message, ExpanderMessage, LRRMessage, or RFMessage | |||||
""" | """ | ||||
# Retrieve a list of faults. | # Retrieve a list of faults. | ||||
@@ -1,5 +1,7 @@ | |||||
""" | """ | ||||
Contains different types of devices belonging to the AD2USB family. | Contains different types of devices belonging to the AD2USB family. | ||||
.. moduleauthor:: Scott Petersen <scott@nutech.com> | |||||
""" | """ | ||||
import usb.core | import usb.core | ||||
@@ -40,6 +42,8 @@ class Device(object): | |||||
def id(self): | def id(self): | ||||
""" | """ | ||||
Retrieve the device ID. | Retrieve the device ID. | ||||
:returns: The identification string for the device. | |||||
""" | """ | ||||
return self._id | return self._id | ||||
@@ -47,12 +51,17 @@ class Device(object): | |||||
def id(self, value): | def id(self, value): | ||||
""" | """ | ||||
Sets the device ID. | Sets the device ID. | ||||
:param value: The device identification. | |||||
:type value: str | |||||
""" | """ | ||||
self._id = value | self._id = value | ||||
def is_reader_alive(self): | def is_reader_alive(self): | ||||
""" | """ | ||||
Indicates whether or not the reader thread is alive. | Indicates whether or not the reader thread is alive. | ||||
:returns: Whether or not the reader thread is alive. | |||||
""" | """ | ||||
return self._read_thread.is_alive() | return self._read_thread.is_alive() | ||||
@@ -68,10 +77,14 @@ class Device(object): | |||||
""" | """ | ||||
READ_TIMEOUT = 10 | READ_TIMEOUT = 10 | ||||
"""Timeout for the reader thread.""" | |||||
def __init__(self, device): | def __init__(self, device): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param device: The device used by the reader thread. | |||||
:type device: devices.Device | |||||
""" | """ | ||||
threading.Thread.__init__(self) | threading.Thread.__init__(self) | ||||
self._device = device | self._device = device | ||||
@@ -105,13 +118,19 @@ class USBDevice(Device): | |||||
# Constants | # Constants | ||||
FTDI_VENDOR_ID = 0x0403 | FTDI_VENDOR_ID = 0x0403 | ||||
"""Vendor ID used to recognize AD2USB devices.""" | |||||
FTDI_PRODUCT_ID = 0x6001 | FTDI_PRODUCT_ID = 0x6001 | ||||
"""Product ID used to recognize AD2USB devices.""" | |||||
BAUDRATE = 115200 | BAUDRATE = 115200 | ||||
"""Default baudrate for AD2USB devices.""" | |||||
@staticmethod | @staticmethod | ||||
def find_all(): | def find_all(): | ||||
""" | """ | ||||
Returns all FTDI devices matching our vendor and product IDs. | Returns all FTDI devices matching our vendor and product IDs. | ||||
:returns: list of devices | |||||
:raises: util.CommError | |||||
""" | """ | ||||
devices = [] | devices = [] | ||||
@@ -126,6 +145,17 @@ class USBDevice(Device): | |||||
def __init__(self, vid=FTDI_VENDOR_ID, pid=FTDI_PRODUCT_ID, serial=None, description=None, interface=0): | def __init__(self, vid=FTDI_VENDOR_ID, pid=FTDI_PRODUCT_ID, serial=None, description=None, interface=0): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param vid: Vendor ID | |||||
:type vid: int | |||||
:param pid: Product ID | |||||
:type pid: int | |||||
:param serial: The serial number | |||||
:type serial: str | |||||
:param description: Description of the device. | |||||
:type description: str | |||||
:param interface: The interface to use | |||||
:type interface: int | |||||
""" | """ | ||||
Device.__init__(self) | Device.__init__(self) | ||||
@@ -139,6 +169,15 @@ class USBDevice(Device): | |||||
def open(self, baudrate=BAUDRATE, interface=None, index=0, no_reader_thread=False): | def open(self, baudrate=BAUDRATE, interface=None, index=0, no_reader_thread=False): | ||||
""" | """ | ||||
Opens the device. | Opens the device. | ||||
:param baudrate: The baudrate to use. | |||||
:type baudrate: int | |||||
:param interface: The interface to use. | |||||
:type interface: int | |||||
:param no_reader_thread: Whether or not to automatically start the reader thread. | |||||
:type no_reader_thread: bool | |||||
:raises: util.NoDeviceError | |||||
""" | """ | ||||
# Set up defaults | # Set up defaults | ||||
if baudrate is None: | if baudrate is None: | ||||
@@ -197,6 +236,11 @@ class USBDevice(Device): | |||||
def write(self, data): | def write(self, data): | ||||
""" | """ | ||||
Writes data to the device. | Writes data to the device. | ||||
:param data: Data to write | |||||
:type data: str | |||||
:raises: util.CommError | |||||
""" | """ | ||||
try: | try: | ||||
self._device.write_data(data) | self._device.write_data(data) | ||||
@@ -208,6 +252,9 @@ class USBDevice(Device): | |||||
def read(self): | def read(self): | ||||
""" | """ | ||||
Reads a single character from the device. | Reads a single character from the device. | ||||
:returns: The character read from the device. | |||||
:raises: util.CommError | |||||
""" | """ | ||||
ret = None | ret = None | ||||
@@ -222,6 +269,14 @@ class USBDevice(Device): | |||||
def read_line(self, timeout=0.0, purge_buffer=False): | def read_line(self, timeout=0.0, purge_buffer=False): | ||||
""" | """ | ||||
Reads a line from the device. | Reads a line from the device. | ||||
: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: util.CommError, util.TimeoutError | |||||
""" | """ | ||||
if purge_buffer: | if purge_buffer: | ||||
@@ -287,11 +342,18 @@ class SerialDevice(Device): | |||||
# Constants | # Constants | ||||
BAUDRATE = 19200 | BAUDRATE = 19200 | ||||
"""Default baudrate for Serial devices.""" | |||||
@staticmethod | @staticmethod | ||||
def find_all(pattern=None): | def find_all(pattern=None): | ||||
""" | """ | ||||
Returns all serial ports present. | Returns all serial ports present. | ||||
:param pattern: Pattern to search for when retrieving serial ports. | |||||
:type pattern: str | |||||
:returns: list of devices | |||||
:raises: util.CommError | |||||
""" | """ | ||||
devices = [] | devices = [] | ||||
@@ -309,6 +371,9 @@ class SerialDevice(Device): | |||||
def __init__(self, interface=None): | def __init__(self, interface=None): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param interface: The device to open. | |||||
:type interface: str | |||||
""" | """ | ||||
Device.__init__(self) | Device.__init__(self) | ||||
@@ -319,6 +384,17 @@ class SerialDevice(Device): | |||||
def open(self, baudrate=BAUDRATE, interface=None, index=None, no_reader_thread=False): | def open(self, baudrate=BAUDRATE, interface=None, index=None, no_reader_thread=False): | ||||
""" | """ | ||||
Opens the device. | Opens the device. | ||||
:param baudrate: The baudrate to use with the device. | |||||
:type baudrate: int | |||||
:param interface: The device to open. | |||||
:type interface: str | |||||
:param index: Unused. | |||||
:type index: int | |||||
:param no_reader_thread: Whether or not to automatically start the reader thread. | |||||
:type no_reader_thread: bool | |||||
:raises: util.NoDeviceError | |||||
""" | """ | ||||
# Set up the defaults | # Set up the defaults | ||||
if baudrate is None: | if baudrate is None: | ||||
@@ -370,6 +446,11 @@ class SerialDevice(Device): | |||||
def write(self, data): | def write(self, data): | ||||
""" | """ | ||||
Writes data to the device. | Writes data to the device. | ||||
:param data: The data to write. | |||||
:type data: str | |||||
:raises: util.CommError | |||||
""" | """ | ||||
try: | try: | ||||
self._device.write(data) | self._device.write(data) | ||||
@@ -386,6 +467,9 @@ class SerialDevice(Device): | |||||
def read(self): | def read(self): | ||||
""" | """ | ||||
Reads a single character from the device. | Reads a single character from the device. | ||||
:returns: The character read from the device. | |||||
:raises: util.CommError | |||||
""" | """ | ||||
ret = None | ret = None | ||||
@@ -400,6 +484,14 @@ class SerialDevice(Device): | |||||
def read_line(self, timeout=0.0, purge_buffer=False): | def read_line(self, timeout=0.0, purge_buffer=False): | ||||
""" | """ | ||||
Reads a line from the device. | Reads a line from the device. | ||||
:param timeout: The read timeout. | |||||
:type timeout: float | |||||
:param purge_buffer: Indicates whether to purge the buffer prior to reading. | |||||
:type purge_buffer: bool | |||||
:returns: The line read. | |||||
:raises: util.CommError, util.TimeoutError | |||||
""" | """ | ||||
def timeout_event(): | def timeout_event(): | ||||
timeout_event.reading = False | timeout_event.reading = False | ||||
@@ -471,6 +563,17 @@ class SocketDevice(Device): | |||||
def open(self, baudrate=None, interface=None, index=0, no_reader_thread=False): | def open(self, baudrate=None, interface=None, index=0, no_reader_thread=False): | ||||
""" | """ | ||||
Opens the device. | Opens the device. | ||||
:param baudrate: The baudrate to use | |||||
:type baudrate: int | |||||
:param interface: The hostname and port to connect to. | |||||
:type interface: tuple | |||||
:param index: Unused | |||||
:type index: int | |||||
:param no_reader_thread: Whether or not to automatically open the reader thread. | |||||
:type no_reader_thread: bool | |||||
:raises: util.NoDeviceError | |||||
""" | """ | ||||
if interface is not None: | if interface is not None: | ||||
self._interface = interface | self._interface = interface | ||||
@@ -512,6 +615,12 @@ class SocketDevice(Device): | |||||
def write(self, data): | def write(self, data): | ||||
""" | """ | ||||
Writes data to the device. | Writes data to the device. | ||||
:param data: The data to write. | |||||
:type data: str | |||||
:returns: The number of bytes sent. | |||||
:raises: util.CommError | |||||
""" | """ | ||||
data_sent = None | data_sent = None | ||||
@@ -531,6 +640,9 @@ class SocketDevice(Device): | |||||
def read(self): | def read(self): | ||||
""" | """ | ||||
Reads a single character from the device. | Reads a single character from the device. | ||||
:returns: The character read from the device. | |||||
:raises: util.CommError | |||||
""" | """ | ||||
data = None | data = None | ||||
@@ -545,6 +657,14 @@ class SocketDevice(Device): | |||||
def read_line(self, timeout=0.0, purge_buffer=False): | def read_line(self, timeout=0.0, purge_buffer=False): | ||||
""" | """ | ||||
Reads a line from the device. | Reads a line from the device. | ||||
:param timeout: The read timeout. | |||||
:type timeout: float | |||||
:param purge_buffer: Indicates whether to purge the buffer prior to reading. | |||||
:type purge_buffer: bool | |||||
:returns: The line read from the device. | |||||
:raises: util.CommError, util.TimeoutError | |||||
""" | """ | ||||
if purge_buffer: | if purge_buffer: | ||||
@@ -12,6 +12,9 @@ class Message(object): | |||||
def __init__(self, data=None): | def __init__(self, data=None): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param data: Message data to parse. | |||||
:type data: str | |||||
""" | """ | ||||
self.ready = False | self.ready = False | ||||
self.armed_away = False | self.armed_away = False | ||||
@@ -45,6 +48,11 @@ class Message(object): | |||||
def _parse_message(self, data): | def _parse_message(self, data): | ||||
""" | """ | ||||
Parse the message from the device. | Parse the message from the device. | ||||
:param data: The message data. | |||||
:type data: str | |||||
:raises: util.InvalidMessageError | |||||
""" | """ | ||||
m = self._regex.match(data) | m = self._regex.match(data) | ||||
@@ -94,6 +102,9 @@ class ExpanderMessage(object): | |||||
def __init__(self, data=None): | def __init__(self, data=None): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param data: The message data to parse. | |||||
:type data: str | |||||
""" | """ | ||||
self.type = None | self.type = None | ||||
self.address = None | self.address = None | ||||
@@ -119,6 +130,9 @@ class ExpanderMessage(object): | |||||
def _parse_message(self, data): | def _parse_message(self, data): | ||||
""" | """ | ||||
Parse the raw message from the device. | Parse the raw message from the device. | ||||
:param data: The message data | |||||
:type data: str | |||||
""" | """ | ||||
header, values = data.split(':') | header, values = data.split(':') | ||||
address, channel, value = values.split(',') | address, channel, value = values.split(',') | ||||
@@ -141,6 +155,9 @@ class RFMessage(object): | |||||
def __init__(self, data=None): | def __init__(self, data=None): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param data: The message data to parse | |||||
:type data: str | |||||
""" | """ | ||||
self.raw = None | self.raw = None | ||||
self.serial_number = None | self.serial_number = None | ||||
@@ -158,6 +175,9 @@ class RFMessage(object): | |||||
def _parse_message(self, data): | def _parse_message(self, data): | ||||
""" | """ | ||||
Parses the raw message from the device. | Parses the raw message from the device. | ||||
:param data: The message data. | |||||
:type data: str | |||||
""" | """ | ||||
self.raw = data | self.raw = data | ||||
@@ -172,6 +192,9 @@ class LRRMessage(object): | |||||
def __init__(self, data=None): | def __init__(self, data=None): | ||||
""" | """ | ||||
Constructor | Constructor | ||||
:param data: The message data to parse. | |||||
:type data: str | |||||
""" | """ | ||||
self.raw = None | self.raw = None | ||||
self._event_data = None | self._event_data = None | ||||
@@ -190,6 +213,9 @@ class LRRMessage(object): | |||||
def _parse_message(self, data): | def _parse_message(self, data): | ||||
""" | """ | ||||
Parses the raw message from the device. | Parses the raw message from the device. | ||||
:param data: The message data. | |||||
:type data: str | |||||
""" | """ | ||||
self.raw = data | self.raw = data | ||||
@@ -48,6 +48,13 @@ class Firmware(object): | |||||
def upload(dev, filename, progress_callback=None): | def upload(dev, filename, progress_callback=None): | ||||
""" | """ | ||||
Uploads firmware to an AD2USB/AD2SERIAL device. | Uploads firmware to an AD2USB/AD2SERIAL device. | ||||
:param filename: The firmware filename | |||||
:type filename: str | |||||
:param progress_callback: Callback function used to report progress. | |||||
:type progress_callback: function | |||||
:raises: util.NoDeviceError, util.TimeoutError | |||||
""" | """ | ||||
def do_upload(): | def do_upload(): | ||||
@@ -12,21 +12,40 @@ class Zone(object): | |||||
""" | """ | ||||
CLEAR = 0 | CLEAR = 0 | ||||
"""Status indicating that the zone is cleared.""" | |||||
FAULT = 1 | FAULT = 1 | ||||
"""Status indicating that the zone is faulted.""" | |||||
CHECK = 2 # Wire fault | CHECK = 2 # Wire fault | ||||
"""Status indicating that there is a wiring issue with the zone.""" | |||||
STATUS = { CLEAR: 'CLEAR', FAULT: 'FAULT', CHECK: 'CHECK' } | STATUS = { CLEAR: 'CLEAR', FAULT: 'FAULT', CHECK: 'CHECK' } | ||||
def __init__(self, zone=0, name='', status=CLEAR): | def __init__(self, zone=0, name='', status=CLEAR): | ||||
""" | |||||
Constructor | |||||
:param zone: The zone number. | |||||
:type zone: int | |||||
:param name: Human readable zone name. | |||||
:type name: str | |||||
:param status: Initial zone state. | |||||
:type status: int | |||||
""" | |||||
self.zone = zone | self.zone = zone | ||||
self.name = name | self.name = name | ||||
self.status = status | self.status = status | ||||
self.timestamp = time.time() | self.timestamp = time.time() | ||||
def __str__(self): | def __str__(self): | ||||
""" | |||||
String conversion operator. | |||||
""" | |||||
return 'Zone {0} {1}'.format(self.zone, self.name) | return 'Zone {0} {1}'.format(self.zone, self.name) | ||||
def __repr__(self): | def __repr__(self): | ||||
""" | |||||
Human readable representation operator. | |||||
""" | |||||
return 'Zone({0}, {1}, ts {2})'.format(self.zone, Zone.STATUS[self.status], self.timestamp) | return 'Zone({0}, {1}, ts {2})'.format(self.zone, Zone.STATUS[self.status], self.timestamp) | ||||
class Zonetracker(object): | class Zonetracker(object): | ||||
@@ -38,6 +57,7 @@ class Zonetracker(object): | |||||
on_restore = event.Event('Called when the device detects that a fault is restored.') | on_restore = event.Event('Called when the device detects that a fault is restored.') | ||||
EXPIRE = 30 | EXPIRE = 30 | ||||
"""Zone expiration timeout.""" | |||||
def __init__(self): | def __init__(self): | ||||
""" | """ | ||||
@@ -50,6 +70,9 @@ class Zonetracker(object): | |||||
def update(self, message): | def update(self, message): | ||||
""" | """ | ||||
Update zone statuses based on the current message. | Update zone statuses based on the current message. | ||||
:param message: Message to use to update the zone tracking. | |||||
:type message: Message or ExpanderMessage | |||||
""" | """ | ||||
zone = -1 | zone = -1 | ||||
@@ -107,6 +130,9 @@ class Zonetracker(object): | |||||
def _clear_zones(self, zone): | def _clear_zones(self, zone): | ||||
""" | """ | ||||
Clear all expired zones from our status list. | Clear all expired zones from our status list. | ||||
:param zone: current zone being processed. | |||||
:type zone: int | |||||
""" | """ | ||||
cleared_zones = [] | cleared_zones = [] | ||||
found_last = found_new = at_end = False | found_last = found_new = at_end = False | ||||
@@ -177,6 +203,13 @@ class Zonetracker(object): | |||||
def _add_zone(self, zone, name='', status=Zone.CLEAR): | def _add_zone(self, zone, name='', status=Zone.CLEAR): | ||||
""" | """ | ||||
Adds a zone to the internal zone list. | Adds a zone to the internal zone list. | ||||
:param zone: The zone number. | |||||
:type zone: int | |||||
:param name: Human readable zone name. | |||||
:type name: str | |||||
:param status: The zone status. | |||||
:type status: int | |||||
""" | """ | ||||
if not zone in self._zones: | if not zone in self._zones: | ||||
self._zones[zone] = Zone(zone=zone, name=name, status=status) | self._zones[zone] = Zone(zone=zone, name=name, status=status) | ||||
@@ -187,6 +220,13 @@ class Zonetracker(object): | |||||
def _update_zone(self, zone, status=None): | def _update_zone(self, zone, status=None): | ||||
""" | """ | ||||
Updates a zones status. | Updates a zones status. | ||||
:param zone: The zone number. | |||||
:type zone: int | |||||
:param status: The zone status. | |||||
:type status: int | |||||
:raises: IndexError | |||||
""" | """ | ||||
if not zone in self._zones: | if not zone in self._zones: | ||||
raise IndexError('Zone does not exist and cannot be updated: %d', zone) | raise IndexError('Zone does not exist and cannot be updated: %d', zone) | ||||
@@ -205,6 +245,11 @@ class Zonetracker(object): | |||||
def _zone_expired(self, zone): | def _zone_expired(self, zone): | ||||
""" | """ | ||||
Determine if a zone is expired or not. | Determine if a zone is expired or not. | ||||
:param zone: The zone number. | |||||
:type zone: int | |||||
:returns: Whether or not the zone is expired. | |||||
""" | """ | ||||
if time.time() > self._zones[zone].timestamp + Zonetracker.EXPIRE: | if time.time() > self._zones[zone].timestamp + Zonetracker.EXPIRE: | ||||
return True | return True | ||||
@@ -214,6 +259,13 @@ class Zonetracker(object): | |||||
def _expander_to_zone(self, address, channel): | def _expander_to_zone(self, address, channel): | ||||
""" | """ | ||||
Convert an address and channel into a zone number. | Convert an address and channel into a zone number. | ||||
:param address: The expander address | |||||
:type address: int | |||||
:param channel: The channel | |||||
:type channel: int | |||||
:returns: The zone number associated with an address and channel. | |||||
""" | """ | ||||
# TODO: This is going to need to be reworked to support the larger | # TODO: This is going to need to be reworked to support the larger | ||||