Files
motion_light/custom_components/switch.py
T

148 lines
5.8 KiB
Python

"""Switch platform for Motion Light."""
import logging
from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import STATE_ON
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.helpers.restore_state import RestoreEntity
from homeassistant.helpers.device_registry import DeviceInfo
from .const import DOMAIN, ENTITY_RESPECT_MANUAL, DEFAULT_RESPECT_MANUAL
_LOGGER = logging.getLogger(__name__)
class PrefixLoggerAdapter(logging.LoggerAdapter):
"""Logger adapter that adds a prefix to log messages."""
def process(self, msg, kwargs):
"""Add prefix to the log message."""
return f"[{self.extra.get('name', 'Unknown')}] {msg}", kwargs
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up Motion Light switches."""
coordinator = hass.data[DOMAIN][entry.entry_id]
async_add_entities([
MotionLightEnabledSwitch(coordinator, entry),
MotionLightRespectManualSwitch(coordinator, entry),
])
class MotionLightEnabledSwitch(CoordinatorEntity, SwitchEntity, RestoreEntity):
"""Representation of a Motion Light enabled switch."""
_attr_translation_key = "motion_light_enabled"
_attr_has_entity_name = True
def __init__(self, coordinator, entry):
"""Initialize the switch."""
super().__init__(coordinator)
self.entry = entry
self.logger = PrefixLoggerAdapter(_LOGGER, {"name": entry.title})
self._attr_unique_id = f"{entry.entry_id}_enabled"
self._attr_icon = "mdi:lightbulb-auto"
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, entry.entry_id)},
name=entry.title,
manufacturer="Motion Light",
model="Switch Control Integration",
)
@property
def is_on(self) -> bool:
"""Return True if integration is enabled."""
return self.coordinator.is_enabled
async def async_turn_on(self, **kwargs) -> None:
"""Turn on integration."""
self.logger.info("Switch turned ON, enabling integration")
await self.coordinator.set_enabled(True)
self.async_write_ha_state()
async def async_turn_off(self, **kwargs) -> None:
"""Turn off integration."""
self.logger.info("Switch turned OFF, disabling integration")
await self.coordinator.set_enabled(False)
self.async_write_ha_state()
async def async_added_to_hass(self) -> None:
"""Handle entity which will be added."""
await super().async_added_to_hass()
last_state = await self.async_get_last_state()
if last_state is not None:
is_enabled = last_state.state == STATE_ON
self.logger.info("Restored enabled switch state: %s", last_state.state)
if self.coordinator.is_enabled != is_enabled:
await self.coordinator.set_enabled(is_enabled)
self.async_write_ha_state()
else:
self.logger.info("Enabled switch added for the first time, defaulting to enabled")
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
self.async_write_ha_state()
class MotionLightRespectManualSwitch(CoordinatorEntity, SwitchEntity, RestoreEntity):
"""Representation of a Motion Light respect_manual switch."""
_attr_translation_key = "motion_light_priority_manual"
_attr_has_entity_name = True
def __init__(self, coordinator, entry):
"""Initialize the switch."""
super().__init__(coordinator)
self.entry = entry
self.logger = PrefixLoggerAdapter(_LOGGER, {"name": entry.title})
self._attr_unique_id = f"{entry.entry_id}_{ENTITY_RESPECT_MANUAL}"
self._attr_icon = "mdi:hand-back-left"
self._is_on = DEFAULT_RESPECT_MANUAL
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, entry.entry_id)},
name=entry.title,
manufacturer="Motion Light",
model="Switch Control Integration",
)
@property
def is_on(self) -> bool:
"""Return True if respect_manual is enabled."""
return self._is_on
async def async_turn_on(self, **kwargs) -> None:
"""Turn on respect_manual."""
self.logger.info("Respect manual turned ON")
self._is_on = True
self.coordinator.set_respect_manual(True)
self.async_write_ha_state()
async def async_turn_off(self, **kwargs) -> None:
"""Turn off respect_manual."""
self.logger.info("Respect manual turned OFF")
self._is_on = False
self.coordinator.set_respect_manual(False)
self.async_write_ha_state()
async def async_added_to_hass(self) -> None:
"""Handle entity which will be added."""
await super().async_added_to_hass()
last_state = await self.async_get_last_state()
if last_state is not None:
self._is_on = last_state.state == STATE_ON
self.logger.info("Restored respect_manual state: %s", last_state.state)
self.coordinator.set_respect_manual(self._is_on)
self.async_write_ha_state()
else:
self.logger.info("Respect manual switch added for the first time, defaulting to %s", self._is_on)
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
self.async_write_ha_state()