Refactoring e correzione degli indirizzi
This commit is contained in:
@@ -1,24 +1,24 @@
|
|||||||
const { SerialPort } = require('serialport');
|
const { SerialPort } = require('serialport');
|
||||||
const errors = require('./errors');
|
const errors = require('./errors');
|
||||||
|
|
||||||
const address = 0x04;
|
const address = 0x40;
|
||||||
const frameLength = 13;
|
const frameLength = 13;
|
||||||
const timeoutMS = 700;
|
const timeoutMS = 700;
|
||||||
const retryDelayMS = 200;
|
const retryDelayMS = 200;
|
||||||
|
|
||||||
//Arrotondamenti
|
//Arrotondamenti
|
||||||
const r1 = v => Math.round(v * 10) / 10; // 0.1 — tensione totale, corrente, SOC%
|
const r1 = v => Math.round(v * 10) / 10; // 0.1 — tensione totale, corrente, SOC%
|
||||||
const r3 = v => Math.round(v * 1000) / 1000; // 0.001 — tensioni cella, capacità Ah
|
const r3 = v => Math.round(v * 1000) / 1000; // 0.001 — tensioni cella, capacità Ah
|
||||||
const r2 = v => Math.round(v * 100) / 100; // 0.01 — temperature in kelvin (SignalK)
|
const r2 = v => Math.round(v * 100) / 100; // 0.01 — temperature in kelvin (SignalK)
|
||||||
|
|
||||||
class BMS {
|
class BMS {
|
||||||
constructor({ device, retries = 5, log = () => {} } = {}) {
|
constructor({ device, retries = 5, log = () => { } } = {}) {
|
||||||
this.device = device;
|
this.device = device;
|
||||||
this.retries = retries;
|
this.retries = retries;
|
||||||
this.log = log;
|
this.log = log;
|
||||||
this.port = null;
|
this.port = null;
|
||||||
this.status = null; // ultimo getStatus (n. celle, sensori temp)
|
this.status = null; // ultimo getStatus (n. celle, sensori temp)
|
||||||
this._queue = Promise.resolve(); // serializza le richieste sulla seriale
|
this._queue = Promise.resolve(); // serializza le richieste sulla seriale
|
||||||
}
|
}
|
||||||
|
|
||||||
open() {
|
open() {
|
||||||
@@ -75,7 +75,7 @@ class BMS {
|
|||||||
throw lastErr || new Error(`cmd ${cmd} failed after ${this.retries} retries`);
|
throw lastErr || new Error(`cmd ${cmd} failed after ${this.retries} retries`);
|
||||||
};
|
};
|
||||||
const next = this._queue.then(run, run);
|
const next = this._queue.then(run, run);
|
||||||
this._queue = next.catch(() => {}); // non rompere la coda al primo errore
|
this._queue = next.catch(() => { }); // non rompere la coda al primo errore
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,8 +133,8 @@ class BMS {
|
|||||||
if (!d) return null;
|
if (!d) return null;
|
||||||
return {
|
return {
|
||||||
total_voltage: r1(d.readInt16BE(0) / 10),
|
total_voltage: r1(d.readInt16BE(0) / 10),
|
||||||
current: r1((d.readInt16BE(4) - 30000) / 10), // < 0 charging, > 0 discharging
|
current: r1((d.readInt16BE(4) - 30000) / 10), // < 0 charging, > 0 discharging
|
||||||
soc_percent: r1(d.readInt16BE(6) / 10)
|
soc_percent: r1(d.readInt16BE(6) / 10)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,9 +144,9 @@ class BMS {
|
|||||||
if (!d) return null;
|
if (!d) return null;
|
||||||
return {
|
return {
|
||||||
highest_voltage: r3(d.readInt16BE(0) / 1000),
|
highest_voltage: r3(d.readInt16BE(0) / 1000),
|
||||||
highest_cell: d.readInt8(2),
|
highest_cell: d.readInt8(2),
|
||||||
lowest_voltage: r3(d.readInt16BE(3) / 1000),
|
lowest_voltage: r3(d.readInt16BE(3) / 1000),
|
||||||
lowest_cell: d.readInt8(5)
|
lowest_cell: d.readInt8(5)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,9 +156,9 @@ class BMS {
|
|||||||
if (!d) return null;
|
if (!d) return null;
|
||||||
return {
|
return {
|
||||||
highest_temperature: d.readInt8(0) - 40,
|
highest_temperature: d.readInt8(0) - 40,
|
||||||
highest_sensor: d.readInt8(1),
|
highest_sensor: d.readInt8(1),
|
||||||
lowest_temperature: d.readInt8(2) - 40,
|
lowest_temperature: d.readInt8(2) - 40,
|
||||||
lowest_sensor: d.readInt8(3)
|
lowest_sensor: d.readInt8(3)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,9 +169,9 @@ class BMS {
|
|||||||
const m = d.readInt8(0);
|
const m = d.readInt8(0);
|
||||||
return {
|
return {
|
||||||
mode: m === 0 ? 'stationary' : m === 1 ? 'charging' : 'discharging',
|
mode: m === 0 ? 'stationary' : m === 1 ? 'charging' : 'discharging',
|
||||||
charging_mosfet: !!d[1],
|
charging_mosfet: !!d[1],
|
||||||
discharging_mosfet: !!d[2],
|
discharging_mosfet: !!d[2],
|
||||||
capacity_ah: r3(d.readInt32BE(4) / 1000)
|
capacity_ah: r3(d.readInt32BE(4) / 1000)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,17 +179,17 @@ class BMS {
|
|||||||
async getStatus() {
|
async getStatus() {
|
||||||
const d = await this._sendBatch('94');
|
const d = await this._sendBatch('94');
|
||||||
if (!d) return null;
|
if (!d) return null;
|
||||||
const stateByte = d.readInt8(4);
|
const stateByte = d.readInt8(4);
|
||||||
const stateNames = ['DI1','DI2','DI3','DI4','DO1','DO2','DO3','DO4'];
|
const stateNames = ['DI1', 'DI2', 'DI3', 'DI4', 'DO1', 'DO2', 'DO3', 'DO4'];
|
||||||
const states = {};
|
const states = {};
|
||||||
for (let i = 0; i < 8; i++) states[stateNames[i]] = !!((stateByte >> i) & 1);
|
for (let i = 0; i < 8; i++) states[stateNames[i]] = !!((stateByte >> i) & 1);
|
||||||
const data = {
|
const data = {
|
||||||
cells: d.readInt8(0),
|
cells: d.readInt8(0),
|
||||||
temperature_sensors: d.readInt8(1),
|
temperature_sensors: d.readInt8(1),
|
||||||
charger_running: !!d[2],
|
charger_running: !!d[2],
|
||||||
load_running: !!d[3],
|
load_running: !!d[3],
|
||||||
states,
|
states,
|
||||||
cycles: d.readInt16BE(5)
|
cycles: d.readInt16BE(5)
|
||||||
};
|
};
|
||||||
this.status = data;
|
this.status = data;
|
||||||
return data;
|
return data;
|
||||||
|
|||||||
Reference in New Issue
Block a user