tuya / tuya-home-assistant

Home Assistant integration for controlling Powered by Tuya (PBT) devices using Tuya Open API, maintained by the Home Assistant Community and Tuya Developer Team.
MIT License
868 stars 206 forks source link

Support Request: PetLux Smart Cat Litter Robot #903

Open kimme1024 opened 1 year ago

kimme1024 commented 1 year ago

Device normal info

Device info (please complete the following information, which can be found in log): like this:

{
  "home_assistant": {
    "installation_type": "Home Assistant Core",
    "version": "2023.1.7",
    "dev": false,
    "hassio": false,
    "virtualenv": true,
    "python_version": "3.10.8",
    "docker": false,
    "arch": "arm64",
    "timezone": "Europe/Brussels",
    "os_name": "Darwin",
    "os_version": "13.1",
    "run_as_root": false
  },
  "custom_components": {
    "spotcast": {
      "version": "v3.6.30",
      "requirements": []
    },
    "mass": {
      "version": "2022.12.1",
      "requirements": [
        "music-assistant==1.8.7.2",
        "git+https://github.com/music-assistant/databases@fix-breaking-sqlalchemy-cursor-changes#databases==0.6.3"
      ]
    },
    "sonoff": {
      "version": "3.3.1",
      "requirements": [
        "pycryptodome>=3.6.6"
      ]
    },
    "mczmaestro": {
      "version": "0.1.0",
      "requirements": [
        "websocket-client==0.57.0"
      ]
    },
    "better_thermostat": {
      "version": "1.0.0",
      "requirements": []
    },
    "xiaomi_miot": {
      "version": "0.4.16",
      "requirements": [
        "construct==2.10.56",
        "python-miio>=0.5.6",
        "micloud>=0.3"
      ]
    },
    "afvalbeheer": {
      "version": "5.0.10",
      "requirements": [
        "rsa",
        "pycryptodome"
      ]
    },
    "neerslag": {
      "version": "2022.07.07.1",
      "requirements": []
    },
    "watchman": {
      "version": "0.5.1",
      "requirements": [
        "prettytable==3.0.0"
      ]
    },
    "miwifi": {
      "version": "2.9.0",
      "requirements": []
    },
    "hacs": {
      "version": "1.30.0",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    },
    "xiaomi_cloud_map_extractor": {
      "version": "v2.2.0",
      "requirements": [
        "pillow",
        "pybase64",
        "python-miio",
        "requests",
        "pycryptodome"
      ]
    }
  },
  "integration_manifest": {
    "domain": "tuya",
    "name": "Tuya",
    "documentation": "https://www.home-assistant.io/integrations/tuya",
    "requirements": [
      "tuya-iot-py-sdk==0.6.6"
    ],
    "dependencies": [
      "ffmpeg"
    ],
    "codeowners": [
      "@Tuya",
      "@zlinoliver",
      "@frenck"
    ],
    "config_flow": true,
    "iot_class": "cloud_push",
    "dhcp": [
      {
        "macaddress": "105A17*"
      },
      {
        "macaddress": "10D561*"
      },
      {
        "macaddress": "1869D8*"
      },
      {
        "macaddress": "381F8D*"
      },
      {
        "macaddress": "508A06*"
      },
      {
        "macaddress": "68572D*"
      },
      {
        "macaddress": "708976*"
      },
      {
        "macaddress": "7CF666*"
      },
      {
        "macaddress": "84E342*"
      },
      {
        "macaddress": "D4A651*"
      },
      {
        "macaddress": "D81F12*"
      }
    ],
    "integration_type": "hub",
    "loggers": [
      "tuya_iot"
    ],
    "is_built_in": true
  },
  "data": {
    "endpoint": "https://openapi.tuyaeu.com",
    "auth_type": 0,
    "country_code": "32",
    "app_type": "tuyaSmart",
    "mqtt_connected": true,
    "disabled_by": null,
    "disabled_polling": false,
    "name": "Automatic Cat Litter Box",
    "model": "\u5ba0\u7269\u732b\u7802\u76c6",
    "category": "msp",
    "product_id": "5t7esmqqh92ssbe5",
    "product_name": "Automatic Cat Litter Box",
    "online": true,
    "sub": false,
    "time_zone": "+01:00",
    "active_time": "2023-01-24T11:33:07+00:00",
    "create_time": "2023-01-24T11:33:07+00:00",
    "update_time": "2023-01-24T11:33:10+00:00",
    "function": {
      "deodorization": {
        "type": "Boolean",
        "value": {}
      }
    },
    "status_range": {
      "cat_weight": {
        "type": "Integer",
        "value": {
          "unit": "g",
          "min": 600,
          "max": 10000,
          "scale": 0,
          "step": 1
        }
      },
      "excretion_times_day": {
        "type": "Integer",
        "value": {
          "unit": "times",
          "min": 0,
          "max": 60,
          "scale": 0,
          "step": 1
        }
      },
      "excretion_time_day": {
        "type": "Integer",
        "value": {
          "unit": "s",
          "min": 0,
          "max": 1800,
          "scale": 0,
          "step": 1
        }
      },
      "deodorization": {
        "type": "Boolean",
        "value": {}
      },
      "fault": {
        "type": "Bitmap",
        "value": {
          "label": [
            "motor_fault",
            "program_fault",
            "g_sensor_fault"
          ],
          "maxlen": 3
        }
      }
    },
    "status": {
      "cat_weight": 600,
      "excretion_times_day": 0,
      "excretion_time_day": 0,
      "deodorization": false,
      "fault": 0
    },
    "home_assistant": {
      "name": "Automatic Cat Litter Box",
      "name_by_user": null,
      "disabled": false,
      "disabled_by": null,
      "entities": []
    }
  }
}

Nothing shows up in the logs as requested so I've added the devices diagnostics info. It connected perfectly but it shows up as unsupported so no sensors/switches are available. If you'd need more info to implement this, feel free to contact me.

Thanks in advance!

kastmgnru commented 1 year ago

Hi, I have the exact same device (only in my case a Tonepie manufacturer) and would like to see it in HA. Standard instructions: https://developer.tuya.com/en/docs/iot/f?id=Kakg309qkmuit

"data": {

"endpoint": "https://openapi.tuyaeu.com",
"auth_type": 0,
"country_code": "7",
"app_type": "smartlife",
"mqtt_connected": true,
"disabled_by": null,
"disabled_polling": false,
"name": "Automatic Cat Litter Box",
"model": "\u5ba0\u7269\u732b\u7802\u76c6",
"category": "msp",
"product_id": "5t7esmqqh92ssbe5",
"product_name": "Automatic Cat Litter Box",
"online": true,
"sub": false,
"time_zone": "+03:00",
"active_time": "2023-02-09T14:08:21+00:00",
"create_time": "2023-02-09T14:08:21+00:00",
"update_time": "2023-02-09T14:33:54+00:00",
"function": {
  "deodorization": {
    "type": "Boolean",
    "value": {}
  }
},
"status_range": {
  "cat_weight": {
    "type": "Integer",
    "value": {
      "unit": "g",
      "min": 600,
      "max": 10000,
      "scale": 0,
      "step": 1
    }
  },
  "excretion_times_day": {
    "type": "Integer",
    "value": {
      "unit": "times",
      "min": 0,
      "max": 60,
      "scale": 0,
      "step": 1
    }
  },
  "excretion_time_day": {
    "type": "Integer",
    "value": {
      "unit": "s",
      "min": 0,
      "max": 1800,
      "scale": 0,
      "step": 1
    }
  },
  "deodorization": {
    "type": "Boolean",
    "value": {}
  },
  "fault": {
    "type": "Bitmap",
    "value": {
      "label": [
        "motor_fault",
        "program_fault",
        "g_sensor_fault"
      ],
      "maxlen": 3
    }
  }
},
"status": {
  "cat_weight": 2793,
  "excretion_times_day": 1,
  "excretion_time_day": 74,
  "deodorization": false,
  "fault": 0
},
"home_assistant": {
  "name": "Automatic Cat Litter Box",
  "name_by_user": null,
  "disabled": false,
  "disabled_by": null,
  "entities": []
}
acme64 commented 1 year ago

I think i'm in the same boat? mine is a different manufacturer as well, but it looks just like that tonepie model. it also added correctly but showed no devices in HA. What would need to be updated to make it compatible?

kimme1024 commented 1 year ago

It works when configuring it manually in local tuya. However it’s a bit of a hassle.

acme64 commented 1 year ago

How do I do that

kimme1024 commented 1 year ago

How do I do that

Install local tuya Add your device and make sensors that link to the correct numbers found on the tuya dev website.

kim82 commented 1 year ago

How do I do that

Install local tuya Add your device and make sensors that link to the correct numbers found on the tuya dev website.

I got mine to show up in local Tuya. Do you have a link to where I can match the correct numbers?

kimme1024 commented 1 year ago

How do I do that

Install local tuya Add your device and make sensors that link to the correct numbers found on the tuya dev website.

I got mine to show up in local Tuya. Do you have a link to where I can match the correct numbers?

It's easy to discover as the values can be compared with the ones from the app. I think this will be the safest way to do it as i don't know if the numbers will be the same across different brands.

For Petlux:

Number: 6: Weight 8: Excretion Time 117: Clumping Time 118: Cleaning Interval

Switch: 17: Deodorize 101: Clean 102: Empty 105: Auto 111: IR-sensor 119: Full

kim82 commented 1 year ago

Heres from my generic branded (JZWLW) cat litter tray Sensor: 6: Weight 8: Excretion Time

Number: 117: Clumping Time (min: 0, max: 60) 118: Cleaning Interval (min: 0, max: 120)

Switch: 101: Clean 102: Empty 105: Auto 111: IR-sensor 114: Child lock 122: Do not disturb 120: Odourless

Binary sensor: 119: Full

robbavel commented 1 year ago

I would like to add to the already existing list

here are all the ones i know

Sensor: 6: Weight 8: Excretion Time

Number: 117: Clumping Time (min: 0, max: 60) 118: Cleaning Interval (min: 0, max: 120) 127: Detection Sensitivity (min: 600, max: 1500, increment: 100) 124: Waste Bin Calibration (min: 0, max : 15) 125: Litter level setting: (min: 0, max: 6)

Switch: 101: Clean 102: Empty 105: Auto 111: IR-sensor 114: Child lock 122: Do not disturb 120: Odourless

Binary sensor: 119: Full

developersteve commented 11 months ago

Adding to this, Ive got the petree as well and trying to backwards engineer the dps_string. My values seem different to these though, heres the full output from the diagnostic:

     "dps_strings": [
        "5 (value: 4)",
        "23 (value: False)",
        "101 (value: True)",
        "102 (value: True)",
        "103 (value: False)",
        "105 (value: False)",
        "106 (value: 1350)",
        "107 (value: 480)",
        "108 (value: True)",
        "110 (value: 1)",
        "111 (value: 32)",
        "112 (value: False)",
        "113 (value: 0)",
        "114 (value: 23)",
        "115 (value: 60001)",
        "116 (value: XXXXXX)",     #mcu (hidden) 
        "117 (value: 5)",
        "118 (value: 0)",
        "119 (value: True)",
        "120 (value: 1009)",
        "121 (value: 187)",
        "122 (value: 0)",
        "123 (value: 1898)",
        "124 (value: 0)",
        "126 (value: False)",
        "127 (value: 39)",
        "128 (value: 1111)"
      ],
      "entities": [
        {
          "id": 101,
          "friendly_name": "Cleaning",
          "restore_on_reconnect": false,
          "is_passive_entity": false,
          "platform": "switch"
        },
        {
          "id": 119,
          "friendly_name": "Full",
          "state_on": "True",
          "state_off": "False",
          "platform": "binary_sensor"
        },
        {
          "id": 124,
          "friendly_name": "Waste Bin Calibration",
          "min_value": 0.0,
          "max_value": 100000.0,
          "step_size": 1.0,
          "restore_on_reconnect": false,
          "is_passive_entity": false,
          "platform": "number"
        }
      ],
developersteve commented 11 months ago

Hey i found where to get the values from, although the meaning could be a little weird.

From the Tuya cloud login > your project > devices. Find the device you want to debug from the device list and then click debug device.

Click on the device logs tab on the top of the debug page for the device, and change the date range to the maximum you are able to. Now inspect element using the browser you are using and click on network. Drop down the drop down the DP ID dropdown and select something from the list, then click search.

You should see the requests go out in the browser inspect network, the one you are looking for here is the list entry, click on that and then look at the payload, it should look something like this:

{
    "startRowId": "",
    "pageNo": 1,
    "pageSize": 10,
    "code": "101",
    "startTime": 1695287053764,
    "endTime": 1695805453764,
    "projectCode": "p1641704291064uwv7dc",
    "sourceId": "eu16175080464804Nlvu",
    "sourceType": "4",
    "deviceId": "bf2261c924da6625101z4u",
    "pageStartRow": "",
    "region": "EU"
}

Match that with the text value in the dropdown from the search you executed, and volla!

In my json above, 101 is actually "Report the number of trips to the toilet at one time"

developersteve commented 11 months ago

full json list

[
 {
   "DP ID": 5,
   "DP Name": "Delay Clean Time",
   "Data Type": "Value"
 },
 {
   "DP ID": 102,
   "DP Name": "LED",
   "Data Type": "Bool"
 },
 {
   "DP ID": 103,
   "DP Name": "Do Not Disturb All Day",
   "Data Type": "Bool"
 },
 {
   "DP ID": 105,
   "DP Name": "Do Not Disturb Mode",
   "Data Type": "Bool"
 },
 {
   "DP ID": 106,
   "DP Name": "Start time of do not disturb time ",
   "Data Type": "Bool"
 },
 {
   "DP ID": 107,
   "DP Name": "End timeof do not disturb time ",
   "Data Type": "Bool"
 },
 {
   "DP ID": 108,
   "DP Name": "Warning Tone",
   "Data Type": "Bool"
 },
 {
   "DP ID": 110,
   "DP Name": "History",
   "Data Type": "Enum"
 },
 {
   "DP ID": 111,
   "DP Name": "Pop up notification mesage ",
   "Data Type": "Fault"
 },
 {
   "DP ID": 112,
   "DP Name": "The trash can is full ",
   "Data Type": "Bool"
 },
 {
   "DP ID": 113,
   "DP Name": "Pedal angle ",
   "Data Type": "Value"
 },
 {
   "DP ID": 114,
   "DP Name": "Hardware function",
   "Data Type": "Value"
 },
 {
   "DP ID": 115,
   "DP Name": "PIR_RADAR",
   "Data Type": "String"
 },
 {
   "DP ID": 116,
   "DP Name": "ID of MCU",
   "Data Type": "Value"
 },
 {
   "DP ID": 117,
   "DP Name": "Working Status",
   "Data Type": "Enum"
 },
 {
   "DP ID": 118,
   "DP Name": "Dumping Sand",
   "Data Type": "Bool"
 },
 {
   "DP ID": 119,
   "DP Name": "Power on and restart the callibration time succeded",
   "Data Type": "Value"
 },
 {
   "DP ID": 120,
   "DP Name": "Magnet Number",
   "Data Type": "Value"
 },
 {
   "DP ID": 121,
   "DP Name": "Temp",
   "Data Type": "Value"
 },
 {
   "DP ID": 122,
   "DP Name": "Motor current value",
   "Data Type": "Value"
 },
 {
   "DP ID": 123,
   "DP Name": "Temp ADC",
   "Data Type": "Value"
 },
 {
   "DP ID": 124,
   "DP Name": "Clean",
   "Data Type": "Enum"
 },
 {
   "DP ID": 125,
   "DP Name": "Lock",
   "Data Type": "Bool"
 },
 {
   "DP ID": 126,
   "DP Name": "Clean",
   "Data Type": "Bool"
 },
 {
   "DP ID": 127,
   "DP Name": "Dedorization Num",
   "Data Type": "Value"
 },
 {
   "DP ID": 128,
   "DP Name": "Kill",
   "Data Type": "Value"
 }
]
kim82 commented 11 months ago

Following @developersteve foot steps. You can use the inspect Network and there is a full list of all the id's Refresh the entire page, and look for one of the last "list" in the network.

Here from mine generic branded (JZWLW) "dpId":128, "dpName":"number" "dpId":6, "dpName":"Cat Weight" "dpId":7, "dpName":"excretion times day" "dpId":8, "dpName":"Excretion Time" "dpId":17, "dpName":"Deodorization" "dpId":22, "dpName":"Fault" "dpId":101, "dpName":"clean" "dpId":102, "dpName":"empty" "dpId":103, "dpName":"trash status" "dpId":104, "dpName":"monitoring" "dpId":105, "dpName":"auto" "dpId":106, "dpName":"clean time" "dpId":107, "dpName":"clean time switch" "dpId":108, "dpName":"\u7248\u672c\u8bc6\u522b" "dpId":109, "dpName":"\u5907\u7528\u7248\u672c\u8bc6\u522b" "dpId":110, "dpName":"not disturb" "dpId":111, "dpName":"Infrared Rador Sensor" "dpId":112, "dpName":"toilet notice" "dpId":113, "dpName":"net notice" "dpId":114, "dpName":"Kids Lock" "dpId":115, "dpName":"calibration" "dpId":116, "dpName":"unit" "dpId":117, "dpName":"Clumping Time" "dpId":118, "dpName":"Cleaning Interval" "dpId":119, "dpName":"store full notify" "dpId":120, "dpName":"Deordrizer" "dpId":121, "dpName":"Smart clean" "dpId":122, "dpName":"Non-disturbing" "dpId":123, "dpName":"Usage Times" "dpId":124, "dpName":"Waste Bin Calibration" "dpId":125, "dpName":"Litter Leveling Setting" "dpId":126, "dpName":"Auto Deordrizer Setting" "dpId":127, "dpName":"Detection Sensitivity"

jerommeke-bos commented 8 months ago

I found the full description for the Petlux device. Here it is (in json):

{
    "model": {
        "modelId": "000003wldi",
        "services": [
            {
                "actions": [],
                "code": "",
                "description": "",
                "events": [],
                "name": "u9ed8u8ba4u670du52a1",
                "properties": [
                    {
                        "abilityId": 6,
                        "accessMode": "ro",
                        "code": "cat_weight",
                        "description": "u5b9au65f6u4e0au62a5u732bu54aau4f53u91cduff0cu652fu6301u591au53eau732bu54aau79f0u91cduff0cAPPu7aefu53efu9009u624bu52a8u5206u7c7bu4e0du540cu732bu54aau4e0du540cu4f53u91cdn",
                        "extensions": {
                            "iconName": "icon-dp_mode",
                            "attribute": "1024"
                        },
                        "name": "u732bu54aau4f53u91cd",
                        "typeSpec": {
                            "max": 10000,
                            "min": 600,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 600,
                            "unit": "g"
                        }
                    },
                    {
                        "abilityId": 7,
                        "accessMode": "ro",
                        "code": "excretion_times_day",
                        "description": "u732bu54aau6392u6cc4u540euff0cu8bbeu5907u7aefu4e0au62a5u5f53u5929u6392u6cc4u603bu6b21u6570uff0cAPPu7aefu8fdbu884cu5c55u793an",
                        "extensions": {
                            "iconName": "icon-dp_0",
                            "attribute": "1024"
                        },
                        "name": "u6bcfu5929u6392u6cc4u6b21u6570",
                        "typeSpec": {
                            "max": 60,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": "times"
                        }
                    },
                    {
                        "abilityId": 8,
                        "accessMode": "ro",
                        "code": "excretion_time_day",
                        "description": "u732bu54aau6392u6cc4u540euff0cu8bbeu5907u7aefu4e0au62a5u5f53u6b21u6392u6cc4u65f6u957fuff0cAPPu7aefu8fdbu884cu5c55u793au4e0du540cu65f6u95f4u7684u65f6u957fu8d8bu52bfn",
                        "extensions": {
                            "iconName": "icon-dp_time",
                            "attribute": "1024"
                        },
                        "name": "u5982u5395u65f6u957f",
                        "typeSpec": {
                            "max": 1800,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": "s"
                        }
                    },
                    {
                        "abilityId": 17,
                        "accessMode": "rw",
                        "code": "deodorization",
                        "description": "u9664u81edu6740u83ccu5f00u5173",
                        "extensions": {
                            "iconName": "icon-dp_filter",
                            "attribute": "1024"
                        },
                        "name": "u9664u81edu6740u83cc",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 22,
                        "accessMode": "ro",
                        "code": "fault",
                        "description": "motor_faultuff1au7535u673au6545u969cnprogram_faultuff1au7a0bu5e8fu9519u8befng_sensor_faultuff1au91cdu529bu4f20u611fu5668u611fu5e94u5f02u5e38n",
                        "extensions": {
                            "iconName": "icon-baojing",
                            "attribute": "1024"
                        },
                        "name": "u6545u969cu544au8b66",
                        "typeSpec": {
                            "label": [
                                "motor_fault",
                                "program_fault",
                                "g_sensor_fault"
                            ],
                            "maxlen": 3,
                            "type": "bitmap",
                            "typeDefaultValue": 0
                        }
                    },
                    {
                        "abilityId": 101,
                        "accessMode": "rw",
                        "code": "Clean",
                        "description": "1 u5f00u59cb  0 u5173u95ed",
                        "name": "u4e00u952eu6e05u7406",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 102,
                        "accessMode": "rw",
                        "code": "empty",
                        "description": "1 u5f00u59cb  0u53d6u6d88",
                        "name": "u4e00u952eu6362u7802",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 103,
                        "accessMode": "ro",
                        "code": "trash_status",
                        "description": "0u5783u573eu6876u7a7auff0cu63d0u793au6587u5b57u6d88u5931n1u5783u573eu6876u6ee1uff0cu63d0u793au6587u5b57",
                        "name": "u5783u573eu6876u72b6u6001",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 104,
                        "accessMode": "ro",
                        "code": "monitoring",
                        "description": "u5f53u732bu8fdbu5165u540euff0c u51fau73b0u6587u5b57u63d0u793auff0c u732bu54aau79bbu5f00u540eu6d88u5931",
                        "name": "u6876u5185u76d1u6d4b",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 105,
                        "accessMode": "rw",
                        "code": "Induction_Clean",
                        "description": "",
                        "name": "u611fu5e94u6e05u7406",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 106,
                        "accessMode": "rw",
                        "code": "clean_time",
                        "description": "u6bcfu4e2au65f6u95f4u6309u7167nu5c0fu65f6u5206u949fu683cu5f0fuff0cu6bcfu4e2au5360u75282u4e2au5b57u8282uff0cu5206u949fu548cu5c0fu65f6uff0cu5341u8fdbu5236u8f6c16u8fdbu5236uff0cu598218uff1a50uff0cu8f6cu4e3a16u8fdbu5236u4e3a1232u3002nu5468u671fu4e3au4e8cu8fdbu5236 u661fu671fu6216u5355u6b21u6709u6548u3002nu6700u591au652fu6301u4e09u4e2au65f6u95f4u8bbeu7f6euff0cu672au8bbeu7f6eu7684u75280u8865u5145u3002nu4e3eu4f8buff1a12320013200000000000",
                        "name": "u5b9au65f6u6e05u7406",
                        "typeSpec": {
                            "maxlen": 128,
                            "type": "raw"
                        }
                    },
                    {
                        "abilityId": 107,
                        "accessMode": "rw",
                        "code": "clean_time_switch",
                        "description": "",
                        "name": "u5b9au65f6u6e05u7406u5f00u5173",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 108,
                        "accessMode": "rw",
                        "code": "Clean_taste",
                        "description": "u6bcfu4e2au65f6u95f4u6309u7167nu5c0fu65f6u5206u949fu683cu5f0fuff0cu6bcfu4e2au5360u75282u4e2au5b57u8282uff0cu5206u949fu548cu5c0fu65f6uff0cu5341u8fdbu5236u8f6c16u8fdbu5236uff0cu598218uff1a50uff0cu8f6cu4e3a16u8fdbu5236u4e3a1232u3002nu5468u671fu4e3au4e8cu8fdbu5236 u661fu671fu6216u5355u6b21u6709u6548u3002nu6700u591au652fu6301u4e09u4e2au65f6u95f4u8bbeu7f6euff0cu672au8bbeu7f6eu7684u75280u8865u5145u3002nu4e3eu4f8buff1a12320013200000000000",
                        "name": "u7248u672cu8bc6u522b",
                        "typeSpec": {
                            "maxlen": 128,
                            "type": "raw"
                        }
                    },
                    {
                        "abilityId": 109,
                        "accessMode": "rw",
                        "code": "Clean_tasteSwitch",
                        "description": "",
                        "name": "u5907u7528u7248u672cu8bc6u522b",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 110,
                        "accessMode": "rw",
                        "code": "not_disturb",
                        "description": "",
                        "name": "u514du6253u6270",
                        "typeSpec": {
                            "maxlen": 128,
                            "type": "raw"
                        }
                    },
                    {
                        "abilityId": 111,
                        "accessMode": "rw",
                        "code": "Clean_notice",
                        "description": "u7ea2u5916u529fu80fdu5f00u542fu6216u5173u95ed",
                        "name": "u5173u95edu7ea2u5916u4ee5u9002u5e94u732bu5c4b",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 112,
                        "accessMode": "rw",
                        "code": "toilet_notice",
                        "description": "",
                        "name": "u5982u5395u901au77e5",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 113,
                        "accessMode": "rw",
                        "code": "Net_notice",
                        "description": "u53eau6709u89e6u53d1u6545u969cu65f6uff0cu53efu7528u4e8eu6876u4ed3u590du4f4d",
                        "name": "u6876u4ed3u590du4f4d",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 114,
                        "accessMode": "rw",
                        "code": "child_lock",
                        "description": "",
                        "name": "u7ae5u9501",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 115,
                        "accessMode": "rw",
                        "code": "calibration",
                        "description": "calibration",
                        "extensions": {
                            "trigger": "direct"
                        },
                        "name": "u79e4u6821u51c6",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 116,
                        "accessMode": "rw",
                        "code": "unit",
                        "description": "",
                        "name": "u5355u4f4d",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 117,
                        "accessMode": "rw",
                        "code": "induction_delay",
                        "description": "",
                        "name": "u6e05u7406u7b49u5f85u65f6u95f4",
                        "typeSpec": {
                            "max": 60,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": "u5206u949fm"
                        }
                    },
                    {
                        "abilityId": 118,
                        "accessMode": "rw",
                        "code": "induction_interval",
                        "description": "",
                        "name": "u6e05u7406u95f4u9694u65f6u95f4",
                        "typeSpec": {
                            "max": 120,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": "u5206u949fm"
                        }
                    },
                    {
                        "abilityId": 119,
                        "accessMode": "rw",
                        "code": "store_full_notify",
                        "description": "",
                        "name": "u96c6u4fbfu4ed3u6ee1u901au77e5",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 120,
                        "accessMode": "rw",
                        "code": "odourless",
                        "description": "",
                        "name": "u7acbu5373u51c0u5473",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 121,
                        "accessMode": "rw",
                        "code": "smart_clean",
                        "description": "",
                        "name": "u667au80fdu6e05u7406",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 122,
                        "accessMode": "rw",
                        "code": "not_disturb_Switch",
                        "description": "",
                        "name": "u514du6253u6270u5f00u5173",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 123,
                        "accessMode": "rw",
                        "code": "usage_times",
                        "description": "",
                        "extensions": {
                            "trigger": "direct"
                        },
                        "name": "u4f7fu7528u6b21u6570",
                        "typeSpec": {
                            "max": 100,
                            "min": 1,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 1,
                            "unit": "times"
                        }
                    },
                    {
                        "abilityId": 124,
                        "accessMode": "rw",
                        "code": "capacity_calibration",
                        "description": "",
                        "extensions": {
                            "trigger": "direct"
                        },
                        "name": "u96c6u4fbfu4ed3u4fbfu6ee1u6821u51c6",
                        "typeSpec": {
                            "max": 15,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": ""
                        }
                    },
                    {
                        "abilityId": 125,
                        "accessMode": "rw",
                        "code": "sand_surface_calibration",
                        "description": "",
                        "extensions": {
                            "trigger": "direct"
                        },
                        "name": "u6c99u9762u6821u51c6",
                        "typeSpec": {
                            "max": 6,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": ""
                        }
                    },
                    {
                        "abilityId": 126,
                        "accessMode": "rw",
                        "code": "auto_deordrizer",
                        "description": "",
                        "name": "u81eau52a8u51c0u5473",
                        "typeSpec": {
                            "type": "bool",
                            "typeDefaultValue": false
                        }
                    },
                    {
                        "abilityId": 127,
                        "accessMode": "rw",
                        "code": "detection_sensitivity",
                        "description": "",
                        "extensions": {
                            "trigger": "direct"
                        },
                        "name": "u68c0u6d4bu7075u654fu5ea6",
                        "typeSpec": {
                            "max": 1500,
                            "min": 600,
                            "scale": 0,
                            "step": 100,
                            "type": "value",
                            "typeDefaultValue": 600,
                            "unit": "g"
                        }
                    },
                    {
                        "abilityId": 128,
                        "accessMode": "rw",
                        "code": "number",
                        "description": "",
                        "extensions": {
                            "trigger": "direct"
                        },
                        "name": "number",
                        "typeSpec": {
                            "max": 999999,
                            "min": 0,
                            "scale": 0,
                            "step": 1,
                            "type": "value",
                            "typeDefaultValue": 0,
                            "unit": ""
                        }
                    }
                ]
            }
        ]
    }
}