From 51ac5c539d8bfa7ab0702e41ea4daa810cafff66 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 22 Sep 2026 07:07:32 +0000 Subject: [PATCH] fix(foxess_h3_smart): watch the raw register-map files, not the repo root page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit manifests/foxess_h3_smart.yaml tracked upstream_docs as the nathanmarlor/foxess_modbus repo's root/landing page. The weekly watcher hashes that page's raw bytes, which include star/fork counts and relative commit timestamps that churn on a roughly weekly cadence with no actual register change underneath — six false-positive upstream-doc-changed issues in a row (#87, #101, #104, #109, #119, #125), each closed as not-planned after a manual register-by-register audit found nothing. Point the entry at the two files that are the actual register-map source of truth instead: entity_descriptions.py (telemetry registers) and remote_control_description.py (control/write registers), mirroring how nibe_local/myuplink already track a direct file URL rather than a landing page. upstream_docs is descriptive metadata only per spec/manifest-v2.md ("not copied into index.yaml and never affects how a driver is installed or run") and is not in CONTRIBUTING.md's list of signed-artifact fields (ders, protocol, tested_devices manufacturer/model_family), so no driver version bump applies. make sync-manifests confirms no manifest hash changed. Regenerated upstream-docs-state.json for the two new URLs only, leaving every other driver's watched-document baseline untouched. Closes #129. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_011UEbhFwLUCC8JHbxPJhAyL Signed-off-by: Claude --- CHANGELOG.md | 1 + manifests/foxess_h3_smart.yaml | 8 ++++++-- upstream-docs-state.json | 27 ++++++++++++++++++++------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4063393..a3d4d4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Driver versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html ### Changed +- **`foxess_h3_smart`** — `manifests/foxess_h3_smart.yaml`'s `upstream_docs` now points at the two `nathanmarlor/foxess_modbus` source files that actually carry the register map (`entity_descriptions.py`, `remote_control_description.py`) instead of the repo's root page. The root page's raw bytes include star/fork counts and relative commit timestamps that churn on their own, which had produced six false-positive `upstream-doc-changed` issues in a row with no real register change underneath (#87, #101, #104, #109, #119, #125). Closes #129. `upstream_docs` is descriptive metadata only — not copied into `index.yaml` and never part of the signed artifact — so no driver version bump applies (per `spec/manifest-v2.md`). - **Read-only hybrids / meters declare `read_only = true`:** `sonnen` 2.0.3 (plus no-op `driver_command` / `driver_default_mode`), `goodwe` 2.1.2, `growatt` 2.1.2, `sofar` 2.1.2, `kostal` 2.1.2, `sma` 2.1.2, `victron` 2.1.2, `fronius` 2.1.2, `pixii_pv` 0.3.1, `solis_string` 1.1.2, `tibber` 1.1.2 (also `http_hosts = { "api.tibber.com" }`). ### Added diff --git a/manifests/foxess_h3_smart.yaml b/manifests/foxess_h3_smart.yaml index b3aa4ff..5bb6dd9 100644 --- a/manifests/foxess_h3_smart.yaml +++ b/manifests/foxess_h3_smart.yaml @@ -22,8 +22,12 @@ tested_devices: notes: "Shares the 1K5 register map; not yet tested on H3-Smart hardware." min_driver_version: "0.7.0" upstream_docs: - - url: "https://github.com/nathanmarlor/foxess_modbus" - title: "nathanmarlor/foxess_modbus community register map (Inv.H3_SMART profile)" + - url: "https://raw.githubusercontent.com/nathanmarlor/foxess_modbus/master/custom_components/foxess_modbus/entities/entity_descriptions.py" + title: "nathanmarlor/foxess_modbus telemetry register descriptions (entity_descriptions.py, Inv.H3_SMART profile)" + kind: register_map + url_stability: stable + - url: "https://raw.githubusercontent.com/nathanmarlor/foxess_modbus/master/custom_components/foxess_modbus/entities/remote_control_description.py" + title: "nathanmarlor/foxess_modbus remote-control register descriptions (remote_control_description.py, Inv.H3_SMART profile)" kind: register_map url_stability: stable min_host_version: "1.5.0" diff --git a/upstream-docs-state.json b/upstream-docs-state.json index 4dd3b82..452cd45 100644 --- a/upstream-docs-state.json +++ b/upstream-docs-state.json @@ -53,16 +53,29 @@ "consecutive_failures": 0, "last_error": null }, - "foxess_h3_smart::https://github.com/nathanmarlor/foxess_modbus": { + "foxess_h3_smart::https://raw.githubusercontent.com/nathanmarlor/foxess_modbus/master/custom_components/foxess_modbus/entities/entity_descriptions.py": { "driver": "foxess_h3_smart", - "url": "https://github.com/nathanmarlor/foxess_modbus", - "title": "nathanmarlor/foxess_modbus community register map (Inv.H3_SMART profile)", + "url": "https://raw.githubusercontent.com/nathanmarlor/foxess_modbus/master/custom_components/foxess_modbus/entities/entity_descriptions.py", + "title": "nathanmarlor/foxess_modbus telemetry register descriptions (entity_descriptions.py, Inv.H3_SMART profile)", "kind": "register_map", "url_stability": "stable", - "sha256": "e46d8584276d297c1a52a1314eb77f6a2925b45db3e5f4623f3b435057fa6d62", - "content_length": 308269, - "first_seen": "2026-08-10T06:44:29+00:00", - "last_changed": "2026-09-21T06:50:03+00:00", + "sha256": "641d8e71daf1b0cfba119fef8e0e4cf76ad6d46b23a2208bc6c803651e2f0e34", + "content_length": 110468, + "first_seen": "2026-09-22T07:06:24+00:00", + "last_changed": "2026-09-22T07:06:24+00:00", + "consecutive_failures": 0, + "last_error": null + }, + "foxess_h3_smart::https://raw.githubusercontent.com/nathanmarlor/foxess_modbus/master/custom_components/foxess_modbus/entities/remote_control_description.py": { + "driver": "foxess_h3_smart", + "url": "https://raw.githubusercontent.com/nathanmarlor/foxess_modbus/master/custom_components/foxess_modbus/entities/remote_control_description.py", + "title": "nathanmarlor/foxess_modbus remote-control register descriptions (remote_control_description.py, Inv.H3_SMART profile)", + "kind": "register_map", + "url_stability": "stable", + "sha256": "cc7146bc32ee8be725b67ef2f9532566f75d6beb425349e96040a355a8cc64c2", + "content_length": 5160, + "first_seen": "2026-09-22T07:06:24+00:00", + "last_changed": "2026-09-22T07:06:24+00:00", "consecutive_failures": 0, "last_error": null },