Skip to content

Add support for the RV13B6ES_D_US_WIFI electric dryer - #134

Open
Danimal4326 wants to merge 1 commit into
anszom:masterfrom
Danimal4326:add-rv13b6es-dryer
Open

Add support for the RV13B6ES_D_US_WIFI electric dryer#134
Danimal4326 wants to merge 1 commit into
anszom:masterfrom
Danimal4326:add-rv13b6es-dryer

Conversation

@Danimal4326

Copy link
Copy Markdown

Adds a driver for the LG RV13B6ES_D_US_WIFI electric dryer (deviceType 202, thinq2).

Why it isn't an alias

The frame layout is identical to RV13B6BSD_D_US_WIFI, so aliasing was the obvious first move — but it would ship a silent bug. Wrinkle Care is rec[15] bit 0x10 on this model, not rec[16] bit 0x10, and rec[16] bit 0x10 is never set here, so an alias would report Wrinkle Care permanently OFF. tests/cloud/devices/RV13B6ES_D_US_WIFI.test.ts has a regression test pinning that specific offset.

Fields the related model doesn't decode

Field Offset Note
Remote Start rec[16] bit 0x01 RV13B6BSD_D_US_WIFI documents this as not findable in device frames, "appears cloud-side only" — it's just at a different bit here
More/Less Time rec[12], signed minutes against the course default
Load items rec[23] matches the cloud's loadItem
Signal (beeper) rec[11] 0x00 Off, 0x01 Low, 0x04 High

How it was confirmed

Live capture with tools/rethink-capture.ts --cloud while driving the physical panel, matching every byte change against the LG cloud's own decoded washerDryer state at the same timestamp. All 14 course values, both time fields, all five dry levels and temperatures, and every option bit were observed directly, including a full Speed Dry run through Drying → Cooling → End.

Signal is the one exception and is commented as such in the source. The cloud sends no signal field for this dryer in a full allDeviceInfoUpdate snapshot, so that byte was mapped from the wire alone and tied to the panel's Off/Low/High indicator by reading the lit LED after each press. Flagging it explicitly since it's a weaker standard than the rest of the file.

Anything unconfirmed is omitted rather than guessed — error codes were never triggered, and the rec[15] 0x40 "panel awake" bit isn't exposed as an entity since it belongs to no single option.

Testing

All fixtures in the test file are real captured frames, each with the confirming cloud field named in a comment above it. Full suite passes (356 tests). The driver has also been running against the physical appliance via MQTT discovery in Home Assistant, reporting 17 entities that track the panel through complete cycles.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EdP8L3BhHJFWX1ZKfQLCcM

Deliberately a separate handler rather than an alias of RV13B6BSD_D_US_WIFI.
The frame layout is identical, but Wrinkle Care is rec[15] bit 0x10 on this
model, not rec[16] bit 0x10 -- and rec[16] bit 0x10 is never set here, so
aliasing would report Wrinkle Care permanently OFF. There is a regression test
pinning that specific offset.

Three fields the related model does not decode are also mapped:

  * Remote Start (rec[16] bit 0x01). RV13B6BSD_D_US_WIFI documents this as not
    findable in any device frame, "appears cloud-side only"; it is simply at a
    different bit here.
  * More/Less Time (rec[12], a signed byte of minutes against the course
    default).
  * Load items (rec[23]).
  * Signal / beeper volume (rec[11]: 0x00 Off, 0x01 Low, 0x04 High).

Every offset except Signal was confirmed by capturing live traffic with
tools/rethink-capture.ts --cloud while driving the physical panel, and matching
each byte change against the LG cloud's own decoded washerDryer state at the
same timestamp. Signal is the exception and is commented as such: the cloud
sends no signal field for this dryer in a full allDeviceInfoUpdate snapshot, so
that byte was mapped from the wire alone and tied to the panel's Off/Low/High
indicator by reading the lit LED after each press.

Fields that could not be confirmed are omitted rather than guessed: error codes
were never triggered, and the rec[15] 0x40 "panel awake" bit is not exposed as
an entity since it belongs to no single option.

All test fixtures are real captured frames, with the confirming cloud field
named in a comment above each one.
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.

1 participant