annotate epro.py @ 13:4450cf739263

Add link to protocol document.
author Daniel O'Connor <darius@dons.net.au>
date Mon, 06 Dec 2021 11:25:51 +1030
parents 0a571da65068
children 60ead9b5fc1b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 #!/usr/bin/env python
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2
12
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
3 import logging
4
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
4 import serial
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
5 import sys
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
6
12
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
7 logger = logging.getLogger('epro')
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
8
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
9 # View facing ePro from the back
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
10 # +---+
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11 # +-| |-|
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
12 # | |
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
13 # | |
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
14 # +-------+
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
15 # 1 ... 6
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
16 #
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
17 # RJ12 plug (Jaycar cable colours)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
18 # 1 white temp out
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
19 # 2 black temp in
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
20 # 3 red GND
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21 # 4 green TX TTL (5V)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
22 # 5 yellow RX TTL (5V)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
23 # 6 blue VCC (12V)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
24 #
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
25 # 2400bps 8E1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 # s = serial.Serial('/dev/cu.usbserial-AM01Z7TZ', 2400, parity='E')
13
4450cf739263 Add link to protocol document.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
27 #
4450cf739263 Add link to protocol document.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
28 # Protocol document: https://www.enerdrive.com.au/wp-content/uploads/ePRO-communication-interface-spec-rev.02.pdf
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 class Packet(object):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31 MSGTYPE = -1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 self.dstadr = dstadr
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35 self.srcadr = srcadr
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
36 self.devid = devid
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
37 self.msgtype = msgtype
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38 self.data = data
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
39
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
40 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41 hdr = "Src: 0x%02x Dst: 0x%02x DevID: 0x%02x MsgType: 0x%02x" % (
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 self.dstadr, self.srcadr, self.devid, self.msgtype)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 # MSGTYPE is overridden for subclasses which also have their own repr so don't dumb data here
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44 if self.MSGTYPE == -1:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45 hdr += " Data:"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46 for d in self.data:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 hdr += " 0x%02x" % (d)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48 else:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
49 hdr += " Name: " + self.MSGNAME
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51 return hdr
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
52
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53 class MainVoltage(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 """Main Battery Voltage"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55 MSGTYPE = 0x60
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
56 MSGNAME = "Main Voltage"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
58
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60 super(MainVoltage, self).__init__(dstadr, srcadr, devid, msgtype, data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61 self.volts = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x03) << 14) / 100.0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 s = super(MainVoltage, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 s += ": %.2f V" % (self.volts)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
66 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
67
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
68 class BatteryCurrent(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69 """Main Battery Current"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
70 MSGTYPE = 0x61
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
71 MSGNAME = "Battery Current"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
72 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
73
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
74 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
75 super(BatteryCurrent, self).__init__(dstadr, srcadr, devid, msgtype, data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
76 self.amps = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x3f) << 14) / 100.0
6
2f7ee650e6fb Use correct byte for sign bit.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
77 if data[0] & 0x40:
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
78 self.amps *= -1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
79
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
80 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
81 s = super(BatteryCurrent, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
82 s += ": %.2f A" % (self.amps)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
83 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
84
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
85 class AmpHours(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
86 """Number of amp hours removed from the battery"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
87 MSGTYPE = 0x62
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
88 MSGNAME = "Amp Hours"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
89 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
90
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
91 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
92 super(AmpHours, self).__init__(dstadr, srcadr, devid, msgtype, data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
93 self.amphrs = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x3f) << 14) / 100.0
7
3baca74482b6 Fix a few more incorrect sign bits
Daniel O'Connor <darius@dons.net.au>
parents: 6
diff changeset
94 if data[0] & 0x40:
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
95 self.amphrs *= -1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
96
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
97 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
98 s = super(AmpHours, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
99 s += ": %.2f Ah" % (self.amphrs)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
100 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
101
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
102 class StateOfCharge(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
103 """State of battery charge"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
104 MSGTYPE = 0x64
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
105 MSGNAME = "State Of Charge"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
106 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
107
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
108 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
109 super(StateOfCharge, self).__init__(dstadr, srcadr, devid, msgtype, data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
110 self.soc = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x03) << 14) / 10.0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
111
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
112 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
113 s = super(StateOfCharge, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
114 s += ": %.2f%%" % (self.soc)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
115 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
116
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
117 class TimeRemaining(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
118 """Time remaining until battery needs charging"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
119 MSGTYPE = 0x65
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
120 MSGNAME = "Time remaining"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
121 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
122
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
123 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
124 super(TimeRemaining, self).__init__(dstadr, srcadr, devid, msgtype, data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
125 self.time = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x3f) << 14)
7
3baca74482b6 Fix a few more incorrect sign bits
Daniel O'Connor <darius@dons.net.au>
parents: 6
diff changeset
126 if data[0] & 0x40:
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
127 self.time *= -1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
128
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
129 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
130 s = super(TimeRemaining, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
131 s += ": %.2f min" % (self.time)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
132 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
133
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
134 class BatteryTemperature(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
135 """Battery temperature (degrees Celcius)"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
136 MSGTYPE = 0x66
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
137 MSGNAME = "Battery Temperature"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
138 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
139
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
140 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
141 super(BatteryTemperature, self).__init__(dstadr, srcadr, devid, msgtype, data)
3
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
142 self.temp = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x3f) << 14) / 10.0
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
143 if data[2] & 0x40:
3
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
144 self.temp *= -1
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
145 if self.temp == -20:
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
146 self.temp = None
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
147
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
148 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
149 s = super(BatteryTemperature, self).__repr__()
3
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
150 if self.temp == None:
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
151 s += ": n/a"
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
152 else:
6d0fe22566ab Fix cut & paste error for variable name, report disconnected sensor specially.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
153 s += ": %.2f degC" % (self.temp)
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
154 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
155
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
156 class MonitorStatus(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
157 """Monitor status"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
158 MSGTYPE = 0x67
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
159 MSGNAME = "Monitor Status"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
160 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
161
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
162 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
163 super(MonitorStatus, self).__init__(dstadr, srcadr, devid, msgtype, data)
5
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
164 self.autosyncvolt = bool(data[0] & 0x10)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
165 self.autosyncamp = bool(data[0] & 0x08)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
166 self.autosyncchrg = bool(data[0] & 0x04)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
167 self.e501compat = bool(data[0] & 0x02)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
168 self.alarmtst = bool(data[0] & 0x01)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
169 self.backlight = bool(data[1] & 0x40)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
170 self.disptst = bool(data[1] & 0x20)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
171 self.tempsense = bool(data[1] & 0x10) # Seems to be inverted from data sheet
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
172 self.auxhv = bool(data[1] & 0x08)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
173 self.auxlv = bool(data[1] & 0x04)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
174 self.lock = bool(data[1] & 0x02)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
175 self.mainhv = bool(data[1] & 0x01)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
176 self.mainlv = bool(data[2] & 0x40)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
177 self.lowbatalarm = bool(data[2] & 0x20)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
178 self.batflat = bool(data[2] & 0x10)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
179 self.batfull = bool(data[2] & 0x08)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
180 self.charged = bool(data[2] & 0x04)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
181 self.nosync = bool(data[2] & 0x02)
982eeffe9d95 Convert booleans to boolean. Sqlite doesn't do it and stores them as ints instead
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
182 self.monreset = bool(data[2] & 0x01)
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
183
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
184 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
185 s = super(MonitorStatus, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
186 stats = ( ( "ASV", self.autosyncvolt ), ( "ASA", self.autosyncamp ), ( "ASC" , self.autosyncchrg ),
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
187 ( "E501", self.e501compat ), ( "Alarm test", self.alarmtst ), ( "Light", self.backlight ),
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
188 ( "Temperature Sensor", self.tempsense ), ( "Aux HV", self.auxhv ), ( "Aux LV", self.auxlv ),
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
189 ( "Lock", self.lock ), ( "Main HV", self.mainhv ), ( "Main LV", self.mainlv ),
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
190 ( "Low Battery", self.lowbatalarm ), ( "Battery Flat", self.batfull ),
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
191 ( "Battery Full", self.batfull ), ( "Battery Charged", self.charged ),
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
192 ( "No Sync", self.nosync ), ( "Monitor Reset", self.monreset ) )
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
193 for (short, var) in stats:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
194 if var:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
195 s += " %s : True" % (short)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
196 else:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
197 s += " %s : False" % (short)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
198
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
199 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
200
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
201 class AuxVoltage(Packet):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
202 """Aux Battery Voltage"""
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
203 MSGTYPE = 0x68
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
204 MSGNAME = "Aux Voltage"
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
205 LEN = 3
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
206
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
207 def __init__(self, dstadr, srcadr, devid, msgtype, data):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
208 super(AuxVoltage, self).__init__(dstadr, srcadr, devid, msgtype, data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
209 self.volts = (data[2] & 0x7f | (data[1] & 0x7f) << 7 | (data[0] & 0x03) << 14) / 100.0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
210
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
211 def __repr__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
212 s = super(AuxVoltage, self).__repr__()
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
213 s += ": %.2f V" % (self.volts)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
214 return s
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
215
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
216 class Processor(object):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
217 PKT_TYPES = { MainVoltage.MSGTYPE : MainVoltage, BatteryCurrent.MSGTYPE : BatteryCurrent,
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
218 AmpHours.MSGTYPE : AmpHours, StateOfCharge.MSGTYPE : StateOfCharge,
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
219 TimeRemaining.MSGTYPE : TimeRemaining, BatteryTemperature.MSGTYPE : BatteryTemperature,
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
220 MonitorStatus.MSGTYPE : MonitorStatus, AuxVoltage.MSGTYPE : AuxVoltage }
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
221
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
222 def __init__(self):
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
223 self.state = 0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
224 self.packets = []
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
225
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
226 def process(self, dat):
4
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
227 added = False
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
228 for d in dat:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
229 d = ord(d)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
230 if d == 0xff and self.state != 4:
12
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
231 logger.warn("Packet corruption")
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
232 continue
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
233
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
234 if self.state == 0:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
235 # Waiting for destination address (MSB set but not 0xff as that is EOM)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
236 if d == 0xff or d & 0x80 == 0:
12
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
237 logger.info("Skipping byte")
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
238 continue
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
239 self.dstadr = d & 0x7f
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
240 self.data = []
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
241 self.state += 1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
242 elif self.state == 1:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
243 # Source address
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
244 self.srcadr = d
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
245 self.state += 1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
246 elif self.state == 2:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
247 # Device ID
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
248 self.devid = d
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
249 self.state += 1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
250 elif self.state == 3:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
251 # Message type
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
252 self.msgtype = d
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
253 self.state += 1
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
254 elif self.state == 4:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
255 # Data
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
256 if d != 0xff:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
257 self.data.append(d)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
258 continue
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
259 self.state = 0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
260 if self.msgtype in Processor.PKT_TYPES:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
261 t = self.PKT_TYPES[self.msgtype]
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
262 if len(self.data) != t.LEN:
12
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
263 logger.warn("Packet length incorrect, expected %d got %d", t.LEN, len(self.data))
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
264 continue
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
265
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
266 p = self.PKT_TYPES[self.msgtype](self.dstadr, self.srcadr, self.devid, self.msgtype, self.data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
267 else:
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
268 p = Packet(self.dstadr, self.srcadr, self.devid, self.msgtype, self.data)
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
269
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
270 self.packets.append(p)
4
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
271 added = True
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
272 return added
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
273
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
274 def main():
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
275 if len(sys.argv) != 2:
12
0a571da65068 Use logging rather than print.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
276 print('Bad usage')
4
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
277 exit(1)
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
278
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
279 s = serial.Serial(sys.argv[1], 2400, parity='E')
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
280 s.timeout = 0.2
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
281
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
282 p = Processor()
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
283 while True:
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
284 res = p.process(s.read(1024))
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
285 while len(p.packets) > 0:
787d9c8fdec6 Add working example when run as an exe
Daniel O'Connor <darius@dons.net.au>
parents: 3
diff changeset
286 print(p.packets.pop(0))
0
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
287
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
288 if __name__ == '__main__':
1de08e57774f Initial comit of code to talk to EnerDrive ePro battery monitor
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
289 main()