UD03T03_DashboardIoT
03_Modelo
π¦ DESARROLLO DEL MODELO (IotModel.java)
π PASO 1: MODELO DE DATOS
π― Responsabilidad Γnica del Modelo
- Almacenar:
- InformaciΓ³n fija del sensor (nombre, modelo, ubicaciΓ³n).
- Valores actuales de temperatura, humedad y presiΓ³n.
- Valores mΓ‘ximos permitidos para cada magnitud.
- Mantener histΓ³ricos de valores para cada magnitud.
- Simular nuevas lecturas del sensor:
- Generar valores aleatorios realistas.
- Actualizar valores actuales.
- Guardar el histΓ³rico.
- Proporcionar los datos necesarios para el grΓ‘fico.
- Detectar cuΓ‘ndo un valor supera su umbral mΓ‘ximo.
π§± ESTRUCTURA COMPLETA DE LA CLASE
1.1. Constantes del Sensor
// =========================
// CONSTANTES DEL SENSOR
// =========================
private final String nombre = "Sonda Ambiental";
private final String modelo = "DHT-Pro + BMP";
private final String ubicacion = "Aula 2.1 (ventana)";
PropΓ³sito:Β InformaciΓ³n descriptiva del sensor fΓsico simulado.
DiseΓ±o:Β VariablesΒ finalΒ porque son caracterΓsticas fijas del dispositivo.
1.2. Umbrales de Alerta
// =========================
// UMBRALES (mΓ‘ximos)
// =========================
private static final double TEMP_MAX = 35.0; // Β°C
private static final double HUM_MAX = 80.0; // %
private static final double PRES_MAX = 1035.0; // hPa
PropΓ³sito:Β Valores mΓ‘ximos permitidos. Si se superan β generar alerta.
Criterios de diseΓ±o:
static final: Constantes compartidas por todas las instancias- Valores realistas basados en condiciones ambientales tΓpicas
- FΓ‘cilmente modificables para diferentes contextos
1.3. Estado Actual del Sensor
// =========================
// VALORES ACTUALES DEL SENSOR
// =========================
private double tempActual = 22.0;
private double humActual = 45.0;
private double presActual = 1015.0;
PropΓ³sito:Β Almacenar la ΓΊltima lectura generada.
Valores iniciales:Β Condiciones ambientales normales tΓpicas de interior:
- 22Β°C: Temperatura confortable
- 45%: Humedad moderada
- 1015 hPa: PresiΓ³n atmosfΓ©rica media a nivel del mar
1.4. Control de Tiempo
Variables explicadas:
| Variable | Tipo | PropΓ³sito |
|---|---|---|
tiempoSimulacion |
double | Tiempo transcurrido desde inicio (eje X grΓ‘fico) |
ultimaMedida |
LocalDateTime | Timestamp real de ΓΊltima lectura |
formatoFecha |
DateTimeFormatter | Formato "02/02/2026 15:30:45" |
1.5. ConfiguraciΓ³n de VisualizaciΓ³n
PropΓ³sito:
| Constante | Valor | FunciΓ³n |
|---|---|---|
MAX_PUNTOS_POR_SERIE |
200 | Solo se almacenarΓ‘n 200 valores en cada serie |
VENTANA_TIEMPO |
30.0s | Segundos visibles en grΓ‘fico simultΓ‘neamente (eje X) |
1.6. Constructor
/**
* Constructor: inicializa las series con sus nombres.
* Los nombres aparecerΓ‘n en la leyenda del grΓ‘fico.
*/
π§ MΓTODOS PRINCIPALES - DIAGRAMAS DE FLUJO
2.1. MΓ©todo generarLectura()
PropΓ³sito:Β Simular una nueva lectura del sensor con variaciones realistas.
Diagrama de Flujo Detallado:
ββββββββββββββββββββββββββββββββ
β generarLectura() β
ββββββββββββ¬ββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββββββ
β FASE 1: VARIACIONES NORMALES β
ββββββββββββββββ¦ββββββββββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββ
β tempActual = limitarRango( β
β tempActual + rnd(-0.8, 0.8), β
β 10, 40) β
β β
β ExplicaciΓ³n: β
β - Suma variaciΓ³n: -0.8Β°C a +0.8Β°C β
β - Limita resultado entre 10Β°C y 40Β°C β
ββββββββββββ¬ββββββββββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββ
β humActual = limitarRango( β
β humActual + rnd(-1.6, 1.6), β
β 20, 90) β
β β
β ExplicaciΓ³n: β
β - Suma variaciΓ³n: -1.6% a +1.6% β
β - Limita resultado entre 20% y 90% β
ββββββββββββ¬ββββββββββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββ
β presActual = limitarRango( β
β presActual + rnd(-1.1, 1.1), β
β 980, 1040) β
β β
β ExplicaciΓ³n: β
β - Suma variaciΓ³n: -1.1 a +1.1 hPa β
β - Limita entre 980 y 1040 hPa β
ββββββββββββ¬ββββββββββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββββββ
β FASE 2: PICOS ALEATORIOS (eventos) β
ββββββββββββββββ¦ββββββββββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββ
β ΒΏRandom < 0.05? (5% probabilidad) β
ββββββββββββ¬ββββββββββββββββββββββββββββ
SΓ βββ€ β NO
β β
β ββββββββββββββββ
ββββββββββββββββββββββ β
β tempActual += β β
β rnd(4, 8) β β
β β β
β (Pico: +4Β°C a +8Β°C)β β
β Simula: ventana β β
β abierta, sol β β
ββββββββββ¬ββββββββββββ β
β β
ββββββ β β β β β β ββ
β
β
ββββββββββββββββββββββββββββββββββββ
β ΒΏRandom < 0.05? (5% prob.) β
ββββββββββββ¬ββββββββββββββββββββββββββ
SΓ βββ€ β NO
β β
β ββββββββββββββββ
ββββββββββββββββββββββ β
β humActual += β β
β rnd(8, 15) β β
β β β
β (Pico: +8% a +15%) β β
β Simula: lluvia, β β
β vapor de agua β β
ββββββββββ¬ββββββββββββ β
β β
ββββββ β β β β β β ββ
β
β
ββββββββββββββββββββββββββββββββββββ
β ΒΏRandom < 0.05? (4% prob. aprox) β
ββββββββββββ¬ββββββββββββββββββββββββββ
SΓ βββ€ β NO
β β
β ββββββββββββββββ
ββββββββββββββββββββββββββ β
β presActual += β β
β rnd(8, 18) β β
β β β
β (Pico: +8 a +18 hPa) β β
β Simula: cambio β β
β meteorolΓ³gico β β
ββββββββββ¬ββββββββββββββββ β
β β
ββββββ β β β β β β ββ
β
β
ββββββββββββββββββββββββββββββββββββββββββββ
β FASE 3: ACTUALIZAR TIMESTAMP β
ββββββββββββββββ¦ββββββββββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββ
β ultimaMedida = LocalDateTime.now() β
β β
β Captura fecha/hora actual del sistemaβ
ββββββββββββββββββββββββββββββββββββββββ
β
β
(FIN)
CΓ³digo Completo:
/**
* Genera una nueva lectura del sensor con variaciones aleatorias.
*
* Algoritmo:
* 1. Aplica pequeΓ±as variaciones a cada magnitud
* 2. Limita los valores entre mΓnimos y mΓ‘ximos realistas
* 3. Aleatoriamente genera "picos" para simular eventos
* 4. Actualiza la marca de tiempo
*/
public void generarLectura() {
// FASE 1: Variaciones normales (pequeΓ±os cambios graduales)
tempActual = limitarRango(tempActual + rnd(-0.8, 0.8), 10, 40);
humActual = limitarRango(humActual + rnd(-1.6, 1.6), 20, 90);
presActual = limitarRango(presActual + rnd(-1.1, 1.1), 980, 1040);
// FASE 2: Picos aleatorios (simulan eventos repentinos)
if (ThreadLocalRandom.current().nextDouble() < 0.05) {
tempActual += rnd(4, 8); // Pico de temperatura
}
if (ThreadLocalRandom.current().nextDouble() < 0.05) {
humActual += rnd(8, 15); // Pico de humedad
}
if (ThreadLocalRandom.current().nextDouble() < 0.05) {
presActual += rnd(8, 18); // Pico de presiΓ³n
}
// FASE 3: Actualizar timestamp
ultimaMedida = LocalDateTime.now();
}
MΓ©todos Auxiliares:
/**
* Genera un nΓΊmero aleatorio en el rango [min, max).
* Usa ThreadLocalRandom para mejor rendimiento en entornos concurrentes.
*
* @param min Valor mΓnimo (inclusivo)
* @param max Valor mΓ‘ximo (exclusivo)
* @return NΓΊmero aleatorio en el rango
*/
private double rnd(double min, double max) {
return ThreadLocalRandom.current().nextDouble(min, max);
}
/**
* Limita un valor entre un mΓnimo y un mΓ‘ximo (clamp).
*
* @param v Valor a limitar
* @param min LΓmite inferior
* @param max LΓmite superior
* @return Valor limitado
*/
private double limitarRango(double v, double min, double max) {
return Math.max(min, Math.min(max, v));
}
ExplicaciΓ³n del algoritmo clamp:
Si v < min β retorna min
Si v > max β retorna max
Si min β€ v β€ max β retorna v
2.2. MΓ©todo agregarPuntosASeries()
PropΓ³sito:Β AΓ±adir los valores actuales a las series del grΓ‘fico, si los checkbox de la serie estΓ‘n seleccionados.
Diagrama de Flujo:
ββββββββββββββββββββββββββββββββββββββ
β agregarPuntosASeries( β
β tempHabilitada, β
β humHabilitada, β
β presHabilitada, β
β incrementoTiempo) β
βββββββββββ¬βββββββββββββββββββββββββββ
β
β
βββββββββββββββββββββββββββββββββββββββ
β actualizamos el tiempo de la |
| simulaciΓ³n con el nuevo incremento |
| de timepo |
β (Avanzar tiempo del eje X) β
βββββββββββ¬ββββββββββββββββββββββββββββ
β
β
βββββββββββββββββββββββββββββββββββββββ
β si el checkbox de la serie |
| correspondiente estΓ‘ marcado β
βββββββββ¬ββββββββββββββββββββββββββββββ
SΓ β€ β NO
β |
β βββββββββ
ββββββββββββββββββββββββββββ β
β AΓ±ade punto a la serie: β β
β (tiempo, temperatura) β β
ββββββββββββ¬ββββββββββββββββ β
β β
β β
ββββββββββββββββββββββββββ β
β Elimina puntos β β
β antiguos si tamaΓ±o>200 | β
ββββββββββββ¬ββββββββββββββ β
β β
ββββββ β β β β β β
β
β
βββββββββββββββββββββββββββββββββββ
β repetir para todos lo sensores β
ββββββ¬βββββββββββββββββββββββββββββ
SΓβ€ β NO
β β
[Mismo proceso] [Continuar]
| β
β β
ββββββ β β ββ
β
β
(FIN)
2.3. MΓ©todo recortarSerie()
PropΓ³sito:Β Evitar crecimiento infinito de memoria eliminando puntos antiguos.
Diagrama de Flujo:
βββββββββββββββββββββββββββββββββ
β recortarSerie(serie) β
ββββββββββββ¬βββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββββββββββββ
β tamaΓ±o de serie > MAX_PUNTOS_POR_SERIE |
ββββββββββββ¬ββββββββββββββββββββββββββββββ
SΓ βββ€ β NO
β β
β ββββββββββββ
ββββββββββββββββββββββββββββββ β (FIN)
β Si size=250 puntos: β β
β eliminar = 250 - 200 = 50β β
β Elimina primeros 50 β β
ββββββββββ¬ββββββββββββββββββββ β
β β
βββββββ β β β β β β β β
β
β
(FIN)
calcularLimiteInferiorX() y calcularLimiteSuperiorX()
PropΓ³sito:Β Crear efecto de "ventana deslizante" en el grΓ‘fico.
Diagrama de Flujo Combinado:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VENTANA DESLIZANTE - LΓGICA β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
FASE INICIAL (t β€ 30s):
ββββββββββββββββββββββββββββββββββββββββββ
β GrΓ‘fico muestra: [0s ββββββββ 30s] β
β Ventana FIJA al principio β
ββββββββββββββββββββββββββββββββββββββββββ
TRANSICIΓN (t = 35s):
ββββββββββββββββββββββββββββββββββββββββββ
β calcularLimiteInferiorX() β
β ββββββββββββββββββββββββββββββββββββββ β
β β ΒΏtiempoSimulacion > VENTANA_TIEMPO?β β
β β ΒΏ35 > 30? β β
β ββββββββββ¬ββββββββββββββββββββββββββββ β
β β SΓ β
β β β
β ββββββββββββββββββββββββββββββββββββββ β
β β return tiempoSimulacion - β β
β β VENTANA_TIEMPO β β
β β return 35 - 30 = 5s β β
β ββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββ
RESULTADO:
ββββββββββββββββββββββββββββββββββββββββββ
β GrΓ‘fico muestra: [5s ββββββββ 35s] β
β Ventana DESLIZANTE (se mueve) β
ββββββββββββββββββββββββββββββββββββββββββ
FASE AVANZADA (t = 60s):
ββββββββββββββββββββββββββββββββββββββββββ
β LimiteInferior: 60 - 30 = 30s β
β LimiteSuperior: 60s β
β GrΓ‘fico muestra: [30s βββββββ 60s] β
ββββββββββββββββββββββββββββββββββββββββββ
2.4. ValidaciΓ³n de Umbrales
MΓ©todos hayAlertaXXX()
PropΓ³sito:Β Detectar si alguna magnitud supera su umbral mΓ‘ximo.
MΓ©todos getMensajeAlertaXXX()
PropΓ³sito:Β Generar mensajes descriptivos para mostrar en la UI con los sigueitne formatos:
- "Temp = XX.X Β°C (mΓ‘x YY.Y)".
- "Hum = XX.X % (mΓ‘x YY.Y)"
- "Pres = XXXX.X hPa (mΓ‘x YYYY.Y)"
Ejemplos de salida:
"Temp = 36.2 Β°C (mΓ‘x 35.0)"
"Hum = 85.7 % (mΓ‘x 80.0)"
"Pres = 1038.4 hPa (mΓ‘x 1035.0)"
2.5. Formateo de Valores
MΓ©todos getXXXFormateada()
PropΓ³sito:Β Convertir valores numΓ©ricos a String con formato especΓfico para UI.
- NΓΊmeros con 1 decimal
- Fecha "dd/MM/yyyy HH:mm:ss"
2.6. MΓ©todo resetearDatos()
PropΓ³sito:Β Reiniciar toda la simulaciΓ³n a su estado inicial.
Diagrama de Flujo:
ββββββββββββββββββββββββββ
β resetearDatos() β
ββββββββββββ¬ββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββ
β (Eliminar TODOS los puntos β
β de la serie temperatura) β
ββββββββββββ¬ββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββ
β (Eliminar TODOS los puntos β
β de la serie humedad) β
ββββββββββββ¬ββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββ
β (Eliminar TODOS los puntos β
β de la serie presiΓ³n) β
ββββββββββββ¬ββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββ
β (Resetear contador tiempo) β
ββββββββββββ¬ββββββββββββββββββββ
β
β
ββββββββββββββββββββββββββββββββ
β (Borrar timestamp) β
ββββββββββββββββββββββββββββββββ
β
β
(FIN)
2.7. Getters BΓ‘sicos
PropΓ³sito: Proporcionar acceso de solo lectura a los atributos privados.