Skip to content

Commit a774cd4

Browse files
txaucursoragent
andcommitted
feat: bind Anenji GES48120 via Sumry/GES identity anchors
Qualify automatic read-only detection with exact model 45 / class 10 / protocol 220 captures and keep the existing 0x7530 evidence subset. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 9984dc4 commit a774cd4

7 files changed

Lines changed: 259 additions & 59 deletions

File tree

‎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; owner-modbus-capture:2026-10-02",
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/generated/INVERTER_MODEL_CATALOG.generated.md‎

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ This page describes what has been confirmed for a specific inverter model or mod
3434
| Anenji | ANJ-11KW-48V-WIFI / WIFI-P — Anenji ANJ-11KW-48V-WIFI (0x8401) | modbus_smg | fingerprint | full | confirmed | partial | captured |
3535
| Anenji | ANJ-4000W-24V | modbus_smg | fingerprint | full | confirmed | partial | captured |
3636
| Anenji | ANJ-6200-48PL | modbus_smg | fingerprint | full | confirmed | partial | captured |
37+
| Anenji | GES48120M250-500P | modbus_catalog | anchors | partial | partial | none | captured |
3738
| Anenji | HHS-11kW-WIFI (without parallel) | modbus_smg | fingerprint | full | partial | partial | captured |
3839
| Aninerel | 6200 (dual output) | modbus_smg | fingerprint | full | confirmed | partial | captured |
3940
| Aninerel | ANL-4200T-24L-W-PRO | modbus_smg | fingerprint | full | partial | partial | captured |
@@ -53,7 +54,6 @@ This page describes what has been confirmed for a specific inverter model or mod
5354

5455
| Manufacturer | Model | Protocol | Detection | Runtime Tier | Telemetry | Controls | Hardware |
5556
|---|---|---|---|---|---|---|---|
56-
| Anenji | GES48120M250-500P | ? | ? | ? | partial | none | captured |
5757
| Yingfa | YF6.2K-2K-LEL-IF | ? | ? | ? | unknown | none | reported |
5858

5959
## Family-Level Runtime Coverage
@@ -189,24 +189,28 @@ Runtime descriptors with no specific commercial model record. These are generic
189189

190190
### Anenji — GES48120M250-500P (`anenji_ges48120m250_500p`)
191191

192-
- Lifecycle: research
192+
- Lifecycle: experimental
193193
- Aliases: Anenji white 12kW split-phase
194194
- Validation: hardware captured, telemetry partial, controls none
195195
- Coverage: runtime none, cloud unknown, vendor map partial
196196
- Coverage notes:
197-
- 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.
198-
- A small read-only schema is retained for offline replay only; no runtime descriptor, detection action or model-selection bypass enables it.
199-
- The owner's fork reports screen agreement, but voltage/SOC plausibility is not family identity. Model/class registers 0xC738/0xC739 have not been captured.
200-
- 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.
197+
- 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.
198+
- 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.
199+
- CRC-valid owner captures corroborate battery and phase-A output/mains voltage, current and frequency in the community-hosted V2.6.3 PDF.
200+
- 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.
201201
- Variants:
202-
- `sumry_ges_7530_unqualified_identity` — 0x7530 telemetry observed; automatic identity not qualified
203-
- Descriptors: Unresolved; no runtime mapping claimed
204-
- Known firmware: —
202+
- `sumry_ges_7530` — Sumry/GES 0x7530 map, model 45 / class 10 / protocol 220
203+
- Descriptors: anenji_ges48120m250_500p
204+
- Known firmware: protocol raw 220 (0x00DC at 0xC768)
205+
- `anenji_ges48120m250_500p` → surface `sumry_ges_7530_read_only` (driver modbus_catalog, variant sumry_ges_7530)
206+
- Protocol: modbus_catalog | Detection: anchors (identity.sumry_ges_model_code=45; identity.sumry_ges_product_class=10; identity.sumry_ges_protocol_version=220)
207+
- Tier: partial | Read-only: yes | Profile: — | Schema: sumry_ges_7530/base.json
208+
- Capabilities: no model-specific profile | Telemetry: 9 measurements, 0 binary sensors
205209
- Known limitations:
206-
- Automatic detection remains unsupported pending a qualified model/class fingerprint; the PDF gives no GES-specific model-code value.
207-
- Split-phase second-leg, active-power direction, CT and temperature-location semantics are not qualified by the available raw evidence.
208-
- No derived power totals, inferred watts from AC voltage/current, controls or write profiles are exposed.
210+
- Split-phase second leg, PV, CT-only grid semantics, temperatures and active-power registers are not part of this read-only subset.
211+
- Product class 10 is required for this entry; other PDF enum values must not select this descriptor.
209212
- The protocol PDF is community-hosted, not independently authenticated supplier documentation.
213+
- No controls or write profiles are exposed.
210214
- Evidence: 3 source(s)
211215

212216
### Anenji — HHS-11kW-WIFI (without parallel) (`anenji_hhs_11kw_wifi_no_parallel`)

0 commit comments

Comments
 (0)