make-all / tuya-local

Local support for Tuya devices in Home Assistant
MIT License
1.3k stars 510 forks source link

Request support for <Vine tj550 thermostat> #2371

Closed joshuamns closed 16 hours ago

joshuamns commented 1 week ago

Log message

This error originated from a custom integration.

Logger: custom_components.tuya_local.config_flow
Source: custom_components/tuya_local/config_flow.py:485
integration: Tuya Local (documentation, issues)
First occurred: 12:04:10 AM (1 occurrences)
Last logged: 12:04:10 AM

Device matches garage_door_opener with quality of 6%. DPS: {"updated_at": 1727928243.2714245, "1": false, "2": "off", "3": "idle", "6": false, "7": false, "9": false, "10": false, "11": false, "18": 85, "20": 60, "21": "enter", "23": "f", "28": "low", "29": 74, "34": 52, "40": false, "42": 360, "44": 1, "45": 0, "52": "20s", "55": 65, "56": 90, "58": "close", "59": 80, "64": "auto", "101": true, "107": 73, "108": 64, "109": 79, "110": 0, "111": 0}

DPS information

{
  "result": {
    "model": "{\"modelId\":\"00000320oh\",\"services\":[{\"actions\":[],\"code\":\"\",\"description\":\"\",\"events\":[],\"name\":\"默认服务\",\"properties\":[
{\"abilityId\":1,\"accessMode\":\"rw\",\"code\":\"switch\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_power3\",\"attribute\":\"1\"},\"name\":\"开关\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":2,\"accessMode\":\"rw\",\"code\":\"mode\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_mode\",\"attribute\":\"132\"},\"name\":\"工作模式\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"off\",\"cool\",\"heat\",\"auto\",\"emheat\"]}},
{\"abilityId\":3,\"accessMode\":\"ro\",\"code\":\"work_state\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-zhuangtai\",\"attribute\":\"128\"},\"name\":\"工作状态\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"idle\",\"heating\",\"cooling\",\"aux_heating\",\"em_heating\",\"dehumidifer\"]}},
{\"abilityId\":6,\"accessMode\":\"rw\",\"code\":\"light\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-deng\",\"attribute\":\"1024\"},\"name\":\"周程序开关\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":7,\"accessMode\":\"rw\",\"code\":\"sound\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_voice\",\"attribute\":\"1024\"},\"name\":\"屏保开关\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":9,\"accessMode\":\"rw\",\"code\":\"sleep\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_sleep\"},\"name\":\"睡眠功能\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":10,\"accessMode\":\"rw\",\"code\":\"frost\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-chushuang\",\"attribute\":\"1024\"},\"name\":\"风机工作状态\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":11,\"accessMode\":\"rw\",\"code\":\"valve_check\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-tcl_function_vs1\",\"attribute\":\"1024\"},\"name\":\"假期模式\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":16,\"accessMode\":\"rw\",\"code\":\"temp_set\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_temp\",\"attribute\":\"1024\"},\"name\":\"目标温度_C\",\"typeSpec\":{\"type\":\"value\",\"max\":370,\"min\":50,\"scale\":1,\"step\":5,\"unit\":\"℃\"}},
{\"abilityId\":17,\"accessMode\":\"rw\",\"code\":\"temp_set_f\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_f\",\"attribute\":\"1024\"},\"name\":\"目标温度_F\",\"typeSpec\":{\"type\":\"value\",\"max\":1000,\"min\":420,\"scale\":1,\"step\":5,\"unit\":\"℉\"}},
{\"abilityId\":18,\"accessMode\":\"rw\",\"code\":\"upper_temp_f\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_f\"},\"name\":\"设置温度上限_F\",\"typeSpec\":{\"type\":\"value\",\"max\":99,\"min\":50,\"scale\":0,\"step\":1,\"unit\":\"℉\"}},
{\"abilityId\":19,\"accessMode\":\"rw\",\"code\":\"upper_temp\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_c\"},\"name\":\"设置温度上限_C\",\"typeSpec\":{\"type\":\"value\",\"max\":40,\"min\":10,\"scale\":0,\"step\":1,\"unit\":\"℃\"}},
{\"abilityId\":20,\"accessMode\":\"rw\",\"code\":\"lower_temp_f\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_f\"},\"name\":\"设置温度下限_F\",\"typeSpec\":{\"type\":\"value\",\"max\":90,\"min\":40,\"scale\":0,\"step\":1,\"unit\":\"℉\"}},
{\"abilityId\":21,\"accessMode\":\"rw\",\"code\":\"capacity_set\",\"description\":\"地理围栏监测状态,进入和离开两种\",\"extensions\":{\"iconName\":\"icon-a_fan_med\",\"attribute\":\"1024\"},\"name\":\"地理围栏状态\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"enter\",\"exit\"]}},
{\"abilityId\":23,\"accessMode\":\"rw\",\"code\":\"temp_unit_convert\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_loop\"},\"name\":\"温标切换\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"c\",\"f\"]}},
{\"abilityId\":24,\"accessMode\":\"ro\",\"code\":\"temp_current\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-wendu\"},\"name\":\"当前温度\",\"typeSpec\":{\"type\":\"value\",\"max\":50,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"℃\"}},
{\"abilityId\":26,\"accessMode\":\"rw\",\"code\":\"lower_temp\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_c\"},\"name\":\"设置温度下限_C\",\"typeSpec\":{\"type\":\"value\",\"max\":30,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"℃\"}},
{\"abilityId\":28,\"accessMode\":\"rw\",\"code\":\"level\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_direction\",\"attribute\":\"1024\"},\"name\":\"档位\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"low\",\"middle\",\"high\"]}},
{\"abilityId\":29,\"accessMode\":\"ro\",\"code\":\"temp_current_f\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_f\"},\"name\":\"当前温度_F\",\"typeSpec\":{\"type\":\"value\",\"max\":122,\"min\":-4,\"scale\":0,\"step\":1,\"unit\":\"℉\"}},
{\"abilityId\":34,\"accessMode\":\"ro\",\"code\":\"humidity\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-shidu\"},\"name\":\"当前湿度\",\"typeSpec\":{\"type\":\"value\",\"max\":100,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"%\"}},
{\"abilityId\":39,\"accessMode\":\"rw\",\"code\":\"factory_reset\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-icon-test12\"},\"name\":\"恢复出厂设置\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":40,\"accessMode\":\"rw\",\"code\":\"child_lock\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_lock\"},\"name\":\"童锁\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":42,\"accessMode\":\"ro\",\"code\":\"countdown_left\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_time\",\"attribute\":\"1024\"},\"name\":\"时段结束时间\",\"typeSpec\":{\"type\":\"value\",\"max\":1440,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"min\"}},
{\"abilityId\":44,\"accessMode\":\"rw\",\"code\":\"backlight\",\"description\":\"0-Gas/Oil, 1-Electric, 2-Heat Pump, 3-No Heat, 4-Dual Fuel, 5-Heat Pump with emergency, 6-No Cool\",\"extensions\":{\"iconName\":\"icon-liangdu\",\"attribute\":\"1024\"},\"name\":\"加热类型\",\"typeSpec\":{\"type\":\"value\",\"max\":255,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"\"}},
{\"abilityId\":45,\"accessMode\":\"ro\",\"code\":\"fault\",\"description\":\"e1--传感器故障, filter--过滤器报警, low_alert--低温报警, high_alert--高温报警\",\"extensions\":{\"iconName\":\"icon-dp_notice\",\"scope\":\"fault\",\"attribute\":\"1024\"},\"name\":\"故障告警\",\"typeSpec\":{\"type\":\"bitmap\",\"label\":[\"e1\",\"filter\",\"low_alert\",\"high_alert\"],\"maxlen\":4}},
{\"abilityId\":52,\"accessMode\":\"rw\",\"code\":\"backlight_enum\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-liangdu\",\"attribute\":\"1024\"},\"name\":\"息屏时间\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"20s\",\"1minute\",\"3minutes\"]}},
{\"abilityId\":54,\"accessMode\":\"rw\",\"code\":\"heat_temp_set\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-wendu2\",\"attribute\":\"1152\"},\"name\":\"制热目标温度_℃\",\"typeSpec\":{\"type\":\"value\",\"max\":37,\"min\":5,\"scale\":0,\"step\":1,\"unit\":\"℃\"}},
{\"abilityId\":55,\"accessMode\":\"rw\",\"code\":\"heat_temp_set_f\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-wendu2\",\"attribute\":\"1152\"},\"name\":\"制热目标温度_℉\",\"typeSpec\":{\"type\":\"value\",\"max\":99,\"min\":42,\"scale\":0,\"step\":1,\"unit\":\"℉\"}},
{\"abilityId\":56,\"accessMode\":\"rw\",\"code\":\"runtime\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_time3\",\"attribute\":\"1152\"},\"name\":\"过滤器时间设置\",\"typeSpec\":{\"type\":\"value\",\"max\":360,\"min\":15,\"scale\":0,\"step\":1,\"unit\":\"day\"}},
{\"abilityId\":57,\"accessMode\":\"rw\",\"code\":\"cool_set_temp\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-wendu2\",\"attribute\":\"1152\"},\"name\":\"制冷目标温度_℃\",\"typeSpec\":{\"type\":\"value\",\"max\":37,\"min\":5,\"scale\":0,\"step\":1,\"unit\":\"℃\"}},
{\"abilityId\":58,\"accessMode\":\"rw\",\"code\":\"run_mode\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_mode\",\"attribute\":\"1152\"},\"name\":\"临调状态\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"close\",\"short\",\"permanent\"]}},
{\"abilityId\":59,\"accessMode\":\"rw\",\"code\":\"cool_set_temp_f\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-wendu2\",\"attribute\":\"1152\"},\"name\":\"制冷目标温度_℉\",\"typeSpec\":{\"type\":\"value\",\"max\":99,\"min\":42,\"scale\":0,\"step\":1,\"unit\":\"℉\"}},
{\"abilityId\":64,\"accessMode\":\"rw\",\"code\":\"fan_mode\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-a_mode_fan\",\"attribute\":\"1156\"},\"name\":\"风机模式\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"auto\",\"on\",\"circulation\"]}},
{\"abilityId\":67,\"accessMode\":\"rw\",\"code\":\"week_program9\",\"description\":\"星期一 4段\\n01 86 02 F8 03 F2 //前两个字节是时间(分钟)比如0x0186=390min=6:30,中间两个字节是制冷温度值(*10)0x02F8=760即76F,后面两个字节是制热温度(*10)0*03F2=1010即101F\\n01 E0 00 B4 02 24 //前两个字节是时间(分钟)比如0x01E0=480min=8:00,中间个字节是温度值(*10)0x00B4=180即18F,后面两个字节是制热温度(*10)0*0224=548即54.8F\\n04 38 00 D2 03 F1\\n05 46 00 A0 02 22\\n星期二 4段   每天都是4段\",\"extensions\":{\"iconName\":\"icon-zhouchengxu\",\"attribute\":\"1152\"},\"name\":\"周程序9\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":101,\"accessMode\":\"rw\",\"code\":\"alarm_switch\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_warming\",\"attribute\":\"4096\"},\"name\":\"报警开关\",\"typeSpec\":{\"type\":\"bool\"}},
{\"abilityId\":102,\"accessMode\":\"rw\",\"code\":\"circu_set\",\"description\":\"开启标志1byte,  风机开启时长2byte, 关闭时长2byte, 开启时间2byte,关闭时间2byte\",\"name\":\"风机循环设置\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":103,\"accessMode\":\"rw\",\"code\":\"change_week_program\",\"description\":\"头两个字节是温度最小值和最大值,接着是schedule数据:\\n星期一 \\n04 //第一个字节是段数\\n01 86 4C 46 //前两个字节是时间(分钟)比如0x0186=390min=6:30,中间两个字节是制冷温度值和制热温度值0x4C=76, 0x46=70\\n01 E0 4C 46 \\n04 38 4C 46\\n05 46 4C 46\\n星期二 \\n05 //段数\\n依次类推\",\"name\":\"可变周程序\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":104,\"accessMode\":\"rw\",\"code\":\"vacation\",\"description\":\"头两个字节是温度最小值和最大值,接着是schedule数据:\\n星期一 \\n04 //第一个字节是段数\\n01 86 4C 46 //前两个字节是时间(分钟)比如0x0186=390min=6:30,中间两个字节是制冷温度值和制热温度值0x4C=76, 0x46=70\\n01 E0 4C 46 \\n04 38 4C 46\\n05 46 4C 46\\n星期二 \\n05 //段数\\n依次类推\",\"name\":\"度假设置\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":105,\"accessMode\":\"rw\",\"code\":\"run_time\",\"description\":\"统计heat runtime 4byte, cool runtime 4byte, fan runtime 4byte\",\"name\":\"运行时间\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":106,\"accessMode\":\"ro\",\"code\":\"EnergyData\",\"description\":\"日期6byte, 设备类型1byte;室内温度2byte, 制热目标温度2byte, 制冷目标温度2byte--(温度值*10); 制热运行时间1byte, 制冷运行时间1byte, 紧急制热运行时间1byte, 辅热运行时间1byte, fan运行时间1byte \",\"name\":\"能源数据\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":107,\"accessMode\":\"ro\",\"code\":\"avg_temp\",\"description\":\"上报的温度值都是华氏度值\",\"name\":\"平均温度\",\"typeSpec\":{\"type\":\"value\",\"max\":104,\"min\":32,\"scale\":0,\"step\":1,\"unit\":\"F\"}},
{\"abilityId\":108,\"accessMode\":\"ro\",\"code\":\"avg_heatset\",\"description\":\"上报的温度值都是华氏度值\",\"name\":\"平均制热温度值\",\"typeSpec\":{\"type\":\"value\",\"max\":104,\"min\":32,\"scale\":0,\"step\":1,\"unit\":\"F\"}},
{\"abilityId\":109,\"accessMode\":\"ro\",\"code\":\"avg_coolset\",\"description\":\"上报的温度值都是华氏度值\",\"name\":\"平均制冷温度值\",\"typeSpec\":{\"type\":\"value\",\"max\":104,\"min\":32,\"scale\":0,\"step\":1,\"unit\":\"F\"}},
{\"abilityId\":110,\"accessMode\":\"ro\",\"code\":\"max_heatrun\",\"description\":\"有效数据是0~60,当接收到数据是空意思是没有制热产生\",\"name\":\"每小时制热运行时间\",\"typeSpec\":{\"type\":\"value\",\"max\":255,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"\"}},
{\"abilityId\":111,\"accessMode\":\"ro\",\"code\":\"max_coolrun\",\"description\":\"有效数据是0~60,当接收到数据是空意思是没有制冷产生\",\"name\":\"每小时制冷运行时间\",\"typeSpec\":{\"type\":\"value\",\"max\":255,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"\"}},
{\"abilityId\":112,\"accessMode\":\"ro\",\"code\":\"max_emheatrun\",\"description\":\"有效数据是0~60,当接收到数据是空意思是没有紧急制热产生\",\"name\":\"每小时紧急制热运行时间\",\"typeSpec\":{\"type\":\"value\",\"max\":255,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"\"}},
{\"abilityId\":113,\"accessMode\":\"ro\",\"code\":\"max_auxrun\",\"description\":\"有效数据是0~60,当接收到数据是空意思是没有辅热产生\",\"name\":\"每小时辅热运行时间\",\"typeSpec\":{\"type\":\"value\",\"max\":255,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"\"}},
{\"abilityId\":114,\"accessMode\":\"rw\",\"code\":\"dehumidifier\",\"description\":\"cool to dehumidifier使能1byte, 开启湿度阈值1byte,关闭制冷阈值*10 2byte, 最长运行时间分钟表示2byte\",\"name\":\"除湿\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":115,\"accessMode\":\"rw\",\"code\":\"date_time\",\"description\":\"年月日时分秒 6个字节+12/24小时制 1字节\",\"name\":\"日期时间\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":116,\"accessMode\":\"rw\",\"code\":\"auto_control\",\"description\":\"开启开关1byte+制热温度值1byte+制冷温度值1byte\",\"name\":\"自动控制功能\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}},
{\"abilityId\":117,\"accessMode\":\"rw\",\"code\":\"geo_location\",\"description\":\"开关1byte+半径2byte单位m+进入选项1byte(0-resum schedule,1-nothing,2-温度值)+进入地理围栏制冷温度1byte, 制热温度1byte+离开选项1byte(0-resum schedule,1-nothing,2-温度值)+离开地理围栏制冷温度1byte, 制热温度1byte;\\n设备会提供默认参数,app修改下发数据设备保存;\",\"name\":\"地理围栏\",\"typeSpec\":{\"type\":\"raw\",\"maxlen\":128}}]}]}"
  },
  "success": true,
  "t": 1727929940584,
  "tid": "7a81794c814011efbcbd7aea62a19b8a"
}

Product ID

3glq4enbzoahd41t

Product Name

vine tj-550

Information about how the device functions

when i add it through this it reads it as a garage door opener. nothing else.

joshuamns commented 6 days ago

just let me know if you need me to get any more info or anything! its a cheap little smart thermostat that works GREAT so far lol.

make-all commented 4 days ago

I have added this, but likely there are many flaws, since this is a very complex device, and many of the names above conflict with the translated description of the same datapoint, so it is difficult to determine the true meaning.

joshuamns commented 4 days ago

is there an unreleased patch i can try? or should i just wait until there is an update?

make-all commented 4 days ago

You can try downloading the file from here: https://github.com/make-all/tuya-local/blob/main/custom_components/tuya_local/devices/vine_tj550_thermostat.yaml

Drop it into your config/custom_components/tuya-local/devices directory and try to add your device.

joshuamns commented 4 days ago

well its like 99% there but it works great!! the heat and cool temp are weird sliders(not the correct scale to be usable).. but i wont use that lol.

joshuamns commented 4 days ago

i spoke to soon lol. the whole scale is incorrect. if i try to change the temp at all (showing 71F and trying to raise to 72) it jumps to 85F but shows 710F and gets this error "Failed to perform the action climate/set_temperature. temp_set_f (85.0) must be between 420.0 and 1000.0"

make-all commented 4 days ago

The scaling of the main thermostat is missing the scale on the Fahrenheit value, so it is applying the scale to the shown value, but not applying it when it is adjusted. I am not sure I remember how the scaling needs to be configured to work for redirected values, so it may take a couple more tries.

The Heat temperature was missing the range adjustment for the Fahrenheit case, which should be fixed now.