OctoPrint 0.18.0 Raspberry Pi Multiple Webcam

Verificar la versión, al final de la página de octoprint verás que versión tienes, esta guía es válida para la versión de OctoPi 0.18.0.

Primero entramos por SSH a octoprint, por ejemplo desde Windows con la aplicación PuTTy, introducimos la IP de la raspberry, marcamos SSH y finalmente a Open.

Duplicamos este fichero para tantas webcams queramos poner:

sudo cp /root/bin/webcamd  /root/bin/webcamd2
sudo cp /root/bin/webcamd  /root/bin/webcamd3
sudo cp /root/bin/webcamd  /root/bin/webcamd4

Explicaré primero como configurar una Pi Cam, posteriormente se detalla como configurar las webcams por USB.



1. PI CAM

Editamos el primer fichero:

sudo nano /root/bin/webcamd

Solo editaremos estos dos parámetros para la pi cam:

camera="raspi"
camera_raspi_options="-x 1280 -y 720 -fps 15 -q 75"

Podéis poner la configuración que prefiráis.

Guardamos con CRTL+X, luego Y (yes), finalmente ENTER.



2. WEBCAM por USB

2.1. Renombrar puerto USB para las webcam USB

Vamos a configurar la webcam por usb, en este caso será un Logitech C270 y una HERCULES HD.

Para otros modelos de webcam, en este hilo del foro de OctoPrint, encontraréis varias configuraciones válidas.

Antes que nada, tenemos que detectar el puerto de video de la webcam. Con este comando podremos determinar que /dev/video tiene cada camara. En este ejemplo vemos que la Logitech c270 viene con el nombre UVC Camera y la camera de Hercules HD con el nombre de Hercules HD Twist. Apuntamos el primer valor de /dev/video#, de cada una de las webcam.

v4l2-ctl --list-devices

Mandamos este comando, con el número de video que no as dado en la captura anterior, en este caso, video2 para la Logitech y video0 para la Hercules.

udevadm info -q all -n /dev/video2 --attribute-walk

Saldrán muchos números, buscamos y apuntamos estos valores:

ATTR{index}=="0"
ATTRS{idVendor}=="" 
ATTRS{idProduct}==""

En el caso que las webcams tengan los mismos valores, hay que apuntar un cuarto valor, el puerto usb en que se conecta la webcam, con lo que siempre se tendrá que conectar a ese puerto usb.

ATTRS{devpath}==""

Editamos este fichero, si es la primera vez que accedes saldrá en blanco.

sudo nano /etc/udev/rules.d/99-usb.rules

Dentro añadimos una línea para cada webcam, rellenándolo con los valores conseguidos anteriormente. En SYMLINK+, añadimos el nombre que le daremos al nuevo puerto. Quedando así:

SUBSYSTEM=="video4linux", ATTR{index}=="0", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0825", SYMLINK+="LOGI"

SUBSYSTEM=="video4linux", ATTR{index}=="0", ATTRS{idVendor}=="06f8", ATTRS{idProduct}=="301a", SYMLINK+="HERCU"

Guardamos y reiniciamos la raspberry con:

sudo reboot now

Vamos a comprovar si el renombrado de puertos es correcto, con:

ls -l /dev

Como se aprecia en la captura, podemos ver que la webcam Logitech, que le se le ha dado el nombre LOGI, apunta a video0, y la Hercules con nombre HERCU, apunta a video2, con lo que podemos verificar que todo es correcto.


2.2. Configurando cada una de las Webcam

Entramos el fichero duplicado de la segunda webcam usb:

sudo nano /root/bin/webcamd2

En este caso editaremos estas líneas, y las dejaremos como se indica aquí, añadiendo el puerto 8081 para la segunda camera, 8082 para la tercera …

camera="usb"
camera_usb_options="-r 1280x720 -f 15"
camera_http_options="-p 8081 -n --listen 127.0.0.1"

Sin salir del fichero, vamos bajando y buscamos el apartado # starts uo the USB webcam en device sustituimos video0 por el nombre del puerto renombrado, en el caso de la guia, seria por LOGI o HERCU.

device="video0"

En este caso por:

device="LOGI"
o
device="HERCU"

Continuando en el fichero, vamos bajando y buscamos el apartado # add list of raspi camera into an array, más abajo (como se muestra en la captura, en startUsb modificamos video_device por device.

startUsb "${device}"

Guardamos y salimos de este fichero.

Repetimos este proceso para cada webcam, con su webcamd y puerto renombrado correspondiente.



Pasmos a definir el servicio para la segunda webcam webcamd2.service, o para tantas como quieras webcamd3.service, webcamd4.service, etc.
Duplicamos este fichero:

sudo cp /etc/systemd/system/webcamd.service /etc/systemd/system/webcamd2.service

Abrimos el fichero duplicado:

sudo nano /etc/systemd/system/webcamd2.service

Editamos estos parámetros:

Description=the OctoPi webcam2 daemon with the user specified config

StandardOutput=append:/var/log/webcamd2.log
StandardError=append:/var/log/webcamd2.log
ExecStart=/root/bin/webcamd2

Activamos porque se inicie el servicio de la segunda webcam al arrancar la raspberry.

sudo systemctl enable webcamd2



NOTA: En caso de tener más cámaras, repite lo anterior cambiando el 2 por el 3, 4, 5, etc.



3. Editamos HAProxy para poder ver las webcams en Octoprint

Ahora editaremos el archivo haproxy para añadir la webcam 2.

sudo nano /etc/haproxy/haproxy.cfg

Hay dos tipos de configuración:

En caso de tener 2 instancias de octoprint, dejar el apartado de frontend public2, así:

frontend public2
        bind :::81 v4v6
        bind :::444 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        use_backend webcam2 if { path_beg /webcam/ }
        default_backend octoprint2

backend octoprint2
        acl needs_scheme req.hdr_cnt(X-Scheme) eq 0

        reqrep ^([^\ :]*)\ /(.*) \1\ /\2
        reqadd X-Scheme:\ https if needs_scheme { ssl_fc }
        reqadd X-Scheme:\ http if needs_scheme !{ ssl_fc }
        option forwardfor
        server octoprint2 127.0.0.1:5001
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http

backend webcam2
        reqrep ^([^\ :]*)\ /webcam/(.*)     \1\ /\2
        server webcam2  127.0.0.1:8081
        errorfile 503 /etc/haproxy/errors/503-no-webcam.http

En el caso que solo tengáis una instancia de octoprint y 2 cameras, hay que añadir en frontend public la nueva línea de la webcam.

frontend public
        bind :::80 v4v6
        bind :::443 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        use_backend webcam if { path_beg /webcam/ }
        use_backend webcam2 if { path_beg /webcam2/ }
        use_backend webcam_hls if { path_beg /hls/ }
        use_backend webcam_hls if { path_beg /jpeg/ }
        default_backend octoprint

.... añadir al final ....

backend webcam2
        reqrep ^([^\ :]*)\ /webcam2/(.*)     \1\ /\2
        server webcam2  127.0.0.1:8081
        errorfile 503 /etc/haproxy/errors/503-no-webcam.http

Guardamos el fichero y comprobamos que todo esté correcto con:

sudo service haproxy restart

Si no da ningún error es que todo es correcto.

En el caso de salir un error como este, volver a editar haproxy, revisad bien el fichero y que no este algún valor mal introducido.

Reiniciamos la raspberry con:

sudo reboot now

Una vez reiniciado octoprint, podremos verificar fácilmente si las cámaras funcionan, entrando en estos enlaces:

Camera pi cam:

http://octopi.local/webcam/
http://octopi.local:8080
http://192.168.X.XXX/webcam/
http://192.168.X.XXX:8080

Segunda webcam con multi-instancia:

http://octopi.local:81/webcam/
http://192.168.X.XXX:81/webcam/

Segunda webcam sin multi-instancia:

http://octopi.local/webcam2/
http://octopi.local:8081
http://192.168.X.XXX/webcam2/
http://192.168.X.XXX:8081

Finalmente solo queda configurar la segunda webcam en la segunda instancia de octoprint.

Vamos a Settings –> Webcam & Timelapse

Activamos Enable webcam support

En la casilla Stream URL: /webcam/?action=stream

Probamos con el botón test.

Activamos la opción de Timelapse Recordings, luego añadimos estos valores en:

Snapshot URL: http://127.0.0.1:8081/?action=snapshot

Path to FFMPEG: /usr/bin/ffmpeg

Probamos con el botón test.

Esto es todo lo necesario para poder tener  múltiples cameras en octoprint 0.18.0



Si tenéis alguna duda poder entrar en la magnífica comunidad de octoprint para telegram:

https://t.me/Octoprint

Y quiero dar mención a Chris Riley y Thomas Messmer por sus manuales para la versión de octoprint 0.17.0

Channel Chis Riley

Web Thomas Messmer