[
  {
    "key": "room_type",
    "section": "Cámara",
    "label": "Tipo de cámara",
    "type": "select",
    "unit": null,
    "default": "modular",
    "min": null,
    "max": null,
    "options": [
      {
        "value": "modular",
        "label": "Cámara frigorífica modular"
      },
      {
        "value": "armario",
        "label": "Armario frigorífico modular"
      },
      {
        "value": "vidrio",
        "label": "Armario expositor"
      },
      {
        "value": "obra",
        "label": "Cámara de obra"
      },
      {
        "value": "industrial",
        "label": "Cámara industrial"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Tipología de la cámara. Cambiarlo reinicia el cálculo a valores por defecto (manteniendo localización)."
  },
  {
    "key": "room_ins",
    "section": "Cámara",
    "label": "Espesor de aislamiento",
    "type": "number",
    "unit": "mm",
    "default": 100,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Espesor del panel aislante de la envolvente."
  },
  {
    "key": "room_floor",
    "section": "Cámara",
    "label": "Aislamiento del suelo",
    "type": "radio",
    "unit": null,
    "default": "yes",
    "min": null,
    "max": null,
    "options": [
      {
        "value": "yes",
        "label": "Sí"
      },
      {
        "value": "no",
        "label": "No"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "¿El suelo está aislado? Si no, el espesor de suelo se considera 0."
  },
  {
    "key": "room_L",
    "section": "Cámara",
    "label": "Largo (interior)",
    "type": "number",
    "unit": "m",
    "default": 2,
    "min": 0.1,
    "max": 200,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "room_A",
      "room_V"
    ],
    "visibleWhen": null,
    "description": "Dimensión interior. Excluyente con el volumen: si fijas L y A, el volumen se recalcula."
  },
  {
    "key": "room_A",
    "section": "Cámara",
    "label": "Fondo (interior)",
    "type": "number",
    "unit": "m",
    "default": 3,
    "min": 0.1,
    "max": 200,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "room_L",
      "room_V"
    ],
    "visibleWhen": null,
    "description": "Dimensión interior. Excluyente con el volumen."
  },
  {
    "key": "room_H",
    "section": "Cámara",
    "label": "Alto (interior)",
    "type": "number",
    "unit": "m",
    "default": 2,
    "min": 0.1,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Altura interior de la cámara."
  },
  {
    "key": "room_V",
    "section": "Cámara",
    "label": "Volumen interior",
    "type": "number",
    "unit": "m³",
    "default": 12,
    "min": 0.1,
    "max": 4000000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "room_L",
      "room_A"
    ],
    "visibleWhen": null,
    "description": "Volumen interior. Si lo fijas, se recalculan L y A."
  },
  {
    "key": "app_type",
    "section": "Aplicación",
    "label": "Tipo de aplicación",
    "type": "select",
    "unit": null,
    "default": "MT",
    "min": null,
    "max": null,
    "options": [
      {
        "value": "AT",
        "label": "Sala de trabajo"
      },
      {
        "value": "AC",
        "label": "Precámara"
      },
      {
        "value": "MT",
        "label": "Conservación a temperatura positiva"
      },
      {
        "value": "BT",
        "label": "Conservación a temperatura negativa"
      },
      {
        "value": "CS",
        "label": "Oreo y maduración de producto"
      },
      {
        "value": "ER",
        "label": "Enfriamiento rápido"
      },
      {
        "value": "UC",
        "label": "Ultracongelación"
      },
      {
        "value": "DC",
        "label": "Descongelación"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Uso de la cámara. Filtra los productos compatibles y reinicia parámetros por defecto."
  },
  {
    "key": "app_t",
    "section": "Aplicación",
    "label": "Temperatura de cámara",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "pro_t"
    ],
    "visibleWhen": null,
    "description": "Temperatura interior de consigna. Excluyente con la temperatura de conservación del producto."
  },
  {
    "key": "loc_city",
    "section": "Localización",
    "label": "Ubicación",
    "type": "select",
    "unit": null,
    "default": "ESPAÑA",
    "min": null,
    "max": null,
    "options": null,
    "dynamic": "location",
    "exclusive": null,
    "visibleWhen": null,
    "description": "Localización (clima). Acepta el UUID o el nombre de la tabla de localizaciones. Define temperaturas exteriores y altitud."
  },
  {
    "key": "loc_t",
    "section": "Localización",
    "label": "Temperatura ambiente",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Temperatura ambiente exterior. Por defecto se toma de la localización."
  },
  {
    "key": "pro_type",
    "section": "Producto",
    "label": "Tipo de producto",
    "type": "select",
    "unit": null,
    "default": "GENERICO MEDIA TEMPERATURA",
    "min": null,
    "max": null,
    "options": null,
    "dynamic": "product",
    "exclusive": null,
    "visibleWhen": null,
    "description": "Producto almacenado. Acepta UUID o nombre. Fija propiedades térmicas (temperatura, humedad, calores específicos, densidad...)."
  },
  {
    "key": "pro_t",
    "section": "Producto",
    "label": "Temperatura de conservación",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "app_t"
    ],
    "visibleWhen": null,
    "description": "Temperatura de conservación del producto. Excluyente con la temperatura de cámara."
  },
  {
    "key": "pro_hr",
    "section": "Producto",
    "label": "Humedad de conservación",
    "type": "number",
    "unit": "%",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Humedad relativa de conservación recomendada."
  },
  {
    "key": "pro_tc",
    "section": "Producto",
    "label": "Punto de congelación",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Temperatura de inicio de congelación del producto."
  },
  {
    "key": "pro_qa",
    "section": "Producto",
    "label": "Contenido en agua",
    "type": "number",
    "unit": "%",
    "default": 80,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Porcentaje de agua del producto."
  },
  {
    "key": "pro_cp",
    "section": "Producto",
    "label": "Calor específico",
    "type": "number",
    "unit": "kJ/kg·K",
    "default": 1,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Calor específico del producto sin congelar."
  },
  {
    "key": "pro_cpc",
    "section": "Producto",
    "label": "Calor específico congelado",
    "type": "number",
    "unit": "kJ/kg·K",
    "default": 1,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Calor específico del producto congelado."
  },
  {
    "key": "pro_cr",
    "section": "Producto",
    "label": "Calor de respiración",
    "type": "number",
    "unit": "kJ/kg",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Calor de respiración (productos vegetales)."
  },
  {
    "key": "pack_type",
    "section": "Embalaje",
    "label": "Tipo de embalaje",
    "type": "select",
    "unit": null,
    "default": "granel",
    "min": null,
    "max": null,
    "options": [
      {
        "value": "granel",
        "label": "A granel"
      },
      {
        "value": "palets",
        "label": "Palés de madera"
      },
      {
        "value": "carros_a",
        "label": "Bandejas de acero"
      },
      {
        "value": "carros_al",
        "label": "Bandejas de aluminio"
      },
      {
        "value": "cajas_carton",
        "label": "Cajas de cartón"
      },
      {
        "value": "cajas_PVC",
        "label": "Cajas de plástico"
      },
      {
        "value": "cajas_EPS",
        "label": "Cajas de poliestireno"
      },
      {
        "value": "ceramica",
        "label": "Envases cerámicos"
      },
      {
        "value": "vidrio",
        "label": "Envases de vidrio"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Tipo de embalaje del producto. Aporta peso relativo y calor específico del envase."
  },
  {
    "key": "pack_weight",
    "section": "Embalaje",
    "label": "Peso del embalaje",
    "type": "number",
    "unit": "kg/kg",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Peso de embalaje por kg de producto. Por defecto del tipo de embalaje."
  },
  {
    "key": "load_dens",
    "section": "Carga de producto",
    "label": "Densidad de carga",
    "type": "number",
    "unit": "kg/m³",
    "default": 250,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "load_total"
    ],
    "visibleWhen": null,
    "description": "Densidad de almacenamiento. Excluyente con la carga total."
  },
  {
    "key": "load_total",
    "section": "Carga de producto",
    "label": "Carga total",
    "type": "number",
    "unit": "kg",
    "default": 0,
    "min": 0,
    "max": 1000000000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "load_dens"
    ],
    "visibleWhen": null,
    "description": "Masa total almacenada. Excluyente con la densidad de carga."
  },
  {
    "key": "load_ti",
    "section": "Carga de producto",
    "label": "Temperatura de entrada",
    "type": "number",
    "unit": "ºC",
    "default": 25,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Temperatura del producto al entrar en la cámara."
  },
  {
    "key": "load_rate",
    "section": "Carga de producto",
    "label": "Tasa de rotación diaria",
    "type": "number",
    "unit": "%/24h",
    "default": 10,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "load_turnover"
    ],
    "visibleWhen": null,
    "description": "Porcentaje de carga que rota al día. Excluyente con la rotación diaria. (No aplica en UC/ER/DC)."
  },
  {
    "key": "load_turnover",
    "section": "Carga de producto",
    "label": "Rotación diaria",
    "type": "number",
    "unit": "kg/24h",
    "default": 0,
    "min": 0,
    "max": 1000000000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "load_rate"
    ],
    "visibleWhen": null,
    "description": "Masa que entra/sale al día. Excluyente con la tasa de rotación."
  },
  {
    "key": "cool_shape",
    "section": "Enfriamiento del producto",
    "label": "Forma del producto",
    "type": "select",
    "unit": null,
    "default": 3,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 3,
        "label": "Esfera"
      },
      {
        "value": 2,
        "label": "Cilindro"
      },
      {
        "value": 1,
        "label": "Placa"
      },
      {
        "value": 0,
        "label": "Bloque"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type ∈ {UC, ER, DC} o tasa de rotación > 10%",
    "description": "Geometría de la pieza para el cálculo del tiempo de enfriamiento."
  },
  {
    "key": "cool_weight",
    "section": "Enfriamiento del producto",
    "label": "Peso por pieza",
    "type": "number",
    "unit": "kg",
    "default": 0.1,
    "min": 0.01,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "cool_length",
      "cool_width",
      "cool_thick"
    ],
    "visibleWhen": "sección de enfriamiento visible",
    "description": "Peso de cada pieza. Excluyente con las dimensiones (largo/ancho/espesor)."
  },
  {
    "key": "cool_length",
    "section": "Enfriamiento del producto",
    "label": "Largo del producto",
    "type": "number",
    "unit": "mm",
    "default": 100,
    "min": 1,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "cool_weight"
    ],
    "visibleWhen": "forma ≤ Cilindro",
    "description": "Largo de la pieza. Excluyente con el peso por pieza."
  },
  {
    "key": "cool_width",
    "section": "Enfriamiento del producto",
    "label": "Ancho del producto",
    "type": "number",
    "unit": "mm",
    "default": 100,
    "min": 1,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "cool_weight"
    ],
    "visibleWhen": "forma ≤ Placa",
    "description": "Ancho de la pieza. Excluyente con el peso por pieza."
  },
  {
    "key": "cool_thick",
    "section": "Enfriamiento del producto",
    "label": "Espesor del producto",
    "type": "number",
    "unit": "mm",
    "default": 80,
    "min": 1,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": [
      "cool_weight"
    ],
    "visibleWhen": "sección de enfriamiento visible",
    "description": "Espesor característico. Excluyente con el peso por pieza."
  },
  {
    "key": "cool_dens",
    "section": "Enfriamiento del producto",
    "label": "Densidad",
    "type": "number",
    "unit": "kg/m³",
    "default": 800,
    "min": 1,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Densidad de la pieza."
  },
  {
    "key": "cool_cond",
    "section": "Enfriamiento del producto",
    "label": "Conductividad",
    "type": "number",
    "unit": "W/m²·K",
    "default": 1,
    "min": 0.1,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Conductividad térmica de la pieza."
  },
  {
    "key": "cool_vair",
    "section": "Enfriamiento del producto",
    "label": "Velocidad del aire",
    "type": "number",
    "unit": "m/s",
    "default": 4,
    "min": 0.1,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Velocidad del aire sobre el producto."
  },
  {
    "key": "cool_tf",
    "section": "Enfriamiento del producto",
    "label": "Temperatura final en el centro",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Temperatura objetivo en el centro de la pieza."
  },
  {
    "key": "cool_time",
    "section": "Enfriamiento del producto",
    "label": "Tiempo de enfriamiento",
    "type": "number",
    "unit": "h",
    "default": 24,
    "min": 0.1,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Tiempo disponible para el enfriamiento."
  },
  {
    "key": "dry_merma",
    "section": "Secado del producto",
    "label": "Pérdida de peso",
    "type": "number",
    "unit": "%",
    "default": 25,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS (oreo/maduración)",
    "description": "Merma de peso por secado."
  },
  {
    "key": "dry_m",
    "section": "Secado del producto",
    "label": "Extracción de humedad",
    "type": "number",
    "unit": "kg/24h",
    "default": 0,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS",
    "description": "Agua extraída por día."
  },
  {
    "key": "dry_v",
    "section": "Secado del producto",
    "label": "Velocidad frontal de aire",
    "type": "number",
    "unit": "m/s",
    "default": 0.1,
    "min": 0.1,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS",
    "description": "Velocidad frontal del aire de secado."
  },
  {
    "key": "dry_qair",
    "section": "Secado del producto",
    "label": "Caudal de aire",
    "type": "number",
    "unit": "m³/h",
    "default": 0,
    "min": 0,
    "max": 1000000000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS",
    "description": "Caudal de aire de secado."
  },
  {
    "key": "dry_t",
    "section": "Secado del producto",
    "label": "Tiempo de secado",
    "type": "number",
    "unit": "d",
    "default": 30,
    "min": 1,
    "max": 365,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS",
    "description": "Duración del proceso de secado."
  },
  {
    "key": "dry_bf",
    "section": "Secado del producto",
    "label": "Factor de bypass",
    "type": "number",
    "unit": null,
    "default": 0.8,
    "min": 0,
    "max": 1,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS",
    "description": "Factor de bypass del evaporador (0–1)."
  },
  {
    "key": "dry_A",
    "section": "Secado del producto",
    "label": "Área de barrido",
    "type": "number",
    "unit": "m²",
    "default": 0.1,
    "min": 0.1,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "app_type = CS",
    "description": "Área de barrido del aire."
  },
  {
    "key": "ext_loc",
    "section": "Emplazamiento",
    "label": "Localización (emplazamiento)",
    "type": "select",
    "unit": null,
    "default": "interior",
    "min": null,
    "max": null,
    "options": [
      {
        "value": "interior",
        "label": "En interior de edificio"
      },
      {
        "value": "sombra",
        "label": "En exterior en sombra"
      },
      {
        "value": "sol",
        "label": "En exterior bajo el sol"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Dónde está la cámara. Activa el cálculo de insolación si está al exterior."
  },
  {
    "key": "ext_t",
    "section": "Emplazamiento",
    "label": "Temperatura ambiente",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Temperatura ambiente del emplazamiento. Por defecto = temperatura de localización."
  },
  {
    "key": "ext_tmin",
    "section": "Emplazamiento",
    "label": "Temperatura media mensual mínima",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Para pérdidas con el terreno en invierno."
  },
  {
    "key": "ext_tmax",
    "section": "Emplazamiento",
    "label": "Temperatura media mensual máxima",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -100,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Para pérdidas con el terreno en verano."
  },
  {
    "key": "ext_alt",
    "section": "Emplazamiento",
    "label": "Altitud",
    "type": "number",
    "unit": "m",
    "default": 0,
    "min": -500,
    "max": 5000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Altitud (afecta a la presión atmosférica)."
  },
  {
    "key": "ext_hr",
    "section": "Emplazamiento",
    "label": "Humedad relativa ambiente",
    "type": "number",
    "unit": "%",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Humedad relativa del aire exterior."
  },
  {
    "key": "ins_wall",
    "section": "Aislamiento térmico",
    "label": "Aislamiento pared",
    "type": "select",
    "unit": null,
    "default": 0.025,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 0.025,
        "label": "Poliuretano inyectado [0.025 W/mK]"
      },
      {
        "value": 0.03,
        "label": "Poliuretano proyectado [0.030 W/mK]"
      },
      {
        "value": 0.035,
        "label": "Poliestireno expandido [0.035 W/mK]"
      },
      {
        "value": 0.036,
        "label": "Fibra de vidrio [0.036 W/mK]"
      },
      {
        "value": 0.04,
        "label": "Lana mineral [0.040 W/mK]"
      },
      {
        "value": 0.25,
        "label": "Panel de yeso [0.25 W/mK]"
      },
      {
        "value": 0.3,
        "label": "Fábrica de ladrillo hueco [0.30 W/mK]"
      },
      {
        "value": 0.5,
        "label": "Fábrica de ladrillo macizo [0.50 W/mK]"
      },
      {
        "value": 0.75,
        "label": "Bloque de hormigón [0.75 W/mK]"
      },
      {
        "value": 0.02,
        "label": "Otro (usa ins_cus_*)"
      }
    ],
    "dynamic": null,
    "exclusive": [
      "ins_cus_wall"
    ],
    "visibleWhen": null,
    "description": "Material/conductividad de la pared. Selecciona \"Otro\" (0.02) e introduce ins_cus_wall para un valor personalizado."
  },
  {
    "key": "ins_wall_a",
    "section": "Aislamiento térmico",
    "label": "Área pared",
    "type": "number",
    "unit": "m²",
    "default": 0,
    "min": 0,
    "max": 100000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Área de pared (0 = se calcula automáticamente)."
  },
  {
    "key": "ins_wall_t",
    "section": "Aislamiento térmico",
    "label": "Espesor pared",
    "type": "number",
    "unit": "mm",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Espesor de pared (0 = usa el espesor de aislamiento general)."
  },
  {
    "key": "ins_cus_wall",
    "section": "Aislamiento térmico",
    "label": "Conductividad personalizada pared",
    "type": "number",
    "unit": "W/m·K",
    "default": 0.025,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "ins_wall = Otro (0.02)",
    "description": "Conductividad personalizada de la pared."
  },
  {
    "key": "ins_roof",
    "section": "Aislamiento térmico",
    "label": "Aislamiento techo",
    "type": "select",
    "unit": null,
    "default": 0.025,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 0.025,
        "label": "Poliuretano inyectado [0.025 W/mK]"
      },
      {
        "value": 0.03,
        "label": "Poliuretano proyectado [0.030 W/mK]"
      },
      {
        "value": 0.035,
        "label": "Poliestireno expandido [0.035 W/mK]"
      },
      {
        "value": 0.036,
        "label": "Fibra de vidrio [0.036 W/mK]"
      },
      {
        "value": 0.04,
        "label": "Lana mineral [0.040 W/mK]"
      },
      {
        "value": 1,
        "label": "Forjado cerámico [1.0 W/mK]"
      },
      {
        "value": 1.3,
        "label": "Forjado de hormigón [1.3 W/mK]"
      },
      {
        "value": 1.5,
        "label": "Losa de hormigón [1.5 W/mK]"
      },
      {
        "value": 0.02,
        "label": "Otro (usa ins_cus_*)"
      }
    ],
    "dynamic": null,
    "exclusive": [
      "ins_cus_roof"
    ],
    "visibleWhen": null,
    "description": "Material/conductividad del techo."
  },
  {
    "key": "ins_roof_a",
    "section": "Aislamiento térmico",
    "label": "Área techo",
    "type": "number",
    "unit": "m²",
    "default": 0,
    "min": 0,
    "max": 100000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Área de techo (0 = automático)."
  },
  {
    "key": "ins_roof_t",
    "section": "Aislamiento térmico",
    "label": "Espesor techo",
    "type": "number",
    "unit": "mm",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Espesor de techo (0 = espesor general)."
  },
  {
    "key": "ins_cus_roof",
    "section": "Aislamiento térmico",
    "label": "Conductividad personalizada techo",
    "type": "number",
    "unit": "W/m·K",
    "default": 0.025,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "ins_roof = Otro (0.02)",
    "description": "Conductividad personalizada del techo."
  },
  {
    "key": "ins_floor",
    "section": "Aislamiento térmico",
    "label": "Aislamiento suelo",
    "type": "select",
    "unit": null,
    "default": 0.025,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 0.025,
        "label": "Poliuretano inyectado [0.025 W/mK]"
      },
      {
        "value": 0.03,
        "label": "Poliuretano proyectado [0.030 W/mK]"
      },
      {
        "value": 0.035,
        "label": "Poliestireno expandido [0.035 W/mK]"
      },
      {
        "value": 0.036,
        "label": "Fibra de vidrio [0.036 W/mK]"
      },
      {
        "value": 0.04,
        "label": "Lana mineral [0.040 W/mK]"
      },
      {
        "value": 1,
        "label": "Forjado cerámico [1.0 W/mK]"
      },
      {
        "value": 1.3,
        "label": "Forjado de hormigón [1.3 W/mK]"
      },
      {
        "value": 1.5,
        "label": "Losa de hormigón [1.5 W/mK]"
      },
      {
        "value": 0.02,
        "label": "Otro (usa ins_cus_*)"
      }
    ],
    "dynamic": null,
    "exclusive": [
      "ins_cus_floor"
    ],
    "visibleWhen": null,
    "description": "Material/conductividad del suelo."
  },
  {
    "key": "ins_floor_a",
    "section": "Aislamiento térmico",
    "label": "Área suelo",
    "type": "number",
    "unit": "m²",
    "default": 0,
    "min": 0,
    "max": 100000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Área de suelo (0 = automático)."
  },
  {
    "key": "ins_floor_t",
    "section": "Aislamiento térmico",
    "label": "Espesor suelo",
    "type": "number",
    "unit": "mm",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Espesor de suelo (0 = espesor general / 0 si suelo sin aislar)."
  },
  {
    "key": "ins_cus_floor",
    "section": "Aislamiento térmico",
    "label": "Conductividad personalizada suelo",
    "type": "number",
    "unit": "W/m·K",
    "default": 0.025,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "ins_floor = Otro (0.02)",
    "description": "Conductividad personalizada del suelo."
  },
  {
    "key": "ins_door",
    "section": "Aislamiento térmico",
    "label": "Aislamiento puerta",
    "type": "select",
    "unit": null,
    "default": 0.025,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 0.025,
        "label": "Poliuretano inyectado [0.025 W/mK]"
      },
      {
        "value": 0.03,
        "label": "Poliuretano proyectado [0.030 W/mK]"
      },
      {
        "value": 0.035,
        "label": "Poliestireno expandido [0.035 W/mK]"
      },
      {
        "value": 0.036,
        "label": "Fibra de vidrio [0.036 W/mK]"
      },
      {
        "value": 0.04,
        "label": "Lana mineral [0.040 W/mK]"
      },
      {
        "value": 0.2,
        "label": "Tablero de madera [0.2 W/mK]"
      },
      {
        "value": 3.1,
        "label": "Vidrio triple"
      },
      {
        "value": 6.3,
        "label": "Vidrio doble"
      },
      {
        "value": 200,
        "label": "Vidrio simple"
      },
      {
        "value": 0.02,
        "label": "Otro (usa ins_cus_*)"
      }
    ],
    "dynamic": null,
    "exclusive": [
      "ins_cus_door"
    ],
    "visibleWhen": null,
    "description": "Material/conductividad de la puerta (incluye vidrios para expositores)."
  },
  {
    "key": "ins_door_a",
    "section": "Aislamiento térmico",
    "label": "Área puerta",
    "type": "number",
    "unit": "m²",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Área de puerta (0 = automático)."
  },
  {
    "key": "ins_door_t",
    "section": "Aislamiento térmico",
    "label": "Espesor puerta",
    "type": "number",
    "unit": "mm",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Espesor de puerta (0 = automático)."
  },
  {
    "key": "ins_cus_door",
    "section": "Aislamiento térmico",
    "label": "Conductividad personalizada puerta",
    "type": "number",
    "unit": "W/m·K",
    "default": 0.025,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "ins_door = Otro (0.02)",
    "description": "Conductividad personalizada de la puerta."
  },
  {
    "key": "glass_window",
    "section": "Acristalamiento",
    "label": "Ventana",
    "type": "select",
    "unit": null,
    "default": 3.1,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 3.1,
        "label": "Vidrio triple"
      },
      {
        "value": 6.3,
        "label": "Vidrio doble"
      },
      {
        "value": 200,
        "label": "Vidrio simple"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Tipo de acristalamiento (transmitancia)."
  },
  {
    "key": "glass_window_a",
    "section": "Acristalamiento",
    "label": "Área ventana",
    "type": "number",
    "unit": "m²",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Superficie acristalada."
  },
  {
    "key": "solar_rad",
    "section": "Insolación",
    "label": "Insolación diaria superficial",
    "type": "number",
    "unit": "kWh/m²",
    "default": 0,
    "min": 0,
    "max": 100000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "ext_loc ≠ interior",
    "description": "Radiación solar diaria sobre superficie horizontal."
  },
  {
    "key": "solar_abs",
    "section": "Insolación",
    "label": "Color superficial",
    "type": "select",
    "unit": null,
    "default": 0.3,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 0.3,
        "label": "Claro"
      },
      {
        "value": 0.6,
        "label": "Medio"
      },
      {
        "value": 0.9,
        "label": "Oscuro"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "ext_loc ≠ interior",
    "description": "Absortividad solar según el color exterior."
  },
  {
    "key": "vent_t",
    "section": "Ventilación natural",
    "label": "Temperatura del aire exterior",
    "type": "number",
    "unit": "ºC",
    "default": 0,
    "min": -50,
    "max": 50,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Temperatura del aire de renovación."
  },
  {
    "key": "vent_hr",
    "section": "Ventilación natural",
    "label": "Humedad del aire exterior",
    "type": "number",
    "unit": "%",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Humedad relativa del aire de renovación."
  },
  {
    "key": "vent_doorh",
    "section": "Ventilación natural",
    "label": "Alto de puerta",
    "type": "number",
    "unit": "m",
    "default": 1.8,
    "min": 0.1,
    "max": 5,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Altura de la puerta para infiltración."
  },
  {
    "key": "vent_doorw",
    "section": "Ventilación natural",
    "label": "Ancho de puerta",
    "type": "number",
    "unit": "m",
    "default": 0.8,
    "min": 0.1,
    "max": 5,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Ancho de la puerta para infiltración."
  },
  {
    "key": "vent_topen",
    "section": "Ventilación natural",
    "label": "Tiempo de apertura",
    "type": "number",
    "unit": "min",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Tiempo medio de apertura por evento."
  },
  {
    "key": "vent_nopen",
    "section": "Ventilación natural",
    "label": "Aperturas diarias de puerta",
    "type": "number",
    "unit": "/24h",
    "default": 0,
    "min": 0,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Número de aperturas al día."
  },
  {
    "key": "vent_ren",
    "section": "Ventilación natural",
    "label": "Renovaciones diarias",
    "type": "number",
    "unit": "/24h",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Renovaciones de aire al día."
  },
  {
    "key": "atm_co2",
    "section": "Atmósfera controlada",
    "label": "Producción natural de CO₂",
    "type": "number",
    "unit": "kgCO2/dia",
    "default": 0,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "atm_co2 > 0",
    "description": "Producción natural de CO₂ del producto."
  },
  {
    "key": "atm_qvent",
    "section": "Atmósfera controlada",
    "label": "Caudal de ventilación",
    "type": "number",
    "unit": "m³/h",
    "default": 0,
    "min": 0,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "atm_co2 > 0",
    "description": "Caudal de ventilación para control de CO₂."
  },
  {
    "key": "atm_cco2",
    "section": "Atmósfera controlada",
    "label": "Concentración máx. admisible de CO₂",
    "type": "number",
    "unit": "%",
    "default": 0,
    "min": 0,
    "max": 10,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": "atm_co2 > 0",
    "description": "Concentración máxima admisible de CO₂."
  },
  {
    "key": "pers_p",
    "section": "Ocupación de personal",
    "label": "Potencia unitaria",
    "type": "number",
    "unit": "W/pers",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Calor disipado por persona."
  },
  {
    "key": "pers_n",
    "section": "Ocupación de personal",
    "label": "Nº de personas",
    "type": "number",
    "unit": "pers",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Número de personas en la cámara."
  },
  {
    "key": "light_p",
    "section": "Iluminación",
    "label": "Potencia unitaria",
    "type": "number",
    "unit": "W/m²",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Potencia de iluminación por m²."
  },
  {
    "key": "light_s",
    "section": "Iluminación",
    "label": "Superficie",
    "type": "number",
    "unit": "m²",
    "default": 0,
    "min": 0,
    "max": 50000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Superficie iluminada."
  },
  {
    "key": "heater_p",
    "section": "Resistencia de puerta",
    "label": "Potencia unitaria",
    "type": "number",
    "unit": "W/m",
    "default": 0,
    "min": 0,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Potencia de la resistencia perimetral de puerta."
  },
  {
    "key": "heater_l",
    "section": "Resistencia de puerta",
    "label": "Perímetro",
    "type": "number",
    "unit": "m",
    "default": 0,
    "min": 0,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Longitud de la resistencia de puerta."
  },
  {
    "key": "defrost_type",
    "section": "Desescarche",
    "label": "Tipo de desescarche",
    "type": "select",
    "unit": null,
    "default": 1.5,
    "min": null,
    "max": null,
    "options": [
      {
        "value": 1.5,
        "label": "Eléctrico"
      },
      {
        "value": 0,
        "label": "Aire"
      },
      {
        "value": 1,
        "label": "Gas caliente"
      }
    ],
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Sistema de desescarche."
  },
  {
    "key": "fans_q",
    "section": "Ventiladores",
    "label": "Caudal de aire",
    "type": "number",
    "unit": "m³/h",
    "default": 1000,
    "min": null,
    "max": null,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Caudal de aire de los ventiladores."
  },
  {
    "key": "fans_ef",
    "section": "Ventiladores",
    "label": "Eficiencia",
    "type": "number",
    "unit": "%",
    "default": 30,
    "min": 10,
    "max": 100,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Rendimiento de los ventiladores."
  },
  {
    "key": "fans_pe",
    "section": "Ventiladores",
    "label": "Presión estática total",
    "type": "number",
    "unit": "Pa",
    "default": 150,
    "min": 1,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Presión estática total de los ventiladores."
  },
  {
    "key": "fans_p",
    "section": "Ventiladores",
    "label": "Potencia eléctrica",
    "type": "number",
    "unit": "kW",
    "default": 0,
    "min": 0,
    "max": 10000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Potencia eléctrica de los ventiladores (0 = se calcula)."
  },
  {
    "key": "other_q",
    "section": "Otras cargas térmicas",
    "label": "Potencia eléctrica",
    "type": "number",
    "unit": "kW",
    "default": 0,
    "min": 0,
    "max": 1000,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Otras cargas térmicas eléctricas."
  },
  {
    "key": "other_h",
    "section": "Otras cargas térmicas",
    "label": "Horas diarias",
    "type": "number",
    "unit": "h/24h",
    "default": 8,
    "min": 0,
    "max": 24,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Horas de funcionamiento de otras cargas."
  },
  {
    "key": "Q_h",
    "section": "Funcionamiento",
    "label": "Tiempo de funcionamiento",
    "type": "number",
    "unit": "h",
    "default": 18,
    "min": 0.1,
    "max": 24,
    "options": null,
    "dynamic": null,
    "exclusive": null,
    "visibleWhen": null,
    "description": "Horas diarias de funcionamiento del equipo (dimensionamiento)."
  }
]