{"id":628,"date":"2020-06-07T21:06:40","date_gmt":"2020-06-07T19:06:40","guid":{"rendered":"https:\/\/enjoy-stuttgart.org\/?page_id=628"},"modified":"2026-09-13T18:53:31","modified_gmt":"2026-09-13T16:53:31","slug":"wetter-stuttgart","status":"publish","type":"page","link":"https:\/\/enjoy-stuttgart.org\/index.php\/wetter-stuttgart\/","title":{"rendered":"Wetter Stuttgart"},"content":{"rendered":"        <section id=\"esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7\" class=\"esw\" aria-label=\"Wetter Stuttgart\">\n            <div class=\"esw__warning-area\" hidden><\/div>\n\n            <div class=\"esw__hero\">\n                <div>\n                    <div class=\"esw__eyebrow\">WETTER \u00b7 STUTTGART<\/div>\n                    <h1 class=\"esw__title\">Aktuelles Wetter<\/h1>\n                    <p class=\"esw__status\">Wetterdaten werden geladen \u2026<\/p>\n                <\/div>\n                <div class=\"esw__current\" aria-live=\"polite\">\n                    <div class=\"esw__icon\" aria-hidden=\"true\">\u25cc<\/div>\n                    <div>\n                        <div class=\"esw__temp\">--\u00b0<\/div>\n                        <div class=\"esw__condition\">Bitte warten<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"esw__facts\" hidden>\n                <div class=\"esw__fact\"><span>Gef\u00fchlt<\/span><strong data-k=\"feels\">\u2013<\/strong><\/div>\n                <div class=\"esw__fact\"><span>Luftfeuchte<\/span><strong data-k=\"humidity\">\u2013<\/strong><\/div>\n                <div class=\"esw__fact\"><span>Wind<\/span><strong data-k=\"wind\">\u2013<\/strong><\/div>\n                <div class=\"esw__fact\"><span>B\u00f6en<\/span><strong data-k=\"gusts\">\u2013<\/strong><\/div>\n            <\/div>\n\n            <div class=\"esw__evening\" hidden>\n                <div class=\"esw__evening-title\">\n                    <span>Heute Abend<\/span>\n                    <small data-k=\"sunset\">Sonnenuntergang: \u2013<\/small>\n                <\/div>\n                <div class=\"esw__evening-grid\">\n                    <div class=\"esw__evening-main\">\n                        <span class=\"esw__evening-icon\" aria-hidden=\"true\">\u25cc<\/span>\n                        <div>\n                            <strong data-k=\"evening-condition\">\u2013<\/strong>\n                            <span data-k=\"evening-temp\">\u2013<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"esw__evening-rain\">\n                        <span>Regenrisiko abends<\/span>\n                        <strong data-k=\"evening-rain\">\u2013<\/strong>\n                    <\/div>\n                    <div class=\"esw__evening-next\">\n                        <span>Regen n\u00e4chste 6 Std.<\/span>\n                        <strong data-k=\"next-rain\">\u2013<\/strong>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"esw__forecast\" hidden>\n                <div class=\"esw__forecast-head\">\n                    <h2>Die n\u00e4chsten Tage<\/h2>\n                    <span>Stuttgart<\/span>\n                <\/div>\n                <div class=\"esw__days\"><\/div>\n            <\/div>\n\n            <div class=\"esw__footer\">\n                <span data-k=\"updated\">Letzte Aktualisierung: \u2013<\/span>\n                <span>Wetter: Open-Meteo \u00b7 Warnungen: DWD<\/span>\n            <\/div>\n        <\/section>\n\n        <style>\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 {\n                --esw-ink: #111111;\n                --esw-muted: #6b6b6b;\n                --esw-line: #e6e6e6;\n                --esw-paper: #ffffff;\n                --esw-soft: #f6f6f4;\n                --esw-accent: #f3c900;\n                --esw-danger: #cc1f1f;\n                --esw-orange: #e86d00;\n                box-sizing: border-box;\n                width: 100%;\n                max-width: 1180px;\n                margin: 24px auto 42px;\n                color: var(--esw-ink);\n                font-family: inherit;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 *,\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 *::before,\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 *::after { box-sizing: inherit; }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning-area {\n                margin: 0 0 18px;\n                display: grid;\n                gap: 10px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning {\n                border: 2px solid var(--esw-danger);\n                border-left-width: 8px;\n                background: #fff7f7;\n                padding: 18px 20px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning--orange {\n                border-color: var(--esw-orange);\n                background: #fff8f0;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning--yellow {\n                border-color: #c6a400;\n                background: #fffbea;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning-top {\n                display: flex;\n                gap: 12px;\n                align-items: center;\n                justify-content: space-between;\n                margin-bottom: 8px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning-label {\n                display: inline-flex;\n                align-items: center;\n                gap: 8px;\n                font-weight: 800;\n                letter-spacing: .04em;\n                text-transform: uppercase;\n                font-size: 13px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning-label::before {\n                content: \"!\";\n                width: 25px;\n                height: 25px;\n                display: inline-grid;\n                place-items: center;\n                border-radius: 50%;\n                color: #fff;\n                background: currentColor;\n                box-shadow: inset 0 0 0 8px currentColor;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning h3 {\n                margin: 0 0 7px;\n                font-size: clamp(20px, 2.2vw, 28px);\n                line-height: 1.14;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning p {\n                margin: 6px 0 0;\n                line-height: 1.55;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning-time {\n                color: var(--esw-muted);\n                font-size: 13px;\n                white-space: nowrap;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__hero {\n                position: relative;\n                overflow: hidden;\n                min-height: 280px;\n                display: flex;\n                justify-content: space-between;\n                align-items: flex-end;\n                gap: 28px;\n                padding: clamp(24px, 4vw, 48px);\n                background:\n                    radial-gradient(circle at 85% 15%, rgba(255,255,255,.7), transparent 28%),\n                    linear-gradient(135deg, #f3c900 0%, #ffdf4c 55%, #fff0a8 100%);\n                border: 1px solid #ddc43a;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__hero::after {\n                content: \"\";\n                position: absolute;\n                right: -70px;\n                top: -100px;\n                width: 320px;\n                height: 320px;\n                border: 44px solid rgba(17,17,17,.07);\n                border-radius: 50%;\n                pointer-events: none;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__eyebrow {\n                font-size: 12px;\n                font-weight: 800;\n                letter-spacing: .18em;\n                margin-bottom: 10px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__title {\n                margin: 0;\n                font-size: clamp(38px, 6vw, 74px);\n                line-height: .95;\n                letter-spacing: -.04em;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__status {\n                margin: 18px 0 0;\n                font-size: 16px;\n                max-width: 560px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__current {\n                position: relative;\n                z-index: 1;\n                display: flex;\n                align-items: center;\n                gap: 14px;\n                min-width: max-content;\n                text-align: right;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__icon {\n                font-size: clamp(54px, 7vw, 92px);\n                line-height: 1;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__temp {\n                font-size: clamp(54px, 8vw, 96px);\n                line-height: .85;\n                font-weight: 800;\n                letter-spacing: -.06em;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__condition {\n                margin-top: 10px;\n                font-weight: 700;\n                font-size: 16px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__facts {\n                display: grid;\n                grid-template-columns: repeat(4, 1fr);\n                border: 1px solid var(--esw-line);\n                border-top: 0;\n                background: var(--esw-paper);\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__fact {\n                padding: 20px 22px;\n                min-width: 0;\n                border-right: 1px solid var(--esw-line);\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__fact:last-child { border-right: 0; }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__fact span {\n                display: block;\n                color: var(--esw-muted);\n                font-size: 12px;\n                text-transform: uppercase;\n                letter-spacing: .08em;\n                margin-bottom: 5px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__fact strong {\n                font-size: clamp(18px, 2vw, 24px);\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening {\n                margin-top:24px;\n                border:1px solid var(--esw-line);\n                border-top:3px solid var(--esw-ink);\n                background:#fff;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-title {\n                display:flex;\n                justify-content:space-between;\n                gap:16px;\n                align-items:baseline;\n                padding:14px 18px;\n                border-bottom:1px solid var(--esw-line);\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-title span {\n                font-size:20px;\n                font-weight:800;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-title small {\n                color:var(--esw-muted);\n                font-size:12px;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-grid {\n                display:grid;\n                grid-template-columns:1.4fr 1fr 1fr;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-grid > div {\n                padding:18px;\n                border-right:1px solid var(--esw-line);\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-grid > div:last-child { border-right:0; }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-main {\n                display:flex;\n                align-items:center;\n                gap:14px;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-icon {\n                font-size:38px;\n                line-height:1;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-main strong,\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-rain strong,\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-next strong {\n                display:block;\n                font-size:19px;\n            }\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-main span:not(.esw__evening-icon),\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-rain span,\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-next span {\n                display:block;\n                margin-top:4px;\n                color:var(--esw-muted);\n                font-size:12px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__forecast {\n                margin-top: 24px;\n                border-top: 3px solid var(--esw-ink);\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__forecast-head {\n                display: flex;\n                align-items: baseline;\n                justify-content: space-between;\n                gap: 16px;\n                padding: 16px 0 12px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__forecast-head h2 {\n                margin: 0;\n                font-size: clamp(24px, 3vw, 34px);\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__forecast-head span {\n                color: var(--esw-muted);\n                font-size: 13px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__days {\n                display: grid;\n                grid-template-columns: repeat(5, 1fr);\n                gap: 10px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__day {\n                background: var(--esw-soft);\n                border: 1px solid var(--esw-line);\n                padding: 16px;\n                min-height: 150px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__day-name {\n                font-weight: 800;\n                margin-bottom: 16px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__day-icon {\n                font-size: 34px;\n                line-height: 1;\n                margin-bottom: 14px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__day-temp {\n                font-size: 20px;\n                font-weight: 800;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__day-rain {\n                margin-top: 5px;\n                color: var(--esw-muted);\n                font-size: 13px;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__footer {\n                margin-top: 12px;\n                display: flex;\n                justify-content: space-between;\n                gap: 16px;\n                color: var(--esw-muted);\n                font-size: 11px;\n                line-height: 1.4;\n            }\n\n            #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__error {\n                background: #fff1f1;\n                border: 1px solid #e3b2b2;\n                color: #7d1515;\n                padding: 14px 16px;\n                margin-top: 14px;\n            }\n\n            @media (max-width: 760px) {\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 { margin-top: 14px; }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__hero {\n                    min-height: auto;\n                    flex-direction: column;\n                    align-items: stretch;\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__current {\n                    text-align: left;\n                    justify-content: flex-start;\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__facts {\n                    grid-template-columns: repeat(2, 1fr);\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__fact:nth-child(2) { border-right: 0; }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__fact:nth-child(-n+2) { border-bottom: 1px solid var(--esw-line); }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-title {\n                    flex-direction:column;\n                    gap:4px;\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-grid {\n                    grid-template-columns:1fr;\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-grid > div {\n                    border-right:0;\n                    border-bottom:1px solid var(--esw-line);\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__evening-grid > div:last-child { border-bottom:0; }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__days {\n                    grid-template-columns: repeat(2, 1fr);\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__day:first-child {\n                    grid-column: 1 \/ -1;\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__footer {\n                    flex-direction: column;\n                    gap: 4px;\n                }\n                #esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7 .esw__warning-top {\n                    align-items: flex-start;\n                    flex-direction: column;\n                    gap: 4px;\n                }\n            }\n        <\/style>\n\n        <script>\n        (() => {\n            const root = document.getElementById(\"esw-62f70f59-ce22-4222-adfb-c0dcb11ce6b7\");\n            if (!root) return;\n\n            const endpoint = \"https:\\\/\\\/enjoy-stuttgart.org\\\/index.php\\\/wp-json\\\/enjoy-stuttgart\\\/v1\\\/weather\";\n            const q = (s) => root.querySelector(s);\n\n            const weatherMeta = {\n                0:  ['Klar', '\u2600'],\n                1:  ['\u00dcberwiegend klar', '\ud83c\udf24'],\n                2:  ['Teilweise bew\u00f6lkt', '\u26c5'],\n                3:  ['Bew\u00f6lkt', '\u2601'],\n                45: ['Nebel', '\ud83c\udf2b'],\n                48: ['Nebel mit Reif', '\ud83c\udf2b'],\n                51: ['Leichter Nieselregen', '\ud83c\udf26'],\n                53: ['Nieselregen', '\ud83c\udf26'],\n                55: ['Starker Nieselregen', '\ud83c\udf27'],\n                56: ['Gefrierender Nieselregen', '\ud83c\udf27'],\n                57: ['Starker gefrierender Nieselregen', '\ud83c\udf27'],\n                61: ['Leichter Regen', '\ud83c\udf26'],\n                63: ['Regen', '\ud83c\udf27'],\n                65: ['Starker Regen', '\ud83c\udf27'],\n                66: ['Gefrierender Regen', '\ud83c\udf27'],\n                67: ['Starker gefrierender Regen', '\ud83c\udf27'],\n                71: ['Leichter Schneefall', '\ud83c\udf28'],\n                73: ['Schneefall', '\ud83c\udf28'],\n                75: ['Starker Schneefall', '\u2744'],\n                77: ['Schneegriesel', '\u2744'],\n                80: ['Leichte Regenschauer', '\ud83c\udf26'],\n                81: ['Regenschauer', '\ud83c\udf27'],\n                82: ['Starke Regenschauer', '\u26c8'],\n                85: ['Leichte Schneeschauer', '\ud83c\udf28'],\n                86: ['Starke Schneeschauer', '\u2744'],\n                95: ['Gewitter', '\u26c8'],\n                96: ['Gewitter mit Hagel', '\u26c8'],\n                99: ['Starkes Gewitter mit Hagel', '\u26c8']\n            };\n\n            const degToDir = (deg) => {\n                if (!Number.isFinite(Number(deg))) return '';\n                const dirs = ['N','NO','O','SO','S','SW','W','NW'];\n                return dirs[Math.round(Number(deg) \/ 45) % 8];\n            };\n\n            const dateTime = (value) => {\n                if (!value) return '';\n                const n = Number(value);\n                const d = Number.isFinite(n)\n                    ? new Date(n > 1e12 ? n : n * 1000)\n                    : new Date(value);\n                if (Number.isNaN(d.getTime())) return '';\n                return new Intl.DateTimeFormat('de-DE', {\n                    weekday: 'short',\n                    day: '2-digit',\n                    month: '2-digit',\n                    hour: '2-digit',\n                    minute: '2-digit'\n                }).format(d);\n            };\n\n            const dayName = (iso, index) => {\n                if (index === 0) return 'Heute';\n                if (index === 1) return 'Morgen';\n                return new Intl.DateTimeFormat('de-DE', { weekday: 'short' }).format(new Date(iso + 'T12:00:00'));\n            };\n\n            const escapeHtml = (s) => String(s ?? '')\n                .replaceAll('&','&amp;')\n                .replaceAll('<','&lt;')\n                .replaceAll('>','&gt;')\n                .replaceAll('\"','&quot;')\n                .replaceAll(\"'\",\"&#039;\");\n\n            const renderWarnings = (warnings) => {\n                const area = q('.esw__warning-area');\n                if (!Array.isArray(warnings) || warnings.length === 0) {\n                    area.hidden = true;\n                    area.innerHTML = '';\n                    return;\n                }\n\n                area.innerHTML = warnings.map((w) => {\n                    const level = Number(w.level || 0);\n                    const cls = level >= 4 ? '' : (level >= 3 ? ' esw__warning--orange' : ' esw__warning--yellow');\n                    const headline = w.headline || w.event || 'Amtliche Wetterwarnung';\n                    const description = w.description || '';\n                    const instruction = w.instruction || '';\n                    const start = dateTime(w.start);\n                    const end = dateTime(w.end);\n                    const time = start || end ? `${start ? 'ab ' + start : ''}${start && end ? ' \u00b7 ' : ''}${end ? 'bis ' + end : ''}` : '';\n\n                    return `\n                        <article class=\"esw__warning${cls}\">\n                            <div class=\"esw__warning-top\">\n                                <span class=\"esw__warning-label\">DWD-Wetterwarnung<\/span>\n                                <span class=\"esw__warning-time\">${escapeHtml(time)}<\/span>\n                            <\/div>\n                            <h3>${escapeHtml(headline)}<\/h3>\n                            ${description ? `<p>${escapeHtml(description)}<\/p>` : ''}\n                            ${instruction ? `<p><strong>Hinweis:<\/strong> ${escapeHtml(instruction)}<\/p>` : ''}\n                        <\/article>\n                    `;\n                }).join('');\n                area.hidden = false;\n            };\n\n            const hourIndexFromNow = (hourly) => {\n                if (!Array.isArray(hourly?.time)) return -1;\n                const now = Date.now();\n                let best = -1, bestDiff = Infinity;\n                hourly.time.forEach((t, i) => {\n                    const ms = new Date(t).getTime();\n                    const diff = Math.abs(ms - now);\n                    if (diff < bestDiff) { bestDiff = diff; best = i; }\n                });\n                return best;\n            };\n\n            const eveningSummary = (data) => {\n                const h = data?.hourly;\n                if (!Array.isArray(h?.time)) return null;\n                const today = new Date().toISOString().slice(0,10);\n                const eveningIndexes = h.time.map((t,i)=>({t,i})).filter(x => x.t.startsWith(today) && Number(x.t.slice(11,13)) >= 18 && Number(x.t.slice(11,13)) <= 22).map(x=>x.i);\n                if (!eveningIndexes.length) return null;\n\n                const target = eveningIndexes.find(i => Number(h.time[i].slice(11,13)) === 20) ?? eveningIndexes[Math.floor(eveningIndexes.length\/2)];\n                const rain = Math.max(...eveningIndexes.map(i => Number(h.precipitation_probability?.[i] ?? 0)));\n                return {\n                    code: Number(h.weather_code?.[target]),\n                    temp: Math.round(Number(h.temperature_2m?.[target])),\n                    rain\n                };\n            };\n\n            const nextHoursRain = (data, count=6) => {\n                const h = data?.hourly;\n                const start = hourIndexFromNow(h);\n                if (start < 0) return null;\n                const vals = [];\n                for (let i=start; i<Math.min(start+count, h.time.length); i++) vals.push(Number(h.precipitation_probability?.[i] ?? 0));\n                return vals.length ? Math.max(...vals) : null;\n            };\n\n            const renderWeather = (payload) => {\n                const data = payload.weather;\n                if (!data || !data.current) throw new Error('Keine Wetterdaten vorhanden.');\n\n                const c = data.current;\n                const code = Number(c.weather_code);\n                const meta = weatherMeta[code] || ['Aktuelles Wetter', '\u25cc'];\n\n                q('.esw__temp').textContent = `${Math.round(Number(c.temperature_2m))}\u00b0`;\n                q('.esw__condition').textContent = meta[0];\n                q('.esw__icon').textContent = meta[1];\n                q('.esw__status').textContent = `Jetzt in Stuttgart \u00b7 ${meta[0]}`;\n\n                q('[data-k=\"feels\"]').textContent = `${Math.round(Number(c.apparent_temperature))} \u00b0C`;\n                q('[data-k=\"humidity\"]').textContent = `${Math.round(Number(c.relative_humidity_2m))} %`;\n                q('[data-k=\"wind\"]').textContent = `${Math.round(Number(c.wind_speed_10m))} km\/h ${degToDir(c.wind_direction_10m)}`;\n                q('[data-k=\"gusts\"]').textContent = `${Math.round(Number(c.wind_gusts_10m))} km\/h`;\n\n                q('.esw__facts').hidden = false;\n\n                const d = data.daily || {};\n                const evening = eveningSummary(data);\n                const nextRain = nextHoursRain(data, 6);\n                if (evening) {\n                    const em = weatherMeta[evening.code] || ['Abendwetter', '\u25cc'];\n                    q('.esw__evening-icon').textContent = em[1];\n                    q('[data-k=\"evening-condition\"]').textContent = em[0];\n                    q('[data-k=\"evening-temp\"]').textContent = `${evening.temp} \u00b0C gegen 20 Uhr`;\n                    q('[data-k=\"evening-rain\"]').textContent = `${Math.round(evening.rain)} %`;\n                    q('[data-k=\"next-rain\"]').textContent = nextRain === null ? '\u2013' : `${Math.round(nextRain)} %`;\n                    const sunset = d.sunset?.[0] ? new Date(d.sunset[0]) : null;\n                    q('[data-k=\"sunset\"]').textContent = sunset && !Number.isNaN(sunset.getTime())\n                        ? 'Sonnenuntergang: ' + new Intl.DateTimeFormat('de-DE',{hour:'2-digit',minute:'2-digit'}).format(sunset)\n                        : 'Sonnenuntergang: \u2013';\n                    q('.esw__evening').hidden = false;\n                }\n\n                if (Array.isArray(d.time) && d.time.length) {\n                    const count = Math.min(5, d.time.length);\n                    q('.esw__days').innerHTML = Array.from({length: count}, (_, i) => {\n                        const m = weatherMeta[Number(d.weather_code?.[i])] || ['Wetter', '\u25cc'];\n                        const rain = Number(d.precipitation_probability_max?.[i] ?? 0);\n                        const max = Math.round(Number(d.temperature_2m_max?.[i]));\n                        const min = Math.round(Number(d.temperature_2m_min?.[i]));\n                        return `\n                            <div class=\"esw__day\">\n                                <div class=\"esw__day-name\">${escapeHtml(dayName(d.time[i], i))}<\/div>\n                                <div class=\"esw__day-icon\" title=\"${escapeHtml(m[0])}\">${m[1]}<\/div>\n                                <div class=\"esw__day-temp\">${max}\u00b0 \/ ${min}\u00b0<\/div>\n                                <div class=\"esw__day-rain\">Regenrisiko: ${rain}%<\/div>\n                            <\/div>\n                        `;\n                    }).join('');\n                    q('.esw__forecast').hidden = false;\n                }\n\n                const updated = payload.updated_at ? new Date(payload.updated_at) : new Date();\n                q('[data-k=\"updated\"]').textContent = 'Letzte Aktualisierung: ' +\n                    new Intl.DateTimeFormat('de-DE', {\n                        day: '2-digit',\n                        month: '2-digit',\n                        year: 'numeric',\n                        hour: '2-digit',\n                        minute: '2-digit'\n                    }).format(updated);\n\n                renderWarnings(payload.warnings || []);\n            };\n\n            const load = async () => {\n                try {\n                    const r = await fetch(endpoint, { credentials: 'same-origin', cache: 'no-store' });\n                    if (!r.ok) throw new Error('HTTP ' + r.status);\n                    const payload = await r.json();\n                    if (!payload.ok) throw new Error(payload.error || 'Wetterdaten konnten nicht geladen werden.');\n                    renderWeather(payload);\n                } catch (err) {\n                    q('.esw__status').textContent = 'Wetterdaten sind vor\u00fcbergehend nicht verf\u00fcgbar.';\n                    if (!q('.esw__error')) {\n                        const box = document.createElement('div');\n                        box.className = 'esw__error';\n                        box.textContent = 'Die Wetterdaten konnten gerade nicht geladen werden. Die Seite versucht es automatisch erneut.';\n                        root.appendChild(box);\n                    }\n                }\n            };\n\n            load();\n            window.setInterval(load, 5 * 60 * 1000);\n        })();\n        <\/script>\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"footnotes":""},"class_list":["post-628","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/pages\/628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/comments?post=628"}],"version-history":[{"count":3,"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/pages\/628\/revisions"}],"predecessor-version":[{"id":3980,"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/pages\/628\/revisions\/3980"}],"wp:attachment":[{"href":"https:\/\/enjoy-stuttgart.org\/index.php\/wp-json\/wp\/v2\/media?parent=628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}