Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reolink add pan position sensor #98592

Merged
merged 3 commits into from
Aug 19, 2023
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 70 additions & 8 deletions homeassistant/components/reolink/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,30 @@

from . import ReolinkData
from .const import DOMAIN
from .entity import ReolinkHostCoordinatorEntity
from .entity import ReolinkChannelCoordinatorEntity, ReolinkHostCoordinatorEntity


@dataclass
class ReolinkSensorEntityDescriptionMixin:
"""Mixin values for Reolink sensor entities for a camera channel."""

value: Callable[[Host, int], int]


@dataclass
class ReolinkSensorEntityDescription(
SensorEntityDescription, ReolinkSensorEntityDescriptionMixin
):
"""A class that describes sensor entities for a camera channel."""

supported: Callable[[Host, int], bool] = lambda api, ch: True


@dataclass
class ReolinkHostSensorEntityDescriptionMixin:
"""Mixin values for Reolink host sensor entities."""

value: Callable[[Host], bool]
value: Callable[[Host], int]


@dataclass
Expand All @@ -37,9 +53,21 @@ class ReolinkHostSensorEntityDescription(
):
"""A class that describes host sensor entities."""

supported: Callable[[Host], bool] = lambda host: True
supported: Callable[[Host], bool] = lambda api: True


SENSORS = (
ReolinkSensorEntityDescription(
key="ptz_pan_position",
translation_key="ptz_pan_position",
icon="mdi:pan",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda api, ch: api.ptz_pan_position(ch),
supported=lambda api, ch: api.supported(ch, "ptz_position"),
),
)

HOST_SENSORS = (
ReolinkHostSensorEntityDescription(
key="wifi_signal",
Expand All @@ -62,11 +90,45 @@ async def async_setup_entry(
"""Set up a Reolink IP Camera."""
reolink_data: ReolinkData = hass.data[DOMAIN][config_entry.entry_id]

async_add_entities(
ReolinkHostSensorEntity(reolink_data, entity_description)
for entity_description in HOST_SENSORS
if entity_description.supported(reolink_data.host.api)
entities: list[ReolinkSensorEntity | ReolinkHostSensorEntity] = [
ReolinkSensorEntity(reolink_data, channel, entity_description)
for entity_description in SENSORS
for channel in reolink_data.host.api.channels
if entity_description.supported(reolink_data.host.api, channel)
]
entities.extend(
[
ReolinkHostSensorEntity(reolink_data, entity_description)
for entity_description in HOST_SENSORS
if entity_description.supported(reolink_data.host.api)
]
)
async_add_entities(entities)


class ReolinkSensorEntity(ReolinkChannelCoordinatorEntity, SensorEntity):
"""Base sensor class for Reolink IP camera sensors."""

entity_description: ReolinkSensorEntityDescription

def __init__(
self,
reolink_data: ReolinkData,
channel: int,
entity_description: ReolinkSensorEntityDescription,
) -> None:
"""Initialize Reolink sensor."""
super().__init__(reolink_data, channel)
self.entity_description = entity_description

self._attr_unique_id = (
f"{self._host.unique_id}_{channel}_{entity_description.key}"
)

@property
def native_value(self) -> StateType | date | datetime | Decimal:
"""Return the value reported by the sensor."""
return self.entity_description.value(self._host.api, self._channel)


class ReolinkHostSensorEntity(ReolinkHostCoordinatorEntity, SensorEntity):
Expand All @@ -79,7 +141,7 @@ def __init__(
reolink_data: ReolinkData,
entity_description: ReolinkHostSensorEntityDescription,
) -> None:
"""Initialize Reolink binary sensor."""
"""Initialize Reolink host sensor."""
super().__init__(reolink_data)
self.entity_description = entity_description

Expand Down
3 changes: 3 additions & 0 deletions homeassistant/components/reolink/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@
"sensor": {
"wifi_signal": {
"name": "Wi-Fi signal"
},
"ptz_pan_position": {
"name": "PTZ pan position"
}
}
}
Expand Down