Model pogody podaje mżawkę, a na filmie jest sucho

Film znad jeziora w Bangkoku, który pojawia się w każdym wpisie tej serii, nagrano 6 marca 2024 o 14:15 w pełnym słońcu: na ścieżce widać ostre cienie liści, a niebo jest błękitne. Moje narzędzie wyliczyło, że słońce stało wtedy 57 stopni nad horyzontem, na południowym zachodzie, ale... model pogody, z którego pobiera ono dane, podaje dla tej godziny 85% zachmurzenia.

Na klatce świeci słońce, a model pogody podaje dla tej godziny 85% zachmurzenia (dane pogodowe: Open-Meteo.com).
Kliposkop to narzędzie, które buduję od zera razem z agentami AI i które ma odczytywać z pliku wideo to, czego nie widać na samym obrazie, a w tym wpisie biorę się za słońce i pogodę w miejscu i chwili nagrania. Na tym etapie narzędzie nadal nie korzysta z żadnego modelu AI, ale po raz pierwszy wysyła do usługi w internecie coś, co pochodzi z moich filmów, więc opisuję też dokładnie, co przy tym wysyła.
Słońce liczone bez internetu
Położenie słońca da się wyliczyć z samego miejsca i chwili nagrania, które narzędzie odczytuje już z pliku, i tę część liczy ono na moim komputerze, bez internetu. Korzysta z równań, na których opiera się kalkulator położenia słońca amerykańskiej agencji NOAA (pochodzą z książki „Astronomical Algorithms” Jeana Meeusa), i podaje wysokość słońca nad horyzontem, kierunek, w którym stało, godziny wschodu i zachodu oraz porę dnia. Porę dnia narzędzie rozpoznaje po wysokości słońca, nie po zegarze: za złotą godzinę uznaje czas, kiedy słońce jest już nad horyzontem, ale nie wyżej niż sześć stopni, a za zmierzch cywilny czas tuż po zachodzie, kiedy słońce jest już pod horyzontem, ale nie niżej niż sześć stopni.
Agent AI, który pisał ten moduł (czyli tę część narzędzia), sprawdził wyniki dla wszystkich 23 filmów testowych drugim, niezależnym algorytmem (NREL SPA z gotowej biblioteki pvlib): wysokość i kierunek słońca różnią się o mniej niż dwie setne stopnia, a godziny wschodu i zachodu najwyżej o około dwie sekundy. Porównał też wyniki z tym, co widać na klatkach z jedenastu filmów, i nigdzie nie znalazł niezgodności (na przykład dwa filmy z Chicago nagrane kilka minut po zachodzie słońca wyglądają na zmierzch). W plikach nie ma jednak zapisanego kierunku, w którym patrzyła kamera, więc cienie na klatkach pozwalają tylko ocenić, czy wynik jest wiarygodny, ale nie sprawdzić go co do stopnia.

Film z Chicago nagrany 11 lipca 2025 o 20:32, sześć minut po zachodzie słońca: według narzędzia słońce jest prawie dwa stopnie pod horyzontem, czyli trwa zmierzch cywilny.
Pogody sprzed roku nie wyliczę u siebie
Przy nazwach miejsc zależało mi na tym, żeby nigdzie nie wysyłać współrzędnych z moich filmów, i udało się to zrobić bez internetu, z bazą miejsc pobraną raz na komputer. Z pogodą jest trudniej, bo pogody z konkretnej godziny sprzed roku czy dwóch nie wyliczę z samego miejsca i czasu, a żeby mieć ją u siebie, musiałbym pobrać bardzo duże archiwum danych z całego świata. Zdecydowałem więc, że narzędzie zapyta usługę online o pogodę, ale wyśle jej tak mało, jak się da.
Narzędzie bierze pogodę z archiwum serwisu Open-Meteo, z modelu ERA5. To tak zwana reanaliza, czyli dane, które powstają, kiedy model pogody łączy pomiary (ze stacji pogodowych, samolotów, boi, radarów i satelitów) z obliczeniami opartymi na prawach fizyki i w ten sposób wypełnia luki między nimi. Dzięki temu ERA5 podaje wartości dla całego świata, godzina po godzinie, od 1940 roku. Przygotowuje go europejskie centrum prognoz pogody ECMWF w ramach programu Copernicus. W ERA5 świat jest podzielony siatką na kwadraty o boku około 25 km (0,25 stopnia), więc jedna wartość temperatury czy zachmurzenia opisuje cały taki kwadrat w danej godzinie, a nie jedno miejsce.
Co dokładnie wysyła narzędzie
Model i tak podaje jedną wartość dla całego kwadratu, więc narzędzie wysyła punkt siatki, na której liczy model (czyli środek kwadratu, w którym nagrano film), i dzień nagrania liczony w czasie UTC (uniwersalnym, wspólnym dla całego świata). Nie wysyła pliku, jego nazwy, dokładnych współrzędnych ani godziny: dostaje dane dla wszystkich godzin tego dnia i samo wybiera tę, która jest najbliżej chwili nagrania. Zanim narzędzie zapytało o pogodę dla któregokolwiek z moich filmów, do usługi trafiły na próbę trzy wymyślone punkty z jednego kwadratu i dla wszystkich trzech przyszła ta sama odpowiedź, dla tego samego kwadratu i z tymi samymi temperaturami.
Film znad jeziora nagrano w miejscu o współrzędnych 13,7327° N i 100,5592° E, a środek jego kwadratu leży 6,7 km dalej, w punkcie 13,75° N i 100,50° E. Tak wygląda cały adres, który narzędzie wysłało dla tego filmu (na początku są współrzędne punktu siatki i dzień, potem lista wartości, o które pyta, i nazwa modelu):
https://archive-api.open-meteo.com/v1/archive?latitude=13.75&longitude=100.50&start_date=2024-03-06&end_date=2024-03-06&hourly=temperature_2m,apparent_temperature,relative_humidity_2m,precipitation,cloud_cover,wind_speed_10m,wind_direction_10m,weather_code&models=era5&timezone=GMT&elevation=nan&cell_selection=nearest
Każdą odpowiedź narzędzie zapisuje na komputerze i przy kolejnym uruchomieniu nie wysyła już niczego, a filmy nagrane tego samego dnia w tym samym kwadracie korzystają z tej samej odpowiedzi. Na 23 filmy testowe wystarczyło 14 zapytań (dziesięć filmów z Chicago zmieściło się w czterech, a wszystkie jedenaście filmów z Bangkoku leżą w jednym kwadracie, tylko że nagrałem je w ośmiu różnych dniach). Jak przy każdym połączeniu z internetem, usługa widzi też adres IP mojego komputera i to, kiedy przyszło zapytanie. Prototyp podobnego narzędzia, który zbudowałem wcześniej, też brał pogodę z Open-Meteo, tylko że wysyłał dokładne współrzędne, a tym razem chciałem wysyłać nie więcej, niż model i tak wykorzystuje.
Mżawka nad suchą plażą
Model podaje mżawkę dla 11 z 23 filmów, a na żadnej ze sprawdzonych klatek jej nie widać.
Mżawka to drobny deszcz, a w danych z Open-Meteo dla tych filmów to od 0,1 do 1,2 mm opadu w ciągu godziny. Cztery z nich nagrano w Bangkoku, przy zachmurzeniu od 38 do 43% (według danych chmury zakrywały wtedy mniej niż połowę nieba). Agent AI zestawił dane z tym, co widać na klatkach jedenastu filmów testowych (nie tylko tych z mżawką). Wśród nich są cztery z mżawką w danych, na których w świetle dnia widać ziemię, i na każdym z tych czterech jest ona sucha.

Plaża w Chicago, 12 lipca 2025 o 9:13: piasek wygląda na suchy, a model podaje słabą mżawkę i 94% zachmurzenia (dane pogodowe: Open-Meteo.com).
Z zachmurzeniem bywa podobnie: na filmie z plażą niebo jest niebieskie, z kilkoma chmurami, a nad jeziorem w Bangkoku świeci słońce, chociaż model podaje dla tych godzin odpowiednio 94 i 85% zachmurzenia. Tam, gdzie było naprawdę pochmurno, dane się zgadzają (nad rzeką w Chicago szare niebo bez cieni pasuje do 97% zachmurzenia w danych). Skąd się biorą te różnice, tego z samych danych nie wyczytam i nie chcę zgadywać. Wiem tylko, że model podaje jedną wartość dla całego kwadratu siatki i całej godziny, a film pokazuje jedno miejsce przez kilka sekund, dlatego traktuję te liczby jako dane z modelu, nie jako opis tego, co było widać na miejscu.
Kwadrat nad jeziorem Michigan
Przy filmach z Chicago wyszło jeszcze coś: centrum miasta leży prawie dokładnie w połowie między dwiema liniami punktów siatki i dla sześciu z tych filmów najbliższe są kwadraty nad jeziorem Michigan, którym Open-Meteo przypisuje wysokość 0 m nad poziomem morza. Dla kwadratu nad lądem obok jednego z nich model podaje w godzinie, w której nagrano wieczorny film z ulicy (11 lipca 2025, 20:31), 2,0 mm deszczu, a dla tego nad wodą tylko 0,1 mm mżawki (nad lądem jest też trochę cieplej). Narzędzie zostaje przy najbliższym kwadracie i zaznacza w wyniku, że ma on wysokość 0 m, czyli że może leżeć nad wodą.
Agent AI napisał ten moduł w jedenaście minut
Najważniejsza decyzja była tu moja: słońce liczone bez internetu, pogoda z internetu i jak najmniej danych wysyłanych do sieci. Agent AI, który kierował pracą, przekazał zadanie drugiemu agentowi, a ten w ciągu około jedenastu minut napisał moduł razem z 56 testami, po czym sprawdził położenie słońca drugim algorytmem i sam porównał wyniki z obrazem z filmów. Całe narzędzie ma teraz 223 testy, które nie wykazują żadnych błędów.
Wyników tego etapu sam jeszcze nie sprawdzałem. Agent AI opisał, gdzie dane nie zgadzają się z obrazem, a co narzędzie ma zrobić z taką różnicą, to już pytanie do mnie.
Na tym etapie Kliposkop podaje, gdzie było słońce w chwili nagrania i jaka według modelu była wtedy pogoda, ale... dane z modelu opisują kwadrat o boku około 25 km, a film pokazuje jedno miejsce, i w moich filmach testowych najlepiej widać to przy mżawce nad suchą plażą.
Dane pogodowe w tym wpisie pochodzą z Open-Meteo.com i są udostępnione na licencji CC BY 4.0, a reanaliza ERA5 to dane Copernicus Climate Change Service (C3S). Nazwy miejsc są z bazy GeoNames, również na licencji CC BY 4.0.
W skrócie
- Kliposkop liczy położenie słońca w chwili nagrania na moim komputerze, bez internetu, a drugi, niezależny algorytm daje ten sam wynik z dokładnością do dwóch setnych stopnia.
- Pogodę narzędzie bierze z archiwum Open-Meteo, z reanalizy ERA5, która podaje jedną wartość na każdy kwadrat o boku około 25 km i na każdą godzinę.
- Do usługi trafia tylko punkt siatki modelu (środek kwadratu, w którym nagrano film) i dzień, a odpowiedzi zostają na komputerze: na 23 filmy testowe wystarczyło 14 zapytań i przy kolejnym uruchomieniu narzędzie nie wysyła już niczego.
- Model podaje mżawkę dla 11 z 23 filmów, a na sprawdzonych klatkach, na których w świetle dnia widać ziemię, jest ona sucha. Nad jeziorem w Bangkoku świeci słońce, choć w danych jest 85% zachmurzenia.
- Dla sześciu filmów z Chicago najbliższe są kwadraty nad jeziorem Michigan, a dla kwadratu obok, nad lądem, model podaje w jednej z wieczornych godzin 2,0 mm deszczu zamiast 0,1 mm mżawki.
Źródła
- Historical Weather API (otwiera się w nowej karcie), Open-Meteo (dokumentacja)
- Licence (otwiera się w nowej karcie), Open-Meteo
- ERA5 hourly data on single levels from 1940 to present (otwiera się w nowej karcie), Copernicus Climate Data Store
- Solar Calculation Details (otwiera się w nowej karcie), NOAA Global Monitoring Laboratory
- pvlib.solarposition.spa_python (otwiera się w nowej karcie), pvlib python (dokumentacja)
- Readme for GeoNames Gazetteer extract files (otwiera się w nowej karcie), GeoNames
- Attribution 4.0 International (CC BY 4.0) (otwiera się w nowej karcie), Creative Commons


