Este artículo contiene links de afiliados. Puedes obtener más información aquí.

En 2019 entró en vigor en Europa una normativa por la cual las empresas tienen la obligación de tener un registro diario de la jornada de sus empleados.

Hay muchas herramientas online para llevar este registro. En Desygner usamos Calamari.io.

Usamos Slack como herramienta de comunicación y tenemos comandos para hacer clock in/clock out en Calamari.
El problema es que algunas veces me olvido de, en Slack, escribir el comando necesario para empezar o terminar mi jornada 🤦🏽‍♂️

Pensando en soluciones para hacerlo más sencillo, y como me gusta cacharrear con electrónica, me vino a la mente montar un pequeño dispositivo con un par de botones con los que pudiese empezar y acabar mi turno y también registrar la parada para la hora de la comida. Lo único que necesitaba era que Calamari ofreciese una API con la que poder comunicarse, y ¡la tienen! 👏🏽

Ahora tocaba elegir dónde montar este sistema. Anteriormente había usado Arduino para proyectos de electrónica pero ahora iba a necesitar conexión WiFi y la opción mas barata de esta marca es el Arduino Nano 33 IoT a casi 30€ en Amazon. Varias personas me habían recomendado utilizar la placa ESP32 que también incluyen WiFi y Bluetooth. La puedes encontrar en Amazon por menos de 10€.

Así que esta fue la elegida:

Placa ESP32
Placa ESP32

Era mi primera vez trabajando con la placa ESP32, así que tras los primeros pasos para ponerla a funcionar en mi sistema con el Arduino IDE, lo siguiente que quería hacer era conectarme a la red WiFi.

Mi primera idea era tener una app o web con la cual conectarme por Bluetooth a la placa y una vez ahí, mediante una interfaz, poder seleccionar la red a la que conectarme y escribir la contraseña. Suena muy bien pero tras buscar bastante sobre cómo conectar la placa ESP32 por WiFi no encontré nada de este estilo ya hecho, así que opté por una opción más sencilla: configurar el nombre y password de la red WiFi en el código. La parte mala es que cada vez que quiera cambiar de red necesito cambiar el código y enviarlo de nuevo a la placa.

#include "WiFi.h" //ESP32 WiFi library

WiFi.mode(WIFI_STA);
WiFi.begin("Wifi_SSID", "WiFiPassword");

uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED) {
  delay(500);

  if ((++i % 16) == 0) {
    Serial.println(F(" still trying to connect"));
  }
}

Serial.print(F("Connected. My IP address is: "));
Serial.println(WiFi.localIP());
How do I connect to a wireless network with the ESP32? | Wireless | MegunoLink
Create a simple Arduino library to store your WiFi network credentials. They’ll be easy to use and you won’t accidentally copy them to the Internet.
Esta pequeña guía me ayudó

Una vez conectados a la red, el siguiente paso importante era averiguar cómo realizar la comunicación por Internet, ya que es lo que necesitaba para poder hacer llamadas a la API de Calamari.

Esto, al igual que la conexión WiFi, no tiene mucha complicación ya que existen librerías que podemos usar para ayudarnos. En este caso usé la librería <HTTPClient.h>.

Para esta primera prueba de cómo hacer llamadas HTTP no quise complicarme con la API de Calamari aún, así que usé un servicio que ofrece una "falsa" API REST para probar: JSONPlaceholder.

#include "HTTPClient.h"

HTTPClient http;

http.begin("https://jsonplaceholder.typicode.com/posts/1");
int httpCode = http.GET();

if (httpCode > 0) {
  String response = http.getString();
  Serial.println(httpCode);
  Serial.println(response);
} else {
  Serial.println("Error on HTTP request: ");
  Serial.println(httpCode);
}

http.end();
ESP32 Arduino Tutorial: Getting weather data from API
In this esp32 tutorial, we will check how to use the ESP32 to request weather data from an API for a given city, using the Arduino core.
Esta guía me sirvió de ayuda

Con todo lo necesario para poder hacer peticiones a la API de Calamari.io, creé una clase para tener todo más ordenado y hacer mas sencillo el funcionamiento dentro del código. Me ayudé de este guía para hacerlo. Al final del artículo dejaré un link con todo el código en un repositorio de Github.

Para usar la clase solo necesitas crear una instancia y pasar cuatro argumentos, la URL base de la API de Calamari.io, el usuario y contraseña (información que proporciona Calamari cuando activas el uso de su API) y el email del empleado (en este caso mi email corporativo).

La clase dispone de seis métodos. Creo que los nombres son bastante descriptivos:

  • Jornada: shiftIsOn(), startShift(), stopShift()
  • Descanso: breakIsOn(), startLunchBreak(), stopLunchBreak()

Tras un poco de prueba y error hasta tenerlo todo funcionando solo me faltaba la parte hardware: un botón para empezar/acabar la jornada 👨🏽‍💻  y otro botón para empezar/acabar el descanso de la comida 🍕

Prototipo final con los dos botones
Prototipo final con los dos botones

Los dos botones tienen una de las patas conectadas a tierra a través de una resistencia, aquí puedes leer una buena explicación de por qué es necesario usar estas resistencias (pull-up o pull-down). Las patas del mismo lateral pero en la parte de abajo están conectadas a las entradas GPIO de la placa: 26 para el primer botón (el que empieza/termina el turno) y 27 para el segundo botón (el que empieza/termina la parada de comer). Y la pata de la derecha está conectada a la salida 3,3V.

Por último solo quedaba controlar la pulsación de los botones en el código y realizar la acción necesaria dependiendo del botón pulsado.

int pushShiftButton = digitalRead(26);
int pushBreakButton = digitalRead(27);

if(pushShiftButton) {
  if(calamari.shiftIsOn()) {
    Serial.println("Stop shift");
    calamari.stopShift();
  } else {
    Serial.println("Start shift");
    calamari.startShift();
  }

  delay(1000);
}

if(pushBreakButton) {
  if(calamari.breakIsOn()) {
    Serial.println("Stop lunch break");
    calamari.stopLunchBreak();
  } else {
    Serial.println("Start lunch break");
    calamari.startLunchBreak();
  }

  delay(1000);
}

Cuando se pulsa uno de los botones, por ejemplo el de la pausa para la comida, se comprueba si la pausa se está haciendo en ese momento. Si se está haciendo se llama al método para pararla, y si no pues al método para empezarla. Después se lanza una espera en el código de 1 segundo. Esto lo hice para evitar que el código se ejecute múltiples veces aunque solo hayamos pulsado el botón una vez, ya que este trozo de código está dentro de un bucle que se ejecuta más rápido que lo que tardamos en pulsar y quitar el dedo del botón.

Y esto es todo, aquí podéis ver como, de verdad, funciona 😁:

Prototipo funcional

Y aquí podéis ver el código completo en Github:

jvlobo/esp32-calamari.io-api
Clocking in and out in Calamari.io with the ESP32 development board - jvlobo/esp32-calamari.io-api

No os perdáis la segunda parte de este proyecto, dónde voy a diseña una caja en 3D, que después imprimiré, para hacer este sistema más compacto y portátil. También le pondré una batería para no tener que estar conectándolo mediante la entrada micro-usb de la placa ESP32.

Actualización: ¡la segunda parte ya está aquí! ⬇️

Sistema de control de horario laboral con ESP32 y Calamari.io - 1/2
Una forma más sencilla y divertida de registrar tus horas de trabajo con Calamari.io y la placa ESP32. Parte 2 de 2