Zhsunyco ESLs

Anyone seen Zhsunyco ESLs on aliexpress?

They look really nice (no visible barcode, nice symmetric housing), are cheaper than GICIsky, have also 3 or 4 color models.

The seller is very helpful, even sent me BLE protocol spec including auth challenge AES key.

Would be perfect if we could use something like that in Home Assistant.

https://www.google.com/search?q=epaper+bluetooth+home+assistant

I don’t understand previous post. Does that mean that their ESLs can be flashed with OpenEPaperLink firmware? Or that there is a HA BT integration for their protocol? Or that Zhsunyco uses some kind of standardized protocol that can be readily integrated into HA?

It is a bunch of search results for people who have done this before with other epaper Bluetooth shelf tags. You can either apply what they learned to your displays or use the hardware that is already working.

I’ve purchased one of these ESLs from AE and I’m experimenting in communication with it using the information you’ve posted above @DonLuigi . Unfortunately, whilst it responds to bluetooth connections, I’m not getting positive responses from it. Perhaps the “custom security lock” needs someone smarter than I to work out how to connect to it.

NotFoundError: No Services matching UUID 33323032-4c53-4545-4c42-4b4e494c4f57 found in Device.

or

NotFoundError: No Services matching UUID 31323032-4c53-4545-4c42-4b4e494c4f57 found in Device.

and on querying services…

NotFoundError: No Services found in device.

Have you tried contacting manufacturer via aliexpress message chat? They seemed pretty responsive and helpful

Got this working in python if it helps.

A little bit of Claude and it works on ESP32 too

Matt, this looks absolutely amazing. Will give it a go this weekend. I glanced over your source code. I imagine it was quite a bit of work?

Just looked through the android app to see what it was doing. Once working I used Claude to generate samples because why wouldn’t you. And Gemini to reword protocol docs because “me not do words good.” :joy:

Did a bit of a deeper dive on another branch “deeper-dive-into-protocol”.

Stopped looking now as I can now do bin collection day eink tags which was my aim.

Great. Just, it seems you have an ESL from different manufacturer, not Zhsunyco. Or maybe Zhsunyco have different lines of products? Mine looks like this, yours looks different. I opened a ticket on github with more info

It took me a while to understand that “Rubbish garden food” was not the menu for today
:rofl:

1 Like

What model number

Thanks a lot! I have a differently sized display apparently because the image appears distorted for me but I’m just happy that it works at all!
Now its just a matter of throwing AI at the issue until its working properly.

Edit: or just fixing the resolution in the parameters apparently. lol. I’m getting lazy.

Now its just a question how complicated it would be to get this integrated into OEPL

I had a look - the OEPL bluetooth lib is a bit … hmmm. In THEORY it should be doable - just needs a little refactor so it can support multiple BLE vendors. I know it works on an ESP32 inc C because I use it for my bin display.

Hi,
I’ve been doing a lot of work on the OEPL BT library recently (in my own fork).
There are a ton of bugs in it, that I’ve been fixing as I go.

I’m looking to get a few of these RWBY tags, and see if I can program them.
Do you have a link to your c code? I’ll have a look through the python as well.

My fork is here GitHub - NickWaterton/OpenEPaperLink: The OpenEPaperLink core project

Subject: ESL-15BWRY (WOESL) BLE Protocol - Reverse Engineering Progress

Hi all, particularly @roxburghm — I’ve been trying to get a Zhsunyco ESL-15BWRY (1.54" 4-colour BWRY tag) working over BLE and have made significant progress reverse engineering the protocol but hit a wall. Hoping someone here can help fill in the gaps.

Device details:

  • Model: ESL-15BWRY
  • BLE name: WL170011F5 (format WLxxxxxxxx)
  • GATT device name characteristic: WOESL
  • MAC: 66:66:17:00:11:F5 (format 66:66:xx:xx:xx:xx)
  • App: WoPda (from github.com/TheUI/WoPda/releases)

Custom GATT service: 30323032-4c53-4545-4c42-4b4e494c4f57

Characteristic Properties Notes
31323032-... READ/WRITE Ctrl register — disconnects on most writes
32323032-... READ/NOTIFY Device info: 30 00 00 0E 03 30 04 01
33323032-... READ/WRITE Data channel — 16-byte random nonce at rest
34323032-... READ/NOTIFY Status register — 06 00 00... when idle
35323032-... READ/NOTIFY Battery voltage

From reverse engineering libapp.so (Flutter/Dart AOT):

  • AES-CBC key: wolinkwolink~123
  • AES-CBC IV: wolinkwolinkiv!@
  • Magic identifier string: wolink
  • Internal function names: wrImgDat, wrDriver, parseChunk, decodeChunk
  • Encryption type enum includes CT_xor — unclear if AES or XOR is actually used

Working transfer pipeline (Python/bleak):

  1. Connect
  2. Subscribe to notifications on 34323032
  3. Write payload size as 4-byte big-endian to 33323032 — accepted
  4. Write payload in 16-byte chunks to 33323032 — accepted up to ~900 bytes
  5. Write 0x01 0x00 0x00 0x00 to 31323032 (no response) — tag disconnects/reboots

What’s not working: The tag accepts all data and reboots on the commit command, but the LED never flashes and the screen never updates. We’ve tried:

  • RLE compressed 2-plane and 3-plane payloads (FC/FC8 format from roxburghm’s protocol docs)
  • Unencrypted and AES-CBC encrypted payloads
  • Multiple colour plane mappings for BWRY
  • Commit command values 0x01 through 0x10

The tag clearly has a ~900 byte payload limit which matches RLE-compressed image data for this resolution. The protocol flow seems correct but either the image format, encryption, or commit command is wrong for the BWRY variant.

Has anyone got a BWRY tag working, or does @roxburghm’s deeper-dive branch cover BWRY? Any pointers on what’s different vs the BWR tags would be massively appreciated.