Add ptz controls ot birdseye

This commit is contained in:
Nick Mowen 2023-01-12 13:50:16 -07:00
parent 718632a440
commit bc067fd888
3 changed files with 32 additions and 7 deletions

View File

@ -950,7 +950,8 @@ class FrigateConfig(FrigateBaseModel):
input.path = input.path.format(**FRIGATE_ENV_VARS)
# ONVIF substitution
if camera_config.onvif.password:
if camera_config.onvif.user or camera_config.onvif.password:
camera_config.onvif.user = camera_config.onvif.user.format(**FRIGATE_ENV_VARS)
camera_config.onvif.password = camera_config.onvif.password.format(**FRIGATE_ENV_VARS)
# Add default filters

View File

@ -41,17 +41,14 @@ class OnvifController:
cam.onvif.port,
cam.onvif.user,
cam.onvif.password,
wsdl_dir=site.getsitepackages()[0].replace(
"dist-packages", "site-packages"
)
+ "/wsdl",
wsdl_dir="/home/vscode/.local/lib/python3.4/site-packages/wsdl/",
),
"init": False,
"active": False,
"presets": {},
}
def _init_onvif(self, camera_name: str) -> None:
def _init_onvif(self, camera_name: str) -> bool:
onvif: ONVIFCamera = self.cams[camera_name]["onvif"]
# create init services
@ -61,6 +58,7 @@ class OnvifController:
profile = media.GetProfiles()[0]
except ONVIFError as e:
logger.error(f"Unable to connect to camera: {camera_name}: {e}")
return False
ptz = onvif.create_ptz_service()
request = ptz.create_type("GetConfigurationOptions")
@ -89,6 +87,7 @@ class OnvifController:
self.cams[camera_name]["features"] = supported_features
self.cams[camera_name]["init"] = True
return True
def _stop(self, camera_name: str) -> None:
onvif: ONVIFCamera = self.cams[camera_name]["onvif"]
@ -177,7 +176,8 @@ class OnvifController:
return
if not self.cams[camera_name]["init"]:
self._init_onvif(camera_name)
if not self._init_onvif(camera_name):
return
if command == OnvifCommandEnum.init:
# already init

View File

@ -6,6 +6,8 @@ import Heading from '../components/Heading';
import WebRtcPlayer from '../components/WebRtcPlayer';
import MsePlayer from '../components/MsePlayer';
import useSWR from 'swr';
import { useMemo } from 'preact/hooks';
import CameraControlPanel from '../components/CameraControlPanel';
export default function Birdseye() {
const { data: config } = useSWR('config');
@ -16,6 +18,16 @@ export default function Birdseye() {
);
const sourceValues = ['mse', 'webrtc', 'jsmpeg'];
const ptzCameras = useMemo(() => {
if (!config) {
return [];
}
return Object.entries(config.cameras)
.filter(([_, conf]) => conf.onvif?.host)
.map(([_, camera]) => camera.name);
}, [config]);
if (!config || !sourceIsLoaded) {
return <ActivityIndicator />;
}
@ -80,6 +92,18 @@ export default function Birdseye() {
</div>
{player}
{ptzCameras && (
<div className="dark:bg-gray-800 shadow-md hover:shadow-lg rounded-lg transition-shadow p-4 w-fit">
<Heading size="sm">Control Panel</Heading>
{ptzCameras.map((camera) => (
<div key={camera}>
<Heading size="lg">{camera.replaceAll('_', ' ')}</Heading>
<CameraControlPanel camera={camera} />
</div>
))}
</div>
)}
</div>
);
}