Create a local WebRTC, RTSP, RTMP, or HLS/Low-Latency HLS stream for most of your Wyze cameras including the outdoor, doorbell, and 2K cams.
No modifications, third-party, or special firmware required.
It just works!
Streams direct from camera without additional bandwidth or subscriptions.
Based on @noelhibbard's script with kroo/wyzecam and bluenviron/mediamtx.
Please consider ⭐️ starring or ☕️ sponsoring this project if you found it useful, or use the affiliate link when shopping on amazon!
Important
As of May 2024, you will need an API Key and API ID from: https://support.wyze.com/hc/en-us/articles/16129834216731.
Warning
Please double check your router/firewall and do NOT forward ports or enable DMZ access to the bridge unless you know what you are doing!
See the supported cameras section for additional information.
Install docker and run:
docker run -p 8554:8554 -p 8888:8888 -p 5000:5000 mrlt8/wyze-bridge
You can then use the web interface at http://localhost:5000
where localhost is the hostname or ip of the machine running the bridge.
See basic usage for additional information or visit the wiki page for additional information on using the bridge as a Home Assistant Add-on.
- FIX: Clear the retain flag from MQTT Discovery which was causing commands to be resent to the bridge on startup for some users. (#1182)
- Ignore commands when connection is stopping.
- Improved video connection stability and audio sync. #1175 #1196 #1194 #1193 #1186 Thanks @vipergts450!
- FIX: Remove quotes from credentials #1158
- NEW:
FORCE_FPS
option for all cameras #1161 - Home Assistant: Add
FORCE_FPS
option #1161 - Home Assistant: Ignore whitespaces in api key/id #1188 Thanks @richh1!
- FIX: Setting bitrate higher than 255 would not report correctly (#1185) Thanks @Anc0dia!
- FIX: Wrong bitrate for HL_CFL2 (#1112) Thanks @dreondre!
- FIX: Could not set values with the REST API when
WB_AUTH
is enabled.(#1189) Thanks @kiwi-cam! - NEW:
api
header authentication option for the RES API whenWB_AUTH
is enabled:-H "api: MyWbApiKey"
Important
WebUI and stream authentication will be enabled by default to prevent unintentional access.
Default Authentication
- To disable default authentication, set
WB_AUTH=False
explicitly. - Note that all streams and the REST API will necessitate authentication when
WB_AUTH
is enabled.
WebUI Authentication
- If
WB_USERNAME
andWB_PASSWORD
are not set, the system will try to useWYZE_EMAIL
andWYZE_PASSWORD
. - In case neither sets of credentials are provided, the username will default to
wbadmin
with a randomly generatedWB_PASSWORD
, which will be logged and stored in awb_password
file within the tokens directory. - Credentials are case sensitive.
Stream and REST API Authentication
- A unique API key will be accessible at the bottom of your WebUI and saved to a
wb_api
file in your tokens directory.- For persistence, ensure to set the
WB_API
environment variable or volume mount the/tokens
directory.
- For persistence, ensure to set the
- REST API will require an
api
query parameter.- Example:
http://localhost:5000/api/<camera-name>/state?api=<your-wb-api-key>
- Example:
- Streams will also require authentication.
- username:
wb
- password: your unique wb api key
- username:
FIXES
- Wrong file permission caused errors for non-root. (#1174) Thanks @GiZZoR!
- Fix
MOTION_API
when substreams were enabled. (#1125) Thanks @kiwi-cam! - Changing FPS and
FORCE_FPS
were broken (#1161) Thanks @jarrah31! - Dropped frame issue when camera is falling behind. (#1167) Thanks @34t614t1254y!
NEW
- Token based wyze authentication from WebUI. See wiki.
- Remove 255 limit from
QUALITY
. Can now go as high as your network can handle. e.g.- QUALITY=HD8000
- Update snapshot with
MOTION_API
and push to mqtt (#709) (#970) - Additional headers for
MOTION_WEBHOOKS
. OFFLINE_WEBHOOKS
will send a POST request when the bridge cannot connect to a camera because it is offline. Replacesifttt_webhook
.
POTENTIALLY BREAKING
- CHANGES:
MOTION_WEBHOOKS
now makes a POST request instead of a GET request. - CHANGES:
MOTION_WEBHOOKS
includes the event timestamp in the message body which may require you to adjust the timezone for your container with theTZ
environment. - REMOVED:
ifttt_webhook
as webhooks are no longer free with IFTTT. - CHANGED: Renamed WebUI authentication related ENV options:
WEB_AUTH
->WB_AUTH
WEB_USERNAME
->WB_USERNAME
WEB_PASSWORD
->WB_PASSWORD
HOME ASSISTANT
- Login with API Key/ID or existing token via Ingress/WebUI.
- Config now uses yaml instead of json.
- Credentials are now optional to allow for WebUI based login, but it is still recommended to set them under advanced options.
Tip
Home Assistant: you may need to re-add the repo if you cannot see the latest updates.
- How does this work?
- It uses the same SDK as the app to communicate directly with the cameras. See kroo/wyzecam for details.
- Does it use internet bandwidth when streaming?
- Not in most cases. The bridge will attempt to stream locally if possible but will fallback to streaming over the internet if you're trying to stream from a different location or from a shared camera. See the wiki for more details.
- Can this work offline/can I block all wyze services?
- No. Streaming should continue to work without an active internet connection, but will probably stop working after some time as the cameras were not designed to be used without the cloud. Some camera commands also depend on the cloud and may not function without an active connection. See wz_mini_hacks for firmware level modification to run the camera offline.
- Why aren't all wyze cams supported yet (OG/Doorbell Pro)?
- These cameras are using a different SDK and will require a different method to connect and stream. See the awesome cryze project by @carTloyal123.
Should work on most x64 systems as well as on most modern arm-based systems like the Raspberry Pi 3/4/5 or Apple Silicon M1/M2/M3.
The container can be run on its own, in Portainer, Unraid, as a Home Assistant Add-on, locally or remotely in the cloud.
Note
Some network adjustments may be needed - see this discussion for more information.
Important
Some newer camera firmware versions may cause issues with remote access via P2P. Local "LAN" access seems unaffected at this time.
Camera | Model | Tutk Support | Latest FW |
---|---|---|---|
Wyze Cam v1 [HD only] | WYZEC1 | ✅ | 3.9.4.x |
Wyze Cam V2 | WYZEC1-JZ | ✅ | 4.9.9.x |
Wyze Cam V3 | WYZE_CAKP2JFUS | ✅ | 4.36.11.x |
Wyze Cam V4 [2K] | HL_CAM4 | ✅ | 4.52.3.x |
Wyze Cam Floodlight | WYZE_CAKP2JFUS | ✅ | 4.36.11.x |
Wyze Cam Floodlight V2 [2k] | HL_CFL2 | ✅ | 4.53.2.x |
Wyze Cam V3 Pro [2K] | HL_CAM3P | ✅ | 4.58.11.x |
Wyze Cam Pan | WYZECP1_JEF | ✅ | 4.10.9.x |
Wyze Cam Pan v2 | HL_PAN2 | ✅ | 4.49.11.x |
Wyze Cam Pan v3 | HL_PAN3 | ✅ | 4.50.4.x |
Wyze Cam Pan Pro [2K] | HL_PANP | ✅ | - |
Wyze Cam Outdoor | WVOD1 | ✅ | 4.17.4.x |
Wyze Cam Outdoor v2 | HL_WCO2 | ✅ | 4.48.4.x |
Wyze Cam Doorbell | WYZEDB3 | ✅ | 4.25.1.x |
Wyze Cam Doorbell v2 [2K] | HL_DB2 | ✅ | 4.51.1.x |
Wyze Cam Doorbell Pro 2 | AN_RDB1 | ❓ | - |
Wyze Battery Cam Pro | AN_RSCW | - | |
Wyze Cam Flood Light Pro [2K] | LD_CFP | - | |
Wyze Cam Doorbell Pro | GW_BE1 | - | |
Wyze Cam OG | GW_GC1 | - | |
Wyze Cam OG Telephoto 3x | GW_GC2 | - |
This is similar to the docker run command, but will save all your options in a yaml file.
- Install Docker Compose.
- Use the sample as a guide to create a
docker-compose.yml
file with your wyze credentials. - Run
docker-compose up
.
Once you're happy with your config you can use docker-compose up -d
to run it in detached mode.
Caution
If your credentials have special characters, you must escape them or leave your credentials blank and use the webUI to login.
Note
You may need to update the WebUI links if you're changing the ports or using a reverse proxy.
To update your container, cd
into the directory where your docker-compose.yml
is located and run:
docker-compose pull # Pull new image
docker-compose up -d # Restart container in detached mode
docker image prune # Remove old images
Visit the wiki page for additional information on Home Assistant.
- Camera Commands (MQTT/REST API)
- Two-Factor Authentication (2FA/MFA)
- ARM/Apple Silicon/Raspberry Pi
- Network Connection Modes
- Portainer
- Unraid
- Home Assistant
- Homebridge Camera FFmpeg
- HomeKit Secure Video
- WebUI API
The bridge features a basic Web-UI which can display a preview of all your cameras as well as direct links to all the video streams.
The web-ui can be accessed on the default port 5000
:
http://localhost:5000/
See also:
WebRTC should work automatically in Home Assistant mode, however, some additional configuration is required to get WebRTC working in the standard docker mode.
-
WebRTC requires two additional ports to be configured in docker:
ports: ... - 8889:8889 #WebRTC - 8189:8189/udp # WebRTC/ICE
-
In addition, the
WB_IP
env needs to be set with the IP address of the server running the bridge.environment: - WB_IP=192.168.1.116
-
See documentation for additional information/options.
All environment variables are optional.
- Audio
- Bitrate and Resolution
- Camera Substreams
- MQTT Configuration
- Filtering Cameras
- Doorbell/Camera Rotation
- Custom FFmpeg Commands
- Interval Snapshots
- Stream Recording and Livestreaming
- rtsp-simple-server/MediaMTX Config
- Offline/IFTTT Webhook
- Proxy Stream from RTSP Firmware
- BOA HTTP Server/Motion Alerts
- Debugging Options
Video Streaming:
- gtxaspec/wz_mini_hacks - Firmware level modification for Ingenic based cameras with an RTSP server and self-hosted mode to use the cameras without the wyze services.
- carTloyal123/cryze - Stream video from wyze cameras (Gwell cameras) that use the Iotvideo SDK from Tencent Cloud.
- mnakada/atomcam_tools - Video streaming for Wyze v3.
General Wyze:
- shauntarves/wyze-sdk - python library to interact with wyze devices over the cloud.