@camera.ui/server 2.0.22 → 2.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/interface/assets/404-junY0N5P.js +1 -0
- package/dist/interface/assets/About-Dwc0TTLa.js +1 -0
- package/dist/interface/assets/Adminpanel-wZGtsPD-.js +1 -0
- package/dist/interface/assets/Automation-Dj6xmGae.js +3 -0
- package/dist/interface/assets/AutomationImport-Ccnxyslc.js +2 -0
- package/dist/interface/assets/AutomationStore-DmbxA0ml.js +2 -0
- package/dist/interface/assets/AutomationStoreDetail-DcbvD8g5.js +2 -0
- package/dist/interface/assets/Automations-C9JJO6dy.js +2 -0
- package/dist/interface/assets/Camera-D_j0J3kB.js +2 -0
- package/dist/interface/assets/CameraConsole--hGg9Ye6.js +7 -0
- package/dist/interface/assets/Cameras-B2Tizr4Q.js +652 -0
- package/dist/interface/assets/Camview-Bh2UCnGC.js +1 -0
- package/dist/interface/assets/{Camview-CaEbdeQZ.css → Camview-Cj10uxGy.css} +1 -1
- package/dist/interface/assets/Config-Dn_s2M7r.js +2 -0
- package/dist/interface/assets/{ConfigActionCameraControl-DFdb4xzq.js → ConfigActionCameraControl-DQEYHVN5.js} +1 -1
- package/dist/interface/assets/ConfigActionDelay-C0mbjCCj.js +1 -0
- package/dist/interface/assets/ConfigActionHttp-Bf58WHcw.js +1 -0
- package/dist/interface/assets/ConfigActionImageInput-CDXVFrOz.js +1 -0
- package/dist/interface/assets/ConfigActionMqtt-lH7MQqWr.js +1 -0
- package/dist/interface/assets/ConfigActionNotification-CAkr6NJX.js +1 -0
- package/dist/interface/assets/ConfigActionNotificationControl-CiL-4Ytw.js +1 -0
- package/dist/interface/assets/ConfigActionOutput-ILAxBT-r.js +1 -0
- package/dist/interface/assets/ConfigActionPlugin-B2d4mZiK.js +1 -0
- package/dist/interface/assets/ConfigActionSensor-BxMdsmRa.js +1 -0
- package/dist/interface/assets/ConfigActionSnapshot-CXVQBSzv.js +1 -0
- package/dist/interface/assets/ConfigActionVariable-CABnlnMv.js +1 -0
- package/dist/interface/assets/ConfigConditionIfElse-Cxu7TSdJ.js +1 -0
- package/dist/interface/assets/ConfigConditionSensorState-rB7I04Gb.js +1 -0
- package/dist/interface/assets/ConfigConditionSwitch-CU0hLo1h.js +1 -0
- package/dist/interface/assets/ConfigConditionTime-DfeEvxIU.js +1 -0
- package/dist/interface/assets/ConfigSensorValueInput-wXiyU3Sc.js +1 -0
- package/dist/interface/assets/{ConfigTriggerDetection-Cjes6g7x.js → ConfigTriggerDetection-DFJpuWrs.js} +1 -1
- package/dist/interface/assets/ConfigTriggerGeofence-CZwesOD8.js +1 -0
- package/dist/interface/assets/ConfigTriggerManual-aibwYUtf.js +1 -0
- package/dist/interface/assets/ConfigTriggerMqtt-CUNgifGb.js +1 -0
- package/dist/interface/assets/ConfigTriggerSchedule-8Y_OBcB1.js +1 -0
- package/dist/interface/assets/ConfigTriggerSensor-Bu-YtGnX.js +1 -0
- package/dist/interface/assets/{ConfigTriggerSystem-NaaBopYq.js → ConfigTriggerSystem-CXNvmC4S.js} +1 -1
- package/dist/interface/assets/ConfigTriggerWebhook-CkZ-_ABi.js +1 -0
- package/dist/interface/assets/Console-CG8eRDA4.js +1 -0
- package/dist/interface/assets/CuiAutomationRunsDialog-Ux0g-E3w.js +1 -0
- package/dist/interface/assets/CuiBottomSheet-C-ZN_uXE.js +1 -0
- package/dist/interface/assets/CuiBottomSheet-RUyuBxJZ.js +1 -0
- package/dist/interface/assets/CuiCameraPipCard-B-B6Ppsd.js +1 -0
- package/dist/interface/assets/CuiCameraRecordings-DqVdR9uS.js +1 -0
- package/dist/interface/assets/CuiCameraShares-DstoVjf9.js +1 -0
- package/dist/interface/assets/CuiCameraTable-BHaCRB65.js +2 -0
- package/dist/interface/assets/CuiDataTable-CTT9IFeR.js +1 -0
- package/dist/interface/assets/CuiLightControl-B_JIzm9t.js +1 -0
- package/dist/interface/assets/CuiLightControl-DFrZm_sv.css +1 -0
- package/dist/interface/assets/CuiList-CDed3qXV.js +1 -0
- package/dist/interface/assets/CuiMarkdownContent-Bjs3wRnq.js +1 -0
- package/dist/interface/assets/CuiMarkdownContent-Do8-vIl7.js +1 -0
- package/dist/interface/assets/CuiPluginCard-7aXQznrX.js +2 -0
- package/dist/interface/assets/{CuiPluginCategoryChip-D9Vi1SEP.js → CuiPluginCategoryChip-C2Y8x73q.js} +1 -1
- package/dist/interface/assets/CuiPluginOAuthButton-CCzRlZP6.js +2 -0
- package/dist/interface/assets/{CuiPluginTrustBadge-D0rUX2i6.js → CuiPluginTrustBadge-C8qBdLCg.js} +1 -1
- package/dist/interface/assets/CuiQRCode-D52Fcu61.js +1 -0
- package/dist/interface/assets/CuiRecordingsGrid-CfuihmlY.js +1 -0
- package/dist/interface/assets/CuiSchema-DTIuxROi.js +1 -0
- package/dist/interface/assets/CuiTopNavbarItem-CoTQmfY7.js +1 -0
- package/dist/interface/assets/Faces-EtBPS1Ve.js +1 -0
- package/dist/interface/assets/FirstSteps-CC0BPH40.js +1 -0
- package/dist/interface/assets/Instances-dSYERqIc.js +1 -0
- package/dist/interface/assets/Logs-B8d6dEt7.js +6 -0
- package/dist/interface/assets/Menu-CejIVz_7.js +1 -0
- package/dist/interface/assets/OAuthDeviceFlow-YhwV_FSL.js +1 -0
- package/dist/interface/assets/Plugin-Brb6wfq-.js +1 -0
- package/dist/interface/assets/PluginConsole-CfyZQVq5.js +7 -0
- package/dist/interface/assets/PluginDetail-DVRnnauk.js +2 -0
- package/dist/interface/assets/PluginSchema-i6UJfMnh.js +1 -0
- package/dist/interface/assets/PluginSearch-C1YL9q00.js +1 -0
- package/dist/interface/assets/PluginSearch-PDx47aUx.js +2 -0
- package/dist/interface/assets/Plugins-CukJohcb.js +1 -0
- package/dist/interface/assets/Recordings-m6jxYvRI.js +1 -0
- package/dist/interface/assets/SensorEdit-BJAijbmc.js +1 -0
- package/dist/interface/assets/SensorHistory-DW00ZuHR.js +1 -0
- package/dist/interface/assets/Sensors-BA9P_Ray.css +1 -0
- package/dist/interface/assets/Sensors-Lfafn19i.js +2 -0
- package/dist/interface/assets/Settings-DHT8KXi2.js +1 -0
- package/dist/interface/assets/SettingsAccount-DOd4JeGd.js +1 -0
- package/dist/interface/assets/{SettingsAccount-CyNJQSuV.css → SettingsAccount-si-6gWl5.css} +1 -1
- package/dist/interface/assets/SettingsAccount-vrwV9rtP.js +1 -0
- package/dist/interface/assets/SettingsAppearance-11UFhRDY.js +1 -0
- package/dist/interface/assets/SettingsAppearance-BaDwC_h_.js +1 -0
- package/dist/interface/assets/SettingsBackup-CBBZV_nU.js +1 -0
- package/dist/interface/assets/SettingsList-Dx9DHGq9.js +1 -0
- package/dist/interface/assets/SettingsMqtt-BglQ_GeN.js +1 -0
- package/dist/interface/assets/SettingsNotifications-96czeGDD.js +2 -0
- package/dist/interface/assets/SettingsPermissions-CU4OVllA.js +1 -0
- package/dist/interface/assets/SettingsRecordings-BrnU9hrb.js +1 -0
- package/dist/interface/assets/SettingsRemote-CwJw_9HX.js +1 -0
- package/dist/interface/assets/SettingsSystem-B3nne5fS.js +2 -0
- package/dist/interface/assets/SettingsUsers-CoYyAxxn.js +1 -0
- package/dist/interface/assets/Terminal-DMAHgufw.js +4 -0
- package/dist/interface/assets/VariableInput-BzWLKBgd.js +1 -0
- package/dist/interface/assets/VariableSuggestions-BdxcP_dn.js +1 -0
- package/dist/interface/assets/VersionsHandler-Dvy5Lv-E.js +7 -0
- package/dist/interface/assets/VirtualSensorCreate-BXz0lWNm.js +1 -0
- package/dist/interface/assets/Workers-DqeKkdpa.js +2 -0
- package/dist/interface/assets/{account-sFoKqEOV.js → account-C5mHt2Ep.js} +1 -1
- package/dist/interface/assets/ace-BqKKexH4.js +1 -0
- package/dist/interface/assets/{ace.config-C_wgqTLD.js → ace.config-BNjBs7Fe.js} +1 -1
- package/dist/interface/assets/alarm-light-outline-jCTfmz5t.js +1 -0
- package/dist/interface/assets/{alert-circle-BQZQ417w.js → alert-circle-Cu_kjPlA.js} +1 -1
- package/dist/interface/assets/alert-outline-DXHNnhoP.js +1 -0
- package/dist/interface/assets/api-3va2gyB0.css +2 -0
- package/dist/interface/assets/{api-DEaXK1Kq.js → api-DmxTF6VE.js} +1 -1
- package/dist/interface/assets/api-milc5VEE.js +2 -0
- package/dist/interface/assets/arrow-left-DPtWmM6S.js +1 -0
- package/dist/interface/assets/arrow-right-outline-BY1ggGA1.js +1 -0
- package/dist/interface/assets/{auth-XA5zkqwW.js → auth-DwSrX8QL.js} +1 -1
- package/dist/interface/assets/automationBlueprint-D0F9AHk9.js +1 -0
- package/dist/interface/assets/automations-yVPQAmFo.js +1 -0
- package/dist/interface/assets/{back-filled-BdHG6uUx.js → back-filled-r7bN5ObT.js} +1 -1
- package/dist/interface/assets/{bell-ring-Dua4zXf_.js → bell-ring-C470qCAb.js} +1 -1
- package/dist/interface/assets/{cameras.schema-1a2URPGd.js → cameras.schema-JAiaenSf.js} +1 -1
- package/dist/interface/assets/{cctv-DEiPL3U8.js → cctv-BKVOVZCR.js} +1 -1
- package/dist/interface/assets/check-circle-Ce_sbfPZ.js +1 -0
- package/dist/interface/assets/chevron-down-CjSTp091.js +1 -0
- package/dist/interface/assets/chevron-right-B4vB0gm4.js +1 -0
- package/dist/interface/assets/{clock-outline-C_f3Ed8x.js → clock-outline-BgcDXoyp.js} +1 -1
- package/dist/interface/assets/{close-DNgGJYHi.js → close-CQoGQHOF.js} +1 -1
- package/dist/interface/assets/{close-circle-L5juejMg.js → close-circle-DYhkXsRj.js} +1 -1
- package/dist/interface/assets/{cloud-check-DD7oRzmo.js → cloud-check-CVx221dJ.js} +1 -1
- package/dist/interface/assets/cloudHandoff-QtPEpiS4.js +1 -0
- package/dist/interface/assets/{config-C2hgXHyj.js → config-BE0DnCXx.js} +1 -1
- package/dist/interface/assets/copy-yhHCVVOa.js +1 -0
- package/dist/interface/assets/cube-scan-Ccxismvr.js +1 -0
- package/dist/interface/assets/delete-xWUQUP2x.js +1 -0
- package/dist/interface/assets/dist-DVb-CALh.js +1 -0
- package/dist/interface/assets/download-PLxvyB7s.js +1 -0
- package/dist/interface/assets/esm-B4MXP42m.js +1 -0
- package/dist/interface/assets/esm-BW9m3dy4.js +1 -0
- package/dist/interface/assets/esm-BZ3gh7Fj.js +1 -0
- package/dist/interface/assets/esm-Blvz9SsB.js +1 -0
- package/dist/interface/assets/esm-CJXU9jaA.js +1 -0
- package/dist/interface/assets/esm-Cqqu_mer.js +1 -0
- package/dist/interface/assets/esm-CtKbLoV_.js +1 -0
- package/dist/interface/assets/esm-CwzNi2iW.js +1 -0
- package/dist/interface/assets/esm-KnO8wJyB.js +1 -0
- package/dist/interface/assets/esm-Lt6R0RFn.js +1 -0
- package/dist/interface/assets/esm-MvRctfDP.js +1 -0
- package/dist/interface/assets/esm-W4LX4Rpq.js +1 -0
- package/dist/interface/assets/esm-l57LNUWu.js +1 -0
- package/dist/interface/assets/esm-xofhyA8r.js +1 -0
- package/dist/interface/assets/eye-off-C8kzsdYU.js +1 -0
- package/dist/interface/assets/flowSchema-BQp77LdP.js +1 -0
- package/dist/interface/assets/{history-iAZcYg3f.js → history-QBEPNc4X.js} +1 -1
- package/dist/interface/assets/home-af3W_y8U.js +1 -0
- package/dist/interface/assets/{information-outline-CVsB1bl-.js → information-outline-BPCsozSU.js} +1 -1
- package/dist/interface/assets/{lightbulb-outline-nNLyXAIp.js → lightbulb-outline-ccTlGyvW.js} +1 -1
- package/dist/interface/assets/main-CqhwDjRG.js +3 -0
- package/dist/interface/assets/main-aZt-Pooz.css +1 -0
- package/dist/interface/assets/{microphone-CU0mFDMh.js → microphone-5exHwwyq.js} +1 -1
- package/dist/interface/assets/mqtt-D_shY0Ks.js +1 -0
- package/dist/interface/assets/native-Cpj7zrLp.js +1 -0
- package/dist/interface/assets/native-D--k2WN1.js +1 -0
- package/dist/interface/assets/nodeDefinitions-CRrkU6zR.js +1 -0
- package/dist/interface/assets/{notifications-BHQN6WD4.js → notifications-BuSNpaOJ.js} +1 -1
- package/dist/interface/assets/{pencil-outline-BQxLTlZx.js → pencil-outline-M9I4mCJO.js} +1 -1
- package/dist/interface/assets/plugin-D3FpjfF8.js +1 -0
- package/dist/interface/assets/{plugins-C0RtyBHQ.js → plugins-7pWXkYgo.js} +1 -1
- package/dist/interface/assets/plus-CGIx-WV8.js +1 -0
- package/dist/interface/assets/{plus-Ct6WQfM1.js → plus-CrfQUUEC.js} +1 -1
- package/dist/interface/assets/power-VnZM2-0c.js +1 -0
- package/dist/interface/assets/{ring-resize-CZBThoQC.js → ring-resize-CodGa6wQ.js} +1 -1
- package/dist/interface/assets/rolldown-runtime-C0FnF6B9.js +1 -0
- package/dist/interface/assets/{round-alt-arrow-left-bold-BlpNMBxm.js → round-alt-arrow-left-bold-DTrlW4yx.js} +1 -1
- package/dist/interface/assets/round-restart-alt-DKWwojYm.js +1 -0
- package/dist/interface/assets/{search-M4Rt52Co.js → search-miJXZGQz.js} +1 -1
- package/dist/interface/assets/sensors-CLQG1mQt.js +1 -0
- package/dist/interface/assets/{server-CVSOthzT.js → server-Bv5NVJ0G.js} +1 -1
- package/dist/interface/assets/{settings-CgToKrFd.js → settings-DY0TJSAM.js} +1 -1
- package/dist/interface/assets/{source-branch-CoHKTGxb.js → source-branch-nw9fwXin.js} +1 -1
- package/dist/interface/assets/{theme-BZi7VV10.js → theme-DsxRUmCC.js} +1 -1
- package/dist/interface/assets/{trash-2-BKWfq15D.js → trash-2-B-di2M48.js} +1 -1
- package/dist/interface/assets/trash-can-outline-BbZkHoW7.js +1 -0
- package/dist/interface/assets/{trash-fill-yNQsFs0Y.js → trash-fill-Bgen5QTD.js} +1 -1
- package/dist/interface/assets/{trash2-DjTG9rG-.js → trash2-BP__fHgN.js} +1 -1
- package/dist/interface/assets/{types-Bw8H-UB4.js → types-BazOcNe_.js} +1 -1
- package/dist/interface/assets/types-CoXm85So.js +1 -0
- package/dist/interface/assets/upload-CNYrnwuV.js +1 -0
- package/dist/interface/assets/{useAppVersion-CDTrwxkp.js → useAppVersion-oPpW7jcN.js} +1 -1
- package/dist/interface/assets/useBackupRestore-b0Niqql7.js +1 -0
- package/dist/interface/assets/useCameraOptions-uf9Kog6z.js +1 -0
- package/dist/interface/assets/{useCardSelection-CgZ7QTaA.js → useCardSelection-B3B2qPHO.js} +1 -1
- package/dist/interface/assets/{useElectron-CgLWOhcS.js → useElectron-Dg8tFzam.js} +1 -1
- package/dist/interface/assets/useLogsSocket-9jJ-oJIm.js +5 -0
- package/dist/interface/assets/{usePermissions-tzi2t12h.js → usePermissions-xL0VlbyD.js} +1 -1
- package/dist/interface/assets/useServerRestart-3AZOTz7i.js +1 -0
- package/dist/interface/assets/{useStreamStatus-BV_L7pxB.js → useStreamStatus-Dg-Djura.js} +1 -1
- package/dist/interface/assets/useUserOptions-BQnM3gdi.js +1 -0
- package/dist/interface/assets/{variable-Y3IAPnsB.js → variable-CbNySf4s.js} +1 -1
- package/dist/interface/assets/vendor-CSg6_Jfu.js +22 -0
- package/dist/interface/assets/vendor-ace-DIEVbs6L.js +1085 -0
- package/dist/interface/assets/vendor-cameraui-BqkrW4Bb.js +2040 -0
- package/dist/interface/assets/vendor-capacitor-C-8IYzpJ.js +2 -0
- package/dist/interface/assets/vendor-chart-CoQ9HTE3.js +3 -0
- package/dist/interface/assets/vendor-core-BQegq2Q6.js +1 -0
- package/dist/interface/assets/{vendor-dnd-hwiZJHjo.js → vendor-dnd-DQF7Aoap.js} +2 -2
- package/dist/interface/assets/vendor-draggabilly-Cghb3aIb.js +1 -0
- package/dist/interface/assets/vendor-gridstack-qw2ro2uB.js +3 -0
- package/dist/interface/assets/{vendor-leaflet-BMMJO5Nd.js → vendor-leaflet-Bcgd-fkG.js} +1 -1
- package/dist/interface/assets/vendor-markdown-DWwrEE67.js +14 -0
- package/dist/interface/assets/{vendor-primevue-C6wcTjtT.js → vendor-primevue-DYzLjOFZ.js} +85 -85
- package/dist/interface/assets/vendor-vueflow-crUU2mAI.js +26 -0
- package/dist/interface/assets/vendor-xterm-BafMBqaV.js +91 -0
- package/dist/interface/assets/vendor-zod-Dbq0fBXY.js +127 -0
- package/dist/interface/assets/web-BX3axHeB.js +1 -0
- package/dist/interface/assets/web-BcHmbPny.js +1 -0
- package/dist/interface/assets/web-BjKL51lK-BQjyRtns.js +1 -0
- package/dist/interface/assets/web-C8w-z-xR.js +1 -0
- package/dist/interface/assets/web-CHdniv8I.js +1 -0
- package/dist/interface/assets/web-CWBhY0Av.js +1 -0
- package/dist/interface/assets/web-Cf1yYy4u.js +1 -0
- package/dist/interface/assets/web-Ct6Vkr6F.js +1 -0
- package/dist/interface/assets/web-DARDw7d8.js +1 -0
- package/dist/interface/assets/web-DKBMdBSA.js +1 -0
- package/dist/interface/assets/web-Ddzvp-fv.js +1 -0
- package/dist/interface/assets/web-Dymr_MpD.js +1 -0
- package/dist/interface/assets/web-XIuTPdFc.js +1 -0
- package/dist/interface/assets/web-lrnXIJTz.js +1 -0
- package/dist/interface/assets/{webhook-yCryYojY.js → webhook-B7YgiSrF.js} +1 -1
- package/dist/interface/assets/workbox-window.prod.es5-BkFwsIPp.js +1 -0
- package/dist/interface/assets/{zoom-in-Da5uRiQq.js → zoom-in-D7BJNotF.js} +1 -1
- package/dist/interface/index.html +44 -40
- package/dist/interface/sw.js +1 -1
- package/dist/server/package.json +11 -11
- package/dist/server/requirements.txt +4 -6
- package/dist/server/src/_camera_ui_tools/camera_ui_rpc/client.py +3 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_rpc/types.py +4 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/__init__.py +9 -14
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/__init__.py +0 -4
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/config.py +5 -12
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/detection.py +6 -23
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/device.py +60 -100
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/events.py +3 -2
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/frames.py +2 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/__init__.py +2 -20
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/camera_config_internal.py +1 -1
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/camera_enums.py +3 -3
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/event_emitter.py +13 -26
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/manager_rpc.py +2 -5
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/sensor_rpc.py +21 -6
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/shared_utils.py +7 -18
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/manager/__init__.py +91 -29
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/observable/__init__.py +145 -37
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/__init__.py +10 -1
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/api.py +21 -68
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/contract.py +31 -58
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/helper.py +3 -12
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/interfaces.py +137 -99
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/notifier.py +34 -52
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/oauth.py +4 -4
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/__init__.py +3 -4
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/audio.py +45 -39
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/base.py +329 -256
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/battery.py +17 -16
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/classifier.py +31 -27
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/clip.py +14 -12
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/contact.py +11 -10
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/detection.py +34 -22
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/doorbell.py +19 -19
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/face.py +34 -28
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/garage.py +29 -20
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/humidity.py +22 -12
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/leak.py +12 -11
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/license_plate.py +35 -31
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/light.py +22 -18
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/lock.py +26 -19
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/motion.py +28 -27
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/object.py +37 -33
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/occupancy.py +11 -10
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/ptz.py +20 -24
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/security_system.py +22 -22
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/siren.py +17 -16
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/smoke.py +11 -10
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/spec.py +26 -22
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/switch.py +13 -12
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/temperature.py +22 -12
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/storage/__init__.py +56 -38
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/types.py +15 -18
- package/dist/server/src/api/controllers/auth.controller.js +2 -1
- package/dist/server/src/api/controllers/auth.controller.js.map +1 -1
- package/dist/server/src/api/controllers/cameras.controller.d.ts +6 -0
- package/dist/server/src/api/controllers/cameras.controller.js +21 -11
- package/dist/server/src/api/controllers/cameras.controller.js.map +1 -1
- package/dist/server/src/api/controllers/cast.controller.d.ts +11 -0
- package/dist/server/src/api/controllers/cast.controller.js +29 -0
- package/dist/server/src/api/controllers/cast.controller.js.map +1 -0
- package/dist/server/src/api/controllers/notifications.controller.d.ts +12 -0
- package/dist/server/src/api/controllers/notifications.controller.js +41 -0
- package/dist/server/src/api/controllers/notifications.controller.js.map +1 -1
- package/dist/server/src/api/controllers/nvr.controller.d.ts +14 -0
- package/dist/server/src/api/controllers/nvr.controller.js +61 -0
- package/dist/server/src/api/controllers/nvr.controller.js.map +1 -0
- package/dist/server/src/api/controllers/sensors.controller.d.ts +13 -0
- package/dist/server/src/api/controllers/sensors.controller.js +94 -0
- package/dist/server/src/api/controllers/sensors.controller.js.map +1 -0
- package/dist/server/src/api/controllers/server.controller.d.ts +1 -0
- package/dist/server/src/api/controllers/server.controller.js +11 -0
- package/dist/server/src/api/controllers/server.controller.js.map +1 -1
- package/dist/server/src/api/controllers/tunnel.controller.d.ts +0 -3
- package/dist/server/src/api/controllers/tunnel.controller.js +1 -21
- package/dist/server/src/api/controllers/tunnel.controller.js.map +1 -1
- package/dist/server/src/api/database/constants.d.ts +2 -0
- package/dist/server/src/api/database/constants.js +2 -0
- package/dist/server/src/api/database/constants.js.map +1 -1
- package/dist/server/src/api/database/index.d.ts +5 -2
- package/dist/server/src/api/database/index.js +7 -4
- package/dist/server/src/api/database/index.js.map +1 -1
- package/dist/server/src/api/database/migrations/v2-1-0.d.ts +3 -0
- package/dist/server/src/api/database/migrations/v2-1-0.js +72 -0
- package/dist/server/src/api/database/migrations/v2-1-0.js.map +1 -0
- package/dist/server/src/api/database/record-schemas.d.ts +2 -3
- package/dist/server/src/api/database/record-schemas.js +3 -3
- package/dist/server/src/api/database/record-schemas.js.map +1 -1
- package/dist/server/src/api/database/types.d.ts +27 -3
- package/dist/server/src/api/index.js +3 -0
- package/dist/server/src/api/index.js.map +1 -1
- package/dist/server/src/api/plugins/natsSubFirewall.d.ts +1 -1
- package/dist/server/src/api/plugins/natsSubFirewall.js +5 -2
- package/dist/server/src/api/plugins/natsSubFirewall.js.map +1 -1
- package/dist/server/src/api/plugins/proxy.plugin.js +5 -3
- package/dist/server/src/api/plugins/proxy.plugin.js.map +1 -1
- package/dist/server/src/api/routes/cameras.routes.js +14 -7
- package/dist/server/src/api/routes/cameras.routes.js.map +1 -1
- package/dist/server/src/api/routes/cast.routes.d.ts +2 -0
- package/dist/server/src/api/routes/cast.routes.js +29 -0
- package/dist/server/src/api/routes/cast.routes.js.map +1 -0
- package/dist/server/src/api/routes/index.js +6 -2
- package/dist/server/src/api/routes/index.js.map +1 -1
- package/dist/server/src/api/routes/notifications.routes.js +32 -0
- package/dist/server/src/api/routes/notifications.routes.js.map +1 -1
- package/dist/server/src/api/routes/nvr.routes.d.ts +2 -0
- package/dist/server/src/api/routes/nvr.routes.js +19 -0
- package/dist/server/src/api/routes/nvr.routes.js.map +1 -0
- package/dist/server/src/api/routes/sensors.routes.d.ts +2 -0
- package/dist/server/src/api/routes/sensors.routes.js +89 -0
- package/dist/server/src/api/routes/sensors.routes.js.map +1 -0
- package/dist/server/src/api/routes/server.routes.js +10 -0
- package/dist/server/src/api/routes/server.routes.js.map +1 -1
- package/dist/server/src/api/schemas/cameras.schema.d.ts +103 -45
- package/dist/server/src/api/schemas/cameras.schema.js +7 -10
- package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
- package/dist/server/src/api/schemas/cast.schema.d.ts +7 -0
- package/dist/server/src/api/schemas/cast.schema.js +7 -0
- package/dist/server/src/api/schemas/cast.schema.js.map +1 -0
- package/dist/server/src/api/schemas/nvr.schema.d.ts +10 -0
- package/dist/server/src/api/schemas/nvr.schema.js +13 -0
- package/dist/server/src/api/schemas/nvr.schema.js.map +1 -0
- package/dist/server/src/api/schemas/{virtualsensors.schema.d.ts → sensors.schema.d.ts} +15 -8
- package/dist/server/src/api/schemas/sensors.schema.js +25 -0
- package/dist/server/src/api/schemas/sensors.schema.js.map +1 -0
- package/dist/server/src/api/schemas/users.schema.d.ts +7 -18
- package/dist/server/src/api/schemas/users.schema.js +3 -7
- package/dist/server/src/api/schemas/users.schema.js.map +1 -1
- package/dist/server/src/api/services/cameras.service.js +1 -1
- package/dist/server/src/api/services/cameras.service.js.map +1 -1
- package/dist/server/src/api/services/cast.service.d.ts +7 -0
- package/dist/server/src/api/services/cast.service.js +14 -0
- package/dist/server/src/api/services/cast.service.js.map +1 -0
- package/dist/server/src/api/services/instances.service.js +1 -1
- package/dist/server/src/api/services/notifications.service.d.ts +3 -0
- package/dist/server/src/api/services/notifications.service.js +9 -0
- package/dist/server/src/api/services/notifications.service.js.map +1 -1
- package/dist/server/src/api/services/plugins.service.js +18 -3
- package/dist/server/src/api/services/plugins.service.js.map +1 -1
- package/dist/server/src/api/services/sensors.service.d.ts +41 -0
- package/dist/server/src/api/services/sensors.service.js +106 -0
- package/dist/server/src/api/services/sensors.service.js.map +1 -0
- package/dist/server/src/api/services/server.service.d.ts +4 -0
- package/dist/server/src/api/services/server.service.js +14 -0
- package/dist/server/src/api/services/server.service.js.map +1 -1
- package/dist/server/src/api/services/users.service.js +6 -9
- package/dist/server/src/api/services/users.service.js.map +1 -1
- package/dist/server/src/api/types/index.d.ts +19 -6
- package/dist/server/src/api/websocket/nsp/events.js +38 -15
- package/dist/server/src/api/websocket/nsp/events.js.map +1 -1
- package/dist/server/src/api.d.ts +0 -2
- package/dist/server/src/api.js +0 -12
- package/dist/server/src/api.js.map +1 -1
- package/dist/server/src/automations/actions/sensor.js +4 -7
- package/dist/server/src/automations/actions/sensor.js.map +1 -1
- package/dist/server/src/automations/conditions/sensorState.js +4 -4
- package/dist/server/src/automations/conditions/sensorState.js.map +1 -1
- package/dist/server/src/automations/context.d.ts +2 -1
- package/dist/server/src/automations/context.js +2 -1
- package/dist/server/src/automations/context.js.map +1 -1
- package/dist/server/src/automations/pluginMethodRegistry.d.ts +2 -0
- package/dist/server/src/automations/pluginMethodRegistry.js +14 -0
- package/dist/server/src/automations/pluginMethodRegistry.js.map +1 -1
- package/dist/server/src/automations/triggers/sensor.js +12 -23
- package/dist/server/src/automations/triggers/sensor.js.map +1 -1
- package/dist/server/src/camera/controller.d.ts +0 -1
- package/dist/server/src/camera/controller.js +9 -46
- package/dist/server/src/camera/controller.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-coordinator.js +13 -11
- package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
- package/dist/server/src/camera/decoder/plugin-registry.d.ts +1 -0
- package/dist/server/src/camera/decoder/plugin-registry.js +13 -1
- package/dist/server/src/camera/decoder/plugin-registry.js.map +1 -1
- package/dist/server/src/camera/decoder/ptz/autotracker.js +2 -2
- package/dist/server/src/camera/decoder/ptz/autotracker.js.map +1 -1
- package/dist/server/src/camera/decoder/secondary-stage.js +6 -6
- package/dist/server/src/camera/decoder/secondary-stage.js.map +1 -1
- package/dist/server/src/camera/decoder/types.d.ts +7 -1
- package/dist/server/src/camera/decoder/types.js +4 -0
- package/dist/server/src/camera/decoder/types.js.map +1 -1
- package/dist/server/src/camera/decoder/worker.d.ts +2 -0
- package/dist/server/src/camera/decoder/worker.js +14 -3
- package/dist/server/src/camera/decoder/worker.js.map +1 -1
- package/dist/server/src/camera/index.d.ts +2 -14
- package/dist/server/src/camera/index.js +1 -32
- package/dist/server/src/camera/index.js.map +1 -1
- package/dist/server/src/camera/sensors/controller.d.ts +17 -77
- package/dist/server/src/camera/sensors/controller.js +60 -445
- package/dist/server/src/camera/sensors/controller.js.map +1 -1
- package/dist/server/src/internal-bus.d.ts +7 -13
- package/dist/server/src/internal-bus.js.map +1 -1
- package/dist/server/src/main.d.ts +1 -0
- package/dist/server/src/main.js +7 -0
- package/dist/server/src/main.js.map +1 -1
- package/dist/server/src/manager/castManager.d.ts +24 -0
- package/dist/server/src/manager/castManager.js +79 -0
- package/dist/server/src/manager/castManager.js.map +1 -0
- package/dist/server/src/manager/downloadManager.d.ts +1 -0
- package/dist/server/src/manager/downloadManager.js +6 -0
- package/dist/server/src/manager/downloadManager.js.map +1 -1
- package/dist/server/src/manager/notificationManager.d.ts +6 -0
- package/dist/server/src/manager/notificationManager.js +70 -3
- package/dist/server/src/manager/notificationManager.js.map +1 -1
- package/dist/server/src/mqtt/bridge.d.ts +7 -0
- package/dist/server/src/mqtt/bridge.js +92 -32
- package/dist/server/src/mqtt/bridge.js.map +1 -1
- package/dist/server/src/mqtt/ha-discovery.d.ts +1 -1
- package/dist/server/src/mqtt/ha-discovery.js +53 -8
- package/dist/server/src/mqtt/ha-discovery.js.map +1 -1
- package/dist/server/src/mqtt/manager.js +1 -1
- package/dist/server/src/mqtt/manager.js.map +1 -1
- package/dist/server/src/mqtt/topics.d.ts +3 -3
- package/dist/server/src/mqtt/topics.js +11 -10
- package/dist/server/src/mqtt/topics.js.map +1 -1
- package/dist/server/src/plugins/config-store.js +1 -1
- package/dist/server/src/plugins/config-store.js.map +1 -1
- package/dist/server/src/plugins/runtime/base.d.ts +1 -0
- package/dist/server/src/plugins/runtime/base.js +29 -6
- package/dist/server/src/plugins/runtime/base.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/child.js +5 -2
- package/dist/server/src/plugins/runtime/node/child.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/pluginApi.d.ts +2 -0
- package/dist/server/src/plugins/runtime/node/pluginApi.js +4 -1
- package/dist/server/src/plugins/runtime/node/pluginApi.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.d.ts +5 -13
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js +97 -179
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/deviceManager.d.ts +2 -1
- package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js +19 -2
- package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/reconnect.d.ts +2 -0
- package/dist/server/src/plugins/runtime/node/proxy/reconnect.js +27 -0
- package/dist/server/src/plugins/runtime/node/proxy/reconnect.js.map +1 -0
- package/dist/server/src/plugins/runtime/node/proxy/sensor.d.ts +17 -3
- package/dist/server/src/plugins/runtime/node/proxy/sensor.js +61 -20
- package/dist/server/src/plugins/runtime/node/proxy/sensor.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/sensorManager.d.ts +18 -0
- package/dist/server/src/plugins/runtime/node/proxy/sensorManager.js +269 -0
- package/dist/server/src/plugins/runtime/node/proxy/sensorManager.js.map +1 -0
- package/dist/server/src/plugins/runtime/node/storage.d.ts +1 -1
- package/dist/server/src/plugins/runtime/node/storage.js +2 -2
- package/dist/server/src/plugins/runtime/node/storage.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/storageController.d.ts +5 -5
- package/dist/server/src/plugins/runtime/node/storageController.js +20 -28
- package/dist/server/src/plugins/runtime/node/storageController.js.map +1 -1
- package/dist/server/src/plugins/runtime/python/child.py +13 -7
- package/dist/server/src/plugins/runtime/python/namespaces.py +13 -19
- package/dist/server/src/plugins/runtime/python/plugin_api.py +10 -1
- package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +130 -280
- package/dist/server/src/plugins/runtime/python/proxy/device_manager.py +18 -0
- package/dist/server/src/plugins/runtime/python/proxy/sensor.py +88 -21
- package/dist/server/src/plugins/runtime/python/proxy/sensor_manager.py +386 -0
- package/dist/server/src/plugins/runtime/python/storage.py +1 -3
- package/dist/server/src/plugins/runtime/python/storage_controller.py +19 -50
- package/dist/server/src/plugins/runtime/python/store.py +19 -95
- package/dist/server/src/plugins/runtime/python/typings.py +32 -9
- package/dist/server/src/plugins/store/layout.d.ts +1 -2
- package/dist/server/src/plugins/store/layout.js +9 -56
- package/dist/server/src/plugins/store/layout.js.map +1 -1
- package/dist/server/src/plugins/store/location.d.ts +2 -3
- package/dist/server/src/plugins/store/location.js +5 -13
- package/dist/server/src/plugins/store/location.js.map +1 -1
- package/dist/server/src/plugins/store/pluginStoreFile.d.ts +1 -2
- package/dist/server/src/plugins/store/pluginStoreFile.js +8 -15
- package/dist/server/src/plugins/store/pluginStoreFile.js.map +1 -1
- package/dist/server/src/plugins/worker.d.ts +2 -0
- package/dist/server/src/plugins/worker.js +26 -7
- package/dist/server/src/plugins/worker.js.map +1 -1
- package/dist/server/src/rpc/index.d.ts +2 -0
- package/dist/server/src/rpc/index.js +5 -0
- package/dist/server/src/rpc/index.js.map +1 -1
- package/dist/server/src/rpc/interfaces/sensor.d.ts +33 -16
- package/dist/server/src/rpc/namespaces.d.ts +17 -8
- package/dist/server/src/rpc/namespaces.js +20 -12
- package/dist/server/src/rpc/namespaces.js.map +1 -1
- package/dist/server/src/rpc/server.js +1 -0
- package/dist/server/src/rpc/server.js.map +1 -1
- package/dist/server/src/sensors/registry.d.ts +96 -0
- package/dist/server/src/sensors/registry.js +808 -0
- package/dist/server/src/sensors/registry.js.map +1 -0
- package/dist/server/src/{camera/sensors → sensors}/semantics.d.ts +1 -1
- package/dist/server/src/{camera/sensors → sensors}/semantics.js +4 -1
- package/dist/server/src/sensors/semantics.js.map +1 -0
- package/dist/server/src/sensors/sensor.d.ts +58 -0
- package/dist/server/src/{camera/sensors → sensors}/sensor.js +43 -32
- package/dist/server/src/sensors/sensor.js.map +1 -0
- package/dist/server/src/{camera/sensors → sensors}/types.d.ts +2 -0
- package/dist/server/src/{camera/sensors → sensors}/types.js +9 -0
- package/dist/server/src/sensors/types.js.map +1 -0
- package/dist/server/src/{camera/sensors → sensors}/virtual.d.ts +4 -6
- package/dist/server/src/{camera/sensors → sensors}/virtual.js +10 -56
- package/dist/server/src/sensors/virtual.js.map +1 -0
- package/dist/server/src/services/mdns/index.js +4 -0
- package/dist/server/src/services/mdns/index.js.map +1 -1
- package/package.json +11 -11
- package/dist/interface/assets/404-0d936klL.js +0 -1
- package/dist/interface/assets/About-BMwYrGrl.js +0 -1
- package/dist/interface/assets/Adminpanel-DBsOmAuo.js +0 -1
- package/dist/interface/assets/Automation-BLndVfqR.js +0 -3
- package/dist/interface/assets/AutomationImport-Ba33juY0.js +0 -2
- package/dist/interface/assets/AutomationStore-Bjf1x7go.js +0 -2
- package/dist/interface/assets/AutomationStoreDetail-Ko3n3U1U.js +0 -2
- package/dist/interface/assets/Automations-BfC8bvkT.js +0 -2
- package/dist/interface/assets/Camera-BYDPeH6d.js +0 -2
- package/dist/interface/assets/CameraConsole-pVCj1xXI.js +0 -7
- package/dist/interface/assets/Cameras-DdokAe_Q.js +0 -652
- package/dist/interface/assets/Camview-DmuGSzal.js +0 -1
- package/dist/interface/assets/Config-DvVqB0_Y.js +0 -2
- package/dist/interface/assets/ConfigActionDelay-B1JjI6bg.js +0 -1
- package/dist/interface/assets/ConfigActionHttp-BzGIbeVo.js +0 -1
- package/dist/interface/assets/ConfigActionImageInput-C6m2-s8z.js +0 -1
- package/dist/interface/assets/ConfigActionMqtt-ByZNQKsg.js +0 -1
- package/dist/interface/assets/ConfigActionNotification-YmdMddoN.js +0 -1
- package/dist/interface/assets/ConfigActionNotificationControl-2hWDRBpq.js +0 -1
- package/dist/interface/assets/ConfigActionOutput-D9k1-jfI.js +0 -1
- package/dist/interface/assets/ConfigActionPlugin-DjD_94EX.js +0 -1
- package/dist/interface/assets/ConfigActionSensor-fak8jYSC.js +0 -1
- package/dist/interface/assets/ConfigActionSnapshot-mwEHXqyk.js +0 -1
- package/dist/interface/assets/ConfigActionVariable-kBxNfyOV.js +0 -1
- package/dist/interface/assets/ConfigConditionIfElse-CkjmImTD.js +0 -1
- package/dist/interface/assets/ConfigConditionSensorState-FE3mFjRe.js +0 -1
- package/dist/interface/assets/ConfigConditionSwitch-msqWizIt.js +0 -1
- package/dist/interface/assets/ConfigConditionTime-ifPV135b.js +0 -1
- package/dist/interface/assets/ConfigSensorValueInput-Bg3SEbSh.js +0 -1
- package/dist/interface/assets/ConfigTriggerGeofence-CemaUwl5.js +0 -1
- package/dist/interface/assets/ConfigTriggerManual-DWuiq7PC.js +0 -1
- package/dist/interface/assets/ConfigTriggerMqtt-DxAoDh2Z.js +0 -1
- package/dist/interface/assets/ConfigTriggerSchedule-DDqgMGvp.js +0 -1
- package/dist/interface/assets/ConfigTriggerSensor-M6bXqz4k.js +0 -1
- package/dist/interface/assets/ConfigTriggerWebhook-CxOXgcJi.js +0 -1
- package/dist/interface/assets/Console-CMuW2_8s.js +0 -1
- package/dist/interface/assets/CuiAutomationRunsDialog-yh1qHzmS.js +0 -1
- package/dist/interface/assets/CuiBottomSheet-BshiVWqw.js +0 -1
- package/dist/interface/assets/CuiBottomSheet-DSNyVg5P.js +0 -1
- package/dist/interface/assets/CuiCameraPipCard-Cmk0jl6M.js +0 -1
- package/dist/interface/assets/CuiCameraRecordings-KU1wIai4.js +0 -1
- package/dist/interface/assets/CuiCameraShares-BoR3YQWj.js +0 -1
- package/dist/interface/assets/CuiCameraTable-BRPBqU8V.js +0 -2
- package/dist/interface/assets/CuiDataTable-BGY4VBtv.js +0 -1
- package/dist/interface/assets/CuiList-BSOMR296.js +0 -1
- package/dist/interface/assets/CuiMarkdownContent-DEMo42iT.js +0 -1
- package/dist/interface/assets/CuiMarkdownContent-Xn_VHwym.js +0 -1
- package/dist/interface/assets/CuiPluginCard-CgJb8B1W.js +0 -2
- package/dist/interface/assets/CuiPluginOAuthButton-XpEyqoRm.js +0 -2
- package/dist/interface/assets/CuiQRCode-QBkbmvRA.js +0 -1
- package/dist/interface/assets/CuiRecordingsGrid-CuEl_hhu.js +0 -1
- package/dist/interface/assets/CuiSchema-D_cg-H5i.js +0 -1
- package/dist/interface/assets/CuiTopNavbarItem-CXijnkK9.js +0 -1
- package/dist/interface/assets/Faces-C95mlWaW.js +0 -1
- package/dist/interface/assets/FirstSteps-Cpbg7fng.js +0 -1
- package/dist/interface/assets/Instances-BgJtM1Xl.js +0 -1
- package/dist/interface/assets/Logs-BWXYqm5T.js +0 -6
- package/dist/interface/assets/Menu-BO9Zjy1w.js +0 -1
- package/dist/interface/assets/OAuthDeviceFlow-NnwqdmBM.js +0 -1
- package/dist/interface/assets/Plugin-DQq3xjhe.js +0 -1
- package/dist/interface/assets/PluginConsole-BTsVAsKf.js +0 -7
- package/dist/interface/assets/PluginDetail-CTyzzZVU.js +0 -2
- package/dist/interface/assets/PluginSchema-Bn3pHjQA.js +0 -1
- package/dist/interface/assets/PluginSearch-DbXCyUF0.js +0 -1
- package/dist/interface/assets/PluginSearch-z0z8Z1gP.js +0 -2
- package/dist/interface/assets/Plugins-Cy7e-ty2.js +0 -1
- package/dist/interface/assets/Recordings-CWBpGEUf.js +0 -1
- package/dist/interface/assets/Settings-CUIORSmm.js +0 -1
- package/dist/interface/assets/SettingsAccount-CeJBKpzp.js +0 -1
- package/dist/interface/assets/SettingsAccount-CnwVrQx1.js +0 -1
- package/dist/interface/assets/SettingsAppearance-BraaC0WF.js +0 -1
- package/dist/interface/assets/SettingsAppearance-CZrOTBki.js +0 -1
- package/dist/interface/assets/SettingsBackup-y9mb8XZZ.js +0 -1
- package/dist/interface/assets/SettingsList-DsKncveQ.js +0 -1
- package/dist/interface/assets/SettingsMqtt-DTyyctmQ.js +0 -1
- package/dist/interface/assets/SettingsNotifications-SFMt4Yuj.js +0 -2
- package/dist/interface/assets/SettingsPermissions-CktJaQzL.js +0 -1
- package/dist/interface/assets/SettingsRecordings-Bqguyt6u.js +0 -1
- package/dist/interface/assets/SettingsRemote-CTv7bb4g.js +0 -1
- package/dist/interface/assets/SettingsSystem-CkCnB34r.js +0 -2
- package/dist/interface/assets/SettingsUsers-D8LAGd6F.js +0 -1
- package/dist/interface/assets/Terminal-DaR9Ur0_.js +0 -4
- package/dist/interface/assets/VariableInput-D0TP_Lmo.js +0 -1
- package/dist/interface/assets/VariableSuggestions--vq7928F.js +0 -1
- package/dist/interface/assets/VersionsHandler-D9GDdcXr.js +0 -7
- package/dist/interface/assets/Workers-CUyRzwJG.js +0 -2
- package/dist/interface/assets/ace-DYqf8ZN7.js +0 -1
- package/dist/interface/assets/alert-outline-BUvdNY2J.js +0 -1
- package/dist/interface/assets/api-DxrxNyIH.js +0 -2
- package/dist/interface/assets/api-VZ_wVUpU.css +0 -2
- package/dist/interface/assets/arrow-left-LdfKbcre.js +0 -1
- package/dist/interface/assets/arrow-right-outline-BbTEhBJq.js +0 -1
- package/dist/interface/assets/automationBlueprint-DMjszOs4.js +0 -1
- package/dist/interface/assets/automations-51-JMUWD.js +0 -1
- package/dist/interface/assets/check-circle-D-utE_P9.js +0 -1
- package/dist/interface/assets/chevron-down-OEjMpuec.js +0 -1
- package/dist/interface/assets/chevron-right-B3nxd9UE.js +0 -1
- package/dist/interface/assets/cloudHandoff-BktPB9rt.js +0 -1
- package/dist/interface/assets/copy-BvSzmsFs.js +0 -1
- package/dist/interface/assets/delete-B9BZTgya.js +0 -1
- package/dist/interface/assets/dist-qdWlJrr0.js +0 -1
- package/dist/interface/assets/download-Dp_ssGIE.js +0 -1
- package/dist/interface/assets/esm-9VMgxuPI.js +0 -1
- package/dist/interface/assets/esm-B69zS8aI.js +0 -1
- package/dist/interface/assets/esm-BF94InGP.js +0 -1
- package/dist/interface/assets/esm-BHdK6hkk.js +0 -1
- package/dist/interface/assets/esm-BYm8JT8N.js +0 -1
- package/dist/interface/assets/esm-BwCmHX2G.js +0 -1
- package/dist/interface/assets/esm-CL6t-XYT.js +0 -1
- package/dist/interface/assets/esm-CXstRMXa.js +0 -1
- package/dist/interface/assets/esm-Ckb9rjlL.js +0 -1
- package/dist/interface/assets/esm-D4insKbc.js +0 -1
- package/dist/interface/assets/esm-DiReJ8YS.js +0 -1
- package/dist/interface/assets/esm-Dt_Neag0.js +0 -1
- package/dist/interface/assets/esm-GspmWlKf.js +0 -1
- package/dist/interface/assets/esm-eezqpB2a.js +0 -1
- package/dist/interface/assets/flowSchema-Ckr7CEbZ.js +0 -1
- package/dist/interface/assets/home-DL94781-.js +0 -1
- package/dist/interface/assets/main-BxM81wMi.css +0 -1
- package/dist/interface/assets/main-DOjghmGX.js +0 -3
- package/dist/interface/assets/mqtt-COazyb4A.js +0 -1
- package/dist/interface/assets/native-WiRjRKUS.js +0 -1
- package/dist/interface/assets/native-hhip9y-E.js +0 -1
- package/dist/interface/assets/nodeDefinitions-CPyyuw1P.js +0 -1
- package/dist/interface/assets/plugin-DIVM640y.js +0 -1
- package/dist/interface/assets/plus-CTzaBaTz.js +0 -1
- package/dist/interface/assets/power-CvKGepBP.js +0 -1
- package/dist/interface/assets/rolldown-runtime-DAXXjFlN.js +0 -1
- package/dist/interface/assets/round-restart-alt-D3iswthu.js +0 -1
- package/dist/interface/assets/trash-can-outline-HvqPHpF7.js +0 -1
- package/dist/interface/assets/types-CDJiWcQ7.js +0 -1
- package/dist/interface/assets/upload-B6yqOWqz.js +0 -1
- package/dist/interface/assets/useBackupRestore-QuXkc5ZG.js +0 -1
- package/dist/interface/assets/useCameraOptions-D5-bI-e6.js +0 -1
- package/dist/interface/assets/useLogsSocket-BlAo-xcw.js +0 -5
- package/dist/interface/assets/useServerRestart-DctcFWWh.js +0 -1
- package/dist/interface/assets/useUserOptions-nuBRgAEk.js +0 -1
- package/dist/interface/assets/vendor-ace-CrklN-bc.js +0 -1085
- package/dist/interface/assets/vendor-cameraui-B_OCKNGw.js +0 -2040
- package/dist/interface/assets/vendor-capacitor-D6T-f6Q_.js +0 -2
- package/dist/interface/assets/vendor-chart-DpsXMlB-.js +0 -3
- package/dist/interface/assets/vendor-core-zLmLhSHM.js +0 -1
- package/dist/interface/assets/vendor-draggabilly-OrLwQbim.js +0 -1
- package/dist/interface/assets/vendor-gridstack-C6VKsm_r.js +0 -3
- package/dist/interface/assets/vendor-markdown-_OBaDsnU.js +0 -15
- package/dist/interface/assets/vendor-nfBMzqgY.js +0 -22
- package/dist/interface/assets/vendor-vueflow-B1MUSE71.js +0 -26
- package/dist/interface/assets/vendor-xterm-IIYDrBG1.js +0 -142
- package/dist/interface/assets/vendor-zod-BaT-dXMv.js +0 -127
- package/dist/interface/assets/web-B-SlpbxK.js +0 -1
- package/dist/interface/assets/web-B6leYIzJ.js +0 -1
- package/dist/interface/assets/web-BLDe3Kn0.js +0 -1
- package/dist/interface/assets/web-BT-51W2W.js +0 -1
- package/dist/interface/assets/web-BjKL51lK-DHLvmMLr.js +0 -1
- package/dist/interface/assets/web-BpRU7MbT.js +0 -1
- package/dist/interface/assets/web-CiaJvmq8.js +0 -1
- package/dist/interface/assets/web-Cnkt61og.js +0 -1
- package/dist/interface/assets/web-CzhM-YH1.js +0 -1
- package/dist/interface/assets/web-Da5rcZ2Q.js +0 -1
- package/dist/interface/assets/web-DdZjFuTb.js +0 -1
- package/dist/interface/assets/web-DnHj9sl9.js +0 -1
- package/dist/interface/assets/web-E4Ew4Xhj.js +0 -1
- package/dist/interface/assets/web-q63OEDhG.js +0 -1
- package/dist/interface/assets/workbox-window.prod.es5-BMiTt6Ad.js +0 -1
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/internal/sensor_triggers.py +0 -4
- package/dist/server/src/api/controllers/virtualsensors.controller.d.ts +0 -11
- package/dist/server/src/api/controllers/virtualsensors.controller.js +0 -61
- package/dist/server/src/api/controllers/virtualsensors.controller.js.map +0 -1
- package/dist/server/src/api/routes/virtualsensors.routes.d.ts +0 -2
- package/dist/server/src/api/routes/virtualsensors.routes.js +0 -63
- package/dist/server/src/api/routes/virtualsensors.routes.js.map +0 -1
- package/dist/server/src/api/schemas/virtualsensors.schema.js +0 -14
- package/dist/server/src/api/schemas/virtualsensors.schema.js.map +0 -1
- package/dist/server/src/api/services/virtualsensors.service.d.ts +0 -20
- package/dist/server/src/api/services/virtualsensors.service.js +0 -151
- package/dist/server/src/api/services/virtualsensors.service.js.map +0 -1
- package/dist/server/src/camera/sensors/semantics.js.map +0 -1
- package/dist/server/src/camera/sensors/sensor.d.ts +0 -34
- package/dist/server/src/camera/sensors/sensor.js.map +0 -1
- package/dist/server/src/camera/sensors/stable-id.d.ts +0 -2
- package/dist/server/src/camera/sensors/stable-id.js +0 -17
- package/dist/server/src/camera/sensors/stable-id.js.map +0 -1
- package/dist/server/src/camera/sensors/types.js.map +0 -1
- package/dist/server/src/camera/sensors/virtual.js.map +0 -1
- package/dist/server/src/plugins/runtime/python/store_migrate.py +0 -59
- package/dist/server/src/plugins/store/migrate.d.ts +0 -1
- package/dist/server/src/plugins/store/migrate.js +0 -22
- package/dist/server/src/plugins/store/migrate.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
from collections.abc import Callable
|
|
4
5
|
from copy import deepcopy
|
|
5
6
|
from typing import TYPE_CHECKING, Any, Protocol, cast
|
|
6
7
|
|
|
@@ -31,14 +32,11 @@ from _camera_ui_tools.camera_ui_sdk import (
|
|
|
31
32
|
Disposable,
|
|
32
33
|
LoggerService,
|
|
33
34
|
Observable,
|
|
34
|
-
PluginContract,
|
|
35
35
|
ProbeConfig,
|
|
36
36
|
ProbeStream,
|
|
37
37
|
PtzAutotrackSettings,
|
|
38
38
|
RTSPUrlOptions,
|
|
39
39
|
Sensor,
|
|
40
|
-
SensorEventData,
|
|
41
|
-
SensorLike,
|
|
42
40
|
SensorType,
|
|
43
41
|
SnapshotSettings,
|
|
44
42
|
SnapshotUrlOptions,
|
|
@@ -51,7 +49,6 @@ from _camera_ui_tools.camera_ui_sdk import (
|
|
|
51
49
|
share,
|
|
52
50
|
)
|
|
53
51
|
from _camera_ui_tools.camera_ui_sdk import CameraDevice as CameraDeviceInterface
|
|
54
|
-
from _camera_ui_tools.camera_ui_sdk.internal import SensorJSON
|
|
55
52
|
from plugins.runtime.python.camera.utils import build_snapshot_url, build_target_url
|
|
56
53
|
from plugins.runtime.python.namespaces import (
|
|
57
54
|
CameraNamespaces,
|
|
@@ -59,25 +56,20 @@ from plugins.runtime.python.namespaces import (
|
|
|
59
56
|
FrameWorkerNamespaces,
|
|
60
57
|
NamespaceManager,
|
|
61
58
|
PluginCameraNamespaces,
|
|
62
|
-
|
|
59
|
+
SensorRegistryNamespaces,
|
|
63
60
|
)
|
|
64
61
|
from plugins.runtime.python.proxy.sensor import (
|
|
65
62
|
DetectionCoordinatorRPC,
|
|
66
|
-
|
|
67
|
-
SensorProxy,
|
|
63
|
+
SensorRegistryInterface,
|
|
68
64
|
)
|
|
69
65
|
from plugins.runtime.python.remote_urls import rewrite_source_urls_for_remote
|
|
70
66
|
from plugins.runtime.python.typings import (
|
|
71
67
|
CameraEventMessage,
|
|
72
68
|
PluginInfo,
|
|
73
|
-
SensorAddedEvent,
|
|
74
|
-
SensorAssignmentChangedEvent,
|
|
75
|
-
SensorEventMessage,
|
|
76
|
-
SensorRemovedEvent,
|
|
77
|
-
StoredSensorData,
|
|
78
69
|
)
|
|
79
70
|
|
|
80
71
|
if TYPE_CHECKING:
|
|
72
|
+
from plugins.runtime.python.proxy.sensor_manager import SensorManagerProxy
|
|
81
73
|
from plugins.runtime.python.storage_controller import StorageController
|
|
82
74
|
|
|
83
75
|
|
|
@@ -86,9 +78,11 @@ DETECTION_SENSOR_TYPES: frozenset[SensorType] = frozenset(
|
|
|
86
78
|
SensorType.Motion,
|
|
87
79
|
SensorType.Audio,
|
|
88
80
|
SensorType.Object,
|
|
81
|
+
SensorType.ObjectAssist,
|
|
89
82
|
SensorType.Face,
|
|
90
83
|
SensorType.LicensePlate,
|
|
91
84
|
SensorType.Classifier,
|
|
85
|
+
SensorType.Clip,
|
|
92
86
|
}
|
|
93
87
|
)
|
|
94
88
|
|
|
@@ -104,8 +98,6 @@ class CameraControllerInterface(Protocol):
|
|
|
104
98
|
refresh: bool | None = False,
|
|
105
99
|
) -> ProbeStream | None: ...
|
|
106
100
|
async def refreshStates(self) -> dict[str, Any]: ...
|
|
107
|
-
async def registerSensor(self, sensor: SensorJSON, plugin_id: str) -> bool: ...
|
|
108
|
-
async def unregisterSensor(self, sensor_id: str) -> None: ...
|
|
109
101
|
async def streamUrl(self, source_id: str) -> str | None: ...
|
|
110
102
|
async def getStreamStatus(self, source_id: str) -> str: ...
|
|
111
103
|
|
|
@@ -148,6 +140,7 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
148
140
|
self,
|
|
149
141
|
proxy: RPCClient,
|
|
150
142
|
storage_controller: StorageController,
|
|
143
|
+
sensor_manager: SensorManagerProxy,
|
|
151
144
|
camera: Camera,
|
|
152
145
|
plugin: PluginInfo,
|
|
153
146
|
logger: LoggerService,
|
|
@@ -167,18 +160,16 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
167
160
|
self._logger = logger
|
|
168
161
|
self._proxy = proxy
|
|
169
162
|
self._plugin = plugin
|
|
170
|
-
self._contract: PluginContract = plugin["contract"]
|
|
171
163
|
self._storage_controller: StorageController = storage_controller
|
|
164
|
+
self._sensor_manager = sensor_manager
|
|
172
165
|
|
|
173
|
-
self._sensor_added_subject: Subject[SensorEventData] = Subject()
|
|
174
|
-
self._sensor_removed_subject: Subject[SensorEventData] = Subject()
|
|
175
166
|
self._detection_event_subject: Subject[DetectionEventPayload] = Subject()
|
|
176
167
|
|
|
177
168
|
self._close_subscription: CloseHandler | None = None
|
|
178
|
-
self.
|
|
179
|
-
self.
|
|
169
|
+
self._detection_wire: CloseHandler | None = None
|
|
170
|
+
self._detection_wire_pending = False
|
|
171
|
+
self._detection_subscriber_count = 0
|
|
180
172
|
|
|
181
|
-
self._sensors: dict[str, SensorProxy] = {}
|
|
182
173
|
self._owned_sensors: dict[str, tuple[Sensor[Any, Any, Any], SensorType]] = {}
|
|
183
174
|
self._sensor_cleanup_functions: dict[str, CloseHandler] = {}
|
|
184
175
|
|
|
@@ -190,13 +181,13 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
190
181
|
CameraNamespaces,
|
|
191
182
|
FrameWorkerNamespaces,
|
|
192
183
|
PluginCameraNamespaces,
|
|
193
|
-
|
|
184
|
+
SensorRegistryNamespaces,
|
|
194
185
|
FrameWorkerDetectionNamespaces,
|
|
195
186
|
] = (
|
|
196
187
|
NamespaceManager.camera_namespaces(self.id),
|
|
197
188
|
NamespaceManager.frame_worker_namespaces(self.id),
|
|
198
189
|
NamespaceManager.plugin_camera_namespaces(self._plugin["id"], self.id),
|
|
199
|
-
NamespaceManager.
|
|
190
|
+
NamespaceManager.sensor_registry_namespaces(),
|
|
200
191
|
NamespaceManager.frame_worker_detection_namespaces(self.id),
|
|
201
192
|
)
|
|
202
193
|
|
|
@@ -340,8 +331,8 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
340
331
|
return self._proxy.create_proxy(self._namespaces[0].camera_controller_rpc)
|
|
341
332
|
|
|
342
333
|
@property
|
|
343
|
-
def
|
|
344
|
-
return self._proxy.create_proxy(self._namespaces[3].
|
|
334
|
+
def _sensor_registry_proxy(self) -> SensorRegistryInterface:
|
|
335
|
+
return self._proxy.create_proxy(self._namespaces[3].sensors_rpc)
|
|
345
336
|
|
|
346
337
|
@property
|
|
347
338
|
def _detection_coordinator_proxy(self) -> DetectionCoordinatorRPC:
|
|
@@ -350,14 +341,6 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
350
341
|
def getSourceById(self, id: str) -> CameraDeviceSource | None:
|
|
351
342
|
return next((s for s in self.sources if s._id == id), None) # pyright: ignore[reportPrivateUsage]
|
|
352
343
|
|
|
353
|
-
def _can_access_sensor(self, sensor: StoredSensorData) -> bool:
|
|
354
|
-
# Own sensors are always accessible
|
|
355
|
-
if sensor.get("pluginId") == self._plugin["id"]:
|
|
356
|
-
return True
|
|
357
|
-
|
|
358
|
-
# Foreign sensors require consumes declaration
|
|
359
|
-
return "consumes" in self._contract and sensor["type"] in self._contract["consumes"]
|
|
360
|
-
|
|
361
344
|
async def init(self) -> None:
|
|
362
345
|
if self._initialized.value:
|
|
363
346
|
return
|
|
@@ -368,21 +351,7 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
368
351
|
self._namespaces[0].camera_subject, self._on_event_message
|
|
369
352
|
)
|
|
370
353
|
|
|
371
|
-
self._close_sensor_subscription = await self._proxy.subscribe(
|
|
372
|
-
self._namespaces[3].sensor_subject, self._on_global_sensor_event
|
|
373
|
-
)
|
|
374
|
-
|
|
375
|
-
ns = NamespaceManager.detection_event_namespaces(self.id)
|
|
376
|
-
|
|
377
|
-
def _handle_detection_msg(msg: dict[str, Any]) -> None:
|
|
378
|
-
self._detection_event_subject.next({"type": msg["type"], "event": msg["data"]})
|
|
379
|
-
|
|
380
|
-
self._close_detection_subscription = await self._proxy.subscribe(
|
|
381
|
-
ns.detection_event_subject, _handle_detection_msg
|
|
382
|
-
)
|
|
383
|
-
|
|
384
354
|
await self._refresh_states()
|
|
385
|
-
await self._initialize_sensors()
|
|
386
355
|
|
|
387
356
|
async def connect(self) -> None:
|
|
388
357
|
if not self.pluginInfo or self.pluginInfo["id"] != self._plugin["id"]:
|
|
@@ -435,98 +404,90 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
435
404
|
def createStorage(self, schemas: list[Any]) -> Any:
|
|
436
405
|
return self._storage_controller.createCameraStorage(self.id, schemas)
|
|
437
406
|
|
|
438
|
-
def getSensors(self) -> list[SensorLike]:
|
|
439
|
-
owned_sensors = [entry[0] for entry in self._owned_sensors.values()]
|
|
440
|
-
proxy_sensors = list(self._sensors.values())
|
|
441
|
-
return [*owned_sensors, *proxy_sensors]
|
|
442
|
-
|
|
443
|
-
def getSensor(self, sensorId: str) -> SensorLike | None:
|
|
444
|
-
# Check if we own this sensor - return the real sensor
|
|
445
|
-
owned = self._owned_sensors.get(sensorId)
|
|
446
|
-
if owned:
|
|
447
|
-
return owned[0]
|
|
448
|
-
# Return proxy for foreign sensors
|
|
449
|
-
return self._sensors.get(sensorId)
|
|
450
|
-
|
|
451
|
-
def getSensorsByType(self, sensorType: SensorType) -> list[SensorLike]:
|
|
452
|
-
return [s for s in self.getSensors() if s.type == sensorType]
|
|
453
|
-
|
|
454
407
|
async def addSensor(self, sensor: Sensor[Any, Any, Any]) -> None:
|
|
455
|
-
|
|
408
|
+
# pre-standalone SDK: its toJSON reads the removed cameraId getter and throws, drop the guard with the stub window
|
|
409
|
+
if not callable(getattr(sensor, "_setId", None)):
|
|
410
|
+
self._logger.warn(
|
|
411
|
+
f'Plugin "{self._plugin["id"]}" uses a pre-standalone SDK, sensor "{sensor.name}" stays unavailable. Update the plugin.'
|
|
412
|
+
)
|
|
413
|
+
return
|
|
456
414
|
|
|
457
|
-
|
|
415
|
+
plugin_id = self._plugin["id"]
|
|
458
416
|
sensor._setPluginId(plugin_id) # pyright: ignore[reportPrivateUsage]
|
|
459
417
|
|
|
460
|
-
|
|
461
|
-
sensor
|
|
462
|
-
|
|
418
|
+
sensor_json = sensor.toJSON()
|
|
419
|
+
sensor_json["requiresFrames"] = getattr(sensor, "_requires_frames", False) is True
|
|
420
|
+
# derived nativeId keeps per-camera instances of same-named sensors distinct
|
|
421
|
+
if not sensor_json.get("nativeId"):
|
|
422
|
+
sensor_json["nativeId"] = f"{self.id}:{sensor.type}:{sensor.name}"
|
|
423
|
+
|
|
424
|
+
# resolve the durable id first and wire storage with it, so registration
|
|
425
|
+
# data (modelSpec) can read sensor storage
|
|
426
|
+
sensor_id = await self._sensor_registry_proxy.resolveSensor(
|
|
427
|
+
sensor_json, plugin_id, {"assignCameraId": self.id}
|
|
463
428
|
)
|
|
429
|
+
sensor._setId(sensor_id) # pyright: ignore[reportPrivateUsage]
|
|
430
|
+
sensor_json["id"] = sensor_id
|
|
464
431
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
schemas = sensor.storage_schema
|
|
468
|
-
storage = self._storage_controller.createSensorStorage(
|
|
469
|
-
self.id,
|
|
470
|
-
sensor.type,
|
|
471
|
-
plugin_id,
|
|
472
|
-
sensor.name,
|
|
473
|
-
sensor.id,
|
|
474
|
-
schemas,
|
|
475
|
-
)
|
|
432
|
+
storage = self._storage_controller.createSensorStorage(plugin_id, sensor.id, sensor.storage_schema)
|
|
476
433
|
await storage.register_storage()
|
|
434
|
+
sensor._setStorage(storage) # pyright: ignore[reportPrivateUsage]
|
|
477
435
|
|
|
478
|
-
|
|
479
|
-
|
|
436
|
+
model_spec = getattr(sensor, "modelSpec", None)
|
|
437
|
+
if model_spec:
|
|
438
|
+
sensor_json["modelSpec"] = model_spec
|
|
480
439
|
|
|
481
|
-
|
|
440
|
+
registration = await self._sensor_registry_proxy.registerSensor(
|
|
441
|
+
sensor_json, plugin_id, {"assignCameraId": self.id}
|
|
442
|
+
)
|
|
443
|
+
sensor._setAssignedCameras(registration["assignedCameraIds"]) # pyright: ignore[reportPrivateUsage]
|
|
444
|
+
set_locked = getattr(sensor, "_setAssignmentLocked", None)
|
|
445
|
+
if callable(set_locked):
|
|
446
|
+
set_locked()
|
|
482
447
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
).sensor_rpc
|
|
448
|
+
# assignment changes arrive on the global stream the sensor manager owns
|
|
449
|
+
await self._sensor_manager.track_camera_sensor(sensor)
|
|
486
450
|
|
|
487
|
-
|
|
488
|
-
model_spec = getattr(sensor, "modelSpec", None)
|
|
451
|
+
sensor_namespace = NamespaceManager.sensor_provider_namespaces(plugin_id, sensor.id).sensor_rpc
|
|
489
452
|
|
|
490
|
-
|
|
491
|
-
|
|
453
|
+
sensor_type = sensor.type
|
|
454
|
+
sensor._init( # pyright: ignore[reportPrivateUsage]
|
|
455
|
+
lambda properties: self._on_sensor_state_write(sensor.id, sensor_type, properties)
|
|
456
|
+
)
|
|
457
|
+
sensor._initCapabilities(lambda caps: self._on_sensor_capabilities_changed(sensor.id, caps)) # pyright: ignore[reportPrivateUsage]
|
|
492
458
|
|
|
493
|
-
|
|
494
|
-
sensor_json["requiresFrames"] = requires_frames
|
|
495
|
-
if model_spec:
|
|
496
|
-
sensor_json["modelSpec"] = model_spec
|
|
459
|
+
rpc_cleanup = await self._proxy.register_handler(sensor_namespace, sensor, without_decorators=True)
|
|
497
460
|
|
|
498
|
-
is_assigned = await self._camera_controller_proxy.registerSensor(sensor_json, plugin_id)
|
|
499
|
-
sensor._setAssigned(is_assigned) # pyright: ignore[reportPrivateUsage]
|
|
500
461
|
self._owned_sensors[sensor.id] = (sensor, sensor.type)
|
|
501
462
|
|
|
502
|
-
|
|
463
|
+
# Subscribe to backend-initiated property changes for the owned sensor so that
|
|
464
|
+
# backend updates (e.g., motion dwell timer) sync into the local sensor state.
|
|
465
|
+
sensor_event_ns = NamespaceManager.sensor_event_namespaces(sensor.id)
|
|
503
466
|
|
|
504
467
|
async def handle_backend_event(event: dict[str, Any]) -> None:
|
|
505
468
|
if event.get("type") == "property:changed":
|
|
506
469
|
change_data = event.get("data", {})
|
|
507
470
|
prop = change_data.get("property")
|
|
508
|
-
value = change_data.get("value")
|
|
509
|
-
timestamp = change_data.get("timestamp")
|
|
510
471
|
if prop is not None:
|
|
511
|
-
sensor._onBackendPropertyChanged(
|
|
472
|
+
sensor._onBackendPropertyChanged( # pyright: ignore[reportPrivateUsage]
|
|
473
|
+
prop, change_data.get("value"), change_data.get("timestamp")
|
|
474
|
+
)
|
|
512
475
|
|
|
513
476
|
unsubscribe_backend = await self._proxy.subscribe(
|
|
514
477
|
sensor_event_ns.sensor_subject, handle_backend_event
|
|
515
478
|
)
|
|
516
479
|
|
|
517
|
-
|
|
518
|
-
|
|
480
|
+
async def combined_cleanup() -> None:
|
|
481
|
+
await unsubscribe_backend()
|
|
482
|
+
await rpc_cleanup()
|
|
519
483
|
|
|
520
|
-
|
|
521
|
-
await unsubscribe_backend()
|
|
522
|
-
await existing_cleanup()
|
|
484
|
+
self._sensor_cleanup_functions[sensor.id] = combined_cleanup
|
|
523
485
|
|
|
524
|
-
|
|
525
|
-
else:
|
|
526
|
-
self._sensor_cleanup_functions[sensor.id] = unsubscribe_backend
|
|
486
|
+
sensor._setActive(True) # pyright: ignore[reportPrivateUsage]
|
|
527
487
|
|
|
528
488
|
async def removeSensor(self, sensorId: str) -> None:
|
|
529
|
-
|
|
489
|
+
self._sensor_manager.untrack_camera_sensor(sensorId)
|
|
490
|
+
await self._sensor_registry_proxy.unregisterSensor(sensorId)
|
|
530
491
|
|
|
531
492
|
cleanup = self._sensor_cleanup_functions.pop(sensorId, None)
|
|
532
493
|
if cleanup:
|
|
@@ -536,67 +497,25 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
536
497
|
if owned:
|
|
537
498
|
owned[0]._cleanup() # pyright: ignore[reportPrivateUsage]
|
|
538
499
|
|
|
539
|
-
proxy = self._sensors.get(sensorId)
|
|
540
|
-
if proxy:
|
|
541
|
-
await proxy._unsubscribe_from_events() # pyright: ignore[reportPrivateUsage]
|
|
542
|
-
self._sensors.pop(sensorId, None)
|
|
543
|
-
|
|
544
500
|
@property
|
|
545
|
-
def
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
def onSensorRemoved(self) -> Observable[SensorEventData]:
|
|
550
|
-
return self._sensor_removed_subject.as_observable()
|
|
551
|
-
|
|
552
|
-
def onSensorProperty(
|
|
553
|
-
self,
|
|
554
|
-
sensor_type: SensorType,
|
|
555
|
-
property: str,
|
|
556
|
-
callback: Any,
|
|
557
|
-
) -> Disposable:
|
|
558
|
-
property_sub: Disposable | None = None
|
|
559
|
-
|
|
560
|
-
def subscribe_to(sensor: SensorLike) -> None:
|
|
561
|
-
nonlocal property_sub
|
|
562
|
-
if property_sub is not None:
|
|
563
|
-
property_sub.dispose()
|
|
564
|
-
property_sub = sensor.onPropertyChanged.subscribe(
|
|
565
|
-
lambda e: callback(e["value"], e["timestamp"], sensor) if e["property"] == property else None
|
|
566
|
-
)
|
|
567
|
-
|
|
568
|
-
existing = self.getSensorsByType(sensor_type)
|
|
569
|
-
if existing:
|
|
570
|
-
subscribe_to(existing[0])
|
|
571
|
-
|
|
572
|
-
added_sub = self.onSensorAdded.subscribe(
|
|
573
|
-
lambda e: (
|
|
574
|
-
subscribe_to(self.getSensorsByType(sensor_type)[0])
|
|
575
|
-
if e["sensorType"] == sensor_type and self.getSensorsByType(sensor_type)
|
|
576
|
-
else None
|
|
577
|
-
)
|
|
578
|
-
)
|
|
501
|
+
def onDetectionEvent(self) -> Observable[DetectionEventPayload]:
|
|
502
|
+
def _subscribe(callback: Callable[[DetectionEventPayload], None]) -> Disposable:
|
|
503
|
+
if self._detection_event_subject.closed:
|
|
504
|
+
return Disposable(lambda: None)
|
|
579
505
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
property_sub.dispose()
|
|
584
|
-
property_sub = None
|
|
506
|
+
sub = self._detection_event_subject.subscribe(callback)
|
|
507
|
+
self._detection_subscriber_count += 1
|
|
508
|
+
self._ensure_detection_wire()
|
|
585
509
|
|
|
586
|
-
|
|
510
|
+
def _teardown() -> None:
|
|
511
|
+
sub.dispose()
|
|
512
|
+
self._detection_subscriber_count -= 1
|
|
513
|
+
if self._detection_subscriber_count == 0:
|
|
514
|
+
self._drop_detection_wire()
|
|
587
515
|
|
|
588
|
-
|
|
589
|
-
nonlocal property_sub
|
|
590
|
-
if property_sub is not None:
|
|
591
|
-
property_sub.dispose()
|
|
592
|
-
added_sub.dispose()
|
|
593
|
-
removed_sub.dispose()
|
|
516
|
+
return Disposable(_teardown)
|
|
594
517
|
|
|
595
|
-
return
|
|
596
|
-
|
|
597
|
-
@property
|
|
598
|
-
def onDetectionEvent(self) -> Observable[DetectionEventPayload]:
|
|
599
|
-
return self._detection_event_subject.as_observable()
|
|
518
|
+
return Observable(_subscribe)
|
|
600
519
|
|
|
601
520
|
async def implement(self, impl: CameraImplementation) -> None:
|
|
602
521
|
plugin_id = self._plugin["id"]
|
|
@@ -636,13 +555,9 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
636
555
|
await self._close_subscription()
|
|
637
556
|
self._close_subscription = None
|
|
638
557
|
|
|
639
|
-
if self.
|
|
640
|
-
await self.
|
|
641
|
-
self.
|
|
642
|
-
|
|
643
|
-
if self._close_detection_subscription:
|
|
644
|
-
await self._close_detection_subscription()
|
|
645
|
-
self._close_detection_subscription = None
|
|
558
|
+
if self._detection_wire:
|
|
559
|
+
await self._detection_wire()
|
|
560
|
+
self._detection_wire = None
|
|
646
561
|
|
|
647
562
|
if self._impl_cleanup_function:
|
|
648
563
|
with contextlib.suppress(Exception):
|
|
@@ -654,77 +569,62 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
654
569
|
await cleanup()
|
|
655
570
|
self._sensor_cleanup_functions.clear()
|
|
656
571
|
|
|
657
|
-
for sensor_proxy in list(self._sensors.values()):
|
|
658
|
-
await sensor_proxy._unsubscribe_from_events() # pyright: ignore[reportPrivateUsage]
|
|
659
|
-
|
|
660
572
|
for owned_sensor, _ in list(self._owned_sensors.values()):
|
|
573
|
+
self._sensor_manager.untrack_camera_sensor(owned_sensor.id)
|
|
661
574
|
owned_sensor._cleanup() # pyright: ignore[reportPrivateUsage]
|
|
662
575
|
|
|
663
|
-
self._sensors.clear()
|
|
664
576
|
self._owned_sensors.clear()
|
|
665
577
|
|
|
666
578
|
self._camera_subject.complete()
|
|
667
579
|
self._camera_state.complete()
|
|
668
580
|
self._frame_worker_state.complete()
|
|
669
581
|
self._initialized.complete()
|
|
670
|
-
self._sensor_added_subject.complete()
|
|
671
|
-
self._sensor_removed_subject.complete()
|
|
672
582
|
self._detection_event_subject.complete()
|
|
673
583
|
|
|
674
|
-
|
|
675
|
-
|
|
584
|
+
def _handle_detection_msg(self, msg: dict[str, Any]) -> None:
|
|
585
|
+
self._detection_event_subject.next({"type": msg["type"], "event": msg["data"]})
|
|
676
586
|
|
|
677
|
-
|
|
678
|
-
self.
|
|
679
|
-
|
|
587
|
+
def _ensure_detection_wire(self) -> None:
|
|
588
|
+
if self._detection_wire or self._detection_wire_pending:
|
|
589
|
+
return
|
|
680
590
|
|
|
681
|
-
|
|
682
|
-
try:
|
|
683
|
-
sensors = await self._sensor_controller_proxy.getSensors(self._plugin["id"])
|
|
684
|
-
newly_added: list[SensorProxy] = []
|
|
685
|
-
|
|
686
|
-
for sensor_data in sensors:
|
|
687
|
-
if sensor_data["id"] in self._sensors:
|
|
688
|
-
continue
|
|
689
|
-
|
|
690
|
-
if sensor_data["id"] in self._owned_sensors:
|
|
691
|
-
continue
|
|
692
|
-
|
|
693
|
-
plugin_id = sensor_data.get("pluginId", self._plugin["id"])
|
|
694
|
-
owner_ns = NamespaceManager.sensor_provider_namespaces(
|
|
695
|
-
plugin_id, self.id, sensor_data["id"]
|
|
696
|
-
).sensor_rpc
|
|
697
|
-
proxy = SensorProxy(sensor_data, self._proxy, owner_ns, self.id)
|
|
698
|
-
self._sensors[sensor_data["id"]] = proxy
|
|
699
|
-
newly_added.append(proxy)
|
|
700
|
-
|
|
701
|
-
current_ids = {s["id"] for s in sensors}
|
|
702
|
-
for sensor_id in list(self._sensors.keys()):
|
|
703
|
-
if sensor_id not in current_ids:
|
|
704
|
-
sensor = self._sensors.get(sensor_id)
|
|
705
|
-
if sensor:
|
|
706
|
-
await sensor._unsubscribe_from_events() # pyright: ignore[reportPrivateUsage]
|
|
707
|
-
self._sensors.pop(sensor_id, None)
|
|
708
|
-
|
|
709
|
-
if newly_added:
|
|
710
|
-
await self._get_sensor_states(newly_added)
|
|
711
|
-
# Subscribe each sensor to its own per-sensor namespace
|
|
712
|
-
for sensor in newly_added:
|
|
713
|
-
await sensor._subscribe_to_events() # pyright: ignore[reportPrivateUsage]
|
|
591
|
+
self._detection_wire_pending = True
|
|
714
592
|
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
593
|
+
async def _subscribe() -> None:
|
|
594
|
+
try:
|
|
595
|
+
ns = NamespaceManager.detection_event_namespaces(self.id)
|
|
596
|
+
close = await self._proxy.subscribe(ns.detection_event_subject, self._handle_detection_msg)
|
|
597
|
+
except Exception as error:
|
|
598
|
+
self._logger.error(f"Failed to subscribe to detection events: {error}")
|
|
599
|
+
self._detection_wire_pending = False
|
|
600
|
+
return
|
|
718
601
|
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
602
|
+
self._detection_wire_pending = False
|
|
603
|
+
if self._detection_subscriber_count == 0:
|
|
604
|
+
# last consumer left while the subscribe was in flight
|
|
605
|
+
self._tasks.add(close())
|
|
606
|
+
return
|
|
607
|
+
|
|
608
|
+
self._detection_wire = close
|
|
609
|
+
|
|
610
|
+
self._tasks.add(_subscribe())
|
|
611
|
+
|
|
612
|
+
def _drop_detection_wire(self) -> None:
|
|
613
|
+
close = self._detection_wire
|
|
614
|
+
self._detection_wire = None
|
|
615
|
+
if close:
|
|
616
|
+
self._tasks.add(close())
|
|
617
|
+
|
|
618
|
+
async def _refresh_states(self) -> None:
|
|
619
|
+
response = await self._camera_controller_proxy.refreshStates()
|
|
620
|
+
|
|
621
|
+
# a resync must not wake subscribers for state they already hold
|
|
622
|
+
if response["camera"] != self._camera_subject.value:
|
|
623
|
+
self._camera_subject.next(response["camera"])
|
|
624
|
+
if response["cameraState"] != self._camera_state.value:
|
|
625
|
+
self._camera_state.next(response["cameraState"])
|
|
626
|
+
if response["frameWorkerState"] != self._frame_worker_state.value:
|
|
627
|
+
self._frame_worker_state.next(response["frameWorkerState"])
|
|
728
628
|
|
|
729
629
|
async def _on_event_message(self, event: CameraEventMessage) -> None:
|
|
730
630
|
if not self._initialized.value:
|
|
@@ -742,56 +642,6 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
742
642
|
elif event_type == "frameWorkerState" and data is not None:
|
|
743
643
|
self._frame_worker_state.next(cast(bool, data))
|
|
744
644
|
|
|
745
|
-
async def _on_global_sensor_event(self, event: SensorEventMessage) -> None:
|
|
746
|
-
if not self._initialized.value:
|
|
747
|
-
return
|
|
748
|
-
|
|
749
|
-
event_type = event.get("type")
|
|
750
|
-
|
|
751
|
-
if event_type == "sensor:added":
|
|
752
|
-
added_data = cast(SensorAddedEvent, event.get("data"))
|
|
753
|
-
sensor_data = added_data["sensor"]
|
|
754
|
-
# Only add if not already in cache and not our own sensor
|
|
755
|
-
if sensor_data["id"] not in self._sensors and sensor_data["id"] not in self._owned_sensors:
|
|
756
|
-
# Check if plugin can access this sensor based on contract.consumes
|
|
757
|
-
if not self._can_access_sensor(sensor_data):
|
|
758
|
-
return # Skip - sensor type not in contract.consumes
|
|
759
|
-
plugin_id = sensor_data.get("pluginId", self._plugin["id"])
|
|
760
|
-
owner_ns = NamespaceManager.sensor_provider_namespaces(
|
|
761
|
-
plugin_id, self.id, sensor_data["id"]
|
|
762
|
-
).sensor_rpc
|
|
763
|
-
proxy = SensorProxy(sensor_data, self._proxy, owner_ns, self.id)
|
|
764
|
-
await proxy._subscribe_to_events() # pyright: ignore[reportPrivateUsage]
|
|
765
|
-
self._sensors[sensor_data["id"]] = proxy
|
|
766
|
-
|
|
767
|
-
self._sensor_added_subject.next(
|
|
768
|
-
{"sensorId": sensor_data["id"], "sensorType": sensor_data["type"]}
|
|
769
|
-
)
|
|
770
|
-
|
|
771
|
-
elif event_type == "sensor:removed":
|
|
772
|
-
removed_data = cast(SensorRemovedEvent, event.get("data"))
|
|
773
|
-
sensor = self._sensors.get(removed_data["sensorId"])
|
|
774
|
-
if sensor:
|
|
775
|
-
await sensor._unsubscribe_from_events() # pyright: ignore[reportPrivateUsage]
|
|
776
|
-
self._sensors.pop(removed_data["sensorId"], None)
|
|
777
|
-
|
|
778
|
-
self._sensor_removed_subject.next(
|
|
779
|
-
{
|
|
780
|
-
"sensorId": removed_data["sensorId"],
|
|
781
|
-
"sensorType": removed_data["sensorType"],
|
|
782
|
-
}
|
|
783
|
-
)
|
|
784
|
-
|
|
785
|
-
elif event_type == "sensor:assignment:changed":
|
|
786
|
-
assign_data = cast(SensorAssignmentChangedEvent, event.get("data"))
|
|
787
|
-
sensor_type = assign_data["sensorType"]
|
|
788
|
-
is_assigned = assign_data["assigned"]
|
|
789
|
-
|
|
790
|
-
if assign_data["pluginId"] == self._plugin["id"]:
|
|
791
|
-
for _, (owned_sensor, s_type) in self._owned_sensors.items():
|
|
792
|
-
if s_type == sensor_type:
|
|
793
|
-
owned_sensor._setAssigned(is_assigned) # pyright: ignore[reportPrivateUsage]
|
|
794
|
-
|
|
795
645
|
def _on_sensor_state_write(
|
|
796
646
|
self, sensor_id: str, sensor_type: SensorType, properties: dict[str, Any]
|
|
797
647
|
) -> None:
|
|
@@ -810,16 +660,16 @@ class CameraDeviceProxy(Subscribed, CameraDeviceInterface):
|
|
|
810
660
|
self._tasks.add(notify_coordinator())
|
|
811
661
|
return
|
|
812
662
|
|
|
813
|
-
async def
|
|
663
|
+
async def notify_registry() -> None:
|
|
814
664
|
with contextlib.suppress(Exception):
|
|
815
|
-
await self.
|
|
665
|
+
await self._sensor_registry_proxy.updatePropertyValues(sensor_id, properties)
|
|
816
666
|
|
|
817
|
-
self._tasks.add(
|
|
667
|
+
self._tasks.add(notify_registry())
|
|
818
668
|
|
|
819
669
|
def _on_sensor_capabilities_changed(self, sensor_id: str, capabilities: list[str]) -> None:
|
|
820
670
|
async def notify() -> None:
|
|
821
671
|
with contextlib.suppress(Exception):
|
|
822
|
-
await self.
|
|
672
|
+
await self._sensor_registry_proxy.updateCapabilities(sensor_id, capabilities)
|
|
823
673
|
|
|
824
674
|
self._tasks.add(notify())
|
|
825
675
|
|