mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-05 02:35:22 +03:00
Add ptz controls ot birdseye
This commit is contained in:
parent
718632a440
commit
bc067fd888
@ -950,7 +950,8 @@ class FrigateConfig(FrigateBaseModel):
|
|||||||
input.path = input.path.format(**FRIGATE_ENV_VARS)
|
input.path = input.path.format(**FRIGATE_ENV_VARS)
|
||||||
|
|
||||||
# ONVIF substitution
|
# 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)
|
camera_config.onvif.password = camera_config.onvif.password.format(**FRIGATE_ENV_VARS)
|
||||||
|
|
||||||
# Add default filters
|
# Add default filters
|
||||||
|
|||||||
@ -41,17 +41,14 @@ class OnvifController:
|
|||||||
cam.onvif.port,
|
cam.onvif.port,
|
||||||
cam.onvif.user,
|
cam.onvif.user,
|
||||||
cam.onvif.password,
|
cam.onvif.password,
|
||||||
wsdl_dir=site.getsitepackages()[0].replace(
|
wsdl_dir="/home/vscode/.local/lib/python3.4/site-packages/wsdl/",
|
||||||
"dist-packages", "site-packages"
|
|
||||||
)
|
|
||||||
+ "/wsdl",
|
|
||||||
),
|
),
|
||||||
"init": False,
|
"init": False,
|
||||||
"active": False,
|
"active": False,
|
||||||
"presets": {},
|
"presets": {},
|
||||||
}
|
}
|
||||||
|
|
||||||
def _init_onvif(self, camera_name: str) -> None:
|
def _init_onvif(self, camera_name: str) -> bool:
|
||||||
onvif: ONVIFCamera = self.cams[camera_name]["onvif"]
|
onvif: ONVIFCamera = self.cams[camera_name]["onvif"]
|
||||||
|
|
||||||
# create init services
|
# create init services
|
||||||
@ -61,6 +58,7 @@ class OnvifController:
|
|||||||
profile = media.GetProfiles()[0]
|
profile = media.GetProfiles()[0]
|
||||||
except ONVIFError as e:
|
except ONVIFError as e:
|
||||||
logger.error(f"Unable to connect to camera: {camera_name}: {e}")
|
logger.error(f"Unable to connect to camera: {camera_name}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
ptz = onvif.create_ptz_service()
|
ptz = onvif.create_ptz_service()
|
||||||
request = ptz.create_type("GetConfigurationOptions")
|
request = ptz.create_type("GetConfigurationOptions")
|
||||||
@ -89,6 +87,7 @@ class OnvifController:
|
|||||||
self.cams[camera_name]["features"] = supported_features
|
self.cams[camera_name]["features"] = supported_features
|
||||||
|
|
||||||
self.cams[camera_name]["init"] = True
|
self.cams[camera_name]["init"] = True
|
||||||
|
return True
|
||||||
|
|
||||||
def _stop(self, camera_name: str) -> None:
|
def _stop(self, camera_name: str) -> None:
|
||||||
onvif: ONVIFCamera = self.cams[camera_name]["onvif"]
|
onvif: ONVIFCamera = self.cams[camera_name]["onvif"]
|
||||||
@ -177,7 +176,8 @@ class OnvifController:
|
|||||||
return
|
return
|
||||||
|
|
||||||
if not self.cams[camera_name]["init"]:
|
if not self.cams[camera_name]["init"]:
|
||||||
self._init_onvif(camera_name)
|
if not self._init_onvif(camera_name):
|
||||||
|
return
|
||||||
|
|
||||||
if command == OnvifCommandEnum.init:
|
if command == OnvifCommandEnum.init:
|
||||||
# already init
|
# already init
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import Heading from '../components/Heading';
|
|||||||
import WebRtcPlayer from '../components/WebRtcPlayer';
|
import WebRtcPlayer from '../components/WebRtcPlayer';
|
||||||
import MsePlayer from '../components/MsePlayer';
|
import MsePlayer from '../components/MsePlayer';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
|
import { useMemo } from 'preact/hooks';
|
||||||
|
import CameraControlPanel from '../components/CameraControlPanel';
|
||||||
|
|
||||||
export default function Birdseye() {
|
export default function Birdseye() {
|
||||||
const { data: config } = useSWR('config');
|
const { data: config } = useSWR('config');
|
||||||
@ -16,6 +18,16 @@ export default function Birdseye() {
|
|||||||
);
|
);
|
||||||
const sourceValues = ['mse', 'webrtc', 'jsmpeg'];
|
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) {
|
if (!config || !sourceIsLoaded) {
|
||||||
return <ActivityIndicator />;
|
return <ActivityIndicator />;
|
||||||
}
|
}
|
||||||
@ -80,6 +92,18 @@ export default function Birdseye() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{player}
|
{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>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user