Add option to select quality of camera snapshots taken from Synology DSM connected cameras (#58306)

This commit is contained in:
Michael 2022-01-23 21:23:04 +01:00 committed by GitHub
parent d2eda91588
commit eda5cfc12d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 33 additions and 14 deletions

View file

@ -22,7 +22,14 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import SynoApi, SynologyDSMBaseEntity
from .const import COORDINATOR_CAMERAS, DOMAIN, SYNO_API, SynologyDSMEntityDescription
from .const import (
CONF_SNAPSHOT_QUALITY,
COORDINATOR_CAMERAS,
DEFAULT_SNAPSHOT_QUALITY,
DOMAIN,
SYNO_API,
SynologyDSMEntityDescription,
)
_LOGGER = logging.getLogger(__name__)
@ -78,6 +85,9 @@ class SynoDSMCamera(SynologyDSMBaseEntity, Camera):
camera_id
].is_enabled,
)
self.snapshot_quality = api._entry.options.get(
CONF_SNAPSHOT_QUALITY, DEFAULT_SNAPSHOT_QUALITY
)
super().__init__(api, coordinator, description)
Camera.__init__(self)
@ -135,7 +145,7 @@ class SynoDSMCamera(SynologyDSMBaseEntity, Camera):
if not self.available:
return None
try:
return self._api.surveillance_station.get_camera_image(self.entity_description.key) # type: ignore[no-any-return]
return self._api.surveillance_station.get_camera_image(self.entity_description.key, self.snapshot_quality) # type: ignore[no-any-return]
except (
SynologyDSMAPIErrorException,
SynologyDSMRequestException,

View file

@ -39,10 +39,12 @@ from homeassistant.helpers.typing import DiscoveryInfoType
from .const import (
CONF_DEVICE_TOKEN,
CONF_SNAPSHOT_QUALITY,
CONF_VOLUMES,
DEFAULT_PORT,
DEFAULT_PORT_SSL,
DEFAULT_SCAN_INTERVAL,
DEFAULT_SNAPSHOT_QUALITY,
DEFAULT_TIMEOUT,
DEFAULT_USE_SSL,
DEFAULT_VERIFY_SSL,
@ -357,18 +359,24 @@ class SynologyDSMOptionsFlowHandler(OptionsFlow):
data_schema = vol.Schema(
{
vol.Optional(
vol.Required(
CONF_SCAN_INTERVAL,
default=self.config_entry.options.get(
CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL
),
): cv.positive_int,
vol.Optional(
vol.Required(
CONF_TIMEOUT,
default=self.config_entry.options.get(
CONF_TIMEOUT, DEFAULT_TIMEOUT
),
): cv.positive_int,
vol.Required(
CONF_SNAPSHOT_QUALITY,
default=self.config_entry.options.get(
CONF_SNAPSHOT_QUALITY, DEFAULT_SNAPSHOT_QUALITY
),
): vol.All(vol.Coerce(int), vol.Range(min=0, max=2)),
}
)
return self.async_show_form(step_id="init", data_schema=data_schema)

View file

@ -9,6 +9,7 @@ from synology_dsm.api.core.utilization import SynoCoreUtilization
from synology_dsm.api.dsm.information import SynoDSMInformation
from synology_dsm.api.storage.storage import SynoStorage
from synology_dsm.api.surveillance_station import SynoSurveillanceStation
from synology_dsm.api.surveillance_station.const import SNAPSHOT_PROFILE_BALANCED
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
@ -47,6 +48,7 @@ UNDO_UPDATE_LISTENER = "undo_update_listener"
CONF_SERIAL = "serial"
CONF_VOLUMES = "volumes"
CONF_DEVICE_TOKEN = "device_token"
CONF_SNAPSHOT_QUALITY = "snap_profile_type"
DEFAULT_USE_SSL = True
DEFAULT_VERIFY_SSL = False
@ -55,6 +57,7 @@ DEFAULT_PORT_SSL = 5001
# Options
DEFAULT_SCAN_INTERVAL = 15 # min
DEFAULT_TIMEOUT = 10 # sec
DEFAULT_SNAPSHOT_QUALITY = SNAPSHOT_PROFILE_BALANCED
ENTITY_UNIT_LOAD = "load"

View file

@ -56,7 +56,8 @@
"init": {
"data": {
"scan_interval": "Minutes between scans",
"timeout": "Timeout (seconds)"
"timeout": "Timeout (seconds)",
"snap_profile_type": "Quality level of camera snapshots (0:high 1:medium 2:low)"
}
}
}

View file

@ -31,14 +31,6 @@
"description": "Do you want to setup {name} ({host})?",
"title": "Synology DSM"
},
"reauth": {
"data": {
"password": "Password",
"username": "Username"
},
"description": "Reason: {details}",
"title": "Synology DSM Reauthenticate Integration"
},
"reauth_confirm": {
"data": {
"password": "Password",
@ -64,6 +56,7 @@
"init": {
"data": {
"scan_interval": "Minutes between scans",
"snap_profile_type": "Quality level of camera snapshots (0:high 1:medium 2:low)",
"timeout": "Timeout (seconds)"
}
}

View file

@ -14,10 +14,12 @@ from homeassistant import data_entry_flow
from homeassistant.components import ssdp
from homeassistant.components.synology_dsm.config_flow import CONF_OTP_CODE
from homeassistant.components.synology_dsm.const import (
CONF_SNAPSHOT_QUALITY,
CONF_VOLUMES,
DEFAULT_PORT,
DEFAULT_PORT_SSL,
DEFAULT_SCAN_INTERVAL,
DEFAULT_SNAPSHOT_QUALITY,
DEFAULT_TIMEOUT,
DEFAULT_USE_SSL,
DEFAULT_VERIFY_SSL,
@ -545,13 +547,15 @@ async def test_options_flow(hass: HomeAssistant, service: MagicMock):
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert config_entry.options[CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
assert config_entry.options[CONF_TIMEOUT] == DEFAULT_TIMEOUT
assert config_entry.options[CONF_SNAPSHOT_QUALITY] == DEFAULT_SNAPSHOT_QUALITY
# Manual
result = await hass.config_entries.options.async_init(config_entry.entry_id)
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={CONF_SCAN_INTERVAL: 2, CONF_TIMEOUT: 30},
user_input={CONF_SCAN_INTERVAL: 2, CONF_TIMEOUT: 30, CONF_SNAPSHOT_QUALITY: 0},
)
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert config_entry.options[CONF_SCAN_INTERVAL] == 2
assert config_entry.options[CONF_TIMEOUT] == 30
assert config_entry.options[CONF_SNAPSHOT_QUALITY] == 0