Mercurial > templog
annotate py/sensor_ds18b20.py @ 149:d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sun, 16 Dec 2012 22:14:46 +0800 |
parents | b32e5a11a4cb |
children | e114b38c8a55 |
rev | line source |
---|---|
141 | 1 #!/usr/bin/env python2.7 |
2 | |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
3 import os |
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
4 import re |
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
5 |
144 | 6 import gevent |
148 | 7 import gevent.threadpool |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
8 |
144 | 9 import config |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
10 from utils import D,L,W,E,EX |
144 | 11 |
12 class DS18B20s(gevent.Greenlet): | |
13 | |
14 THERM_RE = re.compile('.* YES\n.*t=(.*)\n', re.MULTILINE) | |
141 | 15 |
144 | 16 def __init__(self, server): |
17 gevent.Greenlet.__init__(self) | |
18 self.server = server | |
148 | 19 self.readthread = gevent.threadpool.ThreadPool(1) |
20 self.master_dir = config.SENSOR_BASE_DIR | |
144 | 21 |
22 def _run(self): | |
23 while True: | |
24 self.do() | |
25 gevent.sleep(config.SENSOR_SLEEP) | |
26 | |
148 | 27 def read_wait(self, f): |
28 # handles a blocking file read with a gevent threadpool. A | |
29 # real python thread performs the read while other gevent | |
30 # greenlets keep running. | |
31 # the ds18b20 takes ~750ms to read, which is noticable | |
32 # interactively. | |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
33 return self.readthread.apply(f.read) |
141 | 34 |
148 | 35 def do_sensor(self, s, contents = None): |
36 """ contents can be set by the caller for testing """ | |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
37 D("dosensor %s" % s) |
144 | 38 try: |
39 if contents is None: | |
148 | 40 fn = os.path.join(self.master_dir, s, 'w1_slave') |
144 | 41 f = open(fn, 'r') |
148 | 42 contents = self.read_wait(f) |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
43 |
144 | 44 match = self.THERM_RE.match(contents) |
45 if match is None: | |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
46 D("no match") |
144 | 47 return None |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
48 temp = int(match.groups(1)[0]) / 1000.0 |
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
49 D("returning %f" % temp) |
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
50 return temp |
144 | 51 except Exception, e: |
52 EX("Problem reading sensor '%s': %s" % (s, str(e))) | |
53 return None | |
141 | 54 |
144 | 55 def do(self): |
56 vals = {} | |
57 for n in self.sensor_names(): | |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
58 value = self.do_sensor(n) |
144 | 59 if value is not None: |
60 vals[n] = value | |
61 | |
62 self.server.add_reading(vals) | |
63 | |
64 def sensor_names(self): | |
65 """ Returns a sequence of sensorname """ | |
148 | 66 slaves_path = os.path.join(self.master_dir, "w1_master_slaves") |
149
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
67 names = open(slaves_path, 'r').read().split() |
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
68 D("returning names %s" % names) |
d686b111dab4
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
148
diff
changeset
|
69 return names |
141 | 70 |
71 def wort_name(self): | |
144 | 72 return config.WORT_NAME |
141 | 73 |
74 def fridge_name(self): | |
144 | 75 return config.FRIDGE_NAME |