From 4d471eb2858d0ccf071a7cd9aa74f1d19401ef85 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 8 Jul 2024 09:43:30 -0700 Subject: [PATCH] sdk/plugins/client/server: add new ScryptedDeviceCreator ui hooks --- packages/client/package-lock.json | 8 +-- packages/client/package.json | 2 +- plugins/amcrest/package-lock.json | 4 +- plugins/amcrest/package.json | 4 +- plugins/amcrest/src/main.ts | 3 + plugins/dummy-switch/package-lock.json | 4 +- plugins/dummy-switch/package.json | 4 +- plugins/dummy-switch/src/main.ts | 4 ++ .../dummy-switch/src/replace-binary-sensor.ts | 4 +- .../dummy-switch/src/replace-motion-sensor.ts | 4 +- plugins/ffmpeg-camera/package-lock.json | 4 +- plugins/ffmpeg-camera/package.json | 4 +- plugins/ffmpeg-camera/src/common.ts | 5 ++ plugins/ffmpeg-camera/src/main.ts | 4 ++ plugins/hikvision/package-lock.json | 4 +- plugins/hikvision/package.json | 4 +- plugins/hikvision/src/main.ts | 4 ++ plugins/mqtt/package-lock.json | 4 +- plugins/mqtt/package.json | 4 +- plugins/mqtt/src/main.ts | 4 ++ plugins/objectdetector/package-lock.json | 4 +- plugins/objectdetector/package.json | 4 +- plugins/objectdetector/src/main.ts | 4 +- plugins/onvif/package-lock.json | 4 +- plugins/onvif/package.json | 4 +- plugins/onvif/src/main.ts | 4 ++ plugins/reolink/package-lock.json | 4 +- plugins/reolink/package.json | 4 +- plugins/reolink/src/main.ts | 4 ++ plugins/rtsp/package-lock.json | 4 +- plugins/rtsp/package.json | 4 +- plugins/rtsp/src/main.ts | 6 +- plugins/rtsp/src/rtsp.ts | 2 +- sdk/package-lock.json | 4 +- sdk/package.json | 2 +- sdk/types/package-lock.json | 4 +- sdk/types/package.json | 2 +- .../scrypted_python/scrypted_sdk/types.py | 63 +++++++++++++++---- sdk/types/src/types.input.ts | 37 +++++++++-- server/package-lock.json | 8 +-- server/package.json | 2 +- 41 files changed, 188 insertions(+), 68 deletions(-) diff --git a/packages/client/package-lock.json b/packages/client/package-lock.json index 7cacd71b3..15a5622ca 100644 --- a/packages/client/package-lock.json +++ b/packages/client/package-lock.json @@ -9,7 +9,7 @@ "version": "1.3.5", "license": "ISC", "dependencies": { - "@scrypted/types": "^0.3.31", + "@scrypted/types": "^0.3.33", "engine.io-client": "^6.5.3", "follow-redirects": "^1.15.6", "rimraf": "^5.0.5" @@ -84,9 +84,9 @@ } }, "node_modules/@scrypted/types": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.31.tgz", - "integrity": "sha512-ZmpHMhCp5Aw6AaRKCTc6+y5u1gaNU6MxktWfeuFQ3djMdeI2XVWbpN9o/uTVeyqCHJzBnFTg1JM52sU9bJpolw==" + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.33.tgz", + "integrity": "sha512-te81NcMnzQsxv0z4efARDbqMBiGzOPD2H+mOzcYCr2Cm2wpvYMwVt576MoXX890Bxn8omh2aRsFK4xSFTlUWSQ==" }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", diff --git a/packages/client/package.json b/packages/client/package.json index 1a8c3520e..ed63920a4 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -18,7 +18,7 @@ "typescript": "^5.4.3" }, "dependencies": { - "@scrypted/types": "^0.3.31", + "@scrypted/types": "^0.3.33", "engine.io-client": "^6.5.3", "follow-redirects": "^1.15.6", "rimraf": "^5.0.5" diff --git a/plugins/amcrest/package-lock.json b/plugins/amcrest/package-lock.json index 61af6b155..6a97801b7 100644 --- a/plugins/amcrest/package-lock.json +++ b/plugins/amcrest/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/amcrest", - "version": "0.0.151", + "version": "0.0.152", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/amcrest", - "version": "0.0.151", + "version": "0.0.152", "license": "Apache", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/amcrest/package.json b/plugins/amcrest/package.json index e8be29f7f..21d89938d 100644 --- a/plugins/amcrest/package.json +++ b/plugins/amcrest/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/amcrest", - "version": "0.0.151", + "version": "0.0.152", "description": "Amcrest Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -27,6 +27,8 @@ "name": "Amcrest Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator" ], diff --git a/plugins/amcrest/src/main.ts b/plugins/amcrest/src/main.ts index b55108a75..2a1852fe3 100644 --- a/plugins/amcrest/src/main.ts +++ b/plugins/amcrest/src/main.ts @@ -703,6 +703,9 @@ class AmcrestProvider extends RtspProvider { ]; } + getScryptedDeviceCreator(): string { + return 'Amcrest Camera'; + } async createDevice(settings: DeviceCreatorSettings, nativeId?: string): Promise { const httpAddress = `${settings.ip}:${settings.httpPort || 80}`; diff --git a/plugins/dummy-switch/package-lock.json b/plugins/dummy-switch/package-lock.json index 361468d5d..07657bb83 100644 --- a/plugins/dummy-switch/package-lock.json +++ b/plugins/dummy-switch/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/dummy-switch", - "version": "0.0.23", + "version": "0.0.24", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/dummy-switch", - "version": "0.0.23", + "version": "0.0.24", "dependencies": { "@types/node": "^16.6.1", "axios": "^1.3.6" diff --git a/plugins/dummy-switch/package.json b/plugins/dummy-switch/package.json index afd314b78..292c1ce8b 100644 --- a/plugins/dummy-switch/package.json +++ b/plugins/dummy-switch/package.json @@ -26,6 +26,8 @@ "name": "Dummy Switch Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator" ] @@ -38,5 +40,5 @@ "@scrypted/common": "file:../../common", "@scrypted/sdk": "file:../../sdk" }, - "version": "0.0.23" + "version": "0.0.24" } diff --git a/plugins/dummy-switch/src/main.ts b/plugins/dummy-switch/src/main.ts index efa2ccb51..cb49f69ab 100644 --- a/plugins/dummy-switch/src/main.ts +++ b/plugins/dummy-switch/src/main.ts @@ -84,6 +84,10 @@ class DummyDeviceProvider extends ScryptedDeviceBase implements DeviceProvider, constructor(nativeId?: string) { super(nativeId); + this.systemDevice = { + deviceCreator: 'Dummy Switch', + }; + for (const camId of deviceManager.getNativeIds()) { if (camId) this.getDevice(camId); diff --git a/plugins/dummy-switch/src/replace-binary-sensor.ts b/plugins/dummy-switch/src/replace-binary-sensor.ts index d09ee73a3..e42324a13 100644 --- a/plugins/dummy-switch/src/replace-binary-sensor.ts +++ b/plugins/dummy-switch/src/replace-binary-sensor.ts @@ -1,5 +1,5 @@ import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from "@scrypted/common/src/settings-mixin"; -import { BinarySensor, DeviceState, EventListenerRegister, MixinProvider, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings } from "@scrypted/sdk"; +import { BinarySensor, EventListenerRegister, MixinProvider, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings, WritableDeviceState } from "@scrypted/sdk"; import { StorageSettings } from "@scrypted/sdk/storage-settings"; export const ReplaceBinarySensorNativeId = 'replaceBinarySensor'; @@ -63,7 +63,7 @@ export class ReplaceBinarySensor extends ScryptedDeviceBase implements MixinProv ]; } - async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: DeviceState): Promise { + async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: WritableDeviceState): Promise { return new ReplaceBinarySensorMixin({ group: 'Custom Doorbell Button', groupKey: 'replaceBinarySensor', diff --git a/plugins/dummy-switch/src/replace-motion-sensor.ts b/plugins/dummy-switch/src/replace-motion-sensor.ts index e1f0ba2e2..8d6ac6683 100644 --- a/plugins/dummy-switch/src/replace-motion-sensor.ts +++ b/plugins/dummy-switch/src/replace-motion-sensor.ts @@ -1,5 +1,5 @@ import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from "@scrypted/common/src/settings-mixin"; -import { DeviceState, EventListenerRegister, MixinProvider, MotionSensor, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings } from "@scrypted/sdk"; +import { EventListenerRegister, MixinProvider, MotionSensor, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings, WritableDeviceState } from "@scrypted/sdk"; import { StorageSettings } from "@scrypted/sdk/storage-settings"; export const ReplaceMotionSensorNativeId = 'replaceMotionSensor'; @@ -63,7 +63,7 @@ export class ReplaceMotionSensor extends ScryptedDeviceBase implements MixinProv ]; } - async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: DeviceState): Promise { + async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: WritableDeviceState): Promise { return new ReplaceMotionSensorMixin({ group: 'Custom Motion Sensor', groupKey: 'replaceMotionSensor', diff --git a/plugins/ffmpeg-camera/package-lock.json b/plugins/ffmpeg-camera/package-lock.json index b69c016d6..98f4ed0dc 100644 --- a/plugins/ffmpeg-camera/package-lock.json +++ b/plugins/ffmpeg-camera/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/ffmpeg-camera", - "version": "0.0.22", + "version": "0.0.23", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/ffmpeg-camera", - "version": "0.0.22", + "version": "0.0.23", "license": "Apache", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/ffmpeg-camera/package.json b/plugins/ffmpeg-camera/package.json index 920f656cc..76bf6e439 100644 --- a/plugins/ffmpeg-camera/package.json +++ b/plugins/ffmpeg-camera/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/ffmpeg-camera", - "version": "0.0.22", + "version": "0.0.23", "description": "FFmpeg Camera Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -27,6 +27,8 @@ "name": "FFmpeg Camera Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator" ], diff --git a/plugins/ffmpeg-camera/src/common.ts b/plugins/ffmpeg-camera/src/common.ts index 21479ef57..138f33ab8 100644 --- a/plugins/ffmpeg-camera/src/common.ts +++ b/plugins/ffmpeg-camera/src/common.ts @@ -130,6 +130,10 @@ export abstract class CameraProviderBase e constructor(nativeId?: string) { super(nativeId); + + this.systemDevice = { + deviceCreator: this.getScryptedDeviceCreator(), + }; } async createDevice(settings: DeviceCreatorSettings, nativeId?: ScryptedNativeId): Promise { @@ -173,6 +177,7 @@ export abstract class CameraProviderBase e } abstract createCamera(nativeId: string): CameraBase; + abstract getScryptedDeviceCreator(): string; getDevice(nativeId: string) { let ret = this.devices.get(nativeId); diff --git a/plugins/ffmpeg-camera/src/main.ts b/plugins/ffmpeg-camera/src/main.ts index db311167d..d34fd49aa 100644 --- a/plugins/ffmpeg-camera/src/main.ts +++ b/plugins/ffmpeg-camera/src/main.ts @@ -130,6 +130,10 @@ class FFmpegProvider extends CameraProviderBase { createCamera(nativeId: string): FFmpegCamera { return new FFmpegCamera(nativeId, this); } + + getScryptedDeviceCreator(): string { + return 'FFmpeg Camera'; + } } export default new FFmpegProvider(); diff --git a/plugins/hikvision/package-lock.json b/plugins/hikvision/package-lock.json index c1d28a2f1..ce6f4675d 100644 --- a/plugins/hikvision/package-lock.json +++ b/plugins/hikvision/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/hikvision", - "version": "0.0.149", + "version": "0.0.150", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/hikvision", - "version": "0.0.149", + "version": "0.0.150", "license": "Apache", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/hikvision/package.json b/plugins/hikvision/package.json index 5b5c335f1..392ff3350 100644 --- a/plugins/hikvision/package.json +++ b/plugins/hikvision/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/hikvision", - "version": "0.0.149", + "version": "0.0.150", "description": "Hikvision Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -27,6 +27,8 @@ "name": "Hikvision Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator" ], diff --git a/plugins/hikvision/src/main.ts b/plugins/hikvision/src/main.ts index 4667a93e5..7bf8923c8 100644 --- a/plugins/hikvision/src/main.ts +++ b/plugins/hikvision/src/main.ts @@ -593,6 +593,10 @@ class HikvisionProvider extends RtspProvider { super(); } + getScryptedDeviceCreator(): string { + return 'Hikvision Camera'; + } + getAdditionalInterfaces() { return [ ScryptedInterface.Reboot, diff --git a/plugins/mqtt/package-lock.json b/plugins/mqtt/package-lock.json index dfd2547da..588061650 100644 --- a/plugins/mqtt/package-lock.json +++ b/plugins/mqtt/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/mqtt", - "version": "0.0.81", + "version": "0.0.82", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/mqtt", - "version": "0.0.81", + "version": "0.0.82", "dependencies": { "aedes": "^0.46.1", "axios": "^0.23.0", diff --git a/plugins/mqtt/package.json b/plugins/mqtt/package.json index ebe0ef637..1a6068bdd 100644 --- a/plugins/mqtt/package.json +++ b/plugins/mqtt/package.json @@ -22,6 +22,8 @@ "name": "MQTT", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "MixinProvider", "DeviceProvider", "DeviceCreator", @@ -41,5 +43,5 @@ "@types/node": "^18.4.2", "@types/nunjucks": "^3.2.0" }, - "version": "0.0.81" + "version": "0.0.82" } diff --git a/plugins/mqtt/src/main.ts b/plugins/mqtt/src/main.ts index fb08992f1..fc608f830 100644 --- a/plugins/mqtt/src/main.ts +++ b/plugins/mqtt/src/main.ts @@ -362,6 +362,10 @@ export class MqttProvider extends ScryptedDeviceBase implements DeviceProvider, constructor(nativeId?: string) { super(nativeId); + this.systemDevice = { + deviceCreator: 'MQTT Device', + }; + this.maybeEnableBroker(); for (const deviceId of deviceManager.getNativeIds()) { diff --git a/plugins/objectdetector/package-lock.json b/plugins/objectdetector/package-lock.json index 30a009c6e..e8e177a99 100644 --- a/plugins/objectdetector/package-lock.json +++ b/plugins/objectdetector/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/objectdetector", - "version": "0.1.42", + "version": "0.1.43", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/objectdetector", - "version": "0.1.42", + "version": "0.1.43", "license": "Apache-2.0", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/objectdetector/package.json b/plugins/objectdetector/package.json index ef8f03bf8..216f9b0a0 100644 --- a/plugins/objectdetector/package.json +++ b/plugins/objectdetector/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/objectdetector", - "version": "0.1.42", + "version": "0.1.43", "description": "Scrypted Video Analysis Plugin. Installed alongside a detection service like OpenCV or TensorFlow.", "author": "Scrypted", "license": "Apache-2.0", @@ -35,6 +35,8 @@ "name": "Video Analysis Plugin", "type": "API", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceCreator", "DeviceProvider", "Settings", diff --git a/plugins/objectdetector/src/main.ts b/plugins/objectdetector/src/main.ts index f92dd7d45..717c8c9f9 100644 --- a/plugins/objectdetector/src/main.ts +++ b/plugins/objectdetector/src/main.ts @@ -1016,7 +1016,9 @@ export class ObjectDetectionPlugin extends AutoenableMixinProvider implements Se constructor(nativeId?: ScryptedNativeId) { super(nativeId, 'v5'); - this.createdDevice = 'Smart Motion Sensor'; + this.systemDevice = { + deviceCreator: 'Smart Motion Sensor', + }; process.nextTick(() => { sdk.deviceManager.onDeviceDiscovered({ diff --git a/plugins/onvif/package-lock.json b/plugins/onvif/package-lock.json index 186c85120..7c091846b 100644 --- a/plugins/onvif/package-lock.json +++ b/plugins/onvif/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/onvif", - "version": "0.1.14", + "version": "0.1.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/onvif", - "version": "0.1.14", + "version": "0.1.15", "license": "Apache", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/onvif/package.json b/plugins/onvif/package.json index 2c07e0028..becfc893b 100644 --- a/plugins/onvif/package.json +++ b/plugins/onvif/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/onvif", - "version": "0.1.14", + "version": "0.1.15", "description": "ONVIF Camera Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -27,6 +27,8 @@ "name": "ONVIF Camera Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator", "DeviceDiscovery" diff --git a/plugins/onvif/src/main.ts b/plugins/onvif/src/main.ts index bc120071b..c44201179 100644 --- a/plugins/onvif/src/main.ts +++ b/plugins/onvif/src/main.ts @@ -466,6 +466,10 @@ class OnvifProvider extends RtspProvider implements DeviceDiscovery { }) } + getScryptedDeviceCreator(): string { + return 'ONVIF Camera'; + } + async getDevice(nativeId: string) { if (nativeId === 'ptz') return new OnvifPTZMixinProvider('ptz'); diff --git a/plugins/reolink/package-lock.json b/plugins/reolink/package-lock.json index 2e1d06f08..fbf9a0f03 100644 --- a/plugins/reolink/package-lock.json +++ b/plugins/reolink/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/reolink", - "version": "0.0.82", + "version": "0.0.83", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/reolink", - "version": "0.0.82", + "version": "0.0.83", "license": "Apache", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/reolink/package.json b/plugins/reolink/package.json index 47502cb98..a077ed9d7 100644 --- a/plugins/reolink/package.json +++ b/plugins/reolink/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/reolink", - "version": "0.0.82", + "version": "0.0.83", "description": "Reolink Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -27,6 +27,8 @@ "name": "Reolink Camera Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator" ], diff --git a/plugins/reolink/src/main.ts b/plugins/reolink/src/main.ts index 20cb855f8..52b07f71d 100644 --- a/plugins/reolink/src/main.ts +++ b/plugins/reolink/src/main.ts @@ -667,6 +667,10 @@ class ReolinkCamera extends RtspSmartCamera implements Camera, DeviceProvider, R } class ReolinkProvider extends RtspProvider { + getScryptedDeviceCreator(): string { + return 'Reolink Camera'; + } + getAdditionalInterfaces() { return [ ScryptedInterface.Reboot, diff --git a/plugins/rtsp/package-lock.json b/plugins/rtsp/package-lock.json index f4daf734e..d91e3b149 100644 --- a/plugins/rtsp/package-lock.json +++ b/plugins/rtsp/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/rtsp", - "version": "0.0.54", + "version": "0.0.55", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/rtsp", - "version": "0.0.54", + "version": "0.0.55", "license": "Apache", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/rtsp/package.json b/plugins/rtsp/package.json index 320a0033e..800b2099f 100644 --- a/plugins/rtsp/package.json +++ b/plugins/rtsp/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/rtsp", - "version": "0.0.54", + "version": "0.0.55", "description": "RTSP Cameras and Streams Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -27,6 +27,8 @@ "name": "RTSP Camera Plugin", "type": "DeviceProvider", "interfaces": [ + "ScryptedSystemDevice", + "ScryptedDeviceCreator", "DeviceProvider", "DeviceCreator" ], diff --git a/plugins/rtsp/src/main.ts b/plugins/rtsp/src/main.ts index 187a6804f..0c32555a6 100644 --- a/plugins/rtsp/src/main.ts +++ b/plugins/rtsp/src/main.ts @@ -1,3 +1,7 @@ import { RtspProvider } from "./rtsp"; -export default new RtspProvider(); +export default class RTSPCameraProvider extends RtspProvider { + getScryptedDeviceCreator(): string { + return 'RTSP Camera'; + } +} diff --git a/plugins/rtsp/src/rtsp.ts b/plugins/rtsp/src/rtsp.ts index cbde88259..ad149f294 100644 --- a/plugins/rtsp/src/rtsp.ts +++ b/plugins/rtsp/src/rtsp.ts @@ -375,7 +375,7 @@ export abstract class RtspSmartCamera extends RtspCamera { } } -export class RtspProvider extends CameraProviderBase { +export abstract class RtspProvider extends CameraProviderBase { createCamera(nativeId: string): RtspCamera { return new RtspCamera(nativeId, this); } diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 0ec5303eb..784a4dc97 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/sdk", - "version": "0.3.32", + "version": "0.3.35", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/sdk", - "version": "0.3.32", + "version": "0.3.35", "license": "ISC", "dependencies": { "@babel/preset-typescript": "^7.18.6", diff --git a/sdk/package.json b/sdk/package.json index 823daf49f..5cb6a6f8a 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/sdk", - "version": "0.3.32", + "version": "0.3.35", "description": "", "main": "dist/src/index.js", "exports": { diff --git a/sdk/types/package-lock.json b/sdk/types/package-lock.json index b7e058259..16a2dced5 100644 --- a/sdk/types/package-lock.json +++ b/sdk/types/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/types", - "version": "0.3.31", + "version": "0.3.33", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/types", - "version": "0.3.31", + "version": "0.3.33", "license": "ISC", "devDependencies": { "@types/node": "^18.19.15", diff --git a/sdk/types/package.json b/sdk/types/package.json index 243ce1cef..f6fcae593 100644 --- a/sdk/types/package.json +++ b/sdk/types/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/types", - "version": "0.3.31", + "version": "0.3.33", "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 e842f2a4a..73bc6a292 100644 --- a/sdk/types/scrypted_python/scrypted_sdk/types.py +++ b/sdk/types/scrypted_python/scrypted_sdk/types.py @@ -172,8 +172,11 @@ class ScryptedInterface(str, Enum): Scene = "Scene" Scriptable = "Scriptable" ScryptedDevice = "ScryptedDevice" + ScryptedDeviceCreator = "ScryptedDeviceCreator" ScryptedPlugin = "ScryptedPlugin" ScryptedPluginRuntime = "ScryptedPluginRuntime" + ScryptedSettings = "ScryptedSettings" + ScryptedSystemDevice = "ScryptedSystemDevice" ScryptedUser = "ScryptedUser" SecuritySystem = "SecuritySystem" Settings = "Settings" @@ -794,6 +797,11 @@ class ScryptedRuntimeArguments(TypedDict): arguments: list[str] executable: str +class ScryptedSystemDeviceInfo(TypedDict): + + deviceCreator: str # The description of device that will be created by this DeviceCreator. For example: Example Corp Camera or ACME Light Switch. + settings: str # The name of the device as seen in System Settings. + class ScryptedUserAccessControl(TypedDict): """ScryptedUserAccessControl describes the list of devices that may be accessed by the user.""" @@ -982,7 +990,6 @@ class ColorSettingTemperature: class DeviceCreator: """A DeviceProvider that allows the user to create a device.""" - createdDevice: str # Type of device that will be created by this DeviceCreator. For example: Example Corp Camera or ACME Light Switch. async def createDevice(self, settings: DeviceCreatorSettings) -> str: pass @@ -1389,6 +1396,11 @@ class ScryptedDevice: pass +class ScryptedDeviceCreator: + + + pass + class ScryptedPlugin: async def getPluginJson(self) -> Any: @@ -1399,6 +1411,16 @@ class ScryptedPluginRuntime: scryptedRuntimeArguments: ScryptedRuntimeArguments +class ScryptedSettings: + + + pass + +class ScryptedSystemDevice: + """SystemDevices are listed in the Scrypted UI.""" + + systemDevice: ScryptedSystemDeviceInfo # Type of device that will be created by this DeviceCreator. For example: Example Corp Camera or ACME Light Switch. + class ScryptedUser: """ScryptedUser represents a user managed by Scrypted. This interface can not be implemented, only extended by Mixins.""" @@ -1757,7 +1779,6 @@ class ScryptedInterfaceProperty(str, Enum): ptzCapabilities = "ptzCapabilities" lockState = "lockState" entryOpen = "entryOpen" - createdDevice = "createdDevice" batteryLevel = "batteryLevel" chargeState = "chargeState" online = "online" @@ -1788,6 +1809,7 @@ class ScryptedInterfaceProperty(str, Enum): humiditySetting = "humiditySetting" fan = "fan" applicationInfo = "applicationInfo" + systemDevice = "systemDevice" class ScryptedInterfaceMethods(str, Enum): listen = "listen" @@ -2153,14 +2175,6 @@ class DeviceState: def entryOpen(self, value: bool | Any): self.setScryptedProperty("entryOpen", value) - @property - def createdDevice(self) -> str: - return self.getScryptedProperty("createdDevice") - - @createdDevice.setter - def createdDevice(self, value: str): - self.setScryptedProperty("createdDevice", value) - @property def batteryLevel(self) -> float: return self.getScryptedProperty("batteryLevel") @@ -2401,6 +2415,14 @@ class DeviceState: def applicationInfo(self, value: LauncherApplicationInfo): self.setScryptedProperty("applicationInfo", value) + @property + def systemDevice(self) -> ScryptedSystemDeviceInfo: + return self.getScryptedProperty("systemDevice") + + @systemDevice.setter + def systemDevice(self, value: ScryptedSystemDeviceInfo): + self.setScryptedProperty("systemDevice", value) + ScryptedInterfaceDescriptors = { "ScryptedDevice": { "name": "ScryptedDevice", @@ -2727,9 +2749,7 @@ ScryptedInterfaceDescriptors = { "createDevice", "getCreateDeviceSettings" ], - "properties": [ - "createdDevice" - ] + "properties": [] }, "Battery": { "name": "Battery", @@ -3105,6 +3125,23 @@ ScryptedInterfaceDescriptors = { "connectStream" ], "properties": [] + }, + "ScryptedSystemDevice": { + "name": "ScryptedSystemDevice", + "methods": [], + "properties": [ + "systemDevice" + ] + }, + "ScryptedDeviceCreator": { + "name": "ScryptedDeviceCreator", + "methods": [], + "properties": [] + }, + "ScryptedSettings": { + "name": "ScryptedSettings", + "methods": [], + "properties": [] } } diff --git a/sdk/types/src/types.input.ts b/sdk/types/src/types.input.ts index 82ac295de..a56628592 100644 --- a/sdk/types/src/types.input.ts +++ b/sdk/types/src/types.input.ts @@ -1037,11 +1037,6 @@ export interface DeviceCreator { * Return the id of the created device. */ createDevice(settings: DeviceCreatorSettings): Promise; - /** - * Type of device that will be created by this DeviceCreator. - * For example: Example Corp Camera or ACME Light Switch. - */ - createdDevice?: string; } export interface DiscoveredDevice { name: string; @@ -1190,6 +1185,34 @@ export interface Settings { putSetting(key: string, value: SettingValue): Promise; } + +/** + * SystemDevices are listed in the Scrypted UI. + */ +export interface ScryptedSystemDevice { + /** + * Type of device that will be created by this DeviceCreator. + * For example: Example Corp Camera or ACME Light Switch. + */ + systemDevice?: ScryptedSystemDeviceInfo; +} + +export interface ScryptedSystemDeviceInfo { + /** + * The name of the device as seen in System Settings. + */ + settings?: string; + /** + * The description of device that will be created by this DeviceCreator. + * For example: Example Corp Camera or ACME Light Switch. + */ + deviceCreator?: string; +} + +export interface ScryptedSettings { +} +export interface ScryptedDeviceCreator { +} export interface BinarySensor { binaryState?: boolean; } @@ -2106,6 +2129,10 @@ export enum ScryptedInterface { ScryptedUser = "ScryptedUser", VideoFrameGenerator = 'VideoFrameGenerator', StreamService = 'StreamService', + + ScryptedSystemDevice = "ScryptedSystemDevice", + ScryptedDeviceCreator = "ScryptedDeviceCreator", + ScryptedSettings = "ScryptedSettings", } /** diff --git a/server/package-lock.json b/server/package-lock.json index 3183da5ab..40c2f4155 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -13,7 +13,7 @@ "@mapbox/node-pre-gyp": "^1.0.11", "@scrypted/ffmpeg-static": "^6.1.0-build1", "@scrypted/node-pty": "^1.0.14", - "@scrypted/types": "^0.3.31", + "@scrypted/types": "^0.3.33", "adm-zip": "^0.5.14", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", @@ -711,9 +711,9 @@ } }, "node_modules/@scrypted/types": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.31.tgz", - "integrity": "sha512-ZmpHMhCp5Aw6AaRKCTc6+y5u1gaNU6MxktWfeuFQ3djMdeI2XVWbpN9o/uTVeyqCHJzBnFTg1JM52sU9bJpolw==" + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.33.tgz", + "integrity": "sha512-te81NcMnzQsxv0z4efARDbqMBiGzOPD2H+mOzcYCr2Cm2wpvYMwVt576MoXX890Bxn8omh2aRsFK4xSFTlUWSQ==" }, "node_modules/@types/adm-zip": { "version": "0.5.5", diff --git a/server/package.json b/server/package.json index e31dade57..d6803293f 100644 --- a/server/package.json +++ b/server/package.json @@ -6,7 +6,7 @@ "@mapbox/node-pre-gyp": "^1.0.11", "@scrypted/ffmpeg-static": "^6.1.0-build1", "@scrypted/node-pty": "^1.0.14", - "@scrypted/types": "^0.3.31", + "@scrypted/types": "^0.3.33", "adm-zip": "^0.5.14", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6",