Files
midea-meiju-codec/custom_components/midea_auto_cloud/humidifier.py

173 lines
6.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from homeassistant.components.humidifier import (
HumidifierEntity,
HumidifierDeviceClass, HumidifierEntityFeature
)
from homeassistant.const import Platform
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .core.logger import MideaLogger
from .midea_entity import MideaEntity
from . import load_device_config
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up humidifier entities for Midea devices."""
account_bucket = hass.data.get(DOMAIN, {}).get("accounts", {}).get(config_entry.entry_id)
if not account_bucket:
async_add_entities([])
return
device_list = account_bucket.get("device_list", {})
coordinator_map = account_bucket.get("coordinator_map", {})
devs = []
for device_id, info in device_list.items():
device_type = info.get("type")
sn8 = info.get("sn8")
config = await load_device_config(hass, device_type, sn8) or {}
entities_cfg = (config.get("entities") or {}).get(Platform.HUMIDIFIER, {})
manufacturer = config.get("manufacturer")
rationale = config.get("rationale")
coordinator = coordinator_map.get(device_id)
device = coordinator.device if coordinator else None
for entity_key, ecfg in entities_cfg.items():
devs.append(MideaHumidifierEntity(
coordinator, device, manufacturer, rationale, entity_key, ecfg
))
async_add_entities(devs)
class MideaHumidifierEntity(MideaEntity, HumidifierEntity):
"""Generic humidifier entity."""
def __init__(self, coordinator, device, manufacturer, rationale, entity_key, config):
super().__init__(
coordinator,
device.device_id,
device.device_name,
f"T0x{device.device_type:02X}",
device.sn,
device.sn8,
device.model,
entity_key,
device=device,
manufacturer=manufacturer,
rationale=rationale,
config=config,
)
self._attr_supported_features = HumidifierEntityFeature.MODES
self._attr_available_modes = list(self._config.get("modes").keys())
# 新增:外部湿度传感器支持
# 设备当前使用加湿器内置湿度传感器。如需外接更高精度传感器可在midea_auto_cloud/device_mapping设备对应文件中编辑 'external_humidity_sensor_map' 部分进行配置
external_map = self._config.get("external_humidity_sensor_map", {})
self._has_external_sensor = self._sn8 in external_map
if self._has_external_sensor:
self._external_sensor_id = external_map[self._sn8]
@property
def device_class(self):
"""Return the device class."""
return self._config.get("device_class", HumidifierDeviceClass.HUMIDIFIER)
@property
def is_on(self):
"""Return if the humidifier is on."""
power_key = self._config.get("power")
if power_key:
value = self.device_attributes.get(power_key)
if isinstance(value, bool):
return value
return value == 1 or value == "on" or value == "true"
return False
@property
def target_humidity(self):
"""Return the target humidity."""
target_humidity_key = self._config.get("target_humidity")
if target_humidity_key:
return self.device_attributes.get(target_humidity_key, 0)
return 0
@property
def current_humidity(self):
"""Return the current humidity."""
# 支持外部湿度传感器 jesusya
if self._has_external_sensor:
state = self.hass.states.get(self._external_sensor_id)
if state and state.state not in (None, "unknown", "unavailable"):
try:
new_humidity = round(float(state.state))
self._current_humidity = new_humidity
MideaLogger.debug(f"{self.entity_id} using external sensor humidity from {self._external_sensor_id}: {self._current_humidity}")
return self._current_humidity
except (ValueError, TypeError, AttributeError) as e:
MideaLogger.warning(f"{self.entity_id} failed to parse external sensor state from {self._external_sensor_id}: {e}")
else:
MideaLogger.warning(f"{self.entity_id} external sensor {self._external_sensor_id} unavailable")
# 回退到内部传感器或直接使用内部传感器
current_humidity_key = self._config.get("current_humidity")
if current_humidity_key:
return self.device_attributes.get(current_humidity_key, 0)
return 0
@property
def min_humidity(self):
"""Return the minimum humidity."""
return self._config.get("min_humidity", 30)
@property
def max_humidity(self):
"""Return the maximum humidity."""
return self._config.get("max_humidity", 80)
@property
def mode(self):
"""Return the current mode."""
mode_key = self._config.get("mode")
if mode_key:
return self.device_attributes.get(mode_key, "manual")
return "manual"
@property
def available_modes(self):
"""Return the available modes."""
modes = self._config.get("modes", {})
return list(modes.keys())
async def async_turn_on(self, **kwargs):
"""Turn the humidifier on."""
power_key = self._config.get("power")
if power_key:
await self._device.set_attribute(power_key, self._rationale[int(True)])
async def async_turn_off(self, **kwargs):
"""Turn the humidifier off."""
power_key = self._config.get("power")
if power_key:
await self._device.set_attribute(power_key, self._rationale[int(False)])
await self._device.set_attribute(power_key, self._rationale[int(False)]) #避免美的加湿器,挂机启动风干湿帘,噪音过大
async def async_set_humidity(self, humidity: int):
"""Set the target humidity."""
target_humidity_key = self._config.get("target_humidity")
if target_humidity_key:
await self._device.set_attribute(target_humidity_key, humidity)
async def async_set_mode(self, mode: str):
"""Set the mode."""
mode_key = self._config.get("mode")
modes = self._config.get("modes", {})
if mode_key and mode in modes:
mode_config = modes[mode]
for attr_key, attr_value in mode_config.items():
await self._device.set_attribute(attr_key, attr_value)