Skip to content

Commit

Permalink
ONVIF Camera added Error handling and rtsp authentication. (#11129)
Browse files Browse the repository at this point in the history
Bugfixes for several issues with hass.io and non-venv installations

Added passing of credentials to RTSP stream

Changed from ONVIFService to ONVIFCamera as ONVIFService didn't contain
the same error handling.

Changed method to get Stream URL from camera to a more compatible method

Added extra Error handling
  • Loading branch information
matt2005 authored and bitglue committed Feb 17, 2018
1 parent fab991b commit 66dcb6c
Showing 1 changed file with 24 additions and 15 deletions.
39 changes: 24 additions & 15 deletions homeassistant/components/camera/onvif.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"""
import asyncio
import logging
import os

import voluptuous as vol

Expand Down Expand Up @@ -48,30 +47,40 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
"""Set up a ONVIF camera."""
if not hass.data[DATA_FFMPEG].async_run_test(config.get(CONF_HOST)):
return
async_add_devices([ONVIFCamera(hass, config)])
async_add_devices([ONVIFHassCamera(hass, config)])


class ONVIFCamera(Camera):
class ONVIFHassCamera(Camera):
"""An implementation of an ONVIF camera."""

def __init__(self, hass, config):
"""Initialize a ONVIF camera."""
from onvif import ONVIFService
import onvif
from onvif import ONVIFCamera
super().__init__()

self._name = config.get(CONF_NAME)
self._ffmpeg_arguments = config.get(CONF_EXTRA_ARGUMENTS)
media = ONVIFService(
'http://{}:{}/onvif/device_service'.format(
config.get(CONF_HOST), config.get(CONF_PORT)),
config.get(CONF_USERNAME),
config.get(CONF_PASSWORD),
'{}/wsdl/media.wsdl'.format(os.path.dirname(onvif.__file__))
)
self._input = media.GetStreamUri().Uri
_LOGGER.debug("ONVIF Camera Using the following URL for %s: %s",
self._name, self._input)
self._input = None
try:
_LOGGER.debug("Connecting with ONVIF Camera: %s on port %s",
config.get(CONF_HOST), config.get(CONF_PORT))
media_service = ONVIFCamera(
config.get(CONF_HOST), config.get(CONF_PORT),
config.get(CONF_USERNAME), config.get(CONF_PASSWORD)
).create_media_service()
stream_uri = media_service.GetStreamUri(
{'StreamSetup': {'Stream': 'RTP-Unicast', 'Transport': 'RTSP'}}
)
self._input = stream_uri.Uri.replace(
'rtsp://', 'rtsp://{}:{}@'.format(
config.get(CONF_USERNAME),
config.get(CONF_PASSWORD)), 1)
_LOGGER.debug(
"ONVIF Camera Using the following URL for %s: %s",
self._name, self._input)
except Exception as err:
_LOGGER.error("Unable to communicate with ONVIF Camera: %s", err)
raise

@asyncio.coroutine
def async_camera_image(self):
Expand Down

0 comments on commit 66dcb6c

Please sign in to comment.