1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-30 12:14:20 +01:00

Add more entities for Tuya camera (#169966)

Co-authored-by: mik-laj <12058428+mik-laj@users.noreply.github.com>
Co-authored-by: Norbert Rittel <norbert@rittel.de>
This commit is contained in:
Kamil Breguła
2026-05-11 12:25:42 +02:00
committed by GitHub
parent 0789eb0db6
commit ed0abfb238
8 changed files with 591 additions and 1 deletions
+12 -1
View File
@@ -6,7 +6,11 @@ from tuya_device_handlers.definition.button import (
)
from tuya_sharing import CustomerDevice, Manager
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.components.button import (
ButtonDeviceClass,
ButtonEntity,
ButtonEntityDescription,
)
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
@@ -63,6 +67,13 @@ BUTTONS: dict[DeviceCategory, tuple[ButtonEntityDescription, ...]] = {
entity_category=EntityCategory.CONFIG,
),
),
DeviceCategory.SP: (
ButtonEntityDescription(
key=DPCode.DEVICE_RESTART,
device_class=ButtonDeviceClass.RESTART,
entity_category=EntityCategory.CONFIG,
),
),
}
+6
View File
@@ -696,6 +696,7 @@ class DPCode(StrEnum):
DEHUMIDITY_SET_VALUE = "dehumidify_set_value"
DELAY_CLEAN_TIME = "delay_clean_time"
DELAY_SET = "delay_set"
DEVICE_RESTART = "device_restart"
DEW_POINT_TEMP = "dew_point_temp"
DISINFECTION = "disinfection"
DO_NOT_DISTURB = "do_not_disturb"
@@ -751,6 +752,10 @@ class DPCode(StrEnum):
HUMIDITY_VALUE = "humidity_value" # Humidity
INSTALLATION_HEIGHT = "installation_height"
INVERTER_OUTPUT_POWER = "inverter_output_power"
IPC_AUTO_SIREN = "ipc_auto_siren"
IPC_BRIGHT = "ipc_bright"
IPC_CONTRAST = "ipc_contrast"
IPC_SHARP = "ipc_sharp"
IPC_WORK_MODE = "ipc_work_mode"
LED_TYPE_1 = "led_type_1"
LED_TYPE_2 = "led_type_2"
@@ -776,6 +781,7 @@ class DPCode(StrEnum):
MINI_SET = "mini_set"
MODE = "mode" # Working mode / Mode
MOODLIGHTING = "moodlighting" # Mood light
MOTION_AREA_SWITCH = "motion_area_switch" # Activity area
MOTION_RECORD = "motion_record"
MOTION_SENSITIVITY = "motion_sensitivity"
MOTION_SWITCH = "motion_switch" # Motion switch
+15
View File
@@ -299,6 +299,21 @@ NUMBERS: dict[DeviceCategory, tuple[NumberEntityDescription, ...]] = {
translation_key="volume",
entity_category=EntityCategory.CONFIG,
),
NumberEntityDescription(
key=DPCode.IPC_BRIGHT,
translation_key="video_brightness",
entity_category=EntityCategory.CONFIG,
),
NumberEntityDescription(
key=DPCode.IPC_CONTRAST,
translation_key="video_contrast",
entity_category=EntityCategory.CONFIG,
),
NumberEntityDescription(
key=DPCode.IPC_SHARP,
translation_key="video_sharpness",
entity_category=EntityCategory.CONFIG,
),
),
DeviceCategory.SZJQR: (
NumberEntityDescription(
@@ -256,6 +256,15 @@
"time": {
"name": "Time"
},
"video_brightness": {
"name": "Video brightness"
},
"video_contrast": {
"name": "Video contrast"
},
"video_sharpness": {
"name": "Video sharpness"
},
"voice_times": {
"name": "Voice times"
},
@@ -943,6 +952,9 @@
"auto_clean": {
"name": "Auto clean"
},
"auto_siren": {
"name": "Auto-trigger siren"
},
"battery_lock": {
"name": "Battery lock"
},
@@ -997,6 +1009,9 @@
"motion_alarm": {
"name": "Motion alarm"
},
"motion_detection_zone": {
"name": "Use motion detection zone"
},
"motion_recording": {
"name": "Motion recording"
},
+10
View File
@@ -717,6 +717,16 @@ SWITCHES: dict[DeviceCategory, tuple[SwitchEntityDescription, ...]] = {
translation_key="motion_alarm",
entity_category=EntityCategory.CONFIG,
),
SwitchEntityDescription(
key=DPCode.MOTION_AREA_SWITCH,
translation_key="motion_detection_zone",
entity_category=EntityCategory.CONFIG,
),
SwitchEntityDescription(
key=DPCode.IPC_AUTO_SIREN,
translation_key="auto_siren",
entity_category=EntityCategory.CONFIG,
),
),
DeviceCategory.SZ: (
SwitchEntityDescription(
@@ -1,4 +1,106 @@
# serializer version: 1
# name: test_platform_setup_and_discovery[button.c9_restart-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'button',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'button.c9_restart',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Restart',
'options': dict({
}),
'original_device_class': <ButtonDeviceClass.RESTART: 'restart'>,
'original_icon': None,
'original_name': 'Restart',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'tuya.fjdyw5ld2f5f5ddspsdevice_restart',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[button.c9_restart-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'restart',
'friendly_name': 'C9 Restart',
}),
'context': <ANY>,
'entity_id': 'button.c9_restart',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_platform_setup_and_discovery[button.intercom_restart-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'button',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'button.intercom_restart',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Restart',
'options': dict({
}),
'original_device_class': <ButtonDeviceClass.RESTART: 'restart'>,
'original_icon': None,
'original_name': 'Restart',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'tuya.qt0o5jlatiqf2rscpsdevice_restart',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[button.intercom_restart-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'restart',
'friendly_name': 'Intercom Restart',
}),
'context': <ANY>,
'entity_id': 'button.intercom_restart',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_platform_setup_and_discovery[button.kattenbak_factory_reset-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -199,6 +301,57 @@
'state': 'unknown',
})
# ---
# name: test_platform_setup_and_discovery[button.security_camera_restart-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'button',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'button.security_camera_restart',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Restart',
'options': dict({
}),
'original_device_class': <ButtonDeviceClass.RESTART: 'restart'>,
'original_icon': None,
'original_name': 'Restart',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'tuya.xihygtyd0d1faknkpsdevice_restart',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[button.security_camera_restart-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'restart',
'friendly_name': 'Security Camera Restart',
}),
'context': <ANY>,
'entity_id': 'button.security_camera_restart',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_platform_setup_and_discovery[button.v20_reset_duster_cloth-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -2361,6 +2361,186 @@
'state': '0.1',
})
# ---
# name: test_platform_setup_and_discovery[number.security_camera_video_brightness-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
'max': 100.0,
'min': 0.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1.0,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.security_camera_video_brightness',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Video brightness',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Video brightness',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'video_brightness',
'unique_id': 'tuya.xihygtyd0d1faknkpsipc_bright',
'unit_of_measurement': '%',
})
# ---
# name: test_platform_setup_and_discovery[number.security_camera_video_brightness-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Security Camera Video brightness',
'max': 100.0,
'min': 0.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1.0,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.security_camera_video_brightness',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '50.0',
})
# ---
# name: test_platform_setup_and_discovery[number.security_camera_video_contrast-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
'max': 100.0,
'min': 0.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1.0,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.security_camera_video_contrast',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Video contrast',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Video contrast',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'video_contrast',
'unique_id': 'tuya.xihygtyd0d1faknkpsipc_contrast',
'unit_of_measurement': '%',
})
# ---
# name: test_platform_setup_and_discovery[number.security_camera_video_contrast-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Security Camera Video contrast',
'max': 100.0,
'min': 0.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1.0,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.security_camera_video_contrast',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '50.0',
})
# ---
# name: test_platform_setup_and_discovery[number.security_camera_video_sharpness-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
'max': 100.0,
'min': 0.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1.0,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.security_camera_video_sharpness',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Video sharpness',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Video sharpness',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'video_sharpness',
'unique_id': 'tuya.xihygtyd0d1faknkpsipc_sharp',
'unit_of_measurement': '%',
})
# ---
# name: test_platform_setup_and_discovery[number.security_camera_video_sharpness-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Security Camera Video sharpness',
'max': 100.0,
'min': 0.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1.0,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.security_camera_video_sharpness',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '50.0',
})
# ---
# name: test_platform_setup_and_discovery[number.siren_time-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -1820,6 +1820,56 @@
'state': 'on',
})
# ---
# name: test_platform_setup_and_discovery[switch.c9_auto_trigger_siren-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.c9_auto_trigger_siren',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Auto-trigger siren',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Auto-trigger siren',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'auto_siren',
'unique_id': 'tuya.fjdyw5ld2f5f5ddspsipc_auto_siren',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[switch.c9_auto_trigger_siren-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'C9 Auto-trigger siren',
}),
'context': <ANY>,
'entity_id': 'switch.c9_auto_trigger_siren',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_platform_setup_and_discovery[switch.c9_flip-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -4789,6 +4839,56 @@
'state': 'on',
})
# ---
# name: test_platform_setup_and_discovery[switch.garage_camera_use_motion_detection_zone-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.garage_camera_use_motion_detection_zone',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Use motion detection zone',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Use motion detection zone',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'motion_detection_zone',
'unique_id': 'tuya.53fnjncm3jywuaznpsmotion_area_switch',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[switch.garage_camera_use_motion_detection_zone-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Garage Camera Use motion detection zone',
}),
'context': <ANY>,
'entity_id': 'switch.garage_camera_use_motion_detection_zone',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
# name: test_platform_setup_and_discovery[switch.garage_camera_video_recording-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -9175,6 +9275,56 @@
'state': 'on',
})
# ---
# name: test_platform_setup_and_discovery[switch.security_camera_auto_trigger_siren-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.security_camera_auto_trigger_siren',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Auto-trigger siren',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Auto-trigger siren',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'auto_siren',
'unique_id': 'tuya.xihygtyd0d1faknkpsipc_auto_siren',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[switch.security_camera_auto_trigger_siren-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Security Camera Auto-trigger siren',
}),
'context': <ANY>,
'entity_id': 'switch.security_camera_auto_trigger_siren',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_platform_setup_and_discovery[switch.security_camera_flip-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -9475,6 +9625,56 @@
'state': 'on',
})
# ---
# name: test_platform_setup_and_discovery[switch.security_camera_use_motion_detection_zone-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.security_camera_use_motion_detection_zone',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Use motion detection zone',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Use motion detection zone',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'motion_detection_zone',
'unique_id': 'tuya.xihygtyd0d1faknkpsmotion_area_switch',
'unit_of_measurement': None,
})
# ---
# name: test_platform_setup_and_discovery[switch.security_camera_use_motion_detection_zone-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Security Camera Use motion detection zone',
}),
'context': <ANY>,
'entity_id': 'switch.security_camera_use_motion_detection_zone',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_platform_setup_and_discovery[switch.security_camera_video_recording-entry]
EntityRegistryEntrySnapshot({
'aliases': list([