Coder Social home page Coder Social logo

johncclayton / electric Goto Github PK

View Code? Open in Web Editor NEW
17.0 8.0 11.0 137.15 MB

Battery charger integration, information and provisioning

Python 25.86% Shell 2.36% TypeScript 36.70% HTML 8.53% CSS 3.61% JavaScript 1.00% C++ 7.40% C 13.74% Makefile 0.05% Batchfile 0.11% QMake 0.06% Ruby 0.59%

electric's Introduction

Build Job Status

Build Status

What is this thing?

Electric is a project that allows you to control your iCharger from your mobile phone (iOS / Android, windows what?) - regardless of whether you are at home or at the field.

This GitHub project provides the server software to control the iCharger 308/406/4010 DUO from a mobile app - and the server software only runs on a Raspberry Pi 3.

So why should I use this?

Well, that's pretty easy to explain - here's our list of unique selling points:

  1. It looks great on your phone.
  2. It's got wow factor - use your iCharger from your deck chair while at the field.
  3. Set up new / existing presets, charge, discharge and store your packs - all from said deck chair.
  4. Use the app at the field as well as on your home WIFI network.

Installation

Instructions to help you install the software on your Raspberry Pi 3.

Pictures or it never happened!

Demo

electric's People

Contributors

scornflake avatar thebum avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

electric's Issues

Consider disabling HDMI to consume less power on Pi3

Use this command to turn it off: /opt/vc/bin/tvservice -o And this command to turn it on: /opt/vc/bin/tvservice -p I googled "raspberry pi 3 turn off hdmi" and found this page:

Primarily for USB based UPS / rechargeable situation (for clean shutdown).

Include iCharger connected state in every JSON response

When a JSON response is returned to the UI there is no way to know if the iCharger is still connected, reachable etc. The connected state should be an integral part of every response in order to make it easy to have the UI be responsive to the hardware state.

With no pack plugged in, get a weird high voltage

"curr_out_volts": 33.264

This is on a 308. John mentioned that he saw +40 (ish) for his 4010.
Maybe the protocol says "if I don't know the voltage, I'll give you something > max input volts".

This would mean we'd need to have a "Charger" class on the server, that knows something about each model (i.e: max input voltage).

Ideally, the client wants to see 0.0 for curr_out_volts when no pack is plugged in (main charge lead).

Lets talk nginx for hosting (flask isn't that great)

I get LOTS of pauses when testing, and often have to restart the server.

I "presume" this to be flask? It certainly doesn't handle more than a few req's p/s, and if I want to start upping the poll frequency on the client, I guess it might be a problem.

Do we intend to ship with a proper hosting front end?

Architecture change: poll on the server

Thinking about a change whereby we poll all required info on the server, and cache that on the web front end. That way multiple clients don't introduce many requests over USB.

I think the charger only updates it's internal state about every 250ms max anyway (i.e: when charging, you don't see things change quicker than this).

I did try to get updates faster at one point, but I'm not sure if that failed because a) the USB stuff is broken, b) concurrency limits at the moment or c) it really doesn't provide information at a period < ~250ms.

Plan:

  • Have the server auto poll the charger when any of stats/channel/ (other) calls are made. It stops polling "n" seconds after the last poll request. i.e: 10s.
  • Cache all those results
  • status/channel/(etc) then return data from the cache

This would have a second nice side effect, that all data would update at the same on the ui. The HTTP side could then be a multithreaded/whatever as heck.

I havn't thought much about how technically we might do this, because I'm sure there are options (schedulers, queues, mice or even superheroes).

docker webserver isn't reloading in prod

Even though --reload is specified, and you can see it happening in the logs, the output doesn't change on the client. You have to restart the "web" service to see any change.

When running in systemd, the server lasts about 30s, then dies

No idea why. Restarting it (sudo systemctl restart electric.service), it can talk with the charger again.

It seems it's something to do with many, many USB resets?
Either or both of:

  • Fix the USB problem (whatever that is)
  • Make the charger re-search for the device at some point, because it might have moved on the USB bus.

I see this in the log, notice it moves from device 10 to device 11:

Jan 13 03:21:29 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:29] "GET /channel/0 HTTP/1.1" 200 -
Jan 13 03:21:29 pi3 kernel: [ 1049.755069] usb 1-1.3: reset full-speed USB device number 10 using dwc_otg
Jan 13 03:21:29 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:29] "GET /channel/0 HTTP/1.1" 200 -
Jan 13 03:21:29 pi3 kernel: [ 1049.965078] usb 1-1.3: reset full-speed USB device number 10 using dwc_otg
Jan 13 03:21:30 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:29] "GET /status HTTP/1.1" 200 -
Jan 13 03:21:30 pi3 kernel: [ 1050.175071] usb 1-1.3: reset full-speed USB device number 10 using dwc_otg
Jan 13 03:21:30 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:30] "GET /channel/0 HTTP/1.1" 200 -
Jan 13 03:21:30 pi3 kernel: [ 1050.345489] usb 1-1.3: USB disconnect, device number 10
Jan 13 03:21:30 pi3 python[1336]: Exception AttributeError: "'iChargerMaster' object has no attribute '_is_opened'" in <bound method iChargerMaster.del of <icharger.modbus_usb.iChargerMaster object at 0x74ed2930>> ignored
Jan 13 03:21:30 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:30] "GET /channel/0 HTTP/1.1" 200 -
Jan 13 03:21:30 pi3 kernel: [ 1050.675065] usb 1-1.3: new full-speed USB device number 11 using dwc_otg
Jan 13 03:21:30 pi3 kernel: [ 1050.788500] usb 1-1.3: New USB device found, idVendor=0483, idProduct=5751
Jan 13 03:21:30 pi3 kernel: [ 1050.803395] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan 13 03:21:30 pi3 kernel: [ 1050.829771] usb 1-1.3: Product: Junsi iCharger 308Duo USB HID
Jan 13 03:21:30 pi3 kernel: [ 1050.846631] usb 1-1.3: Manufacturer: Junsi Electronic
Jan 13 03:21:30 pi3 kernel: [ 1050.863516] usb 1-1.3: SerialNumber: 1308308201
Jan 13 03:21:30 pi3 kernel: [ 1050.884334] hid-generic 0003:0483:5751.0008: hiddev0,hidraw0: USB HID v1.10 Device [Junsi Electronic Junsi iCharger 308Duo USB HID] on usb-3f980000.usb-1.3/input0
Jan 13 03:21:30 pi3 kernel: [ 1050.944332] usb-storage 1-1.3:1.1: USB Mass Storage device detected
Jan 13 03:21:30 pi3 kernel: [ 1050.968607] scsi host7: usb-storage 1-1.3:1.1
Jan 13 03:21:30 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:30] "GET /channel/0 HTTP/1.1" 200 -
Jan 13 03:21:31 pi3 kernel: [ 1051.145092] usb 1-1.3: reset full-speed USB device number 11 using dwc_otg
Jan 13 03:21:31 pi3 python[1336]: 192.168.1.61 - - [13/Jan/2017 03:21:31] "GET /status HTTP/1.1" 200 -
Jan 13 03:21:31 pi3 kernel: [ 1051.405091] usb 1-1.3: reset full-speed USB device number 11 using dwc_otg

How to serialize requests at the server, to the charger itself

Thinking:

  • go to python3 (actually, it DOES exist on 2, https://docs.python.org/3/library/queue.html).
  • use something like the cocoa NSOperationQueue (with max one concurrent thread). Maybe: https://docs.python.org/3/library/queue.html
  • model "talking to modbus" as an "operation", with callback for success/error.
  • Each HTTP caller "blocks" while waiting for the operation to be complete.
  • Put in some semi smarts where we don't queue operations if there are > N in the queue already (just return an error immediately).

End result is that all USB requests are done on a single thread. No HTTP/Client request ever shares the USB operation thread. All comms is more or less demarcated using operations/callbacks.

Don't standard USB cables fry USB's/MB's when connected to iChargers?

I've read a couple of posts re upgrading the iCharger where its recommended to use their cable or a battery. i.e: DONT Plug it into the mains cos there's high chance of frying your computer.

The supplied cable (with the charger) apparently has it's ground disconnected, so works OK.

The way around it is to:

  • Use a battery when upgrading the charger
  • Use supplied USB cable (no idea where that is)

Do we risk blowing up Pi's by using standard cabling?
i.e: we're going to be powering using a generator. Will this be a problem?

@johncclayton how have you found it? I presume you've had your Pi connected to a Pi, via power supply, for ages?

Seeing preset with empty name in the JSON

One has an empty name (the 2nd, in my case). It doesn't show on the charger.

https://www.dropbox.com/s/7xfv5pct3nv5f7c/File%209-01-17%2C%2010%2017%2033%20PM.mov?dl=0

JSON:
[
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 1.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 5.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 0,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 121,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 0
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 2.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 1,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 23,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 4.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 2,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_4A",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 156,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 7.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 3,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_7a",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 141,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 13.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 4,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_13a",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 135,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 15.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 5,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_15a",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 84,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 20.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 6,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_20a",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 51,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 25.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 7,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_25a",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 76,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 30.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 8,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo_30a",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 57,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 1.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 9,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "NiMH",
"ni_cell": 0,
"ni_discharge_voltage": 0.1,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 100,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 3,
"type_str": "NiMH",
"use_flag": 0
},
{
"auto_save": false,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 10.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 10,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiPo 10a",
"ni_cell": 0,
"ni_discharge_voltage": 0.8,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 1,
"safety_cap_c": 120,
"safety_cap_d": 90,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 0,
"type_str": "LiPo",
"use_flag": 21930
},
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 2.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 11,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiIo",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 0,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 1,
"type_str": "LiLo",
"use_flag": 0
},
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 2.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 12,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "LiFe",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 0,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 2,
"type_str": "LiFe",
"use_flag": 0
},
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 2.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 13,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "NiCd",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 0,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 4,
"type_str": "Nicd",
"use_flag": 0
},
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 2.0,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 2.0,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 14,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 0,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "Pb",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 1.0,
"run_counter": 0,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 5,
"type_str": "Pb",
"use_flag": 0
},
{
"auto_save": true,
"bal_delay": 1,
"bal_diff": 5,
"bal_over_point": 0,
"bal_set_point": 5,
"bal_speed": 1,
"bal_start_mode": 2,
"bal_start_voltage": 3,
"capacity": 0,
"channel_mode": 0,
"charge_current": 1.5,
"cycle_count": 3,
"cycle_delay": 3,
"cycle_mode": 0,
"discharge_current": 1.5,
"end_charge": 10.0,
"end_discharge": 50.0,
"fast_store": true,
"index": 15,
"keep_charge_enable": false,
"li_balance_end_mode": 0,
"li_cell": 0,
"li_mode_c": 1,
"li_mode_d": 0,
"life_charge_cell_voltage": 3.6,
"life_discharge_cell_voltage": 2.5,
"life_storage_cell_voltage": 3.3,
"lilo_charge_cell_voltage": 4.1,
"lilo_discharge_cell_voltage": 3.5,
"lilo_storage_cell_voltage": 3.75,
"lipo_charge_cell_voltage": 4.2,
"lipo_discharge_cell_voltage": 3.5,
"lipo_storage_cell_voltage": 3.85,
"log_interval_sec": 1.0,
"name": "NiZn",
"ni_cell": 0,
"ni_discharge_voltage": 0.01,
"ni_mode_c": 0,
"ni_mode_d": 0,
"ni_peak": 3.0,
"ni_peak_delay": 3,
"ni_trickle_current": 0.05,
"ni_trickle_enable": false,
"ni_trickle_time": 5,
"ni_zero_enable": false,
"ni_zn_cell": 0,
"ni_zn_charge_cell_volt": 1.9,
"ni_zn_discharge_cell_volt": 1.1,
"op_enable_mask": 65535,
"pb_cell": 6,
"pb_cell_float_enable": false,
"pb_cell_float_voltage": 2.3,
"pb_charge_voltage": 2.4,
"pb_discharge_voltage": 1.8,
"pb_mode_c": 0,
"pb_mode_d": 0,
"reg_ch_current": 1.0,
"reg_ch_mode": 0,
"reg_ch_volt": 12.0,
"regen_discharge_mode": 0,
"restore_current": 0.1,
"restore_time": 3,
"restore_voltage": 0.5,
"run_counter": 0,
"safety_cap_c": 120,
"safety_cap_d": 120,
"safety_temp_c": 45.0,
"safety_temp_d": 45.0,
"safety_time_c": 0,
"safety_time_d": 0,
"save_to_sd": true,
"store_compensation": 10,
"type": 6,
"type_str": null,
"use_flag": 0
}
]

IR values, divide by 10 to get mOhms

In the interest of client laziness,

       "balance": 0, 
        "cell": "0", 
        "ir": 97, 
        "v": 3.825

Shows on the charger as 9.7mOhms. Divide at the server to give mOhms over the wire.

I think the server may be barfing after quite some time

Exception AttributeError: "'iChargerMaster' object has no attribute '_is_opened'" in <bound method iChargerMaster.del of <electric.icharger.modbus_usb.iChargerMaster object at 0x6cdcabd0>> ignored

It seems to stop the server

Is there a way to tell if the charger is set to metric or imperial (°C or F)?

I think we might want to provide the possibility to override this on the front end (maybe?) or just go with whatever is setup in the charger? We need to know what that is.

For now, I can just have a setting on the config. I figure I'll just put a °C or F after any temp value. No conversion. If the charger is configured metric, and front end is set to imperial, you'd just end up with the wrong label on the end.

UI change detection (when editing presets) could be better

Ionic2 is making numbers -> strings, so the change detection sees changes where they don’t REALLY exist (say, you type 0 into a field that already has 0 in it)

See: preset.ts, ionViewCanLeave()

Using lodash _.isEqual, which also sees changes to types.
We want to relax this somehow, or coerce numbers to numbers. Keeping the right type.

Is cell_total_voltage accurate?

I see a value of 18.421, but this doesn't show in the charger anywhere.

I'm recalling looking to see if the charger itself provides the Sv (cell voltage sum) value (16.373 in the pic). No biggie if it doesn't. But I did notice this "18" value and thought "BETTER REPORT THAT TO THE SERVER SIDE TEAM"

I've a 4S plugged in (see pic).
img_2381

After completing 'event' (charge/stop/discharge), hh:mm still non-zero

Finished a discharge.
'timestamp' is still non-zero.

icharger_308_duo

Here's the json AFTER the discharge:
{
"battery_leads_plugged_in": true,
"battery_plugged_in": true,
"cell_count_with_voltage_values": 6,
"cell_total_ir": 23.9,
"cell_total_voltage": 17.418000000000003,
"cells": [
{
"balance": 0,
"cell": 0,
"ir": 5.6,
"v": 3.842
},
{
"balance": 0,
"cell": 1,
"ir": 5.7,
"v": 3.843
},
{
"balance": 0,
"cell": 2,
"ir": 7.0,
"v": 3.842
},
{
"balance": 0,
"cell": 3,
"ir": 5.6,
"v": 3.843
},
{
"balance": 0,
"cell": 4,
"ir": 0.0,
"v": 0.0
},
{
"balance": 0,
"cell": 5,
"ir": 0.0,
"v": 0.0
},
{
"balance": 0,
"cell": 6,
"ir": 0.0,
"v": 0.0
},
{
"balance": 0,
"cell": 7,
"ir": 0.0,
"v": 0.0
},
{
"balance": 0,
"cell": 8,
"ir": 102.4,
"v": 1.024
},
{
"balance": 4,
"cell": 9,
"ir": 102.4,
"v": 1.024
}
],
"channel": 0,
"charger_presence": "connected",
"control_status": 0,
"curr_ext_temp": 23.1,
"curr_inp_volts": 23.757,
"curr_int_temp": 39.4,
"curr_out_amps": 0.0,
"curr_out_capacity": 0,
"curr_out_power": 0.0,
"curr_out_volts": 15.377,
"cycle_count": 0,
"dlg_box_id": 0,
"line_intern_resistance": 26.5,
"run_error": 0,
"run_status": 0,
"timestamp": 1168.0
}

Read/write failures on the USB bus should be retried automatically by the server code.

Sometimes reads/writes via the USB-HID interface don't work, and simply retrying solves the problem. The server should retry up to 5 times with a half second pause between each request.

During retries, the server should also attempt to find the device again - if the device is NOT found then the request should no longer be retried, instead it should be stopped and a "disconnected charger" state is returned for the request.

REST API: needs configuration

Need a /configuration endpoint, so I can find out about the charger config (max amps, charging source).

This is super low priority at the moment.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.