Skip to content

Can't connect to BespokeAI Washer/Dryer #20

Description

@maxromanovsky

Thank you very much for the library that should save many of us lots of money on subscription costs for the devices we've already purchased.

Unfortunately, atm it doesn't work for me for BespokeAI Washer/Dryer.

Model numbers:

  • Washer: WW11BB534DAWS6
  • Dryer: DV90BB5245AWS6

Are there any troubleshooting tips you can share?

I've tried

  • power cycling both appliances
  • force closing SmartThings mobile app
  • pressing the smart control button on the appliances (all stuff below was tested with smart control on and off couple of times)
  • connecting to them via HACS localthings
  • running test script (if smart control was on, the icon on the appliance was blinking when the script was running)
  • running coap_sec_probe.py from Newer Samsung firmware uses standard OCF ports (5683/5684) + non-AC14K_M trust anchor #16 (if smart control was on, the icon on the appliance was blinking when the script was running)

I'm connected to the same VLAN/subnet as Home Assistant & Samsung appliances. There are no firewall rules, and mobile app works.

Appliances work fine with the mobile app.

Everything below is for my washer.

$ wget https://raw.githubusercontent.com/QuiteYellow/SmartThings-Local/refs/heads/main/setup_cert.py
--2026-08-01 16:58:50--  https://raw.githubusercontent.com/QuiteYellow/SmartThings-Local/refs/heads/main/setup_cert.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20512 (20K) [text/plain]
Saving to: ‘setup_cert.py’

setup_cert.py                                        100%[===================================================================================================================>]  20.03K  --.-KB/s    in 0.004s

2026-08-01 16:58:50 (5.13 MB/s) - ‘setup_cert.py’ saved [20512/20512]

$ python setup_cert.py
============================================================
Phase 1: AC14K_M signing materials
============================================================
  Fetching AC14K_M bundle...
  AC14K_M cert: certs/.bundle/ac14k_m.pem
  AC14K_M key:  certs/.bundle/ac14k_m.key
  chain:        4 certs (cert_1.pem, cert_2.pem, cert_3.pem, cert_4.pem)
  cert/key modulus pair OK

============================================================
Phase 2: identify peer UUID
============================================================
  Fetching from connect-v2.samsungiotcloud.com:443...
  Extracted UUID: ab0b0ac4-aae9-4958-a04d-8ec36fe1b2f9
  Saved server leaf cert to certs/samsung_cloud_leaf.pem

============================================================
Phase 3: mint client cert with UUID ab0b0ac4-aae9-4958-a04d-8ec36fe1b2f9
============================================================
  key:       certs/client.key
  leaf:      certs/client.pem
  fullchain: certs/client_fullchain.pem
  Subject: OU=uuid:ab0b0ac4-aae9-4958-a04d-8ec36fe1b2f9, CN=urn:uuid:ab0b0ac4-aae9-4958-a04d-8ec36fe1b2f9, O=Samsung Electronics, C=KR

============================================================
Done. Output dir: /Users/max/Downloads/certs
============================================================

$ python -m venv venv

$ source venv/bin/activate

$ pip install smartthings-local

$ sudo nmap -Pn -sU -p 49152-49160 "192.168.4.27"
Starting Nmap 7.99 ( https://nmap.org ) at 2026-08-01 16:09 +0200
Nmap scan report for Samsung-Washer.iot (192.168.4.27)
Host is up (0.51s latency).

PORT      STATE         SERVICE
49152/udp closed        unknown
49153/udp open|filtered unknown
49154/udp open          unknown
49155/udp closed        unknown
49156/udp closed        unknown
49157/udp closed        unknown
49158/udp closed        unknown
49159/udp closed        unknown
49160/udp closed        unknown
MAC Address: [REDACTED] (SJI Industry Company)

Nmap done: 1 IP address (1 host up) scanned in 5.58 seconds

$ python coap_sec_probe.py 192.168.4.27
=== Plain CoAP security probe of <target-ip>:5683 (no DTLS, no cert) ===

-> /oic/res (resource + sec-flag enumeration)  (plain CoAP GET /oic/res to <target-ip>:5683)
   <- mid=0x4001 tok=01 type=ACK code=2.05 1024B [MATCH]
      strings: ['bdix$<uuid-redacted>elinks', 'dhrefm/oic/sec/doxmbrt', 'joic.r.doxmbif', 'ooic.if.baselineap', 'csec', 'dport', 'rx.org.iotivity.tls', 'dhrefn/oic/sec/pstatbrt', 'koic.r.pstatbif', 'ooic.if.baselineap', 'csec', 'dport', 'rx.org.iotivity.tls', 'dhreff/oic/dbrt', 'hoic.wk.dloic.d.washerbif', 'ooic.if.baselinehoic.if.rap', 'csec', 'rx.org.iotivity.tcp', 'dhreff/oic/pbrt', 'hoic.wk.pbif', 'ooic.if.baselinehoic.if.rap', 'csec', 'rx.org.iotivity.tcp', 'dhrefq/multidevice/vs/0brt', 'x.com.samsung.da.multidevicebif', 'ooic.if.baselinehoic.if.aap', 'csec', 'rx.org.iotivity.tcp', 'dhrefs/file/transfer/vs/0brt', 'x.com.samsung.file.transferbif', 'ooic.if.baselinehoic.if.aap', 'csec', 'rx.org.iotivity.tcp', 'dhrefo/file/list/vs/0brt', 'wx.com.samsung.file.listbif', 'ooic.if.baselinehoic.if.sap', 'csec', 'rx.org.iotivity.tcp', 'dhrefp/hass/state/vs/0brt', 'x.com.samsung.da.hass.statebif', 'ooic.if.baselinehoic.if.aap', 'csec', 'rx.org.iotivity.tcp', 'dhrefr/hass/command/vs/0brt', 'x.com.samsung.da.hass.commandbif', 'ooic.if.baselinehoic.if.aap', 'csec', 'rx.org.iotivity.tcp']

-> /oic/sec/doxm (owner + UUID; often world-readable)  (plain CoAP GET /oic/sec/doxm to <target-ip>:5683)
   <- mid=0x4002 tok=02 type=ACK code=2.05 215B [MATCH]
      {'oxms': [65282], 'oxmsel': 0, 'sct': 8, 'owned': False, 'deviceuuid': '<uuid-redacted>', 'devowneruuid': '<uuid-redacted>', 'rowneruuid': '<uuid-redacted>', 'rt': ['oic.r.doxm'], 'if': ['oic.if.baseline']}

-> /oic/sec/pstat (provisioning/onboarding state)  (plain CoAP GET /oic/sec/pstat to <target-ip>:5683)
   <- mid=0x4003 tok=03 type=ACK code=2.05 157B [MATCH]
      {'isop': False, 'cm': 2, 'tm': 10, 'om': 4, 'sm': 4, 'deviceuuid': '<uuid-redacted>', 'rowneruuid': '<uuid-redacted>', 'rt': ['oic.r.pstat'], 'if': ['oic.if.baseline']}

$ python test.py
Traceback (most recent call last):
  File "/Users/max/Downloads/test.py", line 9, in <module>
    sess.connect()
    ~~~~~~~~~~~~^^
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/smartthings_local/protocol/dtls_session.py", line 243, in connect
    raise TimeoutError(
        f"DTLS handshake timeout to {self.host}:{self.port}")
TimeoutError: DTLS handshake timeout to 192.168.4.27:49154

$ python test.py
Traceback (most recent call last):
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/smartthings_local/protocol/dtls_session.py", line 220, in connect
    conn.do_handshake()
    ~~~~~~~~~~~~~~~~~^^
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/OpenSSL/SSL.py", line 2487, in do_handshake
    self._raise_ssl_error(self._ssl, result)
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/OpenSSL/SSL.py", line 2090, in _raise_ssl_error
    _openssl_assert(
    ~~~~~~~~~~~~~~~^
        reason == _lib.SSL_R_UNEXPECTED_EOF_WHILE_READING
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/OpenSSL/_util.py", line 73, in openssl_assert
    exception_from_error_queue(error)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/OpenSSL/_util.py", line 59, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', '', 'tls alert handshake failure')]

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/max/Downloads/test.py", line 9, in <module>
    sess.connect()
    ~~~~~~~~~~~~^^
  File "/Users/max/Downloads/venv/lib/python3.14/site-packages/smartthings_local/protocol/dtls_session.py", line 226, in connect
    raise ConnectionError(f"DTLS handshake error: {e}") from e
ConnectionError: DTLS handshake error: [('SSL routines', '', 'tls alert handshake failure')]

The script:

import cbor2
from smartthings_local.protocol.dtls_session import DtlsCoapSession

sess = DtlsCoapSession(
    "192.168.4.27", 49154,
    cert_path="certs/client_fullchain.pem",
    key_path="certs/client.key",
)
sess.connect()
sess.start_reader()

code, body = sess.get(["device", "0"])                       # Block2-aware read
sess.close()

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions