Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 31 additions & 11 deletions homeassistant/components/camera/amcrest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,22 @@

import homeassistant.loader as loader
from homeassistant.components.camera import (Camera, PLATFORM_SCHEMA)
from homeassistant.components.ffmpeg import DATA_FFMPEG
from homeassistant.const import (
CONF_HOST, CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_PORT)
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import (
async_get_clientsession, async_aiohttp_proxy_web)
async_get_clientsession, async_aiohttp_proxy_web,
async_aiohttp_proxy_stream)

REQUIREMENTS = ['amcrest==1.1.9']
REQUIREMENTS = ['amcrest==1.2.0']
DEPENDENCIES = ['ffmpeg']

_LOGGER = logging.getLogger(__name__)

CONF_RESOLUTION = 'resolution'
CONF_STREAM_SOURCE = 'stream_source'
CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments'

DEFAULT_NAME = 'Amcrest Camera'
DEFAULT_PORT = 80
Expand All @@ -40,7 +44,8 @@

STREAM_SOURCE_LIST = {
'mjpeg': 0,
'snapshot': 1
'snapshot': 1,
'rtsp': 2,
}

CONTENT_TYPE_HEADER = 'Content-Type'
Expand All @@ -56,6 +61,7 @@
vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
vol.Optional(CONF_STREAM_SOURCE, default=DEFAULT_STREAM_SOURCE):
vol.All(vol.In(STREAM_SOURCE_LIST)),
vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string,
})


Expand Down Expand Up @@ -92,8 +98,9 @@ def __init__(self, hass, device_info, camera):
super(AmcrestCam, self).__init__()
self._camera = camera
self._base_url = self._camera.get_base_url()
self._hass = hass
self._name = device_info.get(CONF_NAME)
self._ffmpeg = hass.data[DATA_FFMPEG]
self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS)
self._resolution = RESOLUTION_LIST[device_info.get(CONF_RESOLUTION)]
self._stream_source = STREAM_SOURCE_LIST[
device_info.get(CONF_STREAM_SOURCE)
Expand All @@ -117,15 +124,28 @@ def handle_async_mjpeg_stream(self, request):
yield from super().handle_async_mjpeg_stream(request)
return

# Otherwise, stream an MJPEG image stream directly from the camera
websession = async_get_clientsession(self.hass)
streaming_url = '{0}mjpg/video.cgi?channel=0&subtype={1}'.format(
self._base_url, self._resolution)
elif self._stream_source == STREAM_SOURCE_LIST['mjpeg']:
# stream an MJPEG image stream directly from the camera
websession = async_get_clientsession(self.hass)
streaming_url = self._camera.mjpeg_url(typeno=self._resolution)
stream_coro = websession.get(
streaming_url, auth=self._token, timeout=TIMEOUT)

stream_coro = websession.get(
streaming_url, auth=self._token, timeout=TIMEOUT)
yield from async_aiohttp_proxy_web(self.hass, request, stream_coro)

yield from async_aiohttp_proxy_web(self.hass, request, stream_coro)
else:
# streaming via fmpeg
from haffmpeg import CameraMjpeg

streaming_url = self._camera.rtsp_url(typeno=self._resolution)
stream = CameraMjpeg(self._ffmpeg.binary, loop=self.hass.loop)
yield from stream.open_camera(
streaming_url, extra_cmd=self._ffmpeg_arguments)

yield from async_aiohttp_proxy_stream(
self.hass, request, stream,
'multipart/x-mixed-replace;boundary=ffserver')
yield from stream.close()

@property
def name(self):
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/sensor/amcrest.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

from requests.exceptions import HTTPError, ConnectTimeout

REQUIREMENTS = ['amcrest==1.1.9']
REQUIREMENTS = ['amcrest==1.2.0']

_LOGGER = logging.getLogger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ alarmdecoder==0.12.1.0

# homeassistant.components.camera.amcrest
# homeassistant.components.sensor.amcrest
amcrest==1.1.9
amcrest==1.2.0

# homeassistant.components.media_player.anthemav
anthemav==1.1.8
Expand Down