Skip to content

Instantly share code, notes, and snippets.

@nunofgs
Last active April 30, 2024 22:09
Show Gist options
  • Star 38 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save nunofgs/84861ee453254823be6b069ebbce9ad2 to your computer and use it in GitHub Desktop.
Save nunofgs/84861ee453254823be6b069ebbce9ad2 to your computer and use it in GitHub Desktop.
Use any RTSP camera with Prusa Connect

I use a cheap Tapo C100 webcam to monitor my 3D prints. It supports RTSP.

Screenshot 2023-07-17 at 23 26 34

Instructions

  1. Go to the Cameras section at https://connect.prusa3d.com
  2. Add a new camera.
  3. Click the QR code link
  4. Click "Start Camera"
  5. Open your browser's inspector window and look for the "/snapshot" request.
  6. Copy the "Fingerprint" and "Token" headers into the docker-compose below.

The end result!

Screenshot 2023-07-17 at 23 13 10

prusa-camera:
image: linuxserver/ffmpeg
restart: always
entrypoint: /bin/bash
command: /upload.sh
environment:
RTSP_URL: "rtsp://<username>:<password>@<camera.ip.address>/stream1"
FINGERPRINT: "<fingerprint-from-prusa-connect>"
TOKEN: "<token-from-prusa-connect-link>"
volumes:
- ./upload.sh:/upload.sh
#!/bin/bash
# Set default values for environment variables
: "${HTTP_URL:=https://webcam.connect.prusa3d.com/c/snapshot}"
: "${DELAY_SECONDS:=10}"
: "${LONG_DELAY_SECONDS:=60}"
while true; do
# Grab a frame from the RTSP stream using FFmpeg (timeout at 5s)
ffmpeg \
-timeout 5000000 \
-loglevel quiet \
-stats \
-y \
-rtsp_transport tcp \
-i "$RTSP_URL" \
-f image2 \
-vframes 1 \
-pix_fmt yuvj420p \
output.jpg
# If no error, upload it.
if [ $? -eq 0 ]; then
# POST the image to the HTTP URL using curl
curl -X PUT "$HTTP_URL" \
-H "accept: */*" \
-H "content-type: image/jpg" \
-H "fingerprint: $FINGERPRINT" \
-H "token: $TOKEN" \
--data-binary "@output.jpg" \
--no-progress-meter \
--compressed
# Reset delay to the normal value
DELAY=$DELAY_SECONDS
else
echo "FFmpeg returned an error. Retrying after ${LONG_DELAY_SECONDS}s..."
# Set delay to the longer value
DELAY=$LONG_DELAY_SECONDS
fi
sleep "$DELAY"
done
@s31teg
Copy link

s31teg commented Apr 2, 2024

Hi all, I've turned this in to a standalone Docker image where multiple cameras can be specified using environment variables in the docker-compose file or docker command: https://hub.docker.com/r/jtee3d/prusa_connect_rtsp
Like so (docker-compose.yml):

version: '3.8'
services:
  prusa_connect_rtsp:
    image: jtee3d/prusa_connect_rtsp:latest
    restart: always
    environment:
      RTSP_URLS: >
        rtsp://username:password@192.168.1.11/live0,
        rtsp://username:password@192.168.1.12/live0,
        rtsp://username:password@192.168.1.13/live0
      TOKENS: >
        5dvoIByhfG7AeODTiNNk,
        MdVaUadfw93MBdlZSlqM,
        fejnJhrhCGncXsDU0R8S

Let me know your thoughts :-)

I've gotten to the point where the container is running, and in the GUI log I can see your logo along with the correct RTSP url and token, but nothing happens after the "------" line.

The message does say "Detected use of RTSP_URLS environment variable. Use CAMERA_URLS instead." Is that an error?

Also CPU usage is pinned at 25% by the process for command "curl -X PUT https://webcam.connect....." There is another process "/bin/bash /upload.sh" using 0% CPU.

Do I still need to populate and put upload.sh somewhere if I'm using the docker image?

Every so often I get 'This image is more then x mins old'

A restart of the docker fixes it but any way to detect this or just restart the docker on a schedule?

@ChiefPoints
Copy link

Hi all, I've turned this in to a standalone Docker image where multiple cameras can be specified using environment variables in the docker-compose file or docker command: https://hub.docker.com/r/jtee3d/prusa_connect_rtsp

Like so (docker-compose.yml):

version: '3.8'
services:
  prusa_connect_rtsp:
    image: jtee3d/prusa_connect_rtsp:latest
    restart: always
    environment:
      RTSP_URLS: >
        rtsp://username:password@192.168.1.11/live0,
        rtsp://username:password@192.168.1.12/live0,
        rtsp://username:password@192.168.1.13/live0
      TOKENS: >
        5dvoIByhfG7AeODTiNNk,
        MdVaUadfw93MBdlZSlqM,
        fejnJhrhCGncXsDU0R8S

Let me know your thoughts :-)

Thanks for setting this up. Got it running on my Synology NAS in Container Manager. Gave me errors at first, which I put up on your github, but then it just started working. Thanks so much!

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