@@ -62,6 +62,7 @@ | |||
<span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">InvalidMessageError</span> | |||
<span class="kn">from</span> <span class="nn">.messages</span> <span class="kn">import</span> <span class="n">Message</span><span class="p">,</span> <span class="n">ExpanderMessage</span><span class="p">,</span> <span class="n">RFMessage</span><span class="p">,</span> <span class="n">LRRMessage</span> | |||
<span class="kn">from</span> <span class="nn">.zonetracking</span> <span class="kn">import</span> <span class="n">Zonetracker</span> | |||
<span class="kn">from</span> <span class="nn">.panels</span> <span class="kn">import</span> <span class="n">PANEL_TYPES</span><span class="p">,</span> <span class="n">ADEMCO</span><span class="p">,</span> <span class="n">DSC</span> | |||
<div class="viewcode-block" id="AlarmDecoder"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder">[docs]</a><span class="k">class</span> <span class="nc">AlarmDecoder</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||
@@ -129,6 +130,8 @@ | |||
<span class="sd">"""The status of the devices LRR emulation."""</span> | |||
<span class="n">deduplicate</span> <span class="o">=</span> <span class="bp">False</span> | |||
<span class="sd">"""The status of message deduplication as configured on the device."""</span> | |||
<span class="n">mode</span> <span class="o">=</span> <span class="n">ADEMCO</span> | |||
<span class="sd">"""The panel mode that the AlarmDecoder is in. Currently supports ADEMCO and DSC."""</span> | |||
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">device</span><span class="p">):</span> | |||
<span class="sd">"""</span> | |||
@@ -159,6 +162,7 @@ | |||
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_relay</span> <span class="o">=</span> <span class="p">[</span><span class="bp">False</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">)]</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="o">=</span> <span class="bp">False</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="o">=</span> <span class="bp">False</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="o">=</span> <span class="n">ADEMCO</span> | |||
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> | |||
<span class="sd">"""</span> | |||
@@ -271,20 +275,16 @@ | |||
<span class="n">config_entries</span> <span class="o">=</span> <span class="p">[]</span> | |||
<span class="c"># HACK: This is ugly.. but I can't think of an elegant way of doing it.</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'ADDRESS'</span><span class="p">,</span> | |||
<span class="s">'{0}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'CONFIGBITS'</span><span class="p">,</span> | |||
<span class="s">'{0:x}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">configbits</span><span class="p">)))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'MASK'</span><span class="p">,</span> | |||
<span class="s">'{0:x}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address_mask</span><span class="p">)))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'ADDRESS'</span><span class="p">,</span> <span class="s">'{0}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'CONFIGBITS'</span><span class="p">,</span> <span class="s">'{0:x}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">configbits</span><span class="p">)))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'MASK'</span><span class="p">,</span> <span class="s">'{0:x}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address_mask</span><span class="p">)))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'EXP'</span><span class="p">,</span> | |||
<span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">'Y'</span> <span class="k">if</span> <span class="n">z</span> <span class="k">else</span> <span class="s">'N'</span> <span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_zone</span><span class="p">])))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'REL'</span><span class="p">,</span> | |||
<span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">'Y'</span> <span class="k">if</span> <span class="n">r</span> <span class="k">else</span> <span class="s">'N'</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_relay</span><span class="p">])))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'LRR'</span><span class="p">,</span> | |||
<span class="s">'Y'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="k">else</span> <span class="s">'N'</span><span class="p">))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'DEDUPLICATE'</span><span class="p">,</span> | |||
<span class="s">'Y'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="k">else</span> <span class="s">'N'</span><span class="p">))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'LRR'</span><span class="p">,</span> <span class="s">'Y'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="k">else</span> <span class="s">'N'</span><span class="p">))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'DEDUPLICATE'</span><span class="p">,</span> <span class="s">'Y'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="k">else</span> <span class="s">'N'</span><span class="p">))</span> | |||
<span class="n">config_entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">'MODE'</span><span class="p">,</span> <span class="n">PANEL_TYPES</span><span class="o">.</span><span class="n">keys</span><span class="p">()[</span><span class="n">PANEL_TYPES</span><span class="o">.</span><span class="n">values</span><span class="p">()</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">)]))</span> | |||
<span class="n">config_string</span> <span class="o">=</span> <span class="s">'&'</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">'='</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">config_entries</span><span class="p">])</span> | |||
@@ -479,6 +479,8 @@ | |||
<span class="bp">self</span><span class="o">.</span><span class="n">emulate_lrr</span> <span class="o">=</span> <span class="p">(</span><span class="n">val</span> <span class="o">==</span> <span class="s">'Y'</span><span class="p">)</span> | |||
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">'DEDUPLICATE'</span><span class="p">:</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">deduplicate</span> <span class="o">=</span> <span class="p">(</span><span class="n">val</span> <span class="o">==</span> <span class="s">'Y'</span><span class="p">)</span> | |||
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">'MODE'</span><span class="p">:</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="o">=</span> <span class="n">PANEL_TYPES</span><span class="p">[</span><span class="n">val</span><span class="p">]</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">on_config_received</span><span class="p">()</span> | |||
@@ -65,6 +65,7 @@ | |||
<span class="kn">import</span> <span class="nn">datetime</span> | |||
<span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">InvalidMessageError</span> | |||
<span class="kn">from</span> <span class="nn">.panels</span> <span class="kn">import</span> <span class="n">PANEL_TYPES</span><span class="p">,</span> <span class="n">ADEMCO</span><span class="p">,</span> <span class="n">DSC</span> | |||
<div class="viewcode-block" id="BaseMessage"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.messages.BaseMessage">[docs]</a><span class="k">class</span> <span class="nc">BaseMessage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | |||
@@ -144,13 +145,17 @@ | |||
<span class="sd">"""Indicates whether or not there are zones that require attention."""</span> | |||
<span class="n">perimeter_only</span> <span class="o">=</span> <span class="bp">False</span> | |||
<span class="sd">"""Indicates whether or not the perimeter is armed."""</span> | |||
<span class="n">system_fault</span> <span class="o">=</span> <span class="bp">False</span> | |||
<span class="sd">"""Indicates whether a system fault has occurred."""</span> | |||
<span class="n">panel_type</span> <span class="o">=</span> <span class="n">ADEMCO</span> | |||
<span class="sd">"""Indicates which panel type was the source of this message."""</span> | |||
<span class="n">numeric_code</span> <span class="o">=</span> <span class="bp">None</span> | |||
<span class="sd">"""The numeric code associated with the message."""</span> | |||
<span class="n">text</span> <span class="o">=</span> <span class="bp">None</span> | |||
<span class="sd">"""The human-readable text to be displayed on the panel LCD."""</span> | |||
<span class="n">cursor_location</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> | |||
<span class="sd">"""Current cursor location on the keypad."""</span> | |||
<span class="n">mask</span> <span class="o">=</span> <span class="bp">None</span> | |||
<span class="n">mask</span> <span class="o">=</span> <span class="mh">0xFFFFFFFF</span> | |||
<span class="sd">"""Address mask this message is intended for."""</span> | |||
<span class="n">bitfield</span> <span class="o">=</span> <span class="bp">None</span> | |||
<span class="sd">"""The bitfield associated with this message."""</span> | |||
@@ -186,7 +191,6 @@ | |||
<span class="k">raise</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="n">header</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">match</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="mi">5</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="n">is_bit_set</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">bit</span><span class="p">:</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="n">bit</span><span class="p">]</span> <span class="o">==</span> <span class="s">"0"</span> | |||
@@ -207,12 +211,18 @@ | |||
<span class="bp">self</span><span class="o">.</span><span class="n">fire_alarm</span> <span class="o">=</span> <span class="n">is_bit_set</span><span class="p">(</span><span class="mi">14</span><span class="p">)</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">check_zone</span> <span class="o">=</span> <span class="n">is_bit_set</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">perimeter_only</span> <span class="o">=</span> <span class="n">is_bit_set</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span> | |||
<span class="c"># bits 17-20 unused.</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">system_fault</span> <span class="o">=</span> <span class="n">is_bit_set</span><span class="p">(</span><span class="mi">17</span><span class="p">)</span> | |||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitfield</span><span class="p">[</span><span class="mi">18</span><span class="p">]</span> <span class="ow">in</span> <span class="n">PANEL_TYPES</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span> | |||
<span class="bp">self</span><span class="o">.</span><span class="n">panel_type</span> <span class="o">=</span> <span class="n">PANEL_TYPES</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">18</span><span class="p">]]</span> | |||
<span class="c"># pos 20-21 - 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="c"># Current cursor location on the alpha display.</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">panel_type</span> <span class="o">==</span> <span class="n">ADEMCO</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="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="c"># Current cursor location on the alpha display.</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> | |||
<div class="viewcode-block" id="Message.dict"><a class="viewcode-back" href="../../alarmdecoder.html#alarmdecoder.messages.Message.dict">[docs]</a> <span class="k">def</span> <span class="nf">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> | |||
<span class="sd">"""</span> | |||
@@ -296,6 +296,12 @@ | |||
<dd><p>The status of message deduplication as configured on the device.</p> | |||
</dd></dl> | |||
<dl class="attribute"> | |||
<dt id="alarmdecoder.decoder.AlarmDecoder.mode"> | |||
<tt class="descname">mode</tt><em class="property"> = 0</em><a class="headerlink" href="#alarmdecoder.decoder.AlarmDecoder.mode" title="Permalink to this definition">¶</a></dt> | |||
<dd><p>The panel mode that the AlarmDecoder is in. Currently supports ADEMCO and DSC.</p> | |||
</dd></dl> | |||
<dl class="attribute"> | |||
<dt id="alarmdecoder.decoder.AlarmDecoder.id"> | |||
<tt class="descname">id</tt><a class="reference internal" href="_modules/alarmdecoder/decoder.html#AlarmDecoder.id"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#alarmdecoder.decoder.AlarmDecoder.id" title="Permalink to this definition">¶</a></dt> | |||
@@ -1246,6 +1252,18 @@ devices.</p> | |||
<dd><p>Indicates whether or not the perimeter is armed.</p> | |||
</dd></dl> | |||
<dl class="attribute"> | |||
<dt id="alarmdecoder.messages.Message.system_fault"> | |||
<tt class="descname">system_fault</tt><em class="property"> = False</em><a class="headerlink" href="#alarmdecoder.messages.Message.system_fault" title="Permalink to this definition">¶</a></dt> | |||
<dd><p>Indicates whether a system fault has occurred.</p> | |||
</dd></dl> | |||
<dl class="attribute"> | |||
<dt id="alarmdecoder.messages.Message.panel_type"> | |||
<tt class="descname">panel_type</tt><em class="property"> = 0</em><a class="headerlink" href="#alarmdecoder.messages.Message.panel_type" title="Permalink to this definition">¶</a></dt> | |||
<dd><p>Indicates which panel type was the source of this message.</p> | |||
</dd></dl> | |||
<dl class="attribute"> | |||
<dt id="alarmdecoder.messages.Message.numeric_code"> | |||
<tt class="descname">numeric_code</tt><em class="property"> = None</em><a class="headerlink" href="#alarmdecoder.messages.Message.numeric_code" title="Permalink to this definition">¶</a></dt> | |||
@@ -1266,7 +1284,7 @@ devices.</p> | |||
<dl class="attribute"> | |||
<dt id="alarmdecoder.messages.Message.mask"> | |||
<tt class="descname">mask</tt><em class="property"> = None</em><a class="headerlink" href="#alarmdecoder.messages.Message.mask" title="Permalink to this definition">¶</a></dt> | |||
<tt class="descname">mask</tt><em class="property"> = 4294967295</em><a class="headerlink" href="#alarmdecoder.messages.Message.mask" title="Permalink to this definition">¶</a></dt> | |||
<dd><p>Address mask this message is intended for.</p> | |||
</dd></dl> | |||
@@ -549,10 +549,14 @@ | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.mask">mask (alarmdecoder.messages.Message attribute)</a> | |||
</dt> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message">Message (class in alarmdecoder.messages)</a> | |||
</dt> | |||
</dl></td> | |||
<td style="width: 33%" valign="top"><dl> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message">Message (class in alarmdecoder.messages)</a> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.decoder.AlarmDecoder.mode">mode (alarmdecoder.decoder.AlarmDecoder attribute)</a> | |||
</dt> | |||
</dl></td> | |||
@@ -740,6 +744,10 @@ | |||
</dt> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.panel_type">panel_type (alarmdecoder.messages.Message attribute)</a> | |||
</dt> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.LRRMessage.partition">partition (alarmdecoder.messages.LRRMessage attribute)</a> | |||
</dt> | |||
@@ -883,12 +891,12 @@ | |||
<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware.STAGE_DONE">STAGE_DONE (alarmdecoder.util.Firmware attribute)</a> | |||
</dt> | |||
</dl></td> | |||
<td style="width: 33%" valign="top"><dl> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware.STAGE_LOAD">STAGE_LOAD (alarmdecoder.util.Firmware attribute)</a> | |||
</dt> | |||
</dl></td> | |||
<td style="width: 33%" valign="top"><dl> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.util.Firmware.STAGE_START">STAGE_START (alarmdecoder.util.Firmware attribute)</a> | |||
</dt> | |||
@@ -935,6 +943,10 @@ | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.RFMessage.supervision">supervision (alarmdecoder.messages.RFMessage attribute)</a> | |||
</dt> | |||
<dt><a href="alarmdecoder.html#alarmdecoder.messages.Message.system_fault">system_fault (alarmdecoder.messages.Message attribute)</a> | |||
</dt> | |||
</dl></td> | |||
</tr></table> | |||