From 4e49aa6f9ea34d1cc7120d2d3c6db15c6bc60831 Mon Sep 17 00:00:00 2001 From: Oleksandr B <7982859+o-borovets@users.noreply.github.com> Date: Tue, 8 Sep 2026 17:30:01 +0300 Subject: [PATCH] Add sensor platform to Tuya qccdz (EV charger) (#181640) --- homeassistant/components/tuya/const.py | 1 + homeassistant/components/tuya/sensor.py | 31 ++ homeassistant/components/tuya/strings.json | 16 + .../tuya/snapshots/test_sensor.ambr | 434 ++++++++++++++++++ 4 files changed, 482 insertions(+) diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index c788359ea4fc..72d94b28e445 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -642,6 +642,7 @@ class DPCode(StrEnum): CH4_SENSOR_STATE = "ch4_sensor_state" CH4_SENSOR_VALUE = "ch4_sensor_value" CHARGE_CUR_SET = "charge_cur_set" + CHARGE_ENERGY_ONCE = "charge_energy_once" CHARGE_STATE = "charge_state" CHILD_LOCK = "child_lock" # Child lock CISTERN = "cistern" diff --git a/homeassistant/components/tuya/sensor.py b/homeassistant/components/tuya/sensor.py index 9931d01ff49a..acb06214cf94 100644 --- a/homeassistant/components/tuya/sensor.py +++ b/homeassistant/components/tuya/sensor.py @@ -986,6 +986,37 @@ SENSORS: dict[DeviceCategory, tuple[TuyaSensorEntityDescription, ...]] = { ), *BATTERY_SENSORS, ), + DeviceCategory.QCCDZ: ( + TuyaSensorEntityDescription( + key=DPCode.WORK_STATE, + translation_key="charger_status", + ), + TuyaSensorEntityDescription( + key=DPCode.FORWARD_ENERGY_TOTAL, + translation_key="total_energy", + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + TuyaSensorEntityDescription( + key=DPCode.CHARGE_ENERGY_ONCE, + translation_key="session_energy", + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + TuyaSensorEntityDescription( + key=DPCode.POWER_TOTAL, + translation_key="total_power", + device_class=SensorDeviceClass.POWER, + state_class=SensorStateClass.MEASUREMENT, + ), + TuyaSensorEntityDescription( + key=DPCode.TEMP_CURRENT, + translation_key="temperature", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + ), + ), DeviceCategory.QN: ( TuyaSensorEntityDescription( key=DPCode.WORK_POWER, diff --git a/homeassistant/components/tuya/strings.json b/homeassistant/components/tuya/strings.json index 27f0f9c7adc6..cd489fcbbde8 100644 --- a/homeassistant/components/tuya/strings.json +++ b/homeassistant/components/tuya/strings.json @@ -705,6 +705,19 @@ "cat_weight": { "name": "Cat weight" }, + "charger_status": { + "name": "Status", + "state": { + "charger_charging": "[%key:common::state::charging%]", + "charger_end": "Finished", + "charger_fault": "[%key:common::state::fault%]", + "charger_free": "[%key:common::state::idle%]", + "charger_free_fault": "Fault while idle", + "charger_insert": "Plugged in", + "charger_pause": "[%key:common::state::paused%]", + "charger_wait": "Waiting" + } + }, "cleaning_area": { "name": "Cleaning area" }, @@ -935,6 +948,9 @@ "rolling_brush_life": { "name": "Rolling brush lifetime" }, + "session_energy": { + "name": "Session energy" + }, "side_brush_life": { "name": "Side brush lifetime" }, diff --git a/tests/components/tuya/snapshots/test_sensor.ambr b/tests/components/tuya/snapshots/test_sensor.ambr index d43d76529680..d354446a8df9 100644 --- a/tests/components/tuya/snapshots/test_sensor.ambr +++ b/tests/components/tuya/snapshots/test_sensor.ambr @@ -481,6 +481,136 @@ 'state': '239.6', }) # --- +# name: test_platform_setup_and_discovery[sensor.ac_charging_control_box_session_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.ac_charging_control_box_session_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Session energy', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Session energy', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'session_energy', + 'unique_id': 'tuya.qyy1auihjyoogvb7zdccqcharge_energy_once', + 'unit_of_measurement': , + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ac_charging_control_box_session_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'energy', + : 'AC charging control box Session energy', + : , + : , + }), + 'context': , + 'entity_id': 'sensor.ac_charging_control_box_session_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.01', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ac_charging_control_box_status-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : list([ + 'charger_free', + 'charger_insert', + 'charger_free_fault', + 'charger_wait', + 'charger_charging', + 'charger_pause', + 'charger_end', + 'charger_fault', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.ac_charging_control_box_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Status', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Status', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'charger_status', + 'unique_id': 'tuya.qyy1auihjyoogvb7zdccqwork_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ac_charging_control_box_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'enum', + : 'AC charging control box Status', + : list([ + 'charger_free', + 'charger_insert', + 'charger_free_fault', + 'charger_wait', + 'charger_charging', + 'charger_pause', + 'charger_end', + 'charger_fault', + ]), + }), + 'context': , + 'entity_id': 'sensor.ac_charging_control_box_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'charger_free', + }) +# --- # name: test_platform_setup_and_discovery[sensor.air_purifier_current-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ @@ -7917,6 +8047,310 @@ 'state': '237.7', }) # --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_session_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.ev_charger_session_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Session energy', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Session energy', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'session_energy', + 'unique_id': 'tuya.lr7th3bpx7masmsdzdccqcharge_energy_once', + 'unit_of_measurement': , + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_session_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'energy', + : 'EV Charger Session energy', + : , + : , + }), + 'context': , + 'entity_id': 'sensor.ev_charger_session_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_status-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : list([ + 'charger_free', + 'charger_insert', + 'charger_free_fault', + 'charger_wait', + 'charger_charging', + 'charger_pause', + 'charger_end', + 'charger_fault', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.ev_charger_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Status', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Status', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'charger_status', + 'unique_id': 'tuya.lr7th3bpx7masmsdzdccqwork_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'enum', + : 'EV Charger Status', + : list([ + 'charger_free', + 'charger_insert', + 'charger_free_fault', + 'charger_wait', + 'charger_charging', + 'charger_pause', + 'charger_end', + 'charger_fault', + ]), + }), + 'context': , + 'entity_id': 'sensor.ev_charger_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'charger_free', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.ev_charger_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Temperature', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Temperature', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'temperature', + 'unique_id': 'tuya.lr7th3bpx7masmsdzdccqtemp_current', + 'unit_of_measurement': , + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'temperature', + : 'EV Charger Temperature', + : , + : , + }), + 'context': , + 'entity_id': 'sensor.ev_charger_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '24.0', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_total_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.ev_charger_total_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Total energy', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Total energy', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'total_energy', + 'unique_id': 'tuya.lr7th3bpx7masmsdzdccqforward_energy_total', + 'unit_of_measurement': , + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_total_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'energy', + : 'EV Charger Total energy', + : , + : , + }), + 'context': , + 'entity_id': 'sensor.ev_charger_total_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.2', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_total_power-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.ev_charger_total_power', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Total power', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Total power', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'total_power', + 'unique_id': 'tuya.lr7th3bpx7masmsdzdccqpower_total', + 'unit_of_measurement': 'kW', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.ev_charger_total_power-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'power', + : 'EV Charger Total power', + : , + : 'kW', + }), + 'context': , + 'entity_id': 'sensor.ev_charger_total_power', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- # name: test_platform_setup_and_discovery[sensor.fenetre_cuisine_battery-entry] EntityRegistryEntrySnapshot({ 'aliases': list([