This repository has been archived by the owner on Dec 2, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
sprinkler_driver.py
executable file
·123 lines (84 loc) · 3.31 KB
/
sprinkler_driver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
import sys, os
import consumer
class InvalidSprinkler(Exception):
pass
class SprinklerConsumer(consumer.BaseConsumer):
# mapping of sprinkler ID to DIO config command
sprinkler_map = {
1 : 'D0',
2 : 'D1',
}
# {{{ __init__
def __init__(self, xbee_address):
self.xbee_address = xbee_address
self.__sprinkler_active = {
1 : False,
2 : False,
}
super(SprinklerConsumer, self).__init__([self.xbee_address])
self._register_rpc_function('sprinkler', self.activate_sprinkler)
self._register_rpc_function('sprinkler', self.deactivate_sprinkler)
self._register_rpc_function('sprinkler', self.sprinkler_active)
# }}}
# {{{ handle_packet
def handle_packet(self, formatted_addr, frame):
self._logger.info("handle_packet not implemented handling %s", frame)
# }}}
# {{{ activate_sprinkler
def activate_sprinkler(self, sprinkler_id):
if sprinkler_id not in self.sprinkler_map:
raise InvalidSprinkler("invalid sprinkler id %s" % (str(sprinkler_id),))
self._logger.info("activating sprinkler %s", sprinkler_id)
success = False
dio_cmd = self.sprinkler_map[sprinkler_id]
if self._check_remote_at_frame_status(
self._send_remote_at(self.xbee_address, command = dio_cmd, param_val = '\x05')
):
success = self._check_remote_at_frame_status(
self._send_remote_at(self.xbee_address, command = 'AC')
)
if success:
self.__sprinkler_active[sprinkler_id] = True;
return success
# }}}
# {{{ deactivate_sprinkler
def deactivate_sprinkler(self, sprinkler_id):
if sprinkler_id not in self.sprinkler_map:
raise InvalidSprinkler("invalid sprinkler id %s" % (str(sprinkler_id),))
self._logger.info("deactivating sprinkler %s", sprinkler_id)
success = False
dio_cmd = self.sprinkler_map[sprinkler_id]
if self._check_remote_at_frame_status(
self._send_remote_at(self.xbee_address, command = dio_cmd, param_val = '\x04')
):
success = self._check_remote_at_frame_status(
self._send_remote_at(self.xbee_address, command = 'AC')
)
if success:
self.__sprinkler_active[sprinkler_id] = False;
return success
# }}}
# {{{ sprinkler_active
def sprinkler_active(self, sprinkler_id):
return self.__sprinkler_active[sprinkler_id]
# }}}
def main():
from support import daemonizer, log_config
import logging
import signal
basedir = os.path.abspath(os.path.dirname(__file__))
daemonizer.createDaemon()
log_config.init_logging(basedir + "/logs/sprinkler.log")
signal.signal(signal.SIGHUP, signal.SIG_IGN)
sc = SprinklerConsumer('00:11:22:33:44:55:66:1d')
try:
sc.process_forever()
except:
logging.error("unhandled exception", exc_info=True)
finally:
sc.shutdown()
log_config.shutdown()
if __name__ == '__main__':
main()