Philips Avent SCD921 Connected Videophone; accessing rtsp-stream; user/password unknown

action: camera.snapshot
data:
  filename: /config/www/babycam_{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg
target:
  entity_id: camera.babycam_camera

When I try this, I'm getting the following error:

Logger: homeassistant.helpers.script.websocket_api_script
Source: helpers/script.py:532
First occurred: 21:52:08 (1 occurrence)
Last logged: 21:52:08

websocket_api script: Error executing script. Unexpected error for call_service at pos 1:
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 532, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1027, in _async_step_call_service
    response_data = await self._async_run_long_action(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<9 lines>...
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 642, in _async_run_long_action
    return await long_task
           ^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2827, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2870, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 951, in entity_service_call
    response_data = await _async_handle_entity_calls(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 830, in _async_handle_entity_calls
    single_result = await entity.async_request_call(_with_context(entity, coro))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1696, in async_request_call
    return await coro
           ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 825, in _with_context
    return await coro
           ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 909, in _handle_single_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 1012, in async_handle_snapshot_service
    else await camera.async_camera_image()
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 575, in async_camera_image
    return await self.hass.async_add_executor_job(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        partial(self.camera_image, width=width, height=height)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.14/concurrent/futures/thread.py", line 86, in run
    result = ctx.run(self.task)
  File "/usr/local/lib/python3.14/concurrent/futures/thread.py", line 73, in run
    return fn(*args, **kwargs)
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 569, in camera_image
    raise NotImplementedError
NotImplementedError

and

Logger: homeassistant.helpers.script.websocket_api_script
Source: helpers/script.py:532
First occurred: 21:46:01 (1 occurrence)
Last logged: 21:46:01

websocket_api script: Error executing script. Unexpected error for call_service at pos 1:
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 532, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1027, in _async_step_call_service
    response_data = await self._async_run_long_action(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<9 lines>...
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 642, in _async_run_long_action
    return await long_task
           ^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2827, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2870, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 951, in entity_service_call
    response_data = await _async_handle_entity_calls(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 830, in _async_handle_entity_calls
    single_result = await entity.async_request_call(_with_context(entity, coro))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1696, in async_request_call
    return await coro
           ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 825, in _with_context
    return await coro
           ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 909, in _handle_single_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 1012, in async_handle_snapshot_service
    else await camera.async_camera_image()
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 575, in async_camera_image
    return await self.hass.async_add_executor_job(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        partial(self.camera_image, width=width, height=height)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.14/concurrent/futures/thread.py", line 86, in run
    result = ctx.run(self.task)
  File "/usr/local/lib/python3.14/concurrent/futures/thread.py", line 73, in run
    return fn(*args, **kwargs)
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 569, in camera_image
    raise NotImplementedError
NotImplementedError

Even though the video stream is running.

Found the right rtsp url in the log: rtsp://ip:38554/[app name]

The add-on won't start here:

Waiting for bridge config from HA integration...
Config found!
Using bridge config from HA integration: /config/philips_avent_bridge_xx.json
==============================
Philips Avent WebRTC Bridge
==============================
Camera: Name Name (xx)
RTSP:   rtsp://localhost:38554/Name Name
==============================
11:47:45.939 INF Verifying API access...
11:47:46.033 INF API access OK
11:47:46.069 INF User: xx ([email protected])
11:47:46.069 INF MQTT domain: m1.tuyaeu.com
Error: failed to start RTSP server: failed to listen on port 38554: listen tcp :38554: bind: address already in use
Command execution failed
Usage:
  avent-webrtc-bridge direct [flags]

Flags:
      --app-key string       Tuya app key (clientId)
      --camera-id string     Camera device ID
      --camera-name string   Camera display name (used in RTSP path)
      --ch-key string        Channel key (default "071d81fa")
      --device-id string     Phone device ID
      --ecode string         Tuya ecode (from login response)
  -h, --help                 help for direct
      --package string       App package name (for MQTT client ID)
      --partner string       Partner identity (from login response)
      --port int             RTSP server port (default 8554)
      --sid string           Tuya session ID
      --signing-key string   HMAC-SHA256 signing key

Seems weird that the port is already in use, any ideas?

2026.5.1 is out with two user-visible improvements:

Multi-camera support. If you have more than one Philips Avent monitor on the same Tuya account, the bridge add-on now serves all of them from a single process, each on its own RTSP path:

rtsp://host:38554/CameraName1
rtsp://host:38554/CameraName2

No manual config — the integration discovers all cameras and the add-on picks them up automatically. Closes GitHub issue #35.

SCD951 video stream fix. Two users reported that SCD951 monitors completed setup (sensors, switches, lullaby controls all worked) but the WebRTC video stream never connected. Root cause: the addon was passing an empty productId to Tuya's WebRTC API. For the SCD97x/SCD92x family that empty value happens to fall on a working default; SCD951 (productId selj2idknqhjnids) requires the real value. The integration now captures and propagates productId end-to-end, with automatic backfill on first restart for users already on 2026.5.0. Closes GitHub issue #33.

If you tested 2026.5.1 on any model (especially SCD951 or a multi-camera setup), I'd love to hear the result — confirmations help me know which combinations are validated.

Release notes: Release 2026.5.1 · thekoma/aventproxy · GitHub

2 Likes

Wow this is really good!

I can confirm the app (add-on) and integration work for my SCD973 (except the mentioned motioned sound and motion detection)

This also allows for publishing the stream as a HomeKit Secure Video camera in Apple Home :tada:

To achieve this, install Scrypted as a Home Assistant addon (app)

In Scrypted, add a device of the type RTSP Camera. In the Avent addon logging, find the rtsp url, for example: rtsp://localhost:38554/Philips_Avent_Baby_Monitor
Use this url in Scrypted. In de Scrypted device, enable the extensions Homekit and WebRTC.

A settings option for HomeKit now appears. Make sure under the tab ‘pairing’ the option “standalone accessory mode” is selected for best performance.
Add the camera to HomeKit using the shown QR code or pairing code.

For instant video playback in HomeKit, also enable the extension “rebroadcast plugin” extension in Scrypted. A settings option “streams” appears. Selected “stream 1” as prebuffered stream. In the tab “stream: stream 1” select “FFmpeg (UDP)” as RTSP parser (other options do not seem to work).
This plugins maintains an active connection to the camera at all times.

For a even nicer experience, enable the “snapshot plugin” extension, so that the camera is never blank in Apple Home

This probably also works for Google Home

Can confirm that the snapshot function works perfectly now, thanks!

Small update since the 2026.5.1 post.

What shipped (2026.5.2)

  • camera.snapshot finally works. Calling the snapshot service on the camera entity used to throw NotImplementedError even with the live stream running. Now it grabs a frame off the RTSP stream, so you can do things like "send me a photo when sound is detected" (#39). Thanks @Skye for confirming it works now.

  • A parent friendly way to report bugs. There's now a three click flow inside HA to download a diagnostics dump: Settings > Devices & Services > Philips Avent > the three dots menu > Download diagnostics. It strips your email, password and tokens automatically and gives me the raw codes your monitor reports. No packet captures, no command line. Guide here: docs/reporting-issues.md. If you ever hit something weird, that file is the fastest path to a fix.

(If you're coming from 2026.4.x, the two big ones from 2026.5.1 still apply: multi camera support, and the SCD951 video fix.)

Issues I opened on your behalf

A few of you reported things here on the forum that I turned into tracked GitHub issues so they don't get lost in the thread. If one of these is you, a diagnostics dump (or a debug log) on the issue would help a lot:

  • SCD921 quirks (#40), from @Skye: video drops in and out, the motion sensor never fires, sound detection is erratic, and the wifi signal sensor is stuck at -75 dBm. My hunch is that the SCD921 uses different internal codes than the SCD973 I developed against. The dump will tell me for sure.

  • Bridge crash "address already in use" on port 38554 (#43), from @ChristiaanW123: the add-on couldn't bind its RTSP port at startup. I have a couple of theories (a restart race, or something else already sitting on the port). The full startup log would nail it down.

  • Login failing with "cannot connect" even though the app login notification arrives (#44), from @lcasaccia87: right now the integration lumps a lot of different Tuya errors into that one generic message, which hides the real cause. A debug log of the failed login shows the actual error code, and that's what I need to map it properly.

What's supported today

Models people have confirmed working:

  • SCD973 / SCD923 (the ones I develop against)

  • SCD951 (since 2026.5.1)

  • SCD643/26

  • SCD971

  • SCD921: video works but it's rough at the moment, see #40

Features:

  • 1080p live video

  • room temperature

  • night light on/off plus brightness

  • lullabies (play, pause, stop, next, prev) plus volume

  • motion and sound alerts as switches, plus motion detected / sound detected binary sensors you can trigger automations on

  • privacy mode (camera on/off)

  • multiple monitors on one account, each on its own RTSP path

  • camera.snapshot

What's not there yet

  • Fully local operation. Streaming and control are almost entirely local, but the WebRTC signaling still goes through Tuya's MQTT, so the camera needs to reach the cloud to start a stream.

  • Audio in the browser on iOS / Safari. Safari blocks autoplay audio until you interact with the page, and even after unmuting some of you (SCD921) still get silence. If you want to rule out the integration, play the same rtsp://host:38554/<name> URL in VLC. If you get audio there, it's a browser thing.

  • SCD953/26 is requested (#42) but not confirmed yet. If you have one, just try it and drop a diagnostics dump on that issue.

If you're on anything older than 2026.5.2, just install 2026.5.2 directly.

The port issue somehow vanished, but now while adding the integration I'm getting "MFA unknown" and when disabling the MFA I'm getting cannot_connect.

Login in the Philips app works perfectly.

How do I get the debug log of the login? I read the instructions above, but the integration is not set up yet, so I can't use the tree dots.

Found something, will post in the Github thread.