mirror of
https://github.com/sususweet/midea-meiju-codec.git
synced 2025-09-27 18:22:41 +00:00
130 lines
4.6 KiB
Python
130 lines
4.6 KiB
Python
from enum import IntEnum
|
|
from homeassistant.helpers.entity import Entity
|
|
from homeassistant.const import (
|
|
STATE_ON,
|
|
STATE_OFF
|
|
)
|
|
from .const import DOMAIN
|
|
from .core.logger import MideaLogger
|
|
|
|
|
|
class Rationale(IntEnum):
|
|
EQUALLY = 0
|
|
GREATER = 1
|
|
LESS = 2
|
|
|
|
|
|
class MideaEntity(Entity):
|
|
def __init__(self, device, manufacturer: str | None, rationale: list | None, entity_key: str, config: dict):
|
|
self._device = device
|
|
self._device.register_update(self.update_state)
|
|
self._entity_key = entity_key
|
|
self._config = config
|
|
self._device_name = self._device.device_name
|
|
self._rationale = rationale
|
|
if rationale_local := config.get("rationale"):
|
|
self._rationale = rationale_local
|
|
if self._rationale is None:
|
|
self._rationale = ["off", "on"]
|
|
self._attr_native_unit_of_measurement = self._config.get("unit_of_measurement")
|
|
self._attr_device_class = self._config.get("device_class")
|
|
self._attr_state_class = self._config.get("state_class")
|
|
self._attr_icon = self._config.get("icon")
|
|
self._attr_unique_id = f"{DOMAIN}.{self._device.device_id}_{self._entity_key}"
|
|
self._attr_device_info = {
|
|
"manufacturer": "Midea" if manufacturer is None else manufacturer,
|
|
"model": f"{self._device.model}",
|
|
"identifiers": {(DOMAIN, self._device.device_id)},
|
|
"name": self._device_name
|
|
}
|
|
name = self._config.get("name")
|
|
if name is None:
|
|
name = self._entity_key.replace("_", " ").title()
|
|
self._attr_name = f"{self._device_name} {name}"
|
|
self.entity_id = self._attr_unique_id
|
|
|
|
@property
|
|
def device(self):
|
|
return self._device
|
|
|
|
@property
|
|
def should_poll(self):
|
|
return False
|
|
|
|
@property
|
|
def available(self):
|
|
return self._device.connected
|
|
|
|
def _get_status_on_off(self, status_key: str):
|
|
result = False
|
|
status = self._device.get_attribute(status_key)
|
|
if status is not None:
|
|
try:
|
|
result = bool(self._rationale.index(status))
|
|
except ValueError:
|
|
MideaLogger.error(f"The value of attribute {status_key} ('{status}') "
|
|
f"is not in rationale {self._rationale}")
|
|
return result
|
|
|
|
def _set_status_on_off(self, status_key: str, turn_on: bool):
|
|
self._device.set_attribute(status_key, self._rationale[int(turn_on)])
|
|
|
|
def _list_get_selected(self, key_of_list: list, rationale: Rationale = Rationale.EQUALLY):
|
|
for index in range(0, len(key_of_list)):
|
|
match = True
|
|
for attr, value in key_of_list[index].items():
|
|
state_value = self._device.get_attribute(attr)
|
|
if state_value is None:
|
|
match = False
|
|
break
|
|
if rationale is Rationale.EQUALLY and state_value != value:
|
|
match = False
|
|
break
|
|
if rationale is Rationale.GREATER and state_value < value:
|
|
match = False
|
|
break
|
|
if rationale is Rationale.LESS and state_value > value:
|
|
match = False
|
|
break
|
|
if match:
|
|
return index
|
|
return None
|
|
|
|
def _dict_get_selected(self, key_of_dict: dict, rationale: Rationale = Rationale.EQUALLY):
|
|
for mode, status in key_of_dict.items():
|
|
match = True
|
|
for attr, value in status.items():
|
|
state_value = self._device.get_attribute(attr)
|
|
if state_value is None:
|
|
match = False
|
|
break
|
|
if rationale is Rationale.EQUALLY and state_value != value:
|
|
match = False
|
|
break
|
|
if rationale is Rationale.GREATER and state_value < value:
|
|
match = False
|
|
break
|
|
if rationale is Rationale.LESS and state_value > value:
|
|
match = False
|
|
break
|
|
if match:
|
|
return mode
|
|
return None
|
|
|
|
def update_state(self, status):
|
|
if self._entity_key in status or "connected" in status:
|
|
try:
|
|
self.schedule_update_ha_state()
|
|
except Exception as e:
|
|
pass
|
|
|
|
|
|
class MideaBinaryBaseEntity(MideaEntity):
|
|
|
|
@property
|
|
def state(self):
|
|
return STATE_ON if self.is_on else STATE_OFF
|
|
|
|
@property
|
|
def is_on(self):
|
|
return self._get_status_on_off(self._entity_key) |