From 7a795ba5dac3c509ad7ae52e0a07570118a4c4fa Mon Sep 17 00:00:00 2001 From: Scott Petersen Date: Mon, 2 Dec 2013 16:01:28 -0800 Subject: [PATCH] More name changes. --- docs/_build/doctrees/environment.pickle | Bin 99470 -> 100634 bytes docs/_build/doctrees/index.doctree | Bin 5471 -> 5454 bytes docs/_build/doctrees/modules.doctree | Bin 2785 -> 2779 bytes docs/_build/doctrees/pyad2.doctree | Bin 250057 -> 250271 bytes docs/_build/doctrees/pyad2.event.doctree | Bin 15792 -> 15777 bytes docs/_build/doctrees/pyad2usb.doctree | Bin 250081 -> 0 bytes docs/_build/doctrees/pyad2usb.event.doctree | Bin 15801 -> 0 bytes docs/_build/html/_modules/pyad2/ad2.html | 112 +- docs/_build/html/_modules/pyad2/devices.html | 80 +- .../html/_modules/pyad2/event/event.html | 8 + docs/_build/html/_modules/pyad2/messages.html | 42 +- docs/_build/html/_modules/pyad2/util.html | 7 +- .../html/_modules/pyad2/zonetracking.html | 19 +- docs/_build/html/_sources/index.txt | 2 +- docs/_build/html/_sources/pyad2usb.event.txt | 19 - docs/_build/html/_sources/pyad2usb.txt | 58 - docs/_build/html/genindex.html | 42 +- docs/_build/html/objects.inv | Bin 1301 -> 1288 bytes docs/_build/html/pyad2.event.html | 19 +- docs/_build/html/pyad2.html | 112 +- docs/_build/html/pyad2usb.event.html | 146 -- docs/_build/html/pyad2usb.html | 1277 ----------------- docs/_build/html/searchindex.js | 2 +- docs/_build/text/index.txt | 37 - docs/_build/text/modules.txt | 25 - docs/_build/text/pyad2.event.txt | 39 - docs/_build/text/pyad2.txt | 784 ---------- pyad2/zonetracking.py | 2 +- setup.py | 2 +- 29 files changed, 240 insertions(+), 2594 deletions(-) delete mode 100644 docs/_build/doctrees/pyad2usb.doctree delete mode 100644 docs/_build/doctrees/pyad2usb.event.doctree delete mode 100644 docs/_build/html/_sources/pyad2usb.event.txt delete mode 100644 docs/_build/html/_sources/pyad2usb.txt delete mode 100644 docs/_build/html/pyad2usb.event.html delete mode 100644 docs/_build/html/pyad2usb.html delete mode 100644 docs/_build/text/index.txt delete mode 100644 docs/_build/text/modules.txt delete mode 100644 docs/_build/text/pyad2.event.txt delete mode 100644 docs/_build/text/pyad2.txt diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 2e883f0a8d1fe382c8df1b5cd07b3c3aa15a3a37..fcdc7b7eca39d0262b89048951cae3713bff122c 100644 GIT binary patch delta 25168 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 JO8!>E{{h=1D);~Z delta 24055 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 delta 252 zcmX@7bzf^kJ|oXr1_p+L%ET0-(&D7aam+_2+cKHTX#xfHi%Uw=()80aOY|YK`fz2v zOeawEZH{A}%rC8pTgPTj;UGrVA`M0chRM+)l3JQTMn@=jQDS*~YF=VePHIY#7Es8W zF_br@G`AqWIJKlCGcUckNPF@;5jkNUkQ_rOb7o3$kuH#3TckJnyoi#pKA3F)Bs1hQ nv@;ZIiwq~Th-xVq0YzeqjDch*TTyBnNSg^*sVR^wP0|AZ!g@#w diff --git a/docs/_build/doctrees/modules.doctree b/docs/_build/doctrees/modules.doctree index c48c080fe8c151ea426cb4894a3d5ed7ccd3050d..1da7dfcb657316b1c2208454da9d0f36012df397 100644 GIT binary patch delta 29 jcmaDTdRugZB_pH8WGhCg&Ebso>_Db1qxj~J93L0~icJY2 delta 37 ocmcaD`cQO(B_pHuWGhA~=F;M%%^{5S>_Dz9qd1uRn&Sf_0NL~lxBvhE diff --git a/docs/_build/doctrees/pyad2.doctree b/docs/_build/doctrees/pyad2.doctree index c1c2073f21f603cd57b80988b839bba33133b3a0..833b99b39d3f817f41be1e3a26f5e285e08bd8a1 100644 GIT binary patch delta 16415 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 Pk^6~bufevlBJY0y_UqLV delta 16446 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 imeA2JE-6h*(@)PV(N9bEvZ9`3SQ@*aTvc91< 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 VO&>-pcnrOd48E*@Yv;J?{{#7tKi>cV diff --git a/docs/_build/doctrees/pyad2usb.event.doctree b/docs/_build/doctrees/pyad2usb.event.doctree deleted file mode 100644 index 44216ccb87cfb8415da2cbcc8e26ad34e16ef91a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15801 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 JuCSource code for pyad2.ad2 diff --git a/docs/_build/html/_modules/pyad2/event/event.html b/docs/_build/html/_modules/pyad2/event/event.html index 6220ad8..3427864 100644 --- a/docs/_build/html/_modules/pyad2/event/event.html +++ b/docs/_build/html/_modules/pyad2/event/event.html @@ -48,6 +48,14 @@

Source code for pyad2.event.event

 # event.py (improved)
+#
+
+# Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html
+# 
+# License: https://creativecommons.org/licenses/by/2.1/jp/deed.en
+#
+# Changes:
+#    Added type check in fire()
 
 
[docs]class Event(object): diff --git a/docs/_build/html/_modules/pyad2/messages.html b/docs/_build/html/_modules/pyad2/messages.html index 0ecdbb1..58da4c4 100644 --- a/docs/_build/html/_modules/pyad2/messages.html +++ b/docs/_build/html/_modules/pyad2/messages.html @@ -48,20 +48,30 @@

Source code for pyad2.messages

 """
-Message representations received from the panel through the AD2USB.
+Message representations received from the panel through the AD2 devices.
 
 .. moduleauthor:: Scott Petersen <scott@nutech.com>
 """
 
 import re
-from . import util
+
+from .util import InvalidMessageError
 
 
[docs]class BaseMessage(object): """ Base class for messages. """ def __init__(self): + """ + Constructor + """ self.raw = None + + def __str__(self): + """ + String conversion operator. + """ + return self.raw
[docs]class Message(BaseMessage): """ @@ -111,12 +121,12 @@ :param data: The message data. :type data: str - :raises: util.InvalidMessageError + :raises: InvalidMessageError """ m = self._regex.match(data) if m is None: - raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) + raise InvalidMessageError('Received invalid message: {0}'.format(data)) self.bitfield, self.numeric_code, self.panel_data, alpha = m.group(1, 2, 3, 4) self.mask = int(self.panel_data[3:3+8], 16) @@ -150,7 +160,7 @@ """ String conversion operator. """ - return 'msg > {0:0<9} [{1}{2}{3}] -- ({4}) {5}'.format(hex(self.mask), 1 if self.ready else 0, 1 if self.armed_away else 0, 1 if self.armed_home else 0, self.numeric_code, self.text) + return self.raw
[docs]class ExpanderMessage(BaseMessage): """ @@ -158,7 +168,9 @@ """ ZONE = 0 + """Flag indicating that the expander message relates to a Zone Expander.""" RELAY = 1 + """Flag indicating that the expander message relates to a Relay Expander.""" def __init__(self, data=None): """ @@ -180,13 +192,7 @@ """ String conversion operator. """ - expander_type = 'UNKWN' - if self.type == ExpanderMessage.ZONE: - expander_type = 'ZONE' - elif self.type == ExpanderMessage.RELAY: - expander_type = 'RELAY' - - return 'exp > [{0: <5}] {1}/{2} -- {3}'.format(expander_type, self.address, self.channel, self.value) + return self.raw def _parse_message(self, data): """ @@ -205,12 +211,14 @@ self.value = int(value) except ValueError: - raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) + raise InvalidMessageError('Received invalid message: {0}'.format(data)) if header == '!EXP': self.type = ExpanderMessage.ZONE elif header == '!REL': self.type = ExpanderMessage.RELAY + else: + raise InvalidMessageError('Unknown expander message header: {0}'.format(data))
[docs]class RFMessage(BaseMessage): """ @@ -238,7 +246,7 @@ """ String conversion operator. """ - return 'rf > {0}: {1:x}'.format(self.serial_number, self.value) + return self.raw def _parse_message(self, data): """ @@ -266,7 +274,7 @@ self.loop[3] = is_bit_set(8) except ValueError: - raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) + raise InvalidMessageError('Received invalid message: {0}'.format(data))
[docs]class LRRMessage(BaseMessage): @@ -293,7 +301,7 @@ """ String conversion operator. """ - return 'lrr > {0} @ {1} -- {2}'.format(self.event_data, self.partition, self.event_type) + return self.raw def _parse_message(self, data): """ @@ -309,7 +317,7 @@ self.event_data, self.partition, self.event_type = values.split(',') except ValueError: - raise util.InvalidMessageError('Received invalid message: {0}'.format(data))
+ raise InvalidMessageError('Received invalid message: {0}'.format(data))
diff --git a/docs/_build/html/_modules/pyad2/util.html b/docs/_build/html/_modules/pyad2/util.html index 52dbe3e..0e16016 100644 --- a/docs/_build/html/_modules/pyad2/util.html +++ b/docs/_build/html/_modules/pyad2/util.html @@ -48,14 +48,13 @@

Source code for pyad2.util

 """
-Provides utility classes for the AD2USB devices.
+Provides utility classes for the AD2 devices.
 
 .. moduleauthor:: Scott Petersen <scott@nutech.com>
 """
 
 import ad2
 import time
-import traceback
 import threading
 
 
[docs]class NoDeviceError(Exception): @@ -84,7 +83,7 @@
[docs]class Firmware(object): """ - Represents firmware for the AD2USB/AD2SERIAL devices. + Represents firmware for the AD2 devices. """ # Constants @@ -98,7 +97,7 @@ @staticmethod
[docs] def upload(dev, filename, progress_callback=None): """ - Uploads firmware to an AD2USB/AD2SERIAL device. + Uploads firmware to an AD2 device. :param filename: The firmware filename :type filename: str diff --git a/docs/_build/html/_modules/pyad2/zonetracking.html b/docs/_build/html/_modules/pyad2/zonetracking.html index 6bb1c19..d3db801 100644 --- a/docs/_build/html/_modules/pyad2/zonetracking.html +++ b/docs/_build/html/_modules/pyad2/zonetracking.html @@ -48,15 +48,16 @@

Source code for pyad2.zonetracking

 """
-Provides zone tracking functionality for the AD2USB device family.
+Provides zone tracking functionality for the AD2 device family.
 
 .. moduleauthor:: Scott Petersen <scott@nutech.com>
 """
 
 import re
 import time
+
 from .event import event
-from . import messages
+from .messages import ExpanderMessage
 
 
[docs]class Zone(object): """ @@ -126,10 +127,8 @@ :param message: Message to use to update the zone tracking. :type message: Message or ExpanderMessage """ - zone = -1 - - if isinstance(message, messages.ExpanderMessage): - if message.type == messages.ExpanderMessage.ZONE: + if isinstance(message, ExpanderMessage): + if message.type == ExpanderMessage.ZONE: zone = self._expander_to_zone(message.address, message.channel) status = Zone.CLEAR @@ -138,6 +137,9 @@ elif message.value == 2: status = Zone.CHECK + # NOTE: Expander zone faults are handled differently than regular messages. + # We don't include them in self._zones_faulted because they are not reported + # by the panel in it's rolling list of faults. try: self._update_zone(zone, status=status) @@ -317,10 +319,7 @@ :returns: Whether or not the zone is expired. """ - if time.time() > self._zones[zone].timestamp + Zonetracker.EXPIRE: - return True - - return False + return time.time() > self._zones[zone].timestamp + Zonetracker.EXPIRE def _expander_to_zone(self, address, channel): """ diff --git a/docs/_build/html/_sources/index.txt b/docs/_build/html/_sources/index.txt index 9b9e2c4..1acdb0d 100644 --- a/docs/_build/html/_sources/index.txt +++ b/docs/_build/html/_sources/index.txt @@ -1,4 +1,4 @@ -.. pyad2usb documentation master file, created by +.. pyad2 documentation master file, created by sphinx-quickstart on Sat Jun 8 14:38:46 2013. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. diff --git a/docs/_build/html/_sources/pyad2usb.event.txt b/docs/_build/html/_sources/pyad2usb.event.txt deleted file mode 100644 index 9f2c38b..0000000 --- a/docs/_build/html/_sources/pyad2usb.event.txt +++ /dev/null @@ -1,19 +0,0 @@ -event Package -============= - -:mod:`event` Package --------------------- - -.. automodule:: pyad2.event - :members: - :undoc-members: - :show-inheritance: - -:mod:`event` Module -------------------- - -.. automodule:: pyad2.event.event - :members: - :undoc-members: - :show-inheritance: - diff --git a/docs/_build/html/_sources/pyad2usb.txt b/docs/_build/html/_sources/pyad2usb.txt deleted file mode 100644 index f7848a5..0000000 --- a/docs/_build/html/_sources/pyad2usb.txt +++ /dev/null @@ -1,58 +0,0 @@ -pyad2usb Package -================ - -:mod:`ad2` Module --------------------- - -.. automodule:: pyad2.ad2 - :members: - :undoc-members: - :show-inheritance: - -:mod:`devices` Module ---------------------- - -.. automodule:: pyad2.devices - :members: - :undoc-members: - :show-inheritance: - -:mod:`util` Module ------------------- - -.. automodule:: pyad2.util - :members: - :undoc-members: - :show-inheritance: - -:mod:`zonetracking` Module --------------------------- - -.. automodule:: pyad2.zonetracking - :members: - :undoc-members: - :show-inheritance: - -:mod:`panels` Module --------------------- - -.. automodule:: pyad2.panels - :members: - :undoc-members: - :show-inheritance: - -:mod:`messages` Module ----------------------- - -.. automodule:: pyad2.messages - :members: - :undoc-members: - :show-inheritance: - -Subpackages ------------ - -.. toctree:: - - pyad2usb.event - diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 2a19561..3ce87ef 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -77,9 +77,17 @@
AD2 (class in pyad2.ad2)
+ +
AD2Factory (class in pyad2.ad2) +
+
+
AD2Factory.DetectThread (class in pyad2.ad2) +
+ +
add() (pyad2.event.event.EventHandler method)
@@ -135,7 +143,7 @@
-
(pyad2.ad2.Overseer method) +
(pyad2.ad2.AD2Factory method)
@@ -160,7 +168,7 @@ -
create() (pyad2.ad2.Overseer class method) +
create() (pyad2.ad2.AD2Factory class method)
@@ -184,7 +192,7 @@ -
devices() (pyad2.ad2.Overseer class method) +
devices() (pyad2.ad2.AD2Factory class method)
@@ -244,7 +252,7 @@
-
find_all() (pyad2.ad2.Overseer class method) +
find_all() (pyad2.ad2.AD2Factory class method)
@@ -290,7 +298,7 @@
-
get_device() (pyad2.ad2.Overseer method) +
get_device() (pyad2.ad2.AD2Factory method)
@@ -378,7 +386,7 @@ -
on_attached (pyad2.ad2.Overseer attribute) +
on_attached (pyad2.ad2.AD2Factory attribute)
@@ -404,7 +412,7 @@ -
on_detached (pyad2.ad2.Overseer attribute) +
on_detached (pyad2.ad2.AD2Factory attribute)
@@ -427,12 +435,12 @@
on_lrr_message (pyad2.ad2.AD2 attribute)
+
+
on_message (pyad2.ad2.AD2 attribute)
-
-
on_open (pyad2.ad2.AD2 attribute)
@@ -509,14 +517,6 @@
- -
Overseer (class in pyad2.ad2) -
- - -
Overseer.DetectThread (class in pyad2.ad2) -
- @@ -614,7 +614,7 @@ -
run() (pyad2.ad2.Overseer.DetectThread method) +
run() (pyad2.ad2.AD2Factory.DetectThread method)
@@ -692,7 +692,7 @@ -
start() (pyad2.ad2.Overseer method) +
start() (pyad2.ad2.AD2Factory method)
@@ -700,12 +700,12 @@ -
stop() (pyad2.ad2.Overseer method) +
stop() (pyad2.ad2.AD2Factory method)
-
(pyad2.ad2.Overseer.DetectThread method) +
(pyad2.ad2.AD2Factory.DetectThread method)
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 2fa977eeaee767dee8e7d8fd45e7b724517aa4bf..993a0cad0e7fdfc5b450dc9cd09906c99cab3382 100644 GIT binary patch delta 1187 zcmV;U1YG--3Wy4jb$?59;y4h#&#$0r_ZrtGyQjIC*vwE%Ldr3-J9BXfxdBydi;@Ki z`|DSJ5rb{$7Kc#5sMYG$*Iz%J%2;GEe2j7(e@)mDlF{A$XnVLz>mQtrPLtn8Pcq&m zFq#&RzN{hZ5o(^+64lZinBtq$h1Iiq*=x1ng{|Ss_Q2u?Cx3-JH{Wt|imz#<_K#8Z zQz=qCyZe1~R|{-e1_^%oPKyM+81|6qp4H{^0h#|~23j%xCbBhJQ4D**2}YYgnh{o} z^xVaLTh+;V9M^krWEL$CTb7q1Olu{UJB^VlycVt4F3~8-mQ9Xde12zHoPaW0#^q^2 zZ)ALwZW-C}xqq{G9ed@!&btyuWmkOo*tLgHXYS}Lqx#syx{lE^S#x@x$Q*79 zu9Z-Ljjq~n6UGft4rr)<2BXL{s1@U2?{L}{t(#7iB87HCl#c&l(vi8Kr|N+d_%rt> z$$;kQd41IeFk+77!7ghOz501v^!1&I1||-}O%aVH1>+$jVoM7PT~Q)1 z@a((N#mj8&dei4`6!oMUuL@AZP#g?7#Z(Lw_J2`ju$i|JnfygteotHeKwJK&UB%@* ze)k{$zNuQXD>9J`)ViOod^gF8Z&t-$eT4;E*>8`u|P1X63mie-Y^+e+`~no7dXNP66`1j}s4bUzCM zY=6dYqi6MTTf6GyrKM4}OP3X|SP+`YP~qbB=Kd2uDd^S#7r3EM zQQ1`S9%$gYESP-=@3)9xBHy5}DpYjRLptORGsp0teAP^2Jt8Xu^A zY&4$F@zYG_QKl(g-}#7~GI$-F<0(kx-g1)XaDxjC$hlIVyNc%2hExm-DovP*1b-83 zit2wua?vRrvb?Hfu$=M#eVGPUT3+IQQSX|UsY>RlCiB|b`0 zY7wfYcFMMR*AYX`m8cwg)4M&+ZXBF&2EOZ&sNrlYVgpQD-gvt;vb>ms{s-;+7{ief BSTq0t delta 1200 zcmV;h1W)^j3Y7|wb$?BB;y4h!&#$0r_ZrtGyQjIC*vwE%Ldr3-J9BXfsR31Fi;@Ki z`|DT!#9$Lz;t(nrwOifle*LigLV9%+A(dN(22q#kp z&f>nS>SRBjA3S(6OO}T%$x9KUwc^X2#z+-jOIBnjG)l5#lNT1B-$}*D?gK|wYr=JH}^OEN9wA>oc6MqKkdXS#Un%z?&bH_;ac&0(E z2nBcJ?OxIGx=_k0&l=ImGzyb=`V`I=F-ow(J1_h&RmFJuse0f=;mrSOWqD(BUZ0ma zb-qVH%OzmzM=280CUG!LeuU4#JW8ekI_28*@OE1v3ByKgF6N-5^2e>{Q!CLY9dwWcYkN9vxCm8?{fz9QhQ`PS5u> z_P>QmFn1#q0=3ZMn5V1NojTjR2^FBbMRLqjl>nim;wNGchu5 zshm?nH$GxGb2P2cl?aYWh@mK0yv*i)Fn#`JqkrCt9afNFK#_vMLuPyUO`zGxU@LZ8 zHvY0(es8z@!EX7VR?EkJ9EZ_QtE$(ddEVpq@bT}PD54v)MFL(w?8p8hi2T?A!KjHS zeN1eN8q(!*NZC3d8~nj_IRokSY3c8BF1KT7k_>kWC!+QouUnHDIMn1bs`C=fgT-Tv z<$pRS*doZmsy7*Q0j|1qO-FSgt)C1FQwWYUkkzx$kKF0IeQ#_yG^g&4v{%@$M>hj4 zSltmmESaFGM#8op6`{HMxNXwl<)x)bwo8{)z&Vr!!x7@e>&>GB{FJB97_IAnsSMd7 z^wrrRb+>Ip_G?{cgznB;W;!N0+(P>Q@qec=mh275o6jhAPdFS>mWrQcB@-$o%kYH{ z3R}%(hED<8;mgHN2TA5HP7{7%d#!#7PW;6zcFCPiE24Ip6=F3bRl9PI^U?XZgxzKv zrjlN7R|bRCk`$ebBAc?t?Q76h)05#iMV)k+UolTX?leBVhTvd4pT~GCd6a32*ME0@ zRbV@RZXMKVS`n;$$jqWeb_mm}vDxB9G{J)U@YT+z6{m+OSCw3><>9|C)5xLcDuSD} zK5?6enxsnQ9(~nw@il}o>^nLkXg|2hAw$4N?=I7_w4nRF(}|HIu32^67duUxan&^2 z6Tw++Egn5ChVX97hz7T2*ZKA?p(&s=UvWybE1hSMQ^hNrZ@LSl=jQ^S7D(5 diff --git a/docs/_build/html/pyad2.event.html b/docs/_build/html/pyad2.event.html index 887ce86..20eca0c 100644 --- a/docs/_build/html/pyad2.event.html +++ b/docs/_build/html/pyad2.event.html @@ -23,7 +23,9 @@ - + + + @@ -104,6 +110,9 @@ e.fire(earg).

+

Previous topic

+

pyad2 Package

This Page

- - -
-
-
-
-
-

Table Of Contents

- - -

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index cb2d177..9ac06d8 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,terms:{event:[],represent:3,all:[3,2],socketdevic:3,func:2,when:3,disarm:3,ssl_kei:3,basemessag:3,through:3,on_boot:3,stage_don:3,simulate_wire_problem:3,vari:3,paramet:3,current:3,baudrat:3,locat:3,zone:3,on_disarm:3,configur:3,fault_zon:3,send:3,should:3,on_attach:3,add:2,board:3,bypass:3,x03:3,on_read:3,x01:3,match:3,sent:3,x04:3,sourc:[3,2],"return":3,around:3,clear_zon:3,format:3,read:3,on_messag:3,stop:3,util:[],ssl:3,on_bypass:3,zonetrack:[],progress:3,report:3,detach:3,like:2,get_config:3,ad2:[],name:3,level:3,rfx:3,list:3,on_pan:3,authent:3,factori:3,"try":3,emul:3,stage_wait:3,timeout:3,contain:3,found:3,expandermessag:3,page:0,certif:3,set:3,nodeviceerror:3,on_open:3,creation:3,request:3,upload:3,"static":3,connect:3,fire_timeout:3,close:3,process:3,read_lin:3,arm:3,stop_read:3,pyseri:3,index:[0,3],statu:3,detect:3,power:3,defin:2,pattern:3,ad2seri:3,reboot:3,callback:3,content:0,pyftdi:3,written:3,earg:2,between:3,"new":2,method:3,localhost:3,ser2sock:3,shut:3,full:3,run:3,timeouterror:3,kei:3,detached_ev:3,gener:3,usbdevic:3,lrr:3,on_clos:3,base:[3,2],ssl_certif:3,on_config_receiv:3,serial:3,depend:3,"byte":3,on_detach:3,panel:[],search:[0,3],actual:3,expos:3,thread:3,fault:3,progress_callback:3,fixm:3,readthread:3,simul:3,stage_start:3,prior:3,rais:3,on_rfx_messag:3,fals:3,find_al:3,ad2usb:3,first:3,oper:2,revert:3,rang:3,via:3,attached_ev:3,modul:[],"float":3,number:3,automat:3,system:3,down:3,filenam:3,alreadi:3,messag:[],famili:3,path:3,batteri:3,on_writ:3,open:3,on_power_chang:3,identif:3,differ:3,"long":3,from:3,usb:3,commun:3,detectthread:3,support:3,devic:[],on_relay_chang:3,been:3,get_devic:3,trigger:3,call:[3,2],low:3,handl:3,interfac:3,stage_upload:3,type:3,start:3,"function":[3,2],wrapper:3,no_reader_thread:3,stage_load:3,fire:[3,2],handler:2,commerror:3,specifi:3,stage_boot:3,rfmessag:3,provid:3,radio:3,relai:3,x02:3,obj:2,line:3,on_fir:3,cach:3,serialdevic:3,must:2,high:3,none:[3,2],sender:2,retriev:3,describ:3,on_restor:3,restor:3,whether:3,remov:[3,2],purg:3,on_alarm:3,dev:3,charact:3,purge_buff:3,"while":3,can:[3,2],str:3,entri:3,alarm:3,aliv:3,creat:3,"int":3,well:3,save_config:3,reader:3,templat:3,repres:3,on_zone_restor:3,packag:[],on_fault:3,itself:2,exist:2,expir:3,ftdi_vendor_id:3,our:3,read_timeout:3,vendor:3,ftdi_product_id:3,attach:3,string:3,parent:3,present:3,serial_numb:3,author:3,check:3,anoth:3,belong:3,boot:3,"switch":3,invalid:3,port:3,write:3,also:2,client:3,bool:3,on_zone_fault:3,tupl:3,instead:2,you:2,probabl:3,panic:3,singl:3,updat:3,status:3,product:3,finish:3,recogn:3,firmwar:3,"default":3,buffer:3,expans:3,object:[3,2],ftdi:3,befor:3,wire:3,track:3,battery_timeout:3,on_arm:3,eventhandl:2,data:3,"class":[3,2],expand:3,subpackag:[],receiv:3,classmethod:3,doc:2,clear:3,descript:3,except:3,ssl_ca:3,issu:3,lrrmessag:3,which:3,is_reader_al:3,on_lrr_messag:3,error:3,clean:3,invalidmessageerror:3,overs:3,on_low_batteri:3},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:class","4":"py:staticmethod","5":"py:classmethod","6":"py:exception"},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","class","Python class"],"4":["py","staticmethod","Python static method"],"5":["py","classmethod","Python class method"],"6":["py","exception","Python exception"]},filenames:["index","modules","pyad2.event","pyad2"],titles:["Welcome to pyad2’s documentation!","pyad2","event Package","pyad2 Package"],objects:{"pyad2.ad2.Overseer":{on_attached:[3,1,1,""],get_device:[3,2,1,""],DetectThread:[3,3,1,""],create:[3,5,1,""],stop:[3,2,1,""],devices:[3,5,1,""],on_detached:[3,1,1,""],start:[3,2,1,""],find_all:[3,5,1,""],close:[3,2,1,""]},"pyad2.messages":{Message:[3,3,1,""],BaseMessage:[3,3,1,""],RFMessage:[3,3,1,""],ExpanderMessage:[3,3,1,""],LRRMessage:[3,3,1,""]},"pyad2.devices.Device.ReadThread":{READ_TIMEOUT:[3,1,1,""],run:[3,2,1,""],stop:[3,2,1,""]},"pyad2.ad2.Overseer.DetectThread":{run:[3,2,1,""],stop:[3,2,1,""]},"pyad2.util":{CommError:[3,6,1,""],Firmware:[3,3,1,""],TimeoutError:[3,6,1,""],NoDeviceError:[3,6,1,""],InvalidMessageError:[3,6,1,""]},"pyad2.event":{event:[2,0,1,""]},"pyad2.devices.SerialDevice":{read_line:[3,2,1,""],BAUDRATE:[3,1,1,""],read:[3,2,1,""],write:[3,2,1,""],find_all:[3,4,1,""],"interface":[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""]},"pyad2.messages.ExpanderMessage":{ZONE:[3,1,1,""],RELAY:[3,1,1,""]},pyad2:{ad2:[3,0,1,""],zonetracking:[3,0,1,""],messages:[3,0,1,""],devices:[3,0,1,""],util:[3,0,1,""],panels:[3,0,1,""],event:[2,0,1,""]},"pyad2.zonetracking.Zonetracker":{on_restore:[3,1,1,""],EXPIRE:[3,1,1,""],on_fault:[3,1,1,""],update:[3,2,1,""]},"pyad2.devices":{Device:[3,3,1,""],SocketDevice:[3,3,1,""],USBDevice:[3,3,1,""],SerialDevice:[3,3,1,""]},"pyad2.zonetracking.Zone":{STATUS:[3,1,1,""],FAULT:[3,1,1,""],CLEAR:[3,1,1,""],CHECK:[3,1,1,""]},"pyad2.ad2":{AD2:[3,3,1,""],Overseer:[3,3,1,""]},"pyad2.devices.SocketDevice":{ssl_key:[3,1,1,""],ssl_certificate:[3,1,1,""],read:[3,2,1,""],read_line:[3,2,1,""],ssl_ca:[3,1,1,""],write:[3,2,1,""],ssl:[3,1,1,""],"interface":[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""]},"pyad2.devices.USBDevice":{read_line:[3,2,1,""],BAUDRATE:[3,1,1,""],description:[3,1,1,""],read:[3,2,1,""],write:[3,2,1,""],find_all:[3,4,1,""],FTDI_VENDOR_ID:[3,1,1,""],serial_number:[3,1,1,""],"interface":[3,1,1,""],close:[3,2,1,""],FTDI_PRODUCT_ID:[3,1,1,""],open:[3,2,1,""]},"pyad2.util.Firmware":{STAGE_LOAD:[3,1,1,""],upload:[3,4,1,""],STAGE_WAITING:[3,1,1,""],STAGE_START:[3,1,1,""],STAGE_UPLOADING:[3,1,1,""],STAGE_BOOT:[3,1,1,""],STAGE_DONE:[3,1,1,""]},"pyad2.ad2.AD2":{on_rfx_message:[3,1,1,""],fault_zone:[3,2,1,""],on_open:[3,1,1,""],save_config:[3,2,1,""],on_relay_changed:[3,1,1,""],on_boot:[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""],id:[3,1,1,""],on_power_changed:[3,1,1,""],BATTERY_TIMEOUT:[3,1,1,""],on_message:[3,1,1,""],send:[3,2,1,""],reboot:[3,2,1,""],get_config:[3,2,1,""],on_zone_restore:[3,1,1,""],on_disarm:[3,1,1,""],on_fire:[3,1,1,""],on_write:[3,1,1,""],on_read:[3,1,1,""],on_lrr_message:[3,1,1,""],clear_zone:[3,2,1,""],on_zone_fault:[3,1,1,""],on_config_received:[3,1,1,""],on_close:[3,1,1,""],on_bypass:[3,1,1,""],on_low_battery:[3,1,1,""],on_arm:[3,1,1,""],F1:[3,1,1,""],F2:[3,1,1,""],F3:[3,1,1,""],F4:[3,1,1,""],on_alarm:[3,1,1,""],on_panic:[3,1,1,""],FIRE_TIMEOUT:[3,1,1,""]},"pyad2.zonetracking":{Zonetracker:[3,3,1,""],Zone:[3,3,1,""]},"pyad2.event.event.EventHandler":{fire:[2,2,1,""],add:[2,2,1,""],remove:[2,2,1,""]},"pyad2.event.event":{EventHandler:[2,3,1,""],Event:[2,3,1,""]},"pyad2.devices.Device":{on_read:[3,1,1,""],on_open:[3,1,1,""],ReadThread:[3,3,1,""],on_close:[3,1,1,""],on_write:[3,1,1,""],close:[3,2,1,""],stop_reader:[3,2,1,""],is_reader_alive:[3,2,1,""],id:[3,1,1,""]}},titleterms:{subpackag:3,ad2:3,welcom:0,pyad2:[0,1,3],pyad2usb:[],devic:3,messag:3,util:3,packag:[3,2],zonetrack:3,indic:0,tabl:0,modul:[3,2],document:0,event:2,panel:3}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{event:[0,1,3],represent:3,all:[3,2],socketdevic:3,func:2,when:3,sent:3,disarm:3,ssl_kei:3,through:3,on_boot:3,stage_don:3,simulate_wire_problem:3,vari:3,paramet:3,current:3,baudrat:3,locat:3,zone:3,on_disarm:3,configur:3,fault_zon:3,send:3,should:3,on_attach:3,add:2,board:3,bypass:3,x03:3,on_read:3,x01:3,match:3,x04:3,sourc:[3,2],"return":3,around:3,clear_zon:3,format:3,handl:3,on_messag:3,stop:3,util:[0,1],ssl:3,on_bypass:3,zonetrack:[0,1],progress:3,report:3,detach:3,like:2,serialdevic:3,ad2:[0,1],name:3,level:3,rfx:3,list:3,upload:3,authent:3,factori:3,"try":3,"default":3,expand:3,stage_wait:3,updat:3,timeout:3,contain:3,found:3,expandermessag:3,page:0,certif:3,set:3,nodeviceerror:3,on_open:3,creation:3,request:3,on_pan:3,finish:3,"static":3,connect:3,fire_timeout:3,close:3,process:3,read_lin:3,arm:3,stop_read:3,ad2factori:3,pyseri:3,index:[0,3],statu:3,wire:3,power:3,clean:3,emul:3,pattern:3,ad2seri:3,reboot:3,content:0,pyftdi:3,written:3,earg:2,between:3,"new":2,method:3,localhost:3,can:[3,2],ser2sock:3,shut:3,full:3,run:3,timeouterror:3,kei:3,detached_ev:3,gener:3,usbdevic:3,lrr:3,on_clos:3,base:[3,2],ssl_certif:3,on_config_receiv:3,depend:3,"byte":3,on_detach:3,panel:[0,1],search:[0,3],actual:3,expos:3,thread:3,fault:3,fixm:3,readthread:3,simul:3,stage_start:3,prior:3,get_config:3,on_rfx_messag:3,fals:3,find_al:3,ad2usb:3,first:3,oper:2,revert:3,rang:3,via:3,attached_ev:3,modul:[0,1],"float":3,number:3,automat:3,system:3,down:3,filenam:3,alreadi:3,"long":3,famili:3,path:3,batteri:3,on_writ:3,open:3,on_power_chang:3,identif:3,differ:3,from:3,usb:3,messag:[0,1],commun:3,detectthread:3,support:3,devic:[0,1],on_relay_chang:3,been:3,get_devic:3,trigger:3,call:[3,2],low:3,interfac:3,type:3,start:3,"function":[3,2],wrapper:3,no_reader_thread:3,classmethod:3,stage_load:3,fire:[3,2],handler:2,relat:3,specifi:3,stage_boot:3,rfmessag:3,provid:3,flag:3,radio:3,relai:3,x02:3,obj:2,line:3,on_fir:3,cach:3,present:3,must:2,high:3,none:[3,2],sender:2,retriev:3,describ:3,on_restor:3,restor:3,whether:3,remov:[3,2],purg:3,on_alarm:3,dev:3,charact:3,defin:2,"while":3,stage_upload:3,str:3,entri:3,vendor:3,alarm:3,aliv:3,creat:3,"int":3,well:3,save_config:3,reader:3,templat:3,repres:3,on_zone_restor:3,packag:[0,1],on_fault:3,itself:2,exist:2,expir:3,ftdi_vendor_id:3,our:3,read_timeout:3,on_zone_fault:3,ftdi_product_id:3,attach:3,string:3,parent:3,battery_timeout:3,serial_numb:3,author:3,receiv:3,anoth:3,belong:3,boot:3,invalid:3,port:3,write:3,also:2,client:3,bool:3,which:3,tupl:3,instead:2,you:2,probabl:3,panic:3,singl:3,purge_buff:3,status:3,product:3,commerror:3,recogn:3,firmwar:3,callback:3,buffer:3,expans:3,object:[3,2],ftdi:3,befor:3,detect:3,track:3,basemessag:3,on_arm:3,eventhandl:2,data:3,"class":[3,2],serial:3,subpackag:[0,1],read:3,doc:2,clear:3,descript:3,except:3,rais:3,ssl_ca:3,issu:3,lrrmessag:3,"switch":3,is_reader_al:3,on_lrr_messag:3,error:3,progress_callback:3,check:3,invalidmessageerror:3,on_low_batteri:3},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:class","4":"py:staticmethod","5":"py:classmethod","6":"py:exception"},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","class","Python class"],"4":["py","staticmethod","Python static method"],"5":["py","classmethod","Python class method"],"6":["py","exception","Python exception"]},filenames:["index","modules","pyad2.event","pyad2"],titles:["Welcome to pyad2’s documentation!","pyad2","event Package","pyad2 Package"],objects:{"pyad2.messages":{Message:[3,3,1,""],BaseMessage:[3,3,1,""],RFMessage:[3,3,1,""],ExpanderMessage:[3,3,1,""],LRRMessage:[3,3,1,""]},"pyad2.devices.Device.ReadThread":{READ_TIMEOUT:[3,1,1,""],run:[3,2,1,""],stop:[3,2,1,""]},"pyad2.util":{CommError:[3,6,1,""],Firmware:[3,3,1,""],TimeoutError:[3,6,1,""],NoDeviceError:[3,6,1,""],InvalidMessageError:[3,6,1,""]},"pyad2.event":{event:[2,0,1,""]},"pyad2.ad2.AD2Factory":{on_attached:[3,1,1,""],get_device:[3,2,1,""],DetectThread:[3,3,1,""],create:[3,5,1,""],stop:[3,2,1,""],devices:[3,5,1,""],on_detached:[3,1,1,""],start:[3,2,1,""],find_all:[3,5,1,""],close:[3,2,1,""]},"pyad2.devices.SerialDevice":{write:[3,2,1,""],BAUDRATE:[3,1,1,""],read:[3,2,1,""],read_line:[3,2,1,""],find_all:[3,4,1,""],"interface":[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""]},"pyad2.messages.ExpanderMessage":{ZONE:[3,1,1,""],RELAY:[3,1,1,""]},pyad2:{ad2:[3,0,1,""],zonetracking:[3,0,1,""],messages:[3,0,1,""],devices:[3,0,1,""],util:[3,0,1,""],panels:[3,0,1,""],event:[2,0,1,""]},"pyad2.ad2.AD2Factory.DetectThread":{stop:[3,2,1,""],run:[3,2,1,""]},"pyad2.zonetracking.Zonetracker":{on_restore:[3,1,1,""],EXPIRE:[3,1,1,""],on_fault:[3,1,1,""],update:[3,2,1,""]},"pyad2.devices":{Device:[3,3,1,""],SocketDevice:[3,3,1,""],USBDevice:[3,3,1,""],SerialDevice:[3,3,1,""]},"pyad2.zonetracking.Zone":{STATUS:[3,1,1,""],FAULT:[3,1,1,""],CLEAR:[3,1,1,""],CHECK:[3,1,1,""]},"pyad2.ad2":{AD2:[3,3,1,""],AD2Factory:[3,3,1,""]},"pyad2.devices.SocketDevice":{ssl_key:[3,1,1,""],ssl_certificate:[3,1,1,""],read:[3,2,1,""],read_line:[3,2,1,""],ssl_ca:[3,1,1,""],write:[3,2,1,""],ssl:[3,1,1,""],"interface":[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""]},"pyad2.devices.USBDevice":{read_line:[3,2,1,""],BAUDRATE:[3,1,1,""],description:[3,1,1,""],read:[3,2,1,""],write:[3,2,1,""],find_all:[3,4,1,""],FTDI_VENDOR_ID:[3,1,1,""],serial_number:[3,1,1,""],"interface":[3,1,1,""],close:[3,2,1,""],FTDI_PRODUCT_ID:[3,1,1,""],open:[3,2,1,""]},"pyad2.util.Firmware":{STAGE_LOAD:[3,1,1,""],upload:[3,4,1,""],STAGE_WAITING:[3,1,1,""],STAGE_START:[3,1,1,""],STAGE_UPLOADING:[3,1,1,""],STAGE_BOOT:[3,1,1,""],STAGE_DONE:[3,1,1,""]},"pyad2.ad2.AD2":{on_rfx_message:[3,1,1,""],fault_zone:[3,2,1,""],on_open:[3,1,1,""],save_config:[3,2,1,""],on_relay_changed:[3,1,1,""],on_boot:[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""],id:[3,1,1,""],on_power_changed:[3,1,1,""],BATTERY_TIMEOUT:[3,1,1,""],on_message:[3,1,1,""],send:[3,2,1,""],reboot:[3,2,1,""],get_config:[3,2,1,""],on_zone_restore:[3,1,1,""],on_disarm:[3,1,1,""],on_fire:[3,1,1,""],on_write:[3,1,1,""],on_read:[3,1,1,""],on_lrr_message:[3,1,1,""],clear_zone:[3,2,1,""],on_zone_fault:[3,1,1,""],on_config_received:[3,1,1,""],on_close:[3,1,1,""],on_bypass:[3,1,1,""],on_low_battery:[3,1,1,""],on_arm:[3,1,1,""],F1:[3,1,1,""],F2:[3,1,1,""],F3:[3,1,1,""],F4:[3,1,1,""],on_alarm:[3,1,1,""],on_panic:[3,1,1,""],FIRE_TIMEOUT:[3,1,1,""]},"pyad2.zonetracking":{Zonetracker:[3,3,1,""],Zone:[3,3,1,""]},"pyad2.event.event.EventHandler":{fire:[2,2,1,""],add:[2,2,1,""],remove:[2,2,1,""]},"pyad2.event.event":{EventHandler:[2,3,1,""],Event:[2,3,1,""]},"pyad2.devices.Device":{on_open:[3,1,1,""],on_write:[3,1,1,""],ReadThread:[3,3,1,""],on_close:[3,1,1,""],on_read:[3,1,1,""],close:[3,2,1,""],stop_reader:[3,2,1,""],is_reader_alive:[3,2,1,""],id:[3,1,1,""]}},titleterms:{subpackag:3,ad2:3,welcom:0,pyad2:[0,1,3],modul:[3,2],devic:3,messag:3,util:3,packag:[3,2],zonetrack:3,indic:0,tabl:0,document:0,event:2,panel:3}}) \ No newline at end of file diff --git a/docs/_build/text/index.txt b/docs/_build/text/index.txt deleted file mode 100644 index 198c575..0000000 --- a/docs/_build/text/index.txt +++ /dev/null @@ -1,37 +0,0 @@ - -Welcome to pyad2's documentation! -********************************* - -Contents: - -* pyad2 Package - - * "ad2" Module - - * "devices" Module - - * "util" Module - - * "zonetracking" Module - - * "panels" Module - - * "messages" Module - - * Subpackages - - * event Package - - * "event" Package - - * "event" Module - - -Indices and tables -****************** - -* *Index* - -* *Module Index* - -* *Search Page* diff --git a/docs/_build/text/modules.txt b/docs/_build/text/modules.txt deleted file mode 100644 index a3fc864..0000000 --- a/docs/_build/text/modules.txt +++ /dev/null @@ -1,25 +0,0 @@ - -pyad2 -***** - -* pyad2 Package - - * "ad2" Module - - * "devices" Module - - * "util" Module - - * "zonetracking" Module - - * "panels" Module - - * "messages" Module - - * Subpackages - - * event Package - - * "event" Package - - * "event" Module diff --git a/docs/_build/text/pyad2.event.txt b/docs/_build/text/pyad2.event.txt deleted file mode 100644 index e0ad292..0000000 --- a/docs/_build/text/pyad2.event.txt +++ /dev/null @@ -1,39 +0,0 @@ - -event Package -************* - - -"event" Package -=============== - - -"event" Module -============== - -class class pyad2.event.event.Event(doc=None) - - Bases: "object" - -class class pyad2.event.event.EventHandler(event, obj) - - Bases: "object" - - add(func) - - Add new event handler function. - - Event handler function must be defined like func(sender, earg). - You can add handler also by using '+=' operator. - - remove(func) - - Remove existing event handler function. - - You can remove handler also by using '-=' operator. - - fire(earg=None) - - Fire event and call all handler functions - - You can call EventHandler object itself like e(earg) instead of - e.fire(earg). diff --git a/docs/_build/text/pyad2.txt b/docs/_build/text/pyad2.txt deleted file mode 100644 index 1ee7633..0000000 --- a/docs/_build/text/pyad2.txt +++ /dev/null @@ -1,784 +0,0 @@ - -pyad2 Package -************* - - -"ad2" Module -============ - -Provides the full AD2USB class and factory. - -class class pyad2.ad2.Overseer(attached_event=None, detached_event=None) - - Bases: "object" - - Factory for creation of AD2USB devices as well as provides - attach/detach events." - - on_attached - - Called when an AD2USB device has been detected. - - on_detached - - Called when an AD2USB device has been removed. - - classmethod find_all() - - Returns all AD2USB devices located on the system. - - Returns: - list of devices found - - Raises : - util.CommError - - classmethod devices() - - Returns a cached list of AD2USB devices located on the system. - - Returns: - cached list of devices found. - - classmethod create(device=None) - - Factory method that returns the requested AD2USB device, or the - first device. - - Parameters: - **device** (*tuple*) -- Tuple describing the USB device to - open, as returned by find_all(). - - Returns: - AD2USB object utilizing the specified device. - - Raises : - util.NoDeviceError - - close() - - Clean up and shut down. - - start() - - Starts the detection thread, if not already running. - - stop() - - Stops the detection thread. - - get_device(device=None) - - Factory method that returns the requested AD2USB device, or the - first device. - - Parameters: - **device** (*tuple*) -- Tuple describing the USB device to - open, as returned by find_all(). - - class class DetectThread(overseer) - - Bases: "threading.Thread" - - Thread that handles detection of added/removed devices. - - stop() - - Stops the thread. - - run() - - The actual detection process. - -class class pyad2.ad2.AD2(device) - - Bases: "object" - - High-level wrapper around AD2USB/AD2SERIAL devices. - - on_arm - - Called when the panel is armed. - - on_disarm - - Called when the panel is disarmed. - - on_power_changed - - Called when panel power switches between AC and DC. - - on_alarm - - Called when the alarm is triggered. - - on_fire - - Called when a fire is detected. - - on_bypass - - Called when a zone is bypassed. - - on_boot - - Called when the device finishes bootings. - - on_config_received - - Called when the device receives its configuration. - - on_zone_fault - - Called when the device detects a zone fault. - - on_zone_restore - - Called when the device detects that a fault is restored. - - on_low_battery - - Called when the device detects a low battery. - - on_panic - - Called when the device detects a panic. - - on_relay_changed - - Called when a relay is opened or closed on an expander board. - - on_message - - Called when a message has been received from the device. - - on_lrr_message - - Called when an LRR message is received. - - on_rfx_message - - Called when an RFX message is received. - - on_open - - Called when the device has been opened. - - on_close - - Called when the device has been closed. - - on_read - - Called when a line has been read from the device. - - on_write - - Called when data has been written to the device. - - F1 = u'\x01\x01\x01' - - Represents panel function key #1 - - F2 = u'\x02\x02\x02' - - Represents panel function key #2 - - F3 = u'\x03\x03\x03' - - Represents panel function key #3 - - F4 = u'\x04\x04\x04' - - Represents panel function key #4 - - BATTERY_TIMEOUT = 30 - - Timeout before the battery status reverts. - - FIRE_TIMEOUT = 30 - - Timeout before the fire status reverts. - - id - - The ID of the AD2USB device. - - Returns: - The identification string for the device. - - open(baudrate=None, no_reader_thread=False) - - Opens the device. - - Parameters: - * **baudrate** (*int*) -- The baudrate used for the device. - - * **interface** (*varies depends on device type.. FIXME*) - -- The interface used for the device. - - * **index** (*int*) -- Interface index.. can probably - remove. FIXME - - * **no_reader_thread** (*bool*) -- Specifies whether or not - the automatic reader thread should be started or not - - close() - - Closes the device. - - send(data) - - get_config() - - Retrieves the configuration from the device. - - save_config() - - Sets configuration entries on the device. - - reboot() - - Reboots the device. - - fault_zone(zone, simulate_wire_problem=False) - - Faults a zone if we are emulating a zone expander. - - Parameters: - * **zone** (*int*) -- The zone to fault. - - * **simulate_wire_problem** (*bool*) -- Whether or not to - simulate a wire fault. - - clear_zone(zone) - - Clears a zone if we are emulating a zone expander. - - Parameters: - **zone** (*int*) -- The zone to clear. - - -"devices" Module -================ - -Contains different types of devices belonging to the AD2USB family. - -class class pyad2.devices.Device - - Bases: "object" - - Generic parent device to all AD2USB products. - - on_open - - Called when the device has been opened - - on_close - - Called when the device has been closed - - on_read - - Called when a line has been read from the device - - on_write - - Called when data has been written to the device - - id - - Retrieve the device ID. - - Returns: - The identification string for the device. - - is_reader_alive() - - Indicates whether or not the reader thread is alive. - - Returns: - Whether or not the reader thread is alive. - - stop_reader() - - Stops the reader thread. - - close() - - Closes the device. - - class class ReadThread(device) - - Bases: "threading.Thread" - - Reader thread which processes messages from the device. - - READ_TIMEOUT = 10 - - Timeout for the reader thread. - - stop() - - Stops the running thread. - - run() - - The actual read process. - -class class pyad2.devices.USBDevice(interface=(None, 0)) - - Bases: "pyad2.devices.Device" - - AD2USB device exposed with PyFTDI's interface. - - FTDI_VENDOR_ID = 1027 - - Vendor ID used to recognize AD2USB devices. - - FTDI_PRODUCT_ID = 24577 - - Product ID used to recognize AD2USB devices. - - BAUDRATE = 115200 - - Default baudrate for AD2USB devices. - - static find_all() - - Returns all FTDI devices matching our vendor and product IDs. - - Returns: - list of devices - - Raises : - util.CommError - - interface - - Retrieves the interface used to connect to the device. - - Returns: - the interface used to connect to the device. - - serial_number - - Retrieves the serial number of the device. - - Returns: - The serial number of the device. - - description - - Retrieves the description of the device. - - Returns: - The description of the device. - - open(baudrate=115200, no_reader_thread=False) - - Opens the device. - - Parameters: - * **baudrate** (*int*) -- The baudrate to use. - - * **no_reader_thread** (*bool*) -- Whether or not to - automatically start the reader thread. - - Raises : - util.NoDeviceError - - close() - - Closes the device. - - write(data) - - Writes data to the device. - - Parameters: - **data** (*str*) -- Data to write - - Raises : - util.CommError - - read() - - Reads a single character from the device. - - Returns: - The character read from the device. - - Raises : - util.CommError - - read_line(timeout=0.0, purge_buffer=False) - - Reads a line from the device. - - Parameters: - * **timeout** (*float*) -- Read timeout - - * **purge_buffer** (*bool*) -- Indicates whether to purge - the buffer prior to reading. - - Returns: - The line that was read. - - Raises : - util.CommError, util.TimeoutError - -class class pyad2.devices.SerialDevice(interface=None) - - Bases: "pyad2.devices.Device" - - AD2USB or AD2SERIAL device exposed with the pyserial interface. - - BAUDRATE = 19200 - - Default baudrate for Serial devices. - - static find_all(pattern=None) - - Returns all serial ports present. - - Parameters: - **pattern** (*str*) -- Pattern to search for when retrieving - serial ports. - - Returns: - list of devices - - Raises : - util.CommError - - interface - - Retrieves the interface used to connect to the device. - - Returns: - the interface used to connect to the device. - - open(baudrate=19200, no_reader_thread=False) - - Opens the device. - - Parameters: - * **baudrate** (*int*) -- The baudrate to use with the - device. - - * **no_reader_thread** (*bool*) -- Whether or not to - automatically start the reader thread. - - Raises : - util.NoDeviceError - - close() - - Closes the device. - - write(data) - - Writes data to the device. - - Parameters: - **data** (*str*) -- The data to write. - - Raises : - util.CommError - - read() - - Reads a single character from the device. - - Returns: - The character read from the device. - - Raises : - util.CommError - - read_line(timeout=0.0, purge_buffer=False) - - Reads a line from the device. - - Parameters: - * **timeout** (*float*) -- The read timeout. - - * **purge_buffer** (*bool*) -- Indicates whether to purge - the buffer prior to reading. - - Returns: - The line read. - - Raises : - util.CommError, util.TimeoutError - -class class pyad2.devices.SocketDevice(interface=('localhost', 10000)) - - Bases: "pyad2.devices.Device" - - Device that supports communication with an AD2USB that is exposed - via ser2sock or another Serial to IP interface. - - interface - - Retrieves the interface used to connect to the device. - - Returns: - the interface used to connect to the device. - - ssl - - Retrieves whether or not the device is using SSL. - - Returns: - Whether or not the device is using SSL. - - ssl_certificate - - Retrieves the SSL client certificate path used for - authentication. - - Returns: - The certificate path - - ssl_key - - Retrieves the SSL client certificate key used for - authentication. - - Returns: - The key path - - ssl_ca - - Retrieves the SSL Certificate Authority certificate used for - authentication. - - Returns: - The CA path - - open(baudrate=None, no_reader_thread=False) - - Opens the device. - - Parameters: - * **baudrate** (*int*) -- The baudrate to use - - * **no_reader_thread** (*bool*) -- Whether or not to - automatically open the reader thread. - - Raises : - util.NoDeviceError, util.CommError - - close() - - Closes the device. - - write(data) - - Writes data to the device. - - Parameters: - **data** (*str*) -- The data to write. - - Returns: - The number of bytes sent. - - Raises : - util.CommError - - read() - - Reads a single character from the device. - - Returns: - The character read from the device. - - Raises : - util.CommError - - read_line(timeout=0.0, purge_buffer=False) - - Reads a line from the device. - - Parameters: - * **timeout** (*float*) -- The read timeout. - - * **purge_buffer** (*bool*) -- Indicates whether to purge - the buffer prior to reading. - - Returns: - The line read from the device. - - Raises : - util.CommError, util.TimeoutError - - -"util" Module -============= - -Provides utility classes for the AD2USB devices. - -exception exception pyad2.util.NoDeviceError - - Bases: "exceptions.Exception" - - No devices found. - -exception exception pyad2.util.CommError - - Bases: "exceptions.Exception" - - There was an error communicating with the device. - -exception exception pyad2.util.TimeoutError - - Bases: "exceptions.Exception" - - There was a timeout while trying to communicate with the device. - -exception exception pyad2.util.InvalidMessageError - - Bases: "exceptions.Exception" - - The format of the panel message was invalid. - -class class pyad2.util.Firmware - - Bases: "object" - - Represents firmware for the AD2USB/AD2SERIAL devices. - - STAGE_START = 0 - - STAGE_WAITING = 1 - - STAGE_BOOT = 2 - - STAGE_LOAD = 3 - - STAGE_UPLOADING = 4 - - STAGE_DONE = 5 - - static upload(dev, filename, progress_callback=None) - - Uploads firmware to an AD2USB/AD2SERIAL device. - - Parameters: - * **filename** (*str*) -- The firmware filename - - * **progress_callback** (*function*) -- Callback function - used to report progress. - - Raises : - util.NoDeviceError, util.TimeoutError - - -"zonetracking" Module -===================== - -Provides zone tracking functionality for the AD2USB device family. - -class class pyad2.zonetracking.Zone(zone=0, name='', status=0) - - Bases: "object" - - Representation of a panel zone. - - CLEAR = 0 - - Status indicating that the zone is cleared. - - FAULT = 1 - - Status indicating that the zone is faulted. - - CHECK = 2 - - Status indicating that there is a wiring issue with the zone. - - STATUS = {0: 'CLEAR', 1: 'FAULT', 2: 'CHECK'} - -class class pyad2.zonetracking.Zonetracker - - Bases: "object" - - Handles tracking of zone and their statuses. - - on_fault - - Called when the device detects a zone fault. - - on_restore - - Called when the device detects that a fault is restored. - - EXPIRE = 30 - - Zone expiration timeout. - - update(message) - - Update zone statuses based on the current message. - - Parameters: - **message** (*Message or ExpanderMessage*) -- Message to use - to update the zone tracking. - - -"panels" Module -=============== - -Representations of Panels and their templates. - - -"messages" Module -================= - -Message representations received from the panel through the AD2USB. - -class class pyad2.messages.BaseMessage - - Bases: "object" - - Base class for messages. - -class class pyad2.messages.Message(data=None) - - Bases: "pyad2.messages.BaseMessage" - - Represents a message from the alarm panel. - -class class pyad2.messages.ExpanderMessage(data=None) - - Bases: "pyad2.messages.BaseMessage" - - Represents a message from a zone or relay expansion module. - - ZONE = 0 - - RELAY = 1 - -class class pyad2.messages.RFMessage(data=None) - - Bases: "pyad2.messages.BaseMessage" - - Represents a message from an RF receiver. - -class class pyad2.messages.LRRMessage(data=None) - - Bases: "pyad2.messages.BaseMessage" - - Represent a message from a Long Range Radio. - - -Subpackages -=========== - -* event Package - - * "event" Package - - * "event" Module diff --git a/pyad2/zonetracking.py b/pyad2/zonetracking.py index a7d6be9..024734f 100644 --- a/pyad2/zonetracking.py +++ b/pyad2/zonetracking.py @@ -1,5 +1,5 @@ """ -Provides zone tracking functionality for the AD2USB device family. +Provides zone tracking functionality for the AD2 device family. .. moduleauthor:: Scott Petersen """ diff --git a/setup.py b/setup.py index 925fb21..a186b4e 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup(name='pyad2', 'Topic :: Home Automation', 'Topic :: Security', ], - keywords='alarm data ad2usb ad2serial ad2pi security ademco dsc', + keywords='alarm data ad2 ad2usb ad2serial ad2pi security ademco dsc', url='http://github.com/nutechsoftware/pyad2', author='Nu Tech Software Solutions, Inc.', author_email='general@support.nutech.com',
 """
-Provides the full AD2USB class and factory.
+Provides the full AD2 class and factory.
 
 .. moduleauthor:: Scott Petersen <scott@nutech.com>
 """
 
 import time
 import threading
-import re
+
 from .event import event
-from . import devices
-from . import util
-from . import messages
-from . import zonetracking
+from .devices import USBDevice
+from .util import CommError, NoDeviceError
+from .messages import Message, ExpanderMessage, RFMessage, LRRMessage
+from .zonetracking import Zonetracker
 
-
[docs]class Overseer(object): +
[docs]class AD2Factory(object): """ Factory for creation of AD2USB devices as well as provides attach/detach events." """ @@ -74,19 +74,19 @@ __devices = [] @classmethod -
[docs] def find_all(cls): +
[docs] def find_all(cls): """ Returns all AD2USB devices located on the system. :returns: list of devices found - :raises: util.CommError + :raises: CommError """ - cls.__devices = devices.USBDevice.find_all() + cls.__devices = USBDevice.find_all() return cls.__devices
@classmethod -
[docs] def devices(cls): +
[docs] def devices(cls): """ Returns a cached list of AD2USB devices located on the system. @@ -95,7 +95,7 @@ return cls.__devices
@classmethod -
[docs] def create(cls, device=None): +
[docs] def create(cls, device=None): """ Factory method that returns the requested AD2USB device, or the first device. @@ -103,18 +103,18 @@ :type device: tuple :returns: AD2USB object utilizing the specified device. - :raises: util.NoDeviceError + :raises: NoDeviceError """ cls.find_all() if len(cls.__devices) == 0: - raise util.NoDeviceError('No AD2USB devices present.') + raise NoDeviceError('No AD2USB devices present.') if device is None: device = cls.__devices[0] vendor, product, sernum, ifcount, description = device - device = devices.USBDevice((sernum, ifcount - 1)) + device = USBDevice((sernum, ifcount - 1)) return AD2(device)
@@ -127,7 +127,7 @@ :param detached_event: Event to trigger when a device is detached. :type detached_event: function """ - self._detect_thread = Overseer.DetectThread(self) + self._detect_thread = AD2Factory.DetectThread(self) if attached_event: self.on_attached += attached_event @@ -135,61 +135,61 @@ if detached_event: self.on_detached += detached_event - Overseer.find_all() + AD2Factory.find_all() self.start() -
[docs] def close(self): +
[docs] def close(self): """ Clean up and shut down. """ self.stop()
-
[docs] def start(self): +
[docs] def start(self): """ Starts the detection thread, if not already running. """ if not self._detect_thread.is_alive(): self._detect_thread.start()
-
[docs] def stop(self): +
[docs] def stop(self): """ Stops the detection thread. """ self._detect_thread.stop()
-
[docs] def get_device(self, device=None): +
[docs] def get_device(self, device=None): """ 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 AD2Factory.create(device)
-
[docs] class DetectThread(threading.Thread): +
[docs] class DetectThread(threading.Thread): """ Thread that handles detection of added/removed devices. """ - def __init__(self, overseer): + def __init__(self, factory): """ Constructor - :param overseer: Overseer object to use with the thread. - :type overseer: Overseer + :param factory: AD2Factory object to use with the thread. + :type factory: AD2Factory """ threading.Thread.__init__(self) - self._overseer = overseer + self._factory = factory self._running = False -
[docs] def stop(self): +
[docs] def stop(self): """ Stops the thread. """ self._running = False
-
[docs] def run(self): +
[docs] def run(self): """ The actual detection process. """ @@ -199,20 +199,20 @@ while self._running: try: - Overseer.find_all() + AD2Factory.find_all() - current_devices = set(Overseer.devices()) + current_devices = set(AD2Factory.devices()) new_devices = [d for d in current_devices if d not in last_devices] removed_devices = [d for d in last_devices if d not in current_devices] last_devices = current_devices for d in new_devices: - self._overseer.on_attached(d) + self._factory.on_attached(d) for d in removed_devices: - self._overseer.on_detached(d) + self._factory.on_detached(d) - except util.CommError, err: + except CommError, err: pass time.sleep(0.25) @@ -220,7 +220,7 @@
[docs]class AD2(object): """ - High-level wrapper around AD2USB/AD2SERIAL devices. + High-level wrapper around AD2 devices. """ # High-level Events @@ -268,11 +268,11 @@ """ Constructor - :param device: The low-level device used for this AD2USB interface. - :type device: devices.Device + :param device: The low-level device used for this AD2 interface. + :type device: Device """ self._device = device - self._zonetracker = zonetracking.Zonetracker() + self._zonetracker = Zonetracker() self._power_status = None self._alarm_status = None @@ -294,7 +294,7 @@ @property
[docs] def id(self): """ - The ID of the AD2USB device. + The ID of the AD2 device. :returns: The identification string for the device. """ @@ -320,7 +320,9 @@ """ Closes the device. """ - self._device.close() + if self._device: + self._device.close() + del self._device self._device = None
@@ -332,7 +334,7 @@ """ Retrieves the configuration from the device. """ - self._device.write("C\r") + self.send("C\r")
[docs] def save_config(self): """ @@ -361,13 +363,13 @@ config_string = '&'.join(['='.join(t) for t in config_entries]) - self._device.write("C{0}\r".format(config_string)) + self.send("C{0}\r".format(config_string))
[docs] def reboot(self): """ Reboots the device. """ - self._device.write('=') + self.send('=')
[docs] def fault_zone(self, zone, simulate_wire_problem=False): """ @@ -388,7 +390,7 @@ status = 2 if simulate_wire_problem else 1 - self._device.write("L{0:02}{1}\r".format(zone, status)) + self.send("L{0:02}{1}\r".format(zone, status))
[docs] def clear_zone(self, zone): """ @@ -397,7 +399,7 @@ :param zone: The zone to clear. :type zone: int """ - self._device.write("L{0:02}0\r".format(zone)) + self.send("L{0:02}0\r".format(zone))
def _wire_events(self): """ @@ -420,19 +422,19 @@ :returns: An object representing the message. """ if data is None: - return None + raise InvalidMessageError() msg = None header = data[0:4] if header[0] != '!' or header == '!KPE': - msg = messages.Message(data) + msg = Message(data) if self.address_mask & msg.mask > 0: self._update_internal_states(msg) elif header == '!EXP' or header == '!REL': - msg = messages.ExpanderMessage(data) + msg = ExpanderMessage(data) self._update_internal_states(msg) @@ -451,7 +453,7 @@ return msg def _handle_rfx(self, data): - msg = messages.RFMessage(data) + msg = RFMessage(data) self.on_rfx_message(msg) @@ -466,7 +468,7 @@ :returns: An object representing the LRR message. """ - msg = messages.LRRMessage(data) + msg = LRRMessage(data) if msg.event_type == 'ALARM_PANIC': self._panic_status = True @@ -518,7 +520,7 @@ :param message: Message to update internal states with. :type message: Message, ExpanderMessage, LRRMessage, or RFMessage """ - if isinstance(message, messages.Message): + if isinstance(message, Message): if message.ac_power != self._power_status: self._power_status, old_status = message.ac_power, self._power_status @@ -560,8 +562,8 @@ self._fire_status = (message.fire_alarm, time.time()) self.on_fire(self._fire_status) - elif isinstance(message, messages.ExpanderMessage): - if message.type == messages.ExpanderMessage.RELAY: + elif isinstance(message, ExpanderMessage): + if message.type == ExpanderMessage.RELAY: self._relay_status[(message.address, message.channel)] = message.value self.on_relay_changed(message) @@ -578,9 +580,9 @@ # Retrieve a list of faults. # NOTE: This only happens on first boot or after exiting programming mode. - if isinstance(message, messages.Message): + if isinstance(message, Message): if not message.ready and "Hit * for faults" in message.text: - self._device.write('*') + self.send('*') return self._zonetracker.update(message) diff --git a/docs/_build/html/_modules/pyad2/devices.html b/docs/_build/html/_modules/pyad2/devices.html index e4e8cc5..f41fbf7 100644 --- a/docs/_build/html/_modules/pyad2/devices.html +++ b/docs/_build/html/_modules/pyad2/devices.html @@ -48,7 +48,7 @@

Source code for pyad2.devices

 """
-Contains different types of devices belonging to the AD2USB family.
+Contains different types of devices belonging to the AD2 family.
 
 .. moduleauthor:: Scott Petersen <scott@nutech.com>
 """
@@ -58,15 +58,16 @@
 import threading
 import serial, serial.tools.list_ports
 import socket
+
 from OpenSSL import SSL, crypto
 from pyftdi.pyftdi.ftdi import *
 from pyftdi.pyftdi.usbtools import *
-from . import util
+from .util import CommError, TimeoutError, NoDeviceError
 from .event import event
 
 
[docs]class Device(object): """ - Generic parent device to all AD2USB products. + Generic parent device to all AD2 products. """ # Generic device events @@ -167,7 +168,7 @@ try: self._device.read_line(timeout=self.READ_TIMEOUT) - except util.TimeoutError, err: + except TimeoutError, err: pass except Exception, err: @@ -196,7 +197,7 @@ Returns all FTDI devices matching our vendor and product IDs. :returns: list of devices - :raises: util.CommError + :raises: CommError """ devices = [] @@ -204,7 +205,7 @@ devices = Ftdi.find_all([(USBDevice.FTDI_VENDOR_ID, USBDevice.FTDI_PRODUCT_ID)], nocache=True) except (usb.core.USBError, FtdiError), err: - raise util.CommError('Error enumerating AD2USB devices: {0}'.format(str(err)), err) + raise CommError('Error enumerating AD2USB devices: {0}'.format(str(err)), err) return devices
@@ -293,7 +294,7 @@ :param no_reader_thread: Whether or not to automatically start the reader thread. :type no_reader_thread: bool - :raises: util.NoDeviceError + :raises: NoDeviceError """ # Set up defaults if baudrate is None: @@ -313,7 +314,7 @@ self._id = 'USB {0}:{1}'.format(self._device.usb_dev.bus, self._device.usb_dev.address) except (usb.core.USBError, FtdiError), err: - raise util.NoDeviceError('Error opening device: {0}'.format(str(err)), err) + raise NoDeviceError('Error opening device: {0}'.format(str(err)), err) else: self._running = True @@ -342,7 +343,7 @@ :param data: Data to write :type data: str - :raises: util.CommError + :raises: CommError """ try: self._device.write_data(data) @@ -350,14 +351,14 @@ self.on_write(data) except FtdiError, err: - raise util.CommError('Error writing to device: {0}'.format(str(err)), err) + raise CommError('Error writing to device: {0}'.format(str(err)), err)
[docs] def read(self): """ Reads a single character from the device. :returns: The character read from the device. - :raises: util.CommError + :raises: CommError """ ret = None @@ -365,7 +366,7 @@ ret = self._device.read_data(1) except (usb.core.USBError, FtdiError), err: - raise util.CommError('Error reading from device: {0}'.format(str(err)), err) + raise CommError('Error reading from device: {0}'.format(str(err)), err) return ret
@@ -379,7 +380,7 @@ :type purge_buffer: bool :returns: The line that was read. - :raises: util.CommError, util.TimeoutError + :raises: CommError, TimeoutError """ if purge_buffer: @@ -421,7 +422,7 @@ if timer: timer.cancel() - raise util.CommError('Error reading from device: {0}'.format(str(err)), err) + raise CommError('Error reading from device: {0}'.format(str(err)), err) else: if got_line: @@ -434,7 +435,7 @@ if timer.is_alive(): timer.cancel() else: - raise util.TimeoutError('Timeout while waiting for line terminator.') + raise TimeoutError('Timeout while waiting for line terminator.') return ret @@ -457,7 +458,7 @@ :type pattern: str :returns: list of devices - :raises: util.CommError + :raises: CommError """ devices = [] @@ -468,7 +469,7 @@ devices = serial.tools.list_ports.comports() except SerialException, err: - raise util.CommError('Error enumerating serial devices: {0}'.format(str(err)), err) + raise CommError('Error enumerating serial devices: {0}'.format(str(err)), err) return devices
@@ -513,14 +514,14 @@ :param no_reader_thread: Whether or not to automatically start the reader thread. :type no_reader_thread: bool - :raises: util.NoDeviceError + :raises: NoDeviceError """ # Set up the defaults if baudrate is None: baudrate = SerialDevice.BAUDRATE if self._port is None: - raise util.NoDeviceError('No device interface specified.') + raise NoDeviceError('No device interface specified.') self._device.port = self._port @@ -535,7 +536,7 @@ # all issues with it. except (serial.SerialException, ValueError), err: - raise util.NoDeviceError('Error opening device on port {0}.'.format(self._port), err) + raise NoDeviceError('Error opening device on port {0}.'.format(self._port), err) else: self._running = True @@ -561,7 +562,7 @@ :param data: The data to write. :type data: str - :raises: util.CommError + :raises: CommError """ try: self._device.write(data) @@ -570,7 +571,7 @@ pass except serial.SerialException, err: - raise util.CommError('Error writing to device.', err) + raise CommError('Error writing to device.', err) else: self.on_write(data) @@ -580,7 +581,7 @@ Reads a single character from the device. :returns: The character read from the device. - :raises: util.CommError + :raises: CommError """ ret = None @@ -588,7 +589,7 @@ ret = self._device.read(1) except serial.SerialException, err: - raise util.CommError('Error reading from device: {0}'.format(str(err)), err) + raise CommError('Error reading from device: {0}'.format(str(err)), err) return ret
@@ -602,7 +603,7 @@ :type purge_buffer: bool :returns: The line read. - :raises: util.CommError, util.TimeoutError + :raises: CommError, TimeoutError """ def timeout_event(): timeout_event.reading = False @@ -640,7 +641,7 @@ if timer: timer.cancel() - raise util.CommError('Error reading from device: {0}'.format(str(err)), err) + raise CommError('Error reading from device: {0}'.format(str(err)), err) else: if got_line: @@ -653,13 +654,13 @@ if timer.is_alive(): timer.cancel() else: - raise util.TimeoutError('Timeout while waiting for line terminator.') + raise TimeoutError('Timeout while waiting for line terminator.') return ret
[docs]class SocketDevice(Device): """ - Device that supports communication with an AD2USB that is exposed via ser2sock or another + Device that supports communication with an AD2 that is exposed via ser2sock or another Serial to IP interface. """ @@ -783,7 +784,7 @@ :param no_reader_thread: Whether or not to automatically open the reader thread. :type no_reader_thread: bool - :raises: util.NoDeviceError, util.CommError + :raises: NoDeviceError, CommError """ try: @@ -797,7 +798,7 @@ self._id = '{0}:{1}'.format(self._host, self._port) except socket.error, err: - raise util.NoDeviceError('Error opening device at {0}:{1}'.format(self._host, self._port), err) + raise NoDeviceError('Error opening device at {0}:{1}'.format(self._host, self._port), err) else: self._running = True @@ -830,7 +831,7 @@ :type data: str :returns: The number of bytes sent. - :raises: util.CommError + :raises: CommError """ data_sent = None @@ -838,12 +839,12 @@ data_sent = self._device.send(data) if data_sent == 0: - raise util.CommError('Error writing to device.') + raise CommError('Error writing to device.') self.on_write(data) except (SSL.Error, socket.error), err: - raise util.CommError('Error writing to device.', err) + raise CommError('Error writing to device.', err) return data_sent
@@ -852,7 +853,7 @@ Reads a single character from the device. :returns: The character read from the device. - :raises: util.CommError + :raises: CommError """ data = None @@ -860,7 +861,7 @@ data = self._device.recv(1) except socket.error, err: - raise util.CommError('Error while reading from device: {0}'.format(str(err)), err) + raise CommError('Error while reading from device: {0}'.format(str(err)), err) return data
@@ -874,7 +875,7 @@ :type purge_buffer: bool :returns: The line read from the device. - :raises: util.CommError, util.TimeoutError + :raises: CommError, TimeoutError """ if purge_buffer: @@ -916,7 +917,7 @@ if timer: timer.cancel() - raise util.CommError('Error reading from device: {0}'.format(str(err)), err) + raise CommError('Error reading from device: {0}'.format(str(err)), err) else: if got_line: @@ -929,7 +930,7 @@ if timer.is_alive(): timer.cancel() else: - raise util.TimeoutError('Timeout while waiting for line terminator.') + raise TimeoutError('Timeout while waiting for line terminator.') return ret
@@ -958,10 +959,9 @@ self._device = SSL.Connection(ctx, self._device) except SSL.Error, err: - raise util.CommError('Error setting up SSL connection.', err) + raise CommError('Error setting up SSL connection.', err) def _verify_ssl_callback(self, connection, x509, errnum, errdepth, ok): - #print ok return ok