From 0514960bda07b9d503efaf3d0482ece66b849342 Mon Sep 17 00:00:00 2001 From: Jason Hunter Date: Fri, 22 May 2020 21:11:30 -0400 Subject: [PATCH] Fix ONVIF PTZ and profile encoding issues (#36006) * allow lib to create AsyncTransport * fix transport close issue * fix zoom only cameras without PTZ presets * catch profiles without encoding configuration * also catch ServerDisconnectedError for ptz --- homeassistant/components/onvif/config_flow.py | 3 ++- homeassistant/components/onvif/device.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/onvif/config_flow.py b/homeassistant/components/onvif/config_flow.py index ceb861fc7dd..1dba697380d 100644 --- a/homeassistant/components/onvif/config_flow.py +++ b/homeassistant/components/onvif/config_flow.py @@ -219,7 +219,8 @@ class OnvifFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): media_service = device.create_media_service() profiles = await media_service.GetProfiles() h264 = any( - profile.VideoEncoderConfiguration.Encoding == "H264" + profile.VideoEncoderConfiguration + and profile.VideoEncoderConfiguration.Encoding == "H264" for profile in profiles ) diff --git a/homeassistant/components/onvif/device.py b/homeassistant/components/onvif/device.py index d6f407f016d..938c960080f 100644 --- a/homeassistant/components/onvif/device.py +++ b/homeassistant/components/onvif/device.py @@ -255,7 +255,10 @@ class ONVIFDevice: profiles = [] for key, onvif_profile in enumerate(result): # Only add H264 profiles - if onvif_profile.VideoEncoderConfiguration.Encoding != "H264": + if ( + not onvif_profile.VideoEncoderConfiguration + or onvif_profile.VideoEncoderConfiguration.Encoding != "H264" + ): continue profile = Profile( @@ -282,9 +285,13 @@ class ONVIFDevice: is not None, ) - ptz_service = self.device.create_ptz_service() - presets = await ptz_service.GetPresets(profile.token) - profile.ptz.presets = [preset.token for preset in presets] + try: + ptz_service = self.device.create_ptz_service() + presets = await ptz_service.GetPresets(profile.token) + profile.ptz.presets = [preset.token for preset in presets] + except (Fault, ServerDisconnectedError): + # It's OK if Presets aren't supported + profile.ptz.presets = [] profiles.append(profile)