Uutiset:

Ei uusia uutisia.

Main Menu

Säädataa haussa

Aloittaja Mr, perjantai, 19.01.2024, 21:19

« edellinen - seuraava »

0 Jäsenet ja 3 Vieraat katselee tätä aihetta.

Mr

Mikä olisi hyvä lähde säätietojen automaattiselle noudolle? Eli tarvittaisiin lämpötila, kosteus, ilmanpaine ja mahdollisesti vielä jotain muutakin. Tähän saakka oma sääasema on noita tietoja kerännyt ja tietokantaan tallentanut. Kotiverkossa on WiFin perässä säänäyttöjä, jotka esittävät tietoja minuutin päivitysvälillä. Kun omaa sääasemaa ei enää ole, olisi tarkoitus noutaa tietokantaan jostain netistä kunnollista dataa annettuun sijaintiin perustuen. Päivitysväli saisi mieluusti olla alle tunnin, mutta paremman puutteessa tuntikin menee. Tieto xml/json/txt tms. muodossa. Met.no ainakin näyttää jotain dataa tarjoavan, vaikkakin ennusteena. Saako jostain kelikamerasta dataa kyseltyä?


Mr

Kiitos! Tuoltahan niitä löytyi. Jostain syystä löytämäni linkit veivät veivät niille kelikamerakuville, eivät datoille. Mutta nyt pääsee jo hyvin eteenpäin.


Mr

Joo, tuota on nyt kokeiltu ja ongelmaksi tuli aluksi palvelun palauttama gzipattu json-tiedosto. Selain osaa sen kyllä purkaa automaattisesti selkokiellelle, mutta ohjelmallisesti meni vähän monimutkaisemmaksi. Lopulta päädyin helppoon ratkaisuun, eli Raspi hakee tiedoston ajastettuna Curl-komennolla purkaen sen tekstiksi ja tallentaa windows koneelle. Windowsissa ohjelma tallentaa tiedoston MySQL palvelimelle JSON-datatyypiksi ja sieltä SQL kysely  halutusta arvosta onnistuu helposti

weatherc

#5
Ikinä ei ole ollut mitään sellaista ongelmaa, jsonit aina olleet suoraan "luettavissa".

Php:ssä tuo hoitaa homman, tekee siitä arrayn josta helppo napsia haluttu data:
json_decode()

$data = json_decode($data,true);

foreach ($data["stations"] as $key => $value) {


}

MUOKS:

Tuli mieleen, mitkä asetukset sullaon curlissa?

Tuossa nuo omat juuri noita tiesäitä hakevasta häkkyrästä.
En nyt tarkkaan muista mutta sellainen muistikuva jostain datahausta olisi että nuo headerit voi olla ratkaiseva tekijä siinä että missä muodossa palvelin palauttaa filun.

  $headers = [
      'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0',
      'Accept-Encoding: gzip, deflate'
  ];
  curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt ($ch, CURLOPT_ENCODING, '');
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch, CURLOPT_TIMEOUT,10);
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);

Vinkkinä niin nuo timeoutit kannaattaa myös laittaa. Jos joku haku jää surraamaan maailman tappiin asti niin tulee äkkiä noottia tai banaania. :P  Varsinkin jos kyseessä automaattisesti ajastuksella haettu niin vaikkapa vuositasolla mahtuu aika nippu syystä tai toisesta epäonnistunutta hakua.

Mr

Alkujaan yritin ladata data ohjelmallisesti Windows Socketin avulla ja se kyllä onnistui, kun headerissa oli 'Accept-Encoding: gzip, deflate'. Ilman sitä tuli virheilmoitus "Not Acceptable", eli palvelin ei suostunut palauttamaan dataa selkokielellä, Kun sitten header oli asetettu, niin data tuli gzipattuna, mutta sen avaaminen ei taas ollutkaan niin yksinkertaista. Nopeammin pääsi maaliin Raspin Curl-komennolla
curl --compressed --output tiesaa_xxxx.json "https://tie.digitraffic.fi/api/weather/v1/stations/xxxx/data"xxxx on halutun aseman id ja tuo "--compressed" valinta purkaa sen paketin selkokielle, ilman sitä on taas gzippi. Mitään muita header-asetuksia ei tullut asetettua, mutta pitää nuo timeoutit kyllä lisätä. Crontab ajaa komennon kolmen minuutin välein, kun palvelimen data päivittyy viiden minuutin välein. Toistaiseksi Raspi on toiminut ilman ongelmia. Windows koneessa TaskScheduler ajaa purkuohjelman kahden minuutin välein ja aina kun data on muuttunut, purkaa sen atomeiksi ja tallentaa mysliin.

khyron

Shelli scripti joka tulostaa lämpötilan, curliin varmaan on syytä laittaa joku quiet vipu päälle ettei se tulosta mitään. Toi jq pitää varmaan erikseen asentaa "sudo apt install jq"
#!/bin/sh
curl --compressed --output tiesaa_1001.json "https://tie.digitraffic.fi/api/weather/v1/stations/1001/data"
jq '.sensorValues | .[] | if .id == 1 then .value else empty end' tiesaa_1001.json

Chatgpt tarjos seuraavaa python koodia kunnen ite jaksanu naputella.
import requests

url = "https://tie.digitraffic.fi/api/weather/v1/stations/1001/data"

# Fetching JSON data from the URL
response = requests.get(url)
data = response.json()

# Iterating through sensorValues array and finding the entry with id==1
for sensor_value in data["sensorValues"]:
    if sensor_value["id"] == 1:
        # Printing the value
        print("Value from sensor with id 1:", sensor_value["value"])
        break  # Stop the loop once the desired entry is found


Toimii, vaatii toki requests kirjaston.
python3 -m venv ven
Asentaa python virtuaaliympäristön hakemistoon venv.
venv/bin/pip install requests
Asentaa requests kirjaston
venv/bin/python hae_1001_lampotila.py
Käynnistää python scriptin.

Voin kyllä suositella chatgpt:tä ja muita tekoälyjä pienten scriptien tekemiseen, niillä pääsee vähintään alkuun.

Molempiin pitäs olla kohtuu helppoa lisätä insertointi kantaan jos sitä kaipaa.

weatherc

Laita sinne croniin seuraava pätkä siihen kyseisen ajatuksen loppuun niin pysyy hiljasena ;)
>/dev/null 2>&1
eli tyyliin

*/3 * * * *  pi php /home/pi/hakkyra.php >/dev/null 2>&1
Itse en ole kovin paljoo noita purkanut bashilla vaan usemmiten mennyt sitä helppoa tietä eli php:llä. Ihan kelpo kieli sekin kaikenlaiseen puuhasteluun :)
Kaikenlaiseen muuhun on kyllä yullut bashia käytettyä.
Google on myös hyvä apuri näissä hommissa, turhaan on itse raapia hiukset päästä jos G tarjoo ratkaisun :P 


khyron

Googlessa ja tekoälyissä on se aika selkee ero että tekoäly vastaa juuri siihen sun kysymykseen, google antaa linkin jonkun muun vastaukseen joka ehkä on tai ole sama mitä sun.