| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- """
- Platform to control Tuya switches.
- Initially based on the Kogan Switch and secondary switch for Purline M100
- heater open window detector toggle.
- """
- from homeassistant.components.switch import SwitchEntity
- from homeassistant.components.switch import (
- ATTR_CURRENT_POWER_W,
- DEVICE_CLASS_OUTLET,
- DEVICE_CLASS_SWITCH,
- )
- from homeassistant.const import STATE_UNAVAILABLE
- from ..device import TuyaLocalDevice
- from ..helpers.device_config import TuyaEntityConfig
- class TuyaLocalSwitch(SwitchEntity):
- """Representation of a Tuya Switch"""
- def __init__(self, device: TuyaLocalDevice, config: TuyaEntityConfig):
- """
- Initialize the switch.
- Args:
- device (TuyaLocalDevice): The device API instance.
- """
- self._device = device
- self._config = config
- self._attr_dps = []
- dps_map = {c.name: c for c in config.dps()}
- self._switch_dps = dps_map.pop("switch")
- self._power_dps = dps_map.get("current_power_w", None)
- for d in dps_map.values():
- if not d.hidden:
- self._attr_dps.append(d)
- @property
- def should_poll(self):
- """Return the polling state."""
- return True
- @property
- def name(self):
- """Return the name of the device."""
- return self._device.name
- @property
- def friendly_name(self):
- """Return the friendly name for this entity."""
- return self._config.name
- @property
- def unique_id(self):
- """Return the unique id of the device."""
- return self._device.unique_id
- @property
- def device_info(self):
- """Return device information about the device."""
- return self._device.device_info
- @property
- def device_class(self):
- """Return the class of this device"""
- return (
- DEVICE_CLASS_OUTLET
- if self._config.device_class == "outlet"
- else DEVICE_CLASS_SWITCH
- )
- @property
- def is_on(self):
- """Return whether the switch is on or not."""
- is_switched_on = self._switch_dps.get_value(self._device)
- if is_switched_on is None:
- return STATE_UNAVAILABLE
- else:
- return is_switched_on
- @property
- def current_power_w(self):
- """Return the current power consumption in Watts."""
- if self._power_dps is None:
- return None
- pwr = self._power_dps.get_value(self._device)
- if pwr is None:
- return STATE_UNAVAILABLE
- return pwr
- @property
- def device_state_attributes(self):
- """Get additional attributes that HA doesn't naturally support."""
- attr = {}
- for a in self._attr_dps:
- attr[a.name] = a.get_value(self._device)
- return attr
- @property
- def icon(self):
- """Return the icon to use in the frontend for this device."""
- icon = self._config.icon(self._device)
- if icon:
- return icon
- else:
- return super().icon
- async def async_turn_on(self, **kwargs):
- """Turn the switch on"""
- await self._switch_dps.async_set_value(self._device, True)
- async def async_turn_off(self, **kwargs):
- """Turn the switch off"""
- await self._switch_dps.async_set_value(self._device, False)
- async def async_update(self):
- await self._device.async_refresh()
|