diff --git a/README.md b/README.md index 1f60d28..fdbb050 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Make your TP-Link TAPO security camera compatible with Homekit through Homebridg The plugin exposes the camera RTSP video feed, and toggle accessories to configure your automations. +If your video feed is not working, try to check if any of the parameters at the video config can be tuned. You can use [https://sunoo.github.io/homebridge-camera-ffmpeg/configs](https://sunoo.github.io/homebridge-camera-ffmpeg/configs) to check if someone has already found the right values for your camera. + > [!IMPORTANT] > On firmware build 230921 and higher, [please follow this guide](https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/blob/main/add_camera_with_new_firmware.md) to make your camera compatible with this integration. diff --git a/config.schema.json b/config.schema.json index 505f7da..dfd5ce6 100644 --- a/config.schema.json +++ b/config.schema.json @@ -2,8 +2,8 @@ "pluginAlias": "tapo-camera", "pluginType": "platform", "singular": true, - "headerDisplay": "Homebridge plugin for TP-Link TAPO security cameras", - "footerDisplay": null, + "headerDisplay": "Homebridge plugin for TP-Link TAPO security cameras.", + "footerDisplay": "If your video feed is not working, try to check if any of the parameters at the video config can be tuned. You can use https://sunoo.github.io/homebridge-camera-ffmpeg/configs to check if someone has already found the right values for your camera.", "form": null, "display": null, "schema": { @@ -100,7 +100,7 @@ "lowQuality": { "title": "Low Quality", "type": "boolean", - "description": "Video stream will be requested in low-quality (640x480) instead of HQ (1920x1080)" + "description": "Video stream will be requested in low-quality instead of high-quality" }, "eyesToggleAccessoryName": { "title": "Eyes (privacy mode) toggle Name", @@ -131,6 +131,42 @@ "type": "string", "description": "Name of the LED toggle", "placeholder": "LED" + }, + + "videoMaxWidth": { + "title": "Video Max Width", + "type": "integer", + "description": "Maximum width of the video stream", + "placeholder": 1280 + }, + "videoMaxHeight": { + "title": "Video Max Height", + "type": "integer", + "description": "Maximum height of the video stream", + "placeholder": 720 + }, + "videoMaxFPS": { + "title": "Video Max FPS", + "type": "integer", + "description": "Maximum frames per second of the video stream", + "placeholder": 30 + }, + "videoMaxBitrate": { + "title": "Video Max Bitrate", + "type": "integer", + "description": "Maximum bitrate of the video stream", + "placeholder": 300 + }, + "videoPacketSize": { + "title": "Video Packet Size", + "type": "integer", + "description": "Size of the video packets", + "placeholder": 1316 + }, + "videoForceMax": { + "title": "Force Max Video", + "type": "boolean", + "description": "Force the video stream to use the maximum values, instead of the one provided by the Homekit request. Most likely you don't want this" } } } diff --git a/src/cameraAccessory.ts b/src/cameraAccessory.ts index 8dfde96..918262f 100644 --- a/src/cameraAccessory.ts +++ b/src/cameraAccessory.ts @@ -32,6 +32,13 @@ export type CameraConfig = { disableMotionSensorAccessory?: boolean; lowQuality?: boolean; + videoMaxWidth?: number; + videoMaxHeight?: number; + videoMaxFPS?: number; + videoForceMax?: boolean; + videoMaxBirate?: number; + videoPacketSize?: number; + videoConfig?: VideoConfig; eyesToggleAccessoryName?: string; @@ -168,12 +175,15 @@ export class CameraAccessory { audio: true, videoFilter: "none", vcodec: "copy", - maxWidth: this.config.lowQuality ? 640 : 1920, - maxHeight: this.config.lowQuality ? 480 : 1080, - maxFPS: 15, - forceMax: true, + maxWidth: this.config.videoMaxWidth, + maxHeight: this.config.videoMaxHeight, + maxFPS: this.config.videoMaxFPS, + maxBitrate: this.config.videoMaxBirate, + packetSize: this.config.videoPacketSize, + forceMax: this.config.videoForceMax, ...(this.config.videoConfig || {}), }; + return config; } @@ -195,6 +205,8 @@ export class CameraAccessory { ); this.accessory.configureController(delegate.controller); + + this.log.debug("Camera streaming setup done"); } catch (err) { this.log.error("Error setting up camera streaming:", err); } diff --git a/src/types/tapo.ts b/src/types/tapo.ts index 1e5ea31..dc45507 100644 --- a/src/types/tapo.ts +++ b/src/types/tapo.ts @@ -46,6 +46,14 @@ export type TAPOCameraGetRequest = name: "config"; }; }; + } + | { + method: "getWhitelampStatus"; + params: { + image: { + get_wtl_status: "null"; + }; + }; }; export type TAPOCameraSetRequest = @@ -102,6 +110,16 @@ export type TAPOCameraSetRequest = }; }; }; + } + | { + method: "setWhitelampConfig"; + params: { + image: { + switch: { + wtl_intensity_level: string; + }; + }; + }; }; export type TAPOCameraUnencryptedRequest = {