2017-10-06 03:55:19 +00:00
|
|
|
"""Icon helper methods."""
|
2021-03-17 17:34:19 +00:00
|
|
|
from __future__ import annotations
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
|
2024-01-19 15:56:56 +00:00
|
|
|
import asyncio
|
|
|
|
from collections.abc import Iterable
|
2023-10-18 05:35:39 +00:00
|
|
|
from functools import lru_cache
|
2024-01-19 15:56:56 +00:00
|
|
|
import logging
|
|
|
|
from typing import Any
|
|
|
|
|
|
|
|
from homeassistant.core import HomeAssistant, callback
|
|
|
|
from homeassistant.loader import Integration, async_get_integrations
|
|
|
|
from homeassistant.util.json import load_json_object
|
|
|
|
|
|
|
|
from .translation import build_resources
|
|
|
|
|
|
|
|
ICON_CACHE = "icon_cache"
|
|
|
|
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
@callback
|
|
|
|
def _component_icons_path(component: str, integration: Integration) -> str | None:
|
|
|
|
"""Return the icons json file location for a component.
|
|
|
|
|
|
|
|
Ex: components/hue/icons.json
|
|
|
|
If component is just a single file, will return None.
|
|
|
|
"""
|
|
|
|
domain = component.rpartition(".")[-1]
|
|
|
|
|
|
|
|
# If it's a component that is just one file, we don't support icons
|
|
|
|
# Example custom_components/my_component.py
|
|
|
|
if integration.file_path.name != domain:
|
|
|
|
return None
|
|
|
|
|
|
|
|
return str(integration.file_path / "icons.json")
|
|
|
|
|
|
|
|
|
|
|
|
def _load_icons_files(icons_files: dict[str, str]) -> dict[str, dict[str, Any]]:
|
|
|
|
"""Load and parse icons.json files."""
|
|
|
|
return {
|
|
|
|
component: load_json_object(icons_file)
|
|
|
|
for component, icons_file in icons_files.items()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async def _async_get_component_icons(
|
|
|
|
hass: HomeAssistant,
|
|
|
|
components: set[str],
|
|
|
|
integrations: dict[str, Integration],
|
|
|
|
) -> dict[str, Any]:
|
|
|
|
"""Load icons."""
|
|
|
|
icons: dict[str, Any] = {}
|
|
|
|
|
|
|
|
# Determine files to load
|
|
|
|
files_to_load = {}
|
|
|
|
for loaded in components:
|
|
|
|
domain = loaded.rpartition(".")[-1]
|
|
|
|
if (path := _component_icons_path(loaded, integrations[domain])) is None:
|
|
|
|
icons[loaded] = {}
|
|
|
|
else:
|
|
|
|
files_to_load[loaded] = path
|
|
|
|
|
|
|
|
# Load files
|
|
|
|
if files_to_load and (
|
|
|
|
load_icons_job := hass.async_add_executor_job(_load_icons_files, files_to_load)
|
|
|
|
):
|
|
|
|
icons |= await load_icons_job
|
|
|
|
|
|
|
|
return icons
|
|
|
|
|
|
|
|
|
|
|
|
class _IconsCache:
|
|
|
|
"""Cache for icons."""
|
|
|
|
|
2024-02-02 07:58:55 +00:00
|
|
|
__slots__ = ("_hass", "_loaded", "_cache", "_lock")
|
2024-01-19 15:56:56 +00:00
|
|
|
|
|
|
|
def __init__(self, hass: HomeAssistant) -> None:
|
|
|
|
"""Initialize the cache."""
|
|
|
|
self._hass = hass
|
|
|
|
self._loaded: set[str] = set()
|
|
|
|
self._cache: dict[str, dict[str, Any]] = {}
|
2024-02-02 07:58:55 +00:00
|
|
|
self._lock = asyncio.Lock()
|
2024-01-19 15:56:56 +00:00
|
|
|
|
|
|
|
async def async_fetch(
|
|
|
|
self,
|
|
|
|
category: str,
|
|
|
|
components: set[str],
|
|
|
|
) -> dict[str, dict[str, Any]]:
|
|
|
|
"""Load resources into the cache."""
|
|
|
|
if components_to_load := components - self._loaded:
|
2024-02-02 07:58:55 +00:00
|
|
|
# Icons are never unloaded so if there are no components to load
|
|
|
|
# we can skip the lock which reduces contention
|
|
|
|
async with self._lock:
|
|
|
|
# Check components to load again, as another task might have loaded
|
|
|
|
# them while we were waiting for the lock.
|
|
|
|
if components_to_load := components - self._loaded:
|
|
|
|
await self._async_load(components_to_load)
|
2024-01-19 15:56:56 +00:00
|
|
|
|
|
|
|
return {
|
|
|
|
component: result
|
|
|
|
for component in components
|
|
|
|
if (result := self._cache.get(category, {}).get(component))
|
|
|
|
}
|
|
|
|
|
|
|
|
async def _async_load(self, components: set[str]) -> None:
|
|
|
|
"""Populate the cache for a given set of components."""
|
2024-02-16 15:51:14 +00:00
|
|
|
_LOGGER.debug("Cache miss for: %s", components)
|
2024-01-19 15:56:56 +00:00
|
|
|
|
|
|
|
integrations: dict[str, Integration] = {}
|
2024-02-15 22:33:24 +00:00
|
|
|
domains = {loaded.rpartition(".")[-1] for loaded in components}
|
2024-01-19 15:56:56 +00:00
|
|
|
ints_or_excs = await async_get_integrations(self._hass, domains)
|
|
|
|
for domain, int_or_exc in ints_or_excs.items():
|
|
|
|
if isinstance(int_or_exc, Exception):
|
|
|
|
raise int_or_exc
|
|
|
|
integrations[domain] = int_or_exc
|
|
|
|
|
|
|
|
icons = await _async_get_component_icons(self._hass, components, integrations)
|
|
|
|
|
|
|
|
self._build_category_cache(components, icons)
|
|
|
|
self._loaded.update(components)
|
|
|
|
|
|
|
|
@callback
|
|
|
|
def _build_category_cache(
|
|
|
|
self,
|
|
|
|
components: set[str],
|
|
|
|
icons: dict[str, dict[str, Any]],
|
|
|
|
) -> None:
|
|
|
|
"""Extract resources into the cache."""
|
|
|
|
categories: set[str] = set()
|
2024-02-16 15:51:14 +00:00
|
|
|
|
2024-01-19 15:56:56 +00:00
|
|
|
for resource in icons.values():
|
|
|
|
categories.update(resource)
|
|
|
|
|
|
|
|
for category in categories:
|
2024-02-16 15:51:14 +00:00
|
|
|
self._cache.setdefault(category, {}).update(
|
|
|
|
build_resources(icons, components, category)
|
|
|
|
)
|
2024-01-19 15:56:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def async_get_icons(
|
|
|
|
hass: HomeAssistant,
|
|
|
|
category: str,
|
|
|
|
integrations: Iterable[str] | None = None,
|
|
|
|
) -> dict[str, Any]:
|
|
|
|
"""Return all icons of integrations.
|
|
|
|
|
|
|
|
If integration specified, load it for that one; otherwise default to loaded
|
2024-02-02 07:58:55 +00:00
|
|
|
integrations.
|
2024-01-19 15:56:56 +00:00
|
|
|
"""
|
|
|
|
if integrations:
|
|
|
|
components = set(integrations)
|
|
|
|
else:
|
|
|
|
components = {
|
|
|
|
component for component in hass.config.components if "." not in component
|
|
|
|
}
|
2024-02-02 07:58:55 +00:00
|
|
|
|
|
|
|
if ICON_CACHE in hass.data:
|
|
|
|
cache: _IconsCache = hass.data[ICON_CACHE]
|
|
|
|
else:
|
|
|
|
cache = hass.data[ICON_CACHE] = _IconsCache(hass)
|
2024-01-19 15:56:56 +00:00
|
|
|
|
|
|
|
return await cache.async_fetch(category, components)
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
|
2023-10-18 05:35:39 +00:00
|
|
|
|
|
|
|
@lru_cache
|
2019-07-31 19:25:30 +00:00
|
|
|
def icon_for_battery_level(
|
2021-03-17 17:34:19 +00:00
|
|
|
battery_level: int | None = None, charging: bool = False
|
2019-07-31 19:25:30 +00:00
|
|
|
) -> str:
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
"""Return a battery icon valid identifier."""
|
2019-07-31 19:25:30 +00:00
|
|
|
icon = "mdi:battery"
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
if battery_level is None:
|
2020-01-03 13:47:06 +00:00
|
|
|
return f"{icon}-unknown"
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
if charging and battery_level > 10:
|
2021-04-09 16:58:27 +00:00
|
|
|
icon += f"-charging-{int(round(battery_level / 20 - 0.01)) * 20}"
|
2017-10-06 03:55:19 +00:00
|
|
|
elif charging:
|
2019-07-31 19:25:30 +00:00
|
|
|
icon += "-outline"
|
2017-10-06 03:55:19 +00:00
|
|
|
elif battery_level <= 5:
|
2019-07-31 19:25:30 +00:00
|
|
|
icon += "-alert"
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
elif 5 < battery_level < 95:
|
2021-04-09 16:58:27 +00:00
|
|
|
icon += f"-{int(round(battery_level / 10 - 0.01)) * 10}"
|
Xiaomi vacuum as platform of new `vacuum` component derived from ToggleEntity, and services (#8623)
* Xiaomi vacuum as component with switch, sensors and services
- Conversion from switch platform to async component.
- Add services proposed in #8416 to the new component, with shorter names.
- Add sensors for the vacuum robot as a selectable list from `battery`, `state`, `error`, `fanspeed`, `clean_time` and `clean_area` (the state attributes of the switch). The sensors don't poll, but listen to a signal to update the state, the switch fires this signal when updating.
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
* path change in requirements_all (from switch platform to component)
* copy pasting is a bad habit
* services to the components services.yaml, modify .coveragerc
* review: use with multiple hosts, fix calls to async_add_devices, fix ranges for services
* `icon_for_battery_level` util method
* Xiaomi vacuum as platform of new component vacuum
- Created new component `vacuum` from a ToggleEntity.
- Add services `turn_on`, `turn_off`, `cleaning_play_pause`, `stop`, `return_to_base`, `locate`, `set_fanspeed` and `send_command`.
- Remove the main switch for the xiaomi vacuum (the toggable main entity is the switch).
- Add `support flags` for the common services
- Assign default icons to sensors and the switch (`mdi:google-circles-group` looks like the robot!)
- Move services descriptions to a yaml file for the new component.
- Update requirements_all.
- Update coveragerc.
* fix coveragerc
* fix battery icon helper to use more icons
* remove sensors, create properties and support flags for custom UI
* cleaning
* updated state_attrs for filtering in UI, renamed platform to simply `xiaomi`
* fix platform rename
* change fanspeed and expose `fanspeed_list` to use speed steps
* minor fixes
- Rename service `start_pause`
- Add 'Error' attribute only if `got_error`.
- Minor changes
* rename state attrs
* rename state attrs
* review changes: cut fan__speed, style changes, remove logging, and more
* add ATTR_COMMAND = 'command' to const
* pop entity_id from service data
* remove property accessor for vacuum object
* lint fix
* fix extra attrs names
* module level functions for calling the services
* params as optional keyword for `send_command`
* params as optional keyword for `send_command`, remove debug logs
* explicit parameters for `set_fan_speed` and `send_command`
* Demo platform for the vacuum component
* vacuum tests for the Demo platform
* some fixes
* don't omit vacuum
* vacuum tests for the Xiaomi platform
* fix test
* fix
* fix xiaomi test
* fix coveragerc
* test send command
* fix coveragerc
* fix string formatting
* The coverage is to low. It need 93% or more
2017-08-04 13:27:10 +00:00
|
|
|
return icon
|
2019-11-26 19:17:11 +00:00
|
|
|
|
|
|
|
|
2021-03-17 17:34:19 +00:00
|
|
|
def icon_for_signal_level(signal_level: int | None = None) -> str:
|
2019-11-26 19:17:11 +00:00
|
|
|
"""Return a signal icon valid identifier."""
|
|
|
|
if signal_level is None or signal_level == 0:
|
|
|
|
return "mdi:signal-cellular-outline"
|
|
|
|
if signal_level > 70:
|
|
|
|
return "mdi:signal-cellular-3"
|
|
|
|
if signal_level > 30:
|
|
|
|
return "mdi:signal-cellular-2"
|
|
|
|
return "mdi:signal-cellular-1"
|