Skip to content

Commit

Permalink
Adds initial support for Purifier Big+Quiet Devices (#65)
Browse files Browse the repository at this point in the history
  • Loading branch information
dotvezz authored Sep 7, 2023
1 parent d0d3647 commit 1e51316
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 1 deletion.
2 changes: 1 addition & 1 deletion custom_components/dyson_local/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"documentation": "https://github.com/libdyson-wg/ha-dyson",
"iot_class": "local_push",
"issue_tracker": "https://github.com/libdyson-wg/ha-dyson/issues",
"version": "1.0.0"
"version": "1.1.0"
}
6 changes: 6 additions & 0 deletions custom_components/dyson_local/vendor/libdyson/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
DEVICE_TYPE_PURE_HUMIDIFY_COOL,
DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_E,
DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_K,
DEVICE_TYPE_PURIFIER_BIG_QUIET,
)

from .const import CleaningMode # noqa: F401
Expand All @@ -37,6 +38,7 @@
from .dyson_pure_hot_cool import DysonPureHotCool
from .dyson_pure_hot_cool_link import DysonPureHotCoolLink
from .dyson_pure_humidify_cool import DysonPurifierHumidifyCool
from .dyson_purifier_big_quiet import DysonBigQuiet
from .utils import get_mqtt_info_from_wifi_info # noqa: F401


Expand Down Expand Up @@ -72,4 +74,8 @@ def get_device(serial: str, credential: str, device_type: str) -> Optional[Dyson
DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_E,
]:
return DysonPurifierHumidifyCool(serial, credential, device_type)
if device_type in {
DEVICE_TYPE_PURIFIER_BIG_QUIET,
}:
return DysonBigQuiet(serial, credential, device_type)
return None
2 changes: 2 additions & 0 deletions custom_components/dyson_local/vendor/libdyson/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
DEVICE_TYPE_PURE_HOT_COOL = "527" # HP04
DEVICE_TYPE_PURIFIER_HOT_COOL_E = "527E" # HP07 AND HP09
DEVICE_TYPE_PURIFIER_HOT_COOL_K = "527K" # HP07 AND HP09
DEVICE_TYPE_PURIFIER_BIG_QUIET = "664" # BP02, BP03, and BP04

DEVICE_TYPE_NAMES = {
DEVICE_TYPE_360_EYE: "360 Eye robot vacuum",
Expand All @@ -33,6 +34,7 @@
DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_K: "Purifier Humidify+Cool",
DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_E: "Purifier Humidify+Cool",
DEVICE_TYPE_PURIFIER_HOT_COOL_K: "Purifier Hot+Cool",
DEVICE_TYPE_PURIFIER_BIG_QUIET: "Purifier Big+Quiet Series"
}

ENVIRONMENTAL_OFF = -1
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
"""Dyson Pure Cool fan."""

from abc import abstractmethod
from typing import Optional

from .dyson_device import DysonFanDevice


class DysonBigQuiet(DysonFanDevice):
"""Dyson Pure Cool series base class."""

@property
def is_on(self) -> bool:
"""Return if the device is on."""
return self._get_field_value(self._status, "fpwr") == "ON"

@property
def auto_mode(self) -> bool:
"""Return auto mode status."""
return self._get_field_value(self._status, "auto") == "ON"

@property
def front_airflow(self) -> bool:
"""Return if airflow from front is on."""
return self._get_field_value(self._status, "fdir") == "ON"

@property
def night_mode_speed(self) -> int:
"""Return speed in night mode."""
return int(self._get_field_value(self._status, "nmdv"))

@property
def carbon_filter_life(self) -> Optional[int]:
"""Return carbon filter life in percentage."""
filter_life = self._get_field_value(self._status, "cflr")
if filter_life == "INV":
return None
return int(filter_life)

@property
def hepa_filter_life(self) -> Optional[int]:
"""Return HEPA filter life in percentage."""
return int(self._get_field_value(self._status, "hflr"))

@property
def particulate_matter_2_5(self):
"""Return PM 2.5 in micro grams per cubic meter."""
return int(self._get_environmental_field_value("pm25"))

@property
def particulate_matter_10(self):
"""Return PM 2.5 in micro grams per cubic meter."""
return int(self._get_environmental_field_value("pm10"))

@property
def volatile_organic_compounds(self) -> float:
"""Return the index value for VOC"""
return self._get_environmental_field_value("va10", divisor=10)

@property
def nitrogen_dioxide(self) -> float:
"""Return the index value for nitrogen."""
return self._get_environmental_field_value("noxl", divisor=10)

def turn_on(self) -> None:
"""Turn on the device."""
self._set_configuration(fpwr="ON")

def turn_off(self) -> None:
"""Turn off the device."""
self._set_configuration(fpwr="OFF")

def _set_speed(self, speed: int) -> None:
self._set_configuration(fpwr="ON", fnsp=f"{speed:04d}")

def enable_auto_mode(self) -> None:
"""Turn on auto mode."""
self._set_configuration(auto="ON")

def disable_auto_mode(self) -> None:
"""Turn off auto mode."""
self._set_configuration(auto="OFF")

def enable_continuous_monitoring(self) -> None:
"""Turn on continuous monitoring."""
self._set_configuration(
fpwr="ON" if self.is_on else "OFF", # Not sure about this
rhtm="ON",
)

def disable_continuous_monitoring(self) -> None:
"""Turn off continuous monitoring."""
self._set_configuration(
fpwr="ON" if self.is_on else "OFF",
rhtm="OFF",
)

def enable_front_airflow(self) -> None:
"""Turn on front airflow."""
self._set_configuration(fdir="ON")

def disable_front_airflow(self) -> None:
"""Turn off front airflow."""
self._set_configuration(fdir="OFF")

0 comments on commit 1e51316

Please sign in to comment.