Skip to content

Add Anker MagGo 3-in-1 Wireless Charger (A25x7) support - #41

Merged
flip-dots merged 3 commits into
flip-dots:mainfrom
radzio:add-maggo-3in1-charger
Jul 8, 2026
Merged

Add Anker MagGo 3-in-1 Wireless Charger (A25x7) support#41
flip-dots merged 3 commits into
flip-dots:mainfrom
radzio:add-maggo-3in1-charger

Conversation

@radzio

@radzio radzio commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Adds a device profile for the Anker MagGo 3-in-1 Wireless Charger (model A25x7, serial prefix ASHDKXU) — phone MagSafe pad + Apple Watch puck + earbuds pad.

How it works

It's part of the same 8c85… / 0000ff09 family as the Prime chargers and reuses PrimeDevice's ECDH + AES-GCM negotiation and telemetry framing. Two model-specific details:

  • Subscribe to start telemetry. Like the C1000 Gen 2, this charger streams nothing until it receives a subscribe command — 0x0200 (4200 with the encryption flag), payload a10121. Sent from _post_connect().
  • Telemetry on 4300. The report carries the three wireless pads in TLV params a2/a3/a4, each using the Prime charger per-port shape (04 <status> <volt LE> <current LE> <power LE>).

Exposes per-pad power (W) + status and a computed total.

Testing / confidence

Reverse-engineered from BLE captures (nRF/iOS PacketLogger + on-device probing):

  • ECDH encryption negotiation confirmed live on real hardware (connects + negotiates a shared secret).
  • Per-pad power confirmed against an Apple Watch charging at 2.8 W → a2[6:8] little-endian 0x011d = 285 → 2.85 W.
  • ⚠️ Per-pad voltage/current fields are present at [2:4]/[4:6] but their scaling wasn't confidently confirmed for wireless pads, so only power + status are exposed here (kept conservative, matching the style of the existing charger profiles).

Companion HA integration PR: flip-dots/HaSolixBLE (adds the model to the dropdown + sensors).

https://claude.ai/code/session_014PHXj8zVt63X4FV8YBag7E

Adds a device profile for the Anker MagGo 3-in-1 wireless charger
(model A25x7, serial prefix ASHDKXU). It reuses the Prime charger
ECDH + AES-GCM negotiation and telemetry framing.

- Streams telemetry only after a subscribe command (0x0200 / "4200"),
  like the C1000 Gen 2; sent from _post_connect().
- Telemetry arrives on command 4300; the three wireless pads live in
  TLV params a2/a3/a4 with the Prime charger per-port shape.
- Exposes per-pad power (W) + status and a computed total.

Reverse-engineered from BLE captures. The ECDH encryption negotiation
was confirmed live against real hardware. Per-pad power was confirmed
against an Apple Watch charging at 2.8 W (a2[6:8] LE 0x011d = 285 ->
2.85 W). Per-pad voltage/current fields are present but their scaling
was not confidently confirmed for wireless pads, so only power +
status are exposed.

Claude-Session: https://claude.ai/code/session_014PHXj8zVt63X4FV8YBag7E

@flip-dots flip-dots left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is really good, pretty much the only major thing it needs is some tests. Please let me know if you need any help with those.

Comment thread SolixBLE/devices/maggo_3in1.py Outdated
Comment thread SolixBLE/devices/maggo_3in1.py Outdated
Comment thread SolixBLE/devices/maggo_3in1.py Outdated
Comment thread SolixBLE/devices/maggo_3in1.py Outdated
Comment thread SolixBLE/devices/maggo_3in1.py Outdated
Comment thread SolixBLE/devices/maggo_3in1.py
Comment thread SolixBLE/devices/maggo_3in1.py
Comment thread SolixBLE/devices/maggo_3in1.py
radzio and others added 2 commits July 7, 2026 14:07
- moduleauthor now a real name/email (radzio GitHub noreply)
- Rework class docstring to match other device modules; move protocol
  detail (TLV a2/a3/a4 framing, subscribe/telemetry commands, scaling
  notes) into a collapsible note. Refer to the C1000 Gen 2 as "C1000G2".
- Rename total_power -> power_out (matches the existing HA "Total Power
  Out" sensor). No dedicated total exists in telemetry; it is computed
  as the sum of the three pads.
- Add MagGo3in1 to examples/demo.py.
- Add tests using two real captures: two cases in the parameterised
  telemetry-parsing test, plus two end-to-end telemetry-packet-processing
  cases (bonus). Full suite: 72 passed.

Claude-Session: https://claude.ai/code/session_014PHXj8zVt63X4FV8YBag7E
@flip-dots

Copy link
Copy Markdown
Owner

Looks good now, I forgot to mention that it needs to be added to the docs and supported devices in the README.md so I have sorted that out myself.

In terms of when a new release with this device will be done, I think I will wait a bit to see if #27 can be included in that release first, so probably in a few days.

@flip-dots
flip-dots merged commit 6ab67b5 into flip-dots:main Jul 8, 2026
2 of 3 checks passed
@thomluther

Copy link
Copy Markdown

Hi @radzio
I would be interested to add A25X7 also to the Anker Solix Api library for MQTT data (and finally also to the cloud based HA integration)
To do so, you would need to install the library and use the mqtt_monitor tool to watch and decode MQTT messages as well as commands as sent by the mobile App.

The structures are pretty much identical to the BLE messages, but the message codes may differ.
As such, you first have to identify the status request command (for an individual device status message) and the realtime trigger command, which are typically supported by each device. They may be similar to the A2345 charger on '0200' and '020b'.

You can also use the export system module to provide a randomized export from your account, including MQTT messages. I would need that to debug and develop the implementation. When running such an export, you can play around in the App to trigger messages and power or setting changes, which will then become visible in the replay of the messages.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants