mirror of
https://github.com/home-assistant/core.git
synced 2025-04-30 04:07:51 +00:00
Split coordinator in lamarzocco (#133208)
This commit is contained in:
parent
89387760d3
commit
0030a970a1
@ -7,6 +7,7 @@ from pylamarzocco.clients.bluetooth import LaMarzoccoBluetoothClient
|
|||||||
from pylamarzocco.clients.cloud import LaMarzoccoCloudClient
|
from pylamarzocco.clients.cloud import LaMarzoccoCloudClient
|
||||||
from pylamarzocco.clients.local import LaMarzoccoLocalClient
|
from pylamarzocco.clients.local import LaMarzoccoLocalClient
|
||||||
from pylamarzocco.const import BT_MODEL_PREFIXES, FirmwareType
|
from pylamarzocco.const import BT_MODEL_PREFIXES, FirmwareType
|
||||||
|
from pylamarzocco.devices.machine import LaMarzoccoMachine
|
||||||
from pylamarzocco.exceptions import AuthFail, RequestNotSuccessful
|
from pylamarzocco.exceptions import AuthFail, RequestNotSuccessful
|
||||||
|
|
||||||
from homeassistant.components.bluetooth import async_discovered_service_info
|
from homeassistant.components.bluetooth import async_discovered_service_info
|
||||||
@ -25,7 +26,13 @@ from homeassistant.helpers import issue_registry as ir
|
|||||||
from homeassistant.helpers.aiohttp_client import async_create_clientsession
|
from homeassistant.helpers.aiohttp_client import async_create_clientsession
|
||||||
|
|
||||||
from .const import CONF_USE_BLUETOOTH, DOMAIN
|
from .const import CONF_USE_BLUETOOTH, DOMAIN
|
||||||
from .coordinator import LaMarzoccoConfigEntry, LaMarzoccoUpdateCoordinator
|
from .coordinator import (
|
||||||
|
LaMarzoccoConfigEntry,
|
||||||
|
LaMarzoccoConfigUpdateCoordinator,
|
||||||
|
LaMarzoccoFirmwareUpdateCoordinator,
|
||||||
|
LaMarzoccoRuntimeData,
|
||||||
|
LaMarzoccoStatisticsUpdateCoordinator,
|
||||||
|
)
|
||||||
|
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
Platform.BINARY_SENSOR,
|
Platform.BINARY_SENSOR,
|
||||||
@ -99,18 +106,29 @@ async def async_setup_entry(hass: HomeAssistant, entry: LaMarzoccoConfigEntry) -
|
|||||||
address_or_ble_device=entry.data[CONF_MAC],
|
address_or_ble_device=entry.data[CONF_MAC],
|
||||||
)
|
)
|
||||||
|
|
||||||
coordinator = LaMarzoccoUpdateCoordinator(
|
device = LaMarzoccoMachine(
|
||||||
hass=hass,
|
model=entry.data[CONF_MODEL],
|
||||||
entry=entry,
|
serial_number=entry.unique_id,
|
||||||
local_client=local_client,
|
name=entry.data[CONF_NAME],
|
||||||
cloud_client=cloud_client,
|
cloud_client=cloud_client,
|
||||||
|
local_client=local_client,
|
||||||
bluetooth_client=bluetooth_client,
|
bluetooth_client=bluetooth_client,
|
||||||
)
|
)
|
||||||
|
|
||||||
await coordinator.async_config_entry_first_refresh()
|
coordinators = LaMarzoccoRuntimeData(
|
||||||
entry.runtime_data = coordinator
|
LaMarzoccoConfigUpdateCoordinator(hass, entry, device, local_client),
|
||||||
|
LaMarzoccoFirmwareUpdateCoordinator(hass, entry, device),
|
||||||
|
LaMarzoccoStatisticsUpdateCoordinator(hass, entry, device),
|
||||||
|
)
|
||||||
|
|
||||||
gateway_version = coordinator.device.firmware[FirmwareType.GATEWAY].current_version
|
# API does not like concurrent requests, so no asyncio.gather here
|
||||||
|
await coordinators.config_coordinator.async_config_entry_first_refresh()
|
||||||
|
await coordinators.firmware_coordinator.async_config_entry_first_refresh()
|
||||||
|
await coordinators.statistics_coordinator.async_config_entry_first_refresh()
|
||||||
|
|
||||||
|
entry.runtime_data = coordinators
|
||||||
|
|
||||||
|
gateway_version = device.firmware[FirmwareType.GATEWAY].current_version
|
||||||
if version.parse(gateway_version) < version.parse("v3.4-rc5"):
|
if version.parse(gateway_version) < version.parse("v3.4-rc5"):
|
||||||
# incompatible gateway firmware, create an issue
|
# incompatible gateway firmware, create an issue
|
||||||
ir.async_create_issue(
|
ir.async_create_issue(
|
||||||
|
@ -64,7 +64,7 @@ async def async_setup_entry(
|
|||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up binary sensor entities."""
|
"""Set up binary sensor entities."""
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
LaMarzoccoBinarySensorEntity(coordinator, description)
|
LaMarzoccoBinarySensorEntity(coordinator, description)
|
||||||
|
@ -57,7 +57,7 @@ async def async_setup_entry(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Set up button entities."""
|
"""Set up button entities."""
|
||||||
|
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
LaMarzoccoButtonEntity(coordinator, description)
|
LaMarzoccoButtonEntity(coordinator, description)
|
||||||
for description in ENTITIES
|
for description in ENTITIES
|
||||||
|
@ -36,7 +36,7 @@ async def async_setup_entry(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Set up switch entities and services."""
|
"""Set up switch entities and services."""
|
||||||
|
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
LaMarzoccoCalendarEntity(coordinator, CALENDAR_KEY, wake_up_sleep_entry)
|
LaMarzoccoCalendarEntity(coordinator, CALENDAR_KEY, wake_up_sleep_entry)
|
||||||
for wake_up_sleep_entry in coordinator.device.config.wake_up_sleep_entries.values()
|
for wake_up_sleep_entry in coordinator.device.config.wake_up_sleep_entries.values()
|
||||||
|
@ -2,20 +2,18 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Callable, Coroutine
|
from abc import abstractmethod
|
||||||
|
from dataclasses import dataclass
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
from time import time
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from pylamarzocco.clients.bluetooth import LaMarzoccoBluetoothClient
|
|
||||||
from pylamarzocco.clients.cloud import LaMarzoccoCloudClient
|
|
||||||
from pylamarzocco.clients.local import LaMarzoccoLocalClient
|
from pylamarzocco.clients.local import LaMarzoccoLocalClient
|
||||||
from pylamarzocco.devices.machine import LaMarzoccoMachine
|
from pylamarzocco.devices.machine import LaMarzoccoMachine
|
||||||
from pylamarzocco.exceptions import AuthFail, RequestNotSuccessful
|
from pylamarzocco.exceptions import AuthFail, RequestNotSuccessful
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import CONF_MODEL, CONF_NAME, EVENT_HOMEASSISTANT_STOP
|
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryAuthFailed
|
from homeassistant.exceptions import ConfigEntryAuthFailed
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
@ -23,26 +21,35 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda
|
|||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
|
|
||||||
SCAN_INTERVAL = timedelta(seconds=30)
|
SCAN_INTERVAL = timedelta(seconds=30)
|
||||||
FIRMWARE_UPDATE_INTERVAL = 3600
|
FIRMWARE_UPDATE_INTERVAL = timedelta(hours=1)
|
||||||
STATISTICS_UPDATE_INTERVAL = 300
|
STATISTICS_UPDATE_INTERVAL = timedelta(minutes=5)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
type LaMarzoccoConfigEntry = ConfigEntry[LaMarzoccoUpdateCoordinator]
|
|
||||||
|
@dataclass
|
||||||
|
class LaMarzoccoRuntimeData:
|
||||||
|
"""Runtime data for La Marzocco."""
|
||||||
|
|
||||||
|
config_coordinator: LaMarzoccoConfigUpdateCoordinator
|
||||||
|
firmware_coordinator: LaMarzoccoFirmwareUpdateCoordinator
|
||||||
|
statistics_coordinator: LaMarzoccoStatisticsUpdateCoordinator
|
||||||
|
|
||||||
|
|
||||||
|
type LaMarzoccoConfigEntry = ConfigEntry[LaMarzoccoRuntimeData]
|
||||||
|
|
||||||
|
|
||||||
class LaMarzoccoUpdateCoordinator(DataUpdateCoordinator[None]):
|
class LaMarzoccoUpdateCoordinator(DataUpdateCoordinator[None]):
|
||||||
"""Class to handle fetching data from the La Marzocco API centrally."""
|
"""Base class for La Marzocco coordinators."""
|
||||||
|
|
||||||
|
_default_update_interval = SCAN_INTERVAL
|
||||||
config_entry: LaMarzoccoConfigEntry
|
config_entry: LaMarzoccoConfigEntry
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
entry: LaMarzoccoConfigEntry,
|
entry: LaMarzoccoConfigEntry,
|
||||||
cloud_client: LaMarzoccoCloudClient,
|
device: LaMarzoccoMachine,
|
||||||
local_client: LaMarzoccoLocalClient | None,
|
local_client: LaMarzoccoLocalClient | None = None,
|
||||||
bluetooth_client: LaMarzoccoBluetoothClient | None,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize coordinator."""
|
"""Initialize coordinator."""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@ -50,24 +57,35 @@ class LaMarzoccoUpdateCoordinator(DataUpdateCoordinator[None]):
|
|||||||
_LOGGER,
|
_LOGGER,
|
||||||
config_entry=entry,
|
config_entry=entry,
|
||||||
name=DOMAIN,
|
name=DOMAIN,
|
||||||
update_interval=SCAN_INTERVAL,
|
update_interval=self._default_update_interval,
|
||||||
)
|
)
|
||||||
|
self.device = device
|
||||||
self.local_connection_configured = local_client is not None
|
self.local_connection_configured = local_client is not None
|
||||||
|
|
||||||
assert self.config_entry.unique_id
|
|
||||||
self.device = LaMarzoccoMachine(
|
|
||||||
model=self.config_entry.data[CONF_MODEL],
|
|
||||||
serial_number=self.config_entry.unique_id,
|
|
||||||
name=self.config_entry.data[CONF_NAME],
|
|
||||||
cloud_client=cloud_client,
|
|
||||||
local_client=local_client,
|
|
||||||
bluetooth_client=bluetooth_client,
|
|
||||||
)
|
|
||||||
|
|
||||||
self._last_firmware_data_update: float | None = None
|
|
||||||
self._last_statistics_data_update: float | None = None
|
|
||||||
self._local_client = local_client
|
self._local_client = local_client
|
||||||
|
|
||||||
|
async def _async_update_data(self) -> None:
|
||||||
|
"""Do the data update."""
|
||||||
|
try:
|
||||||
|
await self._internal_async_update_data()
|
||||||
|
except AuthFail as ex:
|
||||||
|
_LOGGER.debug("Authentication failed", exc_info=True)
|
||||||
|
raise ConfigEntryAuthFailed(
|
||||||
|
translation_domain=DOMAIN, translation_key="authentication_failed"
|
||||||
|
) from ex
|
||||||
|
except RequestNotSuccessful as ex:
|
||||||
|
_LOGGER.debug(ex, exc_info=True)
|
||||||
|
raise UpdateFailed(
|
||||||
|
translation_domain=DOMAIN, translation_key="api_error"
|
||||||
|
) from ex
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def _internal_async_update_data(self) -> None:
|
||||||
|
"""Actual data update logic."""
|
||||||
|
|
||||||
|
|
||||||
|
class LaMarzoccoConfigUpdateCoordinator(LaMarzoccoUpdateCoordinator):
|
||||||
|
"""Class to handle fetching data from the La Marzocco API centrally."""
|
||||||
|
|
||||||
async def _async_setup(self) -> None:
|
async def _async_setup(self) -> None:
|
||||||
"""Set up the coordinator."""
|
"""Set up the coordinator."""
|
||||||
if self._local_client is not None:
|
if self._local_client is not None:
|
||||||
@ -96,41 +114,29 @@ class LaMarzoccoUpdateCoordinator(DataUpdateCoordinator[None]):
|
|||||||
)
|
)
|
||||||
self.config_entry.async_on_unload(websocket_close)
|
self.config_entry.async_on_unload(websocket_close)
|
||||||
|
|
||||||
async def _async_update_data(self) -> None:
|
async def _internal_async_update_data(self) -> None:
|
||||||
"""Fetch data from API endpoint."""
|
"""Fetch data from API endpoint."""
|
||||||
await self._async_handle_request(self.device.get_config)
|
await self.device.get_config()
|
||||||
|
|
||||||
if (
|
|
||||||
self._last_firmware_data_update is None
|
|
||||||
or (self._last_firmware_data_update + FIRMWARE_UPDATE_INTERVAL) < time()
|
|
||||||
):
|
|
||||||
await self._async_handle_request(self.device.get_firmware)
|
|
||||||
self._last_firmware_data_update = time()
|
|
||||||
|
|
||||||
if (
|
|
||||||
self._last_statistics_data_update is None
|
|
||||||
or (self._last_statistics_data_update + STATISTICS_UPDATE_INTERVAL) < time()
|
|
||||||
):
|
|
||||||
await self._async_handle_request(self.device.get_statistics)
|
|
||||||
self._last_statistics_data_update = time()
|
|
||||||
|
|
||||||
_LOGGER.debug("Current status: %s", str(self.device.config))
|
_LOGGER.debug("Current status: %s", str(self.device.config))
|
||||||
|
|
||||||
async def _async_handle_request[**_P](
|
|
||||||
self,
|
class LaMarzoccoFirmwareUpdateCoordinator(LaMarzoccoUpdateCoordinator):
|
||||||
func: Callable[_P, Coroutine[None, None, None]],
|
"""Coordinator for La Marzocco firmware."""
|
||||||
*args: _P.args,
|
|
||||||
**kwargs: _P.kwargs,
|
_default_update_interval = FIRMWARE_UPDATE_INTERVAL
|
||||||
) -> None:
|
|
||||||
try:
|
async def _internal_async_update_data(self) -> None:
|
||||||
await func(*args, **kwargs)
|
"""Fetch data from API endpoint."""
|
||||||
except AuthFail as ex:
|
await self.device.get_firmware()
|
||||||
_LOGGER.debug("Authentication failed", exc_info=True)
|
_LOGGER.debug("Current firmware: %s", str(self.device.firmware))
|
||||||
raise ConfigEntryAuthFailed(
|
|
||||||
translation_domain=DOMAIN, translation_key="authentication_failed"
|
|
||||||
) from ex
|
class LaMarzoccoStatisticsUpdateCoordinator(LaMarzoccoUpdateCoordinator):
|
||||||
except RequestNotSuccessful as ex:
|
"""Coordinator for La Marzocco statistics."""
|
||||||
_LOGGER.debug(ex, exc_info=True)
|
|
||||||
raise UpdateFailed(
|
_default_update_interval = STATISTICS_UPDATE_INTERVAL
|
||||||
translation_domain=DOMAIN, translation_key="api_error"
|
|
||||||
) from ex
|
async def _internal_async_update_data(self) -> None:
|
||||||
|
"""Fetch data from API endpoint."""
|
||||||
|
await self.device.get_statistics()
|
||||||
|
_LOGGER.debug("Current statistics: %s", str(self.device.statistics))
|
||||||
|
@ -31,7 +31,7 @@ async def async_get_config_entry_diagnostics(
|
|||||||
entry: LaMarzoccoConfigEntry,
|
entry: LaMarzoccoConfigEntry,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
"""Return diagnostics for a config entry."""
|
"""Return diagnostics for a config entry."""
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
device = coordinator.device
|
device = coordinator.device
|
||||||
# collect all data sources
|
# collect all data sources
|
||||||
diagnostics_data = DiagnosticsData(
|
diagnostics_data = DiagnosticsData(
|
||||||
|
@ -210,7 +210,7 @@ async def async_setup_entry(
|
|||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up number entities."""
|
"""Set up number entities."""
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
entities: list[NumberEntity] = [
|
entities: list[NumberEntity] = [
|
||||||
LaMarzoccoNumberEntity(coordinator, description)
|
LaMarzoccoNumberEntity(coordinator, description)
|
||||||
for description in ENTITIES
|
for description in ENTITIES
|
||||||
|
@ -107,7 +107,7 @@ async def async_setup_entry(
|
|||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up select entities."""
|
"""Set up select entities."""
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
LaMarzoccoSelectEntity(coordinator, description)
|
LaMarzoccoSelectEntity(coordinator, description)
|
||||||
|
@ -33,24 +33,6 @@ class LaMarzoccoSensorEntityDescription(
|
|||||||
|
|
||||||
|
|
||||||
ENTITIES: tuple[LaMarzoccoSensorEntityDescription, ...] = (
|
ENTITIES: tuple[LaMarzoccoSensorEntityDescription, ...] = (
|
||||||
LaMarzoccoSensorEntityDescription(
|
|
||||||
key="drink_stats_coffee",
|
|
||||||
translation_key="drink_stats_coffee",
|
|
||||||
native_unit_of_measurement="drinks",
|
|
||||||
state_class=SensorStateClass.TOTAL_INCREASING,
|
|
||||||
value_fn=lambda device: device.statistics.drink_stats.get(PhysicalKey.A, 0),
|
|
||||||
available_fn=lambda device: len(device.statistics.drink_stats) > 0,
|
|
||||||
entity_category=EntityCategory.DIAGNOSTIC,
|
|
||||||
),
|
|
||||||
LaMarzoccoSensorEntityDescription(
|
|
||||||
key="drink_stats_flushing",
|
|
||||||
translation_key="drink_stats_flushing",
|
|
||||||
native_unit_of_measurement="drinks",
|
|
||||||
state_class=SensorStateClass.TOTAL_INCREASING,
|
|
||||||
value_fn=lambda device: device.statistics.total_flushes,
|
|
||||||
available_fn=lambda device: len(device.statistics.drink_stats) > 0,
|
|
||||||
entity_category=EntityCategory.DIAGNOSTIC,
|
|
||||||
),
|
|
||||||
LaMarzoccoSensorEntityDescription(
|
LaMarzoccoSensorEntityDescription(
|
||||||
key="shot_timer",
|
key="shot_timer",
|
||||||
translation_key="shot_timer",
|
translation_key="shot_timer",
|
||||||
@ -88,6 +70,27 @@ ENTITIES: tuple[LaMarzoccoSensorEntityDescription, ...] = (
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
STATISTIC_ENTITIES: tuple[LaMarzoccoSensorEntityDescription, ...] = (
|
||||||
|
LaMarzoccoSensorEntityDescription(
|
||||||
|
key="drink_stats_coffee",
|
||||||
|
translation_key="drink_stats_coffee",
|
||||||
|
native_unit_of_measurement="drinks",
|
||||||
|
state_class=SensorStateClass.TOTAL_INCREASING,
|
||||||
|
value_fn=lambda device: device.statistics.drink_stats.get(PhysicalKey.A, 0),
|
||||||
|
available_fn=lambda device: len(device.statistics.drink_stats) > 0,
|
||||||
|
entity_category=EntityCategory.DIAGNOSTIC,
|
||||||
|
),
|
||||||
|
LaMarzoccoSensorEntityDescription(
|
||||||
|
key="drink_stats_flushing",
|
||||||
|
translation_key="drink_stats_flushing",
|
||||||
|
native_unit_of_measurement="drinks",
|
||||||
|
state_class=SensorStateClass.TOTAL_INCREASING,
|
||||||
|
value_fn=lambda device: device.statistics.total_flushes,
|
||||||
|
available_fn=lambda device: len(device.statistics.drink_stats) > 0,
|
||||||
|
entity_category=EntityCategory.DIAGNOSTIC,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
@ -95,14 +98,23 @@ async def async_setup_entry(
|
|||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up sensor entities."""
|
"""Set up sensor entities."""
|
||||||
coordinator = entry.runtime_data
|
config_coordinator = entry.runtime_data.config_coordinator
|
||||||
|
|
||||||
async_add_entities(
|
entities = [
|
||||||
LaMarzoccoSensorEntity(coordinator, description)
|
LaMarzoccoSensorEntity(config_coordinator, description)
|
||||||
for description in ENTITIES
|
for description in ENTITIES
|
||||||
if description.supported_fn(coordinator)
|
if description.supported_fn(config_coordinator)
|
||||||
|
]
|
||||||
|
|
||||||
|
statistics_coordinator = entry.runtime_data.statistics_coordinator
|
||||||
|
entities.extend(
|
||||||
|
LaMarzoccoSensorEntity(statistics_coordinator, description)
|
||||||
|
for description in STATISTIC_ENTITIES
|
||||||
|
if description.supported_fn(statistics_coordinator)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async_add_entities(entities)
|
||||||
|
|
||||||
|
|
||||||
class LaMarzoccoSensorEntity(LaMarzoccoEntity, SensorEntity):
|
class LaMarzoccoSensorEntity(LaMarzoccoEntity, SensorEntity):
|
||||||
"""Sensor representing espresso machine temperature data."""
|
"""Sensor representing espresso machine temperature data."""
|
||||||
|
@ -68,7 +68,7 @@ async def async_setup_entry(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Set up switch entities and services."""
|
"""Set up switch entities and services."""
|
||||||
|
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.config_coordinator
|
||||||
|
|
||||||
entities: list[SwitchEntity] = []
|
entities: list[SwitchEntity] = []
|
||||||
entities.extend(
|
entities.extend(
|
||||||
|
@ -59,7 +59,7 @@ async def async_setup_entry(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Create update entities."""
|
"""Create update entities."""
|
||||||
|
|
||||||
coordinator = entry.runtime_data
|
coordinator = entry.runtime_data.firmware_coordinator
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
LaMarzoccoUpdateEntity(coordinator, description)
|
LaMarzoccoUpdateEntity(coordinator, description)
|
||||||
for description in ENTITIES
|
for description in ENTITIES
|
||||||
|
@ -143,7 +143,7 @@ def mock_lamarzocco(device_fixture: MachineModel) -> Generator[MagicMock]:
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
patch(
|
patch(
|
||||||
"homeassistant.components.lamarzocco.coordinator.LaMarzoccoMachine",
|
"homeassistant.components.lamarzocco.LaMarzoccoMachine",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as lamarzocco_mock,
|
) as lamarzocco_mock,
|
||||||
):
|
):
|
||||||
|
@ -174,9 +174,7 @@ async def test_bluetooth_is_set_from_discovery(
|
|||||||
"homeassistant.components.lamarzocco.async_discovered_service_info",
|
"homeassistant.components.lamarzocco.async_discovered_service_info",
|
||||||
return_value=[service_info],
|
return_value=[service_info],
|
||||||
) as discovery,
|
) as discovery,
|
||||||
patch(
|
patch("homeassistant.components.lamarzocco.LaMarzoccoMachine") as init_device,
|
||||||
"homeassistant.components.lamarzocco.coordinator.LaMarzoccoMachine"
|
|
||||||
) as init_device,
|
|
||||||
):
|
):
|
||||||
await async_init_integration(hass, mock_config_entry)
|
await async_init_integration(hass, mock_config_entry)
|
||||||
discovery.assert_called_once()
|
discovery.assert_called_once()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user