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/devices/worx.py
"""Worx Landroid device definition."""

# pylint: disable=unused-argument,relative-beyond-top-level
from __future__ import annotations

import json

import voluptuous as vol
from homeassistant.components.lawn_mower import LawnMowerEntity
from pyworxcloud import DeviceHandler

from ..const import (
    ATTR_BOUNDARY,
    ATTR_MULTIZONE_DISTANCES,
    ATTR_MULTIZONE_PROBABILITIES,
    ATTR_RAINDELAY,
    ATTR_RUNTIME,
    ATTR_TIMEEXTENSION,
    ATTR_TORQUE,
    LandroidFeatureSupport,
)
from ..device_base import SUPPORT_LANDROID_BASE, LandroidCloudMowerBase
from ..utils.logger import LoggerType

# from homeassistant.helpers.dispatcher import dispatcher_send


SUPPORTED_FEATURES = SUPPORT_LANDROID_BASE

CONFIG_SCHEME = vol.Schema(
    {
        vol.Optional(ATTR_RAINDELAY): vol.All(vol.Coerce(int), vol.Range(0, 300)),
        vol.Optional(ATTR_TIMEEXTENSION): vol.All(
            vol.Coerce(int), vol.Range(-100, 100)
        ),
        vol.Optional(ATTR_MULTIZONE_DISTANCES): str,
        vol.Optional(ATTR_MULTIZONE_PROBABILITIES): str,
    }
)

OTS_SCHEME = vol.Schema(
    {
        vol.Required(ATTR_BOUNDARY, default=False): bool,
        vol.Required(ATTR_RUNTIME, default=30): vol.Coerce(int),
    }
)

DEVICE_FEATURES = (
    LandroidFeatureSupport.MOWER
    | LandroidFeatureSupport.BUTTON
    | LandroidFeatureSupport.SELECT
    | LandroidFeatureSupport.LOCK
    | LandroidFeatureSupport.CONFIG
    | LandroidFeatureSupport.RESTART
    | LandroidFeatureSupport.SETZONE
    | LandroidFeatureSupport.RAW
    | LandroidFeatureSupport.SCHEDULES
)


class MowerDevice(LandroidCloudMowerBase, LawnMowerEntity):
    """Definition of Worx Landroid device."""

    def __init__(self, hass, api):
        """Initialize mower entity."""
        super().__init__(hass, api)
        self.device: DeviceHandler = self._device

    @property
    def base_features(self):
        """Flag which Landroid Cloud specific features that are supported."""
        return DEVICE_FEATURES

    @property
    def supported_features(self):
        """Flag which mower robot features that are supported."""
        return SUPPORTED_FEATURES

    @staticmethod
    def get_ots_scheme():
        """Get device specific OTS_SCHEME."""
        return OTS_SCHEME

    @staticmethod
    def get_config_scheme():
        """Get device specific CONFIG_SCHEME."""
        return CONFIG_SCHEME

    async def async_set_torque(self, data: dict | None = None) -> None:
        """Set wheel torque."""
        device: DeviceHandler = self._device
        self.log(
            LoggerType.SERVICE_CALL,
            "Setting wheel torque to %s",
            data[ATTR_TORQUE],
        )
        tmpdata = {"tq": data[ATTR_TORQUE]}
        await self.hass.async_add_executor_job(
            self._api.cloud.send, device.serial_number, json.dumps(tmpdata)
        )