Skip to content

Commit 59e3327

Browse files
authored
Merge pull request #55 from txau/feat/sumry-ges-7530-identity
feat: bind Anenji GES48120 to Sumry/GES 0x7530 via identity anchors
2 parents 0c1cd9d + 5f85a01 commit 59e3327

10 files changed

Lines changed: 327 additions & 133 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ the GitHub release body should be rendered from the matching version section her
99

1010
### Added
1111

12-
- Recorded Anenji GES48120M250-500P / Sumry-style register evidence and an
13-
offline-tested read-only subset (#49). This is a research catalog entry,
14-
not automatic device support: model/class identification still needs a
15-
confirmed response. No additional live probes or controls are enabled.
12+
- Anenji GES48120M250-500P auto-binds through exact Sumry/GES identity anchors
13+
(model 45, product class 10, protocol raw 220) and exposes the existing
14+
nine-field read-only 0x7530 subset (#49, #55). Broader telemetry, derived
15+
power totals and controls remain out of scope.
1616

1717
- Victor NM-PRO-6.2KW in the supported model catalog, backed by the owner's
1818
PI30 archive and specifically reported working controls. It reuses the

‎catalog/inverter_models/models/anenji_ges48120m250_500p.json‎

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,40 @@
44
"manufacturer": "Anenji",
55
"model": "GES48120M250-500P",
66
"aliases": ["Anenji white 12kW split-phase"],
7-
"lifecycle": "research",
7+
"lifecycle": "experimental",
88
"variants": [
99
{
10-
"variant_key": "sumry_ges_7530_unqualified_identity",
11-
"label": "0x7530 telemetry observed; automatic identity not qualified",
12-
"device_descriptor_keys": [],
13-
"known_firmware": []
10+
"variant_key": "sumry_ges_7530",
11+
"label": "Sumry/GES 0x7530 map, model 45 / class 10 / protocol 220",
12+
"device_descriptor_keys": ["anenji_ges48120m250_500p"],
13+
"known_firmware": ["protocol raw 220 (0x00DC at 0xC768)"]
1414
}
1515
],
16-
"validation": {"hardware": "captured", "telemetry": "partial", "controls": "none"},
16+
"validation": {
17+
"hardware": "captured",
18+
"telemetry": "partial",
19+
"controls": "none"
20+
},
1721
"coverage": {
1822
"runtime_control_surface": "none",
1923
"smartess_control_surface": "unknown",
2024
"vendor_register_map": "partial",
2125
"notes": [
22-
"CRC-valid owner FC03 replies corroborate battery and phase-A output/mains voltage, current and frequency locations in the community-hosted V2.6.3 PDF.",
23-
"A small read-only schema is retained for offline replay only; no runtime descriptor, detection action or model-selection bypass enables it.",
24-
"The owner's fork reports screen agreement, but voltage/SOC plausibility is not family identity. Model/class registers 0xC738/0xC739 have not been captured."
26+
"Runtime binding requires three exact FC03 identity anchors on holding registers 0xC738-0xC739 and 0xC768: model code 45, product class 10, protocol version raw 220.",
27+
"The bound read-only surface exposes nine phase-A and battery measurements from 0x7530, 0x7548 and 0x756A only; no derived power totals or write profile.",
28+
"CRC-valid owner captures corroborate battery and phase-A output/mains voltage, current and frequency in the community-hosted V2.6.3 PDF."
2529
]
2630
},
2731
"known_limitations": [
28-
"Automatic detection remains unsupported pending a qualified model/class fingerprint; the PDF gives no GES-specific model-code value.",
29-
"Split-phase second-leg, active-power direction, CT and temperature-location semantics are not qualified by the available raw evidence.",
30-
"No derived power totals, inferred watts from AC voltage/current, controls or write profiles are exposed.",
31-
"The protocol PDF is community-hosted, not independently authenticated supplier documentation."
32+
"Split-phase second leg, PV, CT-only grid semantics, temperatures and active-power registers are not part of this read-only subset.",
33+
"Product class 10 is required for this entry; other PDF enum values must not select this descriptor.",
34+
"The protocol PDF is community-hosted, not independently authenticated supplier documentation.",
35+
"No controls or write profiles are exposed."
3236
],
33-
"knowledge_summary": "Issue #49 establishes an Anenji GES48120M250-500P answering the Sumry/GES-style 0x7530 holding-register map, not the low-address SMG map. Battery and phase-A telemetry have a source-backed offline decoder. The public fork is useful corroboration, not a safe automatic binding: immutable model/class values and split-phase semantics remain unresolved. This research record does not claim runtime support.",
37+
"knowledge_summary": "Anenji GES48120M250-500P answers the Sumry/GES-style high-address holding map at 0x7530, not the low-address SMG map. Owner FC03 captures establish model 45, product class 10 and protocol 220 together with corroborated battery and phase-A telemetry. The integration exposes a small read-only runtime surface gated on all three identity anchors.",
3438
"source_keys": [
3539
"issue_49_ges_7530_read_evidence",
36-
"community_ges_modbus_v263",
37-
"issue_49_txau_fork_a4125af"
40+
"issue_49_ges_identity_capture",
41+
"community_ges_modbus_v263"
3842
]
3943
}

‎catalog/inverter_models/sources/issue_49_ges_7530_read_evidence.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
"reference": "project-issue:49; project-comment:5881202245; project-comment:5881411950",
77
"captured_at": "2026-10-02",
88
"visibility": "public",
9-
"summary": "Owner identifies the white 12kW split-phase unit as GES48120M250-500P. Raw slave-1 FC03 replies at 0x7530, 0x7548 and 0x756A pass CRC and length checks. Battery voltage 51.5 V, SOC 65%, phase-A output 122.9 V and mains 122.7 V agree with the community protocol. No 0xC738/0xC739 model/class response is supplied; successful telemetry alone does not qualify automatic binding.",
9+
"summary": "Owner identifies the white 12kW split-phase unit as GES48120M250-500P. Raw slave-1 FC03 replies at 0x7530, 0x7548 and 0x756A pass CRC and length checks. Battery voltage 51.5 V, SOC 65%, phase-A output 122.9 V and mains 122.7 V agree with the community protocol. Identity registers 0xC738/0xC739 and 0xC768 are captured separately in issue_49_ges_identity_capture.",
1010
"assertions": ["commercial_identity", "register_map", "telemetry_validation"]
1111
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"schema_version": 1,
3+
"source_key": "issue_49_ges_identity_capture",
4+
"kind": "github_comment",
5+
"title": "Issue #49 GES48120M250-500P FC03 identity registers",
6+
"reference": "project-issue:49; project-comment:5953299167",
7+
"captured_at": "2026-10-02",
8+
"visibility": "public",
9+
"summary": "Owner slave-1 FC03 reads at 0xC738 (2 words) and 0xC768 (1 word) pass CRC checks. Model code 45 (0x002D), product class 10 (0x000A), protocol version raw 220 (0x00DC). Together with the existing 0x7530 telemetry captures these anchors qualify automatic read-only binding for this unit.",
10+
"assertions": ["register_map", "fingerprint", "telemetry_validation"]
11+
}

‎custom_components/eybond_local/protocol_catalogs/inverter_catalog.json‎

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,46 @@
930930
{"key": "identity.hopewind_switch", "source_key": "hopewind_switch", "register": 40546},
931931
{"key": "identity.hopewind_state", "source_key": "hopewind_state", "register": 40547}
932932
]
933+
},
934+
{
935+
"key": "modbus_catalog.sumry_ges_identity_model_class",
936+
"kind": "modbus_read",
937+
"register": 51000,
938+
"count": 2,
939+
"function": 3,
940+
"cost": 1,
941+
"optional": true,
942+
"evidence_fields": [
943+
{
944+
"key": "identity.sumry_ges_model_code",
945+
"source_key": "sumry_ges_model_code",
946+
"register": 51000,
947+
"words": 1
948+
},
949+
{
950+
"key": "identity.sumry_ges_product_class",
951+
"source_key": "sumry_ges_product_class",
952+
"register": 51001,
953+
"words": 1
954+
}
955+
]
956+
},
957+
{
958+
"key": "modbus_catalog.sumry_ges_identity_protocol",
959+
"kind": "modbus_read",
960+
"register": 51048,
961+
"count": 1,
962+
"function": 3,
963+
"cost": 1,
964+
"optional": true,
965+
"evidence_fields": [
966+
{
967+
"key": "identity.sumry_ges_protocol_version",
968+
"source_key": "sumry_ges_protocol_version",
969+
"register": 51048,
970+
"words": 1
971+
}
972+
]
933973
}
934974
],
935975
"layouts": [],
@@ -1206,6 +1246,33 @@
12061246
"Support capture uses protocol_catalogs/command_schemas/eybond_g_ascii/base.json as the schema-driven read-only command probe plan. Captured unknown fields are maintainer evidence only until the schema/driver decoder is explicitly updated."
12071247
]
12081248
},
1249+
"sumry_ges_7530": {
1250+
"ranges": [
1251+
[
1252+
30000,
1253+
3
1254+
],
1255+
[
1256+
30024,
1257+
3
1258+
],
1259+
[
1260+
30058,
1261+
3
1262+
],
1263+
[
1264+
51000,
1265+
2
1266+
],
1267+
[
1268+
51048,
1269+
1
1270+
]
1271+
],
1272+
"notes": [
1273+
"Anenji GES48120M250-500P Sumry/GES map: read-only FC03 telemetry at 0x7530/0x7548/0x756A plus identity holding registers 0xC738-0xC739 (model/class) and 0xC768 (protocol version raw 220). Modbus RTU 9600 8N1, slave 1."
1274+
]
1275+
},
12091276
"aohai_fsa": {
12101277
"ranges": [
12111278
[
@@ -1813,6 +1880,17 @@
18131880
"default_for_driver": true,
18141881
"support_capture_policy": "aohai_fsa"
18151882
},
1883+
{
1884+
"key": "sumry_ges_7530_read_only",
1885+
"protocol_key": "modbus_catalog",
1886+
"driver_key": "modbus_catalog",
1887+
"variant_key": "sumry_ges_7530",
1888+
"profile_name": "",
1889+
"register_schema_name": "sumry_ges_7530/base.json",
1890+
"tier": "partial",
1891+
"read_only": true,
1892+
"support_capture_policy": "sumry_ges_7530"
1893+
},
18161894
{
18171895
"key": "growatt_spf_untested",
18181896
"protocol_key": "modbus_catalog",
@@ -3123,6 +3201,39 @@
31233201
"confidence": "documented-read-only"
31243202
}
31253203
},
3204+
{
3205+
"entry_key": "anenji_ges48120m250_500p",
3206+
"surface_key": "sumry_ges_7530_read_only",
3207+
"model_name": "Anenji GES48120M250-500P (Sumry/GES 0x7530)",
3208+
"aliases": [
3209+
"Anenji white 12kW split-phase"
3210+
],
3211+
"priority": 115,
3212+
"anchors": [
3213+
{
3214+
"key": "identity.sumry_ges_model_code",
3215+
"equals": 45,
3216+
"cost": 1
3217+
},
3218+
{
3219+
"key": "identity.sumry_ges_product_class",
3220+
"equals": 10,
3221+
"cost": 1
3222+
},
3223+
{
3224+
"key": "identity.sumry_ges_protocol_version",
3225+
"equals": 220,
3226+
"cost": 1
3227+
}
3228+
],
3229+
"provenance": {
3230+
"sources": [
3231+
"GitHub issue #49 owner capture: FC03 0xC738/0xC739 model 45 product class 10, 0xC768 protocol 220, and CRC-valid 0x7530 telemetry",
3232+
"community Sumry/GES inverter Modbus protocol V2.6.3 (quky PDF)"
3233+
],
3234+
"confidence": "capture-confirmed-read-only"
3235+
}
3236+
},
31263237
{
31273238
"entry_key": "hopewind_0237_family",
31283239
"surface_key": "hopewind_0237_untested_controls",

‎custom_components/eybond_local/protocol_catalogs/register_schemas/sumry_ges_7530/base.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schema_key": "sumry_ges_7530_evidence_subset",
3-
"title": "Sumry/GES 0x7530 evidence subset (not enabled for detection)",
3+
"title": "Sumry/GES 0x7530 read-only telemetry subset",
44
"driver_key": "modbus_catalog",
55
"protocol_family": "sumry_ges_7530",
66
"blocks": [

‎docs/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ If you are extending or maintaining the project, use [../CONTRIBUTING.md](../CON
3939
## Architecture and design references
4040

4141
- [SMG Protocol Maps](architecture/SMG_PROTOCOL_MAPS.md) — evidence, independent protocol branches, generic controls, and model-specific overrides.
42-
- [Sumry/GES 0x7530 Qualification](architecture/SUMRY_GES_7530.md) — offline read-only evidence subset, blocked automatic identity, and the specific missing diagnostic reads.
42+
- [Sumry/GES 0x7530 Qualification](architecture/SUMRY_GES_7530.md) — exact-match read-only binding for Anenji GES48120, nine-field subset, and remaining telemetry/control limits.
4343
- [Collector Connection Architecture](architecture/CONNECTION_ARCHITECTURE.md) — maintainer reference for the connection axes, session/PN ownership, `callback_on_demand`, endpoint ownership rules, and what must not be reintroduced.
4444
- [Cloud Learning Architecture](architecture/CLOUD_LEARNING_ARCHITECTURE.md) — provider-neutral learning methods, typed API sources, trust boundaries, and read-only metadata evidence.
4545
- [Typed Telemetry Migration](architecture/TYPED_TELEMETRY.md) — staged replacement of the broad runtime value mapping with a strict measurement contract.

0 commit comments

Comments
 (0)