domingo, 18 de agosto de 2024

Shelly Scripting: Ejemplo de la librería de Shelly

En este artículo voy a cargar un Script de la librería de Shelly y configurarlo para que se ejecute en un Shelly Plug Plus S. El script se denomina Router Watchdog y su función es la de resetear el router si detecta que este se ha quedado "colgado". Para ello el script intenta ejecutar solicitudes HTTP GET dentro de un tiempo determinado, a un conjunto de servidores. Después de una cierta cantidad de fallos de conexión, el script apaga el relé y después de un tiempo lo vuelve a encender. Para ello voy a enchufar mi router al Shelly. 


Si quieres colaborar con el desarrollo del blog puedes hacerlo adquiriendo uno de estos dispositivos en Amazon España a través del siguiente enlace:

En este artículo no voy a explicar el código del script, tan solo voy a explicar como cargarlo en el dispositivo. Para empezar, averiguamos la dirección IP del Shelly utilizando la app y accedemos utilizando un navegador web.


Seleccionamos Library, buscamos el script Router Watchdog y seleccionamos Import Code.


En ese momento, nos muestra el código del script (he eliminado los comentarios que son las líneas que empiezan por //).

let CONFIG = {
  endpoints: [
    "https://global.gcping.com/ping",
    "https://us-central1-5tkroniexa-uc.a.run.app/ping",
  ],
  numberOfFails: 3,
  httpTimeout: 10,
  toggleTime: 30,
  pingTime: 60,
};

let endpointIdx = 0;
let failCounter = 0;
let pingTimer = null;

function pingEndpoints() {
  Shelly.call(
    "http.get",
    { url: CONFIG.endpoints[endpointIdx], timeout: CONFIG.httpTimeout },
    function (response, error_code, error_message) {
      if (error_code === -114 || error_code === -104) {
        print("Failed to fetch ", CONFIG.endpoints[endpointIdx]);
        failCounter++;
        print("Rotating through endpoints");
        endpointIdx++;
        endpointIdx = endpointIdx % CONFIG.endpoints.length;
      } else {
        failCounter = 0;
      }

      if (failCounter >= CONFIG.numberOfFails) {
        print("Too many fails, resetting...");
        failCounter = 0;
        Timer.clear(pingTimer);
        Shelly.call(
          "Switch.Set",
          { id: 0, on: false, toggle_after: CONFIG.toggleTime },
          function () {}
        );
        return;
      }
    }
  );
}

print("Start watchdog timer");
pingTimer = Timer.set(CONFIG.pingTime * 1000, true, pingEndpoints);

Shelly.addStatusHandler(function (status) {
  if(status.name !== "switch") return;
  if(status.id !== 0) return;
  if(typeof status.delta.source === "undefined") return;
  if(status.delta.source !== "timer") return;
  if(status.delta.output !== true) return;
  pingTimer = Timer.set(CONFIG.pingTime * 1000, true, pingEndpoints);
});

Cuando importamos el script nos indica además que podemos habilitar la consola. Es interesante hacerlo porque podemos ver los reportes o log que envía el script (comandos print).

Bajo el nombre del script tenemos tres opciones:

  • Save: Cargamos el script en el dispositivo
  • Snippets: Nos muestra una especie de resumen de los comandos disponibles para realizar nuestros scripts y nos permite insertar su código en nuestro script.
  • Docs: Enlace que nos lleva a la documentación técnica sobre los script de Shelly.

Seleccionamos Save y el script se guarda en nuestro dispositivo. Además, nos aparecen dos nuevas opciones:

  • Start: que nos permite ejecutar el script.
  • Delete: Nos permite borrar el script de nuestro dispositivo.

Si seleccionamos Start la consola nos muestra el mensaje que se ha puesto en marcha el script y la hora en que se ha producido.


Si seleccionamos Script en el menú lateral podemos ver que hemos cargado el script Router Watchdog y podemos seleccionar si queremos que se ejecute cada vez que el dispositivo se alimenta. También nos muestra el estado en que se encuentra el script (en este caso se está ejecutando)


Desde esta misma ventana podemos parar el script haciendo click en el botón Status.


Breve explicación del código

Los puntos finales a los que intenta acceder son los siguientes:

Si accedo a esos servicios con un navegador web, el primero me devuelve europe-southwest1 y, el segundo, us-central1. Son servicios que miden la latencia de mi conexión con las regiones de Google Cloud, que son aquellas zonas donde Google tiene centros de datos y devuelven la zona donde existe menos latencia.

Otros parámetros que se definen en el script son los siguientes:

  • numberOfFails: Número de fallos consecutivos que producirá el apagado y encendido del relé, en este caso 3 fallos.
  • httpTimeout: tiempo que permanecerá apagado el relé, en este caso 10 segundos
  • toggleTime: tiempo que transcurrirá entre las peticiones HTTP GET después de producirse un fallo, en este caso 30 segundos. Como el número de fallos son 3 significa que esperará un minuto y medio antes de apagar el relé.
  • pingTime: nos define cada cuanto tiempo realizará una petición HTTP GET, en este caso cada 60 segundos.
Estos parámetros podemos modificarlos editando el script.

Resumen

Como puedes ver, es muy sencillo cargar un script predefinido en la librería de Shelly en nuestro dispositivo. Te invito a que investigues qué hacen el resto de scripts de la librería y pruebes a instalar alguno de ellos si te es de utilidad. Yo voy a dejar instalado éste en mi Shelly Plus Plug S y que controle mi router.


No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.