Add humidifier entity for humidifier and dehumidifier to LG ThinQ (#152593)

Co-authored-by: yunseon.park <yunseon.park@lge.com>
This commit is contained in:
LG-ThinQ-Integration
2026-01-09 17:41:20 +01:00
committed by GitHub
co-authored by yunseon.park
parent 1733599442
commit f79eef150e
12 changed files with 489 additions and 0 deletions
+1
View File
@@ -116,6 +116,7 @@ def mock_thinq_mqtt_client() -> Generator[None]:
params=[
"air_conditioner",
"washer",
"dehumidifier",
]
)
def device_fixture(request: pytest.FixtureRequest) -> Generator[str]:
@@ -0,0 +1,9 @@
{
"deviceId": "TQS-25A89504-EF8E-4C4E-99F3-3956ED3BD397",
"deviceInfo": {
"deviceType": "DEVICE_DEHUMIDIFIER",
"modelName": "DHUM_056905_KR",
"alias": "Test dehumidifier",
"reportable": true
}
}
@@ -0,0 +1,6 @@
{
"resultCode": "0000",
"result": {
"property": ["energyUsage"]
}
}
@@ -0,0 +1,78 @@
{
"notification": {
"push": ["WATER_IS_FULL"]
},
"property": {
"airFlow": {
"windStrengthLevel": {
"mode": ["r", "w"],
"type": "enum",
"value": {
"r": ["LOW", "HIGH"],
"w": ["LOW", "HIGH"]
}
}
},
"operation": {
"dehumidifierOperationMode": {
"mode": ["r", "w"],
"type": "enum",
"value": {
"r": ["POWER_ON", "POWER_OFF"],
"w": ["POWER_ON", "POWER_OFF"]
}
}
},
"dehumidifierJobMode": {
"currentJobMode": {
"mode": ["r", "w"],
"type": "enum",
"value": {
"r": [
"SMART_HUMIDITY",
"INTENSIVE_DRY",
"RAPID_HUMIDITY",
"QUIET_HUMIDITY",
"CLOTHES_DRY"
],
"w": [
"SMART_HUMIDITY",
"INTENSIVE_DRY",
"RAPID_HUMIDITY",
"QUIET_HUMIDITY",
"CLOTHES_DRY"
]
}
}
},
"humidity": {
"currentHumidity": {
"mode": ["r"],
"type": "range",
"value": {
"r": {
"max": 100,
"min": 0,
"step": 1
}
}
},
"targetHumidity": {
"mode": ["r", "w"],
"type": "range",
"value": {
"r": {
"max": 70,
"min": 30,
"step": 5
},
"w": {
"max": 70,
"min": 30,
"step": 5
}
}
}
}
}
}
@@ -0,0 +1,15 @@
{
"airFlow": {
"windStrengthLevel": "HIGH"
},
"dehumidifierJobMode": {
"currentJobMode": "SMART_HUMIDITY"
},
"humidity": {
"currentHumidity": 80,
"targetHumidity": 55
},
"operation": {
"dehumidifierOperationMode": "POWER_ON"
}
}
@@ -0,0 +1,76 @@
# serializer version: 1
# name: test_humidifier_entities[dehumidifier][humidifier.test_dehumidifier-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'available_modes': list([
'smart_humidity',
'intensive_dry',
'rapid_humidity',
'quiet_humidity',
'clothes_dry',
]),
'max_humidity': 70,
'min_humidity': 30,
'target_humidity_step': 5,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'humidifier',
'entity_category': None,
'entity_id': 'humidifier.test_dehumidifier',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <HumidifierDeviceClass.DEHUMIDIFIER: 'dehumidifier'>,
'original_icon': None,
'original_name': None,
'platform': 'lg_thinq',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': <HumidifierEntityFeature: 1>,
'translation_key': 'dehumidifier',
'unique_id': 'TQS-25A89504-EF8E-4C4E-99F3-3956ED3BD397_target_humidity',
'unit_of_measurement': None,
})
# ---
# name: test_humidifier_entities[dehumidifier][humidifier.test_dehumidifier-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'action': <HumidifierAction.DRYING: 'drying'>,
'available_modes': list([
'smart_humidity',
'intensive_dry',
'rapid_humidity',
'quiet_humidity',
'clothes_dry',
]),
'current_humidity': 80,
'device_class': 'dehumidifier',
'friendly_name': 'Test dehumidifier',
'humidity': 55,
'max_humidity': 70,
'min_humidity': 30,
'mode': 'smart_humidity',
'supported_features': <HumidifierEntityFeature: 1>,
'target_humidity_step': 5,
}),
'context': <ANY>,
'entity_id': 'humidifier.test_dehumidifier',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
@@ -194,4 +194,53 @@
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_switch_entities[dehumidifier][switch.test_dehumidifier_power-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'switch',
'entity_category': None,
'entity_id': 'switch.test_dehumidifier_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SwitchDeviceClass.SWITCH: 'switch'>,
'original_icon': None,
'original_name': 'Power',
'platform': 'lg_thinq',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'operation_power',
'unique_id': 'TQS-25A89504-EF8E-4C4E-99F3-3956ED3BD397_dehumidifier_operation_mode',
'unit_of_measurement': None,
})
# ---
# name: test_switch_entities[dehumidifier][switch.test_dehumidifier_power-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'switch',
'friendly_name': 'Test dehumidifier Power',
}),
'context': <ANY>,
'entity_id': 'switch.test_dehumidifier_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
@@ -0,0 +1,31 @@
"""Tests for the LG ThinQ humidifier platform."""
from unittest.mock import AsyncMock, patch
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import setup_integration
from tests.common import MockConfigEntry, snapshot_platform
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
@pytest.mark.parametrize("device_fixture", ["dehumidifier"])
async def test_humidifier_entities(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
devices: AsyncMock,
mock_thinq_api: AsyncMock,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test all entities."""
with patch("homeassistant.components.lg_thinq.PLATFORMS", [Platform.HUMIDIFIER]):
await setup_integration(hass, mock_config_entry)
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
+1
View File
@@ -15,6 +15,7 @@ from tests.common import MockConfigEntry, snapshot_platform
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
@pytest.mark.parametrize("device_fixture", ["air_conditioner", "washer"])
async def test_number_entities(
hass: HomeAssistant,
snapshot: SnapshotAssertion,