Local support for Tuya devices in Home Assistant
This report presents the forensic synthetic code analysis of make-all/tuya-local, a Python project with 3,180 GitHub stars. SynthScan v2.0 examined 344,707 lines of code across 1796 source files, recording 612 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 3.2 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 612 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_config_flow.py | 850 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 852 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 959 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 961 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1015 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1017 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1297 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1299 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1407 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1409 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1502 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1504 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1560 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1562 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1593 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_flow.py | 1595 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_config_flow.py | 1099 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_config_flow.py | 1101 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 134 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 136 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 163 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 165 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 195 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 197 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 250 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 252 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 276 | # ========================================== | COMMENT |
| MEDIUM | …ts/tuya_local/devices/amicismart_1pjt_energymeter.yaml | 278 | # ========================================== | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 12 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 14 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 40 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 42 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 70 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 72 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 87 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 89 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 120 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nts/tuya_local/devices/smartmi_air_circulator_fan.yaml | 122 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | …nents/tuya_local/devices/inkbird_c236t_thermostat.yaml | 271 | # ----------------------------------------------------------- | COMMENT |
| MEDIUM | …nents/tuya_local/devices/inkbird_c236t_thermostat.yaml | 273 | # ----------------------------------------------------------- | COMMENT |
| MEDIUM | …nents/tuya_local/devices/inkbird_c236t_thermostat.yaml | 533 | # ----------------------------------------------------------- | COMMENT |
| MEDIUM | …nents/tuya_local/devices/inkbird_c236t_thermostat.yaml | 535 | # ----------------------------------------------------------- | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 8 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 10 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 31 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 33 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 80 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 82 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 126 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 128 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 162 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 164 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 200 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 202 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 239 | # ------------------------------------ | COMMENT |
| MEDIUM | …omponents/tuya_local/devices/nexsmart_air3_camera.yaml | 241 | # ------------------------------------ | COMMENT |
| MEDIUM | …ponents/tuya_local/devices/nexsmart_watch2_camera.yaml | 8 | # ------------------------------------ | COMMENT |
| MEDIUM | …ponents/tuya_local/devices/nexsmart_watch2_camera.yaml | 10 | # ------------------------------------ | COMMENT |
| MEDIUM⚡ | …ponents/tuya_local/devices/nexsmart_watch2_camera.yaml | 51 | # ------------------------------------ | COMMENT |
| MEDIUM⚡ | …ponents/tuya_local/devices/nexsmart_watch2_camera.yaml | 53 | # ------------------------------------ | COMMENT |
| 62 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_diagnostics.py | 25 | async def test_config_entry_diagnostics(hass): | CODE |
| LOW | tests/test_diagnostics.py | 68 | async def test_diagnostic_redaction(hass): | CODE |
| LOW | tests/test_water_heater.py | 47 | async def test_init_entry_fails_if_device_has_no_water_heater(hass): | CODE |
| LOW | tests/test_water_heater.py | 75 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW | tests/test_button.py | 18 | async def test_init_entry_as_secondary(hass): | CODE |
| LOW | tests/test_button.py | 44 | async def test_init_entry_fails_if_device_has_no_button(hass): | CODE |
| LOW | tests/test_button.py | 72 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW | tests/test_camera.py | 41 | async def test_init_entry_fails_if_device_has_no_camera(hass): | CODE |
| LOW | tests/test_camera.py | 66 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW⚡ | tests/test_entity.py | 101 | def test_init_begin_sets_device_and_config(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 108 | def test_init_begin_returns_dps_dict(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 115 | def test_init_begin_with_translation_key(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 121 | def test_init_begin_with_translation_only_key(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 128 | def test_init_begin_with_placeholders(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 134 | def test_init_end_excludes_blacklisted(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 142 | def test_init_end_excludes_hidden(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 168 | def test_available_when_device_returned_state(self, entity): | CODE |
| LOW⚡ | tests/test_entity.py | 171 | def test_available_false_when_no_state(self, entity, mock_device): | CODE |
| LOW⚡ | tests/test_entity.py | 175 | def test_available_false_when_config_unavailable(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 182 | def test_name_returns_config_name(self, entity): | CODE |
| LOW⚡ | tests/test_entity.py | 185 | def test_name_falls_back_to_super(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 191 | def test_name_uses_device_name_when_no_own_name(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 197 | def test_use_device_name_false_with_name(self, entity): | CODE |
| LOW⚡ | tests/test_entity.py | 200 | def test_use_device_name_false_with_translation_key(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 211 | def test_entity_category_none(self, entity): | CODE |
| LOW⚡ | tests/test_entity.py | 214 | def test_entity_category_config(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 218 | def test_entity_category_diagnostic(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 226 | def test_icon_falls_back_to_super(self, entity, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 230 | def test_extra_state_attributes(self, entity): | CODE |
| LOW⚡ | tests/test_entity.py | 235 | def test_extra_state_attributes_skips_none_optional(self, mock_device, mock_config): | CODE |
| LOW⚡ | tests/test_entity.py | 284 | async def test_async_added_to_hass_logs_deprecation( | CODE |
| LOW⚡ | tests/test_entity.py | 294 | async def test_async_will_remove_from_hass(self, entity, mock_device): | CODE |
| LOW⚡ | tests/test_entity.py | 298 | def test_on_receive_does_nothing(self, entity): | CODE |
| LOW | tests/test_entity.py | 35 | def _default_to_device_class_name(self): | CODE |
| LOW | tests/test_entity.py | 154 | def test_init_end_includes_non_blacklisted_non_hidden( | CODE |
| LOW | tests/test_entity.py | 249 | def test_extra_state_attributes_includes_none_required( | CODE |
| LOW | tests/test_entity.py | 266 | def test_entity_registry_enabled_default(self, entity, mock_config): | CODE |
| LOW | tests/test_time.py | 41 | async def test_init_entry_fails_if_device_has_no_time(hass): | CODE |
| LOW | tests/test_time.py | 66 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW | tests/test_select.py | 41 | async def test_init_entry_fails_if_device_has_no_select(hass): | CODE |
| LOW | tests/test_select.py | 66 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW | tests/test_siren.py | 39 | async def test_init_entry_fails_if_device_has_no_siren(hass): | CODE |
| LOW | tests/test_siren.py | 62 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW | tests/test_valve.py | 42 | async def test_init_entry_fails_if_device_has_no_valve(hass): | CODE |
| LOW | tests/test_valve.py | 70 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW | tests/test_lawn_mower.py | 46 | async def test_init_entry_fails_if_device_has_no_lawn_mower(hass): | CODE |
| LOW | tests/test_lawn_mower.py | 73 | async def test_init_entry_fails_if_config_is_missing(hass): | CODE |
| LOW⚡ | tests/test_device_config.py | 852 | def test_default_without_mapping(mocker): | CODE |
| LOW⚡ | tests/test_device_config.py | 860 | def test_matching_with_product_id(): | CODE |
| LOW⚡ | tests/test_device_config.py | 866 | def test_matched_product_id_with_conflict_rejected(): | CODE |
| LOW⚡ | tests/test_device_config.py | 872 | def test_multi_stage_redirect(mocker): | CODE |
| LOW | tests/test_device_config.py | 313 | def test_can_find_config_files(): | CODE |
| LOW | tests/test_device_config.py | 562 | def test_configs_can_be_matched(): | CODE |
| LOW | tests/test_device_config.py | 611 | def test_entity_find_unknown_dps_fails(): | CODE |
| LOW | tests/test_device_config.py | 621 | async def test_dps_async_set_readonly_value_fails(mocker): | CODE |
| LOW | tests/test_device_config.py | 633 | def test_dps_values_is_empty_with_no_mapping(mocker): | CODE |
| LOW | tests/test_device_config.py | 657 | def test_bytes_to_fmt_returns_string_for_unknown(): | CODE |
| LOW | tests/test_device_config.py | 678 | def test_format_with_none_defined(mocker): | CODE |
| LOW | tests/test_device_config.py | 740 | def test_match_returns_false_on_errors_with_bitfield(mocker): | CODE |
| LOW | tests/test_device_config.py | 918 | async def test_setting_multi_stage_redirect(mocker): | CODE |
| 279 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_water_heater.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_button.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_camera.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_time.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_select.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_valve.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_lawn_mower.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_alarm_control_panel.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_fan.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_humidifier.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_binary_sensor.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_event.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_datetime.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_cover.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_sensor.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_lock.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_text.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_infrared.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_light.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_remote.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_number.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_climate.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_vacuum.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | tests/test_switch.py | 0 | test initialisation when device has no matching entity | STRING |
| HIGH | custom_components/tuya_local/time.py | 0 | initialise the datetime entity. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the c | STRING |
| HIGH | custom_components/tuya_local/text.py | 0 | initialise the datetime entity. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the c | STRING |
| HIGH | custom_components/tuya_local/datetime.py | 0 | initialise the datetime entity. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the c | STRING |
| HIGH | custom_components/tuya_local/event.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/sensor.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/vacuum.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/binary_sensor.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/number.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/camera.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/select.py | 0 | initialise the select. args: device (tuyalocaldevice): the device api instance config (tuyaentityconfig): the configurat | STRING |
| HIGH | custom_components/tuya_local/fan.py | 0 | initialise the climate device. args: device (tuyalocaldevice): the device api instance. config (tuyaentityconfig): the e | STRING |
| HIGH | custom_components/tuya_local/remote.py | 0 | initialise the climate device. args: device (tuyalocaldevice): the device api instance. config (tuyaentityconfig): the e | STRING |
| HIGH | custom_components/tuya_local/humidifier.py | 0 | initialise the climate device. args: device (tuyalocaldevice): the device api instance. config (tuyaentityconfig): the e | STRING |
| HIGH | custom_components/tuya_local/climate.py | 0 | initialise the climate device. args: device (tuyalocaldevice): the device api instance. config (tuyaentityconfig): the e | STRING |
| HIGH | custom_components/tuya_local/fan.py | 0 | return the features supported by this climate device. | STRING |
| HIGH | custom_components/tuya_local/humidifier.py | 0 | return the features supported by this climate device. | STRING |
| HIGH | custom_components/tuya_local/water_heater.py | 0 | return the features supported by this climate device. | STRING |
| HIGH | custom_components/tuya_local/fan.py | 0 | return the list of presets that this device supports. | STRING |
| HIGH | custom_components/tuya_local/humidifier.py | 0 | return the list of presets that this device supports. | STRING |
| HIGH | custom_components/tuya_local/climate.py | 0 | return the list of presets that this device supports. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_translations.py | 61 | raise AssertionError(f"Inconsistent translations in {', '.join(unmatched)}") | COMMENT |
| LOW | tests/test_device.py | 401 | mocker.patch.object(patched_hass, "async_create_task") | COMMENT |
| LOW | tests/test_climate.py | 41 | m_add_entities.assert_called_once() | COMMENT |
| LOW | custom_components/tuya_local/helpers/device_config.py | 981 | return dps_map | COMMENT |
| LOW | …m_components/tuya_local/devices/rgb48_lightstring.yaml | 1 | # Smart Light RGB48 - RGBIC outdoor string lights | COMMENT |
| LOW | …mponents/tuya_local/devices/wifi_m604_quad_switch.yaml | 121 | # start_dur_lo, end_dur_hi, end_dur_lo] | COMMENT |
| LOW | …mponents/tuya_local/devices/wifi_m604_quad_switch.yaml | 141 | name: value | COMMENT |
| LOW | …mponents/tuya_local/devices/wifi_m604_quad_switch.yaml | 161 | category: config | COMMENT |
| LOW | …components/tuya_local/devices/etop_fcu_thermostat.yaml | 41 | # min: 41 | COMMENT |
| LOW | …nts/tuya_local/devices/elegrp_dtr10_dimmer_switch.yaml | 121 | range: | COMMENT |
| LOW | …nts/tuya_local/devices/elegrp_dtr10_dimmer_switch.yaml | 141 | # name: Maximum brightness | COMMENT |
| LOW | …nents/tuya_local/devices/dekala_lumos_alarm_clock.yaml | 1 | # `tuya-local` configuration for the Dekala Lumos sunrise alarm | COMMENT |
| LOW | …nents/tuya_local/devices/moes_motionsensor_switch.yaml | 1 | # Example DPS Status | COMMENT |
| LOW | …nents/tuya_local/devices/inkbird_c236t_thermostat.yaml | 501 | # Hex value FF acts as a "not used" placeholder. | COMMENT |
| LOW | …ts/tuya_local/devices/inkbird_int12bw_thermometer.yaml | 201 | # Probe2 | COMMENT |
| LOW | …om_components/tuya_local/devices/voldt_ev_charger.yaml | 81 | dps: | COMMENT |
| LOW | …om_components/tuya_local/devices/voldt_ev_charger.yaml | 201 | # mapping: | COMMENT |
| LOW | …omponents/tuya_local/devices/space_dog_music_lamp.yaml | 61 | # value: Fast | COMMENT |
| LOW | custom_components/tuya_local/devices/diivoo_wt05.yaml | 1 | # "11": 100, battery | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 61 | range: | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 161 | name: ble_unlock_check | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 241 | - entity: sensor | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 301 | # report the data. This dp is only used to display the anti-lock status on | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 321 | name: Automatic lock | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 341 | # optional: true | COMMENT |
| LOW | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 361 | # mapping: | COMMENT |
| LOW | …nts/tuya_local/devices/pv28-cw_airquality_monitor.yaml | 21 | dps: | COMMENT |
| LOW | …nts/tuya_local/devices/pv28-cw_airquality_monitor.yaml | 41 | # - dps_val: middle | COMMENT |
| LOW | …nts/tuya_local/devices/pv28-cw_airquality_monitor.yaml | 61 | # value: "ringtone_3" | COMMENT |
| LOW | …nts/tuya_local/devices/pv28-cw_airquality_monitor.yaml | 221 | # type: string | COMMENT |
| LOW | …tuya_local/devices/henden_essential_pool_heatpump.yaml | 141 | class: measurement | COMMENT |
| LOW | …/tuya_local/devices/fisher_summer_air_conditioner.yaml | 101 | # and et horizontal mode basic options) | COMMENT |
| LOW | …m_components/tuya_local/devices/junsun_ev_charger.yaml | 61 | name: value | COMMENT |
| LOW | …m_components/tuya_local/devices/junsun_ev_charger.yaml | 201 | value: true | COMMENT |
| LOW | …nts/tuya_local/devices/feyree_ev_portable_charger.yaml | 241 | # - id: 125 | COMMENT |
| LOW | …/tuya_local/devices/aygrochy_inline_wifi_air_vent.yaml | 301 | # "1":"Switch", | COMMENT |
| LOW | …/tuya_local/devices/aygrochy_inline_wifi_air_vent.yaml | 321 | # "117":"Auto-High humid switch", | COMMENT |
| LOW | …ents/tuya_local/devices/elechico_ccib001_heatpump.yaml | 1 | # Elechico / Guangdong Chico CCIB001-CC1177D — pool / ice-bath heat pump chiller | COMMENT |
| LOW | …nts/tuya_local/devices/nutromo_sh014_space_heater.yaml | 1 | name: Space heater | COMMENT |
| LOW | …onents/tuya_local/devices/catit_pixi_smart_feeder.yaml | 121 | # {% set s = states("sensor.your_last_meal_details") %} | COMMENT |
| LOW | …ponents/tuya_local/devices/intelbras_IFR7000_lock.yaml | 161 | # 27 = password_disable, 28 = password_enable, 39 = password_reset (rw), | COMMENT |
| LOW | …om_components/tuya_local/devices/asakuki_diffuser.yaml | 61 | value: lime | COMMENT |
| LOW | …om_components/tuya_local/devices/asakuki_diffuser.yaml | 81 | # max: 255 | COMMENT |
| LOW | …components/tuya_local/devices/proscenic_m9_vacuum.yaml | 361 | min: 0 | COMMENT |
| LOW | …components/tuya_local/devices/proscenic_m9_vacuum.yaml | 381 | # - dps_val: russian | COMMENT |
| LOW | …ponents/tuya_local/devices/aimiler_11kW_evcharger.yaml | 321 | # optional: true | COMMENT |
| LOW | …ponents/tuya_local/devices/aimiler_11kW_evcharger.yaml | 341 | # value: true | COMMENT |
| LOW | …ponents/tuya_local/devices/aimiler_11kW_evcharger.yaml | 361 | # name: sensor | COMMENT |
| LOW | …ponents/tuya_local/devices/aimiler_11kW_evcharger.yaml | 381 | # value: Fahrenheit | COMMENT |
| LOW | …m_components/tuya_local/devices/cecotec_fan_light.yaml | 41 | # I comment this features because that are reported by device but | COMMENT |
| LOW | …m_components/tuya_local/devices/cecotec_fan_light.yaml | 61 | # range: | COMMENT |
| LOW | …ya_local/devices/qlima_ms_ac_5002_air_conditioner.yaml | 1 | name: Air conditioner | COMMENT |
| LOW | …ya_local/devices/qlima_ms_ac_5002_air_conditioner.yaml | 21 | # COOL | COMMENT |
| LOW | …_components/tuya_local/devices/ultenic_t10_vacuum.yaml | 121 | - value: true | COMMENT |
| LOW | …_components/tuya_local/devices/ultenic_t10_vacuum.yaml | 141 | # DP 101 always "" | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/untranslated_select.py | 14 | CODE | |
| LOW | util/translation_candidates.py | 15 | CODE | |
| LOW | util/products.py | 11 | CODE | |
| LOW | util/best_match.py | 11 | CODE | |
| LOW | util/match_against.py | 11 | CODE | |
| LOW | util/untranslated_entities.py | 18 | CODE | |
| LOW | tests/test_device_config.py | 322 | CODE | |
| LOW | tests/test_device_config.py | 363 | CODE | |
| LOW | tests/test_device_config.py | 387 | CODE | |
| LOW | tests/test_device_config.py | 409 | CODE | |
| LOW | tests/test_device_config.py | 512 | CODE | |
| LOW | tests/test_device_config.py | 562 | CODE | |
| LOW | tests/test_remote.py | 382 | CODE | |
| LOW | custom_components/tuya_local/time.py | 61 | CODE | |
| LOW | custom_components/tuya_local/cover.py | 133 | CODE | |
| LOW | custom_components/tuya_local/light.py | 118 | CODE | |
| LOW | custom_components/tuya_local/light.py | 198 | CODE | |
| LOW | custom_components/tuya_local/light.py | 296 | CODE | |
| LOW | custom_components/tuya_local/remote.py | 144 | CODE | |
| LOW | custom_components/tuya_local/device.py | 52 | CODE | |
| LOW | custom_components/tuya_local/device.py | 258 | CODE | |
| LOW | custom_components/tuya_local/device.py | 321 | CODE | |
| LOW | custom_components/tuya_local/device.py | 547 | CODE | |
| LOW | custom_components/tuya_local/device.py | 656 | CODE | |
| LOW | custom_components/tuya_local/diagnostics.py | 83 | CODE | |
| LOW | custom_components/tuya_local/diagnostics.py | 98 | CODE | |
| LOW | custom_components/tuya_local/__init__.py | 40 | CODE | |
| LOW | custom_components/tuya_local/__init__.py | 92 | CODE | |
| LOW | custom_components/tuya_local/vacuum.py | 100 | CODE | |
| LOW | custom_components/tuya_local/lock.py | 99 | CODE | |
| LOW | custom_components/tuya_local/lock.py | 198 | CODE | |
| LOW | custom_components/tuya_local/entity.py | 100 | CODE | |
| LOW | custom_components/tuya_local/config_flow.py | 643 | CODE | |
| LOW | custom_components/tuya_local/config_flow.py | 73 | CODE | |
| LOW | custom_components/tuya_local/config_flow.py | 200 | CODE | |
| LOW | custom_components/tuya_local/config_flow.py | 348 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | custom_components/tuya_local/device.py | 128 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/device.py | 277 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/device.py | 300 | except Exception as t: | CODE |
| LOW | custom_components/tuya_local/device.py | 432 | except Exception as t: | CODE |
| LOW | custom_components/tuya_local/device.py | 689 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/__init__.py | 1011 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/config_flow.py | 93 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/config_flow.py | 496 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/config_flow.py | 669 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/config_flow.py | 684 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/helpers/config.py | 33 | except Exception as e: | CODE |
| LOW | custom_components/tuya_local/helpers/device_config.py | 856 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 225 | # switching, you can use this DP to switch the local doorbell ringtone of | COMMENT |
| MEDIUM | …ponents/tuya_local/devices/hornbill_y4_smart_lock.yaml | 438 | # [Modify unlocking method] After the device is online, you can modify | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | custom_components/tuya_local/cloud.py | 289 | def update_token(self, token_info: dict[str, Any]) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | custom_components/tuya_local/diagnostics.py | 3 | CODE |