diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 7a20ab555..10c86f142 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/sdk", - "version": "0.2.82", + "version": "0.2.84", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/sdk", - "version": "0.2.82", + "version": "0.2.84", "license": "ISC", "dependencies": { "@babel/preset-typescript": "^7.18.6", diff --git a/sdk/package.json b/sdk/package.json index f1d4c3c1c..a45f20091 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/sdk", - "version": "0.2.82", + "version": "0.2.84", "description": "", "main": "dist/src/index.js", "exports": { diff --git a/sdk/types/package-lock.json b/sdk/types/package-lock.json index 70b349ea9..b18e782b5 100644 --- a/sdk/types/package-lock.json +++ b/sdk/types/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/types", - "version": "0.2.74", + "version": "0.2.76", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/types", - "version": "0.2.74", + "version": "0.2.76", "license": "ISC", "devDependencies": { "@types/rimraf": "^3.0.2", diff --git a/sdk/types/package.json b/sdk/types/package.json index 1a150cf36..81a7e02d5 100644 --- a/sdk/types/package.json +++ b/sdk/types/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/types", - "version": "0.2.74", + "version": "0.2.76", "description": "", "main": "dist/index.js", "author": "", diff --git a/sdk/types/scrypted_python/scrypted_sdk/types.py b/sdk/types/scrypted_python/scrypted_sdk/types.py index 01209d71a..f7566a084 100644 --- a/sdk/types/scrypted_python/scrypted_sdk/types.py +++ b/sdk/types/scrypted_python/scrypted_sdk/types.py @@ -227,6 +227,11 @@ class HttpResponseOptions(TypedDict): headers: object pass +class ImageOptions(TypedDict): + format: str + resize: Any + pass + class ObjectDetectionResult(TypedDict): boundingBox: tuple[float, float, float, float] className: str @@ -464,6 +469,10 @@ class NotifierOptions(TypedDict): vibrate: VibratePattern pass +class ObjectDetectionGeneratorSession(TypedDict): + settings: Any + pass + class ObjectDetectionModel(TypedDict): classes: list[str] inputSize: list[float] @@ -492,9 +501,16 @@ class ObjectsDetected(TypedDict): timestamp: float pass +class PanTiltZoomCapabilities(TypedDict): + pan: bool + tilt: bool + zoom: bool + pass + class PanTiltZoomCommand(TypedDict): - horizontal: Any | Any - vertical: Any | Any + pan: float + tilt: float + zoom: float pass class Position(TypedDict): @@ -884,6 +900,8 @@ class OauthClient: class ObjectDetection: async def detectObjects(self, mediaObject: MediaObject, session: ObjectDetectionSession = None, callbacks: ObjectDetectionCallbacks = None) -> ObjectsDetected: pass + async def generateObjectDetections(self, videoFrames: VideoFrame, session: ObjectDetectionGeneratorSession, callback: Any) -> Any: + pass async def getDetectionModel(self, settings: Any = None) -> ObjectDetectionModel: pass pass @@ -925,7 +943,7 @@ class PM25Sensor: pass class PanTiltZoom: - ptzCapabilities: Any + ptzCapabilities: PanTiltZoomCapabilities async def ptzCommand(self, command: PanTiltZoomCommand) -> None: pass pass @@ -1543,10 +1561,10 @@ class DeviceState: self.setScryptedProperty("humidity", value) @property - def ptzCapabilities(self) -> Any: + def ptzCapabilities(self) -> PanTiltZoomCapabilities: return self.getScryptedProperty("ptzCapabilities") @ptzCapabilities.setter - def ptzCapabilities(self, value: Any): + def ptzCapabilities(self, value: PanTiltZoomCapabilities): self.setScryptedProperty("ptzCapabilities", value) @property @@ -2302,6 +2320,7 @@ ScryptedInterfaceDescriptors = { "name": "ObjectDetection", "methods": [ "detectObjects", + "generateObjectDetections", "getDetectionModel" ], "properties": [] @@ -2375,3 +2394,14 @@ class ObjectDetectionCallbacks: pass pass +class VideoFrame: + format: str + height: float + mimeType: str + sourceId: str + timestamp: float + width: float + async def read(self, options: ImageOptions = None) -> bytearray: + pass + pass + diff --git a/sdk/types/src/types.input.ts b/sdk/types/src/types.input.ts index cdc506df7..74e6123b6 100644 --- a/sdk/types/src/types.input.ts +++ b/sdk/types/src/types.input.ts @@ -760,12 +760,27 @@ export interface Intercom { } export interface PanTiltZoomCommand { - horizontal?: 'left' | 'right'; - vertical?: 'up' | 'down'; + /** + * Ranges between -1 and 1. + */ + pan?: number; + /** + * Ranges between -1 and 1. + */ + tilt?: number; + /** + * Ranges between 0 and 1 for max zoom. + */ + zoom?: number; } +export interface PanTiltZoomCapabilities { + pan?: boolean; + tilt?: boolean; + zoom?: boolean; +} export interface PanTiltZoom { - ptzCapabilities: any; + ptzCapabilities?: PanTiltZoomCapabilities; ptzCommand(command: PanTiltZoomCommand): Promise; } @@ -1235,7 +1250,7 @@ export interface ObjectDetectionTypes { * Given object detections with bounding boxes, return a similar list with tracker ids. */ export interface ObjectTracker { - trackObjects(detection: ObjectsDetected): Promise; + trackObjects(detection: ObjectsDetected): Promise; } /** * ObjectDetector is found on Cameras that have smart detection capabilities. @@ -1248,10 +1263,12 @@ export interface ObjectDetector { getDetectionInput(detectionId: string, eventId?: any): Promise; getObjectTypes(): Promise; } -export interface ObjectDetectionSession { +export interface ObjectDetectionGeneratorSession { + settings?: { [key: string]: any }; +} +export interface ObjectDetectionSession extends ObjectDetectionGeneratorSession { detectionId?: string; duration?: number; - settings?: { [key: string]: any }; } export interface ObjectDetectionModel extends ObjectDetectionTypes { name: string; @@ -1268,24 +1285,28 @@ export interface ObjectDetectionCallbacks { * E.g. TensorFlow, OpenCV, or a Coral TPU. */ export interface ObjectDetection { + generateObjectDetections(videoFrames: AsyncGenerator, session: ObjectDetectionGeneratorSession, callback: (videoFrame: VideoFrame, detected: ObjectsDetected) => Promise): Promise>; detectObjects(mediaObject: MediaObject, session?: ObjectDetectionSession, callbacks?: ObjectDetectionCallbacks): Promise; getDetectionModel(settings?: { [key: string]: any }): Promise; } -export interface VideoFrameOptions { +export interface ImageOptions { resize?: { width: number, height: number, }; format?: string; } -export interface VideoFrame extends MediaObject { +export interface Image extends MediaObject { timestamp: number; width: number; height: number; format: string; - read(options?: VideoFrameOptions): Promise; + read(options?: ImageOptions): Promise; } -export interface VideoFrameGeneratorOptions extends VideoFrameOptions { +export interface VideoFrame extends Image { + timestamp: number; +} +export interface VideoFrameGeneratorOptions extends ImageOptions { } export interface VideoFrameGenerator { generateVideoFrames(mediaObject: MediaObject, options?: VideoFrameGeneratorOptions, filter?: (videoFrame: VideoFrame) => Promise): Promise>; @@ -2114,5 +2135,5 @@ export interface ScryptedStatic { * through the Scrypted Server which typically manages plugin communication. * This is ideal for sending large amounts of data. */ - connectRPCObject?(value: T): Promise; + connectRPCObject?(value: T): Promise; }