{"id":22820,"date":"2026-03-10T12:24:08","date_gmt":"2026-03-10T12:24:08","guid":{"rendered":"https:\/\/esi.uclm.es\/?page_id=22820"},"modified":"2026-07-27T14:30:43","modified_gmt":"2026-07-27T14:30:43","slug":"consulta-de-horarios-del-grado-en-ingenieria-informatica","status":"publish","type":"page","link":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/","title":{"rendered":"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica"},"content":{"rendered":"\r\n<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title font-color=\"white\">Horarios ESI \u2013 UCLM 2026\/27<\/title>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:ital,wght@0,400;0,500;0,600;0,700&#038;family=JetBrains+Mono:wght@400;500&#038;display=swap\" rel=\"stylesheet\">\r\n<style>\r\n  :root {\r\n    --esi-navy: #045e84;\r\n    --esi-blue: #0397d8;\r\n    --esi-light: #659bde;\r\n    --esi-accent: #e8a838;\r\n    --bg: #f4f5f7;\r\n    --card: #ffffff;\r\n    --text: #1a1a2e;\r\n    --text-muted: #6b7280;\r\n    --border: #e2e5ea;\r\n    --lab-bg: #eef4fb;\r\n    --lab-border: #b8d4f0;\r\n    --theory-bg: #ffffff;\r\n    --theory-border: #d1d5db;\r\n    --event-bg: #fdf0d5;\r\n    --event-border: #e8a838;\r\n    --shadow-sm: 0 1px 3px rgba(0,0,0,.06);\r\n    --shadow-md: 0 4px 12px rgba(0,0,0,.08);\r\n    --radius: 8px;\r\n    --radius-lg: 12px;\r\n  }\r\n  * { margin: 0; padding: 0; box-sizing: border-box; }\r\n  body {\r\n    font-family: 'DM Sans', sans-serif;\r\n    background: var(--bg); color: var(--text); line-height: 1.5; min-height: 100vh;\r\n  }\r\n  h1.titulo {\r\n    color: #ffffff !important;  \r\n    font-size: 1.5rem; \r\n    font-weight: 700; \r\n    letter-spacing: -.02em;\r\n  }\r\n  .header {\r\n    background: linear-gradient(135deg, var(--esi-navy), var(--esi-blue));\r\n    color: white; padding: 1.5rem 2rem;\r\n    display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;\r\n  }\r\n  .header-brand { display: flex; flex-direction: column; gap: .15rem; flex-shrink: 0; }\r\n  .header-brand h1 { font-size: 1.35rem; font-weight: 700; letter-spacing: -.02em; }\r\n  .header-brand span { font-size: .8rem; opacity: .7; font-weight: 400; }\r\n  .header-sep { width: 1px; height: 40px; background: rgba(255,255,255,.2); flex-shrink: 0; }\r\n  .mode-tabs {\r\n    display: flex; gap: .35rem; background: rgba(0,0,0,.2);\r\n    border-radius: var(--radius); padding: 3px;\r\n  }\r\n  .mode-tab {\r\n    padding: .5rem 1.1rem; border: none; background: transparent;\r\n    color: rgba(255,255,255,.7); font-family: inherit; font-size: .85rem;\r\n    font-weight: 500; border-radius: 6px; cursor: pointer; transition: all .2s;\r\n  }\r\n  .mode-tab:hover { color: white; }\r\n  .mode-tab.active { background: rgba(255,255,255,.18); color: white; }\r\n  .filters-bar {\r\n    background: var(--card); border-bottom: 1px solid var(--border);\r\n    padding: 1rem 2rem; display: flex; align-items: center;\r\n    gap: 1rem; flex-wrap: wrap; box-shadow: var(--shadow-sm);\r\n  }\r\n  .filter-group { display: flex; flex-direction: column; gap: .25rem; }\r\n  .filter-group label {\r\n    font-size: .7rem; font-weight: 600; text-transform: uppercase;\r\n    letter-spacing: .06em; color: var(--text-muted);\r\n  }\r\n  .filter-group select {\r\n    font-family: inherit; font-size: .85rem; padding: .4rem .65rem;\r\n    border: 1.5px solid var(--border); border-radius: 6px;\r\n    background: var(--bg); color: var(--text); min-width: 140px; transition: border-color .2s;\r\n  }\r\n  .filter-group select:focus { outline: none; border-color: var(--esi-light); }\r\n  .filter-chip-row { display: flex; gap: .3rem; flex-wrap: wrap; }\r\n  .filter-chip {\r\n    padding: .35rem .7rem; font-family: inherit; font-size: .78rem; font-weight: 500;\r\n    border: 1.5px solid var(--border); border-radius: 20px;\r\n    background: var(--card); color: var(--text-muted); cursor: pointer;\r\n    transition: all .15s; white-space: nowrap;\r\n  }\r\n  .filter-chip:hover { border-color: var(--esi-light); color: var(--esi-blue); }\r\n  .filter-chip.active { background: var(--esi-navy); color: white; border-color: var(--esi-navy); }\r\n  .btn-clear {\r\n    margin-left: auto; padding: .4rem .9rem; font-family: inherit;\r\n    font-size: .78rem; font-weight: 500; border: 1.5px solid var(--border);\r\n    border-radius: 6px; background: var(--card); color: var(--text-muted);\r\n    cursor: pointer; transition: all .15s;\r\n  }\r\n  .btn-clear:hover { border-color: #e74c3c; color: #e74c3c; }\r\n  .main { padding: 1.5rem 2rem 3rem; max-width: 1440px; margin: 0 auto; }\r\n  .status-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; flex-wrap: wrap; gap: .5rem; }\r\n  .status-bar .count { font-size: .85rem; color: var(--text-muted); }\r\n  .status-bar .count strong { color: var(--text); font-weight: 600; }\r\n  .legend { display: flex; gap: 1rem; font-size: .75rem; color: var(--text-muted); }\r\n  .legend-item { display: flex; align-items: center; gap: .35rem; }\r\n  .legend-dot { width: 10px; height: 10px; border-radius: 3px; border: 1.5px solid; }\r\n  .legend-dot.theory { background: var(--theory-bg); border-color: var(--theory-border); }\r\n  .legend-dot.lab { background: var(--lab-bg); border-color: var(--lab-border); }\r\n  .legend-dot.event { background: var(--event-bg); border-color: var(--event-border); }\r\n  .timetable {\r\n    display: grid; grid-template-columns: 80px repeat(5, 1fr);\r\n    gap: 1px; background: var(--border); border-radius: var(--radius-lg);\r\n    overflow: hidden; box-shadow: var(--shadow-md);\r\n  }\r\n  .tt-header {\r\n    background: var(--esi-navy); color: white; font-size: .78rem;\r\n    font-weight: 600; text-align: center; padding: .7rem .3rem; letter-spacing: .03em;\r\n  }\r\n  .tt-time {\r\n    background: var(--esi-navy); color: rgba(255,255,255,.85);\r\n    font-size: .7rem; font-weight: 500; padding: .5rem .35rem;\r\n    text-align: center; display: flex; flex-direction: column;\r\n    justify-content: center; font-family: 'JetBrains Mono', monospace; line-height: 1.4;\r\n  }\r\n  .tt-cell {\r\n    background: var(--card); padding: 0; min-height: 72px;\r\n    display: flex; flex-direction: column; gap: 2px; overflow: hidden;\r\n  }\r\n  .session-card {\r\n    padding: .4rem .5rem; border-left: 3px solid; font-size: .72rem;\r\n    line-height: 1.35; flex: 1; display: flex; flex-direction: column; gap: .1rem;\r\n    transition: transform .1s, box-shadow .15s; cursor: default; position: relative;\r\n  }\r\n  .session-card:hover { transform: scale(1.02); box-shadow: var(--shadow-md); z-index: 2; }\r\n  .session-card.theory { background: var(--theory-bg); border-left-color: var(--esi-blue); }\r\n  .session-card.lab { background: var(--lab-bg); border-left-color: var(--lab-border); }\r\n  .session-card.event { background: var(--event-bg); border-left-color: var(--event-border); }\r\n  .session-subject { font-weight: 700; color: var(--esi-navy); font-size: .76rem; }\r\n  .session-card.event .session-subject { color: #a67c00; }\r\n  .session-detail { color: var(--text-muted); font-size: .67rem; }\r\n  .session-badge {\r\n    display: inline-block; font-size: .58rem; font-weight: 600;\r\n    padding: .1rem .35rem; border-radius: 3px; background: var(--esi-navy);\r\n    color: white; align-self: flex-start; letter-spacing: .03em;\r\n  }\r\n  .session-card.lab .session-badge { background: #3a7bd5; }\r\n  .room-link {\r\n    color: inherit;\r\n    text-decoration: none;\r\n    border-bottom: 1px dashed rgba(0,0,0,.28);\r\n    cursor: pointer;\r\n    transition: color .15s, border-color .15s;\r\n  }\r\n  .room-link:hover { color: var(--esi-blue); border-bottom-color: var(--esi-blue); }\r\n  .list-table .room-link { font-weight: 500; }\r\n  .room-link svg {\r\n    width: 10px; height: 10px;\r\n    margin-left: .22rem;\r\n    vertical-align: -1px;\r\n    opacity: .55;\r\n    stroke: currentColor;\r\n    fill: none;\r\n    stroke-width: 2;\r\n    transition: opacity .15s;\r\n  }\r\n  .room-link:hover svg { opacity: 1; }\r\n  .tutorias-link {\r\n    color: var(--text-muted);\r\n    text-decoration: none;\r\n    font-size: .92em;\r\n    margin-left: .3rem;\r\n    white-space: nowrap;\r\n    transition: color .15s;\r\n  }\r\n  .tutorias-link:hover { color: var(--esi-blue); }\r\n  .tutorias-link svg {\r\n    width: 10px; height: 10px;\r\n    margin-right: .18rem;\r\n    vertical-align: -1px;\r\n    stroke: currentColor;\r\n    fill: none;\r\n    stroke-width: 2;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }\r\n  .sensor-tags {\r\n    margin-top: auto;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: .25rem;\r\n    padding-top: .35rem;\r\n  }\r\n  .sensor-tag {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: .2rem;\r\n    font-size: .58rem;\r\n    line-height: 1;\r\n    color: #6b7280;\r\n    background: #f3f4f6;\r\n    border: 1px solid #d1d5db;\r\n    border-radius: 999px;\r\n    padding: .16rem .36rem;\r\n    white-space: nowrap;\r\n  }\r\n  .sensor-tag svg {\r\n    width: 10px;\r\n    height: 10px;\r\n    stroke: currentColor;\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n  }\r\n  .room-sensor-summary {\r\n    background: var(--card);\r\n    border: 1px solid var(--border);\r\n    border-radius: var(--radius-lg);\r\n    box-shadow: var(--shadow-sm);\r\n    padding: 1rem 1.1rem;\r\n    margin-bottom: 1rem;\r\n  }\r\n  .room-sensor-title {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: .75rem;\r\n    flex-wrap: wrap;\r\n    margin-bottom: .55rem;\r\n  }\r\n  .room-sensor-title h2 {\r\n    font-size: 1rem;\r\n    font-weight: 700;\r\n    color: var(--esi-navy);\r\n  }\r\n  .room-sensor-summary .sensor-tags {\r\n    padding-top: 0;\r\n    gap: .4rem;\r\n  }\r\n  .room-sensor-summary .sensor-tag {\r\n    font-size: .72rem;\r\n    padding: .28rem .55rem;\r\n  }\r\n  .list-table {\r\n    width: 100%; border-collapse: collapse; background: var(--card);\r\n    border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-md);\r\n  }\r\n  .list-table th {\r\n    background: var(--esi-navy); color: white; font-size: .75rem;\r\n    font-weight: 600; padding: .65rem .7rem; text-align: left;\r\n    letter-spacing: .03em; position: sticky; top: 0; z-index: 3;\r\n  }\r\n  .list-table td {\r\n    font-size: .8rem; padding: .55rem .7rem;\r\n    border-bottom: 1px solid var(--border); vertical-align: top;\r\n  }\r\n  .list-table tr:last-child td { border-bottom: none; }\r\n  .list-table tr:hover td { background: #f8f9fb; }\r\n  .empty-state { text-align: center; padding: 4rem 2rem; color: var(--text-muted); }\r\n  .empty-state svg { width: 64px; height: 64px; margin-bottom: 1rem; opacity: .3; }\r\n  .empty-state h3 { font-size: 1.1rem; font-weight: 600; margin-bottom: .4rem; color: var(--text); }\r\n  .view-toggle {\r\n    display: flex; gap: .25rem; background: var(--bg);\r\n    border-radius: 6px; padding: 2px; border: 1.5px solid var(--border);\r\n  }\r\n  .view-btn {\r\n    padding: .3rem .6rem; border: none; background: transparent;\r\n    font-family: inherit; font-size: .75rem; font-weight: 500;\r\n    color: var(--text-muted); border-radius: 4px; cursor: pointer; transition: all .15s;\r\n  }\r\n  .view-btn.active { background: var(--card); color: var(--text); box-shadow: var(--shadow-sm); }\r\n  @media (max-width: 900px) {\r\n    .header { padding: 1rem; }\r\n    .filters-bar { padding: .8rem 1rem; }\r\n    .main { padding: 1rem; }\r\n    .timetable { grid-template-columns: 60px repeat(5, 1fr); font-size: .65rem; }\r\n    .session-card { padding: .3rem; }\r\n    .session-subject { font-size: .68rem; }\r\n    .filter-group select { min-width: 110px; }\r\n  }\r\n  @media (max-width: 640px) {\r\n    .timetable { overflow-x: auto; min-width: 700px; }\r\n    .main { overflow-x: auto; }\r\n  }\r\n  @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\r\n  .fade-in { animation: fadeIn .3s ease-out; }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"header\">\r\n  <div class=\"header-brand\">\r\n    <img decoding=\"async\" src=\"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1-1.png\" alt=\"Logo ESI\" style=\"width:50%; filter:brightness(0) invert(1);\">\r\n    <h1 class=\"titulo\">Horarios ESI<\/h1>\r\n    <span id=\"headerSubtitle\">Grado Ing. Inform\u00e1tica \u00b7 UCLM 2026\/27<\/span>\r\n  <\/div>\r\n  <div class=\"header-sep\"><\/div>\r\n  <div class=\"mode-tabs\" id=\"cuatriTabs\">\r\n    <button class=\"mode-tab\" data-cuatri=\"1C\" onclick=\"setCuatri('1C')\">1er Cuatrimestre<\/button>\r\n    <button class=\"mode-tab\" data-cuatri=\"2C\" onclick=\"setCuatri('2C')\">2\u00ba Cuatrimestre<\/button>\r\n  <\/div>\r\n  <div class=\"header-sep\"><\/div>\r\n  <div class=\"mode-tabs\">\r\n    <button class=\"mode-tab active\" data-mode=\"student\" onclick=\"setMode('student')\">Estudiante<\/button>\r\n    <!--<button class=\"mode-tab\" data-mode=\"professor\" onclick=\"setMode('professor')\">Profesor<\/button>-->\r\n    <button class=\"mode-tab\" data-mode=\"room\" onclick=\"setMode('room')\">Aula<\/button>\r\n  <\/div>\r\n<\/div>\r\n<div class=\"filters-bar\" id=\"filtersBar\"><\/div>\r\n<div class=\"main\">\r\n  <div class=\"status-bar\">\r\n    <div class=\"count\" id=\"statusCount\"><\/div>\r\n    <div style=\"display:flex; gap:1rem; align-items:center;\">\r\n      <div class=\"legend\">\r\n        <div class=\"legend-item\"><div class=\"legend-dot theory\"><\/div>Teor\u00eda<\/div>\r\n        <div class=\"legend-item\"><div class=\"legend-dot lab\"><\/div>Laboratorio<\/div>\r\n        <div class=\"legend-item\"><div class=\"legend-dot event\"><\/div>Evento<\/div>\r\n      <\/div>\r\n      <div class=\"view-toggle\">\r\n        <button class=\"view-btn active\" onclick=\"setView('grid')\">Cuadr\u00edcula<\/button>\r\n        <button class=\"view-btn\" onclick=\"setView('list')\">Lista<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <div id=\"content\"><\/div>\r\n<\/div>\r\n<script>\/* Cuatrimestre por defecto: busca CUATRIMESTRE_ACTUAL y pon '1C' o '2C' *\/ const CUATRIMESTRE_ACTUAL=\"1C\";let allSessions=[];let currentMode=\"student\";let currentView=\"grid\";let currentCuatri=CUATRIMESTRE_ACTUAL;let filters={grupo:null,dia:null,profesor:\"\",aula:null};let sensorData={};let dbError=null;const SENSORS_JSON_URL=\"https:\/\/federico.esi.uclm.es\/www\/jalbusac\/smartesi\/sensores.json\";const ENTITY_TO_AULA={\"sensor.temperatura_shelly1\":\"F0.1\",\"sensor.humedad_shelly1\":\"F0.1\",\"sensor.temperatura_shelly4\":\"F0.2\",\"sensor.humedad_shelly4\":\"F0.2\",\"sensor.temperatura_shelly5\":\"F1.1\",\"sensor.humedad_shelly5\":\"F1.1\",\"air_quality.co2_3\":\"A1.1\",\"air_quality.co2_1\":\"A1.2\",\"air_quality.co2_2\":\"A2.1\",\"air_quality.co2_4\":\"A2.2\",\"sensor.temperatura_shelly14\":\"LD1\",\"sensor.humedad_shelly14\":\"LD1\",\"sensor.temperatura_shelly13\":\"LD2\",\"sensor.humedad_shelly13\":\"LD2\",\"sensor.temperatura_shelly2\":\"LD3\",\"sensor.humedad_shelly2\":\"LD3\",\"sensor.temperatura_shelly3\":\"LD4\",\"sensor.humedad_shelly3\":\"LD4\"};function extractRoomCode(entityId,attributes){if(ENTITY_TO_AULA[entityId])return ENTITY_TO_AULA[entityId];const friendlyName=String(attributes&&attributes.friendly_name||\"\").trim();const m=friendlyName.match(\/\\b([A-Z]+\\d+(?:\\.\\d+)?)\\b\/u);return m?m[1].toUpperCase():null}function buildSensorData(payload){const rows=Array.isArray(payload?.sensors)?payload.sensors:Array.isArray(payload)?payload:[];const result={};rows.forEach(row=>{if(!row||typeof row!==\"object\")return;const entityId=String(row.entity_id||\"\").trim();if(!entityId)return;let attributes=row.attributes||{};if(typeof attributes===\"string\"){try{attributes=JSON.parse(attributes)}catch(_){attributes={}}}if(!attributes||typeof attributes!==\"object\")attributes={};const roomCode=extractRoomCode(entityId,attributes);if(!roomCode)return;if(!result[roomCode]){result[roomCode]={temperatura:null,humedad:null,co2:null}}const state=Number(row.state);const stateValue=Number.isFinite(state)?state:null;if(entityId.startsWith(\"air_quality.\")){const t=Number(attributes.Temperature);const h=Number(attributes.Humidity);const c=Number(attributes.CO2);if(Number.isFinite(t))result[roomCode].temperatura=t;if(Number.isFinite(h))result[roomCode].humedad=h;if(Number.isFinite(c))result[roomCode].co2=c;else if(stateValue!==null)result[roomCode].co2=stateValue;return}if(entityId.startsWith(\"sensor.temperatura_\")&&stateValue!==null){result[roomCode].temperatura=stateValue}else if(entityId.startsWith(\"sensor.humedad_\")&&stateValue!==null){result[roomCode].humedad=stateValue}});return result}async function loadSensorData(){try{const response=await fetch(SENSORS_JSON_URL,{cache:\"no-store\"});if(!response.ok)throw new Error(\"HTTP \"+response.status);const payload=await response.json();sensorData=buildSensorData(payload);dbError=null}catch(err){sensorData={};dbError=err&&err.message?err.message:\"No se pudieron cargar los sensores\"}}const SENSOR_ICONS={temperatura:'<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M14 14.76V5a2 2 0 1 0-4 0v9.76a4 4 0 1 0 4 0Z\"><\/path><\/svg>',humedad:'<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3s6 6.1 6 10a6 6 0 1 1-12 0c0-3.9 6-10 6-10Z\"><\/path><\/svg>',co2:'<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 15c1.2-2.8 3.8-4.5 6.8-4.5 2 0 3.7.7 5.1 2.1\"><\/path><path d=\"M14 8h6\"><\/path><path d=\"M17 5v6\"><\/path><path d=\"M6 19h12\"><\/path><\/svg>'};const DAYS=[\"Lunes\",\"Martes\",\"Mi\\xe9rcoles\",\"Jueves\",\"Viernes\"];const TIME_SLOTS_BY_CUATRI={\"1C\":[\"8:30-10:00\",\"10:00-11:30\",\"11:30-13:00\",\"13:00-14:30\",\"15:30-17:00\",\"17:00-18:30\",\"18:30-20:00\",\"20:00-21:30\"],\"2C\":[\"8:30-10:00\",\"10:00-11:30\",\"11:30-13:00\",\"13:00-14:30\",\"15:30-16:50\",\"17:00-18:30\",\"18:30-20:00\",\"20:00-21:30\"]};function timeSlots(){return TIME_SLOTS_BY_CUATRI[currentCuatri]||TIME_SLOTS_BY_CUATRI[\"1C\"]}const MAP_URL=\"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/\";const MAP_STORAGE_KEY=\"esi-map-selected\";const ROOM_TO_ID={.07:\"p-0-07\",\"0.05+6\":\"p-0-05\",.05:\"p-0-05\",.06:\"p-0-05\",\"0.02+3\":\"p-0-02\",.02:\"p-0-02\",.03:\"p-0-02\",.04:\"p-0-04\",\"F0.1\":\"fc-0-f01\",\"F0.2\":\"fc-0-f02\",\"Sal\\xf3n de Grados\":\"fc-0-grados\",\"Sal\\xf3n Grados\":\"fc-0-grados\",\"Sal\\xf3n de Actos\":\"fc-0-actos\",\"Sal\\xf3n Actos\":\"fc-0-actos\",\"Anita Borg\":\"fc-0-anita\",\"F1.1\":\"fc-1-f11\",\"A1.1\":\"fc-1-a11\",\"A1.2\":\"fc-1-a12\",LD1:\"fc-1-ld1\",LD2:\"fc-1-ld2\",LD3:\"fc-1-ld3\",LD4:\"fc-2-ld4\",\"A2.1\":\"fc-2-a21\",\"A2.2\":\"fc-2-a22\"};const ROOM_KEYS_SORTED=Object.keys(ROOM_TO_ID).sort((a,b)=>b.length-a.length);const DATA_PATH=\"\/TV\/hall\/horarios.json\";function loadData(){if(window.location.protocol===\"file:\"){try{const xhr=new XMLHttpRequest;xhr.open(\"GET\",DATA_PATH,false);xhr.send();if(xhr.status===0||xhr.status===200){allSessions=JSON.parse(xhr.responseText);normalizeData();setMode(\"student\");return Promise.resolve()}}catch(e){}document.getElementById(\"content\").innerHTML='<div class=\"empty-state\"><h3>Acceso bloqueado<\/h3><p>Abre con un servidor local: <code>python3 -m http.server 8000<\/code><\/p><\/div>';return Promise.reject(new Error(\"Acceso bloqueado\"))}return fetch(DATA_PATH+\"?v=\"+Date.now(),{cache:\"no-store\"}).then(r=>{if(!r.ok)throw new Error(\"HTTP \"+r.status);return r.json()}).then(data=>{allSessions=data;normalizeData();setMode(\"student\")}).catch(err=>{document.getElementById(\"content\").innerHTML='<div class=\"empty-state\"><h3>Error al cargar<\/h3><p>'+err.message+\". Aseg\\xfarate de que <code>horarios.json<\/code> est\\xe1 junto a este HTML.<\/p><\/div>\";throw err})}function normalizeData(){function buildMap(values){const unique=[...new Set(values)].filter(Boolean);const sorted=[...unique].sort((a,b)=>b.length-a.length);const canon={};unique.forEach(v=>canon[v]=v);for(let pass=0;pass<3;pass++){for(const short of unique){const longer=sorted.filter(l=>l!==short&&l.startsWith(short)&&(l.length===short.length||l[short.length]!==\" \"));if(longer.length===1){canon[short]=canon[longer[0]]}else if(longer.length>1){const targets=new Set(longer.map(l=>canon[l]));if(targets.size===1)canon[short]=[...targets][0]}}}return canon}const pm=buildMap(allSessions.map(s=>s.profesor));const rm=buildMap(allSessions.map(s=>s.aula));allSessions.forEach(s=>{if(s.profesor&&pm[s.profesor])s.profesor=pm[s.profesor];if(s.aula&&rm[s.aula])s.aula=rm[s.aula]})}function normalizeRoomText(value){let text=String(value||\"\").replace(\/\\u00a0\/g,\" \").trim();if(text.normalize)text=text.normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g,\"\");return text.toLowerCase().replace(\/\\b(?:aula|lab\\.?|laboratorio)\\b\/g,\" \").replace(\/\\s+\/g,\" \").trim()}function compactRoomKey(value){return normalizeRoomText(value).replace(\/[^a-z0-9]\/g,\"\")}function roomAliasKeys(value){const aliases=new Set;const normalized=normalizeRoomText(value);const add=candidate=>{const key=compactRoomKey(candidate);if(key)aliases.add(key)};add(value);add(normalized);const codeRe=\/\\b(?:[af]\\d+\\.\\d+|ld\\d+|\\d+\\.\\d+(?:\\+\\d+)?)\\b\/gi;(normalized.match(codeRe)||[]).forEach(code=>{add(code);const numeric=code.match(\/^(\\d+)\\.(\\d+)$\/);if(numeric){add(numeric[1]+\".\"+String(Number(numeric[2])))}const combined=code.match(\/^(\\d+)\\.(\\d+)\\+(\\d+)$\/);if(combined){const floor=combined[1];const first=combined[2];const second=combined[3].padStart(first.length,\"0\");add(floor+\".\"+first);add(floor+\".\"+String(Number(first)));add(floor+\".\"+second);add(floor+\".\"+String(Number(combined[3])))}});return aliases}function roomNamesMatch(a,b){if(!a||!b)return false;const aKeys=roomAliasKeys(a);const bKeys=roomAliasKeys(b);for(const key of aKeys){if(bKeys.has(key))return true}for(const aKey of aKeys){for(const bKey of bKeys){if(aKey.length>=3&&bKey.length>=3&&(aKey.includes(bKey)||bKey.includes(aKey)))return true}}return false}function getUrlParams(){const params=new URLSearchParams(window.location.search);return{mode:params.get(\"mode\"),aula:params.get(\"aula\"),cuatri:params.get(\"cuatri\")}}function findRoomMatch(aulaParam){if(!aulaParam)return null;const rooms=uniqueRooms();const exact=rooms.find(r=>r===aulaParam);if(exact)return exact;const ci=rooms.find(r=>r.toLowerCase()===aulaParam.toLowerCase());if(ci)return ci;return rooms.find(r=>roomNamesMatch(r,aulaParam))||null}function applyInitialState(){const urlParams=getUrlParams();if(urlParams.cuatri&&TIME_SLOTS_BY_CUATRI[urlParams.cuatri]){currentCuatri=urlParams.cuatri}updateCuatriTabs();buildFilters();if(urlParams.mode===\"room\"||urlParams.aula){setMode(\"room\");if(urlParams.aula){const match=findRoomMatch(urlParams.aula);if(match){filters.aula=match;buildFilters()}}}}Promise.all([loadData(),loadSensorData()]).then(()=>{applyInitialState();render()});function cuatriSessions(){return allSessions.filter(s=>!s.cuatrimestre||s.cuatrimestre===currentCuatri)}function unique(key){const v=new Set;cuatriSessions().forEach(s=>{if(s[key])v.add(s[key])});return[...v].sort((a,b)=>a.localeCompare(b,\"es\"))}function uniqueProfs(){const p=new Set;cuatriSessions().forEach(s=>{if(s.profesor&&s.tipo!==\"evento\")p.add(s.profesor)});return[...p].sort((a,b)=>a.localeCompare(b,\"es\"))}function uniqueRooms(){const r=new Set;cuatriSessions().forEach(s=>{if(s.aula&&s.tipo!==\"evento\")r.add(s.aula)});return[...r].sort((a,b)=>a.localeCompare(b,\"es\"))}function setMode(mode){currentMode=mode;document.querySelectorAll(\".mode-tab[data-mode]\").forEach(t=>t.classList.toggle(\"active\",t.dataset.mode===mode));filters={grupo:null,dia:null,profesor:\"\",aula:null};buildFilters();render()}function setView(v){currentView=v;document.querySelectorAll(\".view-btn\").forEach(b=>b.classList.toggle(\"active\",b.textContent.trim()===(v===\"grid\"?\"Cuadr\\xedcula\":\"Lista\")));render()}const CUATRI_LABEL={\"1C\":\"1er Cuatrimestre\",\"2C\":\"2\\xba Cuatrimestre\"};function updateCuatriTabs(){document.querySelectorAll(\"#cuatriTabs .mode-tab\").forEach(t=>t.classList.toggle(\"active\",t.dataset.cuatri===currentCuatri));const sub=document.getElementById(\"headerSubtitle\");if(sub)sub.textContent=\"Grado Ing. Inform\\xe1tica \\xb7 UCLM 2026\/27 \\xb7 \"+(CUATRI_LABEL[currentCuatri]||\"\")}function setCuatri(c){if(c===currentCuatri)return;currentCuatri=c;filters.grupo=null;filters.profesor=\"\";filters.dia=null;updateCuatriTabs();buildFilters();render()}function buildFilters(){const bar=document.getElementById(\"filtersBar\");bar.innerHTML=\"\";if(currentMode===\"student\"){const fg=mkEl(\"div\",\"filter-group\");fg.appendChild(mkLabel(\"Grupo\"));const sel=document.createElement(\"select\");sel.innerHTML='<option value=\"\">Todos los grupos<\/option>';unique(\"grupo\").forEach(g=>{const o=document.createElement(\"option\");o.value=g;o.textContent=g;if(filters.grupo===g)o.selected=true;sel.appendChild(o)});sel.onchange=()=>{filters.grupo=sel.value||null;render()};fg.appendChild(sel);bar.appendChild(fg);bar.appendChild(buildDayFilter())}else if(currentMode===\"professor\"){const fg=mkEl(\"div\",\"filter-group\");fg.appendChild(mkLabel(\"Profesor\"));const sel=document.createElement(\"select\");sel.innerHTML='<option value=\"\">Selecciona un profesor<\/option>';uniqueProfs().forEach(p=>{const o=document.createElement(\"option\");o.value=p;o.textContent=p;if(filters.profesor===p)o.selected=true;sel.appendChild(o)});sel.onchange=()=>{filters.profesor=sel.value||\"\";render()};fg.appendChild(sel);bar.appendChild(fg);bar.appendChild(buildDayFilter())}else if(currentMode===\"room\"){const fg=mkEl(\"div\",\"filter-group\");fg.appendChild(mkLabel(\"Aula\"));const sel=document.createElement(\"select\");sel.innerHTML='<option value=\"\">Selecciona un aula<\/option>';uniqueRooms().forEach(r=>{const o=document.createElement(\"option\");o.value=r;o.textContent=r;if(filters.aula===r)o.selected=true;sel.appendChild(o)});sel.onchange=()=>{filters.aula=sel.value||null;render()};fg.appendChild(sel);bar.appendChild(fg);bar.appendChild(buildDayFilter());const fg2=mkEl(\"div\",\"filter-group\");fg2.appendChild(mkLabel(\"Grupo\"));const sel2=document.createElement(\"select\");sel2.innerHTML='<option value=\"\">Todos<\/option>';unique(\"grupo\").forEach(g=>{const o=document.createElement(\"option\");o.value=g;o.textContent=g;sel2.appendChild(o)});sel2.onchange=()=>{filters.grupo=sel2.value||null;render()};fg2.appendChild(sel2);bar.appendChild(fg2)}const btn=mkEl(\"button\",\"btn-clear\");btn.textContent=\"Limpiar filtros\";btn.onclick=()=>{filters={grupo:null,dia:null,profesor:\"\",aula:null};buildFilters();render()};bar.appendChild(btn);updateChips()}function buildDayFilter(){const fg=mkEl(\"div\",\"filter-group\");fg.appendChild(mkLabel(\"D\\xeda\"));const row=mkEl(\"div\",\"filter-chip-row\");DAYS.forEach(d=>{const c=mkEl(\"button\",\"filter-chip\");c.textContent=d;c.dataset.day=d;c.onclick=()=>{filters.dia=filters.dia===d?null:d;updateChips();render()};row.appendChild(c)});fg.appendChild(row);return fg}function updateChips(){document.querySelectorAll(\".filter-chip\").forEach(c=>{const d=c.dataset.day;if(d)c.classList.toggle(\"active\",filters.dia===d)})}function getFiltered(){return allSessions.filter(s=>{if(s.cuatrimestre&&s.cuatrimestre!==currentCuatri)return false;if(filters.grupo&&s.grupo!==filters.grupo)return false;if(filters.dia&&s.dia!==filters.dia)return false;if(filters.aula&&!roomNamesMatch(s.aula,filters.aula))return false;if(filters.profesor&&s.profesor!==filters.profesor)return false;return true})}function findSensorForRoom(roomName){if(!roomName)return null;for(const[code,values]of Object.entries(sensorData||{})){if(roomNamesMatch(roomName,code)){return{code:code,values:values}}}return null}function formatSensorValue(type,value){if(value===null||value===undefined||value===\"\")return null;const num=Number(value);if(Number.isNaN(num))return null;if(type===\"temperatura\")return num.toFixed(1)+\"\\xb0C\";if(type===\"humedad\")return num.toFixed(1)+\"%\";if(type===\"co2\")return Math.round(num)+\" ppm\";return String(value)}function sensorTagsHTML(sensorValues){if(!sensorValues)return\"\";const ordered=[[\"temperatura\",\"Temperatura\"],[\"humedad\",\"Humedad\"],[\"co2\",\"CO\\u2082\"]];const tags=ordered.map(([key,label])=>{const formatted=formatSensorValue(key,sensorValues[key]);if(!formatted)return\"\";return'<span class=\"sensor-tag\">'+SENSOR_ICONS[key]+\"<span>\"+label+\": \"+formatted+\"<\/span><\/span>\"}).filter(Boolean).join(\"\");return tags?'<div class=\"sensor-tags\">'+tags+\"<\/div>\":\"\"}function roomSummaryHTML(roomName){const match=findSensorForRoom(roomName);const tags=match?sensorTagsHTML(match.values):\"\";return'<div class=\"room-sensor-summary fade-in\"><div class=\"room-sensor-title\"><h2>Horario de '+esc(roomName)+\"<\/h2><\/div>\"+tags+\"<\/div>\"}function render(){const sessions=getFiltered();const noEv=sessions.filter(s=>s.tipo!==\"evento\");let statusHtml=\"<strong>\"+noEv.length+\"<\/strong> sesiones\"+(filters.grupo?\" \\xb7 Grupo <strong>\"+filters.grupo+\"<\/strong>\":\"\")+(filters.dia?\" \\xb7 <strong>\"+filters.dia+\"<\/strong>\":\"\")+(filters.profesor?\" \\xb7 <strong>\"+filters.profesor+\"<\/strong>\":\"\")+(filters.aula?\" \\xb7 <strong>\"+esc(filters.aula)+\"<\/strong>\":\"\");if(dbError){statusHtml+=' \\xb7 <strong style=\"color:#b91c1c\">Sensores no disponibles<\/strong>'}document.getElementById(\"statusCount\").innerHTML=statusHtml;if(!sessions.length){document.getElementById(\"content\").innerHTML='<div class=\"empty-state fade-in\"><h3>Sin resultados<\/h3><p>No hay sesiones para los filtros seleccionados.<\/p><\/div>';return}currentView===\"grid\"?renderGrid(sessions):renderList(sessions)}function renderGrid(sessions){const SLOTS=timeSlots();const grid={};SLOTS.forEach(ts=>{grid[ts]={};DAYS.forEach(d=>grid[ts][d]=[])});sessions.forEach(s=>{const k=s.hora_inicio+\"-\"+s.hora_fin;if(grid[k]&&grid[k][s.dia])grid[k][s.dia].push(s)});let h=\"\";if(currentMode===\"room\"&&filters.aula){h+=roomSummaryHTML(filters.aula)}h+='<div class=\"timetable fade-in\"><div class=\"tt-header\"><\/div>';DAYS.forEach(d=>{h+='<div class=\"tt-header\"'+(filters.dia===d?' style=\"background:var(--esi-light)\"':\"\")+\">\"+d+\"<\/div>\"});SLOTS.forEach(ts=>{const[s,e]=ts.split(\"-\");h+='<div class=\"tt-time\">'+s+\"<br>\"+e+\"<\/div>\";DAYS.forEach(d=>{h+='<div class=\"tt-cell\">';const items=grid[ts][d];if(!items.length)h+=\"&nbsp;\";else items.forEach(s=>h+=cardHTML(s));h+=\"<\/div>\"})});h+=\"<\/div>\";document.getElementById(\"content\").innerHTML=h}function renderList(sessions){const dayOrd=Object.fromEntries(DAYS.map((d,i)=>[d,i]));const sorted=[...sessions].filter(s=>s.tipo!==\"evento\").sort((a,b)=>(dayOrd[a.dia]??9)-(dayOrd[b.dia]??9)||a.hora_inicio.localeCompare(b.hora_inicio));let h='<div class=\"fade-in\" style=\"overflow-x:auto\"><table class=\"list-table\"><thead><tr><th>D\\xeda<\/th><th>Hora<\/th><th>Asignatura<\/th><th>Tipo<\/th><th>Grupo<\/th><th>Aula<\/th><th>Profesor<\/th><th>Pr\\xe1cticas<\/th><\/tr><\/thead><tbody>';sorted.forEach(s=>{const tc=s.tipo===\"laboratorio\"?\"lab\":s.tipo===\"evento\"?\"event\":\"theory\";const bg=tc===\"lab\"?\"#3a7bd5\":tc===\"event\"?\"#a67c00\":\"var(--esi-navy)\";h+=\"<tr><td>\"+s.dia+\"<\/td><td style=\\\"font-family:'JetBrains Mono',monospace;font-size:.78rem\\\">\"+s.hora_inicio+\"\\u2013\"+s.hora_fin+\"<\/td><td><strong>\"+esc(s.asignatura)+'<\/strong><\/td><td class=\"badge-cell\"><span class=\"session-badge\" style=\"background:'+bg+'\">'+s.tipo+\"<\/span><\/td><td>\"+esc(s.grupo)+'<\/td><td style=\"font-size:.75rem\">'+roomLinkHTML(s.aula)+\"<\/td><td>\"+professorHTML(s.profesor,s.tipo)+\"<\/td><td>\"+esc(s.grupo_practicas)+\"<\/td><\/tr>\"});h+=\"<\/tbody><\/table><\/div>\";document.getElementById(\"content\").innerHTML=h}function cardHTML(s){const tc=s.tipo===\"laboratorio\"?\"lab\":s.tipo===\"evento\"?\"event\":\"theory\";let d=\"\";if(s.aula)d+='<div class=\"session-detail\">'+roomLinkHTML(s.aula)+\"<\/div>\";if(s.profesor)d+='<div class=\"session-detail\">'+professorHTML(s.profesor,s.tipo)+\"<\/div>\";let b=\"\";if(s.grupo_practicas)b='<span class=\"session-badge\">'+esc(s.grupo_practicas)+\"<\/span>\";else if(currentMode!==\"student\"&&s.grupo)b='<span class=\"session-badge\">'+esc(s.grupo)+\"<\/span>\";const sensorMatch=currentMode!==\"room\"&&s.aula?findSensorForRoom(s.aula):null;const sensors=sensorMatch?sensorTagsHTML(sensorMatch.values):\"\";return'<div class=\"session-card '+tc+'\"><div class=\"session-subject\">'+esc(s.asignatura)+\"<\/div>\"+d+b+sensors+\"<\/div>\"}function mkEl(t,c){const e=document.createElement(t);if(c)e.className=c;return e}function mkLabel(t){const l=document.createElement(\"label\");l.textContent=t;return l}function esc(s){return s?s.replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/>\/g,\"&gt;\"):\"\"}function findRoomId(aulaName){if(!aulaName)return null;const name=String(aulaName).trim();if(ROOM_TO_ID[name])return ROOM_TO_ID[name];const upper=name.toUpperCase();for(const key of ROOM_KEYS_SORTED){if(upper.includes(key.toUpperCase()))return ROOM_TO_ID[key]}return null}const MAP_PIN_SVG='<svg viewBox=\"0 0 24 24\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 21s-7-6.5-7-12a7 7 0 1 1 14 0c0 5.5-7 12-7 12Z\"\/><circle cx=\"12\" cy=\"9\" r=\"2.5\"\/><\/svg>';const TUTORIAS_URL=\"https:\/\/esi.uclm.es\/index.php\/grado-en-ingenieria-informatica\/profesorado\/\";const CLOCK_SVG='<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg>';function professorHTML(profName,tipo){if(!profName)return\"\";const safe=esc(profName);if(tipo===\"evento\")return safe;return safe+' <a href=\"'+TUTORIAS_URL+'\" class=\"tutorias-link\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Horario de tutor\\xedas del profesorado\">('+CLOCK_SVG+\"tutor\\xedas)<\/a>\"}function roomLinkHTML(aulaName){if(!aulaName)return\"\";const safe=esc(aulaName);const roomId=findRoomId(aulaName);if(!roomId)return safe;return'<a href=\"'+MAP_URL+'\" class=\"room-link\" data-room-id=\"'+roomId+'\" title=\"Ver en el mapa interactivo\">'+safe+MAP_PIN_SVG+\"<\/a>\"}document.addEventListener(\"click\",function(ev){const link=ev.target.closest&&ev.target.closest(\".room-link\");if(!link)return;const roomId=link.dataset.roomId;if(!roomId)return;try{localStorage.setItem(MAP_STORAGE_KEY,roomId)}catch(_){}});<\/script>\r\n<\/body>\r\n<\/html>\r\n","protected":false},"excerpt":{"rendered":"<p>Horarios ESI \u2013 UCLM 2026\/27 Horarios ESI Grado Ing. Inform\u00e1tica \u00b7 UCLM 2026\/27 1er Cuatrimestre 2\u00ba Cuatrimestre Estudiante Aula Teor\u00eda Laboratorio Evento Cuadr\u00edcula Lista<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-22820","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica - Escuela Superior de Inform\u00e1tica de UCLM<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica - Escuela Superior de Inform\u00e1tica de UCLM\" \/>\n<meta property=\"og:description\" content=\"Horarios ESI \u2013 UCLM 2026\/27 Horarios ESI Grado Ing. Inform\u00e1tica \u00b7 UCLM 2026\/27 1er Cuatrimestre 2\u00ba Cuatrimestre Estudiante Aula Teor\u00eda Laboratorio Evento Cuadr\u00edcula Lista\" \/>\n<meta property=\"og:url\" content=\"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/\" \/>\n<meta property=\"og:site_name\" content=\"Escuela Superior de Inform\u00e1tica de UCLM\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Escuela-Superior-de-Informtica-543261809027158\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-27T14:30:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1-1.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@esiuclm\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/\",\"name\":\"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica - Escuela Superior de Inform\u00e1tica de UCLM\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1-1.png\",\"datePublished\":\"2026-03-10T12:24:08+00:00\",\"dateModified\":\"2026-07-27T14:30:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/#primaryimage\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1-1.png\",\"contentUrl\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1-1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/consulta-de-horarios-del-grado-en-ingenieria-informatica\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/esi.uclm.es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#website\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/\",\"name\":\"Escuela Superior de Inform\u00e1tica de UCLM en Ciudad Real, Castilla-La Mancha\",\"description\":\"La Escuela Superior de Inform\u00e1tica de Ciudad Real (Castilla-La Mancha), Universidad de Castilla-La Mancha es un centro universitario que imparte el ciclo completo de Ingenier\u00eda en Inform\u00e1tica: grado, m\u00e1ster y doctorado.\",\"publisher\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/esi.uclm.es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#organization\",\"name\":\"Escuela Superior de Inform\u00e1tica de UCLM\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1.png\",\"contentUrl\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1.png\",\"width\":460,\"height\":184,\"caption\":\"Escuela Superior de Inform\u00e1tica de UCLM\"},\"image\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Escuela-Superior-de-Informtica-543261809027158\",\"https:\\\/\\\/x.com\\\/esiuclm\",\"https:\\\/\\\/www.instagram.com\\\/esiuclm\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/esiuclm\",\"https:\\\/\\\/www.twitch.tv\\\/esiuclm\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/12656631\\\/admin\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica - Escuela Superior de Inform\u00e1tica de UCLM","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/","og_locale":"es_ES","og_type":"article","og_title":"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica - Escuela Superior de Inform\u00e1tica de UCLM","og_description":"Horarios ESI \u2013 UCLM 2026\/27 Horarios ESI Grado Ing. Inform\u00e1tica \u00b7 UCLM 2026\/27 1er Cuatrimestre 2\u00ba Cuatrimestre Estudiante Aula Teor\u00eda Laboratorio Evento Cuadr\u00edcula Lista","og_url":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/","og_site_name":"Escuela Superior de Inform\u00e1tica de UCLM","article_publisher":"https:\/\/www.facebook.com\/Escuela-Superior-de-Informtica-543261809027158","article_modified_time":"2026-07-27T14:30:43+00:00","og_image":[{"url":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1-1.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_site":"@esiuclm","twitter_misc":{"Tiempo de lectura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/","url":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/","name":"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica - Escuela Superior de Inform\u00e1tica de UCLM","isPartOf":{"@id":"https:\/\/esi.uclm.es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/#primaryimage"},"image":{"@id":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/#primaryimage"},"thumbnailUrl":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1-1.png","datePublished":"2026-03-10T12:24:08+00:00","dateModified":"2026-07-27T14:30:43+00:00","breadcrumb":{"@id":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/#primaryimage","url":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1-1.png","contentUrl":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1-1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/esi.uclm.es\/"},{"@type":"ListItem","position":2,"name":"Consulta de Horarios del Grado en Ingenier\u00eda Inform\u00e1tica"}]},{"@type":"WebSite","@id":"https:\/\/esi.uclm.es\/#website","url":"https:\/\/esi.uclm.es\/","name":"Escuela Superior de Inform\u00e1tica de UCLM en Ciudad Real, Castilla-La Mancha","description":"La Escuela Superior de Inform\u00e1tica de Ciudad Real (Castilla-La Mancha), Universidad de Castilla-La Mancha es un centro universitario que imparte el ciclo completo de Ingenier\u00eda en Inform\u00e1tica: grado, m\u00e1ster y doctorado.","publisher":{"@id":"https:\/\/esi.uclm.es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/esi.uclm.es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/esi.uclm.es\/#organization","name":"Escuela Superior de Inform\u00e1tica de UCLM","url":"https:\/\/esi.uclm.es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/esi.uclm.es\/#\/schema\/logo\/image\/","url":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1.png","contentUrl":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1.png","width":460,"height":184,"caption":"Escuela Superior de Inform\u00e1tica de UCLM"},"image":{"@id":"https:\/\/esi.uclm.es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Escuela-Superior-de-Informtica-543261809027158","https:\/\/x.com\/esiuclm","https:\/\/www.instagram.com\/esiuclm\/","https:\/\/www.youtube.com\/user\/esiuclm","https:\/\/www.twitch.tv\/esiuclm","https:\/\/www.linkedin.com\/company\/12656631\/admin\/"]}]}},"_links":{"self":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages\/22820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/comments?post=22820"}],"version-history":[{"count":25,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages\/22820\/revisions"}],"predecessor-version":[{"id":23607,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages\/22820\/revisions\/23607"}],"wp:attachment":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/media?parent=22820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}