added availability check to battery sensor

This commit is contained in:
Patrick762 committed 2023-07-30 16:38:54 +02:00
1 parent 1b34ac7f45
commit 344da5d070
2 files changed
+22 -7

No files matched your search

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