Shell interactivo (REPL) para la base de datos de series temporales SensorWave.
SensorWave Shell proporciona una interfaz de línea de comandos tipo SQL para interactuar con bases de datos SensorWave, permitiendo:
- Crear y gestionar series temporales
- Insertar y consultar datos
- Administrar reglas del motor de reglas
- Operaciones locales sin necesidad de configuración de red
- Consultas globales a través del despachador en la nube
El shell soporta dos modos de operación:
Conexión directa a una base de datos local con acceso completo a todas las operaciones:
- Crear, modificar y eliminar series
- Insertar datos
- Consultar datos
- Gestionar reglas
swshell -db ./mi_base_datosConexión al despachador para consultas globales distribuidas. En este modo solo están disponibles operaciones de lectura:
- Consultar datos (
SELECT) - Listar series (
LIST SERIES) - Describir series (
DESCRIBE) - Listar nodos conectados (
LIST NODES) - Ver estado (
STATUS)
swshell -dispatcher http://despachador:8080Nota: Los comandos de escritura (CREATE, DROP, INSERT) no están disponibles en modo despachador.
- Go 1.21 o superior
git clone https://github.com/cbiale/sensorwave-shell.git
cd sensorwave-shell
go build -o swshell ./cmd/swshellgo install github.com/cbiale/sensorwave-shell/cmd/swshell@latest# Sin conexión (modo interactivo)
swshell
# Modo edge: conectar a base de datos local
swshell ./mi_base_datos
swshell -db ./datos
# Modo despachador: conectar a la nube
swshell -dispatcher http://despachador:8080| Opción | Descripción |
|---|---|
-db <path> |
Ruta a la base de datos local (modo edge) |
-dispatcher <url> |
URL del despachador (modo nube, solo lectura) |
-version |
Mostrar versión |
-help |
Mostrar ayuda |
-- Conectar a base de datos local (modo edge)
USE ./mi_base_datos
-- Conectar a base de datos con tags iniciales
USE ./mi_base_datos TAGS nombre=invernadero,zona=norte
-- Conectar al despachador (modo nube)
CONNECT http://despachador:8080
-- Desconectar del despachador
DISCONNECTLos tags permiten asociar metadatos a la base de datos (nombre, ubicación, zona, etc.). Estos tags se sincronizan automáticamente con S3 cuando está configurado.
-- Ver tags actuales de la base de datos
SHOW TAGS
-- Establecer tags de la base de datos
SET TAGS nombre=invernadero,ubicacion=sala1,zona=norte
-- Actualizar tags (reemplaza todos los existentes)
SET TAGS nombre=sensor_nuevo,ubicacion=exterior
-- Eliminar todos los tags
SET TAGS NONENota: Los tags se persisten en PebbleDB y se mantienen entre reinicios.
-- Crear una serie
CREATE SERIES sensor01/temperatura TYPE Real COMPRESSION Xor BLOCK_COMPRESSION LZ4
-- Crear serie con tags
CREATE SERIES sensor01/temperatura TYPE Real TAGS ubicacion=sala1,tipo=DHT22
-- Listar todas las series
LIST SERIES
-- Listar series por patrón
LIST SERIES sensor01/*
-- Ver detalles de una serie
DESCRIBE sensor01/temperatura
-- Eliminar una serie
DROP SERIES sensor01/temperatura| Tipo | Descripción |
|---|---|
Boolean |
Valores true/false |
Integer |
Números enteros (int64) |
Real |
Números de punto flotante (float64) |
Text |
Cadenas de texto |
Nivel 1 (valores):
| Algoritmo | Descripción | Tipos compatibles |
|---|---|---|
SinCompresion |
Sin compresión | Todos |
DeltaDelta |
Delta-of-delta | Integer, Real |
Xor |
XOR (Gorilla) | Real |
RLE |
Run-Length Encoding | Todos |
Bits |
Compresión de bits | Integer |
Diccionario |
Codificación por diccionario | Text |
Nivel 2 (bloques):
| Algoritmo | Descripción |
|---|---|
Ninguna |
Sin compresión |
LZ4 |
Rápido, compresión moderada |
ZSTD |
Mejor compresión, más lento |
Snappy |
Muy rápido, compresión baja |
Gzip |
Compatible, compresión moderada |
-- Insertar con timestamp automático (now)
INSERT INTO sensor01/temperatura VALUES (23.5)
-- Insertar con timestamp específico
INSERT INTO sensor01/temperatura VALUES (now, 23.5)
INSERT INTO sensor01/temperatura VALUES ('now-1h', 22.0)
INSERT INTO sensor01/temperatura VALUES (1704067200, 21.5)
-- Insertar diferentes tipos
INSERT INTO motor01/estado VALUES (true)
INSERT INTO contador/total VALUES (42)
INSERT INTO dispositivo/status VALUES ('activo')-- Consultar datos (últimas 24 horas por defecto)
SELECT * FROM sensor01/temperatura
-- Consultar con rango de tiempo
SELECT * FROM sensor01/temperatura WHERE time > now-1h
SELECT * FROM sensor01/temperatura WHERE time > now-24h AND time < now
-- Limitar resultados
SELECT * FROM sensor01/temperatura LIMIT 100
-- Último punto
SELECT LAST FROM sensor01/temperatura
-- Múltiples agregaciones
SELECT AVG, MAX, MIN, COUNT FROM sensor/temp WHERE time > 'now-1h'
-- Con GROUP BY (downsampling)
SELECT AVG, MAX, MIN FROM sensor/temp WHERE time > 'now-24h' GROUP BY 1h| Agregación | Descripción |
|---|---|
AVG |
Promedio |
MAX |
Máximo |
MIN |
Mínimo |
SUM |
Suma |
COUNT |
Cantidad de puntos |
| Formato | Ejemplo |
|---|---|
now |
Momento actual |
now-Xh |
X horas atrás |
now-Xd |
X días atrás |
| Unix segundos | 1704067200 |
| Unix milisegundos | 1704067200000 |
| Unix nanosegundos | 1704067200000000000 |
| ISO 8601 | 2024-01-01T12:00:00 |
| Fecha/hora | 2024-01-01 12:00:00 |
-- Listar reglas
LIST RULES
-- Crear una regla
CREATE RULE alerta_temp
WHEN AVG(sensor/temp) > 30 WINDOW 5m
THEN LOG 'temperatura_alta'
-- Crear regla con múltiples condiciones
CREATE RULE regla_critica
WHEN AVG(sensor/temp) > 30 WINDOW 5m
AND COUNT(sensor/temp) > 10 WINDOW 5m
THEN LOG 'condicion_multiple'
-- Crear regla con acción de publicación
CREATE RULE control_ventilador
WHEN AVG(*/temp) > 28 WINDOW 5m
THEN PUBLICAR_MQTT 'actuadores/{serie_0}/ventilador' WITH comando=encender
-- Eliminar una regla
DROP RULE alerta_temperatura
-- Habilitar motor de reglas
ENABLE RULES
-- Deshabilitar motor de reglas
DISABLE RULES-- Listar nodos conectados al despachador
LIST NODES-- Ver estado del sistema
STATUS
-- Cambiar base de datos (modo edge)
USE ./otra_base_datos
-- Conectar al despachador (modo nube)
CONNECT http://despachador:8080
-- Desconectar del despachador
DISCONNECT
-- Limpiar pantalla
CLEAR
-- Ayuda
HELP
HELP create
HELP select
-- Salir
EXIT
QUIT
\qCuando se conecta al despachador, las consultas se distribuyen a todos los nodos edge registrados. Si algún nodo no responde (por problemas de red, mantenimiento, etc.), el shell muestra una advertencia indicando qué nodos no estuvieron disponibles:
sensorwave(dispatcher)> SELECT * FROM sensor/* WHERE time > now-1h
Serie │ Tiempo │ Valor
───────────────┼───────────────────────────┼───────
nodo1/sensor/t │ 2026-01-05 10:30:00 │ 25.3
nodo2/sensor/t │ 2026-01-05 10:30:00 │ 23.1
⚠ Advertencia: Los siguientes nodos no respondieron: nodo3, nodo4
Esto permite identificar problemas de conectividad y saber que los resultados pueden estar incompletos.
- Modo dual: Conexión a base de datos local (edge) o despachador (nube)
- Autocompletado: Presione TAB para autocompletar comandos
- Historial: Las flechas arriba/abajo navegan el historial de comandos
- Colores: Salida con colores para mejor legibilidad
- Formato tabla: Resultados mostrados en tablas formateadas
- Advertencias: Indicación de nodos no disponibles en consultas globales
- SensorWave - Base de datos de series temporales
- readline - Biblioteca readline para Go
- color - Colores en terminal
- tablewriter - Tablas ASCII
MIT License
Claudio Omar Biale - Universidad de Buenos Aires