Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ omit =
homeassistant/components/lookin/light.py
homeassistant/components/lookin/media_player.py
homeassistant/components/lookin/sensor.py
homeassistant/components/loqed/sensor.py
homeassistant/components/luci/device_tracker.py
homeassistant/components/luftdaten/sensor.py
homeassistant/components/lupusec/*
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/loqed/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from .const import DOMAIN
from .coordinator import LoqedDataCoordinator

PLATFORMS: list[str] = [Platform.LOCK]
PLATFORMS: list[str] = [Platform.LOCK, Platform.SENSOR]


_LOGGER = logging.getLogger(__name__)
Expand Down
71 changes: 71 additions & 0 deletions homeassistant/components/loqed/sensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"""Creates LOQED sensors."""
from typing import Final

from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
PERCENTAGE,
SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
EntityCategory,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .coordinator import LoqedDataCoordinator, StatusMessage
from .entity import LoqedEntity

SENSORS: Final[tuple[SensorEntityDescription, ...]] = (
SensorEntityDescription(
key="ble_strength",
translation_key="ble_strength",
device_class=SensorDeviceClass.SIGNAL_STRENGTH,
Comment thread
frenck marked this conversation as resolved.
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="battery_percentage",
device_class=SensorDeviceClass.BATTERY,
state_class=SensorStateClass.MEASUREMENT,
Comment thread
balloob marked this conversation as resolved.
Outdated
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement=PERCENTAGE,
),
)


async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the Loqed lock platform."""
coordinator = hass.data[DOMAIN][entry.entry_id]

async_add_entities(LoqedSensor(coordinator, sensor) for sensor in SENSORS)


class LoqedSensor(LoqedEntity, SensorEntity):
"""Representation of Sensor state."""

def __init__(
self, coordinator: LoqedDataCoordinator, description: SensorEntityDescription
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self.entity_description = description
self._attr_unique_id = f"{self.coordinator.lock.id}_{description.key}"

@property
def data(self) -> StatusMessage:
"""Return data object from DataUpdateCoordinator."""
return self.coordinator.lock

@property
def native_value(self) -> int:
"""Return state of sensor."""
return getattr(self.data, self.entity_description.key)
7 changes: 7 additions & 0 deletions homeassistant/components/loqed/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,12 @@
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
}
},
"entity": {
"sensor": {
"ble_strength": {
"name": "Bluetooth signal"
}
}
}
}
1 change: 1 addition & 0 deletions tests/components/loqed/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def lock_fixture() -> loqed.Lock:
mock_lock.name = "LOQED smart lock"
mock_lock.getWebhooks = AsyncMock(return_value=webhooks_fixture)
mock_lock.bolt_state = "locked"
mock_lock.battery_percentage = 90
return mock_lock


Expand Down