AlexxIT/go2rtc · error

wyze: failed to enable intercom

Error message

wyze: failed to enable intercom: %w

What it means

Returned by the Wyze Producer's AddTrack when setting up the backchannel (two-way audio). Before negotiating tracks it calls client.StartIntercom() to switch the camera into intercom (talk-back) mode; any failure there is wrapped with this message. Without intercom mode the camera will not accept upstream audio.

Solutions

  1. Log the wrapped inner error from StartIntercom() to see timeout vs rejection
  2. Update the camera firmware — some models only support intercom on newer versions
  3. Close other active streams/apps viewing the camera before retrying, then reconnect
  4. Confirm the camera model supports two-way audio (talk) in the Wyze app
  5. Retry the connection; transient TUTK command failures often clear on a fresh session

Example fix

// before
// starting backchannel on a one-way-audio camera model
err := producer.AddTrack(media, codec, track) // fails: intercom unsupported
// after
if !supportsTwoWayAudio(cameraModel) {
    return errors.New("camera model does not support backchannel audio")
}
err := producer.AddTrack(media, codec, track)
Defensive patterns

Strategy: try-catch

Validate before calling

// Go: only attempt backchannel on known two-way-audio models
if !supportsTwoWayAudio(cameraModel) {
    return errors.New("model does not support intercom/backchannel")
}

Type guard

func backchannelSupported(model string) bool { return twoWayAudioModels[model] }

Try / catch

if err := producer.AddTrack(media, codec, track); err != nil {
    if strings.Contains(err.Error(), "failed to enable intercom") {
        log.Warn("intercom rejected — retry after closing other streams")
    }
    return err
}

Prevention

When it happens

Trigger: Publishing a backchannel audio track to a Wyze camera stream when StartIntercom() fails: camera firmware rejects the intercom command, TUTK session is not fully established, camera is busy/streaming elsewhere, or the device does not support two-way audio.

Common situations: Older Wyze firmware without intercom support on the given model; camera already in a live view/talk session that blocks the mode switch; unstable network causing the TUTK control command to time out; using a camera model that only supports one-way audio.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of AlexxIT/go2rtc@c245815e75 (2026-09-07). Data as JSON: /api/errors/59e4b702dd43e99a. Report an issue: GitHub.

Appendix: source

Thrown at pkg/wyze/backchannel.go:14

package wyze

import (
	"fmt"

	"github.com/AlexxIT/go2rtc/pkg/aac"
	"github.com/AlexxIT/go2rtc/pkg/core"
	"github.com/AlexxIT/go2rtc/pkg/tutk"
	"github.com/pion/rtp"
)

func (p *Producer) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiver) error {
	if err := p.client.StartIntercom(); err != nil {
		return fmt.Errorf("wyze: failed to enable intercom: %w", err)
	}

	// Get the camera's audio codec info (what it sent us = what it accepts)
	tutkCodec, sampleRate, channels := p.client.GetBackchannelCodec()
	if tutkCodec == 0 {
		return fmt.Errorf("wyze: no audio codec detected from camera")
	}

	if p.client.verbose {
		fmt.Printf("[Wyze] Intercom enabled, using codec=0x%04x rate=%d ch=%d\n", tutkCodec, sampleRate, channels)
	}

	sender := core.NewSender(media, track.Codec)

	// Track our own timestamp - camera expects timestamps starting from 0
	// and incrementing by frame duration in microseconds
	var timestamp uint32 = 0
	samplesPerFrame := tutk.GetSamplesPerFrame(tutkCodec)

View on GitHub (pinned to c245815e75)