diff --git a/homebridge-ui/server.js b/homebridge-ui/server.js index 7b604fd7..d1f81dba 100644 --- a/homebridge-ui/server.js +++ b/homebridge-ui/server.js @@ -22,6 +22,8 @@ class UiServer extends HomebridgePluginUiServer { fs.mkdirSync(this.storagePath); } + const logfileStream = fs.createWriteStream(this.storagePath + '/config_ui_log', { flags: 'w' }); + this.log = bunyan.createLogger({ name: '[' + plugin.version + ']', hostname: '', @@ -33,6 +35,7 @@ class UiServer extends HomebridgePluginUiServer { showProcess: false, showPid: false, showDate: false, + out: logfileStream, }), }], serializers: bunyanDebugStream.serializers, diff --git a/src/accessories/LocalLivestreamManager.ts b/src/accessories/LocalLivestreamManager.ts index bca7e2eb..cf7f7b86 100644 --- a/src/accessories/LocalLivestreamManager.ts +++ b/src/accessories/LocalLivestreamManager.ts @@ -234,6 +234,8 @@ export class LocalLivestreamManager extends EventEmitter { if (!this.livestreamIsStarting) { // prevent multiple stream starts from eufy station this.livestreamIsStarting = true; this.platform.eufyClient.startStationLivestream(this.device.getSerial()); + } else { + this.log.debug(this.device.getName(), 'stream is already starting. waiting...'); } if (this.connectionTimeout) { diff --git a/src/accessories/SnapshotManager.ts b/src/accessories/SnapshotManager.ts index 8c2432d9..dd886715 100644 --- a/src/accessories/SnapshotManager.ts +++ b/src/accessories/SnapshotManager.ts @@ -18,6 +18,8 @@ import { rejects } from 'node:assert'; const SnapshotBlackPath = require.resolve('../../media/Snapshot-black.png'); +let MINUTES_TO_WAIT_FOR_AUTOMATIC_REFRESH_TO_BEGIN = 1; // should be incremented by 1 for every device + type Snapshot = { timestamp: number; image: Buffer; @@ -97,10 +99,11 @@ export class SnapshotManager extends EventEmitter { this.cameraConfig.refreshSnapshotIntervalMinutes = 5; } // eslint-disable-next-line max-len - this.log.info(this.device.getName(), 'Setting up automatic snapshot refresh every ' + this.cameraConfig.refreshSnapshotIntervalMinutes + ' minutes. This may decrease battery life dramatically.'); + this.log.info(this.device.getName(), 'Setting up automatic snapshot refresh every ' + this.cameraConfig.refreshSnapshotIntervalMinutes + ' minutes. This may decrease battery life dramatically. The refresh process for ' + this.device.getName() + ' should begin in ' + MINUTES_TO_WAIT_FOR_AUTOMATIC_REFRESH_TO_BEGIN + ' minutes.'); setTimeout(() => { // give homebridge some time to start up this.automaticSnapshotRefresh(); - }, 60 * 1000); + }, MINUTES_TO_WAIT_FOR_AUTOMATIC_REFRESH_TO_BEGIN * 60 * 1000); + MINUTES_TO_WAIT_FOR_AUTOMATIC_REFRESH_TO_BEGIN++; } if (this.cameraConfig.snapshotHandlingMethod === 1) { @@ -430,10 +433,11 @@ export class SnapshotManager extends EventEmitter { private async getCurrentCameraSnapshot(): Promise { const source = await this.getCameraSource(); + if (!source) { + return Promise.reject('No camera source detected.'); + } + return new Promise((resolve, reject) => { - if (!source) { - return; - } const url = '-i ' + source.url; const ffmpegArgs = (this.cameraConfig.videoConfig!.stillImageSource || url) + // Still @@ -452,6 +456,10 @@ export class SnapshotManager extends EventEmitter { const ffmpeg = spawn(this.videoProcessor, ffmpegArgs.split(/\s+/), { env: process.env }); const ffmpegTimeout = setTimeout(() => { + if (source.livestreamId) { + this.livestreamManager.stopProxyStream(source.livestreamId); + } + reject('ffmpeg process timed out'); }, 15000);