"""Shelly helpers functions.""" from datetime import datetime, timedelta import logging from typing import Optional import aioshelly from homeassistant.components.sensor import DEVICE_CLASS_TIMESTAMP from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT from homeassistant.helpers import entity_registry from . import ShellyDeviceWrapper _LOGGER = logging.getLogger(__name__) async def async_remove_entity_by_domain(hass, domain, unique_id, config_entry_id): """Remove entity by domain.""" entity_reg = await hass.helpers.entity_registry.async_get_registry() for entry in entity_registry.async_entries_for_config_entry( entity_reg, config_entry_id ): if entry.domain == domain and entry.unique_id == unique_id: entity_reg.async_remove(entry.entity_id) _LOGGER.debug("Removed %s domain for %s", domain, entry.original_name) break def temperature_unit(block_info: dict) -> str: """Detect temperature unit.""" if block_info[aioshelly.BLOCK_VALUE_UNIT] == "F": return TEMP_FAHRENHEIT return TEMP_CELSIUS def get_entity_name( wrapper: ShellyDeviceWrapper, block: aioshelly.Block, description: Optional[str] = None, ): """Naming for switch and sensors.""" entity_name = wrapper.name if block: channels = None if block.type == "input": channels = wrapper.device.shelly.get("num_inputs") elif block.type == "emeter": channels = wrapper.device.shelly.get("num_emeters") elif block.type in ["relay", "light"]: channels = wrapper.device.shelly.get("num_outputs") elif block.type in ["roller", "device"]: channels = 1 channels = channels or 1 if channels > 1 and block.type != "device": entity_name = None mode = block.type + "s" if mode in wrapper.device.settings: entity_name = wrapper.device.settings[mode][int(block.channel)].get( "name" ) if not entity_name: if wrapper.model == "SHEM-3": base = ord("A") else: base = ord("1") entity_name = f"{wrapper.name} channel {chr(int(block.channel)+base)}" # Shelly Dimmer has two input channels and missing "num_inputs" if wrapper.model in ["SHDM-1", "SHDM-2"] and block.type == "input": entity_name = f"{entity_name} channel {int(block.channel)+1}" if description: entity_name = f"{entity_name} {description}" return entity_name def get_rest_value_from_path(status, device_class, path: str): """Parser for REST path from device status.""" if "/" not in path: _attribute_value = status[path] else: _attribute_value = status[path.split("/")[0]][path.split("/")[1]] if device_class == DEVICE_CLASS_TIMESTAMP: last_boot = datetime.utcnow() - timedelta(seconds=_attribute_value) _attribute_value = last_boot.replace(microsecond=0).isoformat() if "new_version" in path: _attribute_value = _attribute_value.split("/")[1].split("@")[0] return _attribute_value