{"id":48559,"date":"2026-01-07T13:50:43","date_gmt":"2026-01-07T12:50:43","guid":{"rendered":"https:\/\/cmm.imgw.pl\/?page_id=48559"},"modified":"2026-02-19T16:46:43","modified_gmt":"2026-02-19T15:46:43","slug":"atlas-solarny-aes-pl","status":"publish","type":"page","link":"https:\/\/cmm.imgw.pl\/?page_id=48559","title":{"rendered":"Atlas solarny AES-PL"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"48559\" class=\"elementor elementor-48559\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3ef8d03d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3ef8d03d\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6ce9cc47\" data-id=\"6ce9cc47\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9ef5e01 elementor-widget__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"9ef5e01\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.12.1 - 02-04-2023 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-47ba0a3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"47ba0a3\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bfc7647\" data-id=\"bfc7647\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d1e0def elementor-widget elementor-widget-html\" data-id=\"d1e0def\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div id=\"forecast-app\" class=\"forecast-app\">\n  <h1 class=\"app-title\">Atlas Energetyki Solarnej AES-PL<\/h1>\n  <div class=\"layout-container\">\n    <!-- Lewa kolumna z przyciskami -->\n    <div class=\"left-column\">\n      <!-- Krok 1: Wyb\u00f3r charakterystyki promieniowania -->\n      <div class=\"section\">\n        <h3>Charakterystyka:<\/h3>\n        <div id=\"models\" class=\"buttons models-buttons\"><\/div>\n      <\/div>\n\n      <!-- Sekcja wariant\u00f3w instalacji GTI (ekspozycja i nachylenie) -->\n      <div class=\"section\" id=\"gtiVariantsSection\" style=\"display: none;\">\n        <h3>Nachylenie:<\/h3>\n        <div id=\"tiltButtons\" class=\"buttons tilt-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Ekspozycja:<\/h3>\n        <div id=\"exposureButtons\" class=\"buttons exposure-buttons\"><\/div>\n      <\/div>\n\n      <!-- Sekcja wariant\u00f3w instalacji PV (nachylenie, ekspozycja, okres, terminy) -->\n      <div class=\"section\" id=\"pvVariantsSection\" style=\"display: none;\">\n        <h3>Nachylenie:<\/h3>\n        <div id=\"pvTiltButtons\" class=\"buttons tilt-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Ekspozycja:<\/h3>\n        <div id=\"pvExposureButtons\" class=\"buttons exposure-buttons\"><\/div>\n        <div id=\"pvSpecialOptions\" style=\"display: none;\">\n          <h3 style=\"margin-top: 10px;\">Okres:<\/h3>\n          <div id=\"pvPeriodButtons\" class=\"buttons period-buttons\"><\/div>\n          <h3 style=\"margin-top: 10px;\">Terminy w okresie po\u0142udnia s\u0142onecznego (UTC)*:<\/h3>\n          <div id=\"pvTimeButtons\" class=\"buttons time-buttons\"><\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Krok 2: Wyb\u00f3r parametru (typ danych) -->\n      <div class=\"section\">\n        <h3>Parametr:<\/h3>\n        <div id=\"params\" class=\"buttons params-buttons\"><\/div>\n      <\/div>\n      \n      <!-- Sekcja specjalnych opcji GTI - warianty instalacji (okres i terminy jako niezale\u017cne zestawienia) -->\n      <div class=\"section\" id=\"gtiSpecialOptions\" style=\"display: none;\">\n        <h3>Okres:<\/h3>\n        <div id=\"gtiPeriodButtons\" class=\"buttons period-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Terminy w okresie po\u0142udnia s\u0142onecznego (UTC)*:<\/h3>\n        <div id=\"gtiTimeButtons\" class=\"buttons time-buttons\"><\/div>\n      <\/div>\n      \n      <!-- Sekcja specjalnych opcji PV - produkcja warianty (okres i terminy jako niezale\u017cne zestawienia) -->\n      <div class=\"section\" id=\"pvProdSpecialOptions\" style=\"display: none;\">\n        <h3>Okres:<\/h3>\n        <div id=\"pvProdPeriodButtons\" class=\"buttons period-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Terminy w okresie po\u0142udnia s\u0142onecznego (UTC)*:<\/h3>\n        <div id=\"pvProdTimeButtons\" class=\"buttons time-buttons\"><\/div>\n      <\/div>\n      \n      <!-- Sekcja wariant\u00f3w dla Zmiennosc_PV_rozdz_5_1 (nachylenie, ekspozycja, okres, terminy) -->\n      <div class=\"section\" id=\"zmPVVariantsSection\" style=\"display: none;\">\n        <h3>Nachylenie:<\/h3>\n        <div id=\"zmPVTiltButtons\" class=\"buttons tilt-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Ekspozycja:<\/h3>\n        <div id=\"zmPVExposureButtons\" class=\"buttons exposure-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Okres:<\/h3>\n        <div id=\"zmPVPeriodButtons\" class=\"buttons period-buttons\"><\/div>\n        <h3 style=\"margin-top: 10px;\">Terminy:<\/h3>\n        <div id=\"zmPVTimeButtons\" class=\"buttons time-buttons\"><\/div>\n      <\/div>\n\n      <!-- Krok 3: Wyb\u00f3r warto\u015bci (rok\/miesi\u0105c\/godzina) -->\n      <div class=\"section\" id=\"valuesSection\">\n        <h3 id=\"valuesTitle\">Kolejne mapy:<\/h3>\n        <div id=\"values\" class=\"buttons values-buttons\"><\/div>\n      <\/div>\n      \n      <!-- Sekcja por\u00f3wnania - widoczna tylko w trybie por\u00f3wnania -->\n      <div class=\"section\" id=\"comparisonSection\" style=\"display: none;\">\n        <h3>Tryb wy\u015bwietlania:<\/h3>\n        <div id=\"comparisonButtons\" class=\"buttons comparison-buttons\">\n          <button id=\"compareSingle\" class=\"comparison-btn active\">POJEDYNCZE<\/button>\n          <button id=\"compareGrid\" class=\"comparison-btn\">ZESTAWIENIE<\/button>\n          <button id=\"compareUnified\" class=\"comparison-btn\" style=\"display: none;\">ZESTAWIENIE (SKALA JEDNOLITA)<\/button>\n        <\/div>\n      <\/div>\n      \n      \n      <!-- Informacja o obs\u0142udze klawiatury -->\n      <div class=\"keyboard-info\">\n        <strong>\ud83d\udca1 Skr\u00f3ty klawiszowe:<\/strong><br>\n        \u2190 \u2192 Zmiana warto\u015bci (rok\/miesi\u0105c\/godzina)\n        A Animacja\n      <\/div>\n    <\/div>\n    \n    <!-- Prawa kolumna z obrazkiem -->\n    <div class=\"right-column\">\n      <div class=\"section images\">\n        <h3 id=\"imageTitle\" style=\"display: none;\"><\/h3>\n        \n        <!-- Poziomy slider do zmiany warto\u015bci -->\n        <div class=\"horizontal-slider-container\" id=\"horizontalSliderContainer\">\n          <div class=\"slider-header\">\n            <span class=\"slider-title\" id=\"sliderTitle\">Wyb\u00f3r:<\/span>\n            <span class=\"hour-value\" id=\"hourValue\"><\/span>\n            <div class=\"slider-controls\">\n              <button id=\"animateBtn\" class=\"control-btn\" title=\"Animuj\">\u25b6<\/button>\n            <\/div>\n          <\/div>\n          <input type=\"range\" id=\"forecastHourSlider\" class=\"horizontal-slider\" min=\"0\" max=\"0\" step=\"1\" value=\"0\">\n          <div class=\"hour-labels\" id=\"hourLabels\"><\/div>\n        <\/div>\n        \n        <div id=\"images\" class=\"images\"><\/div>\n        \n        <!-- Kontener dla por\u00f3wnania wielu obraz\u00f3w -->\n        <div id=\"comparisonImages\" class=\"comparison-images\" style=\"display: none;\"><\/div>\n        \n\n        \n        <!-- Sekcja Metodyki z akordeonami -->\n        <div class=\"methodology-section\">\n          <!-- G\u0142\u00f3wny akordeon zawieraj\u0105cy wszystkie pod-akordeony -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>INFORMACJE I METODYKA<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n          \n                <!-- Akordeon 1: O Atlasie -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>O Atlasie<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>Atlas powsta\u0142 na potrzeby inwentaryzacji zmienno\u015bci przestrzennej i czasowej zasob\u00f3w promieniowania s\u0142onecznego na obszarze Polski. Charakterystyki promieniowania oraz potencja\u0142 u\u017cytkowy zasob\u00f3w solarnych wyznaczono na podstawie danych z pomiar\u00f3w satelitarnych z okresu 01.01.2015-31.12.2024.<\/p>\n                \n                <!-- Przyk\u0142ad ryciny -->\n                <!--\n                <div class=\"figure-container\">\n                  <img src=\"sciezka\/do\/ryciny1.png\" alt=\"Opis ryciny\" onclick=\"openLightbox(this.src, this.alt)\">\n                  <div class=\"figure-caption\">Ryc. 1. Podpis ryciny<\/div>\n                <\/div>\n                -->\n              <\/div>\n            <\/div>\n          <\/div>\n          \n          <!-- Akordeon 2: Dane z pomiar\u00f3w satelitarnych -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Dane z pomiar\u00f3w satelitarnych sieci EUMETSAT LSA SAF<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>Dane wykorzystane w Opracowaniu pochodz\u0105 z bazy danych LSA SAF (Land Surface Analysis Satellite Applications Facility), organizacji EUTMESAT. Dane pozyskiwane s\u0105 z u\u017cyciem obserwacji satelitarnych Meteosat Second Generation (MSG). Urz\u0105dzenie pomiarowe SEVIRI zamieszczone jest na orbicie geostacjonarnej (na wysoko\u015bci oko\u0142o 36\u202f000 km n.p.z). Ze wzgl\u0119du na nieoptymalny k\u0105t obserwacji w wy\u017cszych szeroko\u015bci geograficznych i wynikaj\u0105ce z niego deformacje geometryczne surowe dane z SEVIRI przetwarzane s\u0105 przez algorytmy waliduj\u0105ce <a href=\"https:\/\/lsa-saf.eumetsat.int\/en\/user-support\/documentation\/\">LSA SAF<\/a>. Po opracowaniu produkty udost\u0119pniane w bazie danych, dost\u0119pnej pod adresem <a href=\"https:\/\/lsa-saf.eumetsat.int\/en\/data\/products\/\">https:\/\/lsa-saf.eumetsat.int\/en\/data\/products\/<\/a>. <\/p>\n                <p>W Opracowaniu uwzgl\u0119dniono produkt DSSF (Downward Surface Shortwave Flux, czyli strumie\u0144 promieniowania kr\u00f3tkofalowego skierowany w kierunku powierzchni Ziemi), kt\u00f3ry zawiera dane pomiarowe o nat\u0119\u017ceniu promieniowania w przedziale d\u0142ugo\u015bci fali 0.3-4.0 \u00b5m, z uwzgl\u0119dnieniem frakcji promieniowania bezpo\u015bredniego oraz udzia\u0142u promieniowania rozproszonego w\u202fstrumieniu promieniowania ca\u0142kowitego. Uwzgl\u0119dniono dane z rozdzielczo\u015bci\u0105 czasow\u0105 15\u202fminutow\u0105. Rozdzielczo\u015b\u0107 przestrzenna danych satelitarnych wynosi 5 km. W Opracowaniu, w\u202fcelu zwi\u0119kszenia dok\u0142adno\u015bci oblicze\u0144 nat\u0119\u017cenia promieniowania ca\u0142kowitego na p\u0142aszczyzn\u0119 nachylon\u0105 w danej ekspozycji (GTI, Global Tilted Irradiation), wykorzystano r\u00f3wnie\u017c produkt MDAL, kt\u00f3ry dostarczy\u0142 informacji warto\u015bci albedo u\u015brednionej za okres doby.<\/p>\n                <p>Pliki HDF5 za okres pomiar\u00f3w 01.01.2015-31.12.2024 wykorzystane w Opracowaniu zawiera\u0142y zestawy danych: DSSF_TOT (warto\u015bci promieniowania ca\u0142kowitego), FRACTION_DIFFUSE (udzia\u0142 frakcji promieniowania rozproszonego w ca\u0142kowitym), Q_FLAG (oznaczenie jako\u015bci danych), AOD (zawarto\u015b\u0107 aerozoli atmosferycznych) oraz OPACITY_INDEX (wska\u017anik nieprzejrzysto\u015bci kolumny atmosfery). Ka\u017cdy z powy\u017cszych zestaw\u00f3w danych zosta\u0142 zapisany w macierzy 3712x3712, co stanowi reprezentacj\u0119 geostacjonarnego dysku Ziemi widzianego przez satelity MSG. Na potrzeby opracowania wyodr\u0119bniony zosta\u0142 wycinek zawieraj\u0105cy terytorium Polski.<\/p>\n                <!-- Miejsce na ryciny -->\n              <\/div>\n            <\/div>\n          <\/div>\n          \n          <!-- Akordeon 3: Dane z zasob\u00f3w ERA5 LAND -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Dane z zasob\u00f3w ERA5 LAND<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>W Opracowaniu wykorzystano reanaliz\u0119 ERA5-Land udost\u0119pnian\u0105 przez <a href=\"https:\/\/climate.copernicus.eu\"> Copernicus Climate Change Service (C3S)<\/a> \/ ECMWF, stanowi\u0105c\u0105 sp\u00f3jny, wieloletni zbi\u00f3r danych meteorologicznych o podwy\u017cszonej rozdzielczo\u015bci przestrzennej nad l\u0105dem (9x9 km). Z bazy ERA5-Land pobrano pole temperatury powietrza na wysoko\u015bci 2 m (t2m) dla obszaru Polski za okres 01.02.2015-31.12.2024.<\/p>\n                <p>Dane temperatury wykorzystano jako zmienn\u0105 wej\u015bciow\u0105 do wyznaczenia parametr\u00f3w pracy modu\u0142\u00f3w fotowoltaicznych (m.in. temperatury ogniwa i wynikaj\u0105cych z niej strat sprawno\u015bci), a\u202fw konsekwencji do oszacowania produkcji energii elektrycznej z instalacji PV. Seri\u0119 czasow\u0105 t2m przygotowano w spos\u00f3b zapewniaj\u0105cy zgodno\u015b\u0107 z pozosta\u0142ymi danymi wej\u015bciowymi (w\u202fszczeg\u00f3lno\u015bci z produktami satelitarnymi w rozdzielczo\u015bci 15-minutowej), poprzez odpowiednie dopasowanie czasowe i przestrzenne do obszaru opracowania.<\/p>\n                <!-- Miejsce na ryciny -->\n              <\/div>\n            <\/div>\n          <\/div>\n          \n          <!-- Akordeon 4: Metodyka wyznaczania warto\u015bci GTI -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Metodyka wyznaczania warto\u015bci GTI<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>Do obliczenia nat\u0119\u017cenia promieniowania na p\u0142aszczyzn\u0119 nachylon\u0105 o zadanej ekspozycji - GTI (Global Tilted Irradiation) wykorzystano pakiet j\u0119zyka R - solaR<sup>1<\/sup>. Obok promieniowania ca\u0142kowitego i rozproszonego, wykorzystano dobowe warto\u015bci albedo mierzone przez satelit\u0119, a\u202fw\u202fprzypadku ich braku przyj\u0119to warto\u015b\u0107 0,2. Na podstawie tych danych, dla ka\u017cdego kroku czasowego i w\u0119z\u0142a siatki obliczano warto\u015b\u0107 promieniowania bezpo\u015bredniego S\u0142o\u0144ca, jego azymut i elewacj\u0119, a nast\u0119pnie wielko\u015b\u0107 promieniowania padaj\u0105cego na p\u0142aszczyzny o\u202fnachyleniach 30, 35 i 40\u00b0 oraz ekspozycjach 135\u00b0 (po\u0142udniowo-wschodnia), 180\u00b0 (po\u0142udniowa) i 225\u00b0 (po\u0142udniowo-zachodnia).<\/p>\n                <p><sup>1<\/sup><a href=\"https:\/\/doi.org\/10.18637\/jss.v050.i09\" title=\"Perpi\u00f1\u00e1n Lamigueiro, O. (2012). solaR: Solar Radiation and Photovoltaic Systems with R. Journal of Statistical Software, 50(9), 1\u201332.\">Perpi\u00f1\u00e1n Lamigueiro, O. (2012). solaR: Solar Radiation and Photovoltaic Systems with R. Journal of Statistical Software, 50(9), 1\u201332.<\/a><\/p>\n                <!-- Miejsce na ryciny -->\n              <\/div>\n            <\/div>\n          <\/div>\n          \n          <!-- Akordeon 5: Metodyka wyznaczania 'capacity factor' -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Metodyka wyznaczania 'capacity factor'<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>Wsp\u00f3\u0142czynnik wykorzystania mocy zainstalowanej <b>(CF, %)<\/b> to stosunek rzeczywistej ilo\u015bci energii wyprodukowanej przez \u017ar\u00f3d\u0142o w danym okresie do maksymalnej mo\u017cliwej produkcji energii, gdyby to \u017ar\u00f3d\u0142o pracowa\u0142o z moc\u0105 znamionow\u0105 przez ca\u0142y ten okres. Typowo analiz\u0119 przeprowadza si\u0119 dla jednego roku kalendarzowego, wybranych miesi\u0119cy lub pojedynczych dni lub godzin.<\/p>\n                <div class=\"figure-container\">\n                  <img src=\"wp-content\/uploads\/production\/oze\/logo\/WzCF.png\" alt=\"Wz\u00f3r CF\" onclick=\"openLightbox(this.src, this.alt)\">\n                <\/div>\n                <p>gdzie: \ud835\udc36\ud835\udc39 - wsp\u00f3\u0142czynnik wykorzystania mocy zainstalowanej, \ud835\udc38<sub>\ud835\udc45<\/sub> \u2013 energia elektryczna [kWh] wygenerowana przez \u017ar\u00f3d\u0142o w analizowanym okresie [h], \ud835\udc43<sub>\ud835\udc4d<\/sub> \u2013 moc znamionowa [kWp], T \u2013 okres analizy [h].<\/p>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <!-- Akordeon 6: Metodyka wyznaczania warto\u015bci generacji energii w instalacji PV -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Metodyka wyznaczania warto\u015bci generacji energii w instalacji PV<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>Za wzorcow\u0105 instalacj\u0119 przyj\u0119to system fotowoltaiczny o mocy znamionowej 1 kWp, okre\u015blonej w standardowych warunkach testowych (STC), tj. przy nat\u0119\u017ceniu promieniowania s\u0142onecznego r\u00f3wnym 1000 W\/m<sup>2<\/sup> temperaturze ogniwa 25\u00b0C oraz widmie AM 1.5. W obliczeniach przyj\u0119to temperatur\u0119 pracy modu\u0142u w warunkach rzeczywistych na poziomie 50\u00b0C oraz og\u00f3ln\u0105 sprawno\u015b\u0107 systemu r\u00f3wn\u0105 80%, uwzgl\u0119dniaj\u0105c\u0105 straty na inwerterze, okablowaniu oraz zabrudzeniu modu\u0142\u00f3w. Moc generowan\u0105 przez instalacj\u0119 fotowoltaiczn\u0105 wyznaczano zgodnie z\u202fmetodyk\u0105 zaproponowan\u0105 przez Shi, Wang i Zhang (2015)<sup>2<\/sup>, oraz dyskutowan\u0105 w pracy Aliabadi i Radmehr (2024)<sup>3<\/sup>.<\/p>\n                <p>Obliczenia przeprowadzono dla dziewi\u0119ciu wariant\u00f3w instalacji r\u00f3\u017cni\u0105cych si\u0119 parametrami monta\u017cowymi, uwzgl\u0119dniaj\u0105c trzy k\u0105ty nachylenia modu\u0142\u00f3w (30\u00b0, 35\u00b0 i 40\u00b0) oraz trzy kierunki ekspozycji (135\u00b0, 180\u00b0 i 225\u00b0). Temperatur\u0119 pracy modu\u0142u wyznaczano na podstawie danych o\u202ftemperaturze powietrza pochodz\u0105cych z zestaw\u00f3w ERA5-Land, zsynchronizowanych czasowo z danymi o nat\u0119\u017ceniu promieniowania s\u0142onecznego.<\/p>\n                <p><sup>2<\/sup><a href=\"https:\/\/doi.org\/10.1016\/j.solener.2015.03.052\" title=\"Zhichao Shi, Rui Wang, Tao Zhang, Multi-objective optimal design of hybrid renewable energy systems using preference-inspired coevolutionary approach, Solar Energy, Volume 118, 2015, Pages 96-106\">\"Zhichao Shi, Rui Wang, Tao Zhang, Multi-objective optimal design of hybrid renewable energy systems using preference-inspired coevolutionary approach, Solar Energy, Volume 118, 2015, Pages 96-106\"<\/a><\/p>\n                <p><sup>3<\/sup><a href=\"https:\/\/doi.org\/10.1038\/s41598-024-73808-8\" title=\"Aliabadi, M.J., Radmehr, M. Hybrid energy system optimization integrated with battery storage in radial distribution networks considering reliability and a robust framework. Sci Rep 14, 26597 (2024).\">\"Aliabadi, M.J., Radmehr, M. Hybrid energy system optimization integrated with battery storage in radial distribution networks considering reliability and a robust framework. Sci Rep 14, 26597 (2024).\"<\/a><\/p>\n              <\/div>\n            <\/div>\n          <\/div>\n          \n          <!-- Akordeon 7: Metodyka wyznaczania 'Ramp rate' -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Metodyka wyznaczania 'Ramp rate'<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>Wsp\u00f3\u0142czynnik Ramp rate (tempo zmian mocy) wyznaczony zosta\u0142 na podstawie zmian GHI jako przybli\u017cenie kr\u00f3tkoterminowej (15 minutowej) zmienno\u015bci generacji PV.<\/p>\n                <p>Warto\u015b\u0107 parametru ramp rate (RR) wyznaczono dla ka\u017cdej lokalizacji i (w\u0119z\u0142a siatki 3x3km) w\u202foparciu o dane godzinowe nas\u0142onecznienia (GHI), z wykorzystaniem poni\u017cszego wzoru:<\/p>\n                <div class=\"figure-container\">\n                  <img src=\"wp-content\/uploads\/production\/oze\/logo\/WzRR.png\" alt=\"Wz\u00f3r RR\" onclick=\"openLightbox(this.src, this.alt)\">\n                <\/div>\n                <p>gdzie: n \u2013 to d\u0142ugo\u015b\u0107 (w godzinach) analizowanego okresu, np. 8760\/84 dla roku kalendarzowego.<\/p>\n                <p>W kolejnym kroku wyznaczono \u015bredni\u0105 warto\u015b\u0107 parametru RR<sub>avg<\/sub> w skali kraju, kt\u00f3ry to nast\u0119pnie u\u017cyto jako punkt odniesienia dla okre\u015blenia zmienno\u015bci nas\u0142onecznienia w poszczeg\u00f3lnych lokalizacjach.<\/p>\n                <p>W tym celu obliczono bezwymiarowy wska\u017anik (\ud835\udc45\ud835\udc45<sub>rel<\/sub>) wg poni\u017cszego wzoru:<\/p>\n                <div class=\"figure-container\">\n                  <img src=\"wp-content\/uploads\/production\/oze\/logo\/WzRR2.png\" alt=\"Wz\u00f3r RR\" onclick=\"openLightbox(this.src, this.alt)\">\n                <\/div>\n                <p>kt\u00f3rego warto\u015bci \ud835\udc45\ud835\udc45<sub>rel<\/sub> &lt; 1 wskazuj\u0105 na ni\u017csz\u0105 zmienno\u015b\u0107 (bardziej \u201estabilne\u201d warunki nas\u0142onecznienia), natomiast \ud835\udc45\ud835\udc45<sub>rel<\/sub> > 1 oznaczaj\u0105 wy\u017csz\u0105 zmienno\u015b\u0107 lokaln\u0105 wzgl\u0119dem \u015bredniej krajowej. Analiz\u0119 przeprowadzono w uj\u0119ciu danych rocznych oraz w rozbiciu na poszczeg\u00f3lne miesi\u0105ce.<\/p>\n              <\/div>\n            <\/div>\n          <\/div>\n          \n          <!-- Akordeon 8: Zestawienia i opisy na mapach -->\n          <div class=\"accordion\">\n            <div class=\"accordion-header\" onclick=\"toggleAccordion(this)\">\n              <span>Zestawienia i opisy na mapach<\/span>\n              <span class=\"accordion-icon\">\u25bc<\/span>\n            <\/div>\n            <div class=\"accordion-content\">\n              <div class=\"accordion-body\">\n                <p>W tytule mapy zawarto nazw\u0119 charakterystyki promieniowania s\u0142onecznego lub jej potencja\u0142u u\u017cytkowego. W przypadku analizy dw\u00f3ch zmiennych (n. \u015bredniej rocznej i\u202fdobowej) kolejno\u015b\u0107 opisu w tytule nawi\u0105zuje do opisu jednostek przy skali barwnej (skala podw\u00f3jna, Rys. 1a). Dla ka\u017cdej grafiki zastosowano jednakow\u0105 skal\u0119 barwn\u0105 sk\u0142adaj\u0105c\u0105 si\u0119 z 9 kategorii o r\u00f3wnym zakresie przedzia\u0142\u00f3w. Przedzia\u0142y warto\u015bci na skali dopasowano do rozk\u0142adu danych uj\u0119tych w analizie cz\u0105stkowej, kt\u00f3rej dotyczy mapa. W\u202ften spos\u00f3b dla ka\u017cdego terminu, rocznika lub okresu mo\u017cliwe jest lepsze zobrazowanie rozk\u0142adu przestrzennego danego zjawiska. Dla u\u0142atwienia por\u00f3wna\u0144 opracowano r\u00f3wnie\u017c zestawienia map z zastosowaniem jednolitej skali barwnej, tj. uwzgl\u0119dniaj\u0105cej rozk\u0142ad danych i podzia\u0142 na przedzia\u0142y warto\u015bci w odniesieniu do ca\u0142ego zbioru podlegaj\u0105cego analizie.<\/p>\n                <p>W lewym g\u00f3rnym rogu grafiki, w polu ramki z map\u0105, znajduje si\u0119 odniesienie do okresu uwzgl\u0119dnionego w analizie kt\u00f3rego dotyczy mapa. Charakterystyka - zwi\u0119\u017ale opisana w\u202ftytule mapy - mo\u017ce uwzgl\u0119dnia\u0107 pojedynczy rocznik np. 2015 (Rys. 1a), warto\u015b\u0107 \u015bredni\u0105 za okres 2015-2024 (Rys. 1b), miesi\u0105c (Rys. 1c) lub godzin\u0119 (Rys. 1d).<\/p>\n                <div class=\"figure-container\">\n                  <img src=\"wp-content\/uploads\/production\/oze\/logo\/Prez_graf1.png\" alt=\"Prezentacja graficzna\" onclick=\"openLightbox(this.src, this.alt)\">\n                  <div class=\"figure-caption\">Rys. 1. Prezentacja graficzna wynik\u00f3w AES-PL z odniesieniem do okresu analizy w prawym g\u00f3rnym rogu pola mapy.<\/div>\n                <\/div>\n                <p>W analizach uwzgl\u0119dniono r\u00f3wnie\u017c ocen\u0119 zasob\u00f3w promieniowania s\u0142onecznego padaj\u0105cego na p\u0142aszczyzn\u0119 nachylon\u0105 pod k\u0105tem 30, 35 lub 40\u00b0 i ustalonej ekspozycji 135\u00b0 (po\u0142udniowo-wschodnia), 180\u00b0 (po\u0142udniowa) lub 225\u00b0 (po\u0142udniowo-zachodnia). Analogiczne warianty monta\u017cu instalacji przyj\u0119to dla oceny potencja\u0142u u\u017cytkowego, tj. produkcji energii w systemach PV. W\u202fobu przypadkach opis wariantu zawarto w drugiej linijce tytu\u0142u grafiki (Rys. 2 a-c).<\/p>\n                <div class=\"figure-container\">\n                  <img src=\"wp-content\/uploads\/production\/oze\/logo\/Prez_graf2.png\" alt=\"Prezentacja graficzna\" onclick=\"openLightbox(this.src, this.alt)\">\n                  <div class=\"figure-caption\">Rys. 2. Prezentacja graficzna wynik\u00f3w AES-PL z odniesieniem do charakterystyki nachylenia i ekspozycji p\u0142aszczyzny.<\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n          \n        <\/div> <!-- Koniec g\u0142\u00f3wnego akordeonu -->\n        <\/div> <!-- Koniec sekcji metodyki -->\n        \n        <!-- Stopka strony -->\n        <div class=\"page-footer\">\n          <div class=\"footer-text\">\n            <p style=\"text-align:center;\">Atlas Energetyki Solarnej AES-PL &copy; 2026<\/p>\n            <div class=\"footer-logos\">\n            <!-- Logo 1 -->\n              <img src=\"wp-content\/uploads\/production\/oze\/logo\/amew_logo.png\" alt=\"Logo\" onerror=\"this.style.display='none'\">\n            <\/div>\n            <p>Projekt\u202fAES-PL\u202frealizowany jest przez Instytut Meteorologii i Gospodarki Wodnej \u2013 Pa\u0144stwowy Instytut Badawczy we wsp\u00f3\u0142pracy z Politechnik\u0105 Wroc\u0142awsk\u0105, przez zesp\u00f3\u0142 w sk\u0142adzie:\u202fB. Bochenek<sup>1<\/sup>, \u202fM. Gruszczy\u0144ska<sup>1<\/sup>, A. Jaczewski<sup>1<\/sup>, J.Jurasz<sup>2<\/sup>, A. Mazur<sup>1<\/sup>, T. Strzy\u017cewski<sup>1<\/sup>, A. Surowiecki<sup>1<\/sup> i\u202fJ. Wieczorek<sup>1<\/sup>.  <\/p>\n            <p>Projekt cyfrowej wersji AES-PL opracowany przez B. Sobczyk<sup>1<\/sup> i A. Mandal<sup>1<\/sup>. <\/p>\n            <p>Konsultacja merytoryczna Aleksandra Kowalska<sup>3<\/sup>  i Justyna Szymkowska<sup>3<\/sup> <\/p>\n            <p><sup>1<\/sup>\u202fIMGW-PIB Laboratorium Modelowania Meteorologicznego <\/p>\n            <p><sup>2<\/sup>\u202fPolitechnika Wroc\u0142awska - praca powsta\u0142a w ramach projektu naukowego nr 2022\/47\/B\/ST8\/01113 finansowanego przez Narodowe Centrum Nauki, zatytu\u0142owanego: \u201eMetoda kwantyfikacji susz energetycznych \u017ar\u00f3de\u0142 odnawialnych w oparciu o dane historyczne i projekcje zmian klimatu\u201d. <\/p>\n            <p><sup>3<\/sup>\u202fIMGW-PIB Pracownia Promieniowania S\u0142onecznego <\/p>\n            <p>Zesp\u00f3\u0142 sk\u0142ada podzi\u0119kowania panu Marcelemu Tropi\u0142o, studentowi wydzia\u0142u Nauk Geograficznych  i\u202fGeologicznych Uniwersytetu im. Adama Mickiewicza w Poznaniu, kt\u00f3ry w ramach realizacji praktyki studenckiej w IMGW-PIB wspom\u00f3g\u0142 prace techniczne w zakresie przygotowania danych. <\/p>\n            <p>Adres do kontaktu:\u202f<a href=\"mailto:modele@imgw.pl\">modele@imgw.pl<\/a><\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  .forecast-app { \n    font-family: Arial, sans-serif;\n    max-width: 1200px;\n    margin: 0 auto;\n  }\n  \n  .app-title {\n    text-align: center;\n    color: rgba(86, 221, 208, 1);\n    font-size: calc(2em + 2pt);\n    margin: 20px 0;\n    padding: 15px;\n    background: linear-gradient(135deg, #f5f5f5 0%, #e8f8f7 100%);\n    border-radius: 10px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n  }\n  \n  .layout-container {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n  }\n  \n  .left-column {\n    flex: 1;\n    min-width: 230px;\n    max-width: 260px;\n  }\n  \n  .right-column {\n    flex: 2;\n    min-width: 400px;\n  }\n  \n  .time-note {\n    font-size: 11px;\n    color: #666;\n    margin-top: 15px;\n    padding: 10px;\n    line-height: 1.5;\n    background-color: #f9f9f9;\n    border-radius: 4px;\n  }\n  \n  .keyboard-info {\n    font-size: 11px;\n    color: #555;\n    margin-top: 15px;\n    padding: 10px;\n    line-height: 1.6;\n    background-color: #f0f8ff;\n    border-left: 3px solid rgba(86, 221, 208, 1);\n    border-radius: 4px;\n  }\n  \n  .keyboard-info strong {\n    color: rgba(86, 221, 208, 1);\n    font-size: 12px;\n  }\n  \n  .section { \n    margin-bottom: 12px;\n    background: #f9f9f9;\n    padding: 10px;\n    border-radius: 8px;\n    box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n  }\n  \n  .section h3 {\n    margin-top: 0;\n    margin-bottom: 8px;\n    border-bottom: 1px solid #ddd;\n    padding-bottom: 5px;\n    color: #333;\n    font-size: 0.95em;\n  }\n  \n  .buttons { \n    display: flex;\n    flex-wrap: wrap;\n    gap: 5px;\n  }\n  \n  .buttons button {\n    padding: 6px 12px;\n    border: 1px solid #666;\n    border-radius: 6px;\n    background: #f5f5f5;\n    cursor: pointer;\n    transition: all 0.2s;\n    font-size: 0.9em;\n  }\n  \n  .buttons button:hover { \n    background: #ddd; \n  }\n  \n  .buttons button.active {\n    background-color: rgba(86, 221, 208, 1);\n    color: white;\n    border-color: #2E7D32;\n  }\n  \n  \/* Style dla przycisk\u00f3w modeli *\/\n  .models-buttons {\n    flex-direction: column;\n    width: 100%;\n  }\n  \n  .models-buttons button {\n    width: 100%;\n    text-align: center;\n    padding: 8px 12px;\n  }\n  \n  \/* Style dla przycisk\u00f3w parametr\u00f3w *\/\n  .params-buttons {\n    flex-direction: column;\n    width: 100%;\n  }\n  \n  .params-buttons button {\n    width: 100%;\n    text-align: left;\n    padding: 6px 12px;\n    font-size: 0.85em;\n  }\n  \n  \/* Style dla przycisk\u00f3w warto\u015bci *\/\n  .values-buttons {\n    flex-wrap: wrap;\n    gap: 4px;\n  }\n  \n  .values-buttons button {\n    flex: 0 0 calc((100% - 8px) \/ 3);\n    min-width: 45px;\n    padding: 5px 4px;\n    font-size: 0.8em;\n    text-align: center;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n  \n  \/* Style dla przycisk\u00f3w por\u00f3wnania *\/\n  .comparison-buttons {\n    width: 100%;\n    gap: 8px;\n  }\n  \n  .comparison-buttons button {\n    flex: 1;\n    padding: 8px 12px;\n    font-weight: bold;\n  }\n  \n  \/* Style dla przycisk\u00f3w ekspozycji i nachylenia GTI *\/\n  .exposure-buttons,\n  .tilt-buttons {\n    flex-wrap: wrap;\n    gap: 5px;\n  }\n  \n  .exposure-buttons button,\n  .tilt-buttons button {\n    flex: 1;\n    min-width: 60px;\n    padding: 8px 10px;\n    font-size: 0.9em;\n    text-align: center;\n    white-space: nowrap;\n  }\n  \n  \/* Style dla przycisk\u00f3w okres\u00f3w i termin\u00f3w w sekcjach PV *\/\n  .period-buttons,\n  .time-buttons {\n    flex-wrap: wrap;\n    gap: 5px;\n  }\n  \n  .period-buttons button {\n    flex: 0 0 calc((100% - 10px) \/ 3);\n    min-width: 70px;\n    padding: 8px 10px;\n    font-size: 0.85em;\n    text-align: center;\n    white-space: nowrap;\n  }\n  \n  \/* Specjalny uk\u0142ad dla przycisk\u00f3w okres\u00f3w w sekcji Zmienno\u015b\u0107 PV *\/\n  #zmPVVariantsSection .period-buttons {\n    justify-content: space-between;\n  }\n  \n  #zmPVVariantsSection .period-buttons button:first-child {\n    flex: 0 0 100%;\n  }\n  \n  #zmPVVariantsSection .period-buttons button:not(:first-child) {\n    flex: 1 1 0;\n    min-width: 0;\n    text-align: center;\n    padding-left: 8px;\n    padding-right: 8px;\n  }\n  \n  .time-buttons button {\n    flex: 0 0 calc((100% - 15px) \/ 4);\n    min-width: 55px;\n    padding: 8px 8px;\n    font-size: 0.85em;\n    text-align: center;\n    white-space: nowrap;\n  }\n  \n  \/* Slider *\/\n  .horizontal-slider-container {\n    width: 100%;\n    margin: 0 0 20px 0;\n    padding: 10px;\n    background-color: #f5f5f5;\n    border-radius: 5px;\n    box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n  }\n  \n  .horizontal-slider {\n    -webkit-appearance: none;\n    appearance: none;\n    width: 100%;\n    height: 10px;\n    border-radius: 5px;\n    background: #e0e0e0;\n    outline: none;\n    margin: 10px 0;\n  }\n  \n  .horizontal-slider::-webkit-slider-thumb {\n    -webkit-appearance: none;\n    width: 24px;\n    height: 24px;\n    border-radius: 50%;\n    background: rgba(86, 221, 208, 1);\n    cursor: pointer;\n    border: 2px solid #fff;\n    box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n  }\n  \n  .horizontal-slider::-moz-range-thumb {\n    width: 24px;\n    height: 24px;\n    border-radius: 50%;\n    background: rgba(86, 221, 208, 1);\n    cursor: pointer;\n  }\n  \n  .slider-header {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n  \n  .slider-title {\n    font-size: 1.1em;\n    font-weight: bold;\n    color: #333;\n  }\n  \n  .hour-value {\n    font-size: 1.3em;\n    font-weight: bold;\n    color: rgba(86, 221, 208, 1);\n  }\n  \n  .slider-controls {\n    margin-left: auto;\n  }\n  \n  .control-btn {\n    background: rgba(86, 221, 208, 0.1);\n    border: 2px solid rgba(86, 221, 208, 1);\n    color: rgba(86, 221, 208, 1);\n    font-size: 1.2em;\n    width: 36px;\n    height: 36px;\n    border-radius: 8px;\n    cursor: pointer;\n    transition: all 0.2s;\n  }\n  \n  .control-btn:hover {\n    background: rgba(86, 221, 208, 0.2);\n  }\n  \n  .control-btn.active {\n    background: rgba(86, 221, 208, 1);\n    color: white;\n  }\n  \n  .hour-labels {\n    color: #666;\n    font-size: 0.8em;\n    position: relative;\n    height: 20px;\n    width: calc(100% - 24px);\n    margin: 0 12px;\n  }\n  \n  \/* Obrazy *\/\n  .section.images {\n    min-height: 500px;\n  }\n  \n  #images.images {\n    min-height: 400px;\n  }\n  \n  .images img {\n    max-width: 100%;\n    margin: 5px auto;\n    border: 1px solid #ccc;\n    display: block;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n  }\n  \n  \/* Por\u00f3wnanie obraz\u00f3w *\/\n  .comparison-images {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n    gap: 15px;\n    padding: 10px;\n  }\n  \n  .comparison-images > div {\n    text-align: center;\n    background: #fff;\n    padding: 10px;\n    border-radius: 8px;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n  }\n  \n  .comparison-images img {\n    max-width: 100%;\n    border: 1px solid #ddd;\n    border-radius: 4px;\n  }\n  \n  .comparison-images .caption {\n    font-weight: bold;\n    margin-top: 8px;\n    color: #333;\n  }\n  \n  \/* Loader *\/\n  .loader-container {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: 100%;\n    height: 300px;\n    background-color: rgba(245, 245, 245, 0.7);\n  }\n  \n  .loader {\n    border: 10px solid #f3f3f3;\n    border-radius: 50%;\n    border-top: 10px solid rgba(86, 221, 208, 1);\n    width: 80px;\n    height: 80px;\n    animation: spin 0.8s linear infinite;\n  }\n  \n  @keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n  }\n  \n  .parameter-description {\n    margin-top: 15px;\n    padding: 10px;\n    background-color: #f8f9fa;\n    border: 1px solid #dee2e6;\n    border-radius: 4px;\n    font-size: 13px;\n    color: #333;\n    line-height: 1.5;\n  }\n  \n  \/* Akordeony Metodyki *\/\n  .methodology-section {\n    margin-top: 20px;\n  }\n  \n  .methodology-title {\n    font-size: 1.3em;\n    font-weight: bold;\n    color: rgba(86, 221, 208, 1);\n    margin-bottom: 15px;\n    padding-bottom: 10px;\n    border-bottom: 2px solid rgba(86, 221, 208, 0.5);\n  }\n  \n  .accordion {\n    margin-bottom: 8px;\n    border: 1px solid #ddd;\n    border-radius: 6px;\n    overflow: hidden;\n  }\n  \n  .accordion-header {\n    background: linear-gradient(135deg, #f5f5f5 0%, #e8f8f7 100%);\n    padding: 12px 15px;\n    cursor: pointer;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    font-weight: 600;\n    color: #333;\n    transition: background 0.2s;\n    user-select: none;\n  }\n  \n  .accordion-header:hover {\n    background: linear-gradient(135deg, #e8f8f7 0%, #d0f0ed 100%);\n  }\n  \n  .accordion-header.active {\n    background: rgba(86, 221, 208, 0.2);\n    border-bottom: 1px solid #ddd;\n  }\n  \n  .accordion-icon {\n    font-size: 1.2em;\n    transition: transform 0.3s;\n    color: rgba(86, 221, 208, 1);\n  }\n  \n  .accordion-header.active .accordion-icon {\n    transform: rotate(180deg);\n  }\n  \n  .accordion-content {\n    max-height: 0;\n    overflow: hidden;\n    transition: max-height 0.3s ease-out;\n    background: #fff;\n  }\n  \n  .accordion-content.open {\n    max-height: 10000px;\n    transition: max-height 0.5s ease-in;\n  }\n  \n  .accordion-body {\n    padding: 15px;\n    color: #444;\n    line-height: 1.7;\n    text-align: justify;\n    text-justify: inter-word;\n  }\n  \n  .accordion-body p {\n    margin: 0 0 10px 0;\n  }\n  \n  .accordion-body ul {\n    margin: 10px 0;\n    padding-left: 20px;\n  }\n  \n  .accordion-body li {\n    margin-bottom: 5px;\n  }\n  \n  \/* Ryciny w akordeonach *\/\n  .figure-container {\n    margin: 15px 0;\n    text-align: center;\n  }\n  \n  .figure-container img {\n    max-width: 100%;\n    border: 1px solid #ddd;\n    border-radius: 4px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n    cursor: zoom-in;\n  }\n  \n  .figure-caption {\n    margin-top: 8px;\n    font-size: 0.9em;\n    color: #666;\n    font-style: italic;\n  }\n  \n  \/* Stopka strony *\/\n  .page-footer {\n    margin-top: 40px;\n    padding: 20px;\n    background: linear-gradient(135deg, #f5f5f5 0%, #e8f8f7 100%);\n    border-top: 3px solid rgba(86, 221, 208, 1);\n    border-radius: 8px 8px 0 0;\n    text-align: left;\n  }\n  \n  .footer-logos {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    gap: 40px;\n    margin-bottom: 15px;\n    flex-wrap: wrap;\n  }\n  \n  .footer-logos img {\n    max-height: 60px;\n    max-width: 200px;\n    object-fit: contain;\n  }\n  \n  .footer-text {\n    font-size: 0.85em;\n    color: #666;\n    line-height: 1.5;\n  }\n  \n  .footer-text a {\n    color: rgba(86, 221, 208, 1);\n    text-decoration: none;\n  }\n  \n  .footer-text a:hover {\n    text-decoration: underline;\n  }\n  \n  \/* Lightbox *\/\n  .lightbox {\n    display: none;\n    position: fixed;\n    z-index: 9999;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    background-color: rgba(0, 0, 0, 0.9);\n    cursor: zoom-out;\n  }\n  \n  .lightbox.active {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n  \n  .lightbox img {\n    max-width: 95%;\n    max-height: 95%;\n    object-fit: contain;\n    box-shadow: 0 0 50px rgba(0, 0, 0, 0.8);\n  }\n  \n  .lightbox-close {\n    position: absolute;\n    top: 20px;\n    right: 40px;\n    font-size: 40px;\n    font-weight: bold;\n    color: #fff;\n    cursor: pointer;\n    z-index: 10000;\n  }\n  \n  .lightbox-close:hover {\n    color: #ccc;\n  }\n  \n  \/* Kursor dla obrazk\u00f3w *\/\n  .images img,\n  .comparison-images img {\n    cursor: zoom-in;\n  }\n  \n  \/* Responsywno\u015b\u0107 *\/\n  @media (max-width: 768px) {\n    .layout-container {\n      flex-direction: column;\n    }\n    \n    .left-column, .right-column {\n      max-width: 100%;\n      width: 100%;\n    }\n    \n    .keyboard-info {\n      display: none;\n    }\n    \n    .comparison-images {\n      grid-template-columns: repeat(2, 1fr);\n    }\n  }\n<\/style>\n\n<script>\n\/\/ ============================================\n\/\/ ATLAS ENERGETYKI SOLARNEJ (AES-PL)\n\/\/ Wersja: 2025-01-07\n\/\/ autor: bsobczyk\n\/\/ ============================================\n\n\/\/ Konfiguracja charakterystyk promieniowania\nconst models = [\"GHI_rozdz_1\", \"GTI_rozdz2\", \"GHI_zmiennosc_rozdz3\", \"PV_rozdz4\", \"Zmiennosc_PV_rozdz_5_1\" \/*, \"zmEV\" *\/];\n\n\/\/ Parametry dla ka\u017cdej charakterystyki\nconst paramsForModels = {\n  \"GHI_rozdz_1\": [\"roczniki\", \"srednie_mc\", \"srednie_godz\"],\n  \"GTI_rozdz2\": [\"roczniki\", \"srednie_mc\", \"srednie_godz\", \"warianty_instalacji\"],\n  \"GHI_zmiennosc_rozdz3\": [\"odch_std_roczniki\", \"odch_std_miesiac\", \"rozrzut_wz_roczniki\", \"rozrzut_wz_miesiac\"],\n  \"PV_rozdz4\": [\"pv_roczna_dobowa\", \"pv_miesieczna_dobowa\", \"pv_godzinowa\", \"pv_wspolczynnik\", \"pv_wspolczynnik_mc\", \"pv_wspolczynnik_godz\", \"pv_produkcja_wariant\"],\n  \"Zmiennosc_PV_rozdz_5_1\": [\"zmiennosc_mean\", \"zmiennosc_std\"]\n};\n\n\/\/ Warto\u015bci ekspozycji i nachylenia dla GTI\nconst gtiExposureValues = [\"225\", \"180\", \"135\"];\nconst gtiTiltValues = [\"30\", \"35\", \"40\"];\n\n\/\/ Warto\u015bci ekspozycji i nachylenia dla PV\nconst pvExposureValues = [\"225\", \"180\", \"135\"];\nconst pvTiltValues = [\"30\", \"35\", \"40\"];\n\n\/\/ Warto\u015bci okres\u00f3w dla PV\nconst pvPeriodValues = [\"01\", \"07\", \"rok\"];\nconst pvTimeValues = [\"1015\", \"1030\", \"1045\", \"1100\", \"1115\"];\n\n\/\/ Warto\u015bci okres\u00f3w i termin\u00f3w dla wariant\u00f3w GTI (niezale\u017cne zestawienia)\nconst gtiPeriodValues = [\"01\", \"07\", \"rok\"];\nconst gtiTimeValues = [\"1015\", \"1030\", \"1045\", \"1100\", \"1115\"];\n\n\/\/ Warto\u015bci okres\u00f3w i termin\u00f3w dla wariant\u00f3w PV produkcja (niezale\u017cne zestawienia)\nconst pvProdPeriodValues = [\"01\", \"07\", \"rok\"];\nconst pvProdTimeValues = [\"1015\", \"1030\", \"1045\", \"1100\", \"1115\"];\n\n\/\/ Warto\u015bci ekspozycji i nachylenia dla Zmiennosc_PV_rozdz_5_1\nconst zmPVExposureValues = [\"225\", \"180\", \"135\"];\nconst zmPVTiltValues = [\"30\", \"35\", \"40\"];\n\n\/\/ Warto\u015bci okres\u00f3w dla Zmiennosc_PV_rozdz_5_1\nconst zmPVPeriodValues = [\"equinox\", \"summer\", \"winter\"];\n\/\/ Warto\u015bci termin\u00f3w dla Zmiennosc_PV_rozdz_5_1 zale\u017cne od okresu\nconst zmPVTimeValues = {\n  \"equinox\": [\"0430\", \"0445\", \"0500\", \"1015\", \"1030\", \"1045\", \"1100\", \"1115\", \"1615\", \"1630\", \"1645\"],\n  \"summer\": [\"0215\", \"0230\", \"0245\", \"1015\", \"1030\", \"1045\", \"1100\", \"1115\", \"1830\", \"1845\", \"1900\"],\n  \"winter\": [\"0645\", \"0700\", \"0715\", \"1015\", \"1030\", \"1045\", \"1100\", \"1115\", \"1345\", \"1400\", \"1415\"]\n};\n\n\/\/ Flaga okre\u015blaj\u0105ca, czy nale\u017cy u\u017cywa\u0107 zestawienia okres\u00f3w czy termin\u00f3w\nlet gtiVariantMode = \"period\"; \/\/ \"period\" lub \"time\"\n\nconst exposureDisplayNames = {\n  \"225\": \"225\u00b0 (SW)\",\n  \"180\": \"180\u00b0 (S)\",\n  \"135\": \"135\u00b0 (SE)\"\n};\n\nconst tiltDisplayNames = {\n  \"30\": \"30\u00b0\",\n  \"35\": \"35\u00b0\",\n  \"40\": \"40\u00b0\"\n};\n\nconst pvPeriodDisplayNames = {\n  \"01\": \"Stycze\u0144\",\n  \"07\": \"Lipiec\",\n  \"rok\": \"Rok\"\n};\n\nconst pvTimeDisplayNames = {\n  \"1015\": \"10:15\",\n  \"1030\": \"10:30\",\n  \"1045\": \"10:45\",\n  \"1100\": \"11:00\",\n  \"1115\": \"11:15\"\n};\n\nconst gtiPeriodDisplayNames = {\n  \"01\": \"Stycze\u0144\",\n  \"07\": \"Lipiec\",\n  \"rok\": \"ROK\"\n};\n\nconst gtiTimeDisplayNames = {\n  \"1015\": \"10:15\",\n  \"1030\": \"10:30\",\n  \"1045\": \"10:45\",\n  \"1100\": \"11:00\",\n  \"1115\": \"11:15\"\n};\n\nconst pvProdPeriodDisplayNames = {\n  \"01\": \"Stycze\u0144\",\n  \"07\": \"Lipiec\",\n  \"rok\": \"ROK\"\n};\n\nconst pvProdTimeDisplayNames = {\n  \"1015\": \"10:15\",\n  \"1030\": \"10:30\",\n  \"1045\": \"10:45\",\n  \"1100\": \"11:00\",\n  \"1115\": \"11:15\"\n};\n\nconst zmPVPeriodDisplayNames = {\n  \"equinox\": \"R\u00f3wnonoc wiosenna\/jesienna\",\n  \"summer\": \"Przesilenie letnie\",\n  \"winter\": \"Przesilenie zimowe\"\n};\n\nconst zmPVTimeDisplayNames = {\n  \"0215\": \"2:15\", \"0230\": \"2:30\", \"0245\": \"2:45\",\n  \"0430\": \"4:30\", \"0445\": \"4:45\", \"0500\": \"5:00\",\n  \"0645\": \"6:45\", \"0700\": \"7:00\", \"0715\": \"7:15\",\n  \"1015\": \"10:15\", \"1030\": \"10:30\", \"1045\": \"10:45\", \"1100\": \"11:00\", \"1115\": \"11:15\",\n  \"1345\": \"13:45\", \"1400\": \"14:00\", \"1415\": \"14:15\",\n  \"1615\": \"16:15\", \"1630\": \"16:30\", \"1645\": \"16:45\",\n  \"1830\": \"18:30\", \"1845\": \"18:45\", \"1900\": \"19:00\"\n};\n\n\/\/ Warto\u015bci dla ka\u017cdego parametru\nconst valuesForParams = {\n  \"roczniki\": [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\", \"2015-2024\"],\n  \"srednie_mc\": [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"],\n  \"srednie_godz\": [\"0400\", \"0500\", \"0600\", \"0700\", \"0800\", \"0900\", \"1000\", \"1100\", \"1200\", \"1300\", \"1400\", \"1500\", \"1600\", \"1700\", \"1800\"],\n  \"srednie_godz_gti\": [\"0400\", \"0500\", \"0600\", \"0700\", \"0800\", \"0900\", \"1000\", \"1100\", \"1200\", \"1300\", \"1400\", \"1500\", \"1600\", \"1700\", \"1800\"],\n  \"srednie_12UTC\": [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"],\n  \"odch_std_roczniki\": [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\", \"2015-2024\"],\n  \"odch_std_miesiac\": [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"],\n  \/\/\"rozrzut_roczniki\": [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\"],\n  \"rozrzut_wz_roczniki\": [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\", \"2015-2024\"],\n  \"rozrzut_wz_miesiac\": [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"],\n  \"pv_roczna_dobowa\": [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\", \"2015-2024\"],\n  \"pv_miesieczna_dobowa\": [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"],\n  \"pv_godzinowa\": [\"0400\", \"0500\", \"0600\", \"0700\", \"0800\", \"0900\", \"1000\", \"1100\", \"1200\", \"1300\", \"1400\", \"1500\", \"1600\", \"1700\", \"1800\"],\n  \"pv_wspolczynnik\": [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\", \"2015-2024\"],\n  \"pv_wspolczynnik_mc\": [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"],\n  \"pv_wspolczynnik_godz\": [\"0400\", \"0500\", \"0600\", \"0700\", \"0800\", \"0900\", \"1000\", \"1100\", \"1200\", \"1300\", \"1400\", \"1500\", \"1600\", \"1700\", \"1800\"],\n  \"warianty_instalacji\": [\"period_01\", \"period_07\", \"period_rok\", \"time_1015\", \"time_1030\", \"time_1045\", \"time_1100\", \"time_1115\"],\n  \"pv_produkcja_wariant\": [\"period_01\", \"period_07\", \"period_rok\", \"time_1015\", \"time_1030\", \"time_1045\", \"time_1100\", \"time_1115\"]\n};\n\n\/\/ Nazwy wy\u015bwietlane\nconst modelDisplayNames = {\n  \"GHI_rozdz_1\": \"GHI promieniowanie ca\u0142kowite na p\u0142aszczyzn\u0119 poziom\u0105\",\n  \"GTI_rozdz2\": \"GTI promieniowanie ca\u0142kowite na p\u0142aszczyzn\u0119 nachylon\u0105\",\n  \"GHI_zmiennosc_rozdz3\": \"Wsp\u00f3\u0142czynnik zmienno\u015bci GHI\",\n  \"PV_rozdz4\": \"Potencja\u0142 generacyjny PV\",\n  \"Zmiennosc_PV_rozdz_5_1\": \"Zmienno\u015b\u0107 produkcji energii PV\",\n  \"zmEV\": \"Zmienno\u015b\u0107 produkcji energii PV\"\n};\n\nconst parameterDisplayNames = {\n  \"roczniki\": \"\u015arednia suma roczna\/dobowa\",\n  \"srednie_mc\": \"\u015arednia suma miesi\u0119czna\/dobowa\",\n  \"srednie_godz\": \"\u015arednia warto\u015b\u0107 godzinowa\",\n  \"srednie_12UTC\": \"\u015arednia godzinowa o 12 UTC\",\n  \"odch_std_roczniki\": \"Odchylenie std suma dobowa\",\n  \"odch_std_miesiac\": \"Odchylenie std suma miesi\u0119czna\",\n  \"rozrzut_roczniki\": \"Ramp rate\",\n  \"rozrzut_wz_roczniki\": \"Wzgl\u0119dny Ramp rate suma roczna\",\n  \"rozrzut_wz_miesiac\": \"Wzgl\u0119dny Ramp rate suma miesi\u0119czna\",\n  \"pv_roczna_dobowa\": \"\u015arednia suma roczna i dobowa produkcji energii\",\n  \"pv_miesieczna_dobowa\": \"\u015arednia suma miesi\u0119czna i dobowa produkcji energii\",\n  \"pv_godzinowa\": \"\u015arednia suma godzinowa produkcji energii\",\n  \"pv_wspolczynnik\": \"Wsp\u00f3\u0142czynnik wykorzystania mocy - roczny\",\n  \"pv_wspolczynnik_mc\": \"Wsp\u00f3\u0142czynnik wykorzystania mocy - miesi\u0119czny\",\n  \"pv_wspolczynnik_godz\": \"Wsp\u00f3\u0142czynnik wykorzystania mocy - godzinowy\",\n  \"warianty_instalacji\": \"\u015arednie sumy GTI - warianty\",\n  \"pv_produkcja_wariant\": \"\u015arednia produkcja PV - warianty\",\n  \"zmiennosc_mean\": \"\u015arednia terminowa dla terminu\",\n  \"zmiennosc_std\": \"Odchylenie std. dla terminu\"\n};\n\nconst valueDisplayNames = {\n  \"0200\": \"02:00\", \"0300\": \"03:00\", \"0400\": \"04:00\", \"0500\": \"05:00\",\n  \"0600\": \"06:00\", \"0700\": \"07:00\", \"0800\": \"08:00\", \"0900\": \"09:00\",\n  \"1000\": \"10:00\", \"1100\": \"11:00\", \"1200\": \"12:00\", \"1300\": \"13:00\",\n  \"1400\": \"14:00\", \"1500\": \"15:00\", \"1600\": \"16:00\", \"1700\": \"17:00\",\n  \"1800\": \"18:00\", \"1900\": \"19:00\",\n  \"roczniki\": \"Roczniki\", \"miesiace\": \"Miesi\u0105ce\",\n  \"2015-2024\": \"<strong>2015-2024<\/strong>\",\n  \"period_01\": \"Stycze\u0144\", \"period_07\": \"Lipiec\", \"period_rok\": \"ROK\",\n  \"time_1015\": \"10:15\", \"time_1030\": \"10:30\", \"time_1045\": \"10:45\", \"time_1100\": \"11:00\", \"time_1115\": \"11:15\"\n};\n\n\/\/ \u015acie\u017cka bazowa do obraz\u00f3w\nconst BASE_IMAGE_PATH = \"wp-content\/uploads\/production\/oze\";\n\n\/\/ Zmienne stanu\nlet selectedModel = \"GHI_rozdz_1\";\nlet selectedParam = \"roczniki\";\nlet selectedValue = \"2024\";\nlet isComparisonMode = false;\n\n\/\/ Zmienne stanu dla GTI\nlet selectedExposure = \"180\";\nlet selectedTilt = \"35\";\nlet selectedGTIPeriod = \"rok\";\nlet selectedGTITime = \"\";\n\n\/\/ Zmienne stanu dla PV\nlet selectedPVExposure = \"180\";\nlet selectedPVTilt = \"35\";\nlet selectedPVPeriod = \"rok\";\nlet selectedPVTime = \"1100\";\nlet selectedPVProdPeriod = \"rok\";\nlet selectedPVProdTime = \"\";\n\n\/\/ Zmienne stanu dla Zmiennosc_PV_rozdz_5_1\nlet selectedZmPVExposure = \"180\";\nlet selectedZmPVTilt = \"35\";\nlet selectedZmPVPeriod = \"equinox\";\nlet selectedZmPVTime = \"1100\";\n\n\/\/ Pobierz aktualny miesi\u0105c\nconst currentMonth = String(new Date().getMonth() + 1).padStart(2, '0');\nlet isAnimating = false;\nlet animationInterval = null;\n\n\/\/ Cache obraz\u00f3w\nconst imageCache = {};\nlet loaderTimeout = null;\nlet isPreloading = false;\nconst preloadedImages = new Set();\n\n\/\/ ============================================\n\/\/ GENEROWANIE \u015aCIE\u017bKI OBRAZU\n\/\/ ============================================\nfunction generateImagePath(model, param, value) {\n  let path = `\/${BASE_IMAGE_PATH}\/${model}`;\n  let fileName = \"\";\n  \n  \/\/ Obs\u0142uga comparison_unified dla wszystkich modeli\n  if (param === \"comparison_unified\") {\n    if (model === \"GHI_rozdz_1\") {\n      path = `\/${BASE_IMAGE_PATH}\/skala_jednolita`;\n      if (selectedParam === \"roczniki\") {\n        fileName = \"GHI_suma roczna_roczniki.png\";\n      } else if (selectedParam === \"srednie_12UTC\") {\n        fileName = \"GHI_miesiace_12UTC.png\";\n      } else if (selectedParam === \"srednie_mc\") {\n        fileName = \"GHI_suma miesieczna i dobowa_miesiace.png\";\n      }\n    } else if (model === \"GHI_zmiennosc_rozdz3\") {\n      path = `\/${BASE_IMAGE_PATH}\/GHI_zmiennosc_rozdz3\/R3_jednolita`;\n      if (selectedParam === \"odch_std_roczniki\") {\n        fileName = \"GHI_odch_st_roczniki_z.png\";\n      } else if (selectedParam === \"odch_std_miesiac\") {\n        fileName = \"GHI_odchylenie_miesiace.png\";\n      } else if (selectedParam === \"rozrzut_wz_roczniki\") {\n        fileName = \"GHI_Ramp_rate_rel_roczniki.png\";\n      } else if (selectedParam === \"rozrzut_wz_miesiac\") {\n        fileName = \"GHI_Ramp_rate_rel_miesiace.png\";\n      }\n    } else if (model === \"GTI_rozdz2\") {\n      path = `\/${BASE_IMAGE_PATH}\/GTI_jednolite`;\n      const tilt = selectedTilt;\n      const exposure = selectedExposure;\n      if (selectedParam === \"roczniki\") {\n        fileName = `GTI_suma roczna_${tilt}_${exposure}_roczniki.png`;\n      } else if (selectedParam === \"srednie_mc\") {\n        fileName = `GTI_${tilt}_${exposure}_miesiace.png`;\n      }\n    } else if (model === \"PV_rozdz4\") {\n      const tilt = selectedPVTilt;\n      const exposure = selectedPVExposure;\n      path = `\/${BASE_IMAGE_PATH}\/PV_rozdz_4`;\n      \n      if (selectedParam === \"pv_roczna_dobowa\") {\n        path += \"\/zestawienie_PV_jednolita_roczniki\";\n        fileName = `energ_PV_${tilt}_${exposure}_roczniki.png`;\n      } else if (selectedParam === \"pv_miesieczna_dobowa\") {\n        path += \"\/zestawienie_PV_jednolita_miesiace\";\n        fileName = `energ_PV_${tilt}_${exposure}_miesiace.png`;\n      } else if (selectedParam === \"pv_wspolczynnik\") {\n        path += \"\/zestawienie_jednolita_Wspolczynnik_CF\";\n        fileName = `CF_PV_${tilt}_${exposure}_roczniki.png`;\n      } else if (selectedParam === \"pv_wspolczynnik_mc\") {\n        path += \"\/zestawienie_jednolita_Wspolczynnik_CF\";\n        fileName = `CF_PV_${tilt}_${exposure}_miesiace.png`;\n      }\n    }\n    return path + \"\/\" + fileName;\n  }\n  \n  \/\/ Obs\u0142uga GTI_rozdz2 - dynamiczna \u015bcie\u017cka na podstawie nachylenia i ekspozycji\n  if (model === \"GTI_rozdz2\") {\n    \n    \/\/ Dla parametru warianty_instalacji u\u017cyj specjalnej \u015bcie\u017cki i nazewnictwa\n    if (param === \"warianty_instalacji\") {\n      path = `\/${BASE_IMAGE_PATH}\/zestawy_GTI_jednolite_warianty_instalacji`;\n      \n      \/\/ U\u017cyj value, kt\u00f3ry zostanie ustawiony przez przyciski\n      \/\/ value b\u0119dzie w formacie \"period_01\", \"period_07\", \"period_rok\", \"time_1015\", etc.\n      if (value.startsWith(\"period_\")) {\n        const period = value.replace(\"period_\", \"\");\n        if (period === \"rok\") {\n          fileName = \"GTI suma roczna_instalacje.png\";\n        } else if (period === \"01\") {\n          fileName = \"GTI styczen_instalacje_z.png\";\n        } else if (period === \"07\") {\n          fileName = \"GTI lipiec_instalacje_z.png\";\n        }\n      } else if (value.startsWith(\"time_\")) {\n        const time = value.replace(\"time_\", \"\");\n        fileName = `GTI_15min_${time}_warianty instalacji_z.png`;\n      }\n      \n      return path + \"\/\" + fileName;\n    }\n    \n    const tilt = selectedTilt;\n    const exposure = selectedExposure;\n    path = `\/${BASE_IMAGE_PATH}\/GTI_rozdz2_${tilt}_${exposure}`;\n    \n    switch(param) {\n      case \"roczniki\":\n        if (value === \"2015-2024\") {\n          fileName = `gti_mean_daily_yearly_2015_2024_${tilt}_${exposure}.png`;\n        } else {\n          fileName = `gti_daily_${value}_${tilt}_${exposure}.png`;\n        }\n        break;\n      case \"srednie_mc\":\n        fileName = `gti_mean_daily_month_${value}_${tilt}_${exposure}_2015_2024.png`;\n        break;\n      case \"srednie_godz\":\n        fileName = `gti_mean_hour_2015_2024_${value}_${tilt}_${exposure}.png`;\n        break;\n    }\n    \n    return path + \"\/\" + fileName;\n  }\n  \n  \/\/ Obs\u0142uga PV_rozdz4 - dynamiczna \u015bcie\u017cka na podstawie nachylenia i ekspozycji\n  if (model === \"PV_rozdz4\") {\n    \n    \/\/ Dla parametru pv_produkcja_wariant u\u017cyj specjalnej \u015bcie\u017cki i nazewnictwa\n    if (param === \"pv_produkcja_wariant\") {\n      path = `\/${BASE_IMAGE_PATH}\/PV_rozdz_4\/zestawienie_PV_instalacje_dodatkowy_parametr`;\n      \n      \/\/ U\u017cyj value, kt\u00f3ry zostanie ustawiony przez przyciski\n      \/\/ value b\u0119dzie w formacie \"period_01\", \"period_07\", \"period_rok\", \"time_1015\", etc.\n      if (value.startsWith(\"period_\")) {\n        const period = value.replace(\"period_\", \"\");\n        if (period === \"rok\") {\n          fileName = \"PV_suma_roczna_warianty_instalacji.png\";\n        } else if (period === \"01\") {\n          fileName = \"PV_suma_styczen_instalacji.png\";\n        } else if (period === \"07\") {\n          fileName = \"PV_suma_lipiec_instalacji.png\";\n        }\n      } else if (value.startsWith(\"time_\")) {\n        const time = value.replace(\"time_\", \"\");\n        fileName = `PV_15_${time}.png`;\n      }\n      \n      return path + \"\/\" + fileName;\n    }\n    \n    const tilt = selectedPVTilt;\n    const exposure = selectedPVExposure;\n    \n    \/\/ Mapowanie nachylenia i ekspozycji na numer wariantu\n    const variantMap = {\n      \"30_135\": \"R_4_1_30_135\",\n      \"30_180\": \"R_4_2_30_180\",\n      \"30_225\": \"R_4_3_30_225\",\n      \"35_135\": \"R_4_4_35_135\",\n      \"35_180\": \"R_4_5_35_180\",\n      \"35_225\": \"R_4_6_35_225\",\n      \"40_135\": \"R_4_7_40_135\",\n      \"40_180\": \"R_4_8_40_180\",\n      \"40_225\": \"R_4_9_40_225\"\n    };\n    \n    const variantKey = `${tilt}_${exposure}`;\n    const variant = variantMap[variantKey] || \"R_4_5_35_180\";\n    path = `\/${BASE_IMAGE_PATH}\/PV_rozdz_4\/${variant}`;\n    \n    switch(param) {\n      case \"pv_roczna_dobowa\":\n        if (value === \"2015-2024\") {\n          fileName = `PV_energy_yearly_daily_2015_2024_${tilt}_${exposure}.png`;\n        } else {\n          fileName = `pv_energy_mean_daily_${value}_${tilt}_${exposure}.png`;\n        }\n        break;\n      case \"pv_miesieczna_dobowa\":\n        fileName = `pv_energy_month_${value}_mean_daily_2015_2024_${tilt}_${exposure}.png`;\n        break;\n      case \"pv_godzinowa\":\n        fileName = `pv_energy_hour_${value}_mean_2015_2024_${tilt}_${exposure}.png`;\n        break;\n      case \"pv_wspolczynnik\":\n        if (value === \"2015-2024\") {\n          fileName = `cf_yearly_daily_2015_2024_${tilt}_${exposure}.png`;\n        } else {\n          fileName = `cf_mean_daily_${value}_${tilt}_${exposure}.png`;\n        }\n        break;\n      case \"pv_wspolczynnik_mc\":\n        fileName = `cf_month_${value}_mean_daily_2015_2024_${tilt}_${exposure}.png`;\n        break;\n      case \"pv_wspolczynnik_godz\":\n        fileName = `cf_hour_${value}_mean_2015_2024_${tilt}_${exposure}.png`;\n        break;\n      case \"pv_produkcja_wariant\":\n        const periodProd = selectedPVPeriod === \"rok\" ? \"yearly\" : (selectedPVPeriod === \"01\" ? \"month_01\" : \"month_07\");\n        if (selectedPVPeriod === \"rok\") {\n          fileName = `PV_energy_yearly_daily_2015_2024_${tilt}_${exposure}.png`;\n        } else {\n          fileName = `pv_energy_${periodProd}_mean_daily_2015_2024_${tilt}_${exposure}.png`;\n        }\n        break;\n    }\n    \n    return path + \"\/\" + fileName;\n  }\n  \n  \/\/ Obs\u0142uga GHI_zmiennosc_rozdz3\n  if (model === \"GHI_zmiennosc_rozdz3\") {\n    switch(param) {\n      case \"odch_std_roczniki\":\n        if (value === \"2015-2024\") {\n          fileName = \"ghi_std_daily_year_2015-2024.png\";\n        } else {\n          fileName = `ghi_std_daily_year_${value}.png`;\n        }\n        break;\n      case \"odch_std_miesiac\":\n        fileName = `ghi_std_daily_month_${value}_2015_2024.png`;\n        break;\n      case \"rozrzut_roczniki\":\n        fileName = `ghi_rr_daily_${value}.png`;\n        break;\n      case \"rozrzut_wz_roczniki\":\n        if (value === \"2015-2024\") {\n          \/\/ Plik 2015_2024 jest bezpo\u015brednio w g\u0142\u00f3wnym katalogu, nie w \/RR_wzgledne\n          fileName = `ghi_rr_rel_daily_2015_2024_30_180_all.png`;\n        } else {\n          \/\/ Inne lata s\u0105 w podkatalogu \/RR_wzgledne\n          path += \"\/RR_wzgledne\";\n          fileName = `ghi_rr_rel_daily_${value}.png`;\n        }\n        break;\n      case \"rozrzut_wz_miesiac\":\n        path += \"\/RR_wzgledne\";\n        fileName = `ghi_rr_rel_daily_month_${value}_2015_2024_30_180.png`;\n        break;\n    }\n    \n    return path + \"\/\" + fileName;\n  }\n  \n  \/\/ Obs\u0142uga Zmiennosc_PV_rozdz_5_1\n  if (model === \"Zmiennosc_PV_rozdz_5_1\") {\n    const tilt = selectedZmPVTilt || \"35\";\n    const exposure = selectedZmPVExposure || \"180\";\n    const period = selectedZmPVPeriod || \"equinox\";\n    const times = zmPVTimeValues[period] || zmPVTimeValues[\"equinox\"];\n    const time = selectedZmPVTime || times[3];  \/\/ Domy\u015blnie \u015brodkowy termin\n    \n    path = `\/${BASE_IMAGE_PATH}\/Zmiennosc_PV_rozdz_5_1\/${tilt}_${exposure}`;\n    \n    \/\/ Mapowanie okresu na prefix pliku\n    const periodMap = {\n      \"equinox\": \"equinox_0321_0923\",\n      \"summer\": \"summer_0621\",\n      \"winter\": \"winter_1221\"\n    };\n    \n    \/\/ Mapowanie parametru na typ\n    const typeMap = {\n      \"zmiennosc_mean\": \"mean\",\n      \"zmiennosc_std\": \"std\"\n    };\n    \n    const periodPrefix = periodMap[period] || \"equinox_0321_0923\";\n    const typeStr = typeMap[param] || \"mean\";\n    \n    fileName = `${periodPrefix}_${typeStr}_${time}_scale-data.png`;\n    \n    return path + \"\/\" + fileName;\n  }\n  \n  \/\/ Obs\u0142uga GHI_rozdz_1 (oryginalna logika)\n  switch(param) {\n    case \"roczniki\":\n      path += \"\/roczniki\";\n      if (value === \"2015-2024\") {\n        fileName = \"ghi_mean_daily_yearly_2015_2024.png\";\n      } else {\n        fileName = `ghi_daily_${value}.png`;\n      }\n      break;\n    case \"srednie_mc\":\n      path += \"\/srednie_mc\";\n      fileName = `ghi_mean_daily_month_${value}_2015_2024.png`;\n      break;\n    case \"srednie_godz\":\n      path += \"\/srednie_godz\";\n      fileName = `ghi_mean_hour_2015_2024_${value}.png`;\n      break;\n    case \"srednie_12UTC\":\n      path += \"\/srednie_12UTC\";\n      fileName = `ghi_mean_hour_2015_2024_1200_${value}.png`;\n      break;\n  }\n  \n  return path + \"\/\" + fileName;\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE PRZYCISK\u00d3W\n\/\/ ============================================\nfunction renderButtons(containerId, items, onClick, activeItem, displayNames, disabledItems) {\n  const container = document.getElementById(containerId);\n  if (!container) return;\n  container.innerHTML = \"\";\n  \n  items.forEach(item => {\n    const btn = document.createElement(\"button\");\n    btn.dataset.value = item;\n    btn.innerHTML = (displayNames && displayNames[item]) ? displayNames[item] : item;\n    \n    if (activeItem && item === activeItem) {\n      btn.classList.add('active');\n    }\n    \n    \/\/ Sprawd\u017a czy przycisk ma by\u0107 wy\u0142\u0105czony\n    const isDisabled = disabledItems && disabledItems.includes(item);\n    if (isDisabled) {\n      btn.disabled = true;\n      btn.style.opacity = '0.5';\n      btn.style.cursor = 'not-allowed';\n      btn.title = 'Chwilowo niedost\u0119pne';\n    } else {\n      btn.onclick = () => {\n        container.querySelectorAll('button').forEach(b => b.classList.remove('active'));\n        btn.classList.add('active');\n        onClick(item);\n      };\n    }\n    \n    container.appendChild(btn);\n  });\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE MODELI\n\/\/ ============================================\nfunction renderModels() {\n  renderButtons(\"models\", models, (model) => {\n    selectedModel = model;\n    selectedParam = paramsForModels[model][0];\n    \n    \/\/ Dla Zmiennosc_PV_rozdz_5_1 nie u\u017cywamy standardowych warto\u015bci\n    if (model === \"Zmiennosc_PV_rozdz_5_1\") {\n      selectedValue = null;  \/\/ Model u\u017cywa w\u0142asnego systemu warto\u015bci\n    } else {\n      selectedValue = valuesForParams[selectedParam] ? valuesForParams[selectedParam][0] : null;\n      if (selectedParam === \"roczniki\" || selectedParam === \"pv_roczna_dobowa\" || selectedParam === \"pv_wspolczynnik\" || selectedParam === \"odch_std_roczniki\" || selectedParam === \"rozrzut_wz_roczniki\") selectedValue = \"2024\";\n      if (selectedParam === \"srednie_mc\" || selectedParam === \"srednie_12UTC\" || selectedParam === \"pv_miesieczna_dobowa\" || selectedParam === \"pv_wspolczynnik_mc\" || selectedParam === \"odch_std_miesiac\" || selectedParam === \"rozrzut_wz_miesiac\") selectedValue = currentMonth;\n    }\n    \n    \/\/ Resetuj tryb por\u00f3wnania\n    isComparisonMode = false;\n    resetComparisonMode();\n    \n    document.getElementById(\"images\").style.display = \"block\";\n    document.getElementById(\"comparisonImages\").style.display = \"none\";\n    \n    \/\/ Ukryj sekcje specjalne przy zmianie modelu\n    const gtiSpecialOptions = document.getElementById(\"gtiSpecialOptions\");\n    if (gtiSpecialOptions) gtiSpecialOptions.style.display = \"none\";\n    const pvProdSpecialOptions = document.getElementById(\"pvProdSpecialOptions\");\n    if (pvProdSpecialOptions) pvProdSpecialOptions.style.display = \"none\";\n    \n    \/\/ Poka\u017c\/ukryj sekcj\u0119 wariant\u00f3w GTI\n    const gtiSection = document.getElementById(\"gtiVariantsSection\");\n    if (gtiSection) {\n      gtiSection.style.display = (model === \"GTI_rozdz2\") ? \"block\" : \"none\";\n    }\n    \n    \/\/ Poka\u017c\/ukryj sekcj\u0119 wariant\u00f3w PV\n    const pvSection = document.getElementById(\"pvVariantsSection\");\n    if (pvSection) {\n      pvSection.style.display = (model === \"PV_rozdz4\") ? \"block\" : \"none\";\n    }\n    \n    \/\/ Poka\u017c\/ukryj sekcj\u0119 wariant\u00f3w Zmiennosc_PV_rozdz_5_1\n    const zmPVSection = document.getElementById(\"zmPVVariantsSection\");\n    if (zmPVSection) {\n      zmPVSection.style.display = (model === \"Zmiennosc_PV_rozdz_5_1\") ? \"block\" : \"none\";\n    }\n    \n    if (model === \"GTI_rozdz2\") {\n      renderGTIVariants();\n    }\n    \n    if (model === \"PV_rozdz4\") {\n      renderPVVariants();\n    }\n    \n    if (model === \"Zmiennosc_PV_rozdz_5_1\") {\n      renderZmPVVariants();\n    }\n    \n    renderParams();\n    renderValues();\n    setupComparisonButtons();\n    updateSlider();\n    showImages();\n  }, selectedModel, modelDisplayNames, [\"zmEV\"]); \/\/ Wy\u0142\u0105cz model zmEV\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE WARIANT\u00d3W PV (ekspozycja, nachylenie, okres, terminy)\n\/\/ ============================================\nfunction renderPVVariants() {\n  \/\/ Renderuj przyciski ekspozycji PV\n  renderButtons(\"pvExposureButtons\", pvExposureValues, (exposure) => {\n    selectedPVExposure = exposure;\n    if (isComparisonMode && selectedValue === \"unified_comparison\") {\n      showUnifiedComparisonImage();\n    } else if (isComparisonMode && selectedValue === \"grid_comparison\") {\n      showComparisonImages();\n    } else {\n      showImages();\n    }\n  }, selectedPVExposure, exposureDisplayNames);\n  \n  \/\/ Renderuj przyciski nachylenia PV\n  renderButtons(\"pvTiltButtons\", pvTiltValues, (tilt) => {\n    selectedPVTilt = tilt;\n    if (isComparisonMode && selectedValue === \"unified_comparison\") {\n      showUnifiedComparisonImage();\n    } else if (isComparisonMode && selectedValue === \"grid_comparison\") {\n      showComparisonImages();\n    } else {\n      showImages();\n    }\n  }, selectedPVTilt, tiltDisplayNames);\n  \n  \/\/ Poka\u017c\/ukryj specjalne opcje w zale\u017cno\u015bci od parametru\n  const pvSpecialOptions = document.getElementById(\"pvSpecialOptions\");\n  if (pvSpecialOptions) {\n    const showSpecialOptions = selectedParam === \"pv_produkcja_wariant\";\n    \/\/ Stare pvSpecialOptions ju\\u017c nie u\\u017cywane - zamiast tego u\\u017cywamy pvProdSpecialOptions\n    pvSpecialOptions.style.display = \"none\";\n  }\n  \n  \/\/ Nowa sekcja dla parametru pv_produkcja_wariant\n  const pvProdSpecialOptions = document.getElementById(\"pvProdSpecialOptions\");\n  if (pvProdSpecialOptions) {\n    const showProdOptions = selectedParam === \"pv_produkcja_wariant\";\n    pvProdSpecialOptions.style.display = showProdOptions ? \"block\" : \"none\";\n    \n    \/\/ Ukryj pvVariantsSection dla pv_produkcja_wariant\n    const pvVariantsSection = document.getElementById(\"pvVariantsSection\");\n    if (pvVariantsSection) {\n      pvVariantsSection.style.display = showProdOptions ? \"none\" : \"block\";\n    }\n    \n    if (showProdOptions) {\n      \/\/ Funkcja pomocnicza do od\\u015bwie\\u017cania obu zestaw\\u00f3w przycisk\\u00f3w\n      const refreshPVProdButtons = () => {\n        renderButtons(\"pvProdPeriodButtons\", pvProdPeriodValues, (period) => {\n          selectedPVProdPeriod = period;\n          selectedPVProdTime = \"\";\n          selectedValue = `period_${period}`;\n          renderValues();\n          showImages();\n          refreshPVProdButtons();\n        }, selectedPVProdPeriod, pvProdPeriodDisplayNames);\n        \n        renderButtons(\"pvProdTimeButtons\", pvProdTimeValues, (time) => {\n          selectedPVProdTime = time;\n          selectedPVProdPeriod = \"\";\n          selectedValue = `time_${time}`;\n          renderValues();\n          showImages();\n          refreshPVProdButtons();\n        }, selectedPVProdTime, pvProdTimeDisplayNames);\n      };\n      \n      refreshPVProdButtons();\n      return; \/\/ Wyjd\\u017a, aby nie renderowa\\u0107 standardowych przycisk\\u00f3w\n    }\n  }\n  \n  \/\/ Renderuj standardowe opcje PV\n  if (pvSpecialOptions && selectedParam === \"pv_produkcja_wariant\") {\n    \/\/ Nie renderuj standardowych przycisk\\u00f3w dla pv_produkcja_wariant\n    return;\n  }\n  \n  \/\/ Ukryj stare pvSpecialOptions\n  const oldPvSpecialOptions = document.getElementById(\"pvSpecialOptions\");\n  if (oldPvSpecialOptions) {\n    oldPvSpecialOptions.style.display = \"none\";\n  }\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE WARIANT\u00d3W GTI (ekspozycja i nachylenie)\n\/\/ ============================================\nfunction renderGTIVariants() {\n  \/\/ Dla parametru warianty_instalacji ukryj sekcj\u0119 gtiVariantsSection ca\u0142kowicie\n  const gtiVariantsSection = document.getElementById(\"gtiVariantsSection\");\n  if (gtiVariantsSection) {\n    gtiVariantsSection.style.display = selectedParam !== \"warianty_instalacji\" ? \"block\" : \"none\";\n  }\n  \n  \/\/ Renderuj specjalne opcje dla warianty_instalacji\n  const gtiSpecialOptions = document.getElementById(\"gtiSpecialOptions\");\n  if (gtiSpecialOptions) {\n    const showSpecialOptions = selectedParam === \"warianty_instalacji\";\n    gtiSpecialOptions.style.display = showSpecialOptions ? \"block\" : \"none\";\n    \n    if (showSpecialOptions) {\n      \/\/ Funkcja pomocnicza do od\u015bwie\u017cania obu zestaw\u00f3w przycisk\u00f3w\n      const refreshGTIButtons = () => {\n        \/\/ Renderuj przyciski okresu\n        renderButtons(\"gtiPeriodButtons\", gtiPeriodValues, (period) => {\n          selectedGTIPeriod = period;\n          selectedGTITime = \"\";  \/\/ Wyczy\u015b\u0107 wyb\u00f3r terminu\n          selectedValue = `period_${period}`;\n          renderValues();\n          showImages();\n          refreshGTIButtons();  \/\/ Od\u015bwie\u017c przyciski, aby zaktualizowa\u0107 pod\u015bwietlenie\n        }, selectedGTIPeriod, gtiPeriodDisplayNames);\n        \n        \/\/ Renderuj przyciski termin\u00f3w\n        renderButtons(\"gtiTimeButtons\", gtiTimeValues, (time) => {\n          selectedGTITime = time;\n          selectedGTIPeriod = \"\";  \/\/ Wyczy\u015b\u0107 wyb\u00f3r okresu\n          selectedValue = `time_${time}`;\n          renderValues();\n          showImages();\n          refreshGTIButtons();  \/\/ Od\u015bwie\u017c przyciski, aby zaktualizowa\u0107 pod\u015bwietlenie\n        }, selectedGTITime, gtiTimeDisplayNames);\n      };\n      \n      \/\/ Inicjalne renderowanie przycisk\u00f3w\n      refreshGTIButtons();\n    }\n  }\n  \n  \/\/ Renderuj standardowe opcje tylko je\u015bli nie jeste\u015bmy w trybie warianty_instalacji\n  if (selectedParam !== \"warianty_instalacji\") {\n    \/\/ Renderuj przyciski ekspozycji\n    renderButtons(\"exposureButtons\", gtiExposureValues, (exposure) => {\n      selectedExposure = exposure;\n      if (isComparisonMode && selectedValue === \"unified_comparison\") {\n        showUnifiedComparisonImage();\n      } else if (isComparisonMode) {\n        showComparisonImages();\n      } else {\n        showImages();\n      }\n    }, selectedExposure, exposureDisplayNames);\n    \n    \/\/ Renderuj przyciski nachylenia\n    renderButtons(\"tiltButtons\", gtiTiltValues, (tilt) => {\n      selectedTilt = tilt;\n      if (isComparisonMode && selectedValue === \"unified_comparison\") {\n        showUnifiedComparisonImage();\n      } else if (isComparisonMode) {\n        showComparisonImages();\n      } else {\n        showImages();\n      }\n    }, selectedTilt, tiltDisplayNames);\n  }\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE WARIANT\u00d3W Zmiennosc_PV_rozdz_5_1 (ekspozycja, nachylenie, okres, terminy)\n\/\/ ============================================\nfunction renderZmPVVariants() {\n  \/\/ Inicjalizuj domy\u015blne warto\u015bci je\u015bli nie s\u0105 ustawione\n  if (!selectedZmPVPeriod) selectedZmPVPeriod = \"equinox\";\n  if (!selectedZmPVTime) {\n    const times = zmPVTimeValues[selectedZmPVPeriod] || zmPVTimeValues[\"equinox\"];\n    selectedZmPVTime = times[3];  \/\/ Domy\u015blnie \u015brodkowy termin (1015)\n  }\n  if (!selectedZmPVTilt) selectedZmPVTilt = \"35\";\n  if (!selectedZmPVExposure) selectedZmPVExposure = \"180\";\n  \n  \/\/ Renderuj przyciski nachylenia\n  renderButtons(\"zmPVTiltButtons\", zmPVTiltValues, (tilt) => {\n    selectedZmPVTilt = tilt;\n    if (isComparisonMode && selectedValue === \"grid_comparison\") {\n      showComparisonImages();\n    } else {\n      showImages();\n    }\n  }, selectedZmPVTilt, tiltDisplayNames);\n  \n  \/\/ Renderuj przyciski ekspozycji\n  renderButtons(\"zmPVExposureButtons\", zmPVExposureValues, (exposure) => {\n    selectedZmPVExposure = exposure;\n    if (isComparisonMode && selectedValue === \"grid_comparison\") {\n      showComparisonImages();\n    } else {\n      showImages();\n    }\n  }, selectedZmPVExposure, exposureDisplayNames);\n  \n  \/\/ Funkcja pomocnicza do od\u015bwie\u017cania przycisk\u00f3w termin\u00f3w w zale\u017cno\u015bci od okresu\n  const refreshZmPVTimeButtons = () => {\n    const times = zmPVTimeValues[selectedZmPVPeriod] || zmPVTimeValues[\"equinox\"];\n    renderButtons(\"zmPVTimeButtons\", times, (time) => {\n      selectedZmPVTime = time;\n      showImages();\n    }, selectedZmPVTime, zmPVTimeDisplayNames);\n  };\n  \n  \/\/ Renderuj przyciski okresu\n  renderButtons(\"zmPVPeriodButtons\", zmPVPeriodValues, (period) => {\n    selectedZmPVPeriod = period;\n    \/\/ Ustaw domy\u015blny termin dla nowego okresu\n    const times = zmPVTimeValues[period] || zmPVTimeValues[\"equinox\"];\n    selectedZmPVTime = times.includes(selectedZmPVTime) ? selectedZmPVTime : times[0];\n    refreshZmPVTimeButtons();\n    if (isComparisonMode && selectedValue === \"grid_comparison\") {\n      showComparisonImages();\n    } else {\n      showImages();\n    }\n  }, selectedZmPVPeriod, zmPVPeriodDisplayNames);\n  \n  \/\/ Renderuj przyciski termin\u00f3w\n  refreshZmPVTimeButtons();\n  \n  \/\/ Wywo\u0142aj showImages() aby pokaza\u0107 pierwszy obraz\n  showImages();\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE PARAMETR\u00d3W\n\/\/ ============================================\nfunction renderParams() {\n  const params = paramsForModels[selectedModel] || [];\n  \n  renderButtons(\"params\", params, (param) => {\n    selectedParam = param;\n    \n    \/\/ Dla GTI_rozdz2 i parametru srednie_godz u\u017cyj innych warto\u015bci\n    let paramKey = param;\n    if (selectedModel === \"GTI_rozdz2\" && param === \"srednie_godz\") {\n      paramKey = \"srednie_godz_gti\";\n    }\n    const values = valuesForParams[paramKey] || [];\n    \n    \/\/ Zachowaj selectedValue je\u015bli jeste\u015bmy w trybie por\u00f3wnania\n    if (!(isComparisonMode && (selectedValue === \"unified_comparison\" || selectedValue === \"grid_comparison\"))) {\n      if (selectedModel === \"Zmiennosc_PV_rozdz_5_1\") {\n        selectedValue = null;  \/\/ Model u\u017cywa w\u0142asnego systemu warto\u015bci\n      } else if (param === \"roczniki\" || param === \"pv_roczna_dobowa\" || param === \"pv_wspolczynnik\" || param === \"odch_std_roczniki\" || param === \"rozrzut_wz_roczniki\") {\n        selectedValue = \"2024\";\n      } else if (param === \"srednie_mc\" || param === \"srednie_12UTC\" || param === \"pv_miesieczna_dobowa\" || param === \"pv_wspolczynnik_mc\" || param === \"odch_std_miesiac\" || param === \"rozrzut_wz_miesiac\") {\n        selectedValue = currentMonth;\n      } else if (param === \"warianty_instalacji\") {\n        selectedValue = \"period_rok\";  \/\/ Domy\u015blnie poka\u017c ROK\n        selectedGTIPeriod = \"rok\";\n        selectedGTITime = \"\";  \/\/ Wyczy\u015b\u0107 wyb\u00f3r terminu\n      } else if (param === \"pv_produkcja_wariant\") {\n        selectedValue = \"period_rok\";  \/\/ Domy\u015blnie poka\u017c ROK\n        selectedPVProdPeriod = \"rok\";\n        selectedPVProdTime = \"\";  \/\/ Wyczy\u015b\u0107 wyb\u00f3r terminu\n      } else {\n        selectedValue = values[0];\n      }\n    }\n    \n    \/\/ Sprawd\u017a czy nowy parametr ma obs\u0142ug\u0119 skali jednolitej\n    const hasUnifiedScale = (\n      (selectedModel === \"GHI_rozdz_1\" && (param === \"roczniki\" || param === \"srednie_mc\" || param === \"srednie_12UTC\")) ||\n      (selectedModel === \"GHI_zmiennosc_rozdz3\" && (param === \"odch_std_roczniki\" || param === \"odch_std_miesiac\" || param === \"rozrzut_wz_roczniki\" || param === \"rozrzut_wz_miesiac\")) ||\n      (selectedModel === \"GTI_rozdz2\" && (param === \"roczniki\" || param === \"srednie_mc\")) ||\n      (selectedModel === \"PV_rozdz4\" && (param === \"pv_roczna_dobowa\" || param === \"pv_miesieczna_dobowa\" || param === \"pv_wspolczynnik\" || param === \"pv_wspolczynnik_mc\"))\n    );\n    \n    \/\/ Je\u015bli jeste\u015bmy w trybie skali jednolitej, ale nowy parametr jej nie ma, prze\u0142\u0105cz na tryb pojedynczy\n    if (isComparisonMode && selectedValue === \"unified_comparison\" && !hasUnifiedScale) {\n      isComparisonMode = false;\n      selectedValue = values[0] || \"2024\";\n      if (param === \"roczniki\" || param === \"pv_roczna_dobowa\" || param === \"pv_wspolczynnik_roczniki\" || param === \"odch_std_roczniki\" || param === \"rozrzut_wz_roczniki\") {\n        selectedValue = \"2024\";\n      } else if (param === \"srednie_mc\" || param === \"srednie_12UTC\" || param === \"pv_miesieczna_dobowa\" || param === \"pv_wspolczynnik_mc\" || param === \"odch_std_miesiac\" || param === \"rozrzut_wz_miesiac\") {\n        selectedValue = currentMonth;\n      }\n      \/\/ Resetuj stan przycisk\u00f3w por\u00f3wnania\n      setTimeout(() => resetComparisonMode(), 0);\n    }\n    \n    \/\/ Je\u015bli jeste\u015bmy w trybie zestawienia (grid), ale nowy parametr to warianty_instalacji lub pv_produkcja_wariant, prze\u0142\u0105cz na tryb pojedynczy\n    if (isComparisonMode && selectedValue === \"grid_comparison\" && \n        ((selectedModel === \"GTI_rozdz2\" && param === \"warianty_instalacji\") ||\n         (selectedModel === \"PV_rozdz4\" && param === \"pv_produkcja_wariant\"))) {\n      isComparisonMode = false;\n      \/\/ Ustaw odpowiedni\u0105 warto\u015b\u0107 domy\u015bln\u0105\n      if (param === \"warianty_instalacji\") {\n        selectedValue = \"period_rok\";\n        selectedGTIPeriod = \"rok\";\n        selectedGTITime = \"\";\n      } else if (param === \"pv_produkcja_wariant\") {\n        selectedValue = \"period_rok\";\n        selectedPVProdPeriod = \"rok\";\n        selectedPVProdTime = \"\";\n      }\n      \/\/ Resetuj stan przycisk\u00f3w por\u00f3wnania\n      setTimeout(() => resetComparisonMode(), 0);\n    }\n    \n    const comparisonSection = document.getElementById(\"comparisonSection\");\n    const valuesSection = document.getElementById(\"valuesSection\");\n    const sliderContainer = document.getElementById(\"horizontalSliderContainer\");\n    \n    \/\/ Wszystkie parametry maj\u0105 opcj\u0119 por\u00f3wnania, opr\u00f3cz warianty_instalacji, pv_produkcja_wariant i parametr\u00f3w Zmiennosc_PV_rozdz_5_1\n    if ((selectedModel === \"GTI_rozdz2\" && param === \"warianty_instalacji\") ||\n        (selectedModel === \"PV_rozdz4\" && param === \"pv_produkcja_wariant\") ||\n        (selectedModel === \"Zmiennosc_PV_rozdz_5_1\")) {\n      comparisonSection.style.display = \"none\";\n      valuesSection.style.display = \"none\";\n      sliderContainer.style.display = \"none\";\n    } else {\n      comparisonSection.style.display = \"block\";\n      valuesSection.style.display = \"block\";\n      sliderContainer.style.display = \"block\";\n    }\n    \n    \/\/ Zachowaj aktualny tryb por\u00f3wnania i dostosuj widok\n    if (isComparisonMode) {\n      if (selectedValue === \"unified_comparison\") {\n        valuesSection.style.display = \"none\";\n        sliderContainer.style.display = \"none\";\n        document.getElementById(\"images\").style.display = \"block\";\n        document.getElementById(\"comparisonImages\").style.display = \"none\";\n      } else if (selectedValue === \"grid_comparison\") {\n        valuesSection.style.display = \"none\";\n        sliderContainer.style.display = \"none\";\n        document.getElementById(\"images\").style.display = \"none\";\n        document.getElementById(\"comparisonImages\").style.display = \"grid\";\n      }\n    } else {\n      document.getElementById(\"images\").style.display = \"block\";\n      document.getElementById(\"comparisonImages\").style.display = \"none\";\n    }\n    \n    setupComparisonButtons();\n    renderValues();\n    updateSlider();\n    \n    \/\/ Od\u015bwie\u017c obrazy zgodnie z aktualnym trybem\n    if (isComparisonMode && selectedValue === \"unified_comparison\") {\n      showUnifiedComparisonImage();\n    } else if (isComparisonMode) {\n      showComparisonImages();\n    } else {\n      showImages();\n    }\n    \n    \/\/ Aktualizuj sekcje PV je\u015bli jest aktywna\n    if (selectedModel === \"PV_rozdz4\") {\n      renderPVVariants();\n    }\n    \n    \/\/ Aktualizuj sekcje GTI je\u015bli jest aktywna\n    if (selectedModel === \"GTI_rozdz2\") {\n      renderGTIVariants();\n    }\n    \n    \/\/ Aktualizuj sekcje Zmiennosc_PV_rozdz_5_1 je\u015bli jest aktywna\n    if (selectedModel === \"Zmiennosc_PV_rozdz_5_1\") {\n      renderZmPVVariants();\n    }\n  }, selectedParam, parameterDisplayNames);\n}\n\n\/\/ ============================================\n\/\/ RENDEROWANIE WARTO\u015aCI\n\/\/ ============================================\nfunction renderValues() {\n  const valuesSection = document.getElementById(\"valuesSection\");\n  \n  \/\/ Ukryj sekcj\u0119 warto\u015bci dla parametru warianty_instalacji, pv_produkcja_wariant i modelu Zmiennosc_PV_rozdz_5_1\n  if (selectedParam === \"warianty_instalacji\" || selectedParam === \"pv_produkcja_wariant\" || selectedModel === \"Zmiennosc_PV_rozdz_5_1\") {\n    if (valuesSection) valuesSection.style.display = \"none\";\n    return;\n  }\n  \n  \/\/ Ukryj sekcj\u0119 warto\u015bci w trybach por\u00f3wnania (unified i grid)\n  if (valuesSection) {\n    if (isComparisonMode) {\n      valuesSection.style.display = \"none\";\n    } else {\n      valuesSection.style.display = \"block\";\n    }\n  }\n  \n  \/\/ Dla GTI_rozdz2 i parametru srednie_godz u\u017cyj innych warto\u015bci\n  let paramKey = selectedParam;\n  if (selectedModel === \"GTI_rozdz2\" && selectedParam === \"srednie_godz\") {\n    paramKey = \"srednie_godz_gti\";\n  }\n  const values = valuesForParams[paramKey] || [];\n  \n  const valuesTitle = document.getElementById(\"valuesTitle\");\n  if (valuesTitle) {\n    switch(selectedParam) {\n      case \"roczniki\":\n      case \"odch_std_roczniki\":\n      case \"rozrzut_roczniki\":\n      case \"rozrzut_wz_roczniki\": \n      case \"pv_roczna_dobowa\":\n      case \"pv_wspolczynnik\": valuesTitle.textContent = \"Rok:\"; break;\n      case \"srednie_mc\":\n      case \"srednie_12UTC\":\n      case \"odch_std_miesiac\":\n      case \"rozrzut_wz_miesiac\":\n      case \"pv_miesieczna_dobowa\":\n      case \"pv_wspolczynnik_mc\": valuesTitle.textContent = \"Miesi\u0105c:\"; break;\n      case \"srednie_godz\":\n      case \"pv_godzinowa\":\n      case \"pv_wspolczynnik_godz\": valuesTitle.textContent = \"Godzina (UTC):\"; break;\n      default: valuesTitle.textContent = \"Wyb\u00f3r:\";\n    }\n  }\n  \n  renderButtons(\"values\", values, (value) => {\n    const wasInUnifiedMode = (isComparisonMode && selectedValue === \"unified_comparison\");\n    selectedValue = value;\n    updateSliderPosition();\n    if (wasInUnifiedMode) {\n      \/\/ Przywr\u00f3\u0107 tryb pojedynczy je\u015bli wybrano konkretn\u0105 warto\u015b\u0107\n      isComparisonMode = false;\n      const compareSingle = document.getElementById(\"compareSingle\");\n      const compareUnified = document.getElementById(\"compareUnified\");\n      if (compareSingle) compareSingle.classList.add(\"active\");\n      if (compareUnified) compareUnified.classList.remove(\"active\");\n      document.getElementById(\"valuesSection\").style.display = \"block\";\n      document.getElementById(\"horizontalSliderContainer\").style.display = \"block\";\n    }\n    showImages();\n  }, selectedValue, valueDisplayNames);\n}\n\n\/\/ ============================================\n\/\/ SLIDER\n\/\/ ============================================\nfunction updateSlider() {\n  const slider = document.getElementById(\"forecastHourSlider\");\n  const sliderTitle = document.getElementById(\"sliderTitle\");\n  const sliderContainer = document.getElementById(\"horizontalSliderContainer\");\n  const valuesSection = document.getElementById(\"valuesSection\");\n  \n  \/\/ Ukryj slider dla trybu por\u00f3wnania lub parametr\u00f3w warianty_instalacji, pv_produkcja_wariant i modelu Zmiennosc_PV_rozdz_5_1\n  if (!slider || isComparisonMode || selectedParam === \"warianty_instalacji\" || selectedParam === \"pv_produkcja_wariant\" || selectedModel === \"Zmiennosc_PV_rozdz_5_1\") {\n    if (sliderContainer) sliderContainer.style.display = \"none\";\n    if (valuesSection && (selectedParam === \"warianty_instalacji\" || selectedParam === \"pv_produkcja_wariant\" || selectedModel === \"Zmiennosc_PV_rozdz_5_1\" || isComparisonMode)) {\n      valuesSection.style.display = \"none\";\n    }\n    return;\n  }\n  \n  if (valuesSection) valuesSection.style.display = \"block\";\n  sliderContainer.style.display = \"block\";\n  \n  \/\/ Dla GTI_rozdz2 i parametru srednie_godz u\u017cyj innych warto\u015bci\n  let paramKey = selectedParam;\n  if (selectedModel === \"GTI_rozdz2\" && selectedParam === \"srednie_godz\") {\n    paramKey = \"srednie_godz_gti\";\n  }\n  const values = valuesForParams[paramKey] || [];\n  \n  if (values.length === 0) return;\n  \n  switch(selectedParam) {\n    case \"roczniki\":\n    case \"odch_std_roczniki\":\n    case \"rozrzut_roczniki\":\n    case \"rozrzut_wz_roczniki\":\n    case \"pv_roczna_dobowa\":\n    case \"pv_wspolczynnik\": sliderTitle.textContent = \"Rok:\"; break;\n    case \"srednie_mc\":\n    case \"srednie_12UTC\":\n    case \"odch_std_miesiac\":\n    case \"rozrzut_wz_miesiac\":\n    case \"pv_miesieczna_dobowa\":\n    case \"pv_wspolczynnik_mc\": sliderTitle.textContent = \"Miesi\u0105c:\"; break;\n    case \"srednie_godz\":\n    case \"pv_godzinowa\":\n    case \"pv_wspolczynnik_godz\": sliderTitle.textContent = \"Godzina (UTC):\"; break;\n    default: sliderTitle.textContent = \"Wyb\u00f3r:\";\n  }\n  \n  slider.min = 0;\n  slider.max = values.length - 1;\n  \n  const currentIndex = values.indexOf(selectedValue);\n  slider.value = currentIndex >= 0 ? currentIndex : 0;\n  \n  updateSliderDisplay();\n  renderSliderLabels(values);\n  \n  slider.oninput = function() {\n    selectedValue = values[parseInt(this.value)];\n    updateSliderDisplay();\n    renderValues();\n    showImages();\n  };\n}\n\nfunction updateSliderDisplay() {\n  const hourValue = document.getElementById(\"hourValue\");\n  if (hourValue) {\n    hourValue.innerHTML = valueDisplayNames[selectedValue] || selectedValue;\n  }\n}\n\nfunction updateSliderPosition() {\n  const slider = document.getElementById(\"forecastHourSlider\");\n  const values = valuesForParams[selectedParam] || [];\n  const idx = values.indexOf(selectedValue);\n  if (slider && idx >= 0) {\n    slider.value = idx;\n    updateSliderDisplay();\n  }\n}\n\nfunction renderSliderLabels(values) {\n  const hourLabels = document.getElementById(\"hourLabels\");\n  if (!hourLabels) return;\n  \n  hourLabels.innerHTML = \"\";\n  \n  \/\/ Dla miesi\u0119cy i rocznik\u00f3w - poka\u017c wszystkie\n  let step = 1;\n  if (selectedParam === \"srednie_mc\" || selectedParam === \"srednie_12UTC\" || selectedParam === \"roczniki\" || selectedParam === \"odch_std_miesiac\" || selectedParam === \"rozrzut_wz_miesiac\" || selectedParam === \"pv_roczna_dobowa\" || selectedParam === \"pv_miesieczna_dobowa\" || selectedParam === \"pv_godzinowa\" || selectedParam === \"pv_wspolczynnik\" || selectedParam === \"pv_wspolczynnik_mc\" || selectedParam === \"pv_wspolczynnik_godz\") {\n    step = 1; \/\/ Ka\u017cdy miesi\u0105c\/rok\/godzina\n  } else {\n    \/\/ Poka\u017c tylko kilka etykiet dla czytelno\u015bci\n    const maxLabels = 10;\n    step = values.length > maxLabels ? Math.ceil(values.length \/ maxLabels) : 1;\n  }\n  \n  values.forEach((val, idx) => {\n    if (idx % step === 0 || idx === values.length - 1) {\n      const label = document.createElement(\"span\");\n      \/\/ Dla miesi\u0119cy poka\u017c liczby zamiast nazw\n      if (selectedParam === \"srednie_mc\" || selectedParam === \"srednie_12UTC\" || selectedParam === \"odch_std_miesiac\" || selectedParam === \"pv_miesieczna_dobowa\") {\n        label.innerHTML = val;\n      } else {\n        label.innerHTML = valueDisplayNames[val] || val;\n      }\n      label.style.position = \"absolute\";\n      label.style.left = `${(idx \/ (values.length - 1)) * 100}%`;\n      label.style.transform = \"translateX(-50%)\";\n      label.style.fontSize = \"9px\";\n      label.style.cursor = \"pointer\";\n      label.onclick = () => {\n        selectedValue = val;\n        updateSliderPosition();\n        renderValues();\n        showImages();\n      };\n      hourLabels.appendChild(label);\n    }\n  });\n}\n\n\/\/ ============================================\n\/\/ WY\u015aWIETLANIE OBRAZU\n\/\/ ============================================\nlet currentImageRequestId = 0;\n\nfunction showImages() {\n  \/\/ Dla Zmiennosc_PV_rozdz_5_1 nie sprawdzamy selectedValue, poniewa\u017c nie ma standardowych warto\u015bci\n  if (!selectedModel || !selectedParam || (selectedModel !== \"Zmiennosc_PV_rozdz_5_1\" && !selectedValue) || isComparisonMode) return;\n  \n  const container = document.getElementById(\"images\");\n  if (!container) return;\n  \n  \/\/ Utw\u00f3rz unikalny identyfikator dla tego \u017c\u0105dania\n  const requestId = ++currentImageRequestId;\n  \n  const imagePath = generateImagePath(selectedModel, selectedParam, selectedValue);\n  \n  \/\/ Dla GTI_rozdz2 dodaj nachylenie i ekspozycj\u0119 do imageId\n  let imageId = `img_${selectedModel}_${selectedParam}_${selectedValue}`;\n  if (selectedModel === \"GTI_rozdz2\") {\n    imageId += `_${selectedTilt}_${selectedExposure}`;\n  } else if (selectedModel === \"PV_rozdz4\") {\n    imageId += `_${selectedPVTilt}_${selectedPVExposure}`;\n  } else if (selectedModel === \"Zmiennosc_PV_rozdz_5_1\") {\n    imageId += `_${selectedZmPVTilt}_${selectedZmPVExposure}_${selectedZmPVPeriod}_${selectedZmPVTime}`;\n  }\n  imageId = imageId.replace(\/[^a-zA-Z0-9_]\/g, '_');\n  \n  \/\/ Cache check\n  if (imageCache[imageId]) {\n    \/\/ Sprawd\u017a czy to nadal aktualne \u017c\u0105danie\n    if (requestId !== currentImageRequestId) return;\n    \n    container.innerHTML = '';\n    const cachedImg = imageCache[imageId].cloneNode(true);\n    cachedImg.style.display = \"block\";\n    cachedImg.onclick = () => openLightbox(cachedImg.src, cachedImg.alt);\n    container.appendChild(cachedImg);\n    setTimeout(() => preloadImages(), 100);\n    return;\n  }\n  \n  \/\/ Show loader\n  container.innerHTML = '<div class=\"loader-container\"><div class=\"loader\"><\/div><\/div>';\n  \n  if (loaderTimeout) clearTimeout(loaderTimeout);\n  loaderTimeout = setTimeout(() => {\n    if (container.querySelector('.loader-container')) {\n      container.innerHTML = '<div style=\"color: red; text-align: center; padding: 20px;\"><h3>Nie uda\u0142o si\u0119 za\u0142adowa\u0107 obrazu<\/h3><\/div>';\n    }\n  }, 15000);\n  \n  const img = new Image();\n  img.id = imageId;\n  \n  img.onload = function() {\n    \/\/ Sprawd\u017a czy to nadal aktualne \u017c\u0105danie\n    if (requestId !== currentImageRequestId) return;\n    \n    if (loaderTimeout) clearTimeout(loaderTimeout);\n    container.innerHTML = '';\n    img.style.display = \"block\";\n    img.style.maxWidth = \"100%\";\n    container.appendChild(img);\n    \n    \/\/ Save to cache\n    if (Object.keys(imageCache).length >= 50) {\n      delete imageCache[Object.keys(imageCache)[0]];\n    }\n    imageCache[imageId] = img.cloneNode(true);\n    \n    \/\/ Preloaduj s\u0105siednie obrazy\n    setTimeout(() => preloadImages(), 100);\n  };\n  \n  img.onerror = function() {\n    if (loaderTimeout) clearTimeout(loaderTimeout);\n    container.innerHTML = `\n      <div style=\"color: #c00; text-align: center; padding: 30px;\">\n        <h3>W opracowniu<\/h3>\n      <\/div>\n    `;\n  };\n  \n  img.src = imagePath;\n  img.alt = `${modelDisplayNames[selectedModel] || selectedModel} - ${parameterDisplayNames[selectedParam] || selectedParam} - ${valueDisplayNames[selectedValue] || selectedValue}`;\n  \n  \/\/ Dodaj obs\u0142ug\u0119 klikni\u0119cia dla powi\u0119kszenia\n  img.onclick = () => openLightbox(img.src, img.alt);\n}\n\n\/\/ ============================================\n\/\/ PRELOADING OBRAZ\u00d3W\n\/\/ ============================================\nfunction preloadImages() {\n  if (isPreloading || isComparisonMode || selectedModel === \"Zmiennosc_PV_rozdz_5_1\") return;\n  \n  isPreloading = true;\n  \n  \/\/ Dla GTI_rozdz2 i parametru srednie_godz u\u017cyj innych warto\u015bci\n  let paramKey = selectedParam;\n  if (selectedModel === \"GTI_rozdz2\" && selectedParam === \"srednie_godz\") {\n    paramKey = \"srednie_godz_gti\";\n  }\n  const values = valuesForParams[paramKey] || [];\n  const currentIdx = values.indexOf(selectedValue);\n  \n  \/\/ Preloaduj s\u0105siednie obrazy (poprzedni i nast\u0119pny)\n  const toPreload = [];\n  \n  \/\/ Nast\u0119pny obraz\n  if (currentIdx < values.length - 1) {\n    toPreload.push(values[currentIdx + 1]);\n  }\n  \n  \/\/ Poprzedni obraz\n  if (currentIdx > 0) {\n    toPreload.push(values[currentIdx - 1]);\n  }\n  \n  \/\/ Jeszcze jeden do przodu\n  if (currentIdx < values.length - 2) {\n    toPreload.push(values[currentIdx + 2]);\n  }\n  \n  toPreload.forEach(val => {\n    const path = generateImagePath(selectedModel, selectedParam, val);\n    \n    \/\/ Dla GTI_rozdz2 dodaj nachylenie i ekspozycj\u0119 do imageId\n    let imageId = `img_${selectedModel}_${selectedParam}_${val}`;\n    if (selectedModel === \"GTI_rozdz2\") {\n      imageId += `_${selectedTilt}_${selectedExposure}`;\n    }\n    imageId = imageId.replace(\/[^a-zA-Z0-9_]\/g, '_');\n    \n    if (!preloadedImages.has(imageId) && !imageCache[imageId]) {\n      const img = new Image();\n      img.onload = () => {\n        preloadedImages.add(imageId);\n        if (Object.keys(imageCache).length < 50) {\n          imageCache[imageId] = img.cloneNode(true);\n        }\n      };\n      img.src = path;\n    }\n  });\n  \n  setTimeout(() => { isPreloading = false; }, 100);\n}\n\n\/\/ ============================================\n\/\/ POR\u00d3WNANIE OBRAZ\u00d3W\n\/\/ ============================================\nfunction showUnifiedComparisonImage() {\n  const container = document.getElementById(\"images\");\n  if (!container) return;\n  \n  container.innerHTML = '<div class=\"loader-container\"><div class=\"loader\"><\/div><\/div>';\n  \n  const imagePath = generateImagePath(selectedModel, \"comparison_unified\", null);\n  \n  const img = new Image();\n  img.onload = function() {\n    container.innerHTML = '';\n    img.style.display = \"block\";\n    img.style.maxWidth = \"100%\";\n    img.onclick = () => openLightbox(img.src, img.alt);\n    container.appendChild(img);\n  };\n  \n  img.onerror = function() {\n    container.innerHTML = `\n      <div style=\"color: #c00; text-align: center; padding: 30px;\">\n        <h3>W opracowniu<\/h3>\n      <\/div>\n    `;\n  };\n  \n  img.src = imagePath;\n  img.alt = `${modelDisplayNames[selectedModel] || selectedModel} - ${parameterDisplayNames[selectedParam] || selectedParam} - Por\u00f3wnanie (skala jednolita)`;\n}\n\nfunction showComparisonImages() {\n  const container = document.getElementById(\"comparisonImages\");\n  if (!container) return;\n  \n  container.innerHTML = \"\";\n  \n  let imagesToShow = [];\n  let param = selectedParam;\n  \n  \/\/ Obs\u0142uga zestawienia dla Zmiennosc_PV_rozdz_5_1\n  if (selectedModel === \"Zmiennosc_PV_rozdz_5_1\") {\n    \/\/ Poka\u017c wszystkie terminy dla aktualnie wybranego okresu\n    const currentPeriod = selectedZmPVPeriod || \"equinox\";\n    const timesForPeriod = zmPVTimeValues[currentPeriod] || [];\n    \n    timesForPeriod.forEach(time => {\n      const wrapper = document.createElement(\"div\");\n      \n      \/\/ Tymczasowo ustawiamy selectedZmPVTime\n      const originalTime = selectedZmPVTime;\n      selectedZmPVTime = time;\n      \n      const path = generateImagePath(selectedModel, param, null);\n      \n      const img = new Image();\n      img.src = path;\n      img.alt = zmPVTimeDisplayNames[time] || time;\n      img.style.maxWidth = \"100%\";\n      img.onclick = () => openLightbox(img.src, img.alt);\n      \n      img.onerror = function() {\n        wrapper.innerHTML = `<div style=\"padding: 20px; color: #999;\">W opracowniu<\/div>`;\n      };\n      \n      const caption = document.createElement(\"div\");\n      caption.className = \"caption\";\n      caption.textContent = zmPVTimeDisplayNames[time] || time;\n      \n      wrapper.appendChild(img);\n      wrapper.appendChild(caption);\n      container.appendChild(wrapper);\n      \n      \/\/ Przywr\u00f3\u0107 oryginaln\u0105 warto\u015b\u0107\n      selectedZmPVTime = originalTime;\n    });\n    \n    return;  \/\/ Zako\u0144cz funkcj\u0119 dla tego modelu\n  }\n  \n  \/\/ Wybierz odpowiednie warto\u015bci do por\u00f3wnania w zale\u017cno\u015bci od parametru\n  if (selectedParam === \"roczniki\" || selectedParam === \"odch_std_roczniki\" || selectedParam === \"rozrzut_roczniki\" || selectedParam === \"rozrzut_wz_roczniki\" || selectedParam === \"pv_roczna_dobowa\" || selectedParam === \"pv_wspolczynnik\") {\n    if (selectedParam === \"rozrzut_wz_roczniki\") {\n      imagesToShow = [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\"]; \/\/ tylko do 2022\n    } else {\n      imagesToShow = [\"2015\", \"2016\", \"2017\", \"2018\", \"2019\", \"2020\", \"2021\", \"2022\", \"2023\", \"2024\"];\n    }\n  } else if (selectedParam === \"srednie_mc\" || selectedParam === \"srednie_12UTC\" || selectedParam === \"odch_std_miesiac\" || selectedParam === \"rozrzut_wz_miesiac\" || selectedParam === \"pv_miesieczna_dobowa\" || selectedParam === \"pv_wspolczynnik_mc\") {\n    imagesToShow = [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n  } else if (selectedParam === \"srednie_godz\" || selectedParam === \"pv_godzinowa\" || selectedParam === \"pv_wspolczynnik_godz\") {\n    if (selectedModel === \"GTI_rozdz2\") {\n      imagesToShow = [\"0400\", \"0500\", \"0600\", \"0700\", \"0800\", \"0900\", \"1000\", \"1100\", \"1200\", \"1300\", \"1400\", \"1500\", \"1600\", \"1700\", \"1800\"];\n    } else {\n      imagesToShow = [\"0400\", \"0500\", \"0600\", \"0700\", \"0800\", \"0900\", \"1000\", \"1100\", \"1200\", \"1300\", \"1400\", \"1500\", \"1600\", \"1700\", \"1800\"];\n    }\n  }\n  \n  imagesToShow.forEach(val => {\n    const path = generateImagePath(selectedModel, param, val);\n    const wrapper = document.createElement(\"div\");\n    \n    const img = new Image();\n    img.src = path;\n    img.alt = valueDisplayNames[val] || val;\n    img.style.maxWidth = \"100%\";\n    img.onclick = () => openLightbox(img.src, img.alt);\n    \n    img.onerror = function() {\n      wrapper.innerHTML = `<div style=\"padding: 20px; color: #999;\">W opracowniu<\/div>`;\n    };\n    \n    const caption = document.createElement(\"div\");\n    caption.className = \"caption\";\n    caption.textContent = valueDisplayNames[val] || val;\n    \n    wrapper.appendChild(img);\n    wrapper.appendChild(caption);\n    container.appendChild(wrapper);\n  });\n}\n\nfunction resetComparisonMode() {\n  const compareSingle = document.getElementById(\"compareSingle\");\n  const compareGrid = document.getElementById(\"compareGrid\");\n  const compareUnified = document.getElementById(\"compareUnified\");\n  \n  if (compareSingle) compareSingle.classList.add(\"active\");\n  if (compareGrid) compareGrid.classList.remove(\"active\");\n  if (compareUnified) compareUnified.classList.remove(\"active\");\n}\n\nfunction setupComparisonButtons() {\n  const compareSingle = document.getElementById(\"compareSingle\");\n  const compareGrid = document.getElementById(\"compareGrid\");\n  const compareUnified = document.getElementById(\"compareUnified\");\n  \n  const valuesSection = document.getElementById(\"valuesSection\");\n  const sliderContainer = document.getElementById(\"horizontalSliderContainer\");\n  \n  \/\/ Ukryj ca\u0142\u0105 sekcj\u0119 trybu por\u00f3wnania dla parametr\u00f3w warianty_instalacji i pv_produkcja_wariant\n  const comparisonSection = document.getElementById(\"comparisonSection\");\n  if (comparisonSection) {\n    comparisonSection.style.display = ((selectedModel === \"GTI_rozdz2\" && selectedParam === \"warianty_instalacji\") ||\n                                        (selectedModel === \"PV_rozdz4\" && selectedParam === \"pv_produkcja_wariant\")) ? \"none\" : \"block\";\n  }\n  \n  \/\/ Poka\u017c przycisk \"skala jednolita\" dla odpowiednich modeli i parametr\u00f3w\n  if (compareUnified) {\n    const shouldShowUnified = (\n      (selectedModel === \"GHI_rozdz_1\" && (selectedParam === \"roczniki\" || selectedParam === \"srednie_mc\" || selectedParam === \"srednie_12UTC\")) ||\n      (selectedModel === \"GHI_zmiennosc_rozdz3\" && (selectedParam === \"odch_std_roczniki\" || selectedParam === \"odch_std_miesiac\" || selectedParam === \"rozrzut_wz_roczniki\" || selectedParam === \"rozrzut_wz_miesiac\")) ||\n      (selectedModel === \"GTI_rozdz2\" && (selectedParam === \"roczniki\" || selectedParam === \"srednie_mc\")) ||\n      (selectedModel === \"PV_rozdz4\" && (selectedParam === \"pv_roczna_dobowa\" || selectedParam === \"pv_miesieczna_dobowa\" || selectedParam === \"pv_wspolczynnik\" || selectedParam === \"pv_wspolczynnik_mc\"))\n    );\n    \n    if (shouldShowUnified) {\n      compareUnified.style.display = \"block\";\n    } else {\n      compareUnified.style.display = \"none\";\n    }\n  }\n  \n  if (compareSingle) {\n    compareSingle.onclick = () => {\n      isComparisonMode = false;\n      \n      \/\/ Ustaw aktywny przycisk\n      compareSingle.classList.add(\"active\");\n      if (compareGrid) compareGrid.classList.remove(\"active\");\n      if (compareUnified) compareUnified.classList.remove(\"active\");\n      \n      \/\/ Poka\u017c pojedyncze obrazy\n      valuesSection.style.display = \"block\";\n      sliderContainer.style.display = \"block\";\n      document.getElementById(\"images\").style.display = \"block\";\n      document.getElementById(\"comparisonImages\").style.display = \"none\";\n      \n      selectedValue = valuesForParams[selectedParam][0];\n      renderValues();\n      updateSlider();\n      showImages();\n    };\n  }\n  \n  if (compareGrid) {\n    compareGrid.onclick = () => {\n      isComparisonMode = true;\n      selectedValue = \"grid_comparison\";\n      \n      \/\/ Ustaw aktywny przycisk\n      if (compareGrid) compareGrid.classList.add(\"active\");\n      if (compareSingle) compareSingle.classList.remove(\"active\");\n      if (compareUnified) compareUnified.classList.remove(\"active\");\n      \n      \/\/ Ukryj slider i przyciski warto\u015bci\n      valuesSection.style.display = \"none\";\n      sliderContainer.style.display = \"none\";\n      document.getElementById(\"images\").style.display = \"none\";\n      document.getElementById(\"comparisonImages\").style.display = \"grid\";\n      \n      showComparisonImages();\n    };\n  }\n  \n  if (compareUnified) {\n    compareUnified.onclick = () => {\n      isComparisonMode = true;\n      selectedValue = \"unified_comparison\";\n      \n      \/\/ Ustaw aktywny przycisk\n      if (compareUnified) compareUnified.classList.add(\"active\");\n      if (compareGrid) compareGrid.classList.remove(\"active\");\n      if (compareSingle) compareSingle.classList.remove(\"active\");\n      \n      \/\/ Ukryj slider i przyciski warto\u015bci, poka\u017c pojedynczy obraz\n      valuesSection.style.display = \"none\";\n      sliderContainer.style.display = \"none\";\n      document.getElementById(\"images\").style.display = \"block\";\n      document.getElementById(\"comparisonImages\").style.display = \"none\";\n      \n      showUnifiedComparisonImage();\n    };\n  }\n}\n\n\/\/ ============================================\n\/\/ ANIMACJA\n\/\/ ============================================\nfunction setupAnimation() {\n  const animateBtn = document.getElementById(\"animateBtn\");\n  if (!animateBtn) return;\n  \n  animateBtn.onclick = () => {\n    if (isAnimating) {\n      stopAnimation();\n    } else {\n      startAnimation();\n    }\n  };\n}\n\nfunction startAnimation() {\n  if (isComparisonMode) return;\n  \n  isAnimating = true;\n  const animateBtn = document.getElementById(\"animateBtn\");\n  animateBtn.classList.add(\"active\");\n  animateBtn.textContent = \"\u23f9\";\n  \n  \/\/ Dla GTI_rozdz2 i parametru srednie_godz u\u017cyj innych warto\u015bci\n  let paramKey = selectedParam;\n  if (selectedModel === \"GTI_rozdz2\" && selectedParam === \"srednie_godz\") {\n    paramKey = \"srednie_godz_gti\";\n  }\n  const values = valuesForParams[paramKey] || [];\n  let currentIdx = values.indexOf(selectedValue);\n  \n  animationInterval = setInterval(() => {\n    currentIdx = (currentIdx + 1) % values.length;\n    selectedValue = values[currentIdx];\n    updateSliderPosition();\n    renderValues();\n    showImages();\n  }, 1000);\n}\n\nfunction stopAnimation() {\n  isAnimating = false;\n  const animateBtn = document.getElementById(\"animateBtn\");\n  animateBtn.classList.remove(\"active\");\n  animateBtn.textContent = \"\u25b6\";\n  \n  if (animationInterval) {\n    clearInterval(animationInterval);\n    animationInterval = null;\n  }\n}\n\n\/\/ ============================================\n\/\/ SKR\u00d3TY KLAWISZOWE\n\/\/ ============================================\nfunction setupKeyboardShortcuts() {\n  document.addEventListener(\"keydown\", function(e) {\n    if (isComparisonMode) return;\n    \n    \/\/ Dla GTI_rozdz2 i parametru srednie_godz u\u017cyj innych warto\u015bci\n    let paramKey = selectedParam;\n    if (selectedModel === \"GTI_rozdz2\" && selectedParam === \"srednie_godz\") {\n      paramKey = \"srednie_godz_gti\";\n    }\n    const values = valuesForParams[paramKey] || [];\n    const currentIdx = values.indexOf(selectedValue);\n    const lightbox = document.getElementById(\"lightbox\");\n    const isLightboxActive = lightbox && lightbox.classList.contains(\"active\");\n    \n    switch(e.key) {\n      case \"ArrowLeft\":\n        if (currentIdx > 0) {\n          selectedValue = values[currentIdx - 1];\n          renderValues();\n          updateSliderPosition();\n          showImages();\n          \n          \/\/ Je\u015bli lightbox jest otwarty, zaktualizuj r\u00f3wnie\u017c powi\u0119kszony obraz\n          if (isLightboxActive) {\n            const imagePath = generateImagePath(selectedModel, selectedParam, selectedValue);\n            const imgAlt = `${modelDisplayNames[selectedModel] || selectedModel} - ${parameterDisplayNames[selectedParam] || selectedParam} - ${valueDisplayNames[selectedValue] || selectedValue}`;\n            const lightboxImg = lightbox.querySelector(\"img\");\n            if (lightboxImg) {\n              lightboxImg.src = imagePath;\n              lightboxImg.alt = imgAlt;\n            }\n          }\n        }\n        break;\n      case \"ArrowRight\":\n        if (currentIdx < values.length - 1) {\n          selectedValue = values[currentIdx + 1];\n          renderValues();\n          updateSliderPosition();\n          showImages();\n          \n          \/\/ Je\u015bli lightbox jest otwarty, zaktualizuj r\u00f3wnie\u017c powi\u0119kszony obraz\n          if (isLightboxActive) {\n            const imagePath = generateImagePath(selectedModel, selectedParam, selectedValue);\n            const imgAlt = `${modelDisplayNames[selectedModel] || selectedModel} - ${parameterDisplayNames[selectedParam] || selectedParam} - ${valueDisplayNames[selectedValue] || selectedValue}`;\n            const lightboxImg = lightbox.querySelector(\"img\");\n            if (lightboxImg) {\n              lightboxImg.src = imagePath;\n              lightboxImg.alt = imgAlt;\n            }\n          }\n        }\n        break;\n      case \" \":\n        e.preventDefault();\n        if (isAnimating) stopAnimation();\n        else startAnimation();\n        break;\n      case \"a\":\n      case \"A\":\n        e.preventDefault();\n        if (isAnimating) stopAnimation();\n        else startAnimation();\n        break;\n    }\n  });\n}\n\n\/\/ ============================================\n\/\/ LIGHTBOX\n\/\/ ============================================\nfunction setupLightbox() {\n  \/\/ Utw\u00f3rz element lightboxa je\u015bli nie istnieje\n  let lightbox = document.getElementById(\"lightbox\");\n  if (!lightbox) {\n    lightbox = document.createElement(\"div\");\n    lightbox.id = \"lightbox\";\n    lightbox.className = \"lightbox\";\n    lightbox.innerHTML = `\n      <span class=\"lightbox-close\">&times;<\/span>\n      <img src=\"\" alt=\"\">\n    `;\n    document.body.appendChild(lightbox);\n    \n    \/\/ Zamknij po klikni\u0119ciu\n    lightbox.onclick = closeLightbox;\n  }\n}\n\nfunction openLightbox(src, alt) {\n  const lightbox = document.getElementById(\"lightbox\");\n  if (lightbox) {\n    const img = lightbox.querySelector(\"img\");\n    if (img) {\n      img.src = src;\n      img.alt = alt;\n    }\n    lightbox.classList.add(\"active\");\n    \n    \/\/ Zablokuj scroll\n    document.body.style.overflow = \"hidden\";\n  }\n}\n\nfunction closeLightbox() {\n  const lightbox = document.getElementById(\"lightbox\");\n  if (lightbox) {\n    lightbox.classList.remove(\"active\");\n    \n    \/\/ Przywr\u00f3\u0107 scroll\n    document.body.style.overflow = \"auto\";\n  }\n}\n\n\/\/ Obs\u0142uga klawisza ESC do zamykania lightboxa\ndocument.addEventListener(\"keydown\", function(e) {\n  if (e.key === \"Escape\") {\n    closeLightbox();\n  }\n});\n\n\/\/ ============================================\n\/\/ INICJALIZACJA\n\/\/ ============================================\nfunction initializeApp() {\n  \/\/ Ustaw pocz\u0105tkow\u0105 warto\u015b\u0107 na aktualny miesi\u0105c dla parametru startowego\n  if (selectedParam === \"srednie_mc\" || selectedParam === \"srednie_12UTC\") {\n    selectedValue = currentMonth;\n  }\n  \n  setupLightbox();\n  renderModels();\n  renderParams();\n  renderValues();\n  updateSlider();\n  \n  \/\/ Ukryj sekcj\u0119 GTI na starcie (domy\u015blny model to GHI)\n  const gtiSection = document.getElementById(\"gtiVariantsSection\");\n  if (gtiSection) {\n    gtiSection.style.display = (selectedModel === \"GTI_rozdz2\") ? \"block\" : \"none\";\n  }\n  \n  \/\/ Poka\u017c sekcj\u0119 por\u00f3wnania dla pocz\u0105tkowego parametru\n  const comparisonSection = document.getElementById(\"comparisonSection\");\n  if (comparisonSection) {\n    comparisonSection.style.display = ((selectedModel === \"GTI_rozdz2\" && selectedParam === \"warianty_instalacji\") ||\n                                        (selectedModel === \"PV_rozdz4\" && selectedParam === \"pv_produkcja_wariant\")) ? \"none\" : \"block\";\n  }\n  \n  setupComparisonButtons();\n  setupAnimation();\n  setupKeyboardShortcuts();\n  showImages();\n  \n  \/\/ Opis parametru\n  const descContainer = document.getElementById(\"parameterDescription\");\n  if (descContainer) {\n    descContainer.innerHTML = `\n    `;\n  }\n}\n\n\n\/\/ ============================================\n\/\/ OBS\u0141UGA AKORDEON\u00d3W\n\/\/ ============================================\nfunction toggleAccordion(header) {\n  const content = header.nextElementSibling;\n  const isOpen = content.classList.contains('open');\n  \n  \/\/ Zamknij wszystkie inne akordeony (opcjonalnie - usu\u0144 te linie je\u015bli chcesz pozwoli\u0107 na wiele otwartych)\n  \/\/ document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('open'));\n  \/\/ document.querySelectorAll('.accordion-header').forEach(h => h.classList.remove('active'));\n  \n  \/\/ Prze\u0142\u0105cz aktualny akordeon\n  if (isOpen) {\n    content.classList.remove('open');\n    header.classList.remove('active');\n  } else {\n    content.classList.add('open');\n    header.classList.add('active');\n  }\n}\n\n\/\/ Start\ndocument.addEventListener(\"DOMContentLoaded\", initializeApp);\n\nconsole.log(\"Autor: Bart\u0142omiej Sobczyk 2026\");\n<\/script>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Atlas Energetyki Solarnej AES-PL Charakterystyka: Nachylenie: Ekspozycja: Nachylenie: Ekspozycja: Okres: Terminy w okresie po\u0142udnia s\u0142onecznego (UTC)*: Parametr: Okres: Terminy w okresie po\u0142udnia s\u0142onecznego (UTC)*: Okres: Terminy w okresie po\u0142udnia s\u0142onecznego (UTC)*: Nachylenie: Ekspozycja: Okres: Terminy: Kolejne mapy: Tryb wy\u015bwietlania: POJEDYNCZE ZESTAWIENIE ZESTAWIENIE (SKALA JEDNOLITA) \ud83d\udca1 Skr\u00f3ty klawiszowe: \u2190 \u2192 Zmiana warto\u015bci (rok\/miesi\u0105c\/godzina) A Animacja Wyb\u00f3r: [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":48618,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.5.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Atlas solarny AES-PL - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB<\/title>\n<meta name=\"description\" content=\"Atlas solarny AES-PL powsta\u0142 na potrzeby inwentaryzacji zmienno\u015bci przestrzennej i czasowej zasob\u00f3w promieniowania s\u0142onecznego na obszarze Polski. Charakterystyki promieniowania oraz potencja\u0142 u\u017cytkowy zasob\u00f3w solarnych wyznaczono na podstawie danych z pomiar\u00f3w satelitarnych z okresu 01.01.2015-31.12.2024.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cmm.imgw.pl\/?page_id=48559\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TEST serwis OZE\" \/>\n<meta property=\"og:description\" content=\"TEST serwis OZE\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cmm.imgw.pl\/?page_id=48559\" \/>\n<meta property=\"og:site_name\" content=\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Meteoimgw\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-19T15:46:43+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/cmm.imgw.pl\/wp-content\/uploads\/2026\/01\/Produkt_testowy.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"TEST serwis OZE\" \/>\n<meta name=\"twitter:description\" content=\"TEST serwis OZE\" \/>\n<meta name=\"twitter:site\" content=\"@IMGW_CMM\" \/>\n<meta name=\"twitter:label1\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cmm.imgw.pl\/?page_id=48559\",\"url\":\"https:\/\/cmm.imgw.pl\/?page_id=48559\",\"name\":\"Atlas solarny AES-PL - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\",\"isPartOf\":{\"@id\":\"https:\/\/cmm.imgw.pl\/#website\"},\"datePublished\":\"2026-01-07T12:50:43+00:00\",\"dateModified\":\"2026-02-19T15:46:43+00:00\",\"description\":\"Atlas solarny AES-PL powsta\u0142 na potrzeby inwentaryzacji zmienno\u015bci przestrzennej i czasowej zasob\u00f3w promieniowania s\u0142onecznego na obszarze Polski. Charakterystyki promieniowania oraz potencja\u0142 u\u017cytkowy zasob\u00f3w solarnych wyznaczono na podstawie danych z pomiar\u00f3w satelitarnych z okresu 01.01.2015-31.12.2024.\",\"breadcrumb\":{\"@id\":\"https:\/\/cmm.imgw.pl\/?page_id=48559#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cmm.imgw.pl\/?page_id=48559\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cmm.imgw.pl\/?page_id=48559#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cmm.imgw.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Atlas solarny AES-PL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cmm.imgw.pl\/#website\",\"url\":\"https:\/\/cmm.imgw.pl\/\",\"name\":\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\",\"description\":\"CMOK-LMM Laboratorium pe\u0142ni pa\u0144stwow\u0105 s\u0142u\u017cb\u0119 hydrologiczno-meteorologiczn\u0105 w zakresie numerycznych prognoz pogody, kt\u00f3rego zadaniem jest konsolidacja kompetencji w obszarze modelowania zjawisk pogodowych oraz dalszego rozwoju numerycznych modeli pogody (NMP).\",\"publisher\":{\"@id\":\"https:\/\/cmm.imgw.pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cmm.imgw.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cmm.imgw.pl\/#organization\",\"name\":\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\",\"url\":\"https:\/\/cmm.imgw.pl\/\",\"sameAs\":[\"https:\/\/www.facebook.com\/Meteoimgw\/\",\"https:\/\/twitter.com\/IMGW_CMM\"],\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png\",\"contentUrl\":\"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png\",\"width\":1356,\"height\":365,\"caption\":\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\"},\"image\":{\"@id\":\"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Atlas solarny AES-PL - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","description":"Atlas solarny AES-PL powsta\u0142 na potrzeby inwentaryzacji zmienno\u015bci przestrzennej i czasowej zasob\u00f3w promieniowania s\u0142onecznego na obszarze Polski. Charakterystyki promieniowania oraz potencja\u0142 u\u017cytkowy zasob\u00f3w solarnych wyznaczono na podstawie danych z pomiar\u00f3w satelitarnych z okresu 01.01.2015-31.12.2024.","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:\/\/cmm.imgw.pl\/?page_id=48559","og_locale":"pl_PL","og_type":"article","og_title":"TEST serwis OZE","og_description":"TEST serwis OZE","og_url":"https:\/\/cmm.imgw.pl\/?page_id=48559","og_site_name":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","article_publisher":"https:\/\/www.facebook.com\/Meteoimgw\/","article_modified_time":"2026-02-19T15:46:43+00:00","og_image":[{"width":1792,"height":576,"url":"http:\/\/cmm.imgw.pl\/wp-content\/uploads\/2026\/01\/Produkt_testowy.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_title":"TEST serwis OZE","twitter_description":"TEST serwis OZE","twitter_site":"@IMGW_CMM","twitter_misc":{"Szacowany czas czytania":"8 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/cmm.imgw.pl\/?page_id=48559","url":"https:\/\/cmm.imgw.pl\/?page_id=48559","name":"Atlas solarny AES-PL - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","isPartOf":{"@id":"https:\/\/cmm.imgw.pl\/#website"},"datePublished":"2026-01-07T12:50:43+00:00","dateModified":"2026-02-19T15:46:43+00:00","description":"Atlas solarny AES-PL powsta\u0142 na potrzeby inwentaryzacji zmienno\u015bci przestrzennej i czasowej zasob\u00f3w promieniowania s\u0142onecznego na obszarze Polski. Charakterystyki promieniowania oraz potencja\u0142 u\u017cytkowy zasob\u00f3w solarnych wyznaczono na podstawie danych z pomiar\u00f3w satelitarnych z okresu 01.01.2015-31.12.2024.","breadcrumb":{"@id":"https:\/\/cmm.imgw.pl\/?page_id=48559#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cmm.imgw.pl\/?page_id=48559"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/cmm.imgw.pl\/?page_id=48559#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cmm.imgw.pl\/"},{"@type":"ListItem","position":2,"name":"Atlas solarny AES-PL"}]},{"@type":"WebSite","@id":"https:\/\/cmm.imgw.pl\/#website","url":"https:\/\/cmm.imgw.pl\/","name":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","description":"CMOK-LMM Laboratorium pe\u0142ni pa\u0144stwow\u0105 s\u0142u\u017cb\u0119 hydrologiczno-meteorologiczn\u0105 w zakresie numerycznych prognoz pogody, kt\u00f3rego zadaniem jest konsolidacja kompetencji w obszarze modelowania zjawisk pogodowych oraz dalszego rozwoju numerycznych modeli pogody (NMP).","publisher":{"@id":"https:\/\/cmm.imgw.pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cmm.imgw.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/cmm.imgw.pl\/#organization","name":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","url":"https:\/\/cmm.imgw.pl\/","sameAs":["https:\/\/www.facebook.com\/Meteoimgw\/","https:\/\/twitter.com\/IMGW_CMM"],"logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/","url":"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png","contentUrl":"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png","width":1356,"height":365,"caption":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB"},"image":{"@id":"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages\/48559"}],"collection":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=48559"}],"version-history":[{"count":335,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages\/48559\/revisions"}],"predecessor-version":[{"id":49468,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages\/48559\/revisions\/49468"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/media\/48618"}],"wp:attachment":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=48559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}