We at Optoelectrónica Icalma recently launched a product!
We replaced the 'days without accidents' board of an Ecolab facility with a digital one.
My father, Franco Puebla and I worked on this.
To do this, I set up a server in my house, hosting an application exposed to the public internet, where Ecolab can change the values of the board.
Here is the app, in case you are curious. https://ecolab.optoelectronica.cl/
My father connected a Raspberry Pi to the board, and I wrote software to constantly read webapp values.
My father and Franco physically connected LEDs to the Raspberry Pi using pins.
And this is the result. Ecolab made the design.
Here is the latest version of the instructions, clean and more agnostic. Although still referencing my server.
Some models run these instructions cleanly and precisely. From scratch to "MVP".
I can just imagine what future models will do with well written instructions.
---text
You are building software for a company called Optoelectronica Icalma.
Optoelectronica Icalma is serving Ecolab a solution to replace their physical 'days without accident' board with a digital board.
We are providing Ecolab a webapp to manipulate accident data. We are giving Ecolab a password to update. Call the webapp "Días sin accidentes".
A computer is embedded in the digital board, continuously reading "Días sin accidentes". The computer is connected to large leds showcasing data.
Develop and host the "Días sin accidentes" server.
Consider this UI.
Showcase two large numbers: "Días sin accidentes" and "Récord". Showcase, small, the last update "Última actualización".
Add button "Administración". Leading to a simple panel requesting for a password. Once entered, user can change both the "Récord" and "Días sin accidentes". Optoelectrónica admin pass is j******o
.
╭────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │ │ ░ ░ │ │ ░ ░ │ │ ░ ░ │ │ ░ Días sin accidentes ░ │ │ ░ ░ │ │ ░ ┌───────────────────────────────────────────────────────────────────────┐ ░ │ │ ░ │ │ ░ │ │ ░ │ │ ░ │ │ ░ │ ╭───────────────────────────────────────────────────────╮ │ ░ │ │ ░ │ │ │ │ ░ │ │ ░ │ │ │ │ ░ │ │ ░ │ │ 128 │ │ ░ │ │ ░ │ │ días │ │ ░ │ │ ░ │ │ │ │ ░ │ │ ░ │ │ │ │ ░ │ │ ░ │ ╰───────────────────────────────────────────────────────╯ │ ░ │ │ ░ │ │ ░ │ │ ░ │ Última actualización: 25/09/2025 09:42 │ ░ │ │ ░ │ │ ░ │ │ ░ └───────────────────────────────────────────────────────────────────────┘ ░ │ │ ░ ░ │ │ ░ Récord anterior ░ │ │ ░ ░ │ │ ░ ┌───────────────────────────┐ ┌─────────────────────────┐ ░ │ │ ░ │ │ │ │ ░ │ │ ░ │ 200 │ │ [ Administracion ] │ ░ │ │ ░ │ días │ │ │ ░ │ │ ░ │ │ └─────────────────────────┘ ░ │ │ ░ └───────────────────────────┘ ░ │ │ ░ ░ │ │ ░ ╭──────────────────────────────────────────────────────────────────────────────╮ ░ │ │ ░ │ │ ░ │ │ ░ │ ┌───────────────────────┐ ┌──────────────────────────────┐ │ ░ │ │ ░ │ │ Contraseña: │ │ Récord anterior (opcional): │ │ ░ │ │ ░ │ │ [••••••••••••••••••] │ │ [ 200 ] │ │ ░ │ │ ░ │ └───────────────────────┘ └──────────────────────────────┘ │ ░ │ │ ░ │ │ ░ │ │ ░ │ ┌──────────────────────────────────────────────────────────────────────┐ │ ░ │ │ ░ │ │ Nuevo valor de días: [ 128 ] │ │ ░ │ │ ░ │ └──────────────────────────────────────────────────────────────────────┘ │ ░ │ │ ░ │ │ ░ │ │ ░ │ [ Actualizar ] [ Cerrar panel ] [ Reiniciar a 0 ] │ ░ │ │ ░ │ │ ░ │ │ ░ ╰──────────────────────────────────────────────────────────────────────────────╯ ░ │ │ ░ ░ │ │ ░ ░ │ │ ░ ░ │ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────╯
The objective is to host several app instances.
You are running a local server inside a house. Consider Xfinity internet provider restrictions on port exposure. The house uses a Harris router.
Optoelectronica contracts CPanel. Cpanel provides DDNS SSL certificates including: Certificate, Private key, Certificate authority bundle, and webcall URL.
Use the currently available (running on the server) Nginx reverse proxy to achieve URLs:
https://prod.optoelectronica.cl
https://test.optoelectronica.cl
You will find certificates in the Cert folder.
Be aware of the current Nginx configuration. As other applications are hosted on this server.
Design two pipelines. Test and prod. Ports 3004 and 3005 respectively.
Both are containers. If test passes tests, push to prod.
Password allows admins to change values."Días sin accidentes" must increase once the day is over."Récord" should not automatically update.The user is to change it.Time zone set to "Santiago de Chile".Values are reachable by computers.
Prepare for outages, including restarts and connectivity problems. If the server or the internet restarts, app restarts too.
User can change "Récord" and/or "Días sin accidentes".
Consider including an API to the webapp.
Track usage. Feel free to choose the approach. Perhaps clicks in the app, data transmission, or API calls.
When you have a working MVP, commit. Call it v1
.
Deploy.
You are to take this project from 0 to MVP. Without stopping. It is key you understand this. You have sudo access.
Ensure all containers are up. Check logs for errors if necessary.
---