{"adoption": {"forks": 265, "observed_at": "2026-08-28T04:05:26.628717+00:00", "stars": 1720}, "canonical_url": "https://ross.abutalabs.com/products/tinytuya", "card": {"archived": false, "artifact_type": "library", "description": "Python API and command line tool for Tuya WiFi smart devices using a direct local area network (LAN) connection or the cloud (TuyaCloud API).", "domain": ["iot", "developer-tools"], "enriched": true, "function": ["sdk", "http-client", "cli", "developer-tools"], "health_score": 96, "homepage": null, "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["jasonacox/tinytuya"], "name": "jasonacox/tinytuya", "platform": ["python", "cross-platform", "cli"], "pushed_at": "2026-07-19T00:22:06+00:00", "repo": "jasonacox/tinytuya", "stars": 1720, "tags": ["tuya", "smarthome", "iot-devices", "local-network-control", "cloud-api", "device-control", "automation"], "topics": ["tuya", "pytuya", "smarthome", "device", "python", "api", "pythonmodule"], "urls": [], "use_cases": ["control tuya smart plugs from python", "poll status of smart home devices over local network", "turn lights on and off without the tuya cloud", "manage tuya devices via the tuya cloud api", "discover tuya devices on my lan", "replace pytuya library for smart device control", "script automation for wifi smart switches"], "what_it_is": "TinyTuya is a Python module and command line tool for controlling and reading the state of Tuya-compatible WiFi smart devices such as plugs, switches, and lights. It supports both direct local area network (LAN) connections and the Tuya Cloud API, covering Tuya protocols 3.1 through 3.5.", "when_to_avoid": ["your smart devices are not Tuya-based or do not use the Tuya protocol", "you need a graphical app rather than a Python library or CLI", "you require official vendor support or guaranteed compatibility with all Tuya device categories"], "when_to_choose": ["you need to control Tuya WiFi smart devices programmatically from Python", "you want local LAN control of devices without relying on the cloud", "you need a drop-in replacement for the deprecated pytuya module", "you want both a Python API and a command line tool in one package"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tinytuya", "repo": "jasonacox/tinytuya", "role": "main", "score": 94}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.628717+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:34:04.986102+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "69ad4ebc80cedfbc2d57bc1f671019b68a64a57ef253c164a002eab7f61439c3", "fetched_at": "2026-08-28T04:05:26.628717+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jasonacox/tinytuya"}, {"content_hash": "479ad74bc40c2dd597b63d888edaf2a96865d22973f8537bd8e5fd30f1122b7f", "fetched_at": "2026-08-29T11:09:50.475198+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/tinytuya/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 93, "longevity": 100, "rhythm": 92}, "computed_at": "2026-09-03T02:39:23.370411+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2190, "days_push": 46, "days_rel": 58, "gap_med": 23.5, "n_releases_24m": 15}, "score": 94, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}