Add support for Tuya swtz category (cooking thermometer) (#152022)

This commit is contained in:
epenet
2025-09-11 10:28:20 +02:00
committed by GitHub
parent d613b69e4e
commit 40da606177
7 changed files with 335 additions and 15 deletions
+2
View File
@@ -169,6 +169,7 @@ class DPCode(StrEnum):
CONTROL_BACK = "control_back"
CONTROL_BACK_MODE = "control_back_mode"
COOK_TEMPERATURE = "cook_temperature"
COOK_TEMPERATURE_2 = "cook_temperature_2"
COOK_TIME = "cook_time"
COUNTDOWN = "countdown" # Countdown
COUNTDOWN_1 = "countdown_1"
@@ -388,6 +389,7 @@ class DPCode(StrEnum):
TEMP_CONTROLLER = "temp_controller"
TEMP_CORRECTION = "temp_correction"
TEMP_CURRENT = "temp_current" # Current temperature in °C
TEMP_CURRENT_2 = "temp_current_2"
TEMP_CURRENT_EXTERNAL = (
"temp_current_external" # Current external temperature in Celsius
)
+14
View File
@@ -215,6 +215,20 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
entity_category=EntityCategory.CONFIG,
),
),
# Cooking thermometer
"swtz": (
NumberEntityDescription(
key=DPCode.COOK_TEMPERATURE,
translation_key="cook_temperature",
entity_category=EntityCategory.CONFIG,
),
NumberEntityDescription(
key=DPCode.COOK_TEMPERATURE_2,
translation_key="indexed_cook_temperature",
translation_placeholders={"index": "2"},
entity_category=EntityCategory.CONFIG,
),
),
# Robot Vacuum
# https://developer.tuya.com/en/docs/iot/fsd?id=K9gf487ck1tlo
"sd": (
+17
View File
@@ -1118,6 +1118,23 @@ SENSORS: dict[str, tuple[TuyaSensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT,
),
),
# Cooking thermometer
"swtz": (
TuyaSensorEntityDescription(
key=DPCode.TEMP_CURRENT,
translation_key="temperature",
device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT,
),
TuyaSensorEntityDescription(
key=DPCode.TEMP_CURRENT_2,
translation_key="indexed_temperature",
translation_placeholders={"index": "2"},
device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT,
),
*BATTERY_SENSORS,
),
# Smart Gardening system
# https://developer.tuya.com/en/docs/iot/categorysz?id=Kaiuz4e6h7up0
"sz": (
+8 -2
View File
@@ -139,6 +139,9 @@
"temperature": {
"name": "[%key:component::sensor::entity_component::temperature::name%]"
},
"indexed_temperature": {
"name": "Temperature {index}"
},
"time": {
"name": "Time"
},
@@ -176,10 +179,13 @@
"name": "Powder"
},
"cook_temperature": {
"name": "Cook temperature"
"name": "Cooking temperature"
},
"indexed_cook_temperature": {
"name": "Cooking temperature {index}"
},
"cook_time": {
"name": "Cook time"
"name": "Cooking time"
},
"cloud_recipe": {
"name": "Cloud recipe"
@@ -7181,7 +7181,7 @@
'labels': set({
}),
'manufacturer': 'Tuya',
'model': 'Cooking Thermometer (unsupported)',
'model': 'Cooking Thermometer',
'model_id': '3rzngbyy',
'name': 'Grillhőmérő',
'name_by_user': None,
+128 -12
View File
@@ -465,6 +465,122 @@
'state': '1.0',
})
# ---
# name: test_platform_setup_and_discovery[number.grillhomero_cooking_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 300.0,
'min': -30.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 0.1,
}),
'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.grillhomero_cooking_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Cooking temperature',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'cook_temperature',
'unique_id': 'tuya.yybgnzr3ztwscook_temperature',
'unit_of_measurement': '℃',
})
# ---
# name: test_platform_setup_and_discovery[number.grillhomero_cooking_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Grillhőmérő Cooking temperature',
'max': 300.0,
'min': -30.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 0.1,
'unit_of_measurement': '℃',
}),
'context': <ANY>,
'entity_id': 'number.grillhomero_cooking_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_platform_setup_and_discovery[number.grillhomero_cooking_temperature_2-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 300.0,
'min': -30.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 0.1,
}),
'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.grillhomero_cooking_temperature_2',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Cooking temperature 2',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'indexed_cook_temperature',
'unique_id': 'tuya.yybgnzr3ztwscook_temperature_2',
'unit_of_measurement': '℃',
})
# ---
# name: test_platform_setup_and_discovery[number.grillhomero_cooking_temperature_2-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Grillhőmérő Cooking temperature 2',
'max': 300.0,
'min': -30.0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 0.1,
'unit_of_measurement': '℃',
}),
'context': <ANY>,
'entity_id': 'number.grillhomero_cooking_temperature_2',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_platform_setup_and_discovery[number.hot_water_heat_pump_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
@@ -2107,7 +2223,7 @@
'state': '-2.0',
})
# ---
# name: test_platform_setup_and_discovery[number.sous_vide_cook_temperature-entry]
# name: test_platform_setup_and_discovery[number.sous_vide_cooking_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -2125,7 +2241,7 @@
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.sous_vide_cook_temperature',
'entity_id': 'number.sous_vide_cooking_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -2137,7 +2253,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Cook temperature',
'original_name': 'Cooking temperature',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -2147,10 +2263,10 @@
'unit_of_measurement': '℃',
})
# ---
# name: test_platform_setup_and_discovery[number.sous_vide_cook_temperature-state]
# name: test_platform_setup_and_discovery[number.sous_vide_cooking_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Sous Vide Cook temperature',
'friendly_name': 'Sous Vide Cooking temperature',
'max': 92.5,
'min': 25.0,
'mode': <NumberMode.AUTO: 'auto'>,
@@ -2158,14 +2274,14 @@
'unit_of_measurement': '℃',
}),
'context': <ANY>,
'entity_id': 'number.sous_vide_cook_temperature',
'entity_id': 'number.sous_vide_cooking_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_platform_setup_and_discovery[number.sous_vide_cook_time-entry]
# name: test_platform_setup_and_discovery[number.sous_vide_cooking_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -2183,7 +2299,7 @@
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.sous_vide_cook_time',
'entity_id': 'number.sous_vide_cooking_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -2195,7 +2311,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Cook time',
'original_name': 'Cooking time',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -2205,10 +2321,10 @@
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_platform_setup_and_discovery[number.sous_vide_cook_time-state]
# name: test_platform_setup_and_discovery[number.sous_vide_cooking_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Sous Vide Cook time',
'friendly_name': 'Sous Vide Cooking time',
'max': 5999.0,
'min': 1.0,
'mode': <NumberMode.AUTO: 'auto'>,
@@ -2216,7 +2332,7 @@
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'number.sous_vide_cook_time',
'entity_id': 'number.sous_vide_cooking_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
@@ -6623,6 +6623,171 @@
'state': '32.2',
})
# ---
# name: test_platform_setup_and_discovery[sensor.grillhomero_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.grillhomero_battery',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.BATTERY: 'battery'>,
'original_icon': None,
'original_name': 'Battery',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'battery',
'unique_id': 'tuya.yybgnzr3ztwsbattery_percentage',
'unit_of_measurement': '%',
})
# ---
# name: test_platform_setup_and_discovery[sensor.grillhomero_battery-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'battery',
'friendly_name': 'Grillhőmérő Battery',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'sensor.grillhomero_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_platform_setup_and_discovery[sensor.grillhomero_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.grillhomero_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 1,
}),
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'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.yybgnzr3ztwstemp_current',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_platform_setup_and_discovery[sensor.grillhomero_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Grillhőmérő Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.grillhomero_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_platform_setup_and_discovery[sensor.grillhomero_temperature_2-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.grillhomero_temperature_2',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 1,
}),
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Temperature',
'platform': 'tuya',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'indexed_temperature',
'unique_id': 'tuya.yybgnzr3ztwstemp_current_2',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_platform_setup_and_discovery[sensor.grillhomero_temperature_2-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Grillhőmérő Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.grillhomero_temperature_2',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_platform_setup_and_discovery[sensor.hl400_pm2_5-entry]
EntityRegistryEntrySnapshot({
'aliases': set({