hass-core/homeassistant/components/camera/raspberry_camera.py

86 lines
2.7 KiB
Python

"""Camera platform that has a Raspberry Pi camera."""
import os
import subprocess
import logging
import shutil
from homeassistant.components.camera import Camera
_LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup the Raspberry Camera."""
if shutil.which("raspistill") is None:
_LOGGER.error("Error: raspistill not found")
return None
horizontal_flip_arg = ""
horizontal_flip = int(config.get("horizontal_flip", "0"))
if horizontal_flip:
horizontal_flip_arg = " -hf "
vertical_flip_arg = ""
vertical_flip = int(config.get("vertical_flip", "0"))
if vertical_flip:
vertical_flip_arg = " -vf"
setup_config = (
{
"name": config.get("name", "Raspberry Pi Camera"),
"image_width": int(config.get("image_width", "640")),
"image_height": int(config.get("image_height", "480")),
"image_quality": int(config.get("image_quality", "7")),
"image_rotation": int(config.get("image_rotation", "0")),
"timelapse": int(config.get("timelapse", "1000")),
"horizontal_flip_arg": horizontal_flip_arg,
"vertical_flip_arg": vertical_flip_arg
}
)
add_devices([
RaspberryCamera(setup_config)
])
class RaspberryCamera(Camera):
"""Raspberry Pi camera."""
def __init__(self, device_info):
"""Initialize Raspberry Pi camera component."""
super().__init__()
self._name = device_info["name"]
image_path = os.path.join(os.path.dirname(__file__),
'image.jpg')
# kill if there's raspistill instance
cmd = 'killall raspistill'
subprocess.call(cmd, shell=True)
# start new instance of raspistill
cmd = ('raspistill --nopreview -o ' + str(image_path) +
' -t 0 ' + '-w ' + str(device_info["image_width"]) +
' -h ' + str(device_info["image_height"]) +
' -tl ' + str(device_info["timelapse"]) +
' -q ' + str(device_info["image_quality"]) +
str(device_info["horizontal_flip_arg"]) +
str(device_info["vertical_flip_arg"]) +
' -rot ' + str(device_info["image_rotation"]) +
' &')
subprocess.call(cmd, shell=True)
def camera_image(self):
"""Return raspstill image response."""
image_path = os.path.join(os.path.dirname(__file__),
'image.jpg')
with open(image_path, 'rb') as file:
return file.read()
@property
def name(self):
"""Return the name of this camera."""
return self._name