{"adoption": {"forks": 171, "observed_at": "2026-08-28T04:04:49.269462+00:00", "stars": 1471}, "canonical_url": "https://ross.abutalabs.com/products/better_thermostat", "card": {"archived": false, "artifact_type": "plugin", "description": "This custom component for Home Assistant will add crucial features to your climate-controlling TRV (Thermostatic Radiator Valves) to save you the work of creating automations to make it smart. It combines a room-temperature sensor, window/door sensors, weather forecasts, or an ambient temperature probe to decide when it should call for heat and automatically calibrate your TRVs to fix the imprecise measurements taken in the radiator's vicinity.", "domain": ["iot"], "enriched": true, "function": ["workflow-automation", "scheduling", "monitoring", "configuration-management"], "health_score": 100, "homepage": "https://better-thermostat.org", "language": "Python", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["KartoffelToby/better_thermostat"], "name": "KartoffelToby/better_thermostat", "platform": ["iot", "python", "self-hosted"], "pushed_at": "2026-08-25T14:32:49+00:00", "repo": "KartoffelToby/better_thermostat", "stars": 1471, "tags": ["thermostat", "trv", "climate-control", "heating", "smart-home", "home-assistant-integration", "energy-saving", "hvac", "zigbee", "tuya", "home-automation", "energy-efficiency", "hacs", "zigbee2mqtt"], "topics": ["sensor", "climate", "home-assistant", "thermostat", "hacs", "zigbee2mqtt", "zigbee", "smarthome", "spzb0001", "ts0601", "tuya", "moes", "sea801", "sea802", "energy-efficiency", "home-automation", "homeassistant", "hacktoberfest"], "urls": [], "use_cases": ["make my dumb radiator thermostat smart using a real room temperature sensor", "automatically turn off heating when a window is open", "calibrate TRV temperature readings that are inaccurate because the sensor is next to the radiator", "save energy by pausing heating based on weather forecast or outdoor temperature", "control multiple radiator valves in one room as a single thermostat", "prevent TRV valves from getting stuck over the summer with automatic maintenance", "get better heating control with PID/MPC algorithms instead of simple target matching", "make my TRV compatible with Google Home voice control"], "what_it_is": "Better Thermostat is a custom Home Assistant integration that makes dumb TRV (thermostatic radiator valve) climate entities smart. It combines external room temperature sensors, window/door sensors, weather forecasts, and outside temperature probes to intelligently control heating, automatically calibrate TRV measurements, and reduce energy consumption without requiring users to write their own automations.", "when_to_avoid": ["you don't use Home Assistant, as this is a HA custom component with no standalone mode", "you need a standalone thermostat controller or physical hardware rather than a software integration", "your thermostat is not exposed as a Home Assistant climate entity", "you need a simple plug-and-play solution with no additional sensors, since a separate room temperature sensor is required", "you want a cloud-native commercial smart thermostat service rather than a self-hosted, community-maintained integration"], "when_to_choose": ["you use Home Assistant and have TRVs whose built-in sensors read inaccurately due to proximity to the heat source", "you want window-open detection, weather-based heating pauses, or valve maintenance without writing automations yourself", "you have multiple radiators in one room and want them grouped under a single thermostat entity", "you want advanced control algorithms (MPC, PID, TPI, AI Time Based) for tighter temperature control and energy savings", "your TRVs are connected via Zigbee2MQTT, deCONZ, or Tado with local calibration support"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/better_thermostat", "repo": "KartoffelToby/better_thermostat", "role": "main", "score": 99}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "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:04:49.269462+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:49.269462+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:34:44.518283+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0db12e6fc9c4eb067652fb86066522ba57511169e013f5f0b3da3ddf6ffab6d5", "fetched_at": "2026-08-28T04:04:49.269462+00:00", "kind": "readme", "missing": false, "url": "https://github.com/KartoffelToby/better_thermostat"}, {"content_hash": "c6d5b151ae16d6d14edefd3522bc2d266a5572e3559dbd5f4338c1fac6f708fb", "fetched_at": "2026-08-29T11:42:29.405403+00:00", "kind": "homepage", "missing": false, "url": "https://better-thermostat.org"}, {"content_hash": "ad939360546922fafd5d9e6e80636456380221270c1fd2741ba987ad5e1535d0", "fetched_at": "2026-08-29T11:42:29.414675+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/setup/getting-started"}, {"content_hash": "4370be681b7fb76df2d0f25be6cc59c9dd0ca987c1d25d3c2ff8e317cb01e2d5", "fetched_at": "2026-08-29T11:42:29.416590+00:00", "kind": "site_page", "missing": false, "url": "https://better-thermostat.org/faq/common-questions"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 99}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1768, "days_push": 8, "days_rel": 8, "gap_med": 8, "n_releases_24m": 8}, "score": 99, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}