{"adoption": {"forks": 618, "observed_at": "2026-08-28T04:06:22.173530+00:00", "stars": 2176}, "canonical_url": "https://ross.abutalabs.com/products/opendtu", "card": {"archived": false, "artifact_type": "application", "description": "Software for ESP32 to talk to Hoymiles/TSUN/Solenso Inverters", "domain": ["iot", "energy", "self-hosted", "hardware"], "enriched": true, "function": ["iot", "monitoring", "reverse-engineering", "http-server"], "health_score": 98, "homepage": null, "language": "C++", "license": "GPL-2.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["tbnobody/OpenDTU"], "name": "tbnobody/OpenDTU", "platform": ["iot", "embedded", "self-hosted"], "pushed_at": "2026-08-24T20:41:20+00:00", "repo": "tbnobody/OpenDTU", "stars": 2176, "tags": ["solar", "hoymiles", "mqtt", "dtu", "balkonkraftwerk", "inverter", "platformio", "prometheus"], "topics": ["esp32", "platformio", "balkonkraftwerk", "mqtt", "solar", "hoymiles", "tsun", "solenso"], "urls": [], "use_cases": ["monitor my Hoymiles solar inverter without the cloud", "replace the Hoymiles DTU telemetry gateway with open source firmware", "integrate my balcony solar setup with Home Assistant via MQTT", "read live solar production data locally from TSUN inverter", "limit the power output of my micro-inverter", "export solar inverter metrics to Prometheus"], "what_it_is": "OpenDTU is ESP32 firmware that replaces the proprietary Hoymiles DTU cloud gateway for solar micro-inverters, communicating directly over the Hoymiles/TSUN/Solenso radio protocol. It exposes a web interface plus MQTT and Prometheus endpoints for monitoring and controlling the inverter locally.", "when_to_avoid": ["your inverter brand is not Hoymiles/TSUN/Solenso compatible", "you need a ready-made commercial product rather than firmware you flash yourself", "you rely on the vendor cloud portal features"], "when_to_choose": ["you have a Hoymiles, TSUN, or Solenso micro-inverter and want local, cloud-free monitoring and control", "you want MQTT or Prometheus integration for home automation dashboards", "you want to set inverter power limits from your own network"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/opendtu", "repo": "tbnobody/OpenDTU", "role": "main", "score": 92}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "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:06:22.173530+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:22.173530+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:48:53.462307+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "06ef886b082c009be793b00969fb403c09b2bb6d08205e9516f5a77dfd972c7f", "fetched_at": "2026-08-28T04:06:22.173530+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tbnobody/OpenDTU"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 77}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1531, "days_push": 9, "days_rel": 156, "gap_med": 2.5, "n_releases_24m": 21}, "score": 92, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}