UNPKG

bt-sensors-plugin-sk

Version:

Bluetooth Sensors for Signalk - see https://www.npmjs.com/package/bt-sensors-plugin-sk#supported-sensors for a list of supported sensors

183 lines (146 loc) 7.97 kB
/** */ const RenogySensor = require("./Renogy/RenogySensor.js"); const RC=require("./Renogy/RenogyConstants.js") class RenogyRoverClient extends RenogySensor { static ImageFile = "RenogyRoverClient.jpg" /* "batteryType": "electrical.charger.battery.type", "batteryPercentage": "electrical.charger.battery.charge", "batteryVoltage": "electrical.charger.battery.voltage", "batteryCurrent": "electrical.charger.battery.current", "controllerTemperature": "electrical.charger.temperature", "batteryTemperature": "electrical.charger.battery.temperature", "loadVoltage": "electrical.charger.load.voltage", "loadCurrent": "electrical.charger.load.current", "loadPower": "electrical.charger.load.power", "pvVoltage": "electrical.charger.solar.voltage", "pvCurrent": "electrical.charger.solar.current", "pvPower": "electrical.charger.solar.power", "maxChargingPowerToday": "electrical.charger.today.max", "maxDischargingPowerToday": "electrical.charger.discharging.maximum", "chargingAmpHoursToday": "electrical.charger.charged.today", "powerGenerationToday": "electrical.charger.power.today", "powerGenerationTotal": "electrical.charger.power.total", "loadStatus": "electrical.charger.load.status", "chargingStatus": "electrical.charger.status" */ initSchema(){ //Buffer(73) [1, 3, 68, 32, 32, 82, 78, 71, 45, 67, 84, 82, 76, 45, 87, 78, 68, 51, 48, 7, 140, 0, 132, 0, 126, 0, 120, 0, 111, 0, 106, 100, 50, 0, 5, 0, 120, 0, 120, 0, 28, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 5, 0, 5, 2, 148, 0, 5, 206, 143, 34, 228, buffer: ArrayBuffer(8192), byteLength: 73, byteOffset: 6144, length: 73, Symbol(Symbol.toStringTag): 'Uint8Array'] super.initSchema() this.addDefaultParam("id") .default="solar" this.addMetadatum('batteryType', '', "battery type") .default="electrical.chargers.{id}.battery.type" this.addMetadatum('batteryPercentage', 'ratio', "battery percentage", (buffer)=>{return buffer.readUInt16BE(3)/100 }) .default="electrical.chargers.{id}.battery.soc" this.addMetadatum('batteryVoltage', 'V', "battery voltage", (buffer)=>{return buffer.readUInt16BE((5))/10}) .default="electrical.chargers.{id}.battery.voltage" this.addMetadatum('batteryCurrent', 'A', 'battery current', (buffer)=>{return buffer.readUInt16BE((7))/100}) .default="electrical.chargers.{id}.battery.current" this.addMetadatum('controllerTemperature', 'K', 'controller temperature', (buffer)=>{return buffer.readInt8((9))+273.15}) .default="electrical.chargers.{id}.controller.temperature" this.addMetadatum('batteryTemperature', 'K', 'battery temperature', (buffer)=>{return buffer.readInt8((10))+273.15}) .default="electrical.chargers.{id}.battery.temperature" this.addMetadatum('loadVoltage', 'V', 'load voltage', (buffer)=>{return buffer.readUInt16BE((11))/10}) .default="electrical.chargers.{id}.load.voltage" this.addMetadatum('loadCurrent', 'A', 'load current', (buffer)=>{return buffer.readUInt16BE((13))/100}) .default="electrical.chargers.{id}.load.current" this.addMetadatum('loadPower', 'W', 'load power', (buffer)=>{return buffer.readUInt16BE((15))}) .default="electrical.chargers.{id}.load.power" this.addMetadatum('pvVoltage', 'V', 'pv voltage', (buffer)=>{return buffer.readUInt16BE((17))/10}) .default="electrical.chargers.{id}.solar.voltage" this.addMetadatum('pvCurrent', 'A', 'pv current', (buffer)=>{return buffer.readUInt16BE((19))/100}) .default="electrical.chargers.{id}.solar.current" this.addMetadatum('pvPower', 'W', 'pv power', (buffer)=>{return buffer.readUInt16BE(21)}) .default="electrical.chargers.{id}.solar.power" this.addMetadatum('maxChargingPowerToday', 'W', 'max charging power today', (buffer)=>{return buffer.readUInt16BE(33)}) .default="electrical.chargers.{id}.charge.max.today" this.addMetadatum('maxDischargingPowerToday', 'W', 'max discharging power today', (buffer)=>{return buffer.readUInt16BE(35)}) .default="electrical.chargers.{id}.discharge.max.today" this.addMetadatum('chargingAmpHoursToday', 'Ah', 'charging amp hours today', (buffer)=>{return buffer.readUInt16BE(37)}) .default="electrical.chargers.{id}.charge.ampHours.today" this.addMetadatum('dischargingAmpHoursToday', 'Ah', 'discharging amp hours today', (buffer)=>{return buffer.readUInt16BE(39)}) .default="electrical.chargers.{id}.discharge.ampHours.today" this.addMetadatum('powerGenerationToday', 'W', 'power generation today', (buffer)=>{return buffer.readUInt16BE(41)}) .default="electrical.chargers.{id}.power.generated.today" this.addMetadatum('powerConsumptionToday', 'W', 'power consumption today', (buffer)=>{return buffer.readUInt16BE(43)}) .default="electrical.chargers.{id}.power.consumed.today" this.addMetadatum('powerGenerationTotal', 'W', 'power generation total', (buffer)=>{return buffer.readUInt32BE(59)}) .default="electrical.chargers.{id}.power.generated.total" this.addMetadatum('loadStatus', '', 'load status', (buffer)=>{return RC.LOAD_STATE[buffer.readUInt8(67)>>7]}) .default="electrical.chargers.{id}.load.status" this.addMetadatum('chargingStatus', '', 'charging status', (buffer)=>{ const cs = buffer.readUInt8(68) if (Object.hasOwn(RC.CHARGING_STATE,cs)) return RC.CHARGING_STATE[cs] else return null }) .default="electrical.chargers.{id}.charge.status" } retrieveBatteryType(){ return new Promise( async ( resolve, reject )=>{ //Buffer(7) [255, 3, 2, 0, 1, 80, 80, buffer: ArrayBuffer(8192), byteLength: 7, byteOffset: 864, length: 7, Symbol(Symbol.toStringTag): 'Uint8Array'] await this.sendReadFunctionRequest(0xe004, 0x01) const valChanged = async (buffer) => { resolve(RC.BATTERY_TYPE[(buffer.readUInt8(4))]) } this.readChar.once('valuechanged', valChanged ) }) } async retrieveModelID(){ return new Promise( async ( resolve, reject )=>{ await this.sendReadFunctionRequest(0x0c,0x08) this.readChar.once('valuechanged', async (buffer) => { if (buffer[2]!=0x10) reject("Unknown error retrieving model ID") //??? const model = buffer.subarray(3,17).toString().trim() resolve(model) }) }) } async initGATTConnection() { await super.initGATTConnection() this.modelID=await this.retrieveModelID() this.batteryType = await this.retrieveBatteryType() this.emit('batteryType', this.batteryType) } getAllEmitterFunctions(){ return [this.getAndEmitChargeInfo.bind(this)] } async getAndEmitChargeInfo(){ return new Promise( async ( resolve, reject )=>{ try { await this.sendReadFunctionRequest(0x100, 0x22) this.readChar.once('valuechanged', buffer => { this.emitValuesFrom(buffer) resolve(this) }) } catch (error) { reject(error?.message??error) } }) } } module.exports=RenogyRoverClient