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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
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
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
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
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
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
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
84
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
85 cksum ^= reduce(lambda x, y: x ^ y, map(ord, line))
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
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
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
104 self.parse()
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
105 self.readdate = datetime.datetime.now()
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
106
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
107 def parse(self):
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
108 for l in self.rawreading:
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
109 m = parsere.match(l)
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
110 if m == None:
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
111 raise Error('Unable to parse result \"%s\"' % (l))
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
112
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
113 (code, xxx, value) = m.groups()
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
114 if code == 'C.1':
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
115 self.meterid, date = value.split('(')
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
116 # XXX: The meter I have is an hour slow
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
117 self.meterdate = datetime.datetime.strptime(date, '%H:%M %d-%m-%y')
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
118 elif code == '1.8.0':
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
119 self.importWh = int(value[0:-3])
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
120 elif code[0:4] == '1.8.':
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
121 # Differing tarrifs which I don't care about
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
122 pass
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
123 elif code == '2.8.0':
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
124 self.exportWh = int(value[0:-3])
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
125 else:
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
126 print 'Unknown code', code
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
127
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
128 def __str__(self):
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
129 return 'Time: %s, Meter: %s, Import: %d Wh, Export: %d Wh' % (self.readdate.strftime('%Y/%m/%d %H:%M'),
535076e31660 Parse the result.
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
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 --