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
 |