octoprint

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

Posted by admin in octoprint

OctoPrint 0.18.0 Raspberry Pi Multiple Printers

De entrada puede parecer una guía muy larga y difícil, si es larga es porque está todo lo necesario para no tener ningún problema con múltiples instancias en octoprint. Tampoco es difícil, solo hay que ir haciendo los pasos como se muestran.

Temas claros antes de duplicar la instancia:

  • Plugins:
    • Quedan compartidos entre todas las instancias instaladas.
    • Los datos cada instancia guarda sus datos, eso no queda compartido.
    • Para actualizar un plugin, solo basta en actualizar en una instancia, para que se muestre actualizado en las otras, o se reinicia la raspberry o las distintas instancias.
    • Recomendado actualizar plugins cuando no se este imprimiendo en ninguna de las impresoras.
    • Si en una instancia no se quiere uno de los plugins, con desactivar para esa instancia es suficiente.
    • Si se borra un plugin, al reiniciar se borrara de las otras instancias.
  • Muy importante renombrar los puertos usb, para evitar problemas de conexión.
  • Los gcode subidos a cada instancia, solo se mostrarán en esa instancia, eso es bueno, ya que solo veremos los ficheros para esa impresora.

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.



Duplicado de instancias de octorpint

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.

Nos logeamos, si no habéis cambiado el usuario y password, por defecto el usurario es pi y el password es raspberry.

Por Seguridad es recomendable cambiar el password.

Duplicamos el fichero octorpint.service, es posible que os vuelva a pedir de nuevo el password, es decir raspberry o el que tengáis.

Recuerdo que para pegar los comando en PuTTy, se puede hacer pulsando el botón derecho del ratón.

sudo cp /etc/systemd/system/octoprint.service /etc/systemd/system/octoprint2.service

Si queréis más impresoras, el proceso es igual, pero cambiado el 2 por 3, 4, etc…

sudo cp /etc/systemd/system/octoprint.service /etc/systemd/system/octoprint3.service

sudo cp /etc/systemd/system/octoprint.service /etc/systemd/system/octoprint4.service

Entramos en el nuevo fichero duplicado:

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

Os saldrá una ventana como esta:

Editamos estos parámetros, 5001 para la segunda impresora.

Description=The snappy web interface for your 3D printer 2
Environment="PORT=5001"

Añadimos al final de ExecStart esto:

--config /home/pi/.octoprint2/config.yaml --basedir /home/pi/.octoprint2

Quedando así:

ExecStart=/home/pi/oprint/bin/octoprint serve --host=${HOST} --port=${PORT} --config /home/pi/.octoprint2/config.yaml --basedir /home/pi/.octoprint2

Quedando así:

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

De nuevo, para más de dos impresora, el proceso es el mismo, hay que editar los otros ficheros:

Tercera impresora, puerto 5002:

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

Description=The snappy web interface for your 3D printer 3
Environment="PORT=5002"
ExecStart=/home/pi/oprint/bin/octoprint serve --host=${HOST} --port=${PORT} --config /home/pi/.octoprint3/config.yaml --basedir /home/pi/.octoprint3

Cuarta Impresora, puerto 5003:

sudo nano /etc/systemd/system/octoprint4.service
Description=The snappy web interface for your 3D printer 4
Environment="PORT=5003"
ExecStart=/home/pi/oprint/bin/octoprint serve --host=${HOST} --port=${PORT} --config /home/pi/.octoprint4/config.yaml --basedir /home/pi/.octoprint4

Activamos el inicio automático al iniciar la raspberry para estas segundas instancias:

sudo systemctl enable octoprint2
sudo systemctl enable octoprint3
sudo systemctl enable octoprint4

Si sale como la imagen es que ya han quedado activadas correctamente para el inicio.



Editando haporxy

Pasamos a editar el haproxy.cfg, abriéndolo con:

sudo nano /etc/haproxy/haproxy.cfg

Crearemos un nuevo frontend para cada impresora, esto tiene como ventaja poder tener una cámara para cada una de las impresoras, y la gestión de multi-instancia, desde mi punto de vista, es mejor.

Con esto accederemos a la segunda impresora desde el puerto 81, tercera 82 etc. Mencionar que la primera se accede desde el puerto 80, que no es necesario introducir en el navegador.

Vamos al final fichero y pegamos esto para la segunda impresora:

frontend public2
        bind :::81 v4v6
        bind :::444 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        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

Repetimos lo mismo para las otras instancias:

frontend public3
        bind :::82 v4v6
        bind :::445 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        default_backend octoprint3

backend octoprint3
        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 octoprint3 127.0.0.1:5002
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http


frontend public4
        bind :::83 v4v6
        bind :::446 v4v6 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        default_backend octoprint4

backend octoprint4
        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 octoprint4 127.0.0.1:5003
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http

Guardamos el fichero y comprobamos que todo este correcto con:

sudo service haproxy restart

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

En el caso que os salga un error como este, debes volver a editar haproxy, revisando bien el fichero y que no haya algún valor mal introducido.

Reiniciamos la raspberry con:

sudo reboot now



Configurando las nuevas instancias de octoprint

Una vez reiniciada ya tendremos acceso a las nuevas instacias, las direcciones serian estas:

http://192.168.X.XX (pimera)
http://192.168.X.XX:81 (segunda)
http://192.168.X.XX:82 (tercera)
http://192.168.X.XX:83 (cuarta)

o

http://octopi.local (pimera)
http://octopi.local:81 (segunda)
http://octopi.local:82 (tercera)
http://octopi.local:83 (cuarta)

Vamos a configurar las nuevas instancias:

Importante, en la sección de Server Commands, hay que poner:

sudo service octoprint2 restart
sudo shutdown -r now
sudo shutdown -h now

Para la tercera y cuarta

sudo service octoprint3 restart
sudo service octoprint4 restart

Ahora, para distinguir cada impresora y evitar confusiones, es recomendable cambiar el nombre de cada una de ellas y su color.



Renombrado de los puertos USB

Finalmente, y muy pero que muy importante, es renombrar los puertos. Esto es muy importante, ya que al abrir la raspberry puede que cambie el nombre del puerto, y no conectes a la impresora correcta. Pero aun puede ser peor, como que en otra instancia conectes a otra impresora que esta imprimiendo, provocando el reinicio de esa placa y adiós a esa impresión.

1. Conectamos solo una de las impresoras, y miramos, desde octorpint, cual es el nombre de Serial Port que le asigna la raspberry:

En este caso está asignada a /dev/ttyUSB0, el nombre puede ser diferente, por ejemplo, ttyAMC1.

Si las impresoras no tienen la misma placa, da igual a que puerto usb de la raspberry conectes la impresora, en el caso de tener la misma placa hay que acordarse a que puerto as conectado cada impresora.

Mandamos este comando, con el nombre del puerto asignado a nuestra impresora.

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

Saldrán muchos números. Nos desplazamos aproximadamente al tercer parágrafo, nos paramos en el primero mas largo, como en la foto.

Apuntamos estos dos valores:

ATTRS{idVendor}=="" 
ATTRS{idProduct}==""

En el caso que las dos impresores sean iguales, o tengan la misma placa, estos valores saldrán iguales, hay que apuntar un tercer valor.

ATTRS{devpath}==""

Una vez apuntados estos valores, desconectamos del usb de la impresora y conectamos la otra, volvemos a octoprint para saber que nombre le da octoprint al puerto usb a la nueva impresora, puede que sea igual que la otra impresora.

¡OJO! Si tus impresoras son iguales o tienen la misma placa, tienes que conectar a otro puerto usb de la raspberry, y acordarte a que puerto usb as conectado cada impresora, sino conectara a la que no toca.

Repetimos el proceso para todas la impresoras. Al final conseguiremos los valores de idVendor, idProduct, y en caso necesario, el devpath, para cada una de las impresoras.

Con esto terminamos con PuTTY, 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 impresora, rellenándolo con los valores conseguidos anteriormente. En SYMLINK+, añadimos el nombre que le daremos al nuevo puerto. Quedando algo así:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ARTIX1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c99", ATTRS{idProduct}=="0002", SYMLINK+="PMINI"

En el caso de impresoras iguales o con la misma placa, hay que añadir el tercer parámetro, quedando así:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{devpath}=="1.1", SYMLINK+="ARTIX1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{devpath}=="1.3", SYMLINK+="PMINI"

Guardamos, y posteriormente reiniciamos la raspberry.

Con todas las impresoras conectadas, podemos comprobar si los nombres asignados son correctos, podemos mandar este comando por SSH.

ls -l /dev

Ahora vamos a una de las instancias de octoprint. Por ejemplo, en este caso, la de la Prusa.

Vamos a Settings – Serial Connection – General.

En Additional serial ports, añadiremos el nuevo nombre del puerto para la Prusa, en este caso /dev/PMINI

Luego en Blacklisted serial ports, pondremos todos los nombres de los puertos que nos aparezcan de mas. Es decir, algo así:

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyACM0

Finalmente guardamos, si está todo correcto veremos que ahora solo nos sale el puerto de la Prusa, en esa instancia de octorpint.

Repetimos el mismo proceso para la Artillery X1, vamos al octoprint para esta impresora y la configuramos igual que la otra, solo que en Additional serial ports, esta vez añadimos el puerto de la Arillery.

Si todo es correcto, volveremos a ver que ahora solo nos muestra el puerto de la Artillery.

Repetimos este proceso para cada una de las máquinas. De esta forma, no correremos el riesgo de conectar a la impresora que no toca.

Esto es todo lo necesario para poder crear múltiples instancias de 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

Posted by admin in octoprint