{"adoption": {"forks": 141, "observed_at": "2026-09-01T02:14:03.307976+00:00", "stars": 1166}, "canonical_url": "https://ross.abutalabs.com/products/versatile_thermostat", "card": {"archived": false, "artifact_type": "plugin", "description": "A full featured Thermostat for Home Assistant: presets, window, motion, presence and overpowering management", "domain": ["iot", "energy", "self-hosted"], "enriched": true, "function": ["iot", "workflow-automation", "configuration-management"], "health_score": 100, "homepage": "https://www.versatile-thermostat.org/", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["jmcollin78/versatile_thermostat"], "name": "jmcollin78/versatile_thermostat", "platform": ["python", "iot", "self-hosted"], "pushed_at": "2026-08-30T13:45:28+00:00", "repo": "jmcollin78/versatile_thermostat", "stars": 1166, "tags": ["home-assistant", "hacs", "custom-component", "thermostat", "smart-home", "heating", "hvac", "temperature-control", "energy-saving", "presets", "window-detection", "presence-detection", "overpowering-protection", "tpi-regulation", "automation"], "topics": ["hacs-custom", "hacs-integration", "home-assistant", "python", "thermostat"], "urls": [], "use_cases": ["create a smart thermostat in home assistant", "turn off radiators automatically when a window is open", "limit total power draw from multiple heaters", "reduce heating bills with an adaptive self-regulating thermostat", "control heating and AC with motion and presence detection", "manage preset temperatures for home, eco, and comfort modes from one place", "unify control of mixed heating equipment like radiators and heat pumps"], "what_it_is": "Versatile Thermostat is a feature-rich custom component for Home Assistant that turns any heating or cooling equipment (radiators, AC units, heat pumps) into an intelligent, adaptive virtual thermostat. It natively handles presets, window-open and motion/presence detection, overpowering protection, and TPI/auto-TPI self-regulation so users can centralize control of multiple heating systems without writing automations.", "when_to_avoid": ["You are not using Home Assistant, since this is a HA custom component installed via HACS", "You need firmware or a standalone controller for a physical thermostat device", "You want a zero-configuration climate solution with no setup overhead"], "when_to_choose": ["You use Home Assistant and want an advanced thermostat without writing complex scripts or automations", "You need to centrally control several heterogeneous heating or cooling devices", "You want built-in energy optimization features like TPI learning, window detection, motion-based setback, and power load shedding"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/versatile_thermostat", "repo": "jmcollin78/versatile_thermostat", "role": "main", "score": 94}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-09-01T02:14:03.307976+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:31:29.710407+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7e899a32dd67b50d2cc356f599d67ddfe69cc13ee01af57f09dc1042d66e2772", "fetched_at": "2026-09-01T02:14:03.307976+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jmcollin78/versatile_thermostat"}, {"content_hash": "5e4dc1019bd3bc46b0e6b3f49fb2d4a04e694e87db0aaf88a67e81c64b099df8", "fetched_at": "2026-08-29T12:35:36.520470+00:00", "kind": "homepage", "missing": false, "url": "https://www.versatile-thermostat.org/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 100, "longevity": 96, "rhythm": 86}, "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": 1345, "days_push": 3, "days_rel": 14, "gap_med": 4, "n_releases_24m": 78}, "score": 94, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 5, "stale_scrape": false}}