Skip to main content

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

Достаточно пока. Больше комментариев чуть позже.