mirror of https://github.com/home-assistant/core
127 lines
4.5 KiB
Python
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
|