Skip to content

Commit

Permalink
add sqlite
Browse files Browse the repository at this point in the history
  • Loading branch information
lmtreser committed Aug 2, 2024
1 parent 320d603 commit 848c6f3
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 0 deletions.
97 changes: 97 additions & 0 deletions server/sqlite/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# SQLite

*SQLite* es una biblioteca en lenguaje C que implementa un motor de base de datos SQL pequeño, rápido, autónomo, de alta confiabilidad y con todas las funciones. SQLite es el motor de base de datos más utilizado en el mundo, está integrado en todos los teléfonos móviles y la mayoría de las computadoras y viene incluido en innumerables otras aplicaciones que las personas usan todos los días.

El formato de archivo SQLite es estable, multiplataforma y compatible con versiones anteriores y los desarrolladores se comprometen a mantenerlo así hasta el año 2050. Los archivos de base de datos SQLite se utilizan comúnmente como contenedores para transferir contenido enriquecido entre sistemas y como un formato de archivo a largo plazo para datos. El código fuente de SQLite es de dominio público y es gratuito para que todos lo usen para cualquier propósito.

## Diseñar una base de datos para domótica

Los requisitos elementales para montar un pequeño servidor de domótica son los siguientes:

- *Dispositivos:* son unicos, dependiendo el tipo reciben o devuelven un valor float o boolean, poseen marca, modelo y número de serie, estan ubicados en algún ambiente en particular y generan eventos.

- *Eventos:* asociados tanto a sensores como actuadores. Tienen que describir la ocurrencia del evento (causa, timestamp, etc.).

- *Ambientes:* lugares físicos donde se instalarán los diversos sensores y actuadores.

Por lo tanto, deberemos tener cuatro tablas relacionadas:

- Ambientes: almacena información sobre los distintos ambientes del hogar.
- Dispositivos: almacena información sobre los sensores y actuadores.
- Eventos: registra los eventos generados por sensores y actuadores.

## Diseño de tablas con drawDB

![Tablas](tablas.png)

## Consultas SQL (CREATE)

```sql
CREATE TABLE IF NOT EXISTS "ambientes" (
"am_id" INTEGER NOT NULL UNIQUE,
"am_nombre" TEXT NOT NULL,
PRIMARY KEY("am_id")
);
```

```sql
CREATE TABLE IF NOT EXISTS "dispositivos" (
"di_id" INTEGER NOT NULL UNIQUE,
"di_tipo" TEXT NOT NULL CHECK(di_tipo IN ('sensor', 'actuador')),
"di_marca" TEXT NOT NULL,
"di_modelo" TEXT NOT NULL,
"di_serial" TEXT NOT NULL UNIQUE,
"di_descripcion" TEXT,
"di_am_id" INTEGER,
PRIMARY KEY("di_id"),
FOREIGN KEY ("di_am_id") REFERENCES "ambientes"("am_id")
ON UPDATE NO ACTION ON DELETE NO ACTION
);
```

```sql
CREATE TABLE IF NOT EXISTS "eventos" (
"ev_id" INTEGER NOT NULL UNIQUE,
"ev_tipo_evento" TEXT NOT NULL,
"ev_timestamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"ev_am_id" INTEGER,
"ev_di_id" INTEGER,
"ev_valor" REAL,
"ev_descripcion" TEXT,
PRIMARY KEY("ev_id"),
FOREIGN KEY ("ev_am_id") REFERENCES "ambientes"("am_id")
ON UPDATE NO ACTION ON DELETE NO ACTION
);
```

## Consultas SQL (INSERT)

Insertar ambientes:

```sql
INSERT INTO ambientes (am_nombre) VALUES ('Habitación');
INSERT INTO ambientes (am_nombre) VALUES ('Cocina');
```

Insertar dispositivos:

```sql
INSERT INTO dispositivos (di_tipo, di_marca, di_modelo, di_serial, di_descripcion, di_am_id) VALUES
('actuador', 'Sonoff', 'Basic R2', '21-5387', 'Relé interruptor WiFi', 2),
('sensor', 'Analog Devices', 'DS18B20', '19-7487', 'Sensor de temperatura ambiente', 2);
```

Insertar eventos:

```sql
INSERT INTO eventos (ev_tipo_evento, ev_am_id, ev_di_id, ev_valor, ev_descripcion) VALUES
('Cambio de temperatura', 2, 1, 23.0, 'La temperatura subió a 23.0°C'),
('Actuador activado', 2, 2, 1, 'El actuador fue activado');
```

## Recursos

- [SQLite](https://www.sqlite.org/)
- [DB Browser for SQLite](https://sqlitebrowser.org/)
- [drawDB](https://www.drawdb.app/)
- [SQLite with Node-RED and Raspberry Pi](https://randomnerdtutorials.com/sqlite-with-node-red-and-raspberry-pi/)
34 changes: 34 additions & 0 deletions server/sqlite/domotica_CREATE.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
-- Crear tabla AMBIENTES
CREATE TABLE IF NOT EXISTS "ambientes" (
"am_id" INTEGER NOT NULL UNIQUE,
"am_nombre" TEXT NOT NULL,
PRIMARY KEY("am_id")
);

-- Crear tabla DISPOSITIVOS
CREATE TABLE IF NOT EXISTS "dispositivos" (
"di_id" INTEGER NOT NULL UNIQUE,
"di_tipo" TEXT NOT NULL CHECK(di_tipo IN ('sensor', 'actuador')),
"di_marca" TEXT NOT NULL,
"di_modelo" TEXT NOT NULL,
"di_serial" TEXT NOT NULL UNIQUE,
"di_descripcion" TEXT,
"di_am_id" INTEGER,
PRIMARY KEY("di_id"),
FOREIGN KEY ("di_am_id") REFERENCES "ambientes"("am_id")
ON UPDATE NO ACTION ON DELETE NO ACTION
);

-- Crear tabla EVENTOS
CREATE TABLE IF NOT EXISTS "eventos" (
"ev_id" INTEGER NOT NULL UNIQUE,
"ev_tipo_evento" TEXT NOT NULL,
"ev_timestamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"ev_am_id" INTEGER,
"ev_di_id" INTEGER,
"ev_valor" REAL,
"ev_descripcion" TEXT,
PRIMARY KEY("ev_id"),
FOREIGN KEY ("ev_am_id") REFERENCES "ambientes"("am_id")
ON UPDATE NO ACTION ON DELETE NO ACTION
);
13 changes: 13 additions & 0 deletions server/sqlite/domotica_INSERT.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-- Insertar ambientes
INSERT INTO ambientes (am_nombre) VALUES ('Habitación');
INSERT INTO ambientes (am_nombre) VALUES ('Cocina');

-- Insertar dispositivos
INSERT INTO dispositivos (di_tipo, di_marca, di_modelo, di_serial, di_descripcion, di_am_id) VALUES
('actuador', 'Sonoff', 'Basic R2', '21-5387', 'Relé interruptor WiFi', 2),
('sensor', 'Analog Devices', 'DS18B20', '19-7487', 'Sensor de temperatura ambiente', 2);

-- Insertar eventos
INSERT INTO eventos (ev_tipo_evento, ev_am_id, ev_di_id, ev_valor, ev_descripcion) VALUES
('Cambio de temperatura', 2, 1, 23.0, 'La temperatura subió a 23.0°C'),
('Actuador activado', 2, 2, 1, 'El actuador fue activado');
Binary file added server/sqlite/domotica_lite
Binary file not shown.
Binary file added server/sqlite/tablas.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 848c6f3

Please sign in to comment.