Skip to content

Commit 181386f

Browse files
committed
docs: document opt-in short-ASCII aux MPPT admission
1 parent e2a7290 commit 181386f

8 files changed

Lines changed: 72 additions & 42 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@ the GitHub release body should be rendered from the matching version section her
1010
### Added
1111

1212
- Added an offline MPPT-frame inspector for maintainers, with strict runtime
13-
decoding and explicit warnings about overlapping wire formats. This does not
14-
enable live PV polling or create additional Home Assistant entities.
13+
decoding and explicit warnings about overlapping wire formats. That tool does
14+
not poll devices or create Home Assistant entities; live optional PV is a
15+
separate admission path below.
1516

1617
- Added a generic read-only **EyeBond Short-ASCII family** profile for the
1718
captured MP/Q1/MD dialect seen on some Anern and Maxinn devices (#45).
1819
It provides grid/output voltage, load percentage, output frequency,
1920
temperature and status diagnostics. Battery Reference Voltage is shown
2021
separately from full-pack voltage. Identity is family-only: no retail model
21-
(including no Anern SPI-12000W claim), serial number, live PV power or
22-
inverter controls are inferred. Offline MPPT decode remains maintainer-only.
22+
(including no Anern SPI-12000W claim), serial number or inverter controls are
23+
inferred.
2324

2425
- Short-ASCII also publishes labelled **Estimated AC Load Power**
2526
(`estimated_ac_load_power` = load% × rated VA from F). It is an estimate, not
@@ -39,11 +40,25 @@ the GitHub release body should be rendered from the matching version section her
3940
I/P bounds; RH `0`, unread, expired or failed RH omits those keys. RH=1 is the
4041
discriminator (no retail-model gate). One live family member has SmartValue
4142
correlation for that path; other members (e.g. Maxinn) are not separately
42-
live-proven. Live PV remains absent; this is not full device or control
43-
support (#45).
43+
live-proven. This is not full device or control support (#45).
44+
45+
- Optional short-ASCII **live PV/MPPT** uses the shared framed
46+
`async_send_auxiliary_read` facade for the documented 21-byte `0200` runtime
47+
query only (settings `0202` is not live telemetry; no tip AABB harvest or
48+
EyeBond TID `0xAABB` as aux). Values follow the same OptionalSample pattern as
49+
RB (30 s solicit / 60 s TTL), at most one optional read per successful Q1
50+
cycle. Nine matching schema sensors (`pv_*`, `mppt_*`, `dc_load_current`) stay
51+
**disabled by default**; `mppt_error_code` is diagnostic and quiet. Offline
52+
`decode_short_ascii_mppt` remains a maintainer capture tool, not this live path.
53+
Site live-qualification / Support Archive RECEIPT for the family cutover is
54+
still pending (#45).
4455

4556
### Fixed
4657

58+
- When both are due in one Q1 cycle, short-ASCII optional reads prefer FC4
59+
RB/F/RH over the aux MPPT solicit so a virgin MPPT due time cannot starve BMS
60+
or rated refreshes (#45).
61+
4762
- Support archives preserve numeric-looking hex sequences in explicitly typed
4863
wire-evidence fields instead of replacing their bytes with identifier masks.
4964
Embedded ASCII identifiers remain masked. Short-ASCII archive creation and

‎README.md‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,10 @@ If your inverter is not listed, it may still work. Add it, create a Support Arch
105105

106106
The unreleased test code also includes a limited **EyeBond Short-ASCII family**
107107
profile for a protocol observed on some Anern and Maxinn units. It includes
108-
basic telemetry, a labelled AC-load estimate, and optional BMS/rated readings
109-
where the device answers them. Live PV and inverter controls are absent. This
110-
identifies the protocol family, not a retail commercial model. See its
108+
basic telemetry, a labelled AC-load estimate, optional BMS/rated readings, and
109+
opt-in PV/MPPT entities (disabled by default) where the device answers them.
110+
Inverter controls are absent. This identifies the protocol family, not a retail
111+
commercial model. See its
111112
[available readings and limits](docs/user/RUNTIME_AND_INVERTER.md#eyebond-short-ascii-family).
112113

113114
### No factory collector?

‎README.uk.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ PI30 та SRNE. Рівень підтримки залежить від моде
109109
Тестовий код, який ще не увійшов до релізу, також містить обмежений профіль
110110
**EyeBond Short-ASCII family** для протоколу деяких Anern і Maxinn. Він надає
111111
базові показання, оцінку потужності навантаження та, на пристроях із
112-
відповідними відповідями, дані BMS і номінальні параметри. Жива PV-потужність
113-
і керування відсутні. Це визначення сімейства протоколу, не роздрібної
114-
комерційної моделі. Додаткові сутності вимкнені за замовчуванням. Дивіться
112+
відповідними відповідями, дані BMS і номінальні параметри, а також
113+
опційні сенсори PV/MPPT (вимкнені за замовчуванням). Керування відсутнє. Це
114+
визначення сімейства протоколу, не роздрібної комерційної моделі. Дивіться
115115
[доступні показання й обмеження](docs/user/RUNTIME_AND_INVERTER.md#eyebond-short-ascii-family).
116116

117117
### Немає заводського колектора?

‎catalog/inverter_models/models/eybond_short_ascii_family.json‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,23 @@
2828
"vendor_register_map": "partial",
2929
"notes": [
3030
"Runtime support is family-only and read-only. Compatible devices appear as EyeBond Short-ASCII family; retail model and serial are not inferred.",
31-
"Optional RB/F/RH entities are disabled by default and expire on TTL or invalid replies."
31+
"Optional RB/F/RH and aux-0200 MPPT/PV entities are disabled by default and expire on TTL or invalid replies."
3232
]
3333
},
3434
"known_limitations": [
3535
"Family identity only: no retail commercial model (including no Anern SPI-12000W claim) and no inverter serial from MP/Q1/MD.",
3636
"Read-only: no inverter controls; Full Control does not invent settings.",
37-
"Live PV power is absent; offline MPPT decode is maintainer-only and does not create HA entities.",
38-
"Quiet fault/diagnostic sensors beyond the existing Q1 flags (Q2) are deferred; mppt_error waits on any future live-PV admission.",
37+
"Optional live PV/MPPT uses the documented auxiliary 0200 runtime read only (not tip AABB harvest, not settings 0202). Matching schema sensors stay disabled by default; mppt_error_code is diagnostic and quiet. Samples use 30 s solicit / 60 s TTL; at most one optional read per Q1 cycle, with FC4 RB/F/RH preferred when both are due.",
38+
"Offline decode_short_ascii_mppt is a maintainer capture inspector only; it is not the live optional admission path and does not create entities by itself.",
39+
"Live PV/MPPT admission is code-complete but not yet live-qualified on site HA (family cutover / Support Archive RECEIPT still pending).",
40+
"Quiet fault/diagnostic sensors beyond Q1 flags and the quiet mppt_error_code (Q2 extras) remain deferred.",
3941
"estimated_ac_load_power is load% × rated VA from F — an estimate, not measured active power; load_percent stays separate. Output frequency is not grid frequency.",
4042
"Optional BMS currents and battery_power publish only when RH reports BMS current display accuracy=1 (decimals) and F ratings are available for I/P hard-reject bounds; RH=0, unread, expired or failed RH omits those keys. RH=1 is the discriminator (no retail-model gate).",
4143
"Impossible RB V/SoC/I/P values are hard-rejected. Link-loss (V=0 ∧ SoC=0) may hold last-good BMS for up to 180 s without refreshing sample age; normal RB TTL remains 60 s.",
4244
"Diagnostic counters: bms_link_loss_count and rb_hard_reject_count are runtime-scoped; reading_hold_pending_count stays 0 (physics confirmation-hold deferred).",
4345
"BMS current / battery_power path is SmartValue-correlated on one live family member; other members (e.g. Maxinn) are not separately live-proven and only light up if RH=1."
4446
],
45-
"knowledge_summary": "EyeBond Short-ASCII is a capture-qualified read-only family for the fixed MP/Q1/MD dialect shared by some Anern and Maxinn sites. Optional F/RH/RB add rated values and BMS telemetry with TTL expiry, hard-reject/link-loss hold, and an RH+F gate for currents. Labelled AC-load estimate is separate from measured battery DC power. Live PV and retail-model identity remain out of scope.",
47+
"knowledge_summary": "EyeBond Short-ASCII is a capture-qualified read-only family for the fixed MP/Q1/MD dialect shared by some Anern and Maxinn sites. Optional F/RH/RB add rated values and BMS telemetry with TTL expiry, hard-reject/link-loss hold, and an RH+F gate for currents. Optional live PV/MPPT uses aux 0200 with opt-in entities and TTL; offline MPPT decode stays maintainer-only. Labelled AC-load estimate is separate from measured battery DC power. Retail-model identity remains out of scope; site live-qualification for the PV path is still pending.",
4648
"source_keys": [
4749
"documentation_vendor_19b4_urtu1920_short_ascii",
4850
"support_archive_short_ascii_family_anern_maxinn"

‎docs/generated/INVERTER_MODEL_CATALOG.generated.md‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -263,21 +263,23 @@ Runtime descriptors with no specific commercial model record. These are generic
263263
- Coverage: runtime read_only, cloud not_applicable, vendor map partial
264264
- Coverage notes:
265265
- Runtime support is family-only and read-only. Compatible devices appear as EyeBond Short-ASCII family; retail model and serial are not inferred.
266-
- Optional RB/F/RH entities are disabled by default and expire on TTL or invalid replies.
267-
- Summary: EyeBond Short-ASCII is a capture-qualified read-only family for the fixed MP/Q1/MD dialect shared by some Anern and Maxinn sites. Optional F/RH/RB add rated values and BMS telemetry with TTL expiry, hard-reject/link-loss hold, and an RH+F gate for currents. Labelled AC-load estimate is separate from measured battery DC power. Live PV and retail-model identity remain out of scope.
266+
- Optional RB/F/RH and aux-0200 MPPT/PV entities are disabled by default and expire on TTL or invalid replies.
267+
- Summary: EyeBond Short-ASCII is a capture-qualified read-only family for the fixed MP/Q1/MD dialect shared by some Anern and Maxinn sites. Optional F/RH/RB add rated values and BMS telemetry with TTL expiry, hard-reject/link-loss hold, and an RH+F gate for currents. Optional live PV/MPPT uses aux 0200 with opt-in entities and TTL; offline MPPT decode stays maintainer-only. Labelled AC-load estimate is separate from measured battery DC power. Retail-model identity remains out of scope; site live-qualification for the PV path is still pending.
268268
- Variants:
269269
- `urtu1920_checksum` — EyeBond Short-ASCII read-only family (URTU1920 checksum dialect)
270270
- Descriptors: eybond_short_ascii_family
271271
- Known firmware: —
272272
- `eybond_short_ascii_family` → surface `eybond_short_ascii_read_only` (driver eybond_short_ascii, variant urtu1920_checksum)
273273
- Protocol: eybond_short_ascii | Detection: anchors (protocol.protocol_id=EYBOND_SHORT_ASCII; protocol.wire_dialect=urtu1920_checksum; shape.q1_length=51; shape.mp_length=38; shape.md_length=24)
274274
- Tier: partial | Read-only: yes | Profile: — | Schema: eybond_short_ascii/base.json
275-
- Capabilities: no model-specific profile | Telemetry: 34 measurements, 8 binary sensors
275+
- Capabilities: no model-specific profile | Telemetry: 43 measurements, 8 binary sensors
276276
- Known limitations:
277277
- Family identity only: no retail commercial model (including no Anern SPI-12000W claim) and no inverter serial from MP/Q1/MD.
278278
- Read-only: no inverter controls; Full Control does not invent settings.
279-
- Live PV power is absent; offline MPPT decode is maintainer-only and does not create HA entities.
280-
- Quiet fault/diagnostic sensors beyond the existing Q1 flags (Q2) are deferred; mppt_error waits on any future live-PV admission.
279+
- Optional live PV/MPPT uses the documented auxiliary 0200 runtime read only (not tip AABB harvest, not settings 0202). Matching schema sensors stay disabled by default; mppt_error_code is diagnostic and quiet. Samples use 30 s solicit / 60 s TTL; at most one optional read per Q1 cycle, with FC4 RB/F/RH preferred when both are due.
280+
- Offline decode_short_ascii_mppt is a maintainer capture inspector only; it is not the live optional admission path and does not create entities by itself.
281+
- Live PV/MPPT admission is code-complete but not yet live-qualified on site HA (family cutover / Support Archive RECEIPT still pending).
282+
- Quiet fault/diagnostic sensors beyond Q1 flags and the quiet mppt_error_code (Q2 extras) remain deferred.
281283
- estimated_ac_load_power is load% × rated VA from F — an estimate, not measured active power; load_percent stays separate. Output frequency is not grid frequency.
282284
- Optional BMS currents and battery_power publish only when RH reports BMS current display accuracy=1 (decimals) and F ratings are available for I/P hard-reject bounds; RH=0, unread, expired or failed RH omits those keys. RH=1 is the discriminator (no retail-model gate).
283285
- Impossible RB V/SoC/I/P values are hard-rejected. Link-loss (V=0 ∧ SoC=0) may hold last-good BMS for up to 180 s without refreshing sample age; normal RB TTL remains 60 s.

‎docs/maintainer/ADDING_DRIVERS.md‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ Integrity or boundary failures close the session. In particular, a valid
2626
EyeBond frame with transaction ID `0xAABB` can overlap the auxiliary grammar:
2727
neither a valid checksum nor an absent waiter resolves that ambiguity. The
2828
current foundation refuses such a frame; it does **not** guarantee auxiliary
29-
availability for every possible payload. Catalog `known_limitations` / retail
30-
model claims remain separate work (see documentation pass after admission).
31-
Live-qualify with Support Archive evidence before treating PV as device-proven.
29+
availability for every possible payload. Catalog `known_limitations` record the
30+
opt-in aux-0200 PV path and still forbid retail-model claims. Live-qualify with
31+
Support Archive evidence before treating PV as device-proven.
3232
Normal connections keep their existing grammar until an explicit auxiliary read
3333
is requested.
3434

@@ -116,15 +116,16 @@ RH=1.
116116
`short_ascii_optional` owns per-runtime samples, scoped to the transport and
117117
inverter binding. The hub discards this state on recovery; samples are never
118118
persisted as identity. Each successful Q1 cycle performs at most one optional
119-
request (4-second bound), oldest due group first: RB every 30 seconds with a
120-
60-second TTL, F and RH every 900 seconds with a 900-second TTL, and optional
121-
MPPT (`0200` aux) every 30 seconds with a 60-second TTL. Freshness is
122-
checked after the await. Invalid/timeout replies clear that group immediately,
123-
and FULL-result omission removes it from the hub. A failed or cancelled
124-
mandatory cycle, lost connection, changed binding or clock rollback clears all
125-
samples. Only optional failures alongside a successful Q1 count towards the
126-
shared four-strike command cache; the existing re-check action re-enables
127-
requests.
119+
request (4-second bound): RB every 30 seconds with a 60-second TTL, F and RH
120+
every 900 seconds with a 900-second TTL, and optional MPPT (`0200` aux) every
121+
30 seconds with a 60-second TTL. When both FC4 (RB/F/RH) and MPPT are due,
122+
prefer FC4 (oldest due within that set); MPPT runs only when it is the sole due
123+
sample. Freshness is checked after the await. Invalid/timeout replies clear
124+
that group immediately, and FULL-result omission removes it from the hub. A
125+
failed or cancelled mandatory cycle, lost connection, changed binding or clock
126+
rollback clears all samples. Only optional failures alongside a successful Q1
127+
count towards the shared four-strike command cache; the existing re-check
128+
action re-enables requests.
128129

129130
An RB reply with zero voltage and zero SOC explicitly withdraws **all** BMS
130131
measurements/path flags, including nonzero trailing fields seen in the capture.

‎docs/user/RUNTIME_AND_INVERTER.md‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,23 @@ then expire. That hold does not prove the physical battery is disconnected.
121121
Diagnostic counters can show how often link-loss and hard rejects occurred;
122122
they reset when Home Assistant reloads the entry.
123123

124+
Some devices can also answer an optional auxiliary **PV / MPPT** read
125+
(documented `0200` runtime query). Matching entities such as PV voltage/power
126+
and MPPT diagnostics stay disabled by default — enable them only if you need
127+
them. Those samples refresh on a similar ~30 s cadence with a ~60 s expiry, and
128+
share the one-extra-request-per-poll budget with BMS/rated reads (BMS and rated
129+
queries take priority when both are due). This is not the offline maintainer
130+
MPPT frame inspector, and it is not a retail Anern model claim.
131+
124132
After four failed optional requests while basic telemetry still responds,
125133
that request is skipped. Use **Re-check supported commands** to try it again,
126134
for example after connecting a BMS. Missing optional data does not prevent
127135
basic inverter monitoring.
128136

129-
This profile does not provide live PV power, grid frequency or inverter
130-
controls. Selecting **Full Control** does not add undocumented settings. If
131-
readings are missing or implausible, create a Support Archive for review; it
132-
can include the optional raw replies. Do not select a similar retail model by
133-
guesswork.
137+
This profile does not provide grid frequency or inverter controls. Selecting
138+
**Full Control** does not add undocumented settings. If readings are missing or
139+
implausible, create a Support Archive for review; it can include the optional
140+
raw replies. Do not select a similar retail model by guesswork.
134141

135142
## Control mode
136143

‎docs/user/SUPPORT_ARCHIVE.md‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ Depending on what is available for this entry, one archive can include:
6868
For the **EyeBond Short-ASCII family** in the test code, creating an archive
6969
also requests the basic `MP/Q1/MD` replies and optional `F/RH/RB` replies. It
7070
keeps the returned bytes, including malformed responses, and records failed
71-
requests. It does not enable live PV polling or inverter controls. This is a
72-
new diagnostic snapshot, not a continuous recording: if a reading jumps, also
73-
report when it happened and which sensor was affected. A later archive may no
74-
longer contain the response that caused that jump.
71+
requests. Archive creation does not solicit the optional auxiliary PV/MPPT
72+
(`0200`) read, force-enable opt-in PV entities, or enable inverter controls —
73+
those remain a separate runtime path. This is a new diagnostic snapshot, not a
74+
continuous recording: if a reading jumps, also report when it happened and
75+
which sensor was affected. A later archive may no longer contain the response
76+
that caused that jump.
7577

7678
The archive helps answer questions such as:
7779

0 commit comments

Comments
 (0)