roborock.data.code_mappings

  1from __future__ import annotations
  2
  3import logging
  4from collections import namedtuple
  5from enum import Enum, IntEnum, StrEnum
  6
  7_LOGGER = logging.getLogger(__name__)
  8completed_warnings = set()
  9
 10
 11class RoborockEnum(IntEnum):
 12    """Roborock Enum for codes with int values"""
 13
 14    @property
 15    def name(self) -> str:
 16        return super().name.lower()
 17
 18    @classmethod
 19    def _missing_(cls: type[RoborockEnum], key) -> RoborockEnum:
 20        if hasattr(cls, "unknown"):
 21            warning = f"Missing {cls.__name__} code: {key} - defaulting to 'unknown'"
 22            if warning not in completed_warnings:
 23                completed_warnings.add(warning)
 24                _LOGGER.warning(warning)
 25            return cls.unknown  # type: ignore
 26        default_value = next(item for item in cls)
 27        warning = f"Missing {cls.__name__} code: {key} - defaulting to {default_value}"
 28        if warning not in completed_warnings:
 29            completed_warnings.add(warning)
 30            _LOGGER.warning(warning)
 31        return default_value
 32
 33    @classmethod
 34    def as_dict(cls: type[RoborockEnum]):
 35        return {i.name: i.value for i in cls if i.name != "missing"}
 36
 37    @classmethod
 38    def as_enum_dict(cls: type[RoborockEnum]):
 39        return {i.value: i for i in cls if i.name != "missing"}
 40
 41    @classmethod
 42    def values(cls: type[RoborockEnum]) -> list[int]:
 43        return list(cls.as_dict().values())
 44
 45    @classmethod
 46    def keys(cls: type[RoborockEnum]) -> list[str]:
 47        return list(cls.as_dict().keys())
 48
 49    @classmethod
 50    def items(cls: type[RoborockEnum]):
 51        return cls.as_dict().items()
 52
 53
 54class RoborockModeEnum(StrEnum):
 55    """A custom StrEnum that also stores an integer code for each member."""
 56
 57    code: int
 58
 59    def __new__(cls, value: str, code: int) -> RoborockModeEnum:
 60        """Creates a new enum member."""
 61        member = str.__new__(cls, value)
 62        member._value_ = value
 63        member.code = code
 64        return member
 65
 66    @classmethod
 67    def from_code(cls, code: int):
 68        for member in cls:
 69            if member.code == code:
 70                return member
 71        raise ValueError(f"{code} is not a valid code for {cls.__name__}")
 72
 73    @classmethod
 74    def keys(cls) -> list[str]:
 75        """Returns a list of all member values."""
 76        return [member.value for member in cls]
 77
 78
 79ProductInfo = namedtuple("ProductInfo", ["nickname", "short_models"])
 80
 81
 82class RoborockProductNickname(Enum):
 83    # Coral Series
 84    CORAL = ProductInfo(nickname="Coral", short_models=("a20", "a21"))
 85    CORALPRO = ProductInfo(nickname="CoralPro", short_models=("a143", "a144"))
 86
 87    # Pearl Series
 88    PEARL = ProductInfo(nickname="Pearl", short_models=("a74", "a75"))
 89    PEARLC = ProductInfo(nickname="PearlC", short_models=("a103", "a104"))
 90    PEARLE = ProductInfo(nickname="PearlE", short_models=("a167", "a168"))
 91    PEARLELITE = ProductInfo(nickname="PearlELite", short_models=("a169", "a170"))
 92    PEARLPLUS = ProductInfo(nickname="PearlPlus", short_models=("a86", "a87"))
 93    PEARLPLUSS = ProductInfo(nickname="PearlPlusS", short_models=("a116", "a117", "a136"))
 94    PEARLS = ProductInfo(nickname="PearlS", short_models=("a100", "a101"))
 95    PEARLSLITE = ProductInfo(nickname="PearlSLite", short_models=("a122", "a123"))
 96
 97    # Ruby Series
 98    RUBYPLUS = ProductInfo(nickname="RubyPlus", short_models=("t4", "s4"))
 99    RUBYSC = ProductInfo(nickname="RubySC", short_models=("p5", "a08"))
100    RUBYSE = ProductInfo(nickname="RubySE", short_models=("a19",))
101    RUBYSLITE = ProductInfo(nickname="RubySLite", short_models=("p6", "s5e", "a05"))
102
103    # Tanos Series
104    TANOS = ProductInfo(nickname="Tanos", short_models=("t6", "s6"))
105    TANOSE = ProductInfo(nickname="TanosE", short_models=("t7", "a11"))
106    TANOSS = ProductInfo(nickname="TanosS", short_models=("a14", "a15"))
107    TANOSSC = ProductInfo(nickname="TanosSC", short_models=("a39", "a40"))
108    TANOSSE = ProductInfo(nickname="TanosSE", short_models=("a33", "a34"))
109    TANOSSMAX = ProductInfo(nickname="TanosSMax", short_models=("a52",))
110    TANOSSLITE = ProductInfo(nickname="TanosSLite", short_models=("a37", "a38"))
111    TANOSSPLUS = ProductInfo(nickname="TanosSPlus", short_models=("a23", "a24"))
112    TANOSV = ProductInfo(nickname="TanosV", short_models=("t7p", "a09", "a10"))
113
114    # Topaz Series
115    TOPAZS = ProductInfo(nickname="TopazS", short_models=("a29", "a30", "a76"))
116    TOPAZSC = ProductInfo(nickname="TopazSC", short_models=("a64", "a65"))
117    TOPAZSPLUS = ProductInfo(nickname="TopazSPlus", short_models=("a46", "a47", "a66"))
118    TOPAZSPOWER = ProductInfo(nickname="TopazSPower", short_models=("a62",))
119    TOPAZSV = ProductInfo(nickname="TopazSV", short_models=("a26", "a27"))
120
121    # Ultron Series
122    ULTRON = ProductInfo(nickname="Ultron", short_models=("a50", "a51"))
123    ULTRONE = ProductInfo(nickname="UltronE", short_models=("a72", "a84"))
124    ULTRONLITE = ProductInfo(nickname="UltronLite", short_models=("a73", "a85"))
125    ULTRONSC = ProductInfo(nickname="UltronSC", short_models=("a94", "a95"))
126    ULTRONSE = ProductInfo(nickname="UltronSE", short_models=("a124", "a125", "a139", "a140"))
127    ULTRONSPLUS = ProductInfo(nickname="UltronSPlus", short_models=("a68", "a69", "a70"))
128    ULTRONSV = ProductInfo(nickname="UltronSV", short_models=("a96", "a97"))
129
130    # Verdelite Series
131    VERDELITE = ProductInfo(nickname="Verdelite", short_models=("a146", "a147"))
132
133    # Vivian Series
134    VIVIAN = ProductInfo(nickname="Vivian", short_models=("a134", "a135", "a155", "a156"))
135    VIVIANC = ProductInfo(nickname="VivianC", short_models=("a158", "a159"))
136
137
138SHORT_MODEL_TO_ENUM = {model: product for product in RoborockProductNickname for model in product.value.short_models}
139
140
141class RoborockCategory(Enum):
142    """Describes the category of the device."""
143
144    WET_DRY_VAC = "roborock.wetdryvac"
145    VACUUM = "robot.vacuum.cleaner"
146    WASHING_MACHINE = "roborock.wm"
147    UNKNOWN = "UNKNOWN"
148
149    def __missing__(self, key):
150        _LOGGER.warning("Missing key %s from category", key)
151        return RoborockCategory.UNKNOWN
completed_warnings = set()
class RoborockEnum(enum.IntEnum):
12class RoborockEnum(IntEnum):
13    """Roborock Enum for codes with int values"""
14
15    @property
16    def name(self) -> str:
17        return super().name.lower()
18
19    @classmethod
20    def _missing_(cls: type[RoborockEnum], key) -> RoborockEnum:
21        if hasattr(cls, "unknown"):
22            warning = f"Missing {cls.__name__} code: {key} - defaulting to 'unknown'"
23            if warning not in completed_warnings:
24                completed_warnings.add(warning)
25                _LOGGER.warning(warning)
26            return cls.unknown  # type: ignore
27        default_value = next(item for item in cls)
28        warning = f"Missing {cls.__name__} code: {key} - defaulting to {default_value}"
29        if warning not in completed_warnings:
30            completed_warnings.add(warning)
31            _LOGGER.warning(warning)
32        return default_value
33
34    @classmethod
35    def as_dict(cls: type[RoborockEnum]):
36        return {i.name: i.value for i in cls if i.name != "missing"}
37
38    @classmethod
39    def as_enum_dict(cls: type[RoborockEnum]):
40        return {i.value: i for i in cls if i.name != "missing"}
41
42    @classmethod
43    def values(cls: type[RoborockEnum]) -> list[int]:
44        return list(cls.as_dict().values())
45
46    @classmethod
47    def keys(cls: type[RoborockEnum]) -> list[str]:
48        return list(cls.as_dict().keys())
49
50    @classmethod
51    def items(cls: type[RoborockEnum]):
52        return cls.as_dict().items()

Roborock Enum for codes with int values

name: str
15    @property
16    def name(self) -> str:
17        return super().name.lower()

The name of the Enum member.

@classmethod
def as_dict(cls: type[RoborockEnum]):
34    @classmethod
35    def as_dict(cls: type[RoborockEnum]):
36        return {i.name: i.value for i in cls if i.name != "missing"}
@classmethod
def as_enum_dict(cls: type[RoborockEnum]):
38    @classmethod
39    def as_enum_dict(cls: type[RoborockEnum]):
40        return {i.value: i for i in cls if i.name != "missing"}
@classmethod
def values(cls: type[RoborockEnum]) -> list[int]:
42    @classmethod
43    def values(cls: type[RoborockEnum]) -> list[int]:
44        return list(cls.as_dict().values())
@classmethod
def keys(cls: type[RoborockEnum]) -> list[str]:
46    @classmethod
47    def keys(cls: type[RoborockEnum]) -> list[str]:
48        return list(cls.as_dict().keys())
@classmethod
def items(cls: type[RoborockEnum]):
50    @classmethod
51    def items(cls: type[RoborockEnum]):
52        return cls.as_dict().items()
class RoborockModeEnum(enum.StrEnum):
55class RoborockModeEnum(StrEnum):
56    """A custom StrEnum that also stores an integer code for each member."""
57
58    code: int
59
60    def __new__(cls, value: str, code: int) -> RoborockModeEnum:
61        """Creates a new enum member."""
62        member = str.__new__(cls, value)
63        member._value_ = value
64        member.code = code
65        return member
66
67    @classmethod
68    def from_code(cls, code: int):
69        for member in cls:
70            if member.code == code:
71                return member
72        raise ValueError(f"{code} is not a valid code for {cls.__name__}")
73
74    @classmethod
75    def keys(cls) -> list[str]:
76        """Returns a list of all member values."""
77        return [member.value for member in cls]

A custom StrEnum that also stores an integer code for each member.

code: int
@classmethod
def from_code(cls, code: int):
67    @classmethod
68    def from_code(cls, code: int):
69        for member in cls:
70            if member.code == code:
71                return member
72        raise ValueError(f"{code} is not a valid code for {cls.__name__}")
@classmethod
def keys(cls) -> list[str]:
74    @classmethod
75    def keys(cls) -> list[str]:
76        """Returns a list of all member values."""
77        return [member.value for member in cls]

Returns a list of all member values.

class ProductInfo(builtins.tuple):

ProductInfo(nickname, short_models)

ProductInfo(nickname, short_models)

Create new instance of ProductInfo(nickname, short_models)

nickname

Alias for field number 0

short_models

Alias for field number 1

class RoborockProductNickname(enum.Enum):
 83class RoborockProductNickname(Enum):
 84    # Coral Series
 85    CORAL = ProductInfo(nickname="Coral", short_models=("a20", "a21"))
 86    CORALPRO = ProductInfo(nickname="CoralPro", short_models=("a143", "a144"))
 87
 88    # Pearl Series
 89    PEARL = ProductInfo(nickname="Pearl", short_models=("a74", "a75"))
 90    PEARLC = ProductInfo(nickname="PearlC", short_models=("a103", "a104"))
 91    PEARLE = ProductInfo(nickname="PearlE", short_models=("a167", "a168"))
 92    PEARLELITE = ProductInfo(nickname="PearlELite", short_models=("a169", "a170"))
 93    PEARLPLUS = ProductInfo(nickname="PearlPlus", short_models=("a86", "a87"))
 94    PEARLPLUSS = ProductInfo(nickname="PearlPlusS", short_models=("a116", "a117", "a136"))
 95    PEARLS = ProductInfo(nickname="PearlS", short_models=("a100", "a101"))
 96    PEARLSLITE = ProductInfo(nickname="PearlSLite", short_models=("a122", "a123"))
 97
 98    # Ruby Series
 99    RUBYPLUS = ProductInfo(nickname="RubyPlus", short_models=("t4", "s4"))
100    RUBYSC = ProductInfo(nickname="RubySC", short_models=("p5", "a08"))
101    RUBYSE = ProductInfo(nickname="RubySE", short_models=("a19",))
102    RUBYSLITE = ProductInfo(nickname="RubySLite", short_models=("p6", "s5e", "a05"))
103
104    # Tanos Series
105    TANOS = ProductInfo(nickname="Tanos", short_models=("t6", "s6"))
106    TANOSE = ProductInfo(nickname="TanosE", short_models=("t7", "a11"))
107    TANOSS = ProductInfo(nickname="TanosS", short_models=("a14", "a15"))
108    TANOSSC = ProductInfo(nickname="TanosSC", short_models=("a39", "a40"))
109    TANOSSE = ProductInfo(nickname="TanosSE", short_models=("a33", "a34"))
110    TANOSSMAX = ProductInfo(nickname="TanosSMax", short_models=("a52",))
111    TANOSSLITE = ProductInfo(nickname="TanosSLite", short_models=("a37", "a38"))
112    TANOSSPLUS = ProductInfo(nickname="TanosSPlus", short_models=("a23", "a24"))
113    TANOSV = ProductInfo(nickname="TanosV", short_models=("t7p", "a09", "a10"))
114
115    # Topaz Series
116    TOPAZS = ProductInfo(nickname="TopazS", short_models=("a29", "a30", "a76"))
117    TOPAZSC = ProductInfo(nickname="TopazSC", short_models=("a64", "a65"))
118    TOPAZSPLUS = ProductInfo(nickname="TopazSPlus", short_models=("a46", "a47", "a66"))
119    TOPAZSPOWER = ProductInfo(nickname="TopazSPower", short_models=("a62",))
120    TOPAZSV = ProductInfo(nickname="TopazSV", short_models=("a26", "a27"))
121
122    # Ultron Series
123    ULTRON = ProductInfo(nickname="Ultron", short_models=("a50", "a51"))
124    ULTRONE = ProductInfo(nickname="UltronE", short_models=("a72", "a84"))
125    ULTRONLITE = ProductInfo(nickname="UltronLite", short_models=("a73", "a85"))
126    ULTRONSC = ProductInfo(nickname="UltronSC", short_models=("a94", "a95"))
127    ULTRONSE = ProductInfo(nickname="UltronSE", short_models=("a124", "a125", "a139", "a140"))
128    ULTRONSPLUS = ProductInfo(nickname="UltronSPlus", short_models=("a68", "a69", "a70"))
129    ULTRONSV = ProductInfo(nickname="UltronSV", short_models=("a96", "a97"))
130
131    # Verdelite Series
132    VERDELITE = ProductInfo(nickname="Verdelite", short_models=("a146", "a147"))
133
134    # Vivian Series
135    VIVIAN = ProductInfo(nickname="Vivian", short_models=("a134", "a135", "a155", "a156"))
136    VIVIANC = ProductInfo(nickname="VivianC", short_models=("a158", "a159"))
CORAL = <RoborockProductNickname.CORAL: ProductInfo(nickname='Coral', short_models=('a20', 'a21'))>
CORALPRO = <RoborockProductNickname.CORALPRO: ProductInfo(nickname='CoralPro', short_models=('a143', 'a144'))>
PEARL = <RoborockProductNickname.PEARL: ProductInfo(nickname='Pearl', short_models=('a74', 'a75'))>
PEARLC = <RoborockProductNickname.PEARLC: ProductInfo(nickname='PearlC', short_models=('a103', 'a104'))>
PEARLE = <RoborockProductNickname.PEARLE: ProductInfo(nickname='PearlE', short_models=('a167', 'a168'))>
PEARLELITE = <RoborockProductNickname.PEARLELITE: ProductInfo(nickname='PearlELite', short_models=('a169', 'a170'))>
PEARLPLUS = <RoborockProductNickname.PEARLPLUS: ProductInfo(nickname='PearlPlus', short_models=('a86', 'a87'))>
PEARLPLUSS = <RoborockProductNickname.PEARLPLUSS: ProductInfo(nickname='PearlPlusS', short_models=('a116', 'a117', 'a136'))>
PEARLS = <RoborockProductNickname.PEARLS: ProductInfo(nickname='PearlS', short_models=('a100', 'a101'))>
PEARLSLITE = <RoborockProductNickname.PEARLSLITE: ProductInfo(nickname='PearlSLite', short_models=('a122', 'a123'))>
RUBYPLUS = <RoborockProductNickname.RUBYPLUS: ProductInfo(nickname='RubyPlus', short_models=('t4', 's4'))>
RUBYSC = <RoborockProductNickname.RUBYSC: ProductInfo(nickname='RubySC', short_models=('p5', 'a08'))>
RUBYSE = <RoborockProductNickname.RUBYSE: ProductInfo(nickname='RubySE', short_models=('a19',))>
RUBYSLITE = <RoborockProductNickname.RUBYSLITE: ProductInfo(nickname='RubySLite', short_models=('p6', 's5e', 'a05'))>
TANOS = <RoborockProductNickname.TANOS: ProductInfo(nickname='Tanos', short_models=('t6', 's6'))>
TANOSE = <RoborockProductNickname.TANOSE: ProductInfo(nickname='TanosE', short_models=('t7', 'a11'))>
TANOSS = <RoborockProductNickname.TANOSS: ProductInfo(nickname='TanosS', short_models=('a14', 'a15'))>
TANOSSC = <RoborockProductNickname.TANOSSC: ProductInfo(nickname='TanosSC', short_models=('a39', 'a40'))>
TANOSSE = <RoborockProductNickname.TANOSSE: ProductInfo(nickname='TanosSE', short_models=('a33', 'a34'))>
TANOSSMAX = <RoborockProductNickname.TANOSSMAX: ProductInfo(nickname='TanosSMax', short_models=('a52',))>
TANOSSLITE = <RoborockProductNickname.TANOSSLITE: ProductInfo(nickname='TanosSLite', short_models=('a37', 'a38'))>
TANOSSPLUS = <RoborockProductNickname.TANOSSPLUS: ProductInfo(nickname='TanosSPlus', short_models=('a23', 'a24'))>
TANOSV = <RoborockProductNickname.TANOSV: ProductInfo(nickname='TanosV', short_models=('t7p', 'a09', 'a10'))>
TOPAZS = <RoborockProductNickname.TOPAZS: ProductInfo(nickname='TopazS', short_models=('a29', 'a30', 'a76'))>
TOPAZSC = <RoborockProductNickname.TOPAZSC: ProductInfo(nickname='TopazSC', short_models=('a64', 'a65'))>
TOPAZSPLUS = <RoborockProductNickname.TOPAZSPLUS: ProductInfo(nickname='TopazSPlus', short_models=('a46', 'a47', 'a66'))>
TOPAZSPOWER = <RoborockProductNickname.TOPAZSPOWER: ProductInfo(nickname='TopazSPower', short_models=('a62',))>
TOPAZSV = <RoborockProductNickname.TOPAZSV: ProductInfo(nickname='TopazSV', short_models=('a26', 'a27'))>
ULTRON = <RoborockProductNickname.ULTRON: ProductInfo(nickname='Ultron', short_models=('a50', 'a51'))>
ULTRONE = <RoborockProductNickname.ULTRONE: ProductInfo(nickname='UltronE', short_models=('a72', 'a84'))>
ULTRONLITE = <RoborockProductNickname.ULTRONLITE: ProductInfo(nickname='UltronLite', short_models=('a73', 'a85'))>
ULTRONSC = <RoborockProductNickname.ULTRONSC: ProductInfo(nickname='UltronSC', short_models=('a94', 'a95'))>
ULTRONSE = <RoborockProductNickname.ULTRONSE: ProductInfo(nickname='UltronSE', short_models=('a124', 'a125', 'a139', 'a140'))>
ULTRONSPLUS = <RoborockProductNickname.ULTRONSPLUS: ProductInfo(nickname='UltronSPlus', short_models=('a68', 'a69', 'a70'))>
ULTRONSV = <RoborockProductNickname.ULTRONSV: ProductInfo(nickname='UltronSV', short_models=('a96', 'a97'))>
VERDELITE = <RoborockProductNickname.VERDELITE: ProductInfo(nickname='Verdelite', short_models=('a146', 'a147'))>
VIVIAN = <RoborockProductNickname.VIVIAN: ProductInfo(nickname='Vivian', short_models=('a134', 'a135', 'a155', 'a156'))>
VIVIANC = <RoborockProductNickname.VIVIANC: ProductInfo(nickname='VivianC', short_models=('a158', 'a159'))>
SHORT_MODEL_TO_ENUM = {'a20': <RoborockProductNickname.CORAL: ProductInfo(nickname='Coral', short_models=('a20', 'a21'))>, 'a21': <RoborockProductNickname.CORAL: ProductInfo(nickname='Coral', short_models=('a20', 'a21'))>, 'a143': <RoborockProductNickname.CORALPRO: ProductInfo(nickname='CoralPro', short_models=('a143', 'a144'))>, 'a144': <RoborockProductNickname.CORALPRO: ProductInfo(nickname='CoralPro', short_models=('a143', 'a144'))>, 'a74': <RoborockProductNickname.PEARL: ProductInfo(nickname='Pearl', short_models=('a74', 'a75'))>, 'a75': <RoborockProductNickname.PEARL: ProductInfo(nickname='Pearl', short_models=('a74', 'a75'))>, 'a103': <RoborockProductNickname.PEARLC: ProductInfo(nickname='PearlC', short_models=('a103', 'a104'))>, 'a104': <RoborockProductNickname.PEARLC: ProductInfo(nickname='PearlC', short_models=('a103', 'a104'))>, 'a167': <RoborockProductNickname.PEARLE: ProductInfo(nickname='PearlE', short_models=('a167', 'a168'))>, 'a168': <RoborockProductNickname.PEARLE: ProductInfo(nickname='PearlE', short_models=('a167', 'a168'))>, 'a169': <RoborockProductNickname.PEARLELITE: ProductInfo(nickname='PearlELite', short_models=('a169', 'a170'))>, 'a170': <RoborockProductNickname.PEARLELITE: ProductInfo(nickname='PearlELite', short_models=('a169', 'a170'))>, 'a86': <RoborockProductNickname.PEARLPLUS: ProductInfo(nickname='PearlPlus', short_models=('a86', 'a87'))>, 'a87': <RoborockProductNickname.PEARLPLUS: ProductInfo(nickname='PearlPlus', short_models=('a86', 'a87'))>, 'a116': <RoborockProductNickname.PEARLPLUSS: ProductInfo(nickname='PearlPlusS', short_models=('a116', 'a117', 'a136'))>, 'a117': <RoborockProductNickname.PEARLPLUSS: ProductInfo(nickname='PearlPlusS', short_models=('a116', 'a117', 'a136'))>, 'a136': <RoborockProductNickname.PEARLPLUSS: ProductInfo(nickname='PearlPlusS', short_models=('a116', 'a117', 'a136'))>, 'a100': <RoborockProductNickname.PEARLS: ProductInfo(nickname='PearlS', short_models=('a100', 'a101'))>, 'a101': <RoborockProductNickname.PEARLS: ProductInfo(nickname='PearlS', short_models=('a100', 'a101'))>, 'a122': <RoborockProductNickname.PEARLSLITE: ProductInfo(nickname='PearlSLite', short_models=('a122', 'a123'))>, 'a123': <RoborockProductNickname.PEARLSLITE: ProductInfo(nickname='PearlSLite', short_models=('a122', 'a123'))>, 't4': <RoborockProductNickname.RUBYPLUS: ProductInfo(nickname='RubyPlus', short_models=('t4', 's4'))>, 's4': <RoborockProductNickname.RUBYPLUS: ProductInfo(nickname='RubyPlus', short_models=('t4', 's4'))>, 'p5': <RoborockProductNickname.RUBYSC: ProductInfo(nickname='RubySC', short_models=('p5', 'a08'))>, 'a08': <RoborockProductNickname.RUBYSC: ProductInfo(nickname='RubySC', short_models=('p5', 'a08'))>, 'a19': <RoborockProductNickname.RUBYSE: ProductInfo(nickname='RubySE', short_models=('a19',))>, 'p6': <RoborockProductNickname.RUBYSLITE: ProductInfo(nickname='RubySLite', short_models=('p6', 's5e', 'a05'))>, 's5e': <RoborockProductNickname.RUBYSLITE: ProductInfo(nickname='RubySLite', short_models=('p6', 's5e', 'a05'))>, 'a05': <RoborockProductNickname.RUBYSLITE: ProductInfo(nickname='RubySLite', short_models=('p6', 's5e', 'a05'))>, 't6': <RoborockProductNickname.TANOS: ProductInfo(nickname='Tanos', short_models=('t6', 's6'))>, 's6': <RoborockProductNickname.TANOS: ProductInfo(nickname='Tanos', short_models=('t6', 's6'))>, 't7': <RoborockProductNickname.TANOSE: ProductInfo(nickname='TanosE', short_models=('t7', 'a11'))>, 'a11': <RoborockProductNickname.TANOSE: ProductInfo(nickname='TanosE', short_models=('t7', 'a11'))>, 'a14': <RoborockProductNickname.TANOSS: ProductInfo(nickname='TanosS', short_models=('a14', 'a15'))>, 'a15': <RoborockProductNickname.TANOSS: ProductInfo(nickname='TanosS', short_models=('a14', 'a15'))>, 'a39': <RoborockProductNickname.TANOSSC: ProductInfo(nickname='TanosSC', short_models=('a39', 'a40'))>, 'a40': <RoborockProductNickname.TANOSSC: ProductInfo(nickname='TanosSC', short_models=('a39', 'a40'))>, 'a33': <RoborockProductNickname.TANOSSE: ProductInfo(nickname='TanosSE', short_models=('a33', 'a34'))>, 'a34': <RoborockProductNickname.TANOSSE: ProductInfo(nickname='TanosSE', short_models=('a33', 'a34'))>, 'a52': <RoborockProductNickname.TANOSSMAX: ProductInfo(nickname='TanosSMax', short_models=('a52',))>, 'a37': <RoborockProductNickname.TANOSSLITE: ProductInfo(nickname='TanosSLite', short_models=('a37', 'a38'))>, 'a38': <RoborockProductNickname.TANOSSLITE: ProductInfo(nickname='TanosSLite', short_models=('a37', 'a38'))>, 'a23': <RoborockProductNickname.TANOSSPLUS: ProductInfo(nickname='TanosSPlus', short_models=('a23', 'a24'))>, 'a24': <RoborockProductNickname.TANOSSPLUS: ProductInfo(nickname='TanosSPlus', short_models=('a23', 'a24'))>, 't7p': <RoborockProductNickname.TANOSV: ProductInfo(nickname='TanosV', short_models=('t7p', 'a09', 'a10'))>, 'a09': <RoborockProductNickname.TANOSV: ProductInfo(nickname='TanosV', short_models=('t7p', 'a09', 'a10'))>, 'a10': <RoborockProductNickname.TANOSV: ProductInfo(nickname='TanosV', short_models=('t7p', 'a09', 'a10'))>, 'a29': <RoborockProductNickname.TOPAZS: ProductInfo(nickname='TopazS', short_models=('a29', 'a30', 'a76'))>, 'a30': <RoborockProductNickname.TOPAZS: ProductInfo(nickname='TopazS', short_models=('a29', 'a30', 'a76'))>, 'a76': <RoborockProductNickname.TOPAZS: ProductInfo(nickname='TopazS', short_models=('a29', 'a30', 'a76'))>, 'a64': <RoborockProductNickname.TOPAZSC: ProductInfo(nickname='TopazSC', short_models=('a64', 'a65'))>, 'a65': <RoborockProductNickname.TOPAZSC: ProductInfo(nickname='TopazSC', short_models=('a64', 'a65'))>, 'a46': <RoborockProductNickname.TOPAZSPLUS: ProductInfo(nickname='TopazSPlus', short_models=('a46', 'a47', 'a66'))>, 'a47': <RoborockProductNickname.TOPAZSPLUS: ProductInfo(nickname='TopazSPlus', short_models=('a46', 'a47', 'a66'))>, 'a66': <RoborockProductNickname.TOPAZSPLUS: ProductInfo(nickname='TopazSPlus', short_models=('a46', 'a47', 'a66'))>, 'a62': <RoborockProductNickname.TOPAZSPOWER: ProductInfo(nickname='TopazSPower', short_models=('a62',))>, 'a26': <RoborockProductNickname.TOPAZSV: ProductInfo(nickname='TopazSV', short_models=('a26', 'a27'))>, 'a27': <RoborockProductNickname.TOPAZSV: ProductInfo(nickname='TopazSV', short_models=('a26', 'a27'))>, 'a50': <RoborockProductNickname.ULTRON: ProductInfo(nickname='Ultron', short_models=('a50', 'a51'))>, 'a51': <RoborockProductNickname.ULTRON: ProductInfo(nickname='Ultron', short_models=('a50', 'a51'))>, 'a72': <RoborockProductNickname.ULTRONE: ProductInfo(nickname='UltronE', short_models=('a72', 'a84'))>, 'a84': <RoborockProductNickname.ULTRONE: ProductInfo(nickname='UltronE', short_models=('a72', 'a84'))>, 'a73': <RoborockProductNickname.ULTRONLITE: ProductInfo(nickname='UltronLite', short_models=('a73', 'a85'))>, 'a85': <RoborockProductNickname.ULTRONLITE: ProductInfo(nickname='UltronLite', short_models=('a73', 'a85'))>, 'a94': <RoborockProductNickname.ULTRONSC: ProductInfo(nickname='UltronSC', short_models=('a94', 'a95'))>, 'a95': <RoborockProductNickname.ULTRONSC: ProductInfo(nickname='UltronSC', short_models=('a94', 'a95'))>, 'a124': <RoborockProductNickname.ULTRONSE: ProductInfo(nickname='UltronSE', short_models=('a124', 'a125', 'a139', 'a140'))>, 'a125': <RoborockProductNickname.ULTRONSE: ProductInfo(nickname='UltronSE', short_models=('a124', 'a125', 'a139', 'a140'))>, 'a139': <RoborockProductNickname.ULTRONSE: ProductInfo(nickname='UltronSE', short_models=('a124', 'a125', 'a139', 'a140'))>, 'a140': <RoborockProductNickname.ULTRONSE: ProductInfo(nickname='UltronSE', short_models=('a124', 'a125', 'a139', 'a140'))>, 'a68': <RoborockProductNickname.ULTRONSPLUS: ProductInfo(nickname='UltronSPlus', short_models=('a68', 'a69', 'a70'))>, 'a69': <RoborockProductNickname.ULTRONSPLUS: ProductInfo(nickname='UltronSPlus', short_models=('a68', 'a69', 'a70'))>, 'a70': <RoborockProductNickname.ULTRONSPLUS: ProductInfo(nickname='UltronSPlus', short_models=('a68', 'a69', 'a70'))>, 'a96': <RoborockProductNickname.ULTRONSV: ProductInfo(nickname='UltronSV', short_models=('a96', 'a97'))>, 'a97': <RoborockProductNickname.ULTRONSV: ProductInfo(nickname='UltronSV', short_models=('a96', 'a97'))>, 'a146': <RoborockProductNickname.VERDELITE: ProductInfo(nickname='Verdelite', short_models=('a146', 'a147'))>, 'a147': <RoborockProductNickname.VERDELITE: ProductInfo(nickname='Verdelite', short_models=('a146', 'a147'))>, 'a134': <RoborockProductNickname.VIVIAN: ProductInfo(nickname='Vivian', short_models=('a134', 'a135', 'a155', 'a156'))>, 'a135': <RoborockProductNickname.VIVIAN: ProductInfo(nickname='Vivian', short_models=('a134', 'a135', 'a155', 'a156'))>, 'a155': <RoborockProductNickname.VIVIAN: ProductInfo(nickname='Vivian', short_models=('a134', 'a135', 'a155', 'a156'))>, 'a156': <RoborockProductNickname.VIVIAN: ProductInfo(nickname='Vivian', short_models=('a134', 'a135', 'a155', 'a156'))>, 'a158': <RoborockProductNickname.VIVIANC: ProductInfo(nickname='VivianC', short_models=('a158', 'a159'))>, 'a159': <RoborockProductNickname.VIVIANC: ProductInfo(nickname='VivianC', short_models=('a158', 'a159'))>}
class RoborockCategory(enum.Enum):
142class RoborockCategory(Enum):
143    """Describes the category of the device."""
144
145    WET_DRY_VAC = "roborock.wetdryvac"
146    VACUUM = "robot.vacuum.cleaner"
147    WASHING_MACHINE = "roborock.wm"
148    UNKNOWN = "UNKNOWN"
149
150    def __missing__(self, key):
151        _LOGGER.warning("Missing key %s from category", key)
152        return RoborockCategory.UNKNOWN

Describes the category of the device.

WET_DRY_VAC = <RoborockCategory.WET_DRY_VAC: 'roborock.wetdryvac'>
VACUUM = <RoborockCategory.VACUUM: 'robot.vacuum.cleaner'>
WASHING_MACHINE = <RoborockCategory.WASHING_MACHINE: 'roborock.wm'>
UNKNOWN = <RoborockCategory.UNKNOWN: 'UNKNOWN'>