[APP][Pro] Tuya Local

Here is the DP Table. I’m not using the IR parts (the device can use IR to control other devices).

Smart IR
DP 101 temp_current value 256
DP 102 humidity_value value 61
DP 201 ir_send string {“control”:“study_exit”}
DP 202 ir_study_code raw
DP — va_temperature Integer 256 -200–800 step 1 ℃
DP — va_humidity Integer 61 0–100 step 1 %

The temperature (DP 101) and humidity (DP 102) sensors work fine with the Generic Driver. Use this dp_config:

[
  {"dp":101,"cap":"measure_temperature","scale":0.1,"readonly":true,"label":"Temperature","unit":"°C"},
  {"dp":102,"cap":"measure_humidity","readonly":true,"label":"Humidity","unit":"%"}
]

Note: the raw temperature value is ×10 (256 = 25.6 °C), so scale: 0.1 is needed.

The IR functionality (DP 201 ir_send / DP 202 ir_study_code) is not supported by the Generic Driver. DP 202 uses a binary raw type that no Homey capability can handle, and DP 201 sends arbitrary JSON strings which can’t be represented in a standard capability. A dedicated IR driver would be needed for those features.

Hi @Andi. First of all, thank you for this great app! A lot of devices are automatically discovered and works great!

I have a Tuya Thermostat that is a temperature/humidity sensor with clock but also has Multiple Devices IR. So I created the AC IR, it shows in the Developer Plataform as an “Real Device” with it’s own code different from the thermostat device, but the DP gathered by the Tuya Local didn’t work…
Here is what I got from the query properties from this device (The Air Conditioner IR created in Tuya App).

AC IR Device Query Properties

{
“result”: {
“properties”: [
{
“code”: “control”,
“custom_name”: “”,
“dp_id”: 1,
“time”: 1667338507436,
“type”: “enum”,
“value”: “send_ir”
},
{
“code”: “study_code”,
“custom_name”: “”,
“dp_id”: 2,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “ir_code”,
“custom_name”: “”,
“dp_id”: 3,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_code”,
“custom_name”: “”,
“dp_id”: 4,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_code2”,
“custom_name”: “”,
“dp_id”: 5,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_code3”,
“custom_name”: “”,
“dp_id”: 6,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_study”,
“custom_name”: “”,
“dp_id”: 7,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “key_study2”,
“custom_name”: “”,
“dp_id”: 8,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “key_study3”,
“custom_name”: “”,
“dp_id”: 9,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “delay_time”,
“custom_name”: “”,
“dp_id”: 10,
“time”: 1667338507436,
“type”: “value”,
“value”: 0
},
{
“code”: “key_code4”,
“custom_name”: “”,
“dp_id”: 11,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_study4”,
“custom_name”: “”,
“dp_id”: 12,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “type”,
“custom_name”: “”,
“dp_id”: 13,
“time”: 1667338507436,
“type”: “value”,
“value”: 0
},
{
“code”: “switch_power”,
“custom_name”: “”,
“dp_id”: 101,
“time”: 1783492361000,
“type”: “bool”,
“value”: false
},
{
“code”: “mode”,
“custom_name”: “”,
“dp_id”: 102,
“time”: 1783492361000,
“type”: “enum”,
“value”: “0”
},
{
“code”: “temperature”,
“custom_name”: “”,
“dp_id”: 103,
“time”: 1783492361000,
“type”: “value”,
“value”: 25
},
{
“code”: “fan”,
“custom_name”: “”,
“dp_id”: 104,
“time”: 1783492361000,
“type”: “enum”,
“value”: “1”
},
{
“code”: “swing”,
“custom_name”: “”,
“dp_id”: 105,
“time”: 1667338507436,
“type”: “bool”,
“value”: false
},
{
“code”: “ir_send”,
“custom_name”: “”,
“dp_id”: 201,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “ir_study_code”,
“custom_name”: “”,
“dp_id”: 202,
“time”: 1667338507436,
“type”: “raw”
}
]
},
“success”: true,
“t”: 1784050314211,
“tid”: “e7e0eda97fa911f1976f5ae95710cd15”
}

Is it possible to control this device? I used the IP from the Thermostat and it connected. If you need any more details just ask me. Thanks!

My DP Config looks more or less like this. I try to modify it with your suggestions but still not working. I need to reconnect the device every xx minutes using a flow to get T and RH updated.

Maybe my device don’t work well locally and need to go through the cloud.

Hi Luca - How does you reconnect flow look like to get the data?

Hi Meruem

Could you please set the device in Tuya Cloud to use DP Instructions and afterwards share the DP specification? In Settings → :cloud: Cloud Lookup → click the device name → Copy DP Table and paste it here.

Hi @Andi, when you say Tuya Cloud is the Homey Official Tuya Cloud App? It doesn’t appear in Tuya Cloud App. It works in SmartThings integration with Tuya and also in Alexa integration with Tuya.
Is there any information I can get from Tuya Developer Plataform?

My bad - I mean the Tuya Developer Platform

Could you please check if the built-in function works in the new TEST version: Tuya Local | Homey

Hello, I’m trying to connect an exhaust fan controller. I’ve managed to add it to Homey as a fan, but it doesn’t respond to commands or Flows. I wanted to try adding it as a generic device (it isn’t sold as a Tuya device, so I suspect the device type might be wrong), but I don’t know how to check how it’s recognized within Tuya; it has various sensors (humidity, temperature) for adjusting its speed, but I don’t use them. I just want to adjust the speed from 1 to 10. Do you have any ideas?


When looking on the Tuya platform, I see it is indeed listed as a fan, but I gather the controls are basic (on/off), whereas in the Tuya app I can actually adjust the speeds. I’m a bit lost—maybe I just don’t get it :smiley:

You might need to change the instruction set from ‘Standard Instruction Set’ to ‘DP Instruction Set’ in the Tuya IoT Portal. Refer to my earlier post above.

It seems that the standard set only included the on/off control of your device.

Thanks for the tip. I’d seen that and tried it this morning, so you’re confirming it might help. Even though the on/off didn’t work—not even in standard mode—I’ll test it when I get home.

With the test version seems to work. I’m using 3 minutes as auto-reconnect parameter.

Temperature a Humidity change very slowly. So for me 3 minutes of delay is not a problem.

In Tuya Developer Plataform I can’t see this Settings → Cloud Lookup.
What I can see that it seems like what you want was what I sent in the other message:

AC IR Device Query Properties

{
“result”: {
“properties”: [
{
“code”: “control”,
“custom_name”: “”,
“dp_id”: 1,
“time”: 1667338507436,
“type”: “enum”,
“value”: “send_ir”
},
{
“code”: “study_code”,
“custom_name”: “”,
“dp_id”: 2,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “ir_code”,
“custom_name”: “”,
“dp_id”: 3,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_code”,
“custom_name”: “”,
“dp_id”: 4,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_code2”,
“custom_name”: “”,
“dp_id”: 5,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_code3”,
“custom_name”: “”,
“dp_id”: 6,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_study”,
“custom_name”: “”,
“dp_id”: 7,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “key_study2”,
“custom_name”: “”,
“dp_id”: 8,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “key_study3”,
“custom_name”: “”,
“dp_id”: 9,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “delay_time”,
“custom_name”: “”,
“dp_id”: 10,
“time”: 1667338507436,
“type”: “value”,
“value”: 0
},
{
“code”: “key_code4”,
“custom_name”: “”,
“dp_id”: 11,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “key_study4”,
“custom_name”: “”,
“dp_id”: 12,
“time”: 1667338507436,
“type”: “raw”
},
{
“code”: “type”,
“custom_name”: “”,
“dp_id”: 13,
“time”: 1667338507436,
“type”: “value”,
“value”: 0
},
{
“code”: “switch_power”,
“custom_name”: “”,
“dp_id”: 101,
“time”: 1783492361000,
“type”: “bool”,
“value”: false
},
{
“code”: “mode”,
“custom_name”: “”,
“dp_id”: 102,
“time”: 1783492361000,
“type”: “enum”,
“value”: “0”
},
{
“code”: “temperature”,
“custom_name”: “”,
“dp_id”: 103,
“time”: 1783492361000,
“type”: “value”,
“value”: 25
},
{
“code”: “fan”,
“custom_name”: “”,
“dp_id”: 104,
“time”: 1783492361000,
“type”: “enum”,
“value”: “1”
},
{
“code”: “swing”,
“custom_name”: “”,
“dp_id”: 105,
“time”: 1667338507436,
“type”: “bool”,
“value”: false
},
{
“code”: “ir_send”,
“custom_name”: “”,
“dp_id”: 201,
“time”: 1667338507436,
“type”: “string”,
“value”: “”
},
{
“code”: “ir_study_code”,
“custom_name”: “”,
“dp_id”: 202,
“time”: 1667338507436,
“type”: “raw”
}
]
},
“success”: true,
“t”: 1784050314211,
“tid”: “e7e0eda97fa911f1976f5ae95710cd15”
}

Also this is what I see in Cloud → Project → Debug Device

Standard Instruction Set
Code Type Values
F ENUM
{
  "min": 0,
  "max": 3,
  "scale": 0,
  "step": 1,
  "type": "Integer"
}
M ENUM
{
  "min": 0,
  "max": 4,
  "scale": 0,
  "step": 1,
  "type": "Integer"
}
PowerOff STRING
"PowerOff"
PowerOn STRING
"PowerOn"
T ENUM
{
  "min": 16,
  "max": 30,
  "scale": 0,
  "step": 1,
  "type": "Integer"
}
Standard Status Set
Code Type Values
wind ENUM
{
  "min": 0,
  "max": 3,
  "scale": 0,
  "step": 1,
  "type": "Integer"
}
mode ENUM
{
  "min": 0,
  "max": 4,
  "scale": 0,
  "step": 1,
  "type": "Integer"
}
power BOOLEAN
{}
temp ENUM
{
  "min": 16,
  "max": 30,
  "scale": 0,
  "step": 1,
  "type": "Integer"
}

Also found this in Configure Control Instruction ModeTable of Instructions of the Device:

Table of Instructions -> Standard Instruction
DP Instruction Standard Instruction
control -
study_code -
ir_code -
key_code -
key_code2 -
key_code3 -
key_study -
key_study2 -
key_study3 -
delay_time -
key_code4 -
key_study4 -
type -
switch_power -
mode -
temperature -
fan -
swing -
ir_send -
ir_study_code -

What to test first

Try the Generic driver with this dp_config:

[
  {"dp": 101, "cap": "onoff",    "label": "Power",       "settable": true},
  {"dp": 103, "cap": "generic_number_1", "label": "Temperature", "settable": true, "min": 16, "max": 30, "step": 1},
  {"dp": 102, "cap": "generic_switch_1", "label": "Mode",        "settable": true},
  {"dp": 104, "cap": "generic_switch_2", "label": "Fan Speed",   "settable": true},
  {"dp": 105, "cap": "generic_switch_3", "label": "Swing",       "settable": true}
]

If SET commands to DPs 101–105 work via LAN → the device firmware handles IR translation locally. You’d get full AC control with no state feedback (IR is one-way).

If they don’t work → the translation lives in the cloud. LAN-only is not possible for high-level control.


State feedback warning

Either way, GET will return error 900 (which the app now handles silently). The blaster doesn’t know what state your AC is actually in — it just fires IR codes. You’ll see the last commanded state, not the actual AC state.


If LAN control works: a dedicated driver would be better

The Generic driver can get you there, but an ir_ac driver would be cleaner — mapping to proper Homey capabilities (onoff, target_temperature, thermostat_mode, fan_mode) with the right ranges and no-feedback handling. Worth building if it turns out DPs 101–105 respond to LAN SET commands.

Start with the Generic driver and test a DP 101 SET first. If the AC responds, we know it works locally and can build a proper driver.

Hi Andi !

BCM700D-TY01 curtain motors connect but do not respond

Homey Pro 2026 — Tuya Local v1.0.93
Model: BCM700D-TY01
Category: cl
Product ID: p1fiefpamvaqek4u
Protocol: 3.3
Control DP: 102
Position DP: 2
Other detected DPs: 101 = 6, 103 = false

IP, Device ID and Local Key have been individually verified for all four motors. The Local Keys were refreshed through Cloud Lookup.

All four motors are controlled instantly through Tuya Smart, but none responds to commands from Homey.

After restarting Tuya Local, the devices initially report “Connected”, then repeatedly disconnect with:

Timeout waiting for status response from device id ...

Earlier HMAC mismatch errors disappeared after refreshing the Local Key and selecting protocol 3.3.

Could this BCM700D-TY01 firmware require a different status command, push-only operation, or a specific driver profile?

Have you already tried other protocols?

Yes.

The % control work correctly, but the button control doesn’t work.