insource vedirect

master
ademant 2019-06-15 08:28:24 +02:00
parent d6741fcc6f
commit 93c99e8107
1 changed files with 101 additions and 6 deletions

107
logger.py
View File

@ -4,7 +4,7 @@ import numpy as np
import os, serial,time,socket,sys,json,logging,requests,getopt
# import the server implementation
# import ADC
import vedirect
#import vedirect
#import upload_osm
configfile="config.json"
@ -24,6 +24,93 @@ channel_info={"time":{"sensor":"CPU","timestamp":0,"i2c":0},"CPU_temp":{"sensor"
a = 2
# import vedirect from https://github.com/karioja/vedirect
# description of channels:https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable
class vedirect:
def __init__(self, serialport, timeout):
self.serialport = serialport
self.ser = serial.Serial(serialport, 19200, timeout=timeout)
self.header1 = '\r'
self.header2 = '\n'
self.hexmarker = ':'
self.delimiter = '\t'
self.key = ''
self.value = ''
self.bytes_sum = 0;
self.state = self.WAIT_HEADER
self.dict = {}
(HEX, WAIT_HEADER, IN_KEY, IN_VALUE, IN_CHECKSUM) = range(5)
def input(self, byte):
if byte == self.hexmarker and self.state != self.IN_CHECKSUM:
self.state = self.HEX
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:
print 'Malformed packet'
self.bytes_sum = 0
elif self.state == self.HEX:
self.bytes_sum = 0
if byte == self.header2:
self.state = self.WAIT_HEADER
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)
if byte:
packet = self.input(byte)
if (packet != None):
callbackFunction(packet)
else:
break
def print_data_callback(data):
print data
# end import vedirect
def upload_osm(sensebox_id,sensor_id,value):
url="https://ingress.opensensemap.org/boxes/%s/%s" % (sensebox_id,sensor_id)
r = requests.post(url,json={'value': value})
@ -164,6 +251,7 @@ if "vedirect" in log_conf:
bve_port=log_conf['vedirect']['port']
else:
bve_port='/dev/serial/by-id/usb-VictronEnergy_BV_VE_Direct_cable_VE1SSBVT-if00-port0'
print(bve_port)
try:
ve=vedirect(bve_port,60)
except:
@ -173,6 +261,8 @@ if "vedirect" in log_conf:
channel_names.append(i)
channel_info[i]={"sensor":"victron","timestamp":0,"i2c":0}
print(bve)
# declare adc
badc=False
if "ads1x15" in log_conf:
@ -320,11 +410,16 @@ while a > 1:
except:
print("could not read VE")
else:
ch_val[channel_names.index("volt_bat_ve")]=int(vedata['V']) # Battery voltage measured by ve
ch_val[channel_names.index("volt_arr_ve")]=int(vedata['VPV']) # Array voltage measured by ve
ch_val[channel_names.index("amp_ve")]=int(vedata['I']) # loading current by ve
ch_val[channel_names.index("watt_ve")]=int(vedata['PPV']) # Array power measured by ve
ch_val[channel_names.index("days_ve")]=int(vedata['HSDS']) # total days online ve
if 'V' in vedata:
ch_val[channel_names.index("volt_bat_ve")]=int(vedata['V']) # Battery voltage measured by ve
if 'VPV' in vedata:
ch_val[channel_names.index("volt_arr_ve")]=int(vedata['VPV']) # Array voltage measured by ve
if 'I' in vedata:
ch_val[channel_names.index("amp_ve")]=int(vedata['I']) # loading current by ve
if 'PPV' in vedata:
ch_val[channel_names.index("watt_ve")]=int(vedata['PPV']) # Array power measured by ve
if 'HSDS' in vedata:
ch_val[channel_names.index("days_ve")]=int(vedata['HSDS']) # total days online ve
for i in range(len(ch_val)):
ch_mean[i]=ch_mean[i]+ch_val[i]