Skip to content

DDD-001: Modelo de Dominio - Mush2 ​


Metadatos ​

CampoValor
IDDDD-001
NombreModelo de Dominio Mush2
Fecha2026-07-14
Versión1.0
EstadoBorrador
AutorEquipo Mush2

1. Resumen Ejecutivo ​

Este documento define el Modelo de Dominio de Mush2 mediante los principios de Domain-Driven Design (DDD). Establece el Lenguaje Ubicuo, identifica los Contextos Limitados, define los Agregados, Objetos de Valor, Eventos de Dominio y Máquinas de Estado que conforman la arquitectura conceptual del sistema.

Mush2 es una plataforma IoT de cultivo micológico inteligente que combina hardware físico (cámaras biológicas con sensores y actuadores) con una aplicación web full-stack para monitoreo, control y asesoría con IA.


2. Lenguaje Ubicuo (Ubiquitous Language) ​

El Lenguaje Ubicuo es el corazón de DDD. Términos precisos que desarrolladores, expertos del negocio y usuarios comparten sin ambigüedad.

2.1 Dominio Principal: Cultivo Micológico ​

TérminoDefiniciónEjemplo
CultivoCiclo completo de crecimiento de hongos en cámara controlada, desde inoculación hasta cosecha final"El cultivo de Shiitake #12 duró 45 días"
CámaraRecinto físico controlado donde se realizan los cultivos, equipado con sensores y actuadores"Cámara A tiene 2m³ de volumen"
EspecieVariedad de hongo con características biológicas específicas que determinan los parámetros de cultivo"Hericium erinaceus requiere alta humedad"
Cepa (Strain)Variación genética dentro de una especie, puede afectar rendimiento y requisitos"CEP-001 es una cepa resistente"

2.2 Ciclo de Cultivo ​

TérminoDefinición
FaseEtapa del ciclo de cultivo con parámetros climáticos específicos. Fases: Incubación → Fructificación → Mantenimiento → Completado
IncubaciónFase inicial donde el micelio coloniza el sustrato. Alta humedad, temperatura estable, baja ventilación
FructificaciónFase donde aparecen los cuerpos fructificantes (hongos). Requiere FAE (Fresh Air Exchange), luz, variación térmica
MantenimientoFase de producción sostenida con flushes (cosechas parciales) recurrentes
FlushCosecha parcial de hongos dentro de un ciclo, separada por períodos de reposo
Transición de FaseCambio de una fase a otra, puede ser automática, semiautomática o manual

2.3 Parámetros Climáticos ​

TérminoDefiniciónUnidad
TemperaturaGrado calórico del aire en la cámara°C
HumedadPorcentaje de saturación de vapor de agua en el aire%RH
CO₂Dióxido de carbono, indicador de actividad metabólica y necesidad de ventilaciónppm
VOCCompuestos Orgánicos Volátiles, indicador de calidad de aireppb
VPDDéficit de Presión de Vapor, indicador compuesto de estrés hídricokPa
SetPointRango de valores ideales (mínimo y máximo) para un parámetro en una fase específica—
UmbralLímite que al ser superado genera una alarma—
HistéresisMargen de tolerancia para evitar oscilaciones en el control de actuadores±1.0°C

2.4 Hardware ​

TérminoDefinición
Dispositivo (Device)Controlador IoT ESP32-S3 que gestiona sensores y actuadores de una cámara
SensorDispositivo de medición (Temperatura, Humedad, CO₂, VOC). Puede estar en estado ACTIVE, INACTIVE o FAULT
Actuador (SSR)Solid State Relay que controla equipmento: ventilador, calefactor, humidificador, luz
CanalCanal de salida del actuador (0-3), cada uno controla un equipo diferente
Modo Local/RemoteSi el actuador responde a comandos del motor de control (REMOTE) o a operación manual (LOCAL)

2.5 Control y Automatización ​

TérminoDefinición
Motor de Control (ControlEngine)Sistema que evalúa el estado del cultivo cada 60 segundos y genera comandos para actuadores
Regla de TransiciónCondición que determina cuándo un cultivo debe cambiar de fase (basada en tiempo, sensores o manual)
Sustain ConditionCondición que debe mantenerse por un tiempo mínimo para validarse (ej: CO₂ < 800ppm por 60 minutos)
Modo de AdaptaciónMANUAL (sin automación), SEMI_AUTO (sugiere pero espera aprobación), FULL_AUTO (ejecuta automáticamente)
Fail-SafeMecanismo de seguridad que activa ventilación y desactiva calefacción si temperatura > 32°C

2.6 Alertas y Monitoreo ​

TérminoDefinición
Alarma (Alarm)Notificación de condición anormal con severidad (LOW, MEDIUM, HIGH, CRITICAL)
SeveridadNivel de urgencia calculado desde la desviación del valor actual respecto al rango permitido
Reconocimiento (Acknowledge)Acción de un operador confirmando que ha visto una alarma
ResoluciónAcción que marca una alarma como atendida cuando la condición normaliza
DeduplicaciónRegla: solo una alarma activa por (dispositivo, tipo, tipo_sensor)

2.7 Telemetría y Datos ​

TérminoDefinición
TelemetríaRegistro temporal de lecturas de sensores con valor, unidad y timestamp
Ciclo de Estado (CycleState)Snapshot periódico del estado completo de un ciclo (temp, hum, CO₂, VOC, VPD, estados de actuadores)
Retención de DatosPolítica de purga según plan: FREE=30d, BASIC=90d, PREMIUM=365d

2.8 Usuarios y Seguridad ​

TérminoDefinición
Rol de SistemaNivel de permiso global: SUPER_ADMIN (100) > ADMIN (80) > OPERATOR (50) > VIEWER (10)
Rol de CámaraNivel de acceso por cámara: OWNER, EDITOR, VIEWER
SuscripciónPlan SaaS que define límites: FREE, BASIC, PREMIUM
API KeyClave de acceso para integraciones, con hash, whitelist de IP y permisos

3. Contextos Limitados (Bounded Contexts) ​

Los Contextos Limitados definen fronteras semánticas donde un término tiene un significado preciso y no se confunde con otros contextos.

3.1 Mapa de Contextos ​

┌─────────────────────────────────────────────────────────────────────────┐
│                         MUSH2                                   │
│                    Plataforma IoT de Cultivo Inteligente                │
├─────────────────┬─────────────────┬─────────────────┬───────────────────┤
│                 │                 │                 │                   │
│   CULTIVO       │   MONITOREO     │   CONTROL       │   USUARIOS        │
│   (Cultivation) │   (Monitoring)  │   (Control)     │   (Identity)      │
│                 │                 │                 │                   │
│  Ciclos de      │  Sensores y     │  Motor de       │  Autenticación    │
│  crecimiento    │  telemetría     │  automatización │  Autorización     │
│                 │                 │                 │                   │
│  Recetas y      │  Alertas y      │  Actuadores     │  Suscripciones    │
│  perfiles       │  notificaciones │  y comandos     │  y facturación    │
│                 │                 │                 │                   │
│  Especies y     │  Salud del      │  Lógica de      │  Multi-tenant     │
│  fases          │  hardware       │  control        │  y RBAC           │
│                 │                 │                 │                   │
└─────────────────┴─────────────────┴─────────────────┴───────────────────┘

3.2 Contexto: Cultivo ​

Responsabilidad: Gestionar el ciclo de vida completo de los cultivos micológicos, desde la planificación hasta la finalización.

Lenguaje del contexto:

  • Cultivo, Ciclo, Fase, Receta, Especie, Cepa
  • Incubación, Fructificación, Mantenimiento
  • Transición, Aprobación, Adaptación

Entidades principales:

  • CultivationCycle (Raíz de Agregado): Representa un ciclo activo o completado
  • Recipe: Perfil climático reutilizable con umbrales por fase
  • SpeciesProfile: Conocimiento micológico de cada especie
  • PhaseTransition: Registro de cambios de fase con workflow de aprobación

Dependencias externas:

  • Recibe datos del contexto Monitoreo (lecturas de sensores)
  • Envía comandos al contexto Control (transiciones de fase)
  • Consulta datos del contexto Usuarios (permisos, suscripción)

3.3 Contexto: Monitoreo ​

Responsabilidad: Recopilar, almacenar y analizar datos de sensores y estado del hardware en tiempo real.

Lenguaje del contexto:

  • Telemetría, Lectura, Sensor, Dispositivo
  • Alarma, Severidad, Desconexión
  • Salud, Uptime, Memoria

Entidades principales:

  • Sensor: Dispositivo de medición con tipo y estado
  • Telemetry: Registro temporal de lecturas
  • Alarm: Notificación de condición anormal
  • DeviceHealth: Métricas de salud del ESP32

Dependencias externas:

  • Recibe datos del contexto Control (comandos ejecutados)
  • Alimenta datos al contexto Cultivo (para evaluación de transiciones)
  • Notifica al contexto Usuarios (via Telegram, SSE)

3.4 Contexto: Control ​

Responsabilidad: Ejecutar la lógica de automatización que mantiene las condiciones óptimas para el cultivo.

Lenguaje del contexto:

  • Motor de Control, Evaluar, Computar
  • Actuador, Comando, Canal
  • Histéresis, Fuzzy, Fail-Safe
  • Sustain, Trigger, Transición

Entidades principales:

  • Actuator: Dispositivo de salida con estado y modo
  • Event: Registro de cambios de estado del sistema
  • ControlEngine: Servicio que orquesta el ciclo de control
  • PhaseEvaluator: Servicio que evalúa reglas de transición

Dependencias externas:

  • Recibe datos del contexto Monitoreo (lecturas actuales)
  • Consulta el contexto Cultivo (receta activa, fase actual)
  • Envía comandos al hardware físico (via MQTT/WebSocket)

3.5 Contexto: Usuarios (Identity) ​

Responsabilidad: Gestionar identidad, autorización, suscripciones y configuración de usuarios.

Lenguaje del contexto:

  • Usuario, Rol, Permisos
  • Suscripción, Plan, Límites
  • API Key, Token, Acceso
  • Cámara (como recurso accesible)

Entidades principales:

  • User: Cuenta de usuario con rol y preferencias
  • Subscription: Plan SaaS con límites de uso
  • ApiKey: Clave de acceso para integraciones
  • UserChamberAccess: Matriz de permisos por cámara

Dependencias externas:

  • Es consultado por todos los demás contextos para autorización
  • No depende de otros contextos (es un contexto base)

4. Agregados y Raíces de Agregado ​

Un Agrupado es un cluster de objetos tratados como unidad para cambios de datos. La Raíz de Agregado es la única entrada al agrupado, garantizando la consistencia transaccional.

4.1 Agrupado: CultivationCycle ​

Raíz: CultivationCycle

CultivationCycle (Raíz)
├── id: number
├── userId: UUID
├── device: Device (referencia)
├── recipe: Recipe (referencia)
├── species: string
├── strain: string
├── status: CycleStatus
├── currentPhase: CultivationPhase
├── phaseStartedAt: Date
├── adaptationConfig: AdaptationConfig
├── notes: text
│
├── PhaseTransition[] (entidades internas)
│   ├── id: number
│   ├── fromPhase: CultivationPhase
│   ├── toPhase: CultivationPhase
│   ├── triggerType: TriggerType
│   ├── triggerData: JSON
│   ├── status: TransitionStatus
│   ├── approvedBy: UUID
│   └── executedAt: Date
│
├── CycleState[] (entidades internas)
│   ├── timestamp: Date
│   ├── temperature: number
│   ├── humidity: number
│   ├── co2: number
│   ├── voc: number
│   ├── vpd: number
│   └── actuatorStates: JSON
│
└── BioactiveProfile[] (entidades internas)
    ├── compounds: JSON
    └── analysisDate: Date

Invariantes:

  1. Solo un ciclo puede estar en estado ACTIVE por dispositivo
  2. Un ciclo COMPLETED o ABORTED no puede cambiar de estado
  3. La fase actual debe ser válida según la secuencia: INCUBATION → FRUITING → MAINTENANCE → COMPLETED
  4. No se puede iniciar un ciclo sin receta válida
  5. Un ciclo PLANNED puede ser abortado, pero un ciclo ACTIVE solo puede completarse o abortarse

Transiciones de Estado del Ciclo:

PLANNED ──[Iniciar]──> ACTIVE ──[Completar]──> COMPLETED
    │                       │
    └──[Abortar]──> ABORTED └──[Abortar]──> ABORTED

4.2 Agrupado: Recipe ​

Raíz: Recipe

Recipe (Raíz)
├── id: number
├── userId: UUID
├── name: string
├── species: string
├── speciesId: number (referencia a SpeciesProfile)
│
├── IncubationThreshold (Value Object embebido)
│   ├── tempMin: Temperature
│   ├── tempMax: Temperature
│   ├── humMin: Humidity
│   ├── humMax: Humidity
│   ├── co2Max: CO2Level
│   └── durationDays: Duration
│
├── FruitingThreshold (Value Object embebido)
│   ├── tempMin: Temperature
│   ├── tempMax: Temperature
│   ├── humMin: Humidity
│   ├── humMax: Humidity
│   ├── co2Max: CO2Level
│   └── durationDays: Duration
│
├── MaintenanceThreshold (Value Object embebido)
│   ├── tempMin: Temperature
│   ├── tempMax: Temperature
│   ├── humMin: Humidity
│   ├── humMax: Humidity
│   └── co2Max: CO2Level
│
├── VentilationStrategy: enum (TIMER, CO2_TRIGGER, HYBRID)
├── FaeLevel: enum (LOW, MEDIUM, HIGH)
├── lightCycleHours: number
├── faeIntervalMinutes: number
└── dewPointMaxRH: Humidity

Invariantes:

  1. Toda receta debe tener al menos una fase definida (Incubación)
  2. Los rangos de temperatura deben ser coherentes (min < max)
  3. Los rangos de humedad deben ser coherentes (min < max)
  4. El nombre de la receta debe ser único por usuario
  5. La especie debe correspondrer a un SpeciesProfile válido

4.3 Agrupado: Device ​

Raíz: Device

Device (Raíz)
├── id: number
├── macAddress: MACAddress (Value Object)
├── deviceId: string (identificador único del hardware)
├── firmwareVersion: FirmwareVersion (Value Object)
├── hwRevision: string
├── status: DeviceStatus
├── lastSeen: Date
├── userId: UUID (propietario)
├── chamberId: number (referencia)
├── chamberName: string
├── chamberLocation: string
├── ssrActiveLow: boolean
│
├── Sensor[] (entidades internas)
│   ├── id: number
│   ├── type: SensorType
│   └── status: SensorStatus
│
├── Actuator[] (entidades internas)
│   ├── id: number
│   ├── channel: number
│   ├── state: ActuatorState
│   ├── mode: ActuatorMode
│   └── overrideUntil: Date
│
├── DeviceHealth[] (entidades internas)
│   ├── heapFree: number
│   ├── stackSizes: JSON
│   ├── i2cHealth: JSON
│   └── uptime: number
│
├── TelegramDeviceConfig (Value Object embebido)
│   ├── enabled: boolean
│   └── chatId: string
│
├── ThingSpeakConfig (Value Object embebido)
│   ├── enabled: boolean
│   ├── channelId: string
│   └── readKey: string
│
└── IntegrationCredentials[] (entidades internas)
    ├── service: string
    └── credentials: encrypted JSON

Invariantes:

  1. Un dispositivo con un cultivo ACTIVE no puede ser eliminado
  2. La dirección MAC debe ser única en el sistema
  3. El estado solo puede transicionar: OFFLINE → ONLINE → ERROR/MAINTENANCE → ONLINE
  4. Un dispositivo en estado ERROR no puede ejecutar comandos de control

4.4 Agrupado: Alarm ​

Raíz: Alarm

Alarm (Raíz)
├── id: number
├── deviceId: number (referencia)
├── type: AlarmType
├── severity: AlarmSeverity
├── message: string
├── sensorType: SensorType
├── currentValue: number
├── thresholdMin: number
├── thresholdMax: number
├── isAcknowledged: boolean
├── acknowledgedBy: UUID
├── acknowledgedAt: Date
├── resolvedAt: Date
├── metadata: JSON

Invariantes:

  1. Solo puede existir una alarma activa por combinación (deviceId, type, sensorType)
  2. Una alarma RESOLVADA no puede ser modificada
  3. Solo SUPER_ADMIN o ADMIN pueden resolver alarmes CRITICAL
  4. La severidad debe ser calculada, no asignada manualmente

Transiciones de Estado:

ACTIVE ──[Reconocer]──> ACKNOWLEDGED ──[Resolver]──> RESOLVED

4.5 Agrupado: User ​

Raíz: User

User (Raíz)
├── id: UUID
├── email: string
├── password: string (hash)
├── firstName: string
├── lastName: string
├── role: SystemRole
├── isActive: boolean
├── deletedAt: Date (soft delete)
│
├── Subscription (Value Object embebido)
│   ├── plan: PlanType (FREE, BASIC, PREMIUM)
│   ├── apiCallsUsed: number
│   ├── apiCallsLimit: number
│   ├── dataRetentionDays: number
│   └── periodEnd: Date
│
├── UserPreference (Value Object embebido)
│   ├── theme: string
│   ├── language: string
│   └── telegramEnabled: boolean
│
├── ApiKey[] (entidades internas)
│   ├── id: number
│   ├── key: string (hashed)
│   ├── permissions: string[]
│   ├── ipWhitelist: string[]
│   └── expiresAt: Date
│
└── UserChamberAccess[] (entidades internas)
    ├── chamberId: number
    ├── deviceId: number
    └── role: ChamberAccessRole (OWNER, EDITOR, VIEWER)

Invariantes:

  1. El email debe ser único en el sistema
  2. Un usuario con plan FREE no puede exceder 1000 llamadas API/mes
  3. La eliminación de usuario es soft delete (preserva datos)
  4. Un usuario SUPER_ADMIN no puede ser desactivado

5. Objetos de Valor (Value Objects) ​

Los Value Objects son inmutables y se identifican por su valor, no por identidad.

5.1 Value Objects de Dominio ​

Value ObjectPropiedadesReglasEjemplo
Temperaturevalue: number, unit: 'C' | 'F'Rango: -40°C a 85°CTemperature(22.5, 'C')
Humiditypercentage: numberRango: 0-100%Humidity(85.0)
CO2Levelppm: numberMínimo: 400ppm (aire ambiente)CO2Level(800)
VOCLevelppb: numberMínimo: 0ppbVOCLevel(150)
VPDvalue: numberRango óptimo: 0.4-1.2 kPaVPD(0.85)
SetPointmin: Temperature, max: Temperaturemin < maxSetPoint(20, 24)
PhaseThresholdtemp: SetPoint, hum: SetPoint, co2: CO2Level, durationDays: DurationTodos los campos requeridosVer Recipe
Durationdays: numberPositivo, no nuloDuration(14)
MACAddressvalue: stringFormato XX:XX:XX:XX:XX:XXMACAddress('A4:CF:12:8B:3D:01')
FirmwareVersionmajor: number, minor: number, patch: numberSemántica de versionesFirmwareVersion(2, 1, 0)
CultivationPhasename: enumSolo valores válidosCultivationPhase('INCUBATION')
CycleStatusname: enumSolo valores válidosCycleStatus('ACTIVE')
DeviceStatusname: enumSolo valores válidosDeviceStatus('ONLINE')
AlarmSeveritylevel: enumSolo valores válidosAlarmSeverity('HIGH')
AdaptationConfigmode: enum, sensorBasedTrigger: boolean—AdaptationConfig('SEMI_AUTO', true)

5.2 Value Objects de Configuración ​

Value ObjectPropiedadesDescripción
VentilationStrategytype: 'TIMER' | 'CO2_TRIGGER' | 'HYBRID'Estrategia de ventilación de la receta
FaeLevellevel: 'LOW' | 'MEDIUM' | 'HIGH'Nivel de intercambio de aire fresco
SensorTypetype: 'TEMPERATURE' | 'HUMIDITY' | 'CO2' | 'VOC'Tipo de sensor físico
TriggerTypetype: 'TIME' | 'SENSOR' | 'MANUAL' | 'SENSOR_SUGGESTED'Tipo de trigger de transición
TransitionStatusstatus: 'PENDING' | 'APPROVED' | 'EXECUTED' | 'REJECTED'Estado del workflow de aprobación
SystemRolelevel: 100 | 80 | 50 | 10Jerarquía de permisos
ChamberAccessRolerole: 'OWNER' | 'EDITOR' | 'VIEWER'Nivel de acceso por cámara

5.3 Value Objects de Identidad ​

Value ObjectPropiedadesDescripción
UUIDvalue: stringIdentificador único universal
EmailAddressvalue: stringEmail válido con formato estándar
ApiKeyHashvalue: stringHash SHA-256 de la API key
JWTTokenvalue: stringToken JWT con payload y firma

6. Máquinas de Estado (State Machines) ​

6.1 CultivationCycle - Estado del Ciclo ​

mermaid
stateDiagram-v2
    [*] --> PLANNED : Crear Ciclo
    
    state PLANNED {
        PLANNED : Puede ser abortado
    }
    
    PLANNED --> ACTIVE : Iniciar [recetaValida && sensoresCalibrados]
    PLANNED --> ABORTED : Abortar
    
    state ACTIVE {
        ACTIVE : Evalúa cada 60s
        ACTIVE : Controla actuadores
    }
    
    ACTIVE --> COMPLETED : Completar [faseFinal reached]
    ACTIVE --> ABORTED : Abortar [criticalAlarm]
    
    state COMPLETED
    state ABORTED
    
    COMPLETED --> [*]
    ABORTED --> [*]

6.2 Fases del Ciclo (CurrentPhase) ​

mermaid
stateDiagram-v2
    [*] --> INCUBATION : Iniciar Cultivo
    
    state INCUBATION {
        INCUBATION : Alta humedad
        INCUBATION : Baja ventilación
        INCUBATION : Temperatura estable
    }
    
    INCUBATION --> FRUITING : Transición [sensor/time/manual]
    
    state FRUITING {
        FRUITING : FAE alto
        FRUITING : Luz activa
        FRUITING : Variación térmica
    }
    
    FRUITING --> MAINTENANCE : Transición [tiempo]
    
    state MAINTENANCE {
        MAINTENANCE : Producción sostenida
        MAINTENANCE : Flushes recurrentes
    }
    
    MAINTENANCE --> COMPLETED : Finalizar
    
    state COMPLETED
    
    COMPLETED --> [*]

6.3 Device - Estado del Dispositivo ​

mermaid
stateDiagram-v2
    [*] --> OFFLINE : Registrar
    
    state OFFLINE {
        OFFLINE : Sin conexión
    }
    
    OFFLINE --> ONLINE : Conectar [heartbeat]
    OFFLINE --> MAINTENANCE : Mantener
    
    state ONLINE {
        ONLINE : Operando normalmente
    }
    
    ONLINE --> OFFLINE : Desconectar [timeout]
    ONLINE --> ERROR : Error [sensor/hardware fault]
    ONLINE --> MAINTENANCE : Mantener [firmware update]
    
    state ERROR {
        ERROR : Requiere intervención
    }
    
    ERROR --> ONLINE : Recuperar [reinicio]
    ERROR --> OFFLINE : Reiniciar
    
    state MAINTENANCE {
        MAINTENANCE : Actualización en curso
    }
    
    MAINTENANCE --> ONLINE : Completar [update success]
    MAINTENANCE --> OFFLINE : Reiniciar

6.4 Alarm - Ciclo de Vida ​

mermaid
stateDiagram-v2
    [*] --> ACTIVE : Generar [condición anormal]
    
    state ACTIVE {
        ACTIVE : Esperando reconocimiento
    }
    
    ACTIVE --> ACKNOWLEDGED : Reconocer [operador]
    ACTIVE --> RESOLVED : Resolver [condición normaliza]
    
    state ACKNOWLEDGED {
        ACKNOWLEDGED : Vista por operador
    }
    
    ACKNOWLEDGED --> RESOLVED : Resolver [condición normaliza]
    
    state RESOLVED {
        RESOLVED : Cerrada permanentemente
    }
    
    RESOLVED --> [*]

6.5 PhaseTransition - Workflow de Aprobación ​

mermaid
stateDiagram-v2
    [*] --> PENDING : Sugerir Transición
    
    state PENDING {
        PENDING : Esperando aprobación
    }
    
    PENDING --> APPROVED : Aprobar [supervisor]
    PENDING --> REJECTED : Rechazar [supervisor]
    PENDING --> EXECUTED : Ejecutar [auto mode]
    
    state APPROVED {
        APPROVED : Lista para ejecutar
    }
    
    APPROVED --> EXECUTED : Ejecutar
    APPROVED --> REJECTED : Rechazar
    
    state EXECUTED {
        EXECUTED : Fase cambiada
    }
    
    state REJECTED {
        REJECTED : Transición denegada
    }
    
    EXECUTED --> [*]
    REJECTED --> [*]

6.6 Actuator - Modo de Operación ​

mermaid
stateDiagram-v2
    [*] --> REMOTE : Iniciar
    
    state REMOTE {
        REMOTE : Controlado por ControlEngine
    }
    
    REMOTE --> LOCAL : Override Manual [5 min]
    
    state LOCAL {
        LOCAL : Controlado por usuario
        LOCAL : Se restaura automáticamente
    }
    
    LOCAL --> REMOTE : Timeout [5 min] / Manual

7. Eventos de Dominio (Domain Events) ​

Los Eventos de Dominio representan hechos significativos que ocurrieron en el sistema. Son inmutables y se publican para notificar a otros contextos.

7.1 Eventos del Contexto Cultivo ​

EventoDescripciónDatosSuscriptores
CultivoCreadoNuevo ciclo planificadocycleId, userId, recipeId, speciesAuditLog
CultivoIniciadoCiclo comenzó a ejecutarsecycleId, deviceId, startDateControlEngine, Telegram
CultivoCompletadoCiclo finalizado exitosamentecycleId, endDate, totalFlushesTelegram, BioactiveAnalyzer
CultivoAbortadoCiclo terminado por error/críticacycleId, reason, abortedByTelegram, AuditLog
FaseCambiadaTransición de fase ejecutadacycleId, fromPhase, toPhase, triggerTypeControlEngine, Telegram
RecetaAplicadaReceta asignada a un ciclocycleId, recipeId, previousRecipeIdAuditLog
TransicionFaseSugeridaIA sugiere cambio de fasecycleId, suggestedPhase, confidence, reasonTelegram, Frontend (SSE)

7.2 Eventos del Contexto Monitoreo ​

EventoDescripciónDatosSuscriptores
LecturaSensorRecibidaNuevo dato de telemetríadeviceId, sensorType, value, unit, timestampControlEngine, ThingSpeakSync
AlarmaGeneradaCondición fuera de rango detectadaalarmId, deviceId, type, severity, sensorTypeTelegram, Frontend (SSE)
AlarmaReconocidaOperador confirmó alarmaalarmId, deviceId, acknowledgedByAuditLog, Frontend (SSE)
AlarmaResueltaCondición normalizadaalarmId, deviceId, resolvedAtAuditLog, Frontend (SSE)
SensorDesconectadoSensor deja de reportardeviceId, sensorType, lastReadingAlarm, Telegram
DispositivoConectadoDevice vuelve onlinedeviceId, firmwareVersionAuditLog
DispositivoDesconectadoDevice perdió conexióndeviceId, lastSeenAlarm, Telegram

7.3 Eventos del Contexto Control ​

EventoDescripciónDatosSuscriptores
ComandoActuadorEnviadoOrden enviada a hardwaredeviceId, channel, state, modeAuditLog
EstadoActuadorActualizadoCambio confirmado por hardwaredeviceId, channel, previousState, newStateFrontend (SSE)
CicloControlEjecutadoEval completada (cada 60s)deviceId, readings, commands, alarmsFrontend (SSE)
FailSafeActivadoProtección por temperatura críticadeviceId, temperature, actionTelegram, Alarm
TransicionFaseEjecutadaFase cambiada automáticamentecycleId, fromPhase, toPhaseCultivo, Telegram

7.4 Eventos del Contexto Usuarios ​

EventoDescripciónDatosSuscriptores
UsuarioRegistradoNuevo usuario creadouserId, email, roleAuditLog
UsuarioAutenticadoLogin exitosouserId, timestamp, ipAddressAuditLog
SuscripcionCambiadaPlan actualizadouserId, previousPlan, newPlanAuditLog, Telegram
ApiKeyCreadaNueva clave generadauserId, apiKeyId, permissionsAuditLog
ApiKeyRotadaClave rotadauserId, apiKeyId, previousKeyIdAuditLog

7.5 Flujo de Eventos: Transición Automática de Fase ​

mermaid
sequenceDiagram
    participant CE as ControlEngine
    participant PE as PhaseEvaluator
    participant CC as CultivationCycle
    participant PT as PhaseTransition
    participant EB as EventBus
    participant TG as Telegram
    participant FE as Frontend

    loop Cada 60 segundos
        CE->>CE: Obtener sensores y receta
        CE->>PE: evaluatePhaseTransition(cycle, readings, recipe)
        
        alt Transición Sugerida (SEMI_AUTO)
            PE-->>EB: TransicionFaseSugerida
            EB->>TG: Notificar al operador
            EB->>FE: SSE event
        else Transición Automática (FULL_AUTO)
            PE->>PT: Crear PhaseTransition(EXECUTED)
            PE->>CC: Actualizar currentPhase
            PE-->>EB: FaseCambiada
            EB->>TG: Notificar cambio
            EB->>FE: SSE event
        end
    end

8. Servicios de Dominio ​

8.1 Domain Services (Lógica pura de negocio) ​

ServicioResponsabilidadInputOutput
PhaseEvaluatorEvalúa reglas de transición según especie y fase actualcycle, readings, recipeshouldTransition, suggestedPhase
SeverityCalculatorCalcula severidad desde desviación de valoresvalue, min, maxAlarmSeverity
VPDCalculatorCalcula Déficit de Presión de Vaportemperature, humidityVPD
AlarmDeduplicatorVerifica si ya existe alarma activa similardeviceId, type, sensorTypeboolean
PhaseThresholdExtractorExtrae umbrales de receta según faserecipe, phasePhaseThreshold
SustainConditionCheckerVerifica si condición se mantiene por tiempo mínimosensorHistory, operator, value, minutesboolean

8.2 Application Services (Orquestación) ​

ServicioResponsabilidadDominio que orquesta
ControlEngineEvalúa y ejecuta el ciclo de control cada 60sControl + Monitoreo + Cultivo
MQTTBridgeGestiona conexión bidireccional con hardwareControl + Monitoreo
WebSocketServerPush de estado a dispositivos en tiempo realControl
TelegramServiceEnvía notificaciones y gestiona botTodos
ThingSpeakSyncSincroniza telemetría con ThingSpeakMonitoreo
AuditServiceRegistra acciones en audit trailUsuarios
DataRetentionJobPurga datos según política de retenciónMonitoreo + Usuarios
EncryptionServiceCifra/descifra credenciales de integraciónMonitoreo

9. Reglas de Negocio e Invariantes ​

9.1 Reglas de Cultivo ​

IDReglaContextoSeveridad
CULT-001Solo un ciclo activo por dispositivoCultivoCRITICAL
CULT-002No iniciar cultivo sin sensores calibradosCultivoHIGH
CULT-003Secuencia obligatoria de fases: INCUBATION → FRUITING → MAINTENANCE → COMPLETEDCultivoCRITICAL
CULT-004Un ciclo COMPLETED o ABORTED es inmutableCultivoCRITICAL
CULT-005Todo cultivo debe tener una receta válida asociadaCultivoHIGH

9.2 Reglas de Recetas ​

IDReglaContextoSeveridad
RECI-001Toda receta debe tener al menos una fase (Incubación) definidaCultivoHIGH
RECI-002Rangos de temperatura deben ser coherentes (min < max)CultivoMEDIUM
RECI-003Rangos de humedad deben ser coherentes (min < max)CultivoMEDIUM
RECI-004Nombre de receta único por usuarioCultivoLOW

9.3 Reglas de Transición de Fase ​

IDReglaContextoSeveridad
TRAN-001Modo MANUAL no permite transiciones automáticasControlHIGH
TRAN-002Modo SEMI_AUTO requiere aprobación humanaControlHIGH
TRAN-003Modo FULL_AUTO ejecuta transiciones automáticamenteControlMEDIUM
TRAN-004Sustain condition: valor debe mantenerse por N minutosControlHIGH
TRAN-005La transición debe seguir la secuencia de fasesControlCRITICAL

9.4 Reglas de Alarmas ​

IDReglaContextoSeveridad
ALRM-001Solo una alarma activa por (deviceId, type, sensorType)MonitoreoHIGH
ALRM-002Severidad calculada desde desviación: >3=CRITICAL, >1.5=HIGH, resto=MEDIUMMonitoreoMEDIUM
ALRM-003Alarmas CRITICAL requieren SUPER_ADMIN o ADMIN para resolverMonitoreoHIGH
ALRM-004Al resolver condición, alarma se resuelve automáticamenteMonitoreoMEDIUM

9.5 Reglas de Control ​

IDReglaContextoSeveridad
CTRL-001Fail-Safe: si temp ≥ 32°C, ventilación ON, calefacción OFFControlCRITICAL
CTRL-002Histéresis de ±1.0°C para evitar oscilacionesControlHIGH
CTRL-003Humidificador bloqueado durante ventilaciónControlHIGH
CTRL-004Override manual dura 5 minutos máximoControlMEDIUM
CTRL-005Evaluación del control cada 60 segundosControlMEDIUM

9.6 Reglas de Hardware ​

IDReglaContextoSeveridad
HARD-001Dispositivo ERROR no ejecuta comandos de controlControlCRITICAL
HARD-002Dispositivo con cultivo ACTIVE no puede ser eliminadoCultivoHIGH
HARD-003Dirección MAC única en el sistemaMonitoreoHIGH
HARD-004Firmware incompatible bloquea operaciónControlHIGH

9.7 Reglas de Usuarios y Suscripciones ​

IDReglaContextoSeveridad
USER-001Email único en el sistemaUsuariosHIGH
USER-002Plan FREE: máximo 1000 llamadas API/mesUsuariosMEDIUM
USER-003Plan BASIC: máximo 10000 llamadas API/mesUsuariosMEDIUM
USER-004Plan PREMIUM: máximo 100000 llamadas API/mesUsuariosLOW
USER-005Retención de datos: FREE=30d, BASIC=90d, PREMIUM=365dUsuariosLOW
USER-006SUPER_ADMIN no puede ser desactivadoUsuariosHIGH

10. Diagrama de Contexto de Arquitectura ​

                              ┌─────────────────────────┐
                              │      FIRMWARE           │
                              │   ESP32-S3 + FreeRTOS   │
                              │                         │
                              │  Sensores: AHT21,ENS160 │
                              │  Actuadores: SSR 4ch    │
                              └───────────┬─────────────┘
                                          │
                            MQTT (pub/sub) │ WebSocket
                                          │
                              ┌───────────▼─────────────┐
                              │      CONTROL            │
                              │      CONTEXT            │
                              │                         │
                              │  ┌───────────────────┐  │
                              │  │  ControlEngine    │  │
                              │  │  - evaluate()     │  │
                              │  │  - computeCmds()  │  │
                              │  │  - failSafe()     │  │
                              │  └───────────────────┘  │
                              │                         │
                              │  ┌───────────────────┐  │
                              │  │  PhaseEvaluator   │  │
                              │  │  - evaluate()     │  │
                              │  │  - execute()      │  │
                              │  └───────────────────┘  │
                              │                         │
                              │  ┌───────────────────┐  │
                              │  │  EventBus         │  │
                              │  │  (Emitter)        │  │
                              │  └───────────────────┘  │
                              └───────────┬─────────────┘
                                          │
                 ┌────────────────────────┼────────────────────────┐
                 │                        │                        │
    ┌────────────▼──────────┐  ┌──────────▼──────────┐  ┌─────────▼──────────┐
    │      CULTIVO          │  │     MONITOREO       │  │     USUARIOS       │
    │      CONTEXT          │  │     CONTEXT         │  │     CONTEXT        │
    │                       │  │                     │  │                    │
    │  CultivationCycle     │  │  Sensor             │  │  User              │
    │  Recipe               │  │  Telemetry          │  │  Subscription      │
    │  SpeciesProfile       │  │  Alarm              │  │  ApiKey            │
    │  PhaseTransition      │  │  DeviceHealth       │  │  UserChamberAccess │
    │  CycleState           │  │  AuditLog           │  │  UserPreference    │
    │  BioactiveProfile     │  │                     │  │                    │
    └───────────────────────┘  └─────────────────────┘  └────────────────────┘
                 │                        │                        │
                 │                        │                        │
    ┌────────────▼────────────────────────▼────────────────────────▼──────────┐
    │                           PERSISTENCIA                                  │
    │                                                                         │
    │   PostgreSQL (Sequelize ORM)                                            │
    │   - cultivation_cycles    - recipes          - species_profiles         │
    │   - phase_transitions     - sensors          - telemetries              │
    │   - cycle_states          - alarms           - device_health            │
    │   - devices               - actuators        - events                   │
    │   - users                 - subscriptions    - api_keys                 │
    │   - audit_logs            - user_chamber_access                         │
    └─────────────────────────────────────────────────────────────────────────┘
                                          │
                              ┌───────────▼─────────────┐
                              │      EXTERNOS           │
                              │                         │
                              │  Telegram Bot API       │
                              │  ThingSpeak API         │
                              │  Google Gemini API      │
                              └─────────────────────────┘

11. Glossario de Abreviaturas ​

AbreviaturaSignificado
DDDDomain-Driven Design
VPDVapor Pressure Deficit (Déficit de Presión de Vapor)
FAEFresh Air Exchange (Intercambio de Aire Fresco)
CO₂Dióxido de Carbono
VOCVolatile Organic Compounds (Compuestos Orgánicos Volátiles)
SSRSolid State Relay
MQTTMessage Queuing Telemetry Transport
SSEServer-Sent Events
RBACRole-Based Access Control
IoTInternet of Things
ESP32microcontroller by Espressif
I2CInter-Integrated Circuit (protocolo de comunicación)
OTAOver-The-Air (actualización remota de firmware)

12. Referencias ​

DocumentoContenido
DDD-002Bounded Contexts - Detalle de contextos y sus fronteras
DDD-003Agregados - Especificación detallada de agregados
DDD-004Value Objects - Catálogo completo de objetos de valor
DDD-005Máquinas de Estado - Diagramas y reglas de transición
DDD-006Eventos de Dominio - Catálogo y flujos de eventos
DDD-007Roadmap de Migración - Plan de implementación

13. Historial de Cambios ​

VersiónFechaAutorCambios
1.02026-07-14Equipo Mush2Creación del documento

Documento generado como parte del proceso de Domain-Driven Design de Mush2.

Mush2 — Sistema IoT de control ambiental