Mercurial > ~darius > hgwebdir.cgi > beermon
comparison beermon.py @ 1:c0b01c8c63eb
Log version at startup, add copyright verbiage, etc..
Move log init into the top level and pass it around (dunno why global
doesn't do what I want tho..)
Change hysteresis temperature to 1 degree.
author | darius |
---|---|
date | Mon, 24 Sep 2007 04:05:52 +0000 |
parents | 1c6f5a0281c7 |
children | 17bc5535bbb7 |
comparison
equal
deleted
inserted
replaced
0:1c6f5a0281c7 | 1:c0b01c8c63eb |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | |
3 ############################################################################ | |
4 # Monitor & control fermenter temperature | |
5 # v1.0 | |
6 # | |
7 # $Id: beermon.py,v 1.2 2007/09/24 04:05:52 darius Exp $ | |
8 # | |
9 # Depends on: Python 2.3 (I think) | |
10 # | |
11 ############################################################################ | |
12 # | |
13 # Copyright (C) 2007 Daniel O'Connor. All rights reserved. | |
14 # | |
15 # Redistribution and use in source and binary forms, with or without | |
16 # modification, are permitted provided that the following conditions | |
17 # are met: | |
18 # 1. Redistributions of source code must retain the above copyright | |
19 # notice, this list of conditions and the following disclaimer. | |
20 # 2. Redistributions in binary form must reproduce the above copyright | |
21 # notice, this list of conditions and the following disclaimer in the | |
22 # documentation and/or other materials provided with the distribution. | |
23 # | |
24 # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |
25 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
26 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
27 # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE | |
28 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
29 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
30 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
31 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
32 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
33 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
34 # SUCH DAMAGE. | |
35 # | |
36 ############################################################################ | |
37 | |
2 | 38 |
3 import pexpect, re, threading, time, logging | 39 import pexpect, re, threading, time, logging |
4 from logging.handlers import RotatingFileHandler | 40 from logging.handlers import RotatingFileHandler |
5 | 41 |
6 class ROMReadError(Exception): | 42 class ROMReadError(Exception): |
7 pass | 43 pass |
8 | 44 |
9 class Control(): | 45 class Control(): |
10 targetTemp = 18 | 46 targetTemp = 18 |
11 hysteresis = 4 | 47 hysteresis = 1 |
12 pollInterval = 30 | 48 pollInterval = 30 |
13 | 49 |
14 def __init__(self, m): | 50 def __init__(self, m, _log): |
15 self.m = m | 51 self.m = m |
16 self.initLog() | |
17 | |
18 def initLog(self): | |
19 # Init our logging | |
20 global log | 52 global log |
21 log = logging.getLogger("monitor") | 53 log = _log |
22 | 54 |
23 # Default to warts and all logging | |
24 log.setLevel(logging.DEBUG) | |
25 | |
26 # Log to this file | |
27 logfile = logging.handlers.RotatingFileHandler(filename = "/tmp/monitor.log", | |
28 maxBytes = 10000, backupCount = 3) | |
29 | |
30 # And stderr | |
31 logstderr = logging.StreamHandler() | |
32 | |
33 # Format it nicely | |
34 formatter = logging.Formatter(fmt = "%(asctime)s: %(message)s", datefmt = "%Y%m%d %H:%M:%S") | |
35 | |
36 # Glue it all together | |
37 logfile.setFormatter(formatter) | |
38 logstderr.setFormatter(formatter) | |
39 log.addHandler(logfile) | |
40 log.addHandler(logstderr) | |
41 return(log) | |
42 | |
43 def doit(self): | 55 def doit(self): |
44 log.debug("=== Inited ===") | |
45 log.debug("target temperature - %3.2f" % (self.targetTemp)) | 56 log.debug("target temperature - %3.2f" % (self.targetTemp)) |
46 log.debug("fermenterId - %s" % (self.m.fermenterId)) | 57 log.debug("fermenterId - %s" % (self.m.fermenterId)) |
47 log.debug("fridgeId - %s" % (self.m.fridgeId)) | 58 log.debug("fridgeId - %s" % (self.m.fridgeId)) |
48 log.debug("ambientId - %s" % (self.m.ambientId)) | 59 log.debug("ambientId - %s" % (self.m.ambientId)) |
49 log.debug("minCoolOnTime - %d, minCoolOffTime - %d" % (self.m.minCoolOnTime, self.m.minCoolOffTime)) | 60 log.debug("minCoolOnTime - %d, minCoolOffTime - %d" % (self.m.minCoolOnTime, self.m.minCoolOffTime)) |
263 | 274 |
264 def run(self): | 275 def run(self): |
265 while True: | 276 while True: |
266 self.updateTemps() | 277 self.updateTemps() |
267 | 278 |
279 def initLog(): | |
280 # Init our logging | |
281 global log | |
282 log = logging.getLogger("monitor") | |
283 | |
284 # Default to warts and all logging | |
285 log.setLevel(logging.DEBUG) | |
286 | |
287 # Log to this file | |
288 logfile = logging.handlers.RotatingFileHandler(filename = "/tmp/beermon.log", | |
289 maxBytes = 1000000, backupCount = 3) | |
290 | |
291 # And stderr | |
292 logstderr = logging.StreamHandler() | |
293 | |
294 # Format it nicely | |
295 formatter = logging.Formatter(fmt = "%(asctime)s: %(message)s", datefmt = "%Y/%m/%d %H:%M:%S") | |
296 | |
297 # Glue it all together | |
298 logfile.setFormatter(formatter) | |
299 logstderr.setFormatter(formatter) | |
300 log.addHandler(logfile) | |
301 log.addHandler(logstderr) | |
302 return(log) | |
303 | |
268 def main(): | 304 def main(): |
269 import time, monitor | 305 import sys, traceback, beermon |
270 | 306 |
271 m = monitor.MonitorDev() | 307 exitCode = 0 |
308 | |
309 initLog() | |
310 | |
311 log.debug("=== Initing ===") | |
312 log.debug("$Id: beermon.py,v 1.2 2007/09/24 04:05:52 darius Exp $") | |
313 m = beermon.MonitorDev() | |
272 | 314 |
273 try: | 315 try: |
274 c = monitor.Control(m) | 316 c = beermon.Control(m, log) |
275 # Wait for the first temperature readings to come through, saves | 317 # Wait for the first temperature readings to come through, saves |
276 # getting an 'invalid data' message | 318 # getting an 'invalid data' message |
277 time.sleep(3) | 319 time.sleep(3) |
278 c.doit() | 320 c.doit() |
279 log.debug("doit exited") | 321 log.debug("doit exited") |
280 | 322 |
281 except KeyboardInterrupt: | 323 except KeyboardInterrupt: |
282 log.debug("Exiting due to keyboard interrupt") | 324 log.debug("Exiting due to keyboard interrupt") |
325 | |
326 #except Exception, e: | |
327 # log.debug("Something went wrong, details below") | |
328 # log.debug(e) | |
329 # #log.debug(reduce(lambda x, y: x + y, traceback.format_exception( | |
330 # # sys.last_type, sys.last_value, sys.last_traceback))) | |
331 # exitCode = 1 | |
283 | 332 |
284 finally: | 333 finally: |
285 # Make sure we try and turn it off if something goes wrong | 334 # Make sure we try and turn it off if something goes wrong |
286 m.setState('idle') | 335 m.setState('idle') |
287 | 336 |
288 sys.exit(0) | 337 sys.exit(exitCode) |
289 | 338 |
290 if __name__ == "__main__": | 339 if __name__ == "__main__": |
291 main() | 340 main() |