diff --git a/custom_components/bluetti_bt/__init__.py b/custom_components/bluetti_bt/__init__.py index 36b1f4b..7af757d 100644 --- a/custom_components/bluetti_bt/__init__.py +++ b/custom_components/bluetti_bt/__init__.py @@ -5,10 +5,12 @@ from __future__ import annotations import re import logging +from homeassistant.components import bluetooth from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_ADDRESS, Platform from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo +from homeassistant.exceptions import ConfigEntryNotReady from .const import DOMAIN, MANUFACTURER @@ -24,6 +26,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: if address is None: return False + if not bluetooth.async_address_present(hass, address): + raise ConfigEntryNotReady("Bluetti device not present") + # Setup platforms await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) diff --git a/custom_components/bluetti_bt/sensor.py b/custom_components/bluetti_bt/sensor.py index ebcc67e..ce92db9 100644 --- a/custom_components/bluetti_bt/sensor.py +++ b/custom_components/bluetti_bt/sensor.py @@ -5,8 +5,7 @@ from __future__ import annotations from datetime import timedelta import logging -import async_timeout - +from homeassistant.components import bluetooth from homeassistant.components.sensor import SensorEntity from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback @@ -16,7 +15,6 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, DataUpdateCoordinator, - UpdateFailed, ) from . import device_info as dev_info, get_unique_id @@ -29,14 +27,18 @@ async def async_setup_entry( ) -> None: """Setup sensor entities.""" + address = entry.data.get(CONF_ADDRESS) + if address is None: + _LOGGER.error("Device has no address") + # Create coordinator for polling coordinator = PollingCoordinator(hass) await coordinator.async_config_entry_first_refresh() # Generate device info - _LOGGER.error("Creating sensors for device %s", entry.data.get(CONF_ADDRESS)) + _LOGGER.info("Creating sensors for device with address %s", address) device_info = dev_info(entry) - async_add_entities([Battery(coordinator, device_info)]) + async_add_entities([Battery(coordinator, device_info, address)]) class PollingCoordinator(DataUpdateCoordinator): @@ -63,15 +65,23 @@ class PollingCoordinator(DataUpdateCoordinator): class Battery(CoordinatorEntity, SensorEntity): """Bluetti battery.""" - def __init__(self, coordinator: PollingCoordinator, device_info: DeviceInfo): + def __init__( + self, coordinator: PollingCoordinator, device_info: DeviceInfo, address + ): """Init battery entity.""" super().__init__(coordinator) - self._attr_device_info = device_info self._attr_name = f"{device_info.get('name')} Battery level" self._attr_unique_id = get_unique_id(f"{device_info.get('name')} Battery level") self._attr_unit_of_measurement = "%" self._attr_device_class = "battery" + self._address = address + + @property + def available(self) -> bool: + if self._address is None: + return False + return bluetooth.async_address_present(self.hass, self._address) @callback def _handle_coordinator_update(self) -> None: