core/homeassistant/components/motionmount/number.py

96 lines
2.9 KiB
Python

"""Support for MotionMount numeric control."""
import socket
import motionmount
from homeassistant.components.number import NumberEntity
from homeassistant.const import PERCENTAGE
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import MotionMountConfigEntry
from .const import DOMAIN
from .entity import MotionMountEntity
PARALLEL_UPDATES = 0
async def async_setup_entry(
hass: HomeAssistant,
entry: MotionMountConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up Vogel's MotionMount from a config entry."""
mm = entry.runtime_data
async_add_entities(
(
MotionMountExtension(mm, entry),
MotionMountTurn(mm, entry),
)
)
class MotionMountExtension(MotionMountEntity, NumberEntity):
"""The target extension position of a MotionMount."""
_attr_native_max_value = 100
_attr_native_min_value = 0
_attr_native_unit_of_measurement = PERCENTAGE
_attr_translation_key = "motionmount_extension"
def __init__(
self, mm: motionmount.MotionMount, config_entry: MotionMountConfigEntry
) -> None:
"""Initialize Extension number."""
super().__init__(mm, config_entry)
self._attr_unique_id = f"{self._base_unique_id}-extension"
@property
def native_value(self) -> float:
"""Get native value."""
return float(self.mm.extension or 0)
async def async_set_native_value(self, value: float) -> None:
"""Set the new value for extension."""
try:
await self.mm.set_extension(int(value))
except (TimeoutError, socket.gaierror) as ex:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="failed_communication",
) from ex
class MotionMountTurn(MotionMountEntity, NumberEntity):
"""The target turn position of a MotionMount."""
_attr_native_max_value = 100
_attr_native_min_value = -100
_attr_native_unit_of_measurement = PERCENTAGE
_attr_translation_key = "motionmount_turn"
def __init__(
self, mm: motionmount.MotionMount, config_entry: MotionMountConfigEntry
) -> None:
"""Initialize Turn number."""
super().__init__(mm, config_entry)
self._attr_unique_id = f"{self._base_unique_id}-turn"
@property
def native_value(self) -> float:
"""Get native value."""
return float(self.mm.turn or 0) * -1
async def async_set_native_value(self, value: float) -> None:
"""Set the new value for turn."""
try:
await self.mm.set_turn(int(value * -1))
except (TimeoutError, socket.gaierror) as ex:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="failed_communication",
) from ex