smaul.ee

17/11/2024 - Ilmatieteenlaitoksen avoin data / FMI API

Mun piti alunperin hakea tällä säätiedot suomen ilmatieteenlaitoksen avoimesta datasta. Ja teinkin niin, mutta oli kyllä tämmöselle asiaan yhtään perehtymättömälle kaverille tehty aivan liian hankalaksi ja monimutkaiseksi operaatioksi ei saatana. Siis kyllä sieltä nyt saa dataa jos vain haluaa, ei siinä mittää, mutta sieltä ei oikein saa sitä dataa mitä minä haluaisin. (En vaan osaa).

Tekstiä päivitetty 19/11/2024 3:23. Selostan lopussa Smartsymbolista, kantsii tsekata.

Kyllä niiltä löytyy ohjeet, mitä ne symbolit tarkoittavat ja kehuskelevat kuinka hienot symbolit githubista saa, mutta ne arvot. Hitto kuinka saatanan monta tuntia mä mietin että MISSÄ NE ON? Lopulta muutaman päivän jälkeen löysin 90 sivua pitkän foorumikeskustelun aiheesta missä manailtiin samaa, joten päätin että lopetellaas projekti siihen ja siirrytään johonkin vähän selkeämpään/PAREMPAAN systeemiin. Ton FMI:n kanssa arpomisen jälkeen meni ehkä alle pari tuntia saada Jussi hakemaan säätiedot open-meteon API:sta, sääsymbolien kanssa. Ja arvatkaa muuten onko heidän sääsymbolit samat kuin FMI:n apissa? No EI OLE. :D Luulis että noissakin olis jotku standardit.

Asia jäi kuitenkin vaivaamaan jonkun verran, niin jaan mun erittäin edistyneet empiiriset tutkimustulokset nyt Teidän kanssa.

ecmwf::forecast::surface::point::multipointcoverage

Tämä oli ainakin alkuvaiheessa meikäläiselle kaikin selkein syöte. Tämän kautta ilmeisesti teoriassa pitäisi saada seuraavat tiedot:

GeopHeight, Temperature, Pressure, Humidity, WindDirection, WindSpeedMS, WindUMS, WindVMS, MaximumWind, WindGust, DewPoint, TotalCloudCover, WeatherSymbol13, LowCloudCover, MediumCloudCover, HighCloudCover, HighCloudCover, Precipitation1h, PrecipitationAmount, RadiationGlobalAccumulation, RadiationGlobalAccumulation, RadiationLWAccumulation, RadiationNetSurfaceLWAccumulation, RadiationNetSurfaceSWAccumulation, RadiationDiffuseAccumulation, LandSeaMask

Mutta silti ainoat mistä saa numeroita takaisin, on: Temperature, Pressure, Humidity, WindUMS, WindVMS. Muut antavat arvoksi NaN

mitavittua

Pääset itse tutkimaan parhaiten näitä tietoja suoraan tästä osoitteesta: "https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=ecmwf::forecast::surface::point::multipointcoverage&place=Ivalo Tai vaihtoehtoisesti saat tällä tulostettua haluamillesi kaupungeille raa'an XML syötteen.

<?php $cities=["Inari","Oulu","Helsinki"]; foreach($cities as $c){ echo"<h3>Kaupunki: $c</h3>"; $u="https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=ecmwf::forecast::surface::point::multipointcoverage&place=".urlencode($c); $r=file_get_contents($u); echo $r!==false?"<pre>".htmlspecialchars($r)."</pre>":"<p>Virhe kaupungin $c tietojen haussa.</p>";} ?>

Halutessasi voit käyttää myös valmista parseria. Tämä tulostaa tiedot selkolukuiseksi. Suosittelen kuitenkin että jos meinaat tätä käyttää, niin älä käytä sitä suoraan näin. Voi olla että bannaavat sun IP osoitteen jos huomaavat että lataat tota tyyliin sekunnin välein :D Kannattaa varmaan kääntää tuo esim perl scriptiksi joka tallentaa tiedot vaikka .txt tiedostoon ja sitä ajaa crontabilla vaikka esimerkiksi kuuden tunnein välein tms. Sitten JS/PHP tai mitä ja missä ikinä haluatkaan tuota käyttää hakee tiedot siitä tekstitiedostosta. Tuota parseriakin voi varmasti jatkokehittää tehokkaammaksi, en ole oikein perehtynyt näihin rajapintoihin saatika xml:ään että tietäisin miten tuo oikeasti hoidetaan parhaiten. Ymmärsin kuitenkin että PHP:ssä on myös XMLreader luokka joka "striimaa" noi tiedostot. Tiedä sit vittu mitä se tarkottaa huhhuh.

Tulostettavat arvot: lämpötila / paine / ilmankosteus / tuuli U / tuuli V / sade. Jos kysyt minulta mitä wind u ja v tarkoittaa, en tiedä.

2024-11-17T 15:00:00 tätä kirjoittaessa tuorein aika oli 2024-11-19T 02:00:00 ja tämä oli viimeisin. Eli 36 tuntia tästä hetkestä eteenpäin.

<?php $cities = ["Inari", "Helsinki", "Rovaniemi"]; foreach ($cities as $city) { echo "<h3>$city</h3>"; $url = "https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=ecmwf::forecast::surface::point::multipointcoverage&place=" . urlencode($city); $res = file_get_contents($url); if ($res) { $xml = new SimpleXMLElement($res); $xml->registerXPathNamespace('gml', 'http://www.opengis.net/gml/3.2'); $data = $xml->xpath("//gml:doubleOrNilReasonTupleList"); if ($data) foreach ($data as $block) { foreach (explode("\n", trim((string)$block)) as $row) { $v = preg_split('/\s+/', trim($row)); if (count($v) >= 24) echo "T: $v[1]°C, P: $v[2]hPa, H: $v[3]%, TU: $v[6]m/s, TV: $v[7]m/s, S: $v[14]mm/h<br>"; } } else echo "Ei dataa $city.<br>"; } else echo "Virhe $city.<br>"; }?>

Tuo tosiaan tulostaa jokaisesta syötetystä kaupungista 36 riviä dataa ja on parsinut ne valmiiksi luettavaan muotoon. Esimerkiksi: 2024-11-17T22:00:00Z ensimmäinen rivi 2024-11-17T23:00:00Z toinen rivi 2024-11-19T09:00:00Z rivi 36

fmi::observations::weather::simple Tämän toiminta oli todella, todella epävakaa jostain syystä. En tiedä mikä homma oli, mutta tämä suostui tulostamaan meikäläiselle vain kerran tai pari yhtään mitään. En siis käyttänyt tätä sen enempää. Nyt myöhemmin tämä taas toiminut ihan kohtalaisen hyvin, joka yllätys yllätys helpottaa tämän tulkitsemista. Tässä linkki jonka kautta saat esim Inarin tiedot. En ole kokeillut voiko tätä heittää esim tuohon ylempään myös, en suosittele koska tää tulostaa ihan helvetisti dataa. https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::simple&place=Ivalo Ja mitäpä sieltä tulee? No sieltä tulee: Tämä tulostuu vain kerran:

<wfs:FeatureCollection timeStamp="2024-11-17T14:16:38Z" numberReturned="9360" numberMatched="9360" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://xml.fmi.fi/schema/wfs/2.0 https://xml.fmi.fi/schema/wfs/2.0/fmi_wfs_simplefeature.xsd">

Jonka jälkeen tulee seuraavanlaista settiä

<wfs:member> <BsWfs:BsWfsElement gml:id="BsWfsElement.1.1.1"> <BsWfs:Location> <gml:Point gml:id="BsWfsElementP.1.1.1" srsDimension="2" srsName="http://www.opengis.net/def/crs/EPSG/0/4258"> <gml:pos>68.61336 27.41890 </gml:pos> </gml:Point> </BsWfs:Location> <BsWfs:Time>2024-11-17T02:16:00Z</BsWfs:Time> <BsWfs:ParameterName>t2m</BsWfs:ParameterName> <BsWfs:ParameterValue>-2.1</BsWfs:ParameterValue> </BsWfs:BsWfsElement> </wfs:member>

Tossa ylempänä olevassa kannattaa panna merkille seuraavat, tai ne kiinnostaa: BsWfsElement.1.1.1, BsWfs:time, BsWfs:ParameterName ja BsWfs:ParameterValue. Tämän jälkeen tulee tuo sama ~720 kertaa, mutta eri tideoilla. Tiedot jotka siinä vaihtuu

Time 2024-11-17T02:16:00Z BsWfsElementP.1.1.1 t2m -2.1 BsWfsElementP.1.1.2 ws_10min 3.0 BsWfsElementP.1.1.3 Pwg_10min 3.9 BsWfsElementP.1.1.4 wd_10min 34.0 BsWfsElementP.1.1.5 rh 95.0 BsWfsElementP.1.1.6 td< -2.7 BsWfsElementP.1.1.7 r_1h NaN BsWfsElementP.1.1.8 ri_10min NaN BsWfsElementP.1.1.9 snow_aws NaN BsWfsElementP.1.1.10 p_sea 971.4 BsWfsElementP.1.1.12 n_man 8.0 BsWfsElementP.1.1.13 wawa 71.0

Eli tuo BsWFSElementin viimeinen numero vaihtuu 1->13 saman Time arvon omaavien kanssa. Se on se mikä määrittelee mitä tietoa tulostetaan, lämpöä vai mitä. Kun koko litania on tulostettu, vaihtuu Time arvo, ja numerointi vaihtuu 1.1.1:stä -> 1.2.1 -> 1.2.13. Jotakuinkin näin: BsWfsElement.1.2.1 2024-11-17T02:17:00Z BsWfsElement.1.3.1 2024-11-17T02:18:00Z BsWfsElement.1.4.1 2024-11-17T02:19:00Z BsWfsElement.1.5.1 2024-11-17T02:20:00Z jne.. Viimeinen BsWfsElementin numerointi on 1.720.* BsWfsElement.1.1.1 -> 2024-11-17T02:16:00Z BsWfsElement.1.720.1 -> 2024-11-17T14:15:00Z Nopealla amismatikalla tuo siis antaa arvot 12h päähän MENNEISYYTEEN. Mikä taas tekee tämän ::simplen käytöstä käytännössä ainakin itselle turhaa, sillä tässä ollaan/oltiin kuitenkin tekemässä sääENNUSTUSTA. Tuolla saa kuitenkin kivasti kaivettua sen nykyisimmän wawa arvon, niin siinä mielessä "ihan hyödyllinen", joskaan en kyllä keksi mitä käyttöä 12h vanhalla säätiedolla on. Johonkin paikallissään arkistointiin tuo varmasti toimii oikein hyvin. En myöskään tiedä miten tuolla saa tuoreimman tiedon pelkästään, tuossa on kyllä parametri &timestep=, mutta jos siihen laittaa 0,1,2 tms, niin se tulostaa aikalailla kaikki. Minimiasetus taitaa olla 60 joka vastaa yhtä minuuttia. Jos taas laittaa 720, se tulostaa vanhimman tiedon. Mene ja tiedä. Jos vaikka halutaan säätietoja ivalosta ::observations::weather::simple&place=ivalo niin & merkin jälkeen nakkaa siihen mielikuvituksen mukaan näitä. parameters=temperature,wawa starttime=2024-11-13T00:00:00Z endtime=2024-11-14T00:00:00Z timestep=720 Esimerkiksi: https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::simple&place=ivalo¶meters=temperature,wawa×tep=720https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::simple&place=ivalo¶meters=temperature,wawa×tep=720 Tällä seuraavalla koodilla saat haettua _nykyhetken_ tiedot JSON tiedostoon. En jostain syystä saanut tuota tulostamaan esim: BsWfsElement.1.1. nykyhetki BsWfsElement.1.360. +6h BsWfsElement.1.720. +12h

$api_url = "https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::simple&place=Ivalo"; $vastaus = file_get_contents($api_url); $xml = new SimpleXMLElement($vastaus); $xml->registerXPathNamespace('BsWfs', $xml->getNamespaces(true)['BsWfs']); $elementit = $xml->xpath('//BsWfs:BsWfsElement[starts-with(@gml:id, "BsWfsElement.1.1.")]'); $data = []; $aikaleima = null; foreach ($elementit as $elementti) { $elementti->registerXPathNamespace('BsWfs', $xml->getNamespaces(true)['BsWfs']); $aikaleima = (string) $elementti->xpath('BsWfs:Time')[0]; $parametrin_nimi = (string) $elementti->xpath('BsWfs:ParameterName')[0]; $parametrin_arvo = (string) $elementti->xpath('BsWfs:ParameterValue')[0]; $data[$parametrin_nimi] = $parametrin_arvo; } header('Content-Type: application/json'); echo json_encode([ "aikaleima" => $aikaleima, "tiedot" => $data ]);

Tämä siis tulostaa /cache/ kansioon haetut tiedot JSON muotoon. Mikäli aiot jollekkin nettisivulle tai esim sovelluksessa käyttää tätä systeemiä, niin ERITTÄIN HYVÄ idea olisi myös lisätä tuohon joku laskuri, että suostuu hakemaan vain esim tunnin välein tietoa. Laita myös kansiolle CHMOD oikeuksiksi vaikka 700, tai 777 ihan sama ei kuulu mulle. Kaikille kaupungeille ei löydy kaikkea tietoa, esim Ivalo palauttaa wawa arvon mikä on weathersymbolin arvo, mutta helsingistä tuota tietoa ei saa ainakaan kirjoitushetkellä.

{ "aikaleima": "2024-11-17T05:20:00Z", "tiedot": { "t2m": "6.5", "ws_10min": "5.2", "wg_10min": "9.9", "wd_10min": "247.0", "rh": "66.0", "td": "0.6", "r_1h": "NaN", "ri_10min": "0.0", "snow_aws": "0.0", "p_sea": "982.2", "vis": "35600.0", "n_man": "1.0", "wawa": "71.0" } }

Ja tässä vielä selostukset. Voi olla, että olen väärässä näiden suhteen (ja varmasti olenkin), mutta suuntaa antavana tutkimustietona :D. Laitan vielä noiden jälkeen pari fmisid:iä, joka tarkoittaa mittauspaikkaa. Osa noista FMI:n sivuilla olevista vaati sen, mutta ei mulla ollu oikein käyttöä niille?

t2m: Lämpötila (°C). ws_10min: Tuulen nopeus (m/s). Pwg_10min: Maksimituulenpuuska (m/s). wd_10min: Tuulensuunta (°). rh: Ilmankosteus (%). td: Kastepiste (°C). r_1h: Sademäärä (mm/h). ri_10min: Sateen voimakkuus (mm/h). snow_aws: Lumensyvyys (cm). p_sea: Ilmanpaine (hPa). n_man: Pilvisyys (oktaa). wawa: WeatherSymbol / säähavaintokoodi 102005 Inari 102016 Kilpisjärvi 101920 Rovaniemi 126736 Kajaani 101485 Vaasa 101632 Joensuu 107383 Maarianhamina 132310 Helsinki


Noniin. USEAN päivän jälkeen tajusin viimein, että tulevien päivien sääsymbolien arvot saa kyselylä. Oisko helpommalla päässyt kun olisi lukenut käyttö-ohjeet ensin? Kenties. Mutta olisiko se ollut samanlainen tunteiden vuoristorata kuin tämä helvetin sääkanavan rakentaminen, tuskin. Voi ristuksen vittu sentään. ::forecast::harmonie::surface::point::multipointcoverage Tämä oli lopulta se rajapinta, mitä tarvittiin. Sikäli kyllä mielenkiintoista, että kun tuon avaa/purkaa ja tutkii mitä siellä on sisällä, niin ei mainintakaan WeatherSymbol3:sta, WaWa:sta saatika smartsymbolista. Vasta kun laittaa osoitteen loppuun itse parametriksi &SmartSymbol, palauttaa se sääsymbolien arvon. Palataan siihen myöhemmin. Sillä välin ihmetellään noita kahtakymmentä yhtä (21) muuta <gml:doubleOrNilReasonTupleList> arvoa. Lisäsin perään suomennokset, joskaan mulla ei suurimmilta osin ole mitään käsitystä mitä ne ovat, esim. geopotentiaalikorkeus, lolwut?

Pressure, GeopHeight, Temperature,DewPoint, Humidity, WindDirection, WindSpeedMS, WindUMS, WindVMS, Precipitation, Amount, TotalCloudCover, LowCloudCover, MediumCloudCover, HighCloudCover, RadiationGlobal, RadiationGlobalAccumulation, RadiationNetSurfaceLWAccumulation, RadiationNetSurfaceSWAccumulation, RadiationSWAccumulation, Visibility, WindGust Paine, geopotentiaalikorkeus, lämpötila, kastepiste, ilmankosteus, tuulen suunta, tuulen nopeus, tuulen itä-länsikomponentti, tuulen pohjois-eteläkomponentti, sademäärä, kokonaispilvisyys, matalan pilvisyyden peittävyys, keskipilvisyyden peittävyys, yläpilvisyyden peittävyys, kokonaissäteily, kokonaissäteilyn kertyminen, pitkäaaltoisen nettosäteilyn kertyminen maan pinnalla, lyhytaaltoisen nettosäteilyn kertyminen maan pinnalla, lyhytaaltoisen säteilyn kertyminen, näkyvyys, puuskanopeus

Näiden arvojen lukemat on sitten tulostettuna ylempänä listauksessa tuon <gml:doubleOrNilReasonTupleList> tagin alle. Seuraavan mallinen sarja löytyy sieltä 50 kertaa. 992.6 7.7 1.4 -0.4 85.9 318.0 2.47 1.64 -1.84 0.0 87.6 9.8 1.9 86.0 0.0 0.0 NaN 0.0 0.0 24378.1 4.1 Aikamääreet, tai miltä ajalta nuo tiedot löytyvät sitten <gmlcov:positions> listasta. Siellä on hirveä litania tekstiä tähän malliin 60.16952 24.93545 1731916800 60.16952 24.93545 1731920400 60.16952 24.93545 1731924000 Ensimmäinen numerosarja on kyselyn &place arvon koordinaatit, tässä tapauksessa Helsingin leveys ja pituusasteet. Toinen numerosarja määrittelee ajan sekunteina vuoden 1970 alusta "UNIX-AIKA" muodossa, koska miksipäs ei. "Anteeksi hyvä herra, kertoisitteko ajan? -Kernaasti, se on 1731916800. -Kiitos, hyvää päivän jatkoa Teille.". Esimerkiksi aikaleima 1731916800 vastaa 18. marraskuuta 2024 klo 08:00. Nyt kun tämä on selvää pässinlihaa voidaan mennä tutkimuksissa eteenpäin. Eli se taikatemppu miten Smartsymbolin saa tulostettua, on lisätä ::forecast::harmonie::surface::point::multipointcoverage arvon loppuun parametri &SmartSymbol. Aivan käsittämätöntä. Suora linkki kokeilemiseen http://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::forecast::harmonie::surface::point::multipointcoverage&place=Helsinki¶meters=SmartSymbol. Siellä keskitymme jälleen <gml:doubleOrNilReasonTupleList> tagin sisältöön. Tällä kertaa tuo tulostaa vain ja ainoastaan smartsymbolin viisikymmentä (50) kertaa, eli tästä hetkestä 50 tuntia eteenpäin.

<gml:doubleOrNilReasonTupleList> 1 1 6 6 7 4 101 104 104 104 102 101 101 102 104 107 137 137 107 107 106 107 147 6 2 1 1 1 1 1 104 107 104 102 107 107 107 158 157 106 107 107 107 107 107 147 158 58 48 59 </gml:doubleOrNilReasonTupleList>

Ja aikaisemman esimerkin mukaisesti kun käymme vilkaisemassa <gmlcov:positions> tagia, sieltä löytyy jälleen koordinaatit ja unix-aika. Listaan tähän alle selkeyttääkseni sitä prosessia. Eli jos xml syöte on jotakuinkin tämän näköinen

<gmlcov:positions> 60.16952 24.93545 1731916800 60.16952 24.93545 1731920400 60.16952 24.93545 1731924000 </gmlcov:positions> <gml:doubleOrNilReasonTupleList> 1 1 6 </gml:doubleOrNilReasonTupleList>

..niin voi nuo koordinaatit heivata suoraan nevadaan ja pyöritellä numeroita mielessään näin: 1731916800 1 -> 18.11 24 08:00 -> 1 1731920400 1 -> 18.11 24 09:00 -> 1 1731924000 6 -> 18.11 24 10:00 -> 6 18.11 2024 08:00 -> Selkeä sää 18.11 2024 09:00 -> Selkeä sää 18.11 2024 10:00 -> Enimmäkseen pilvistä Sääsymbolien arvot saa https://www.ilmatieteenlaitos.fi/latauspalvelun-pikaohje ihan sivuston lopusta. Sellainen sivumaininta vielä noihin smartsymboleihin, että numerot menee aikalailla nollasta johonki vajaaseen seitsemäänkymmeneen asti, mutta jos arvo onkin esim 103, se on vain arvon 3 yöarvo. Eli Jos auringon korkeus on alle 0°, lisää 100 SmartSymbol-arvoon. Esim. 1 -> 101. Kaipa tuon saa jotenkin fiksusti hoidettua koodilla, mutta koska en ole kovinkaan fiksu tapaus (varsinkin kun ottaa huomioon kauan mä tän paskan kanssa painin), niin voit käyttää tätä pohjana itsellesi. Saatpahan ainakin selitteet siihen kaupan päälle. Ps. kannattaa ladata githubista FMI:n avoimeen dataan kuuluva symbolipaketti. https://github.com/fmidev/opendata-resources/tree/master

const smartsymbols = { 1: { selite: "Selkeää", tiedosto: "1.svg" }, 101: { selite: "Selkeää", tiedosto: "1.svg" }, 2: { selite: "Enimmäkseen selkeää", tiedosto: "2.svg" }, 102: { selite: "Enimmäkseen selkeää", tiedosto: "2.svg" }, 4: { selite: "Osittain pilvistä", tiedosto: "4.svg" }, 104: { selite: "Osittain pilvistä", tiedosto: "4.svg" }, 6: { selite: "Enimmäkseen pilvistä", tiedosto: "6.svg" }, 106: { selite: "Enimmäkseen pilvistä", tiedosto: "6.svg" }, 7: { selite: "Pilvistä", tiedosto: "7.svg" }, 107: { selite: "Pilvistä", tiedosto: "7.svg" }, 9: { selite: "Sumuista", tiedosto: "9.svg" }, 109: { selite: "Sumuista", tiedosto: "9.svg" }, 71: { selite: "Erillisiä ukkoskuuroja", tiedosto: "71.svg" }, 171: { selite: "Erillisiä ukkoskuuroja", tiedosto: "71.svg" }, 74: { selite: "Haja-ukkoskuuroja", tiedosto: "74.svg" }, 174: { selite: "Haja-ukkoskuuroja", tiedosto: "74.svg" }, 77: { selite: "Ukkoskuuroja", tiedosto: "77.svg" }, 177: { selite: "Ukkoskuuroja", tiedosto: "77.svg" }, 21: { selite: "Erillisiä sadekuuroja", tiedosto: "21.svg" }, 121: { selite: "Erillisiä sadekuuroja", tiedosto: "21.svg" }, 24: { selite: "Hajasateita", tiedosto: "24.svg" }, 124: { selite: "Hajasateita", tiedosto: "24.svg" }, 27: { selite: "Sadetta", tiedosto: "27.svg" }, 127: { selite: "Sadetta", tiedosto: "27.svg" }, 11: { selite: "Tihkua", tiedosto: "11.svg" }, 111: { selite: "Tihkua", tiedosto: "11.svg" }, 14: { selite: "Pakastuva tihku", tiedosto: "14.svg" }, 114: { selite: "Pakastuva tihku", tiedosto: "14.svg" }, 17: { selite: "Pakastuva sade", tiedosto: "17.svg" }, 117: { selite: "Pakastuva sade", tiedosto: "17.svg" }, 31: { selite: "Kevyt sade", tiedosto: "31.svg" }, 131: { selite: "Kevyt sade", tiedosto: "31.svg" }, 34: { selite: "Kevyt sade", tiedosto: "34.svg" }, 134: { selite: "Kevyt sade", tiedosto: "34.svg" }, 37: { selite: "Kevyt sade", tiedosto: "37.svg" }, 137: { selite: "Kevyt sade", tiedosto: "37.svg" }, 32: { selite: "Kohtalainen sade", tiedosto: "32.svg" }, 132: { selite: "Kohtalainen sade", tiedosto: "32.svg" }, 35: { selite: "Kohtalainen sade", tiedosto: "35.svg" }, 135: { selite: "Kohtalainen sade", tiedosto: "35.svg" }, 38: { selite: "Kohtalainen sade", tiedosto: "38.svg" }, 138: { selite: "Kohtalainen sade", tiedosto: "38.svg" }, 33: { selite: "Vahva sade", tiedosto: "33.svg" }, 133: { selite: "Vahva sade", tiedosto: "33.svg" }, 36: { selite: "Vahva sade", tiedosto: "36.svg" }, 136: { selite: "Vahva sade", tiedosto: "36.svg" }, 39: { selite: "Vahva sade", tiedosto: "39.svg" }, 139: { selite: "Vahva sade", tiedosto: "39.svg" }, 41: { selite: "Erillisiä kevyitä räntäsateita", tiedosto: "41.svg" }, 141: { selite: "Erillisiä kevyitä räntäsateita", tiedosto: "41.svg" }, 44: { selite: "Haja-kevyitä räntäsateita", tiedosto: "44.svg" }, 144: { selite: "Haja-kevyitä räntäsateita", tiedosto: "44.svg" }, 47: { selite: "Kevyttä räntää", tiedosto: "47.svg" }, 147: { selite: "Kevyttä räntää", tiedosto: "47.svg" }, 42: { selite: "Erillisiä kohtalaisia räntäsateita", tiedosto: "42.svg" }, 142: { selite: "Erillisiä kohtalaisia räntäsateita", tiedosto: "42.svg" }, 45: { selite: "Haja-kohtalaisia räntäsateita", tiedosto: "45.svg" }, 145: { selite: "Haja-kohtalaisia räntäsateita", tiedosto: "45.svg" }, 48: { selite: "Kohtalaista räntää", tiedosto: "48.svg" }, 148: { selite: "Kohtalaista räntää", tiedosto: "48.svg" }, 43: { selite: "Erillisiä vahvoja räntäsateita", tiedosto: "43.svg" }, 143: { selite: "Erillisiä vahvoja räntäsateita", tiedosto: "43.svg" }, 46: { selite: "Haja-vahvoja räntäsateita", tiedosto: "46.svg" }, 146: { selite: "Haja-vahvoja räntäsateita", tiedosto: "46.svg" }, 49: { selite: "Vahvaa räntää", tiedosto: "49.svg" }, 149: { selite: "Vahvaa räntää", tiedosto: "49.svg" }, 51: { selite: "Erillisiä kevyitä lumisateita", tiedosto: "51.svg" }, 151: { selite: "Erillisiä kevyitä lumisateita", tiedosto: "51.svg" }, 54: { selite: "Haja-kevyitä lumisateita", tiedosto: "54.svg" }, 154: { selite: "Haja-kevyitä lumisateita", tiedosto: "54.svg" }, 57: { selite: "Kevyttä lumisateita", tiedosto: "57.svg" }, 157: { selite: "Kevyttä lumisateita", tiedosto: "57.svg" }, 52: { selite: "Erillisiä kohtalaisia lumisateita", tiedosto: "52.svg" }, 152: { selite: "Erillisiä kohtalaisia lumisateita", tiedosto: "52.svg" }, 55: { selite: "Haja-kohtalaisia lumisateita", tiedosto: "55.svg" }, 155: { selite: "Haja-kohtalaisia lumisateita", tiedosto: "55.svg" }, 58: { selite: "Kohtalaista lumisateita", tiedosto: "58.svg" }, 158: { selite: "Kohtalaista lumisateita", tiedosto: "58.svg" }, 53: { selite: "Erillisiä vahvoja lumisateita", tiedosto: "53.svg" }, 153: { selite: "Erillisiä vahvoja lumisateita", tiedosto: "53.svg" }, 56: { selite: "Haja-vahvoja lumisateita", tiedosto: "56.svg" }, 156: { selite: "Haja-vahvoja lumisateita", tiedosto: "56.svg" }, 59: { selite: "Vahvaa lumisateita", tiedosto: "59.svg" }, 159: { selite: "Vahvaa lumisateita", tiedosto: "59.svg" }, 61: { selite: "Erillisiä rakeita", tiedosto: "61.svg" }, 161: { selite: "Erillisiä rakeita", tiedosto: "61.svg" }, 64: { selite: "Haja-rakeita", tiedosto: "64.svg" }, 164: { selite: "Haja-rakeita", tiedosto: "64.svg" }, 67: { selite: "Rakeita", tiedosto: "67.svg" }, 167: { selite: "Rakeita", tiedosto: "67.svg" } };

Vittu mikä persereikä sivusto. En suosittele kenellekkään.

11/11/2024 - Vaporwave maniat jatkuu

En tiedä mitä on oikein tapahtunut. Ihan jotenkin mystisesti ollut virtaa ja mielenkiintoa naputella näitä paskasivuja. Eihän tässä siis mitään mullistavaa tai ainutlaatuista ole tehty, mutta ihan fiiliksissä oon esimerkiksi noita homer skenaarioita duunaillu. Tällä hetkellä niitä on k... Lue lisää..

19/10/2024 - sieni.us taas pystyssä

Tein silleen tyhmästi että päivitin sieni.us tälle vuosikymmenelle. Viimeisestä "kunnon" päivityksestä olikin melkein 12 vuotta ja silloinkin päivitin vain infoboksin ja laitoin sivuille js-ohjaimet nuolinäppäimille. Sekin päivitys odotteli viisi vuotta, joten voidaan ehkä tulla siihen ... Lue lisää..

14/10/2024 - etusivu uusiksi!

sudo fail2ban-client status sshd

|- Filter | |- Currently failed: 1 | |- Total failed: 44571 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 9787 `- Bann... Lue lisää..

01/09/2024 - kiinalaiset kävi kylässä

Jäänyt nyt kyllä vähän suunniteltua vähemmälle tän kanssa touhuuminen. Ei sillä että tätä kukaan muu kuin minä itse lukisin, mutta pitkään oli semmoiset fiilikset että tänne tulee ihan vaan tylsyyteen raaputeltua kaikenlaista. Kirjauduin kuitenkin eilen shelliin ku piti akuutit irk... Lue lisää..

21/06/2024 - pajuprojekti

Kemijärvellä kynittyjen pajujen muistolle. Kempassa tuli tuhottua pajuja sen verta, että ihan jäin ihmettelemään kuinka hienosti tuo ylisuuri rikkaruoho oikein leviää ja juurtuu. Nyt keravalle palattuani päätin tosta pihan läheltä käydä napsia paria pistokasta ja katson juurtuuko lasi... Lue lisää..

21/05/2024 - kemijärvellä

Se aika vuodesta on taas täällä! – Ja ei, en suinkaan puhu joulusta, vaan suomen kesästä. Siitä ajasta jolloin aurinko paistaa niin julmetusti, että omalla pihalla on aina viisi celsius astetta lämpimämpää kuin naapurilla. Linnut laulavat, juopot heräävät talviuniltaan ja einesosasto... Lue lisää..

04/05/2024 - magneettikalastus

Noniin, nyt on jälleen maailmankirjat sen verta sekaisin, että päätin lähteä kokeilemaan magneettikalastusta toiseen kertaan. Viime kerralla mulla oli matkassa marketin vahvin magneetti ja se jäi ensimmäisellä heitolla kiinni johonkin helvetin raskaaseen esineeseen enkä saanut magneettia e... Lue lisää..

03/05/2024 - läpimurto!

Muutama sananen sivuston mekaniikasta. Pitkän ja verisen taistelun jälkeen jouduin tyytymään kompromisseihin tämän sivun suhteen. Alunperin sivuston ideana olisi ollut, että kaikki sisältö latautuu tälle samaiselle sivulle ilman että osoiterivi vie minnekään muualle (ammattitermi liene... Lue lisää..

21/04/2024 - #php/html/css

Nyt on melko pahat tilanteet päällä, oon meinaan jostain syystä lähiaikoina pyöritellyt mun hyvin rajallisella vapaa-ajalla joitain rivejä PHP:tä, CSS:ää ja HTML:ää. Viime kerrasta on jo kuitenkin jokunen tovi vierähtäny (puhutaan varmaan jo kymmenestä vuodesta), joten pientä hakemis... Lue lisää..

17/04/2024 - mukavaa keskiviikkoa kaikille

Oikein mukavaa keskiviikkoa kaikille ja koittakaa jaksaa ja. Eiköhän se siitä sitten taas mukavasti mee kun keksitte, keksitte hyvää tekemistä nii eiköhän sillä sillä sitten mee mukavasti tämäkin keskiviikko. Mutta, nyt. Näihin kuviin ja näihin tunnelmiin. Pidä lippu korkeella ja tank... Lue lisää..

01/04/2024 - kallio

Annan nyt viimeisen avautumisen Helsingin Kalliosta ennen kuin muutan viikon päästä pois tästä perslävestä. En vastaa tunnistuskysymyksiin. En vastaa itseasiassa enää mihinkään koska en halua enää käsitellä asiaa. Oon tosiaan asnutu ympäri ämpäri kantakaupinkia aina 1980 luvun alus... Lue lisää..

17/11/2024 - Ilmatieteenlaitoksen avoin data / FMI API