Hyperion EOS 720 SDUO3 over Wi-Fi Remote Monitoring

Пока только один канал (CH1), отображение вольтажа пака, побаночного вольтажа, тока заряда. Фактически доступен канал 2, сопротивление пака и побаночное сопротивление.
Через релюшки – управление включением-выключением зарядника (в процессе), аналогично сделаю “вывешивание” аварии по набору условий.
Плата: http://www.raspberrypi.org/ Type B, Raspbian 2013-09-50, pyserial3, запущен python -m http.server (вряд ли стоит усложнять чем-то большим).
Формат данных канала 1 (ch1). Начальная позиция: 46, длинна каждого блока – 4 байта. Начал было ковырять OpenFormat из LogView2 – но там (пока) ловить нечего, непонятно и нет времени грести чужое. Поэтому – выкладки как есть свои.
1 ch1voltPack VOLTAGE(pack) вольтаж батарейки текущий
2 ch1currPackA CURRENT ток заряда
3 ch1capPackA CHARGE?? LOADED AMPS? look clear - сколько ампер улетело в батарейку - CAPACITY
4 ch1charPackWt CAPACITY емкость - сколько приняло? - ватты
5 ch1energyPackA ENERGY энергия - сколько приняло?
6 ch1voltageInV Voltage(In) входной вольтаж (омг что это)
7 ch1tempPackT TEPMP температура (датчика нет)
8 ch1cell1PackV CELL1 VOLT
9 ch1cell2PackV
10 ch1cell3PackV
11 ch1cell4PackV
12 ch1cell5PackV
13 ch1cell6PackV
14 ch1cell7PackV CELL7 VOLT
15 ch1cell1ResOhm CELL1 RES
16 ch1cell2ResOhm
17 ch1cell3ResOhm
18 ch1cell4ResOhm
19 ch1cell5ResOhm
20 ch1cell6ResOhm
21 ch1cell7ResOhm CELL7 RES
22 ch1tcsPackP TCS% Charge
23 ch1packRes PACK RES сопротивление пака
Программа для сбора и формирования csv-файла (python3 + pyserial), извращения с float – из-за непоняток с python3 на RPi:
#!/usr/bin/env python
import datetime
import time
import serial
LENGHT=4
CH1_START=46
sr = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.5)
fo = open('data_lba.csv','w')
fo.write("datetime,Pack Voltage,Pack Current,Cell1 voltage,Cell2 voltage,Cell3 voltage,Cell4 voltage,Cell5 voltage,Cell6 voltage,Cell7 voltage\n")
while True:
now=datetime.datetime.now()
sr.flush()
line=sr.readline().decode('utf-8')[1:-2]
if not line:break
if (len(line))==282:
fo.write(now.strftime("%Y/%m/%d %H:%M:%S"))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((1-1)*LENGHT) :(CH1_START+((1-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((2-1)*LENGHT) :(CH1_START+((2-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((8-1)*LENGHT) :(CH1_START+((8-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((9-1)*LENGHT) :(CH1_START+((9-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((10-1)*LENGHT) :(CH1_START+((10-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((11-1)*LENGHT) :(CH1_START+((11-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((12-1)*LENGHT) :(CH1_START+((12-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((13-1)*LENGHT) :(CH1_START+((13-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write(",")
fo.write(str(float(int(line[CH1_START+((14-1)*LENGHT) :(CH1_START+((14-1)*LENGHT))+LENGHT],16)) / 1000))
fo.write("\n")
fo.flush()
sr.close()
fo.close()
Отображение – dygraph, обновление раз в секунду:
https://picasaweb.google.com/104197042522620203914/DropBox#5940626928962221538
Достаточно пока. Больше комментариев чуть позже.