This directory contains device configuration files, describing the workings of supported devices. The files are in YAML format, and describe the mapping of Tuya DPs (Data Points) to HomeAssistant attributes.
Each Tuya device may correspond to one primary entity and any number of secondary entities in Home Assistant.
The top level of the device configuration defines the following:
nameThe device should be named descriptively with a name the user would recognize, the brand and model of the device is a good choice. If a whole family of devices is supported, a generalization of the model type can be used. The name should also indicate to the user what type of device it is.
productsOptional, for future use.
A list of products that this config applies to. Each product in the list must
have an id specified, which corresponds to the productId or productKey
(depending on where you are getting it from) in Tuya info. This is available
from the Tuya developer web portal listing for your device, or when using
UDP discovery (via tinytuya). In future it is intended that UDP discovery
will be used to more precisely match devices to configs, so it is recommended
to report these if you can find them when requesting a new device. Each
listing can also have an optional name, which is intended to override the
top level name when full support for this field is added.
Probably other info will be added in future to provide better reporting of
device manufacturer and model etc.
primary_entityThis contains the configuration for one Home Assistant entity which is considered the main entity for the device. For example, if the device is a heater, this would be a climate entity.
The configuration for entities is detailed in its own section below.
secondary_entitiesOptional.
This contains a list of additional Home Assistant entities providing additional functionality beyond the capabilities of the primary entity. Examples include lighting control for display panels as a Home Assistant light entity, child locks as a Home Assistant lock entity, or additional toggles as Home Assistant switch entities.
The configuration for secondary entities is the same as primary entities, and is detailed in the section below.
entityThe Home Assistant entity type being configured. Currently supported types are climate, switch, light, lock. Functionality for these entities is limited to that which has been required for the devices until now and may need to be extended for new devices. In particular, the light and lock entities have only been used for simple secondary entities, so only basic functionality is implemented.
classOptional.
For some entity types, a device class can be set, for example switch
entities can have a class of outlet. This may slightly alter the UI
behaviour.
For most entities, it will alter the default icon, and for binary sensors
also the state that off and on values translate to in the UI.
categoryOptional.
This specifies the entity category of the entity. Entities can be categorized
as config or diagnostic to restrict where they appear automatically in
Home Assistant.
dpsThis is a list of the definitions for the Tuya DPs associated with attributes of this entity. There should be one list entry for each supported DPs reported by the device.
The configuration of DPs entries is detailed in its own section below.
nameOptional.
The name associated with this entity can be set here. If no name is set, it will inherit the name at the top level. This is mostly useful for overriding the name of secondary entities to give more information about the purpose of the entity, as the generic type with the top level name may not be sufficient to describe the function.
modeOptional. For number entities, default="auto", for others, None
For number entities, this can be used to force slider or box as the
input method. The default auto uses a slider if the range is small enough,
or a box otherwise.
idEvery DP must have a numeric ID matching the DP ID in the Tuya protocol.
typeThe type of data returned by the Tuya API. Can be one of the following:
nameThe name given to the attribute in Home Assistant. Certain names are used by the Home Assistant entities for specific purposes. If a name is not recognized as a standard attribute by the entitiy implementation, the attribute will be returned as a readonly custom attribute on the entity. If you need non-standard attributes to be able to be set, you will need to use a secondary entity for that.
readonlyOptional, default false.
A boolean setting to mark attributes as readonly. If not specified, the
default is false. If set to true, the attributes will be reported
to Home Assistant, but attempting to set them will result in an error.
This is only needed in contexts where it would normally be possible to set
the value. If you are creating a sensor entity, or adding an attribute of an
entity which is inherently read-only, then you do not need to specify this.
optionalOptional, default false.
A boolean setting to mark attributes as optional. This allows a device to be matched even if it is not sending the dp at the time when adding a new device. It can also be used to match a range of devices that have variations in the extra attributes that are sent.
persistOptional, default true.
Whether to persist the value if the device does not return it on every status refresh. Some devices don't return every value on every status poll. In most cases, it is better to remember the previous value, but in some cases the dp is used to signal an event, so when it is next sent, it should trigger automations even if it is the same value as previously sent. In that case the value needs to go to null in between when the device is not sending it.
forceOptional, default false.
A boolean setting to mark dps as requiring an explicit update request to fetch. Many energy monitoring smartplugs require this, without a explicit request to update them, such plugs will only return monitoring data rarely or never. Devices can misbehave if this is used on dps that do not require it. Use this only where needed, and generally only on read-only dps.
precisionOptional, default None.
For integer dps that are sensor values, the suggested precision for display in Home Assistant can be specified. If unspecified, the Home Assistant will use the native precision, which is calculated based on the scale of the dp so as to provide distinct values with as few decimal places as possible. For example a scale of 3 will result in one decimal place by default, (values displayed as x.3, x.7 rather than x.33333333 and x.666666) but you could override that to 2 or 0 with by specifying the precision explicitly.
mappingOptional. Must be a list with each item starting with a - (a dash and a space):
This can be used to define a list of additional rules that modify the DP
to Home Assistant attribute mapping to something other than a one to one
copy.
The rules can range from simple value substitution to complex relationships involving other attributes. It can also be used to change the icon of the entity based on the attribute value. Mapping rules are defined in their own section below.
hiddenOptional, default false.
This can be used to define DPs that do not directly expose Home Assistant
attributes. When set to true, no attribute will be sent. A name should
still be specified and the attribute can be referenced as a constraint
from mapping rules on other attributes to implement complex mappings.
An example of use is a climate device, where the Tuya device keeps separate
temperature settings for different Normal and Eco preset modes. The Normal
temperature setting is exposed through the standard temperature
Home Assistant attribute on the climate device, but the eco_temperature
setting on a different DP is set to hidden. Mapping Rules are used on the
temperature attribute to redirect to eco_temperature when preset_mode
is set to Eco.
rangeOptional, may be required in some contexts, may have defaults in others.
For integer attributes that are not readonly, a range can be set with min
and max values that will limit the values that the user can enter in the
Home Assistant UI. This can also be set in a mapping or conditions block.
unitOptional, default="C" for temperature dps on climate devices.
For temperature dps, some devices will use Fahrenhiet. This needs to be
indicated back to HomeAssistant by defining unit as "F". For sensor
entities, see the HomeAssistant developer documentation for the full list
of possible units (C and F are automatically translated to their Unicode
equivalents, other units are currently ASCII so can be easily entered directly).
classOptional.
For sensors, this sets the state class of the sensor (measurement, total or total_increasing)
formatOptional.
For base64 and hex types, this specifies how to decode the binary data (after hex or base64 decoding).
This is a container field, the contents of which should be a list consisting of name, bytes and range fields. range is as described above. bytes is the number of bytes for the field, which can be 1, 2, or 4. name is a name for the field, which will have special handling depending on
the device type.
maskOptional.
For base64 and hex types, this specifies how to extract a single numeric value from the binary data. The value should be a hex bit mask (eg 00FF00 to extract the middle byte of a 3 byte value). Unlike format, this does not require special handling in the entity platform, as only a single value is being extracted.
endiannessOptional, default="big"
For base64 and hex types, this specifies the endianess of the data and mask. Could be "big" or "little".
Mapping rules can change the behavior of attributes beyond simple copying of DP values to attribute values. Rules can be defined without a dps_val to apply to all values, or a list of rules that apply to particular dp values can be defined to change only particular cases. Rules can even depend on the values of other elements.
dps_valOptional, if not provided, the rule is a default that will apply to all values not covered by their own dps_val rule.
dps_val defines the DP value that each
rule in the list applies to. This can be used to map specific values from the
Tuya protocol into attribute values that have specific meaning in Home
Assistant. For example, climate entities in Home Assistant define modes
"off", "heat", "cool", "heat_cool", "auto" and "dry". But in the Tuya protocol,
a simple heater just has a boolean off/on switch. It can also be used to
change the icon when a specific mode is operational. For example if
a heater device has a fan-only mode, you could change the icon to "mdi:fan"
instead of "mdi:radiator" when in that mode.
A dps_val of null can be used to specify a value to be assumed when a
dp is not being returned by the device, to avoid None in some locations where
that causes an issue such as entities showing as unavailable. Such a mapping
is one-way, the value will not be mapped back to a null when setting the dp.
valueOptional.
This can be used to set the attribute value seen by Home Assistant to something
different than the DP value from the Tuya protocol. Normally it will be used
with dps_val to map from one value to another. Without dps_val it will
one-way map all otherwise unmapped dps values to the specified value. This
can be useful for a binary_sensor.
hiddenOptional, default=false
When set to true, the mapping value is hidden from the list of all values. This can be used for items that should not be available for selection by the user but you still want to map for feedback coming from the device. For example, some devices have a "Manual" mode, which is automatically selected when adjustments are made to other settings, but should not be available as an explicit mode for the user to select.
scaleOptional, default=1.
This can be used in an integer dp mapping to scale the values. For example
some climate devices represent the temperature as an integer in tenths of
degrees, and require a scale of 10 to convert them to degrees expected by
Home Assistant. The scale can also be the other way, for a fan with speeds
1, 2 and 3 as DP values, this can be converted to a percentage with a scale
of 0.03.
invertOptional, default=False.
This can be used in an integer dp mapping to invert the range. For example,
some cover devices have an opposite idea of which end of the percentage scale open
and closed are from what Home Assistant assumes. To use this mapping option, a range
must also be specified for the dp.
stepOptional, default=1.
This can be used in an integer dp mapping to make values jump by a specific
step. It can also be set in a conditions block so that the steps change only
under certain conditions. An example is where a value has a range of 0-100, but
only allows settings that are divisible by 10, so a step of 10 would be set.
iconOptional.
This can be used to override the icon. Most useful with a dps_val which
indicates a change from normal operating mode, such as "fan-only",
"defrosting", "tank-full" or some error state.
icon_priorityOptional. Default 10. Lower numbers mean higher priorities.
When a number of rules on different attributes define icon changes, you
may need to control which have priority over the others. For example,
if the device is off, probably it is more important to indicate that than
whether it is in fan-only or heat mode. So in the off/on DP, you might
give a priority of 1 to the off icon, 3 to the on icon, and in the mode DP
you could give a priority of 2 to the fan icon, to make it override the
normal on icon, but not the off icon.
If you don't specify any priorities, the icons will all get the same priority,
so if any overlap exists in the rules, it won't always be predictable which
icon will be displayed.
value_redirectOptional.
When value_redirect is set, the value of the attribute and any attempt to
set it will be redirected to the named attribute instead of the current one.
An example of how this can be useful is where a Tuya heater has a dp for the
target temperature in normal mode, and a different dp for the target
temperature is "eco" mode. Depending on the preset_mode, you need to use
one or the other. But Home Assistant just has one temperature attribute for
setting target temperature, so the mapping needs to be done before passing to
Home Assistant.
value_mirrorOptional.
When value_mirror is set, the value of the attribute will be redirected to
the current value of the named attribute. Unlike value_redirect, this does
not redirect attempts to set the dp to the redirected dp, but when used in
a map, this can make the mapping dynamic.
An example of how this can be useful is where a thermostat can be configured to control either a heating or cooling device, but it is not expected to change this setting during operation. Once set up, the hvac_mode dp can have a mapping that mirrors the value of the configuration dp.
invalidOptional, default false.
Invalid set to true allows an attribute to temporarily be set read-only in
some conditions. Rather than passing requests to set the attribute through
to the Tuya protocol, attempts to set it will throw an error while it meets
the conditions to be invalid. It does not make sense to set this at mapping
level, as it would cause a situation where you can set a value then not be
able to unset it. Instead, this should be used with conditions, below, to
make the behaviour dependent on another DP, such as disabling fan speed
control when the preset is in sleep mode (since sleep mode should force low).
defaultOptional, default false.
Default set to true allows an attribute to be set as the default value. This is used by some entities when an argument is not provided to a service call but the attribute is required to be set to function correctly. An example is the siren entity which uses the tone attribute to turn on and off the siren, but when turn_on is called without any argument, it needs to pick a default tone to use to turn on the siren.
constraintOptional, always paired with conditions. Default if unspecified is the current attribute
If a rule depends on an attribute other than the current one, then constraint
can be used to specify the element that conditions applies to. constraint can also refer back to the same attribute - this can be useful for specifying conditional mappings, for example to support two different variants of a device in a single config file, where the only difference is the way they represent enum attributes.
conditionsOptional, usually paired with constraint.
Conditions defines a list of rules that are applied based on the constraint attribute. The contents are the same as Mapping Rules, but dps_val applies to the attribute specified by constraint, and also can be a list of values to match as well rather than a single value. All others act on the current attribute as they would in the mapping. Although conditions are specified within a mapping, they can also contain a mapping of their own to override that mapping. These nested mappings are limited to simple dps_val to value substitutions, as more complex rules would quickly become too complex to manage.
When setting a dp which has conditions attached, the behaviour is slightly different depending on whether the constraint dp is readonly or not.
For non-readonly constraints that specify a single dps_val, the constraint dp will be set along with the target dp so that the first condition with a value matching the target value is met.
For readonly constraints, the condition must match the constraint dp's current value for anything to be set.
Example
...
name: target_dp
mapping:
- dps_val: 1
constraint: constraint_dp
conditions:
- dps_val: a
value: x
- dpa_val: c
value: z
- dps_val: 2
constraint: constraint_dp
conditions:
- dps_val: b
value: x
- dps_val: c
value: y
If constraint_dp is not readonly:
| constraint_dp current dps_val | target_dp target value | dps set |
|---|---|---|
| a | x | target_dp: 1, constraint_dp: a |
| a | y | target_dp: 2, constraint_dp: c |
| a | z | target_dp: 1, constraint_dp: c |
| b | x | target_dp: 1, constraint_dp: a |
| b | y | target_dp: 2, constraint_dp: c |
| b | z | target_dp: 1, constraint_dp: c |
| c | x | target_dp: 1, constraint_dp: a |
| c | y | target_dp: 2, constraint_dp: c |
| c | z | target_dp: 1, constraint_dp: c |
If constraint_dp is readonly:
| current constraint_dp | target target_dp | dps set |
|---|---|---|
| a | x | target_dp: 1 |
| a | y | - |
| a | z | - |
| b | x | target_dp: 2 |
| b | y | - |
| b | z | - |
| c | x | - |
| c | y | target_dp: 2 |
| c | z | target_dp: 1 |
Entities have specific mappings of dp names to functions. Any unrecognized dp name is added to the entity as a read-only extra attribute, so can be observed and queried from HA, but if you need to be able to change it, you should split it into its own entity of an appropriate type (number, select, switch for example).
If the type of dp does not match the expected type, a mapping should be provided to convert. Note that "on" and "off" require quotes in yaml, otherwise it they are interpretted as true/false.
Many entity types support a class attribute which may change the UI behaviour, icons etc. See the HA documentation for the entity type to see what is valid (these may expand over time)
alarm_control_paneldisarmed, armed_home, armed_away, armed_night, armed_vacation, armed_custom_bypass, pending, arming, disarming, triggered. Other states are allowed for read-only status, but only the armed... and disarmed states are available as commands.binary_sensorbuttonclimate"on", "off", auto, low, medium, high, top, middle, focus, diffuse"off", cool, heat, heat_cool, auto, dry, fan_only"off", idle, cooling, heating, drying, fannone, eco, away, boost, comfort, home, sleep, activity"off", vertical, horizontaltarget_temp_low, and is mutually exclusive with temperaturecoverEither position or open should be specified.
open, close, stopopening, closingfan"off", low, medium, high used to be handled specially by HA as deprecated speed aliases. If these are the only "presets", consider mapping them as speed values instead, as voice assistants will respond to phrases like "turn the fan up/down" for speed.forward, reverse.humidifierHumidifer can also cover dehumidifiers (use class to specify which).
lightformat field names recognized for decoding this field are r, g, b, h, s, v.white, color_temp, hs, xy, rgb, rgbw, rgbww, others will be treated as effects,
Note: only white, color_temp and hs are currently supported, others listed above are reserved and may be implemented in future when the need arises.
If no color_mode dp is available, a single supported color mode will be
calculated based on which of the above dps are available.color_mode should be used instead. If the light contains both a separate dp for effects/scenes/presets and a mix of color_modes and effects (commonly scene and music) in the color_mode dp, then a separate select entity should be used for the dedicated dp to ensure the effects from color_mode are selectable.locknumberselectsensorsirendefault: true so that the turn_on service with no commands works.switchvacuumreturn_to_base, clean_spot, others are sent as general commandswater_heatercurrent_temperature (optional, number): a dp that reports the current water temperature.
operation_mode (optional, mapping of strings): a dp to report and control the operation mode of the water heater. If away is one of the modes, another mode must be marked as default: true to that the away_mode_off service knows which mode to switch out of away mode to.
temperature (optional, number): a dp to control the target water temperature of the water heater. A unit may be specified as an attribute if the temperature_unit dp is not available, otherwise the default of HA's current setting will be used.
temperature_unit (optional, string): a dp that reports the unit the device is configured for. Values should be mapped to "C" or "F" (case sensitive) - often the device will use a boolean or lower case for this
min_temperature (optional, number): a dp that reports the minimum temperature the water heater can be set to, in case this is not a fixed value.
max_temperature (optional, number): a dp that reports the maximum temperature the water heater can be set to, in case this is not a fixed value.
away_mode (optional, boolean): a dp to control whether the water heater is in away mode.