mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-21 16:16:31 +00:00
Support basic video mapping (#1483)
* Support basic video mapping * Fix regex
This commit is contained in:
parent
a2f06b1553
commit
dd603e1ec2
3
API.md
3
API.md
@ -52,7 +52,7 @@ The addons from `addons` are only installed one.
|
||||
"slug": "xy",
|
||||
"description": "description",
|
||||
"repository": "12345678|null",
|
||||
"version": "LAST_VERSION",
|
||||
"version": "LATEST_VERSION",
|
||||
"installed": "INSTALL_VERSION",
|
||||
"icon": "bool",
|
||||
"logo": "bool",
|
||||
@ -537,6 +537,7 @@ Get all available addons.
|
||||
"kernel_modules": "bool",
|
||||
"devicetree": "bool",
|
||||
"docker_api": "bool",
|
||||
"video": "bool",
|
||||
"audio": "bool",
|
||||
"audio_input": "null|0,0",
|
||||
"audio_output": "null|0,0",
|
||||
|
@ -57,6 +57,7 @@ from ..const import (
|
||||
ATTR_UDEV,
|
||||
ATTR_URL,
|
||||
ATTR_VERSION,
|
||||
ATTR_VIDEO,
|
||||
ATTR_WEBUI,
|
||||
SECURITY_DEFAULT,
|
||||
SECURITY_DISABLE,
|
||||
@ -393,6 +394,11 @@ class AddonModel(CoreSysAttributes):
|
||||
"""Return True if the add-on access to audio."""
|
||||
return self.data[ATTR_AUDIO]
|
||||
|
||||
@property
|
||||
def with_video(self) -> bool:
|
||||
"""Return True if the add-on access to video."""
|
||||
return self.data[ATTR_VIDEO]
|
||||
|
||||
@property
|
||||
def homeassistant_version(self) -> Optional[str]:
|
||||
"""Return min Home Assistant version they needed by Add-on."""
|
||||
|
@ -77,6 +77,7 @@ from ..const import (
|
||||
ATTR_USER,
|
||||
ATTR_UUID,
|
||||
ATTR_VERSION,
|
||||
ATTR_VIDEO,
|
||||
ATTR_WEBUI,
|
||||
BOOT_AUTO,
|
||||
BOOT_MANUAL,
|
||||
@ -219,6 +220,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema(
|
||||
vol.Optional(ATTR_APPARMOR, default=True): vol.Boolean(),
|
||||
vol.Optional(ATTR_FULL_ACCESS, default=False): vol.Boolean(),
|
||||
vol.Optional(ATTR_AUDIO, default=False): vol.Boolean(),
|
||||
vol.Optional(ATTR_VIDEO, default=False): vol.Boolean(),
|
||||
vol.Optional(ATTR_GPIO, default=False): vol.Boolean(),
|
||||
vol.Optional(ATTR_DEVICETREE, default=False): vol.Boolean(),
|
||||
vol.Optional(ATTR_KERNEL_MODULES, default=False): vol.Boolean(),
|
||||
|
@ -82,6 +82,7 @@ from ..const import (
|
||||
ATTR_UDEV,
|
||||
ATTR_URL,
|
||||
ATTR_VERSION,
|
||||
ATTR_VIDEO,
|
||||
ATTR_WEBUI,
|
||||
BOOT_AUTO,
|
||||
BOOT_MANUAL,
|
||||
@ -238,6 +239,7 @@ class APIAddons(CoreSysAttributes):
|
||||
ATTR_DEVICETREE: addon.with_devicetree,
|
||||
ATTR_UDEV: addon.with_udev,
|
||||
ATTR_DOCKER_API: addon.access_docker_api,
|
||||
ATTR_VIDEO: addon.with_video,
|
||||
ATTR_AUDIO: addon.with_audio,
|
||||
ATTR_AUDIO_INPUT: None,
|
||||
ATTR_AUDIO_OUTPUT: None,
|
||||
|
@ -149,6 +149,7 @@ ATTR_TYPE = "type"
|
||||
ATTR_TIMEOUT = "timeout"
|
||||
ATTR_AUTO_UPDATE = "auto_update"
|
||||
ATTR_CUSTOM = "custom"
|
||||
ATTR_VIDEO = "video"
|
||||
ATTR_AUDIO = "audio"
|
||||
ATTR_AUDIO_INPUT = "audio_input"
|
||||
ATTR_AUDIO_OUTPUT = "audio_output"
|
||||
|
@ -147,6 +147,11 @@ class DockerAddon(DockerInterface):
|
||||
for device in serial_devs:
|
||||
devices.append(f"{device}:{device}:rwm")
|
||||
|
||||
# Use video devices
|
||||
if self.addon.with_video:
|
||||
for device in self.sys_hardware.video_devices:
|
||||
devices.append(f"{device.path!s}:{device.path!s}:rwm")
|
||||
|
||||
# Return None if no devices is present
|
||||
return devices or None
|
||||
|
||||
|
@ -4,13 +4,15 @@ from datetime import datetime
|
||||
import logging
|
||||
from pathlib import Path
|
||||
import re
|
||||
from typing import Any, Dict, Optional, Set
|
||||
from typing import Any, Dict, List, Optional, Set
|
||||
|
||||
import attr
|
||||
import pyudev
|
||||
|
||||
from ..const import ATTR_DEVICES, ATTR_NAME, ATTR_TYPE, CHAN_ID, CHAN_TYPE
|
||||
from ..exceptions import HardwareNotSupportedError
|
||||
|
||||
|
||||
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||
|
||||
ASOUND_CARDS: Path = Path("/proc/asound/cards")
|
||||
@ -26,6 +28,17 @@ GPIO_DEVICES: Path = Path("/sys/class/gpio")
|
||||
SOC_DEVICES: Path = Path("/sys/devices/platform/soc")
|
||||
RE_TTY: re.Pattern = re.compile(r"tty[A-Z]+")
|
||||
|
||||
RE_VIDEO_DEVICES = re.compile(r"^(?:vchiq|cec)")
|
||||
|
||||
|
||||
@attr.s(frozen=True)
|
||||
class Device:
|
||||
"""Represent a device."""
|
||||
|
||||
name: str = attr.ib()
|
||||
path: Path = attr.ib()
|
||||
links: List[Path] = attr.ib()
|
||||
|
||||
|
||||
class Hardware:
|
||||
"""Representation of an interface to procfs, sysfs and udev."""
|
||||
@ -34,6 +47,33 @@ class Hardware:
|
||||
"""Init hardware object."""
|
||||
self.context = pyudev.Context()
|
||||
|
||||
@property
|
||||
def devices(self) -> List[Device]:
|
||||
"""Return a list of all available devices."""
|
||||
dev_list: List[Device] = []
|
||||
|
||||
# Exctract all devices
|
||||
for device in self.context.list_devices():
|
||||
dev_list.append(
|
||||
Device(device.sys_name),
|
||||
Path(device.device_node),
|
||||
[Path(node) for node in device.device_links],
|
||||
)
|
||||
|
||||
return dev_list
|
||||
|
||||
@property
|
||||
def video_devices(self) -> List[Device]:
|
||||
"""Return all available video devices."""
|
||||
dev_list: List[Device] = []
|
||||
|
||||
for device in self.devices:
|
||||
if not RE_VIDEO_DEVICES.match(device.name):
|
||||
continue
|
||||
dev_list.append(device)
|
||||
|
||||
return dev_list
|
||||
|
||||
@property
|
||||
def serial_devices(self) -> Set[str]:
|
||||
"""Return all serial and connected devices."""
|
||||
|
Loading…
x
Reference in New Issue
Block a user