Mercurial > ~darius > hgwebdir.cgi > iec1107
annotate iec1107.py @ 3:535076e31660
Parse the result.
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Wed, 20 Nov 2013 14:45:16 +1030 |
parents | 8f1a773a3cd5 |
children | 10a16898903d |
rev | line source |
---|---|
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
2 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
3 # |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
4 # http://www.domoticaforum.eu/viewtopic.php?f=71&t=7489 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
5 # |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
6 |
3 | 7 import datetime |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
8 import exceptions |
3 | 9 import re |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
10 import serial |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
11 import sys |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
12 import time |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
13 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
14 baudtable = {'0' : 300, '1' : 600, '2' : 1200, '3' : 2400, '4' : 4800, '5' : 9600, '6' : 19200} |
3 | 15 parsere = re.compile('([0-9A-Z](\.[0-9A-Z]){1,})\((.*)\)') |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
16 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
17 class Error(exceptions.BaseException): |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
18 pass |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
19 |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
20 class IEC1107Reading(object): |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
21 def __init__(self, port, force300bps = True): |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
22 # Open port |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
23 s = serial.Serial(port, baudrate = 300, bytesize = 7, parity = 'E', stopbits = 1) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
24 s.timeout = 2.5 |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
25 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
26 # Send ident message |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
27 s.write('/?!\r\n') |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
28 rtn = s.readline() |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
29 if len(rtn) == 0: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
30 raise Error('No reply to probe') |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
31 if len(rtn) < 6 or rtn[0] != '/' or rtn[-1] != '\n' or rtn[-2] != '\r': |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
32 raise Error('Invalid line "%s"' % (rtn)) |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
33 |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
34 rtn = rtn.strip() |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
35 self.mfg = rtn[1:4] |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
36 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
37 if self.mfg[2].isupper(): |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
38 self.restime = 0.2 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
39 else: |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
40 self.restime = 0.02 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
41 |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
42 if force300bps: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
43 self.baudid = '0' |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
44 else: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
45 self.baudid = rtn[4] |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
46 if self.baudid not in baudtable: |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
47 raise Error('Invalid baud rate %c from "%s"' % (selfbaudid, rtn)) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
48 else: |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
49 self.baud = baudtable[self.baudid] |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
50 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
51 if rtn[5] == '/': |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
52 self.mode = rtn[6] |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
53 self.mfg = rtn[7:] |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
54 else: |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
55 self.mode = None |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
56 self.mfg = rtn[5:] |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
57 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
58 # Send ACK/option message |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
59 # Byte Meaning |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
60 # 0 ACK (0x06) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
61 # 1 Protocol character ('0' = normal, '1' = secondary, '2' = HDLC protocol) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
62 # 2 Baud rate ID ('0', '1', etc) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
63 # 3 Mode control('0' = read data, '1' = device prog) |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
64 s.write('\x060%c0\r\n' % (self.baudid)) |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
65 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
66 time.sleep(self.restime) |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
67 s.setBaudrate(self.baud) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
68 |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
69 lines = [] |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
70 cksum = 0 |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
71 |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
72 # Read STX |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
73 head = s.read(1) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
74 if len(head) == 0: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
75 raise Error('No reply to query') |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
76 if head != '\x02': |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
77 raise Error('Invalid reply header 0x%02x' % (ord(head))) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
78 |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
79 # Read result lines |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
80 while True: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
81 line = s.readline() |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
82 if len(line) == 0: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
83 raise Error('Timeout during message') |
3 | 84 |
85 cksum ^= reduce(lambda x, y: x ^ y, map(ord, line)) | |
86 if line.strip() == '!': | |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
87 break |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
88 lines.append(line) |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
89 |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
90 # Read trailer |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
91 fin = s.read(2) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
92 if len(fin) != 2: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
93 raise Error('Timeout reading trailer') |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
94 if fin[0] != '\x03': |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
95 raise Error('Trailer malformed, expected 0x03, got 0x%02x' % (ord(fin[0]))) |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
96 |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
97 # Validate checksum |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
98 cksum ^= ord(fin[0]) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
99 if cksum != ord(fin[1]): |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
100 raise Error('Checksum mismatch, expected 0x%02x, got 0x%02x' % (cksum, ord(fin[1]))) |
2
8f1a773a3cd5
Don't strip lines to make printing easier.
Daniel O'Connor <darius@dons.net.au>
parents:
1
diff
changeset
|
101 self.rawreading = lines |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
102 del s |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
103 |
3 | 104 self.parse() |
105 self.readdate = datetime.datetime.now() | |
106 | |
107 def parse(self): | |
108 for l in self.rawreading: | |
109 m = parsere.match(l) | |
110 if m == None: | |
111 raise Error('Unable to parse result \"%s\"' % (l)) | |
112 | |
113 (code, xxx, value) = m.groups() | |
114 if code == 'C.1': | |
115 self.meterid, date = value.split('(') | |
116 # XXX: The meter I have is an hour slow | |
117 self.meterdate = datetime.datetime.strptime(date, '%H:%M %d-%m-%y') | |
118 elif code == '1.8.0': | |
119 self.importWh = int(value[0:-3]) | |
120 elif code[0:4] == '1.8.': | |
121 # Differing tarrifs which I don't care about | |
122 pass | |
123 elif code == '2.8.0': | |
124 self.exportWh = int(value[0:-3]) | |
125 else: | |
126 print 'Unknown code', code | |
127 | |
128 def __str__(self): | |
129 return 'Time: %s, Meter: %s, Import: %d Wh, Export: %d Wh' % (self.readdate.strftime('%Y/%m/%d %H:%M'), | |
130 self.meterid, self.importWh, self.exportWh) | |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
131 def main(): |
1
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
132 if len(sys.argv) != 2: |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
133 print 'Bad usage' |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
134 print '\t%s portname' % (sys.argv[0]) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
135 sys.exit(1) |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
136 |
99f25c8ab92f
Make class version actually work, remove procedure.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
137 res = IEC1107Reading(sys.argv[1]) |
2
8f1a773a3cd5
Don't strip lines to make printing easier.
Daniel O'Connor <darius@dons.net.au>
parents:
1
diff
changeset
|
138 map(sys.stdout.write, res.rawreading) |
8f1a773a3cd5
Don't strip lines to make printing easier.
Daniel O'Connor <darius@dons.net.au>
parents:
1
diff
changeset
|
139 print res |
0
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
140 if __name__ == '__main__': |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
141 main() |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
142 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
143 # Meter number is 1288004 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
144 # 1.8.0 is import |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
145 # 1.8.1 is ?? |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
146 # 1.8.2 is ?? |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
147 # 1.8.3 is ?? |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
148 # 2.8.0 is export |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
149 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
150 # C.1(12880041.0(22:25 18-11-13) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
151 # 1.8.1(0000000597*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
152 # 1.8.2(0000000000*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
153 # 1.8.3(0000264238*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
154 # 1.8.0(0000264835*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
155 # 2.8.0(0000511354*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
156 |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
157 # ==> /?!<0D><0A> |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
158 # <== /ACE5SMLCD |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
159 # ==> <06>050<0D><0A> |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
160 # <== -- STX -- |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
161 # <== C.1(12880041.0(22:48 18-11-13) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
162 # <== 1.8.1(0000000597*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
163 # <== 1.8.2(0000000000*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
164 # <== 1.8.3(0000264460*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
165 # <== 1.8.0(0000265057*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
166 # <== 2.8.0(0000511354*Wh) |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
167 # <== ! |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
168 # <== -- ETX -- |
fd8520d969c4
Initial commit, only readmeter function works
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
169 # <== -- BCC -- |