core/homeassistant/components/fibaro/entity.py

127 lines
4.5 KiB
Python

"""Support for the Fibaro devices."""
from __future__ import annotations
from collections.abc import Mapping
import logging
from typing import Any
from pyfibaro.fibaro_device import DeviceModel
from homeassistant.const import ATTR_ARMED, ATTR_BATTERY_LEVEL
from homeassistant.helpers.entity import Entity
_LOGGER = logging.getLogger(__name__)
class FibaroEntity(Entity):
"""Representation of a Fibaro device entity."""
_attr_should_poll = False
def __init__(self, fibaro_device: DeviceModel) -> None:
"""Initialize the device."""
self.fibaro_device = fibaro_device
self.controller = fibaro_device.fibaro_controller
self.ha_id = fibaro_device.ha_id
self._attr_name = fibaro_device.friendly_name
self._attr_unique_id = fibaro_device.unique_id_str
self._attr_device_info = self.controller.get_device_info(fibaro_device)
# propagate hidden attribute set in fibaro home center to HA
if not fibaro_device.visible:
self._attr_entity_registry_visible_default = False
async def async_added_to_hass(self) -> None:
"""Call when entity is added to hass."""
self.controller.register(self.fibaro_device.fibaro_id, self._update_callback)
def _update_callback(self) -> None:
"""Update the state."""
self.schedule_update_ha_state(True)
@property
def level(self) -> int | None:
"""Get the level of Fibaro device."""
if self.fibaro_device.value.has_value:
return self.fibaro_device.value.int_value()
return None
@property
def level2(self) -> int | None:
"""Get the tilt level of Fibaro device."""
if self.fibaro_device.value_2.has_value:
return self.fibaro_device.value_2.int_value()
return None
def dont_know_message(self, cmd: str) -> None:
"""Make a warning in case we don't know how to perform an action."""
_LOGGER.warning(
"Not sure how to %s: %s (available actions: %s)",
cmd,
str(self.ha_id),
str(self.fibaro_device.actions),
)
def set_level(self, level: int) -> None:
"""Set the level of Fibaro device."""
self.action("setValue", level)
if self.fibaro_device.value.has_value:
self.fibaro_device.properties["value"] = level
if self.fibaro_device.has_brightness:
self.fibaro_device.properties["brightness"] = level
def set_level2(self, level: int) -> None:
"""Set the level2 of Fibaro device."""
self.action("setValue2", level)
if self.fibaro_device.value_2.has_value:
self.fibaro_device.properties["value2"] = level
def call_turn_on(self) -> None:
"""Turn on the Fibaro device."""
self.action("turnOn")
def call_turn_off(self) -> None:
"""Turn off the Fibaro device."""
self.action("turnOff")
def call_set_color(self, red: int, green: int, blue: int, white: int) -> None:
"""Set the color of Fibaro device."""
red = int(max(0, min(255, red)))
green = int(max(0, min(255, green)))
blue = int(max(0, min(255, blue)))
white = int(max(0, min(255, white)))
color_str = f"{red},{green},{blue},{white}"
self.fibaro_device.properties["color"] = color_str
self.action("setColor", str(red), str(green), str(blue), str(white))
def action(self, cmd: str, *args: Any) -> None:
"""Perform an action on the Fibaro HC."""
if cmd in self.fibaro_device.actions:
self.fibaro_device.execute_action(cmd, args)
_LOGGER.debug("-> %s.%s%s called", str(self.ha_id), str(cmd), str(args))
else:
self.dont_know_message(cmd)
@property
def current_binary_state(self) -> bool:
"""Return the current binary state."""
return self.fibaro_device.value.bool_value(False)
@property
def extra_state_attributes(self) -> Mapping[str, Any]:
"""Return the state attributes of the device."""
attr = {"fibaro_id": self.fibaro_device.fibaro_id}
if self.fibaro_device.has_battery_level:
attr[ATTR_BATTERY_LEVEL] = self.fibaro_device.battery_level
if self.fibaro_device.has_armed:
attr[ATTR_ARMED] = self.fibaro_device.armed
return attr
def update(self) -> None:
"""Update the available state of the entity."""
if self.fibaro_device.has_dead:
self._attr_available = not self.fibaro_device.dead