HEX
Server: Apache/2.4.63 (Unix)
System: Linux Synopilou92 4.4.302+ #72806 SMP Mon Jul 21 23:16:00 CST 2025 x86_64
User: pilou92 (1026)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /volume1/docker/homeassistant2025/custom_components/landroid_cloud/number.py
"""Input numbers for landroid_cloud."""

from __future__ import annotations

import json

from homeassistant.components.number import NumberDeviceClass, NumberMode
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from pyworxcloud import DeviceCapability

from .api import LandroidAPI
from .const import ATTR_DEVICES, DOMAIN
from .device_base import LandroidNumber, LandroidNumberEntityDescription

INPUT_NUMBERS = [
    LandroidNumberEntityDescription(
        key="timeextension",
        name="Time extension",
        entity_category=EntityCategory.CONFIG,
        device_class=None,
        entity_registry_enabled_default=True,
        native_unit_of_measurement="%",
        native_min_value=-100,
        native_max_value=100,
        native_step=10,
        mode=NumberMode.SLIDER,
        value_fn=lambda api: api.cloud.devices[api.device_name].schedules[
            "time_extension"
        ],
        command_fn=lambda api, value: api.cloud.send(
            api.device.serial_number, json.dumps({"sc": {"p": value}})
        ),
        required_protocol=0,
    ),
    LandroidNumberEntityDescription(
        key="torque",
        name="Torque",
        entity_category=EntityCategory.CONFIG,
        device_class=NumberDeviceClass.POWER_FACTOR,
        entity_registry_enabled_default=True,
        native_unit_of_measurement=None,
        native_min_value=-50,
        native_max_value=50,
        native_step=1,
        mode=NumberMode.SLIDER,
        value_fn=lambda api: api.cloud.devices[api.device_name].torque,
        command_fn=lambda api, value: api.cloud.send(
            api.device.serial_number, json.dumps({"tq": value})
        ),
        required_capability=DeviceCapability.TORQUE,
    ),
    LandroidNumberEntityDescription(
        key="raindelay",
        name="Raindelay",
        entity_category=EntityCategory.CONFIG,
        device_class=None,
        entity_registry_enabled_default=True,
        native_unit_of_measurement="minutes",
        native_min_value=0,
        native_max_value=300,
        native_step=1,
        mode=NumberMode.BOX,
        value_fn=lambda api: api.device.rainsensor["delay"],
        command_fn=lambda api, value: api.cloud.raindelay(
            api.device.serial_number, value
        ),
        icon="mdi:weather-rainy",
    ),
    LandroidNumberEntityDescription(
        key="cutting_height",
        name="Cutting height",
        entity_category=EntityCategory.CONFIG,
        device_class=NumberDeviceClass.DISTANCE,
        entity_registry_enabled_default=True,
        native_unit_of_measurement="mm",
        native_min_value=30,
        native_max_value=60,
        native_step=5,
        mode=NumberMode.SLIDER,
        value_fn=lambda api: api.cloud.get_cutting_height(api.device.serial_number),
        command_fn=lambda api, value: api.cloud.set_cutting_height(
            api.device.serial_number, value
        ),
        required_capability=DeviceCapability.CUTTING_HEIGHT,
    ),
]


async def async_setup_entry(
    hass: HomeAssistant,
    config: ConfigEntry,
    async_add_devices,
) -> None:
    """Set up the switch platform."""
    entities = []
    for _, info in hass.data[DOMAIN][config.entry_id][ATTR_DEVICES].items():
        api: LandroidAPI = info["api"]
        for number in INPUT_NUMBERS:
            if (
                isinstance(number.required_protocol, type(None))
                or number.required_protocol == api.device.protocol
            ) and (
                isinstance(number.required_capability, type(None))
                or api.device.capabilities.check(number.required_capability)
            ):
                entity = LandroidNumber(hass, number, api, config)
                entities.append(entity)

    async_add_devices(entities)