UNPKG

node-red-contrib-victron-ble

Version:

node-red node to parse Instant Readout advertisement data from Victron BLE devices

90 lines (89 loc) 5.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.detectDeviceType = exports.VEBus = 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; 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 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 }; 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; } } exports.detectDeviceType = detectDeviceType;