Bump reolink-aio to 0.9.1 (#118655)

Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
starkillerOG 2024-06-04 08:00:40 +02:00 committed by GitHub
parent d43d12905d
commit cba07540e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 56 additions and 16 deletions

View File

@ -89,11 +89,17 @@ class ReolinkHostCoordinatorEntity(ReolinkBaseCoordinatorEntity[None]):
async def async_added_to_hass(self) -> None: async def async_added_to_hass(self) -> None:
"""Entity created.""" """Entity created."""
await super().async_added_to_hass() await super().async_added_to_hass()
if ( cmd_key = self.entity_description.cmd_key
self.entity_description.cmd_key is not None if cmd_key is not None:
and self.entity_description.cmd_key not in self._host.update_cmd_list self._host.async_register_update_cmd(cmd_key)
):
self._host.update_cmd_list.append(self.entity_description.cmd_key) async def async_will_remove_from_hass(self) -> None:
"""Entity removed."""
cmd_key = self.entity_description.cmd_key
if cmd_key is not None:
self._host.async_unregister_update_cmd(cmd_key)
await super().async_will_remove_from_hass()
class ReolinkChannelCoordinatorEntity(ReolinkHostCoordinatorEntity): class ReolinkChannelCoordinatorEntity(ReolinkHostCoordinatorEntity):
@ -128,3 +134,18 @@ class ReolinkChannelCoordinatorEntity(ReolinkHostCoordinatorEntity):
sw_version=self._host.api.camera_sw_version(dev_ch), sw_version=self._host.api.camera_sw_version(dev_ch),
configuration_url=self._conf_url, configuration_url=self._conf_url,
) )
async def async_added_to_hass(self) -> None:
"""Entity created."""
await super().async_added_to_hass()
cmd_key = self.entity_description.cmd_key
if cmd_key is not None:
self._host.async_register_update_cmd(cmd_key, self._channel)
async def async_will_remove_from_hass(self) -> None:
"""Entity removed."""
cmd_key = self.entity_description.cmd_key
if cmd_key is not None:
self._host.async_unregister_update_cmd(cmd_key, self._channel)
await super().async_will_remove_from_hass()

View File

@ -3,6 +3,7 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from collections import defaultdict
from collections.abc import Mapping from collections.abc import Mapping
import logging import logging
from typing import Any, Literal from typing import Any, Literal
@ -21,7 +22,7 @@ from homeassistant.const import (
CONF_PROTOCOL, CONF_PROTOCOL,
CONF_USERNAME, CONF_USERNAME,
) )
from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback
from homeassistant.helpers import issue_registry as ir from homeassistant.helpers import issue_registry as ir
from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.dispatcher import async_dispatcher_send
@ -67,7 +68,9 @@ class ReolinkHost:
timeout=DEFAULT_TIMEOUT, timeout=DEFAULT_TIMEOUT,
) )
self.update_cmd_list: list[str] = [] self._update_cmd: defaultdict[str, defaultdict[int | None, int]] = defaultdict(
lambda: defaultdict(int)
)
self.webhook_id: str | None = None self.webhook_id: str | None = None
self._onvif_push_supported: bool = True self._onvif_push_supported: bool = True
@ -84,6 +87,20 @@ class ReolinkHost:
self._long_poll_task: asyncio.Task | None = None self._long_poll_task: asyncio.Task | None = None
self._lost_subscription: bool = False self._lost_subscription: bool = False
@callback
def async_register_update_cmd(self, cmd: str, channel: int | None = None) -> None:
"""Register the command to update the state."""
self._update_cmd[cmd][channel] += 1
@callback
def async_unregister_update_cmd(self, cmd: str, channel: int | None = None) -> None:
"""Unregister the command to update the state."""
self._update_cmd[cmd][channel] -= 1
if not self._update_cmd[cmd][channel]:
del self._update_cmd[cmd][channel]
if not self._update_cmd[cmd]:
del self._update_cmd[cmd]
@property @property
def unique_id(self) -> str: def unique_id(self) -> str:
"""Create the unique ID, base for all entities.""" """Create the unique ID, base for all entities."""
@ -320,7 +337,7 @@ class ReolinkHost:
async def update_states(self) -> None: async def update_states(self) -> None:
"""Call the API of the camera device to update the internal states.""" """Call the API of the camera device to update the internal states."""
await self._api.get_states(cmd_list=self.update_cmd_list) await self._api.get_states(cmd_list=self._update_cmd)
async def disconnect(self) -> None: async def disconnect(self) -> None:
"""Disconnect from the API, so the connection will be released.""" """Disconnect from the API, so the connection will be released."""

View File

@ -18,5 +18,5 @@
"documentation": "https://www.home-assistant.io/integrations/reolink", "documentation": "https://www.home-assistant.io/integrations/reolink",
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["reolink_aio"], "loggers": ["reolink_aio"],
"requirements": ["reolink-aio==0.8.11"] "requirements": ["reolink-aio==0.9.1"]
} }

View File

@ -109,12 +109,14 @@ SELECT_ENTITIES = (
ReolinkSelectEntityDescription( ReolinkSelectEntityDescription(
key="status_led", key="status_led",
cmd_key="GetPowerLed", cmd_key="GetPowerLed",
translation_key="status_led", translation_key="doorbell_led",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
get_options=[state.name for state in StatusLedEnum], get_options=lambda api, ch: api.doorbell_led_list(ch),
supported=lambda api, ch: api.supported(ch, "doorbell_led"), supported=lambda api, ch: api.supported(ch, "doorbell_led"),
value=lambda api, ch: StatusLedEnum(api.doorbell_led(ch)).name, value=lambda api, ch: StatusLedEnum(api.doorbell_led(ch)).name,
method=lambda api, ch, name: api.set_status_led(ch, StatusLedEnum[name].value), method=lambda api, ch, name: (
api.set_status_led(ch, StatusLedEnum[name].value, doorbell=True)
),
), ),
) )

View File

@ -463,8 +463,8 @@
"pantiltfirst": "Pan/tilt first" "pantiltfirst": "Pan/tilt first"
} }
}, },
"status_led": { "doorbell_led": {
"name": "Status LED", "name": "Doorbell LED",
"state": { "state": {
"stayoff": "Stay off", "stayoff": "Stay off",
"auto": "Auto", "auto": "Auto",

View File

@ -2454,7 +2454,7 @@ renault-api==0.2.3
renson-endura-delta==1.7.1 renson-endura-delta==1.7.1
# homeassistant.components.reolink # homeassistant.components.reolink
reolink-aio==0.8.11 reolink-aio==0.9.1
# homeassistant.components.idteck_prox # homeassistant.components.idteck_prox
rfk101py==0.0.1 rfk101py==0.0.1

View File

@ -1915,7 +1915,7 @@ renault-api==0.2.3
renson-endura-delta==1.7.1 renson-endura-delta==1.7.1
# homeassistant.components.reolink # homeassistant.components.reolink
reolink-aio==0.8.11 reolink-aio==0.9.1
# homeassistant.components.rflink # homeassistant.components.rflink
rflink==0.0.66 rflink==0.0.66