Esempio n. 1
0
    async def async_set_percentage(self, percentage: int) -> None:
        """Set the speed percentage of the fan."""
        _LOGGER.debug("Setting the fan speed percentage to: %s", percentage)

        if percentage == 0:
            await self.async_turn_off()
            return

        if not self._state:
            await self._try_command("Turning the miio device on failed.",
                                    self._device.on)
        await self._try_command(
            "Setting preset mode of the miio device failed.",
            self._device.set_speed,
            FAN_PRESET_MODES_1C[percentage_to_ordered_list_item(
                FAN_SPEEDS_1C, percentage)],
        )
Esempio n. 2
0
    async def _async_set_percentage(self, percentage: int | None) -> None:
        if percentage == 0:
            await self.async_turn_off()
            return

        data: dict[str, Any] = {"key": self._static_info.key, "state": True}
        if percentage is not None:
            if self._supports_speed_levels:
                data["speed_level"] = math.ceil(
                    percentage_to_ranged_value(
                        (1, self._static_info.supported_speed_levels),
                        percentage))
            else:
                named_speed = percentage_to_ordered_list_item(
                    ORDERED_NAMED_FAN_SPEEDS, percentage)
                data["speed"] = named_speed
        await self._client.fan_command(**data)
Esempio n. 3
0
 def set_percentage(self, percentage: int) -> None:
     """Set the speed of the fan, as a percentage."""
     if self.device.category == "kj":
         value_in_range = percentage_to_ordered_list_item(
             self.air_purifier_speed_range_enum, percentage
         )
         self._send_command(
             [
                 {
                     "code": self.dp_code_speed_enum,
                     "value": value_in_range,
                 }
             ]
         )
     else:
         self._send_command(
             [{"code": DPCode.FAN_SPEED_PERCENT, "value": percentage}]
         )
Esempio n. 4
0
    def set_percentage(self, percentage: int) -> None:
        """Set the speed of the fan, as a percentage."""
        if self._speed is not None:
            self._send_command([{
                "code":
                self._speed.dpcode,
                "value":
                int(self._speed.remap_value_from(percentage, 1, 100)),
            }])
            return

        if self._speeds is not None:
            self._send_command([{
                "code":
                self._speeds.dpcode,
                "value":
                percentage_to_ordered_list_item(self._speeds.range,
                                                percentage),
            }])
Esempio n. 5
0
 def turn_on(self, speed=None, percentage=None, preset_mode=None, **kwargs):
     ret = False
     if not self.is_on:
         ret = self.set_property(self._prop_power.full_name, True)
     if self._prop_percentage:
         if not percentage and speed:
             percentage = ordered_list_item_to_percentage(self.speed_list, speed)
         if percentage:
             ret = self.set_property(self._prop_percentage.full_name, percentage)
     elif self._prop_speed:
         if not speed and percentage:
             speed = percentage_to_ordered_list_item(self.speed_list, percentage)
         val = self._prop_speed.list_first(speed) if speed else None
         if val is not None:
             ret = self.set_property(self._prop_speed.full_name, val)
     if preset_mode and self._prop_mode:
         val = self._prop_mode.list_first(preset_mode)
         if val is not None:
             ret = self.set_property(self._prop_mode.full_name, val)
     return ret
Esempio n. 6
0
    def turn_on(
        self,
        speed: str = None,
        percentage: int = None,
        preset_mode: str = None,
        **kwargs: Any,
    ) -> None:
        """Turn on the fan."""
        if self._switch is None:
            return

        commands: list[dict[str, str | bool | int]] = [{
            "code": self._switch,
            "value": True
        }]

        if percentage is not None and self._speed is not None:
            commands.append({
                "code":
                self._speed.dpcode,
                "value":
                int(self._speed.remap_value_from(percentage, 1, 100)),
            })
            return

        if percentage is not None and self._speeds is not None:
            commands.append({
                "code":
                self._speeds.dpcode,
                "value":
                percentage_to_ordered_list_item(self._speeds.range,
                                                percentage),
            })

        if preset_mode is not None and self._presets is not None:
            commands.append({
                "code": self._presets.dpcode,
                "value": preset_mode
            })

        self._send_command(commands)
Esempio n. 7
0
 def turn_on(self, speed=None, percentage=None, preset_mode=None, **kwargs):
     ret = False
     if not self.is_on:
         ret = self.set_property(self._prop_power, True)
     if self._prop_percentage:
         if not percentage and speed:
             percentage = ordered_list_item_to_percentage(
                 self.speed_list, speed)
         if percentage:
             ret = self.set_property(self._prop_percentage, percentage)
         elif percentage is not None:
             _LOGGER.warning('Set fan speed percentage to %s failed: %s',
                             self.name, {
                                 'speed': speed,
                                 'percentage': percentage,
                             })
     elif self._prop_speed:
         if not speed and percentage:
             speed = percentage_to_ordered_list_item(
                 self.speed_list, percentage)
         val = self._prop_speed.list_first(speed) if speed else None
         if val is None and self._prop_speed.value_range:
             if speed is not None:
                 val = int(speed)
         if val is not None:
             ret = self.set_property(self._prop_speed, val)
         elif speed is not None:
             _LOGGER.warning('Set fan speed level to %s failed: %s',
                             self.name, {
                                 'speed': speed,
                                 'percentage': percentage,
                                 'value': val,
                             })
     if preset_mode and self._prop_mode:
         val = self._prop_mode.list_first(preset_mode)
         if val is not None:
             ret = self.set_property(self._prop_mode, val)
     return ret
Esempio n. 8
0
async def test_percentage_to_ordered_list_item():
    """Test item that most closely matches the percentage in an ordered list."""

    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 1) == SPEED_1
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 25) == SPEED_1
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 26) == SPEED_2
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 50) == SPEED_2
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 51) == SPEED_3
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 75) == SPEED_3
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 76) == SPEED_4
    assert percentage_to_ordered_list_item(SMALL_ORDERED_LIST, 100) == SPEED_4

    assert percentage_to_ordered_list_item(LEGACY_ORDERED_LIST, 17) == SPEED_LOW
    assert percentage_to_ordered_list_item(LEGACY_ORDERED_LIST, 33) == SPEED_LOW
    assert percentage_to_ordered_list_item(LEGACY_ORDERED_LIST, 50) == SPEED_MEDIUM
    assert percentage_to_ordered_list_item(LEGACY_ORDERED_LIST, 66) == SPEED_MEDIUM
    assert percentage_to_ordered_list_item(LEGACY_ORDERED_LIST, 84) == SPEED_HIGH
    assert percentage_to_ordered_list_item(LEGACY_ORDERED_LIST, 100) == SPEED_HIGH

    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 1) == SPEED_1
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 14) == SPEED_1
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 25) == SPEED_2
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 26) == SPEED_2
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 28) == SPEED_2
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 29) == SPEED_3
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 41) == SPEED_3
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 42) == SPEED_3
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 43) == SPEED_4
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 56) == SPEED_4
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 50) == SPEED_4
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 51) == SPEED_4
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 75) == SPEED_6
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 76) == SPEED_6
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 100) == SPEED_7

    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 1) == SPEED_1
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 25) == SPEED_2
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 26) == SPEED_2
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 50) == SPEED_4
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 51) == SPEED_4
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 75) == SPEED_6
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 76) == SPEED_6
    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 100) == SPEED_7

    assert percentage_to_ordered_list_item(LARGE_ORDERED_LIST, 100.1) == SPEED_7

    with pytest.raises(ValueError):
        assert percentage_to_ordered_list_item([], 100)
Esempio n. 9
0
 async def async_set_percentage(self, percentage: int) -> None:
     """Set the speed percentage of the fan."""
     await self._device.set_speed(
         percentage_to_ordered_list_item(ORDERED_NAMED_FAN_SPEEDS,
                                         percentage))
 def _get_on_mode(self) -> str:
     if self.ordered_fan_speeds:
         return percentage_to_ordered_list_item(self.ordered_fan_speeds, 50)
     return self.fan_modes[FAN_ON]
 def _set_fan_speed(self, speed) -> None:
     _LOGGER.debug("%s: Set fan speed to %s", self.entity_id, speed)
     mode = percentage_to_ordered_list_item(self.ordered_fan_speeds,
                                            speed - 1)
     params = {ATTR_ENTITY_ID: self.entity_id, ATTR_FAN_MODE: mode}
     self.async_call_service(DOMAIN_CLIMATE, SERVICE_SET_FAN_MODE, params)
Esempio n. 12
0
 async def async_set_percentage(self, percentage: int) -> None:
     """Set speed."""
     new_speed = percentage_to_ordered_list_item(ORDERED_NAMED_FAN_SPEEDS,
                                                 percentage)
     await self._device.send_fan_speed(int(new_speed))
     self.coordinator.async_set_updated_data(self._device.state)
Esempio n. 13
0
 def percentage_to_speed(  # pylint: disable=no-self-use
         self, percentage: int) -> str:
     """Map a percentage to a legacy speed."""
     if percentage == 0:
         return SPEED_OFF
     return percentage_to_ordered_list_item(LEGACY_SPEED_LIST, percentage)
Esempio n. 14
0
 async def async_set_percentage(self, percentage: int) -> None:
     """Set speed."""
     new_speed = percentage_to_ordered_list_item(ORDERED_NAMED_FAN_SPEEDS,
                                                 percentage)
     async with self.coordinator.async_connect_and_update() as device:
         await device.send_fan_speed(int(new_speed))