{"id":32,"date":"2025-05-30T21:20:54","date_gmt":"2025-05-30T21:20:54","guid":{"rendered":"https:\/\/juraon.com\/?page_id=32"},"modified":"2025-07-02T17:20:57","modified_gmt":"2025-07-02T17:20:57","slug":"calculadora-solar","status":"publish","type":"page","link":"https:\/\/juraon.com\/en\/calculadora-solar\/","title":{"rendered":"Solar Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"32\" class=\"elementor elementor-32\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-18fead9 e-con-full e-flex e-con e-parent\" data-id=\"18fead9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c5eb9ed ha-has-bg-overlay elementor-widget elementor-widget-html\" data-id=\"c5eb9ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"utf-8\"\/>\n  <title>Calculadora Solar - JuraON<\/title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\/>\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n  <style>\n    body { font-family: sans-serif; background: #f0f0f0; margin: 0; padding: 20px; }\n    .calculadora-container {\n      max-width: 800px; margin: auto; background: #fff; border-radius: 12px;\n      overflow: hidden; box-shadow: 0 0 20px rgba(0,0,0,0.1);\n    }\n    .calculadora-body { padding: 20px; }\n    label { font-weight: bold; display: block; margin-top: 10px; }\n    input, select {\n      width: 100%; padding: 8px; margin-top: 5px; margin-bottom: 15px;\n      border-radius: 6px; border: 1px solid #ccc;\n    }\n    button {\n      background: #2a7d2e; color: white; padding: 12px 24px; border: none;\n      border-radius: 6px; cursor: pointer; font-weight: bold;\n      transition: background 0.3s ease;\n    }\n    button:hover {\n      background: #1e5a21;\n    }\n    .resultados {\n      margin-top: 30px; background: #f8f8f8; padding: 20px; border-radius: 12px;\n      line-height: 1.6; \/* Mejora la legibilidad del texto *\/\n    }\n    .resultados p {\n        margin-bottom: 5px; \/* Espacio entre p\u00e1rrafos en los resultados *\/\n    }\n    canvas { margin-top: 20px; display: none; }\n\n    \/* Estilo para el bot\u00f3n de WhatsApp *\/\n    .whatsapp-button {\n      background: #25D366; \/* Color de WhatsApp *\/\n      margin-top: 20px;\n      display: block; \/* Para que ocupe su propia l\u00ednea *\/\n      width: fit-content; \/* Ajustar ancho al contenido *\/\n      margin-left: auto; \/* Centrar el bot\u00f3n si se desea *\/\n      margin-right: auto;\n      padding: 12px 24px;\n      border-radius: 6px;\n      color: white;\n      font-weight: bold;\n      border: none;\n      cursor: pointer;\n      transition: background 0.3s ease;\n    }\n    .whatsapp-button:hover {\n      background: #1DA851;\n    }\n    \/* Estilo para espaciar el bot\u00f3n calcular *\/\n    .calculate-button-spacing {\n      margin-top: 25px; \/* Aumenta el margen superior del bot\u00f3n calcular *\/\n    }\n    .kpi-section {\n        margin-top: 20px;\n        background: #e6f7ff;\n        padding: 15px;\n        border-radius: 8px;\n        border: 1px solid #cceeff;\n        font-size: 0.95em;\n    }\n    .kpi-section p {\n        margin: 0;\n        padding: 3px 0;\n    }\n    .recommendation-section {\n        margin-top: 15px;\n        background: #fff3e0; \/* Color suave para recomendaciones *\/\n        padding: 15px;\n        border-radius: 8px;\n        border: 1px solid #ffcc80;\n        font-size: 0.9em;\n        color: #e65100; \/* Color para el texto de recomendaci\u00f3n *\/\n    }\n    .recommendation-section ul {\n        margin: 0;\n        padding-left: 20px;\n    }\n    .recommendation-section li {\n        margin-bottom: 5px;\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"calculadora-container\">\n    <div class=\"calculadora-header\">\n      <img decoding=\"async\" src=\"https:\/\/juraon.com\/wp-content\/uploads\/2025\/06\/LOGO-FINAL.png\" alt=\"Logo JuraON\" style=\"width: 30%; display: block; border-top-left-radius: 12px; border-top-right-radius: 12px;\">\n    <\/div>\n    <div class=\"calculadora-body\">\n      <h2>Calculadora Solar<\/h2>\n      <label for=\"consumo\">Consumo anual (kWh):<\/label>\n      <input id=\"consumo\" type=\"number\" placeholder=\"Ej: 3500\" value=\"3500\"\/>\n      \n      <label for=\"bateria\">\u00bfDeseas bater\u00eda?<\/label>\n      <select id=\"bateria\">\n        <option value=\"no\">No<\/option>\n        <option value=\"si\">S\u00ed<\/option>\n      <\/select>\n\n      <label for=\"bateriaCapacidad\" id=\"bateriaCapacidadLabel\" style=\"display: none;\">Capacidad de Bater\u00eda (kWh):<\/label>\n      <select id=\"bateriaCapacidad\" style=\"display: none;\">\n        <option value=\"5\">5 kWh<\/option>\n        <option value=\"10\">10 kWh<\/option>\n        <option value=\"15\">15 kWh<\/option>\n        <option value=\"20\">20 kWh<\/option>\n      <\/select>\n      \n      <label for=\"conexion\">Tipo de conexi\u00f3n el\u00e9ctrica:<\/label>\n      <select id=\"conexion\">\n        <option value=\"monofasico\">Monof\u00e1sico<\/option>\n        <option value=\"trifasico\">Trif\u00e1sico<\/option>\n      <\/select>\n      \n      <label for=\"consumoSolar\">\u00bfQu\u00e9 porcentaje de tu consumo ocurre en horario solar?<\/label>\n      <select id=\"consumoSolar\">\n        <option value=\"25\">25%<\/option>\n        <option value=\"50\" selected>50%<\/option>\n        <option value=\"75\">75%<\/option>\n        <option value=\"100\">100%<\/option>\n      <\/select>\n      \n      <label for=\"eficiencia\">Eficiencia del sistema:<\/label>\n      <select id=\"eficiencia\">\n        <option value=\"0.75\">Baja<\/option>\n        <option selected value=\"0.85\">Media<\/option>\n        <option value=\"0.93\">Alta<\/option>\n      <\/select>\n      \n      <label for=\"orientacion\">Orientaci\u00f3n del tejado:<\/label>\n      <select id=\"orientacion\">\n        <option value=\"2050\" selected>Sur (\u00f3ptima)<\/option>\n        <option value=\"1850\">Este-Oeste<\/option>\n        <option value=\"1500\">Otra\/Norte<\/option>\n      <\/select>\n\n      <!-- Nueva opci\u00f3n para paneles manuales -->\n      <label for=\"manualPanelesToggle\" style=\"margin-top: 15px; display: flex; align-items: center;\">\n        <input type=\"checkbox\" id=\"manualPanelesToggle\" onchange=\"toggleManualPanelesInput()\" style=\"width: auto; margin-right: 10px; margin-bottom: 0;\"\/>\n        Modificar n\u00famero de paneles manualmente\n      <\/label>\n      <div id=\"manualPanelesInputContainer\" style=\"display: none;\">\n        <label for=\"panelesManuales\">N\u00famero de Paneles Manuales:<\/label>\n        <input id=\"panelesManuales\" type=\"number\" min=\"1\" value=\"10\"\/>\n      <\/div>\n      \n      <button onclick=\"calcularAvanzado()\" class=\"calculate-button-spacing\">Calcular<\/button>\n      \n      <select id=\"modoVisualizacion\" onchange=\"calcularAvanzado()\">\n        <option value=\"flujo\">Flujo energ\u00e9tico real<\/option>\n        <option value=\"balance\">Balance econ\u00f3mico compensado<\/option>\n        <option value=\"mensual\">Flujo Energ\u00e9tico Mensual<\/option> <!-- Nueva opci\u00f3n para gr\u00e1fico mensual -->\n      <\/select>\n      <canvas id=\"graficoProduccion\" width=\"400\" height=\"300\"><\/canvas>\n      <div class=\"resultados\" id=\"resultados\"><\/div>\n      <div id=\"ajustePaneles\" style=\"margin-top:20px;\"><\/div>\n      <div class=\"kpi-section\" id=\"kpis\"><\/div> <!-- Secci\u00f3n para los KPIs -->\n      <div class=\"recommendation-section\" id=\"recommendations\"><\/div> <!-- Secci\u00f3n para las recomendaciones -->\n\n      <!-- Bot\u00f3n de WhatsApp -->\n      <button class=\"whatsapp-button\" onclick=\"compartirPorWhatsApp()\">Enviar resultado por WhatsApp<\/button>\n    <\/div>\n  <\/div>\n  <script>\n    let chartInstance = null; \/\/ Variable para almacenar la instancia del gr\u00e1fico\n    const WATT_PER_PANEL = 450; \/\/ Constante para la potencia del panel\n    \n    \/\/ Costo por kWh de capacidad de bater\u00eda\n    const COSTO_POR_KWH_BATERIA = 600; \/\/ Por ejemplo, 600\u20ac por kWh de bater\u00eda\n    const BATERIA_CICLOS_POR_ANIO = 300; \/\/ N\u00famero estimado de ciclos completos al a\u00f1o para la bater\u00eda\n    const BATERIA_ROUNDTRIP_EFFICIENCY = 0.9; \/\/ Eficiencia de carga\/descarga de la bater\u00eda (90%)\n    \n    const IPC_ANUAL = 0.02; \/\/ 2% de incremento anual del IPC\n    const DEGRADACION_ANUAL_PANELES = 0.005; \/\/ 0.5% de degradaci\u00f3n anual de los paneles\n\n    \/\/ Irradiancia solar promedio mensual por kWp nominal (ejemplo para Espa\u00f1a, sur)\n    \/\/ Estos valores son un porcentaje de la producci\u00f3n total anual esperada.\n    \/\/ Fuente: Datos aproximados de PVGIS o similar para orientaci\u00f3n Sur.\n    const IRRADIANCIA_MENSUAL_DISTRIBUCION = [\n        0.05,  \/\/ Ene\n        0.06,  \/\/ Feb\n        0.08,  \/\/ Mar\n        0.10,  \/\/ Abr\n        0.12,  \/\/ May\n        0.12,  \/\/ Jun\n        0.11,  \/\/ Jul\n        0.10,  \/\/ Ago\n        0.09,  \/\/ Sep\n        0.07,  \/\/ Oct\n        0.06,  \/\/ Nov\n        0.04   \/\/ Dic\n    ];\n    const MESES = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];\n\n    \/\/ Factor de emisi\u00f3n de CO2 (kg CO2 por kWh producido de la red, valor estimado)\n    const EMISION_CO2_POR_KWH = 0.3; \/\/ kg CO2 \/ kWh\n\n    function toggleManualPanelesInput() {\n      const toggle = document.getElementById('manualPanelesToggle');\n      const container = document.getElementById('manualPanelesInputContainer');\n      if (toggle.checked) {\n        container.style.display = 'block';\n      } else {\n        container.style.display = 'none';\n      }\n      \/\/ Recalcular para aplicar el nuevo ajuste de paneles (manual o autom\u00e1tico)\n      calcularAvanzado();\n    }\n\n    \/\/ Funci\u00f3n para mostrar\/ocultar el selector de capacidad de bater\u00eda\n    document.getElementById('bateria').addEventListener('change', function() {\n      const bateriaSelected = this.value;\n      const bateriaCapacidadSelect = document.getElementById('bateriaCapacidad');\n      const bateriaCapacidadLabel = document.getElementById('bateriaCapacidadLabel');\n      if (bateriaSelected === 'si') {\n        bateriaCapacidadSelect.style.display = 'block';\n        bateriaCapacidadLabel.style.display = 'block';\n      } else {\n        bateriaCapacidadSelect.style.display = 'none';\n        bateriaCapacidadLabel.style.display = 'none';\n      }\n      calcularAvanzado(); \/\/ Recalcular al cambiar la opci\u00f3n de bater\u00eda\n    });\n    \n    \/\/ Escuchar cambios en la capacidad de la bater\u00eda para recalcular\n    document.getElementById('bateriaCapacidad').addEventListener('change', calcularAvanzado);\n\n    function calcularAvanzado() {\n      const consumoAnual = parseFloat(document.getElementById('consumo').value);\n      const bateria = document.getElementById('bateria').value;\n      const conexion = document.getElementById('conexion').value;\n      const consumoSolar = parseFloat(document.getElementById('consumoSolar').value) \/ 100;\n      const eficiencia = parseFloat(document.getElementById('eficiencia').value);\n      const orientacion = parseFloat(document.getElementById('orientacion').value);\n\n      const manualPanelesToggle = document.getElementById('manualPanelesToggle').checked;\n      const panelesManualesInput = parseFloat(document.getElementById('panelesManuales').value);\n\n      const resultadosDiv = document.getElementById('resultados');\n      const graficoCanvas = document.getElementById('graficoProduccion');\n      const ajustePanelesDiv = document.getElementById('ajustePaneles');\n      const kpisDiv = document.getElementById('kpis');\n      const recommendationsDiv = document.getElementById('recommendations');\n\n      if (isNaN(consumoAnual) || consumoAnual <= 0) {\n        resultadosDiv.innerHTML = \"<p>\u26a0\ufe0f Por favor, introduce un <strong>consumo anual v\u00e1lido<\/strong> para calcular.<\/p>\";\n        graficoCanvas.style.display = 'none';\n        ajustePanelesDiv.innerHTML = '';\n        kpisDiv.innerHTML = '';\n        recommendationsDiv.innerHTML = '';\n        if (chartInstance) {\n            chartInstance.destroy();\n            chartInstance = null;\n        }\n        return;\n      }\n\n      let kwpNecesarios;\n      let panelesSolares;\n\n      const produccionAnualPorkWp = orientacion * eficiencia;\n\n      if (manualPanelesToggle && !isNaN(panelesManualesInput) && panelesManualesInput > 0) {\n        panelesSolares = panelesManualesInput;\n        kwpNecesarios = (panelesSolares * WATT_PER_PANEL) \/ 1000;\n      } else {\n        kwpNecesarios = consumoAnual \/ produccionAnualPorkWp;\n        panelesSolares = Math.ceil(kwpNecesarios * 1000 \/ WATT_PER_PANEL);\n      }\n\n      let bateriaInfo = \"\";\n      let costoAdicionalBateria = 0;\n      let bateriaCapacidadKWhSeleccionada = 0;\n\n      if (bateria === \"si\") {\n        bateriaCapacidadKWhSeleccionada = parseFloat(document.getElementById('bateriaCapacidad').value);\n        bateriaInfo = `\\n- \ud83d\udd0b Se recomienda a\u00f1adir bater\u00eda (${bateriaCapacidadKWhSeleccionada} kWh) para maximizar el autoconsumo y la independencia energ\u00e9tica.`;\n        costoAdicionalBateria = bateriaCapacidadKWhSeleccionada * COSTO_POR_KWH_BATERIA;\n      }\n\n      const produccionTotalSolar = kwpNecesarios * produccionAnualPorkWp;\n\n      \/\/ --- L\u00f3gica de Flujo de Energ\u00eda (Anualizada) ---\n\n      \/\/ Paso 1: Autoconsumo Directo (lo que se produce y consume al instante)\n      const consumoDiurnoAnual = consumoAnual * consumoSolar;\n      const produccionDiurnaAnual = produccionTotalSolar; \/\/ Asumimos toda la producci\u00f3n es diurna\n\n      let energiaAutoconsumidaDirecta = Math.min(produccionDiurnaAnual, consumoDiurnoAnual);\n      let excedentesPostAutoconsumoDirecto = Math.max(0, produccionDiurnaAnual - energiaAutoconsumidaDirecta);\n      let deficitDiurno = Math.max(0, consumoDiurnoAnual - produccionDiurnaAnual);\n      const consumoNocturnoAnual = consumoAnual * (1 - consumoSolar);\n\n      let energiaAutoconsumidaFinal;\n      let energiaVertidaFinal;\n      let energiaTomadaDeRedFinal;\n\n      if (bateria === \"si\") {\n          \/\/ Capacidad efectiva de la bater\u00eda anual\n          const bateriaCapacidadAnualEfectiva = bateriaCapacidadKWhSeleccionada * BATERIA_CICLOS_POR_ANIO * BATERIA_ROUNDTRIP_EFFICIENCY;\n\n          \/\/ Energ\u00eda que la bater\u00eda intenta cargar de los excedentes diurnos\n          let energiaCargadaBateria = Math.min(excedentesPostAutoconsumoDirecto, bateriaCapacidadAnualEfectiva);\n\n          \/\/ Energ\u00eda que la bater\u00eda intenta descargar para cubrir el consumo nocturno\n          let energiaDescargadaBateria = Math.min(consumoNocturnoAnual, energiaCargadaBateria);\n\n          \/\/ Energ\u00eda autoconsumida final: directo + de bater\u00eda\n          energiaAutoconsumidaFinal = energiaAutoconsumidaDirecta + energiaDescargadaBateria;\n\n          \/\/ Energ\u00eda vertida final: excedentes post-autoconsumo directo que no fueron cargados en la bater\u00eda\n          energiaVertidaFinal = excedentesPostAutoconsumoDirecto - energiaCargadaBateria;\n\n          \/\/ Energ\u00eda tomada de red final: d\u00e9ficit diurno + consumo nocturno no cubierto por bater\u00eda\n          energiaTomadaDeRedFinal = deficitDiurno + (consumoNocturnoAnual - energiaDescargadaBateria);\n\n      } else {\n          \/\/ Sin bater\u00eda\n          energiaAutoconsumidaFinal = energiaAutoconsumidaDirecta;\n          energiaVertidaFinal = excedentesPostAutoconsumoDirecto;\n          energiaTomadaDeRedFinal = deficitDiurno + consumoNocturnoAnual;\n      }\n      \n      \/\/ Asegurarse de que no haya valores negativos\n      energiaVertidaFinal = Math.max(0, energiaVertidaFinal);\n      energiaTomadaDeRedFinal = Math.max(0, energiaTomadaDeRedFinal);\n      \/\/ Ajuste para que el autoconsumo final no exceda el consumo anual total\n      energiaAutoconsumidaFinal = Math.min(energiaAutoconsumidaFinal, consumoAnual);\n\n\n      \/\/ Simulaci\u00f3n de costos\n      const costoPorkWp = 1500;\n      const costoEstimadoInstalacion = (kwpNecesarios * costoPorkWp) + costoAdicionalBateria;\n\n      \/\/ Calcular ahorro anual\n      const precioKWhCompra = 0.20;\n      const precioKWhVenta = 0.05;\n\n      const ahorroPorAutoconsumo = energiaAutoconsumidaFinal * precioKWhCompra;\n      const ingresoPorVentaExcedentes = energiaVertidaFinal * precioKWhVenta;\n      const costoPorConsumoDeRed = energiaTomadaDeRedFinal * precioKWhCompra;\n\n      const ahorroAnualTotal = (consumoAnual * precioKWhCompra) - (energiaTomadaDeRedFinal * precioKWhCompra) + (ingresoPorVentaExcedentes);\n\n      const payback = ahorroAnualTotal > 0 ? costoEstimadoInstalacion \/ ahorroAnualTotal : Infinity;\n\n      \/\/ ** C\u00e1lculo del beneficio econ\u00f3mico a 20 a\u00f1os con IPC y Degradaci\u00f3n de Paneles **\n      let beneficioEconomico20Anos = 0;\n      let ahorroAcumuladoProyectado = 0;\n\n      for (let i = 0; i < 20; i++) {\n          const factorDegradacionAnual = Math.pow(1 - DEGRADACION_ANUAL_PANELES, i);\n          const ahorroAnualAjustado = ahorroAnualTotal * Math.pow(1 + IPC_ANUAL, i) * factorDegradacionAnual;\n          ahorroAcumuladoProyectado += ahorroAnualAjustado;\n      }\n      \n      beneficioEconomico20Anos = ahorroAcumuladoProyectado - costoEstimadoInstalacion;\n\n\n      \/\/ ** Formato de resultados con emojis y m\u00e1s atractivo **\n      let resultadosTexto = `\n        \u26a1\ufe0f **Resultados del Estudio Solar:**\n\n        - \ud83d\udcc8 Consumo Anual Estimado: <strong>${consumoAnual.toFixed(2)} kWh<\/strong>\n        - \u2600\ufe0f Potencia Fotovoltaica Necesaria: <strong>${kwpNecesarios.toFixed(2)} kWp<\/strong>\n        - \ud83d\udce6 Paneles Solares Sugeridos (aprox.): <strong>${panelesSolares} paneles<\/strong> (de ${WATT_PER_PANEL}W)\n        - \ud83d\udd0c Tipo de Conexi\u00f3n: <strong>${conexion.charAt(0).toUpperCase() + conexion.slice(1)}<\/strong>\n        - \ud83c\udfe0 Porcentaje de Consumo Solar: <strong>${(consumoSolar * 100).toFixed(0)}%<\/strong>\n        ${bateriaInfo}\n\n        \ud83d\udcb0 **Estimaci\u00f3n Econ\u00f3mica Anual:**\n        - \u2705 Ahorro Estimado por Autoconsumo: <strong>${ahorroPorAutoconsumo.toFixed(2)} \u20ac\/a\u00f1o<\/strong>\n        - \ud83d\udcc9 Ingresos Estimados por Venta de Excedentes: <strong>${ingresoPorVentaExcedentes.toFixed(2)} \u20ac\/a\u00f1o<\/strong>\n        - \ud83d\udcb8 Costo Estimado por Consumo de Red: <strong>${costoPorConsumoDeRed.toFixed(2)} \u20ac\/a\u00f1o<\/strong>\n        - \ud83d\udcca Ahorro Anual Total Estimado (Neto): <strong>${ahorroAnualTotal.toFixed(2)} \u20ac\/a\u00f1o<\/strong>\n        - \u23f3 Payback Estimado: <strong>${payback !== Infinity ? payback.toFixed(1) + ' a\u00f1os' : 'N\/A (sin ahorro o inversi\u00f3n inicial)'}<\/strong>\n        - \ud83d\ude80 Beneficio Econ\u00f3mico a 20 A\u00f1os: <strong>${beneficioEconomico20Anos.toFixed(2)} \u20ac<\/strong>\n\n        \u2728 \u00a1JuraON te ayuda a dar el salto a la energ\u00eda solar! \u00a1Reduce tu factura y contribuye al planeta! \ud83c\udf0d\n      `;\n      resultadosDiv.innerHTML = resultadosTexto.replace(\/\\n\/g, '<br>');\n\n      \/\/ Mostrar informaci\u00f3n adicional sobre paneles\n      ajustePanelesDiv.innerHTML = `\n        <p><strong>Detalles sobre la Instalaci\u00f3n:<\/strong><\/p>\n        <ul>\n          <li>Calculamos una producci\u00f3n promedio de <strong>${produccionAnualPorkWp.toFixed(0)} kWh\/kWp\/a\u00f1o<\/strong> para tu orientaci\u00f3n y eficiencia.<\/li>\n          <li>El espacio disponible en tu tejado y sombreados pueden influir en el n\u00famero final de paneles.<\/li>\n          <li>Un estudio t\u00e9cnico detallado es esencial para optimizar tu sistema. \u00a1Cons\u00faltanos!<\/li>\n        <\/ul>\n      `;\n\n      \/\/ ** C\u00e1lculo de KPIs **\n      const porcentajeAutoconsumoReal = (produccionTotalSolar > 0) ? (energiaAutoconsumidaFinal \/ produccionTotalSolar) * 100 : 0;\n      const porcentajeIndependenciaEnergetica = (consumoAnual > 0) ? (energiaAutoconsumidaFinal \/ consumoAnual) * 100 : 0;\n      const reduccionCO2Estimada = (produccionTotalSolar * EMISION_CO2_POR_KWH).toFixed(2);\n\n      kpisDiv.innerHTML = `\n        <h3>Key Performance Indicators (KPIs)<\/h3>\n        <p>\ud83d\udcc8 Porcentaje de Autoconsumo Real: <strong>${porcentajeAutoconsumoReal.toFixed(1)}%<\/strong><\/p>\n        <p>\ud83c\udfe1 Porcentaje de Independencia Energ\u00e9tica: <strong>${porcentajeIndependenciaEnergetica.toFixed(1)}%<\/strong><\/p>\n        <p>\ud83c\udf31 Reducci\u00f3n Estimada de CO2: <strong>${reduccionCO2Estimada} kg\/a\u00f1o<\/strong><\/p>\n      `;\n\n      \/\/ ** Mensajes Din\u00e1micos\/Recomendaciones **\n      let recommendationsHTML = '<h3>Recomendaciones Personalizadas<\/h3><ul>';\n      const porcentajeVertidoProduccion = (produccionTotalSolar > 0) ? (energiaVertidaFinal \/ produccionTotalSolar) * 100 : 0;\n      const UMBRAL_VERTIDO_ALTO = 30;\n\n      if (bateria === \"no\" && porcentajeVertidoProduccion > UMBRAL_VERTIDO_ALTO) {\n          recommendationsHTML += `<li>\ud83d\udca1 Tienes un <strong>${porcentajeVertidoProduccion.toFixed(1)}% de excedente<\/strong> de energ\u00eda que se vierte. Considera a\u00f1adir una bater\u00eda para aumentar tu autoconsumo y maximizar tus ahorros.<\/li>`;\n      } else if (bateria === \"si\" && porcentajeVertidoProduccion > UMBRAL_VERTIDO_ALTO) {\n          recommendationsHTML += `<li>\ud83d\udca1 A pesar de tener bater\u00eda, a\u00fan viertes un <strong>${porcentajeVertidoProduccion.toFixed(1)}% de tu producci\u00f3n<\/strong>. Podr\u00edas explorar h\u00e1bitos de consumo m\u00e1s eficientes o una bater\u00eda de mayor capacidad.<\/li>`;\n      }\n\n      const UMBRAL_PAYBACK_LARGO = 10;\n      if (payback !== Infinity && payback > UMBRAL_PAYBACK_LARGO) {\n          recommendationsHTML += `<li>\u23f3 Tu payback estimado es de <strong>${payback.toFixed(1)} a\u00f1os<\/strong>, lo cual es algo largo. Investiga posibles subvenciones, optimiza tu consumo o contacta para un estudio m\u00e1s detallado de reducci\u00f3n de costes.<\/li>`;\n      } else if (payback === Infinity || (payback !== Infinity && ahorroAnualTotal <= 0)) {\n          recommendationsHTML += `<li>\ud83e\udd14 Tu sistema actualmente no genera ahorro neto. Revisa los datos de consumo\/producci\u00f3n o considera ajustar los par\u00e1metros de tu sistema para mejorar la rentabilidad.<\/li>`;\n      }\n      \n      recommendationsHTML += '<\/ul>';\n      recommendationsDiv.innerHTML = recommendationsHTML;\n\n\n      \/\/ ** Gr\u00e1fico din\u00e1mico seg\u00fan modoVisualizacion **\n      graficoCanvas.style.display = 'block';\n      const ctx = graficoCanvas.getContext('2d');\n\n      if (chartInstance) {\n          chartInstance.destroy();\n      }\n\n      const modoVisualizacion = document.getElementById('modoVisualizacion').value;\n      let chartLabels = [];\n      let chartDataValues = [];\n      let chartBackgroundColors = [];\n      let chartBorderColors = [];\n      let chartTitle = '';\n      let tooltipCallbackLabel = function(context) {\n          let label = context.label || '';\n          if (label) {\n              label += ': ';\n          }\n          if (context.parsed !== null) {\n              label += context.parsed.toFixed(2) + ' kWh';\n          }\n          return label;\n      };\n\n      if (modoVisualizacion === 'flujo') {\n          const totalEnergiaDistribuida = energiaAutoconsumidaFinal + energiaVertidaFinal + energiaTomadaDeRedFinal;\n          let porcentajeAutoconsumo = 0;\n          let porcentajeVertido = 0;\n          let porcentajeTomadoDeRed = 0;\n\n          if (totalEnergiaDistribuida > 0) {\n              porcentajeAutoconsumo = (energiaAutoconsumidaFinal \/ totalEnergiaDistribuida) * 100;\n              porcentajeVertido = (energiaVertidaFinal \/ totalEnergiaDistribuida) * 100;\n              porcentajeTomadoDeRed = (energiaTomadaDeRedFinal \/ totalEnergiaDistribuida) * 100;\n          }\n\n          chartTitle = 'Distribuci\u00f3n Energ\u00e9tica Anual (kWh)';\n          chartLabels = [\n              `Autoconsumo Directo (${porcentajeAutoconsumo.toFixed(1)}%)`,\n              `Vertido a la Red (${porcentajeVertido.toFixed(1)}%)`,\n              `Tomado de la Red (${porcentajeTomadoDeRed.toFixed(1)}%)`\n          ];\n          chartDataValues = [\n              energiaAutoconsumidaFinal,\n              energiaVertidaFinal,\n              energiaTomadaDeRedFinal\n          ];\n          chartBackgroundColors = [\n              'rgba(75, 192, 192, 0.8)',\n              'rgba(255, 206, 86, 0.8)',\n              'rgba(255, 99, 132, 0.8)'\n          ];\n          chartBorderColors = [\n              'rgba(75, 192, 192, 1)',\n              'rgba(255, 206, 86, 1)',\n              'rgba(255, 99, 132, 1)'\n          ];\n\n      } else if (modoVisualizacion === 'balance') {\n          const costoNetoDeRed = Math.max(0, costoPorConsumoDeRed - ingresoPorVentaExcedentes);\n          const gananciaPorExcedentesNoCompensados = Math.max(0, ingresoPorVentaExcedentes - costoPorConsumoDeRed);\n          \n          const totalBalanceForChart = ahorroPorAutoconsumo + costoNetoDeRed + gananciaPorExcedentesNoCompensados;\n\n          let porcentajeAhorro = 0;\n          let porcentajeCostoNeto = 0;\n          let porcentajeGanancia = 0;\n\n          if (totalBalanceForChart > 0) {\n              porcentajeAhorro = (ahorroPorAutoconsumo \/ totalBalanceForChart) * 100;\n              porcentajeCostoNeto = (costoNetoDeRed \/ totalBalanceForChart) * 100;\n              porcentajeGanancia = (gananciaPorExcedentesNoCompensados \/ totalBalanceForChart) * 100;\n          }\n\n          chartTitle = 'Balance Econ\u00f3mico Anual (\u20ac)';\n          chartLabels = [\n              `Ahorro por Autoconsumo (${porcentajeAhorro.toFixed(1)}%)`,\n              `Costo Neto de Red (${porcentajeCostoNeto.toFixed(1)}%)`,\n              `Ganancia por Excedentes (${porcentajeGanancia.toFixed(1)}%)`\n          ];\n          chartDataValues = [\n              ahorroPorAutoconsumo,\n              costoNetoDeRed,\n              gananciaPorExcedentesNoCompensados\n          ];\n          chartBackgroundColors = [\n              'rgba(153, 102, 255, 0.8)',\n              'rgba(255, 159, 64, 0.8)',\n              'rgba(54, 235, 120, 0.8)'\n          ];\n          chartBorderColors = [\n              'rgba(153, 102, 255, 1)',\n              'rgba(255, 159, 64, 1)',\n              'rgba(54, 235, 120, 1)'\n          ];\n          tooltipCallbackLabel = function(context) {\n              let label = context.label || '';\n              if (label) {\n                  label += ': ';\n              }\n              if (context.parsed !== null) {\n                  label += context.parsed.toFixed(2) + ' \u20ac';\n              }\n              return label;\n          };\n      } else if (modoVisualizacion === 'mensual') {\n          chartTitle = 'Flujo Energ\u00e9tico Mensual (kWh)';\n          chartLabels = MESES;\n\n          const consumoMensual = consumoAnual \/ 12;\n          const produccionMensualTotalBase = IRRADIANCIA_MENSUAL_DISTRIBUCION.map(factor => produccionTotalSolar * factor);\n\n          let produccionMensualConDegradacion = [];\n          for (let i = 0; i < MESES.length; i++) {\n              produccionMensualConDegradacion.push(produccionMensualTotalBase[i] * Math.pow(1 - DEGRADACION_ANUAL_PANELES, 0));\n          }\n\n          let autoconsumoMensual = [];\n          let vertidoMensual = [];\n          let tomadoDeRedMensual = [];\n\n          for (let i = 0; i < MESES.length; i++) {\n              const prod = produccionMensualConDegradacion[i];\n              const cons = consumoMensual;\n\n              let autoDirectoMes = Math.min(cons * consumoSolar, prod);\n              let excedentesMes = Math.max(0, prod - autoDirectoMes);\n              let deficitMes = Math.max(0, cons - autoDirectoMes);\n\n              let autoMesFinal = autoDirectoMes;\n              let vertMesFinal = excedentesMes;\n              let tomadoMesFinal = deficitMes;\n\n              if (bateria === \"si\") {\n                  const bateriaCapacidadMensualEfectiva = bateriaCapacidadKWhSeleccionada * (BATERIA_CICLOS_POR_ANIO \/ 12) * BATERIA_ROUNDTRIP_EFFICIENCY;\n                  const almacenadaMes = Math.min(excedentesMes, bateriaCapacidadMensualEfectiva);\n                  const usadaMes = Math.min(deficitMes, almacenadaMes);\n\n                  autoMesFinal += usadaMes;\n                  vertMesFinal = excedentesMes - almacenadaMes;\n                  tomadoMesFinal = deficitMes - usadaMes;\n\n                  vertMesFinal = Math.max(0, vertMesFinal);\n                  tomadoMesFinal = Math.max(0, tomadoMesFinal);\n              }\n              autoconsumoMensual.push(autoMesFinal);\n              vertidoMensual.push(vertMesFinal);\n              tomadoDeRedMensual.push(tomadoMesFinal);\n          }\n          \n          chartDataValues = [\n              {\n                  label: 'Producci\u00f3n Solar Estimada',\n                  data: produccionMensualConDegradacion,\n                  backgroundColor: 'rgba(255, 206, 86, 0.6)',\n                  borderColor: 'rgba(255, 206, 86, 1)',\n                  borderWidth: 1\n              },\n              {\n                  label: 'Consumo Total',\n                  data: Array(12).fill(consumoMensual),\n                  backgroundColor: 'rgba(54, 162, 235, 0.6)',\n                  borderColor: 'rgba(54, 162, 235, 1)',\n                  borderWidth: 1\n              },\n              {\n                  label: 'Autoconsumo',\n                  data: autoconsumoMensual,\n                  backgroundColor: 'rgba(75, 192, 192, 0.8)',\n                  borderColor: 'rgba(75, 192, 192, 1)',\n                  borderWidth: 1\n              },\n              {\n                  label: 'Vertido a la Red',\n                  data: vertidoMensual,\n                  backgroundColor: 'rgba(255, 159, 64, 0.8)',\n                  borderColor: 'rgba(255, 159, 64, 1)',\n                  borderWidth: 1\n              },\n              {\n                  label: 'Tomado de la Red',\n                  data: tomadoDeRedMensual,\n                  backgroundColor: 'rgba(255, 99, 132, 0.8)',\n                  borderColor: 'rgba(255, 99, 132, 1)',\n                  borderWidth: 1\n              }\n          ];\n\n          chartInstance = new Chart(ctx, {\n              type: 'bar',\n              data: {\n                  labels: chartLabels,\n                  datasets: chartDataValues\n              },\n              options: {\n                  responsive: true,\n                  scales: {\n                      x: {\n                          stacked: false,\n                          title: {\n                              display: true,\n                              text: 'Mes'\n                          }\n                      },\n                      y: {\n                          stacked: false,\n                          beginAtZero: true,\n                          title: {\n                              display: true,\n                              text: 'Energ\u00eda (kWh)'\n                          }\n                      }\n                  },\n                  plugins: {\n                      title: {\n                          display: true,\n                          text: chartTitle,\n                          font: {\n                              size: 16\n                          }\n                      },\n                      tooltip: {\n                        mode: 'index',\n                        intersect: false,\n                        callbacks: {\n                            label: function(context) {\n                                let label = context.dataset.label || '';\n                                if (label) {\n                                    label += ': ';\n                                }\n                                if (context.parsed.y !== null) {\n                                    label += context.parsed.y.toFixed(2) + ' kWh';\n                                }\n                                return label;\n                            }\n                        }\n                      }\n                  }\n              }\n          });\n          return;\n      }\n\n      chartInstance = new Chart(ctx, {\n          type: 'pie',\n          data: {\n              labels: chartLabels,\n              datasets: [{\n                  data: chartDataValues,\n                  backgroundColor: chartBackgroundColors,\n                  borderColor: chartBorderColors,\n                  borderWidth: 1\n              }]\n          },\n          options: {\n              responsive: true,\n              plugins: {\n                  title: {\n                      display: true,\n                      text: chartTitle,\n                      font: {\n                          size: 16\n                      }\n                  },\n                  tooltip: {\n                      callbacks: {\n                          label: tooltipCallbackLabel\n                      }\n                  }\n              }\n          }\n      });\n    }\n\n    function compartirPorWhatsApp() {\n      const resultadosDiv = document.getElementById(\"resultados\").innerText;\n      const kpisDiv = document.getElementById(\"kpis\").innerText;\n      const recommendationsDiv = document.getElementById(\"recommendations\").innerText;\n      const textoCompleto = \"\ud83d\udca1 JuraON - Calculadora Solar:\\n\\n\" + resultadosDiv + \"\\n\\n\" + kpisDiv + \"\\n\\n\" + recommendationsDiv;\n      const numeroTelefono = \"624116848\";\n      const url = `https:\/\/api.whatsapp.com\/send?phone=${numeroTelefono}&text=${encodeURIComponent(textoCompleto)}`;\n      window.open(url, \"_blank\");\n    }\n\n    window.onload = function() {\n        \/\/ Ejecutar el c\u00e1lculo inicial al cargar la p\u00e1gina para mostrar un estado inicial\n        calcularAvanzado();\n        \/\/ Asegurarse de que el selector de capacidad de bater\u00eda se muestre\/oculte correctamente al cargar\n        const bateriaSelected = document.getElementById('bateria').value;\n        const bateriaCapacidadSelect = document.getElementById('bateriaCapacidad');\n        const bateriaCapacidadLabel = document.getElementById('bateriaCapacidadLabel');\n        if (bateriaSelected === 'si') {\n            bateriaCapacidadSelect.style.display = 'block';\n            bateriaCapacidadLabel.style.display = 'block';\n        } else {\n            bateriaCapacidadSelect.style.display = 'none';\n            bateriaCapacidadLabel.style.display = 'none';\n        }\n    };\n  <\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Calculadora Solar &#8211; JuraON Calculadora Solar Consumo anual (kWh): \u00bfDeseas bater\u00eda? NoS\u00ed Capacidad de Bater\u00eda (kWh): 5 kWh10 kWh15 kWh20 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-32","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages\/32","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/comments?post=32"}],"version-history":[{"count":52,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages\/32\/revisions"}],"predecessor-version":[{"id":2575,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages\/32\/revisions\/2575"}],"wp:attachment":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/media?parent=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}