UNPKG

matterbridge-bthome

Version:
155 lines (154 loc) 7.63 kB
export const BTHOME_SPEC = { 0x00: { name: 'packetId', bytes: 1, signed: false, factor: 1 }, 0x01: { name: 'battery', bytes: 1, signed: false, factor: 1 }, 0x02: { name: 'temperature', bytes: 2, signed: true, factor: 0.01 }, 0x03: { name: 'humidity', bytes: 2, signed: false, factor: 0.01 }, 0x04: { name: 'pressure', bytes: 3, signed: false, factor: 0.01 }, 0x05: { name: 'illuminance', bytes: 3, signed: false, factor: 0.01 }, 0x06: { name: 'massKilograms', bytes: 2, signed: false, factor: 0.01 }, 0x07: { name: 'massPounds', bytes: 2, signed: false, factor: 0.01 }, 0x08: { name: 'dewPoint', bytes: 2, signed: true, factor: 0.01 }, 0x09: { name: 'countSmall', bytes: 1, signed: false, factor: 1 }, 0x0a: { name: 'energy_kWh', bytes: 3, signed: false, factor: 0.001 }, 0x0b: { name: 'power_W', bytes: 3, signed: false, factor: 0.01 }, 0x0c: { name: 'voltage_V', bytes: 2, signed: false, factor: 0.001 }, 0x0d: { name: 'pm2_5_ugm3', bytes: 2, signed: false, factor: 1 }, 0x0e: { name: 'pm10_ugm3', bytes: 2, signed: false, factor: 1 }, 0x13: { name: 'tvoc_ugm3', bytes: 2, signed: false, factor: 1 }, 0x14: { name: 'moisture', bytes: 2, signed: false, factor: 0.01 }, 0x2e: { name: 'humidity', bytes: 1, signed: false, factor: 1 }, 0x2f: { name: 'moisture', bytes: 1, signed: false, factor: 1 }, 0x40: { name: 'distance_mm', bytes: 2, signed: false, factor: 1 }, 0x41: { name: 'distance_m', bytes: 2, signed: false, factor: 0.1 }, 0x42: { name: 'duration_s', bytes: 3, signed: false, factor: 0.001 }, 0x43: { name: 'current_A', bytes: 2, signed: false, factor: 0.001 }, 0x44: { name: 'speed_ms', bytes: 2, signed: false, factor: 0.01 }, 0x45: { name: 'temperature', bytes: 2, signed: true, factor: 0.1 }, 0x46: { name: 'uvIndex', bytes: 1, signed: false, factor: 0.1 }, 0x47: { name: 'volume_L', bytes: 2, signed: false, factor: 0.1 }, 0x48: { name: 'volume_mL', bytes: 2, signed: false, factor: 1 }, 0x49: { name: 'flowRate_m3ph', bytes: 2, signed: false, factor: 0.001 }, 0x4a: { name: 'voltage_alt_V', bytes: 2, signed: false, factor: 0.1 }, 0x4b: { name: 'gas_m3', bytes: 3, signed: false, factor: 0.001 }, 0x4c: { name: 'gas_alt_m3', bytes: 4, signed: false, factor: 0.001 }, 0x4d: { name: 'energy_alt_kWh', bytes: 4, signed: false, factor: 0.001 }, 0x4e: { name: 'volume_alt_L', bytes: 4, signed: false, factor: 0.001 }, 0x4f: { name: 'water_L', bytes: 4, signed: false, factor: 0.001 }, 0x52: { name: 'gyroscope_dps', bytes: 2, signed: false, factor: 0.001 }, 0x53: { name: 'text', parser(buf, off) { return buf.slice(off + 1, off + 1 + buf[off]).toString('utf8'); }, bytes: null, }, 0x54: { name: 'raw', parser(buf, off) { return buf.slice(off + 1, off + 1 + buf[off]).toString('hex'); }, bytes: null, }, 0x55: { name: 'volumeStorage_L', bytes: 4, signed: false, factor: 0.001 }, 0x57: { name: 'temperature', bytes: 1, signed: true, factor: 1 }, 0x58: { name: 'temperature', bytes: 1, signed: true, factor: 0.35 }, 0x59: { name: 'count8', bytes: 1, signed: true, factor: 1 }, 0x5a: { name: 'count16', bytes: 2, signed: true, factor: 1 }, 0x5b: { name: 'count32', bytes: 4, signed: true, factor: 1 }, 0x5c: { name: 'power_alt_W', bytes: 4, signed: true, factor: 0.01 }, 0x5d: { name: 'current_alt_A', bytes: 2, signed: true, factor: 0.001 }, 0x5e: { name: 'direction_deg', bytes: 2, signed: false, factor: 0.01 }, 0x5f: { name: 'precipitation_mm', bytes: 2, signed: false, factor: 1 }, 0x0f: { name: 'genericBoolean', bytes: 1, signed: false, factor: 1 }, 0x10: { name: 'powerState', bytes: 1, signed: false, factor: 1 }, 0x11: { name: 'openingState', bytes: 1, signed: false, factor: 1 }, 0x15: { name: 'batteryState', bytes: 1, signed: false, factor: 1 }, 0x16: { name: 'batteryChargingState', bytes: 1, signed: false, factor: 1 }, 0x17: { name: 'carbonMonoxideState', bytes: 1, signed: false, factor: 1 }, 0x18: { name: 'coldState', bytes: 1, signed: false, factor: 1 }, 0x19: { name: 'connectivityState', bytes: 1, signed: false, factor: 1 }, 0x1a: { name: 'doorState', bytes: 1, signed: false, factor: 1 }, 0x1b: { name: 'garageDoorState', bytes: 1, signed: false, factor: 1 }, 0x1c: { name: 'gasState', bytes: 1, signed: false, factor: 1 }, 0x1d: { name: 'heatState', bytes: 1, signed: false, factor: 1 }, 0x1e: { name: 'lightState', bytes: 1, signed: false, factor: 1 }, 0x1f: { name: 'lockState', bytes: 1, signed: false, factor: 1 }, 0x20: { name: 'moistureState', bytes: 1, signed: false, factor: 1 }, 0x21: { name: 'motionState', bytes: 1, signed: false, factor: 1 }, 0x22: { name: 'movingState', bytes: 1, signed: false, factor: 1 }, 0x23: { name: 'occupancyState', bytes: 1, signed: false, factor: 1 }, 0x24: { name: 'plugState', bytes: 1, signed: false, factor: 1 }, 0x25: { name: 'presenceState', bytes: 1, signed: false, factor: 1 }, 0x26: { name: 'problemState', bytes: 1, signed: false, factor: 1 }, 0x27: { name: 'runningState', bytes: 1, signed: false, factor: 1 }, 0x28: { name: 'safetyState', bytes: 1, signed: false, factor: 1 }, 0x29: { name: 'smokeState', bytes: 1, signed: false, factor: 1 }, 0x2a: { name: 'soundState', bytes: 1, signed: false, factor: 1 }, 0x2b: { name: 'tamperState', bytes: 1, signed: false, factor: 1 }, 0x2c: { name: 'vibrationState', bytes: 1, signed: false, factor: 1 }, 0x2d: { name: 'windowState', bytes: 1, signed: false, factor: 1 }, 0x3a: { name: 'button', bytes: 1, signed: false, factor: 1, parser(buf, off) { const code = buf.readUInt8(off); const EVENT_MAP = { 0x00: 'none', 0x01: 'single_press', 0x02: 'double_press', 0x03: 'triple_press', 0x04: 'long_press', 0x05: 'long_double_press', 0x06: 'long_triple_press', 0x80: 'hold_press', 0xfe: 'hold_press', }; return EVENT_MAP[code] ?? 'unknown'; }, }, 0x3c: { name: 'dimmerEvent', bytes: 2, signed: false, factor: 1, parser(buf, off) { const evt = buf.readUInt8(off); const steps = buf.readUInt8(off + 1); const map = { 0x00: 'none', 0x01: 'rotateLeft', 0x02: 'rotateRight' }; return { event: map[evt] || `evt0x${evt.toString(16)}`, steps }; }, }, 0x3f: { name: 'rotation_deg', bytes: 2, signed: true, factor: 0.1 }, 0x50: { name: 'timestamp', bytes: 4, signed: false, factor: 1, parser(buf, off) { return new Date(buf.readUInt32LE(off) * 1000).toISOString(); }, }, 0xf0: { name: 'deviceTypeId', bytes: 2, signed: false, factor: 1 }, 0xf1: { name: 'firmwareVersion', bytes: 4, signed: false, factor: 1, parser(buf, off) { const [rc, patch, minor, major] = buf.slice(off, off + 4); return `${major}.${minor}.${patch}.${rc}`; }, }, 0xf2: { name: 'firmwareVersionShort', bytes: 3, signed: false, factor: 1, parser(buf, off) { const [minor, patch, major] = buf.slice(off, off + 3); return `${major}.${minor}.${patch}`; }, }, };