Mercurial > templog
annotate py/params.py @ 196:e27075b1e088
Make sure we close descriptor before rename
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Wed, 12 Feb 2014 20:57:30 +0800 |
parents | 78255c49bf9a |
children | 16a83e2c97a0 |
rev | line source |
---|---|
145 | 1 # -*- coding: utf-8 -*- |
2 import collections | |
3 import json | |
157 | 4 import signal |
160 | 5 import StringIO |
157 | 6 |
7 import gevent | |
8 | |
145 | 9 import config |
148 | 10 from utils import W,L,E,EX |
145 | 11 |
12 _FIELD_DEFAULTS = { | |
13 'fridge_setpoint': 16, | |
14 'fridge_difference': 0.2, | |
15 'overshoot_delay': 720, # 12 minutes | |
16 'overshoot_factor': 1, # ÂșC | |
162
d73077e8cd67
Add daemon mode with locking, add "disabled" parameter
Matt Johnston <matt@ucc.asn.au>
parents:
160
diff
changeset
|
17 'disabled': False, |
168 | 18 'nowort': False, |
170
78255c49bf9a
make fridge air range a parameter
Matt Johnston <matt@ucc.asn.au>
parents:
168
diff
changeset
|
19 'fridge_range_lower': 3, |
78255c49bf9a
make fridge air range a parameter
Matt Johnston <matt@ucc.asn.au>
parents:
168
diff
changeset
|
20 'fridge_range_upper': 3, |
145 | 21 } |
22 | |
23 class Params(dict): | |
24 class Error(Exception): | |
25 pass | |
26 | |
27 def __init__(self): | |
28 self.update(_FIELD_DEFAULTS) | |
157 | 29 gevent.signal(signal.SIGHUP, self.reload_signal) |
145 | 30 |
31 def __getattr__(self, k): | |
32 return self[k] | |
33 | |
34 def __setattr__(self, k, v): | |
35 # fail if we set a bad value | |
36 self[k] | |
37 self[k] = v | |
38 | |
39 def load(self, f = None): | |
40 if not f: | |
148 | 41 try: |
42 f = file(config.PARAMS_FILE, 'r') | |
43 except IOError, e: | |
44 W("Missing parameter file, using defaults. %s", e) | |
45 return | |
157 | 46 try: |
47 u = json.load(f) | |
48 except Exception, e: | |
49 raise self.Error(e) | |
50 | |
145 | 51 for k in u: |
166
5d5424acfed0
- use the fridge temperature for control too, keep it in a 6deg band
Matt Johnston <matt@ucc.asn.au>
parents:
162
diff
changeset
|
52 if k.startswith('_'): |
5d5424acfed0
- use the fridge temperature for control too, keep it in a 6deg band
Matt Johnston <matt@ucc.asn.au>
parents:
162
diff
changeset
|
53 continue |
145 | 54 if k not in self: |
55 raise self.Error("Unknown parameter %s=%s in file '%s'" % (str(k), str(u[k]), getattr(f, 'name', '???'))) | |
56 self.update(u) | |
57 | |
160 | 58 L("Loaded parameters") |
59 L(self.save_string()) | |
60 | |
61 | |
145 | 62 def save(self, f = None): |
63 if not f: | |
64 f = file(config.PARAMS_FILE, 'w') | |
65 json.dump(self, f, sort_keys=True, indent=4) | |
155 | 66 f.write('\n') |
145 | 67 f.flush() |
157 | 68 |
160 | 69 def save_string(self): |
70 s = StringIO.StringIO() | |
71 self.save(s) | |
72 return s.getvalue() | |
73 | |
157 | 74 def reload_signal(self): |
75 try: | |
76 self.load() | |
160 | 77 L("Reloaded.") |
157 | 78 except self.Error, e: |
79 W("Problem reloading: %s" % str(e)) |