node-red-contrib-victron-ble
Version:
node-red node to parse Instant Readout advertisement data from Victron BLE devices
93 lines (92 loc) • 5.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.VEBus = exports.SolarSense = exports.SolarCharger = exports.LynxSmartBMS = exports.BalancerStatus = exports.SmartLithium = exports.OutputState = exports.SmartBatteryProtect = exports.OrionXS = exports.Inverter = exports.MeterType = exports.DcEnergyMeter = exports.DcDcConverter = exports.AcCharger = exports.BatterySense = exports.AuxMode = exports.BatteryMonitor = exports.Device = void 0;
exports.detectDeviceType = detectDeviceType;
const base_1 = require("./base");
Object.defineProperty(exports, "Device", { enumerable: true, get: function () { return base_1.Device; } });
const ac_charger_1 = require("./ac-charger");
Object.defineProperty(exports, "AcCharger", { enumerable: true, get: function () { return ac_charger_1.AcCharger; } });
const battery_monitor_1 = require("./battery-monitor");
Object.defineProperty(exports, "BatteryMonitor", { enumerable: true, get: function () { return battery_monitor_1.BatteryMonitor; } });
Object.defineProperty(exports, "AuxMode", { enumerable: true, get: function () { return battery_monitor_1.AuxMode; } });
const battery_sense_1 = require("./battery-sense");
Object.defineProperty(exports, "BatterySense", { enumerable: true, get: function () { return battery_sense_1.BatterySense; } });
const dc_energy_meter_1 = require("./dc-energy-meter");
Object.defineProperty(exports, "DcEnergyMeter", { enumerable: true, get: function () { return dc_energy_meter_1.DcEnergyMeter; } });
Object.defineProperty(exports, "MeterType", { enumerable: true, get: function () { return dc_energy_meter_1.MeterType; } });
const dcdc_converter_1 = require("./dcdc-converter");
Object.defineProperty(exports, "DcDcConverter", { enumerable: true, get: function () { return dcdc_converter_1.DcDcConverter; } });
const inverter_1 = require("./inverter");
Object.defineProperty(exports, "Inverter", { enumerable: true, get: function () { return inverter_1.Inverter; } });
const lynx_smart_bms_1 = require("./lynx-smart-bms");
Object.defineProperty(exports, "LynxSmartBMS", { enumerable: true, get: function () { return lynx_smart_bms_1.LynxSmartBMS; } });
const orion_xs_1 = require("./orion-xs");
Object.defineProperty(exports, "OrionXS", { enumerable: true, get: function () { return orion_xs_1.OrionXS; } });
const smart_battery_protect_1 = require("./smart-battery-protect");
Object.defineProperty(exports, "SmartBatteryProtect", { enumerable: true, get: function () { return smart_battery_protect_1.SmartBatteryProtect; } });
Object.defineProperty(exports, "OutputState", { enumerable: true, get: function () { return smart_battery_protect_1.OutputState; } });
const smart_lithium_1 = require("./smart-lithium");
Object.defineProperty(exports, "SmartLithium", { enumerable: true, get: function () { return smart_lithium_1.SmartLithium; } });
Object.defineProperty(exports, "BalancerStatus", { enumerable: true, get: function () { return smart_lithium_1.BalancerStatus; } });
const solar_charger_1 = require("./solar-charger");
Object.defineProperty(exports, "SolarCharger", { enumerable: true, get: function () { return solar_charger_1.SolarCharger; } });
const solar_sense_1 = require("./solar-sense");
Object.defineProperty(exports, "SolarSense", { enumerable: true, get: function () { return solar_sense_1.SolarSense; } });
const vebus_1 = require("./vebus");
Object.defineProperty(exports, "VEBus", { enumerable: true, get: function () { return vebus_1.VEBus; } });
const product_mapping_1 = require("./product-mapping");
// Add to this list if a device should be forced to use a particular implementation
// instead of relying on the identifier in the advertisement
const MODEL_PARSER_OVERRIDE = {
0xA3A4: battery_sense_1.BatterySense, // Smart Battery Sense
0xA3A5: battery_sense_1.BatterySense, // Smart Battery Sense
0xC050: solar_sense_1.SolarSense, // SolarSense 750
};
function detectDeviceType(data) {
try {
const modelId = data.readUInt16LE(2);
const mode = data.readUInt8(4);
const productName = (0, product_mapping_1.getProductName)(modelId);
// Model ID-based preferences
const match = MODEL_PARSER_OVERRIDE[modelId];
if (match) {
// console.log(`Using override for model ID 0x${modelId.toString(16).toUpperCase()}`);
return match;
}
// Defaults based on mode
switch (mode) {
case 0x2: // BatteryMonitor
return battery_monitor_1.BatteryMonitor;
case 0xD: // DcEnergyMeter
return dc_energy_meter_1.DcEnergyMeter;
case 0x8: // AcCharger
return ac_charger_1.AcCharger;
case 0x4: // DcDcConverter
return dcdc_converter_1.DcDcConverter;
case 0x3: // Inverter
return inverter_1.Inverter;
case 0x6: // InverterRS
break;
case 0xA: // LynxSmartBMS
return lynx_smart_bms_1.LynxSmartBMS;
case 0xB: // MultiRS
break;
case 0x5: // SmartLithium (commercially Lithium Battery Smart / LiFePO4 Battery Smart)
return smart_lithium_1.SmartLithium;
case 0x9: // SmartBatteryProtect
return smart_battery_protect_1.SmartBatteryProtect;
case 0x1: // SolarCharger
return solar_charger_1.SolarCharger;
case 0xC: // VE.Bus
return vebus_1.VEBus;
case 0xF: // Orion XS
return orion_xs_1.OrionXS;
}
console.log(`Unknown device type - Model ID: 0x${modelId.toString(16).toUpperCase()}, Mode: 0x${mode.toString(16).toUpperCase()}`);
return null;
}
catch (error) {
console.error('Error detecting device type:', error);
return null;
}
}