UNPKG

homebridge-vwconnectid

Version:
46 lines 2.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LocationMotionSensorAccessory = void 0; class LocationMotionSensorAccessory { constructor(platform, accessory) { this.platform = platform; this.accessory = accessory; this.accessory.getService(this.platform.Service.AccessoryInformation) .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Volkswagen') .setCharacteristic(this.platform.Characteristic.Model, this.platform.vwConn.vehicles.data.find(({ vin }) => vin === this.platform.config.weconnect.vin).model) .setCharacteristic(this.platform.Characteristic.SerialNumber, this.platform.config.weconnect.vin); this.service = this.accessory.getService(this.platform.Service.MotionSensor) || this.accessory.addService(this.platform.Service.MotionSensor); this.service.setCharacteristic(this.platform.Characteristic.Name, accessory.context.device.name); this.service.getCharacteristic(this.platform.Characteristic.MotionDetected) .onGet(this.getMotionDetected.bind(this)); this.platform.idStatusEmitter.on('positionUpdate', (data) => { if (this.parkedInRange(this.accessory.context.device.lat, this.accessory.context.device.lon, data.lat, data.lon, (this.accessory.context.device.notificationRadius || this.accessory.context.device.radius))) { this.service.updateCharacteristic(this.platform.Characteristic.MotionDetected, true); } }); this.platform.idStatusEmitter.on('positionUnknown', () => { this.service.updateCharacteristic(this.platform.Characteristic.MotionDetected, false); }); } parkedInRange(lat1, lon1, lat2, lon2, radius) { const R = 6371; const dLat = this.deg2rad(lat2 - lat1); const dLon = this.deg2rad(lon2 - lon1); const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(this.deg2rad(lat1)) * Math.cos(this.deg2rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const d = R * c; return (d * 1000 <= radius); } deg2rad(deg) { return deg * (Math.PI / 180); } async getMotionDetected() { const data = this.platform.vwConn.idData.parking.data; const state = this.parkedInRange(this.accessory.context.device.lat, this.accessory.context.device.lon, data.lat, data.lon, (this.accessory.context.device.notificationRadius || this.accessory.context.device.radius)); return state; } } exports.LocationMotionSensorAccessory = LocationMotionSensorAccessory; //# sourceMappingURL=locationMotionSensorAccessory.js.map