En silencio

Ciclo del ruido: el arco de un color es el tiempo que suena y el otro el silencio. El punto marca el momento actual.
–:––
cargando

…–

…–

Suena – Silencio – Se repite cada –

API pública

Lee el estado del temporizador desde otra app, un script o un dispositivo como un ESP32. No necesita autenticación y acepta peticiones desde cualquier sitio (CORS abierto).

Estado actual

GET /api/state

El estado ya calculado. Es lo más simple para un dispositivo: no necesita reloj sincronizado.

Cargando respuesta en vivo…
activetrue si está sonando.
seconds_to_changeSegundos hasta que pase de sonar a silencio, o al revés.
positionSegundos transcurridos dentro del ciclo; el ciclo empieza cuando arranca el ruido.
progressAvance de 0 a 1 dentro de la fase actual.
server_timeHora del servidor en milisegundos (epoch), para corregir relojes desfasados.
configDuraciones y ancla, para seguir contando sin volver a preguntar.

Configuración

GET /api/config

Devuelve cycle_duration y active_duration en segundos, y anchor: el instante (milisegundos epoch, UTC) en que empezó un ciclo de ruido. Con eso se calcula todo:

posición = ((ahora − anchor) / 1000) mod cycle_duration
sonando  = posición < active_duration

Ejemplo para ESP32 (Arduino)

Consulta cada 30 a 60 segundos y cuenta localmente con seconds_to_change mientras tanto.

HTTPClient http;
http.begin("/api/state");
if (http.GET() == 200) {
  JsonDocument doc;                       // ArduinoJson
  deserializeJson(doc, http.getString());
  bool active = doc["active"];
  float secondsToChange = doc["seconds_to_change"];
  // encender un LED o actualizar una pantalla
}
http.end();

Cambiar la configuración

Solo el administrador puede cambiarla, desde /admin con inicio de sesión. Un dispositivo puede escribir si se le da un service token de Cloudflare Access.