I am a noob in HA, but wanted to share my experience working with Local_Tuya and Tuya_Local to get a Globe Caledon ceiling fan/light combo I bought for my kids a Lowe’s. The fan was about $200, and was the least expensive smart-capable fan they had in stock.
I immediately installed the fans in my kids’ rooms to their delight. However, when i went into HA to try to add the devices to the dashboard, I was dismayed to find that there is no Globe integration native to HA.
After some Googling, I came across a number of posts about using HACS integrations to control devices (like Globe, who licenses the Tuya IoT platform for their smart devices). The two local integrations in HACS are Local Tuya and/or Tuya Local, which made me chuckle recalling Monty Python and the Life of Brian’s famous scene with the “People’s Front of Judea” and the “Judean People’s Front.” Much like the rebel groups in Life of Brian, the HACS integrations don’t work well together… or rather, they can’t both be used simultaneously with the same device or Things Start Breaking.
Fortunately, I already had HACS installed because it was the only way to use certain dashboard customizations. From there, I went to HACS and tried searching for Tuya integrations. The only one that popped up for me was Local_Tuya, so I started with that.
It was not an easy experience, but it made this middle-aged lawyer feel like a badass hacker as I scoured the internet for instructions to set up a developer account on the Tuya dev platform, querying APIs and uncovering secret keys. I was very proud of myself when I got the Local_Tuya integration to allow me to turn on and off one of the fans.
My euphoria was short-lived, however, as the light integration simply did not play nice with the interface, even after I mapped all the Data Points [DPs] correctly per the Tuya API (pasted below for posterity).
After sleeping on it for a while, I resolved to try again, this time with the uncomfortably similarly named Tuya_Local HACS integration. So I went online once more and was able to find the Github repository for Tuya_Local, with helpful one-click install into HACS.
Following the instructions, I was once more flummoxed when I saw that Tuya_Local queries the Tuya Life app for device credentials rather than requiring a Tuya IoT developer account and custom project. In hindsight, it would have been much easier to start with Tuya_Local and the Tuya Life app link to obtain the (secret) local key and device Id, then use that in Local_Tuya manually rather than going through the rigamarole of setting up a dev account.
I suppose one difference — based on the documentation in the respective integrations’ Github pages — is the level to which each approach isolates the devices from the Tuya cloud servers. I don’t entirely understand the difference at this point, and at the time I just wanted to get the things working correctly.
So I proceeded forward with Tuya_Local and sure enough, the devices were identified as Ledkia ceiling fans, that appeared to have the same functionalities and use the same DPs as the Globe Caledon. The problem was that apparently whatever a Ledkia ceiling fan and light combo is, it doesn’t have RGB capabilities. So after one more search of the HA forums, I found this post by a fellow intrepid IoT explorer describing their workaround for the problem. I am going to try integrating that solution, and will share what I learn.
In the meantime, the following is meant to save future adventurers from having to go through the labyrinthine Tuya developer account setup and navigation. These are the DPs that I queried from my Caledon ceiling fan light combo from the Tuya API:
"code": "switch_led",
"dp_id": 20,
"name": "Light Switch",
"time": 1753315351835,
"type": "bool",
"value": false
},
{
"code": "work_mode",
"custom_name": "",
"dp_id": 21,
"time": 1753314974944,
"type": "enum",
"value": "white"
},
{
"code": "bright_value",
"custom_name": "",
"dp_id": 22,
"time": 1753315011689,
"type": "value",
"value": 350
},
{
"code": "temp_value",
"custom_name": "",
"dp_id": 23,
"time": 1753314974694,
"type": "value",
"value": 0
},
{
"code": "colour_data",
"custom_name": "",
"dp_id": 24,
"time": 1753314724953,
"type": "string",
"value": "012c03e80258"
},
{
"code": "countdown",
"custom_name": "",
"dp_id": 26,
"time": 1753236115146,
"type": "value",
"value": 0
},
{
"code": "power_memory",
"custom_name": "",
"dp_id": 33,
"time": 1753236148785,
"type": "raw",
"value": "AAEAAAAAAAAAAAAA"
},
{
"code": "do_not_disturb",
"custom_name": "",
"dp_id": 34,
"time": 1753236116404,
"type": "bool",
"value": false
},
{
"code": "fan_switch",
"custom_name": "",
"dp_id": 60,
"time": 1753315343428,
"type": "bool",
"value": false
},
{
"code": "fan_speed",
"custom_name": "",
"dp_id": 62,
"time": 1753314838877,
"type": "value",
"value": 1
},
{
"code": "fan_direction",
"custom_name": "",
"dp_id": 63,
"time": 1753236116687,
"type": "enum",
"value": "reverse"
},
{
"code": "fan_countdown_left",
"custom_name": "",
"dp_id": 64,
"time": 1753236114976,
"type": "value",
"value": 0
},
{
"code": "fault",
"custom_name": "",
"dp_id": 67,
"time": 1753236114813,
"type": "bitmap",
"value": 0
},
{
"code": "buzzer_switch",
"custom_name": "",
"dp_id": 101,
"time": 1753236115404,
"type": "bool",
"value": false
},
{
"code": "switch_inching",
"custom_name": "",
"dp_id": 102,
"time": 1753236116568,
"type": "string",
"value": "000000"
And here is the API dump of acceptable values for each DP:
switch_led Boolean
"{true,false}"
work_mode Enum
{
"range": [
"white",
"colour",
"scene"
]
}
bright_value Integer
{
"unit": "",
"min": 10,
"max": 1000,
"scale": 0,
"step": 1
}
temp_value Integer
{
"unit": "",
"min": 0,
"max": 1000,
"scale": 0,
"step": 1
}
colour_data Json
{}
countdown Integer
{
"unit": "s",
"min": 0,
"max": 86400,
"scale": 0,
"step": 1
}
do_not_disturb Boolean
"{true,false}"
fan_switch Boolean
"{true,false}"
fan_speed Integer
{
"unit": "",
"min": 1,
"max": 6,
"scale": 0,
"step": 1
}
fan_direction Enum
{
"range": [
"forward",
"reverse"
]
}
countdown_left_fan Integer
{
"unit": "s",
"min": 0,
"max": 86400,
"scale": 0,
"step": 1
}
I will update this thread once I have figured out how to make the controls include RGB per this post.
Good Luck!