Add madvr envy integration (#120382)
* feat: Add madvr envy
* fix: await and pass entry directly
* fix: add attributes and unique id for sensors
* fix: reflect power state well, improve state detection
* fix: don't connect on init, add options, add reload on change, keep on during test
* fix: cancel tasks on unload
* fix: test connection via library
* fix: wait for boot time
* docs: add readme and license
* fix: broken pipe in lib
* fix: detect out of band power off
* fix: improve extra attributes
* fix: fix unloading, add config flow test, limit to one platform
* fix: use conf, refresh coordinator, other comments
* fix: remove event data
* fix: fix tests passing, remove wake on lan
* fix: dont allow to proceed unless connection works
* chore: update dep
* fix: update config flow, add constants
* fix: write state, use runtime data instead
* fix: remove await
* fix: move unloading and stuff to coordinator/init
* fix: pass in config entry with correct type
* fix: move queue and tasks to library
* fix: config flow error flow, tests, name, and update lib
* fix: update lib, leave connection open on setup
* fix: update lib
* fix: address comments, remove wol from lib
* fix: remove unneeded options
* fix: remove fields
* fix: simplify code, address comments
* fix: move error to lib
* fix: fix test
* fix: stronger types
* fix: update lib
* fix: missing text from options flow
* chore: remove options flow
* chore: remove import
* chore: update comments
* fix: get mac from device, persist
* fix: add mac stuff to test
* fix: startup import errors
* chore: stale comment
* fix: get mac from persisted config
* chore: update lib
* fix: persist mac in a better way
* feat: use mac as unique ID for entry
* fix: use unique ID from mac, add proper device
* fix: will not be set in init potentially
* fix: access mac
* fix: optimize, move error to lib
* feat: add coordinator test, use conf
* fix: use one mock, add init test
* fix: not async
* feat: add remote test
* fix: types
* fix: patch client, expand remote tests
* fix: use snapshot test
* fix: update branding
* fix: add description, fix type check
* fix: update tests
* fix: test
* fix: update test
* fix: camelcase
* Fix
* feat: strict typing
* fix: strict typing in lib
* fix: type will never be None
* fix: reference to mac, all tests passing
---------
Co-authored-by: Joostlek <joostlek@outlook.com>
2024-07-07 18:41:53 +00:00
|
|
|
"""Coordinator for handling data fetching and updates."""
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
import logging
|
|
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
|
|
|
|
from madvr.madvr import Madvr
|
|
|
|
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
|
|
|
|
|
|
|
from .const import DOMAIN
|
|
|
|
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
from . import MadVRConfigEntry
|
|
|
|
|
|
|
|
|
|
|
|
class MadVRCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|
|
|
"""Madvr coordinator for Envy (push-based API)."""
|
|
|
|
|
|
|
|
config_entry: MadVRConfigEntry
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
hass: HomeAssistant,
|
|
|
|
client: Madvr,
|
|
|
|
) -> None:
|
|
|
|
"""Initialize madvr coordinator."""
|
|
|
|
super().__init__(hass, _LOGGER, name=DOMAIN)
|
|
|
|
assert self.config_entry.unique_id
|
|
|
|
self.mac = self.config_entry.unique_id
|
|
|
|
self.client = client
|
2024-07-09 17:11:08 +00:00
|
|
|
# this does not use poll/refresh, so we need to set this to not None on init
|
|
|
|
self.data = {}
|
|
|
|
# this passes a callback to the client to push new data to the coordinator
|
Add madvr envy integration (#120382)
* feat: Add madvr envy
* fix: await and pass entry directly
* fix: add attributes and unique id for sensors
* fix: reflect power state well, improve state detection
* fix: don't connect on init, add options, add reload on change, keep on during test
* fix: cancel tasks on unload
* fix: test connection via library
* fix: wait for boot time
* docs: add readme and license
* fix: broken pipe in lib
* fix: detect out of band power off
* fix: improve extra attributes
* fix: fix unloading, add config flow test, limit to one platform
* fix: use conf, refresh coordinator, other comments
* fix: remove event data
* fix: fix tests passing, remove wake on lan
* fix: dont allow to proceed unless connection works
* chore: update dep
* fix: update config flow, add constants
* fix: write state, use runtime data instead
* fix: remove await
* fix: move unloading and stuff to coordinator/init
* fix: pass in config entry with correct type
* fix: move queue and tasks to library
* fix: config flow error flow, tests, name, and update lib
* fix: update lib, leave connection open on setup
* fix: update lib
* fix: address comments, remove wol from lib
* fix: remove unneeded options
* fix: remove fields
* fix: simplify code, address comments
* fix: move error to lib
* fix: fix test
* fix: stronger types
* fix: update lib
* fix: missing text from options flow
* chore: remove options flow
* chore: remove import
* chore: update comments
* fix: get mac from device, persist
* fix: add mac stuff to test
* fix: startup import errors
* chore: stale comment
* fix: get mac from persisted config
* chore: update lib
* fix: persist mac in a better way
* feat: use mac as unique ID for entry
* fix: use unique ID from mac, add proper device
* fix: will not be set in init potentially
* fix: access mac
* fix: optimize, move error to lib
* feat: add coordinator test, use conf
* fix: use one mock, add init test
* fix: not async
* feat: add remote test
* fix: types
* fix: patch client, expand remote tests
* fix: use snapshot test
* fix: update branding
* fix: add description, fix type check
* fix: update tests
* fix: test
* fix: update test
* fix: camelcase
* Fix
* feat: strict typing
* fix: strict typing in lib
* fix: type will never be None
* fix: reference to mac, all tests passing
---------
Co-authored-by: Joostlek <joostlek@outlook.com>
2024-07-07 18:41:53 +00:00
|
|
|
self.client.set_update_callback(self.handle_push_data)
|
|
|
|
_LOGGER.debug("MadVRCoordinator initialized with mac: %s", self.mac)
|
|
|
|
|
|
|
|
def handle_push_data(self, data: dict[str, Any]) -> None:
|
|
|
|
"""Handle new data pushed from the API."""
|
|
|
|
_LOGGER.debug("Received push data: %s", data)
|
|
|
|
# inform HA that we have new data
|
|
|
|
self.async_set_updated_data(data)
|
|
|
|
|
|
|
|
async def handle_coordinator_load(self) -> None:
|
|
|
|
"""Handle operations on integration load."""
|
|
|
|
_LOGGER.debug("Using loop: %s", self.client.loop)
|
|
|
|
# tell the library to start background tasks
|
|
|
|
await self.client.async_add_tasks()
|
|
|
|
_LOGGER.debug("Added %s tasks to client", len(self.client.tasks))
|