From 34abdfbe1c7053ee092e3884f48d504ba4242c87 Mon Sep 17 00:00:00 2001 From: Home Assistant Contributor Date: Fri, 1 May 2026 04:08:35 +0000 Subject: [PATCH 1/4] Add DLQ CUR_NEUTRAL sensor mapping and Tuya DLQ fixture/test coverage --- homeassistant/components/tuya/sensor.py | 6 + .../tuya/fixtures/dlq_spm02_wifi.json | 268 +++++++ .../tuya/snapshots/test_sensor.ambr | 656 ++++++++++++++++++ 3 files changed, 930 insertions(+) create mode 100644 tests/components/tuya/fixtures/dlq_spm02_wifi.json diff --git a/homeassistant/components/tuya/sensor.py b/homeassistant/components/tuya/sensor.py index 45eb83063a9368..8a3d16b2191da2 100644 --- a/homeassistant/components/tuya/sensor.py +++ b/homeassistant/components/tuya/sensor.py @@ -391,6 +391,12 @@ class TuyaSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.ENERGY, state_class=SensorStateClass.TOTAL_INCREASING, ), + TuyaSensorEntityDescription( + key=DPCode.CUR_NEUTRAL, + translation_key="total_production", + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), TuyaSensorEntityDescription( key=DPCode.SUPPLY_FREQUENCY, translation_key="supply_frequency", diff --git a/tests/components/tuya/fixtures/dlq_spm02_wifi.json b/tests/components/tuya/fixtures/dlq_spm02_wifi.json new file mode 100644 index 00000000000000..6f989c7b6c8034 --- /dev/null +++ b/tests/components/tuya/fixtures/dlq_spm02_wifi.json @@ -0,0 +1,268 @@ +{ + "endpoint": "https://apigw.tuyaus.com", + "mqtt_connected": true, + "disabled_by": null, + "disabled_polling": false, + "name": "SPM02_WiFi", + "category": "dlq", + "product_id": "fygozcnralhwbauo", + "product_name": "SPM02_WiFi", + "online": true, + "sub": false, + "time_zone": "-03:00", + "active_time": "2024-07-29T11:20:00+00:00", + "create_time": "2024-07-29T11:20:00+00:00", + "update_time": "2024-07-29T11:20:00+00:00", + "function": { + "switch_prepayment": { + "type": "Boolean", + "value": "{}" + }, + "clear_energy": { + "type": "Boolean", + "value": "{}" + }, + "charge_energy": { + "type": "Integer", + "value": "{\"unit\":\"kW·h\",\"min\":0,\"max\":999999,\"scale\":2,\"step\":1}" + }, + "alarm_set_1": { + "type": "Raw", + "value": "{}" + }, + "alarm_set_2": { + "type": "Raw", + "value": "{}" + } + }, + "status_range": { + "total_forward_energy": { + "type": "Integer", + "value": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}", + "report_type": "minux" + }, + "cur_neutral": { + "type": "Integer", + "value": "{\"unit\":\"kW.h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}", + "report_type": null + }, + "phase_a": { + "type": "Raw", + "value": "{}", + "report_type": null + }, + "phase_b": { + "type": "Raw", + "value": "{}", + "report_type": null + }, + "phase_c": { + "type": "Raw", + "value": "{}", + "report_type": null + }, + "fault": { + "type": "Bitmap", + "value": "{\"label\":[\"short_circuit_alarm\",\"surge_alarm\",\"overload_alarm\",\"leakagecurr_alarm\",\"temp_dif_fault\",\"fire_alarm\",\"high_power_alarm\",\"self_test_alarm\",\"ov_cr\",\"unbalance_alarm\",\"ov_vol\",\"undervoltage_alarm\",\"miss_phase_alarm\",\"outage_alarm\",\"magnetism_alarm\",\"credit_alarm\",\"no_balance_alarm\"]}", + "report_type": null + }, + "switch_prepayment": { + "type": "Boolean", + "value": "{}", + "report_type": null + }, + "energy_reset": { + "type": "Enum", + "value": "{\"range\":[\"empty\"]}", + "report_type": null + }, + "balance_energy": { + "type": "Integer", + "value": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}", + "report_type": null + }, + "charge_energy": { + "type": "Integer", + "value": "{\"unit\":\"kW·h\",\"min\":0,\"max\":999999,\"scale\":2,\"step\":1}", + "report_type": null + }, + "alarm_set_1": { + "type": "Raw", + "value": "{}", + "report_type": null + }, + "alarm_set_2": { + "type": "Raw", + "value": "{}", + "report_type": null + }, + "breaker_number": { + "type": "String", + "value": "{\"maxlen\":255}", + "report_type": null + } + }, + "status": { + "total_forward_energy": 2201877, + "cur_neutral": 2124957, + "phase_a": "CN8AAP8AAAY=", + "phase_b": "CRUAA7gAAKA=", + "phase_c": "CNAAESQAA6w=", + "fault": 0, + "switch_prepayment": false, + "energy_reset": "", + "balance_energy": 0, + "charge_energy": 1500, + "alarm_set_1": "BwEADQgBAAA=", + "alarm_set_2": "AQEAPAIAADIDAQD9BAEAXwUBAAAHAAAACAAAHgkAAAA=", + "breaker_number": "SPM02_BB0F" + }, + "set_up": true, + "support_local": true, + "local_strategy": { + "1": { + "value_convert": "default", + "status_code": "total_forward_energy", + "config_item": { + "statusFormat": "{\"total_forward_energy\":\"$\"}", + "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}", + "valueType": "Integer", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "2": { + "value_convert": "default", + "status_code": "cur_neutral", + "config_item": { + "statusFormat": "{\"cur_neutral\":\"$\"}", + "valueDesc": "{\"unit\":\"kW.h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}", + "valueType": "Integer", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "6": { + "value_convert": "default", + "status_code": "phase_a", + "config_item": { + "statusFormat": "{\"phase_a\":\"$\"}", + "valueDesc": "{}", + "valueType": "Raw", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "7": { + "value_convert": "default", + "status_code": "phase_b", + "config_item": { + "statusFormat": "{\"phase_b\":\"$\"}", + "valueDesc": "{}", + "valueType": "Raw", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "8": { + "value_convert": "default", + "status_code": "phase_c", + "config_item": { + "statusFormat": "{\"phase_c\":\"$\"}", + "valueDesc": "{}", + "valueType": "Raw", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "9": { + "value_convert": "default", + "status_code": "fault", + "config_item": { + "statusFormat": "{\"fault\":\"$\"}", + "valueDesc": "{\"label\":[\"short_circuit_alarm\",\"surge_alarm\",\"overload_alarm\",\"leakagecurr_alarm\",\"temp_dif_fault\",\"fire_alarm\",\"high_power_alarm\",\"self_test_alarm\",\"ov_cr\",\"unbalance_alarm\",\"ov_vol\",\"undervoltage_alarm\",\"miss_phase_alarm\",\"outage_alarm\",\"magnetism_alarm\",\"credit_alarm\",\"no_balance_alarm\"]}", + "valueType": "Bitmap", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "11": { + "value_convert": "default", + "status_code": "switch_prepayment", + "config_item": { + "statusFormat": "{\"switch_prepayment\":\"$\"}", + "valueDesc": "{}", + "valueType": "Boolean", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "12": { + "value_convert": "enum", + "status_code": "clear_energy", + "config_item": { + "statusFormat": "{\"energy_reset\":\"$\"}", + "valueDesc": "{\"range\":[\"empty\"]}", + "valueType": "Enum", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "13": { + "value_convert": "default", + "status_code": "balance_energy", + "config_item": { + "statusFormat": "{\"balance_energy\":\"$\"}", + "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}", + "valueType": "Integer", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "14": { + "value_convert": "default", + "status_code": "charge_energy", + "config_item": { + "statusFormat": "{\"charge_energy\":\"$\"}", + "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":999999,\"scale\":2,\"step\":1}", + "valueType": "Integer", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "17": { + "value_convert": "default", + "status_code": "alarm_set_1", + "config_item": { + "statusFormat": "{\"alarm_set_1\":\"$\"}", + "valueDesc": "{}", + "valueType": "Raw", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "18": { + "value_convert": "default", + "status_code": "alarm_set_2", + "config_item": { + "statusFormat": "{\"alarm_set_2\":\"$\"}", + "valueDesc": "{}", + "valueType": "Raw", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + }, + "19": { + "value_convert": "default", + "status_code": "breaker_number", + "config_item": { + "statusFormat": "{\"breaker_number\":\"$\"}", + "valueDesc": "{\"maxlen\":255}", + "valueType": "String", + "enumMappingMap": {}, + "pid": "fygozcnralhwbauo" + } + } + }, + "warnings": null +} diff --git a/tests/components/tuya/snapshots/test_sensor.ambr b/tests/components/tuya/snapshots/test_sensor.ambr index 07e34176e7533d..066bed0c85828a 100644 --- a/tests/components/tuya/snapshots/test_sensor.ambr +++ b/tests/components/tuya/snapshots/test_sensor.ambr @@ -20750,6 +20750,662 @@ 'state': '238.1', }) # --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_a_current-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_a_current', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase A current', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': 'A', + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase A current', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_a_current', + 'unique_id': 'tuya.ifiw20mpsqldphase_aelectriccurrent', + 'unit_of_measurement': 'A', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_a_current-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'current', + 'friendly_name': 'SPM02_WiFi Phase A current', + 'state_class': , + 'unit_of_measurement': 'A', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_a_current', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.255', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_a_power-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_a_power', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase A power', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': 'kW', + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase A power', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_a_power', + 'unique_id': 'tuya.ifiw20mpsqldphase_apower', + 'unit_of_measurement': 'kW', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_a_power-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'SPM02_WiFi Phase A power', + 'state_class': , + 'unit_of_measurement': 'kW', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_a_power', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.006', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_a_voltage-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_a_voltage', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase A voltage', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase A voltage', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_a_voltage', + 'unique_id': 'tuya.ifiw20mpsqldphase_avoltage', + 'unit_of_measurement': 'V', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_a_voltage-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'voltage', + 'friendly_name': 'SPM02_WiFi Phase A voltage', + 'state_class': , + 'unit_of_measurement': 'V', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_a_voltage', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '227.1', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_b_current-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_b_current', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase B current', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': 'A', + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase B current', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_b_current', + 'unique_id': 'tuya.ifiw20mpsqldphase_belectriccurrent', + 'unit_of_measurement': 'A', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_b_current-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'current', + 'friendly_name': 'SPM02_WiFi Phase B current', + 'state_class': , + 'unit_of_measurement': 'A', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_b_current', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.952', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_b_power-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_b_power', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase B power', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': 'kW', + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase B power', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_b_power', + 'unique_id': 'tuya.ifiw20mpsqldphase_bpower', + 'unit_of_measurement': 'kW', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_b_power-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'SPM02_WiFi Phase B power', + 'state_class': , + 'unit_of_measurement': 'kW', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_b_power', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.16', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_b_voltage-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_b_voltage', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase B voltage', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase B voltage', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_b_voltage', + 'unique_id': 'tuya.ifiw20mpsqldphase_bvoltage', + 'unit_of_measurement': 'V', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_b_voltage-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'voltage', + 'friendly_name': 'SPM02_WiFi Phase B voltage', + 'state_class': , + 'unit_of_measurement': 'V', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_b_voltage', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '232.5', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_c_current-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_c_current', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase C current', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': 'A', + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase C current', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_c_current', + 'unique_id': 'tuya.ifiw20mpsqldphase_celectriccurrent', + 'unit_of_measurement': 'A', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_c_current-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'current', + 'friendly_name': 'SPM02_WiFi Phase C current', + 'state_class': , + 'unit_of_measurement': 'A', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_c_current', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '4.388', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_c_power-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_c_power', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase C power', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': 'kW', + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase C power', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_c_power', + 'unique_id': 'tuya.ifiw20mpsqldphase_cpower', + 'unit_of_measurement': 'kW', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_c_power-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'SPM02_WiFi Phase C power', + 'state_class': , + 'unit_of_measurement': 'kW', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_c_power', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.94', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_c_voltage-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_phase_c_voltage', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Phase C voltage', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Phase C voltage', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'phase_c_voltage', + 'unique_id': 'tuya.ifiw20mpsqldphase_cvoltage', + 'unit_of_measurement': 'V', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_phase_c_voltage-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'voltage', + 'friendly_name': 'SPM02_WiFi Phase C voltage', + 'state_class': , + 'unit_of_measurement': 'V', + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_phase_c_voltage', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '225.6', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_total_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_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.ifiw20mpsqldtotal_forward_energy', + 'unit_of_measurement': , + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_total_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'SPM02_WiFi Total energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_total_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '22018.77', + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_total_production-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.spm02_wifi_total_production', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Total production', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Total production', + 'platform': 'tuya', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'total_production', + 'unique_id': 'tuya.ifiw20mpsqldcur_neutral', + 'unit_of_measurement': , + }) +# --- +# name: test_platform_setup_and_discovery[sensor.spm02_wifi_total_production-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'SPM02_WiFi Total production', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.spm02_wifi_total_production', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '21249.57', + }) +# --- # name: test_platform_setup_and_discovery[sensor.steel_cage_door_battery_state-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ From 3472387a121400e94cfe48313289b2deca95f5c4 Mon Sep 17 00:00:00 2001 From: Home Assistant Contributor Date: Fri, 1 May 2026 04:31:03 +0000 Subject: [PATCH 2/4] Add missing Tuya device registry snapshot for ifiw20mpsqld --- .../components/tuya/snapshots/test_init.ambr | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/components/tuya/snapshots/test_init.ambr b/tests/components/tuya/snapshots/test_init.ambr index 99185f6bc74bff..e3267f23676c63 100644 --- a/tests/components/tuya/snapshots/test_init.ambr +++ b/tests/components/tuya/snapshots/test_init.ambr @@ -9578,3 +9578,34 @@ 'via_device_id': None, }) # --- +# name: test_device_registry[ifiw20mpsqld] + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entries': , + 'config_entries_subentries': , + 'configuration_url': None, + 'connections': set({ + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': None, + 'id': , + 'identifiers': set({ + tuple( + 'tuya', + 'ifiw20mpsqld', + ), + }), + 'labels': set({ + }), + 'manufacturer': 'Tuya', + 'model': 'SPM02_WiFi', + 'model_id': 'fygozcnralhwbauo', + 'name': 'SPM02_WiFi', + 'name_by_user': None, + 'primary_config_entry': , + 'serial_number': None, + 'sw_version': None, + 'via_device_id': None, + }) +# --- From 59eb440e05ac7594c405f884225530e10fedb50e Mon Sep 17 00:00:00 2001 From: Home Assistant Contributor Date: Sat, 9 May 2026 00:52:19 +0000 Subject: [PATCH 3/4] Remove CUR_NEUTRAL sensor mapping from Tuya sensor definitions --- homeassistant/components/tuya/sensor.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/homeassistant/components/tuya/sensor.py b/homeassistant/components/tuya/sensor.py index 886eb78f410fd2..8383d11d5f17de 100644 --- a/homeassistant/components/tuya/sensor.py +++ b/homeassistant/components/tuya/sensor.py @@ -394,12 +394,6 @@ class TuyaSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.ENERGY, state_class=SensorStateClass.TOTAL_INCREASING, ), - TuyaSensorEntityDescription( - key=DPCode.CUR_NEUTRAL, - translation_key="total_production", - device_class=SensorDeviceClass.ENERGY, - state_class=SensorStateClass.TOTAL_INCREASING, - ), TuyaSensorEntityDescription( key=DPCode.SUPPLY_FREQUENCY, translation_key="supply_frequency", From 702ab3ff7cc3bf66f693582be8cd81014a1b6647 Mon Sep 17 00:00:00 2001 From: Home Assistant Contributor Date: Sat, 9 May 2026 01:08:58 +0000 Subject: [PATCH 4/4] Remove SPM02 WiFi total production sensor snapshots from Tuya test definitions --- .../tuya/snapshots/test_sensor.ambr | 58 ------------------- 1 file changed, 58 deletions(-) diff --git a/tests/components/tuya/snapshots/test_sensor.ambr b/tests/components/tuya/snapshots/test_sensor.ambr index 7a671ae6a92131..073ea75bdf161e 100644 --- a/tests/components/tuya/snapshots/test_sensor.ambr +++ b/tests/components/tuya/snapshots/test_sensor.ambr @@ -21698,64 +21698,6 @@ 'state': '22018.77', }) # --- -# name: test_platform_setup_and_discovery[sensor.spm02_wifi_total_production-entry] - EntityRegistryEntrySnapshot({ - 'aliases': list([ - None, - ]), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': None, - 'entity_id': 'sensor.spm02_wifi_total_production', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'object_id_base': 'Total production', - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Total production', - 'platform': 'tuya', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'total_production', - 'unique_id': 'tuya.ifiw20mpsqldcur_neutral', - 'unit_of_measurement': , - }) -# --- -# name: test_platform_setup_and_discovery[sensor.spm02_wifi_total_production-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'energy', - 'friendly_name': 'SPM02_WiFi Total production', - 'state_class': , - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'sensor.spm02_wifi_total_production', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '21249.57', - }) -# --- # name: test_platform_setup_and_discovery[sensor.steel_cage_door_battery_state-entry] EntityRegistryEntrySnapshot({ 'aliases': list([