1
0
This repository has been archived on 2025-11-01. You can view files and clone it. You cannot open issues or pull requests or push a commit.
2025-05-10 15:08:39 +02:00
2025-05-10 15:08:39 +02:00
2025-05-10 15:08:39 +02:00
2025-03-11 20:05:17 +01:00
2025-05-10 15:08:39 +02:00

⚠ REQUISITOS PREVIOS (SÓLO DAD)

Para lanzar la API con Vert.X

  1. Run -> Run Configurations -> Java Application
  2. Como clase principal: io.vertx.core.Launcher
  3. Como argumentos: net.miarma.contaminus.server.MainVerticle

⚠ REQUISITOS PREVIOS (DAD + Hack4Change)

  • Descargar Node.js
    • Para descargar Node recomiendo fnm (Fast Node Manager) que lo podéis descargar aquí
    • Para instalarlo: fnm install 23.7.0

Para lanzar la web en modo desarrollador

  1. Abrir terminal (normalmente en VSCode) en la carpeta ContaminUS/frontend
  2. npm install
  3. npm run dev

Para transpilar la web de React a HTML/CSS/JS Vanilla

npm run build
La encontraréis en dist/

⚙️ Script para crear la BD

USE dad;

DROP TABLE IF EXISTS co_values;
DROP TABLE IF EXISTS weather_values;
DROP TABLE IF EXISTS gps_values;
DROP TABLE IF EXISTS actuators;
DROP TABLE IF EXISTS sensors;
DROP TABLE IF EXISTS devices;
DROP TABLE IF EXISTS groups;

CREATE TABLE IF NOT EXISTS groups(
	groupId INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
	groupName VARCHAR(64) DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS devices(
	deviceId CHAR(6) PRIMARY KEY NOT NULL,
	groupId INT NOT NULL,
	deviceName VARCHAR(64) DEFAULT NULL,
	FOREIGN KEY (groupId) REFERENCES groups(groupId) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS sensors(
	sensorId INT NOT NULL,
	deviceId CHAR(6) NOT NULL,
	sensorType VARCHAR(64) NOT NULL,
	unit VARCHAR(8) NOT NULL,
	status INT NOT NULL,
	timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
	PRIMARY KEY (deviceId, sensorId),
	FOREIGN KEY (deviceId) REFERENCES devices(deviceId) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS actuators (
	actuatorId INT NOT NULL,
	deviceId CHAR(6) NOT NULL,
	status INT NOT NULL,
	timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
	PRIMARY KEY (deviceId, actuatorId),
	FOREIGN KEY (deviceId) REFERENCES devices(deviceId) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS gps_values(
	valueId INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
	deviceId CHAR(6) NOT NULL,
	sensorId INT NOT NULL,
	lat FLOAT NOT NULL,
	lon FLOAT NOT NULL,
	timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
	FOREIGN KEY (deviceId, sensorId) REFERENCES sensors(deviceId, sensorId) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS weather_values (
	valueId INT PRIMARY KEY AUTO_INCREMENT NOT NULL ,
	deviceId CHAR(6) NOT NULL,
	sensorId INT NOT NULL,
	temperature FLOAT NOT NULL,
	humidity FLOAT NOT NULL,
	pressure FLOAT NOT NULL,
	timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
	FOREIGN KEY (deviceId, sensorId) REFERENCES sensors(deviceId, sensorId) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS co_values (
	valueId INT PRIMARY KEY AUTO_INCREMENT NOT NULL ,
	deviceId CHAR(6) NOT NULL,
	sensorId INT NOT NULL,
	value FLOAT NOT NULL,
	timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
	FOREIGN KEY (deviceId, sensorId) REFERENCES sensors(deviceId, sensorId) ON DELETE CASCADE
);

CREATE OR REPLACE VIEW v_sensor_values AS
SELECT 
    s.sensorId,
    s.deviceId,
    s.sensorType,
    s.unit,
    s.status AS sensorStatus,
    wv.temperature,
    wv.humidity,
    wv.pressure,
    cv.value AS carbonMonoxide,
    gv.lat,
    gv.lon,
    COALESCE(gv.timestamp, wv.timestamp, cv.timestamp) AS timestamp -- el primero no nulo
FROM sensors s
LEFT JOIN weather_values wv ON s.deviceId = wv.deviceId AND s.sensorId = wv.sensorId
LEFT JOIN co_values cv ON s.deviceId = cv.deviceId AND s.sensorId = cv.sensorId
LEFT JOIN gps_values gv ON s.deviceId = gv.deviceId AND s.sensorId = gv.sensorId;


CREATE OR REPLACE VIEW v_latest_values AS
SELECT 
    s.deviceId,
    s.sensorId,
    s.sensorType,
    s.unit,
    s.status AS sensorStatus,
    s.timestamp AS sensorTimestamp,
    wv.temperature,
    wv.humidity,
    wv.pressure,
    cv.value AS carbonMonoxide,
    gv.lat,
    gv.lon,
    COALESCE(gv.timestamp, wv.timestamp, cv.timestamp) AS airValuesTimestamp -- el primero no nulo
FROM sensors s
LEFT JOIN weather_values wv ON s.deviceId = wv.deviceId AND s.sensorId = wv.sensorId
LEFT JOIN co_values cv ON s.deviceId = cv.deviceId AND s.sensorId = cv.sensorId
LEFT JOIN gps_values gv ON s.deviceId = gv.deviceId AND s.sensorId = gv.sensorId
WHERE (wv.timestamp = (SELECT MAX(timestamp) FROM weather_values WHERE sensorId = s.sensorId)
       OR cv.timestamp = (SELECT MAX(timestamp) FROM co_values WHERE sensorId = s.sensorId)
		OR gv.timestamp = (SELECT MAX(timestamp) FROM gps_values WHERE sensorId = s.sensorId));


-- VISTAS AUXILIARES
CREATE OR REPLACE VIEW v_co_by_device AS
SELECT 
    s.deviceId,
    c.value AS carbonMonoxide,
    c.timestamp
FROM sensors s
JOIN co_values c ON s.deviceId = c.deviceId AND s.sensorId = c.sensorId
WHERE s.sensorType = 'CO';

CREATE OR REPLACE VIEW v_gps_by_device AS
SELECT 
    s.deviceId,
    g.lat,
    g.lon,
    g.timestamp
FROM sensors s
JOIN gps_values g ON s.deviceId = g.deviceId AND s.sensorId = g.sensorId
WHERE s.sensorType = 'GPS';

CREATE OR REPLACE VIEW v_weather_by_device AS
SELECT 
    s.deviceId,
    w.temperature AS temperature,
    w.humidity AS humidity,
    w.pressure AS pressure,
    w.timestamp
FROM sensors s
JOIN weather_values w ON s.deviceId = w.deviceId AND s.sensorId = w.sensorId
WHERE s.sensorType = 'Temperature & Humidity';
-- VISTAS AUXILIARES

CREATE OR REPLACE VIEW v_pollution_map AS
SELECT
    d.deviceId AS deviceId,
    d.deviceName AS deviceName,
    g.lat AS lat,
    g.lon AS lon,
    c.carbonMonoxide AS carbonMonoxide,
    c.timestamp AS timestamp
FROM
    (dad.devices d
LEFT JOIN dad.v_co_by_device c ON d.deviceId = c.deviceId)
LEFT JOIN dad.v_gps_by_device g ON d.deviceId = g.deviceId AND (g.timestamp <= c.timestamp OR g.timestamp IS NULL)
WHERE
    c.carbonMonoxide IS NOT NULL
ORDER BY
    d.deviceId,
    c.timestamp;

CREATE OR REPLACE VIEW v_sensor_history_by_device AS
SELECT
    d.deviceId AS deviceId,
    d.deviceName AS deviceName,
    w.temperature AS value,
    'temperature' AS valueType,
    w.timestamp AS timestamp
FROM
    dad.devices d
JOIN dad.v_weather_by_device w ON d.deviceId = w.deviceId
UNION ALL
SELECT
    d.deviceId AS deviceId,
    d.deviceName AS deviceName,
    w.humidity AS value,
    'humidity' AS valueType,
    w.timestamp AS timestamp
FROM
    dad.devices d
JOIN dad.v_weather_by_device w ON d.deviceId = w.deviceId
UNION ALL
SELECT
    d.deviceId AS deviceId,
    d.deviceName AS deviceName,
    w.pressure AS value,
    'pressure' AS valueType,
    w.timestamp AS timestamp
FROM
    dad.devices d
JOIN dad.v_weather_by_device w ON d.deviceId = w.deviceId
UNION ALL
SELECT
    d.deviceId AS deviceId,
    d.deviceName AS deviceName,
    c.carbonMonoxide AS value,
    'carbonMonoxide' AS valueType,
    c.timestamp AS timestamp
FROM
    dad.devices d
JOIN dad.v_co_by_device c ON d.deviceId = c.deviceId
ORDER BY
    deviceId,
    timestamp;

-- Insertar grupos
INSERT INTO groups (groupName) VALUES ('Grupo 1');

-- Insertar dispositivos
INSERT INTO devices (deviceId, groupId, deviceName) VALUES
('6A6098', 1, 'Dispositivo 1');

-- Sensores para el Dispositivo 6A6098
INSERT INTO sensors (sensorId, deviceId, sensorType, unit, status) VALUES
(1, '6A6098', 'GPS', 'N/A', 1),
(2, '6A6098', 'Temperature & Humidity', '°C/%', 1),
(3, '6A6098', 'CO', 'ppm', 1);

-- ACtuadores para el Dispositivo 6A6098
INSERT INTO actuators (actuatorId, deviceId, status, timestamp) VALUES
(1, '6A6098', 1, CURRENT_TIMESTAMP());
Description
Project developed for Hack4Change 2025, hosted at the School of Computer Engineering (ETSII) – University of Seville. Made in React + Java + C++.
Readme MPL-2.0 7.1 MiB
Languages
Java 63.6%
JavaScript 22.1%
C++ 9.8%
CSS 2.9%
Python 1.1%
Other 0.5%