forked from karioja/vedirect
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvedirect.py
117 lines (103 loc) · 3.44 KB
/
vedirect.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Modified to upload(post) data to Emoncms.org - Kogant
# Run in cron
# # m h dom mon dow command
# * * * * * /opt/vedirect/vedirect.py 2>&1 | /usr/bin/logger -t veDirectStats
import os, serial, datetime, time, httplib, sys
# apikey emoncms account (change it)
apikey = "" # ie: ff227081609c5f57f2f536b4411a915ba
class vedirect:
def __init__(self, serialport):
self.serialport = serialport
self.ser = serial.Serial(serialport, 19200, timeout=10)
self.header1 = '\r'
self.header2 = '\n'
self.delimiter = '\t'
self.key = ''
self.value = ''
self.bytes_sum = 0;
self.state = self.WAIT_HEADER
self.dict = {}
(WAIT_HEADER, IN_KEY, IN_VALUE, IN_CHECKSUM) = range(4)
def input(self, byte):
if self.state == self.WAIT_HEADER:
self.bytes_sum += ord(byte)
if byte == self.header1:
self.state = self.WAIT_HEADER
elif byte == self.header2:
self.state = self.IN_KEY
return None
elif self.state == self.IN_KEY:
self.bytes_sum += ord(byte)
if byte == self.delimiter:
if (self.key == 'Checksum'):
self.state = self.IN_CHECKSUM
else:
self.state = self.IN_VALUE
else:
self.key += byte
return None
elif self.state == self.IN_VALUE:
self.bytes_sum += ord(byte)
if byte == self.header1:
self.state = self.WAIT_HEADER
self.dict[self.key] = self.value;
self.key = '';
self.value = '';
else:
self.value += byte
return None
elif self.state == self.IN_CHECKSUM:
self.bytes_sum += ord(byte)
self.key = ''
self.value = ''
self.state = self.WAIT_HEADER
if (self.bytes_sum % 256 == 0):
self.bytes_sum = 0
return self.dict
else:
self.bytes_sum = 0
else:
raise AssertionError()
def read_data(self):
while True:
byte = self.ser.read(1)
packet = self.input(byte)
def read_data_single(self):
while True:
byte = self.ser.read(1)
packet = self.input(byte)
if (packet != None):
return packet
def read_data_callback(self, callbackFunction):
while True:
byte = self.ser.read(1)
packet = self.input(byte)
if (packet != None):
callbackFunction(packet)
domain="emoncms.org"
baseurl="/input/post.json?apikey="+apikey+"&json="
def print_data_callback(data):
data=repr(data)
data=data.replace(" ","") # no spaces allowed
print(data)
try:
conn = httplib.HTTPSConnection(domain)
except:
print("Failed connecting to "+domain)
sys.exit(1)
else:
print("Connected successfully to "+domain)
try:
conn.request("POST", baseurl+data)
except:
print("Failed uploading data")
sys.exit(1)
else:
print("Uploaded data OK")
sys.exit(0)
#time.sleep(60)
if __name__ == '__main__':
ve = vedirect('/dev/ttyUSB0') # Verify this simply by looking at /var/log/syslog when inserting cable.
ve.read_data_callback(print_data_callback)