<aside> 💡 Všechna data ze senzoru jsou uložena v archivu na stránce http://archive.sensor.community podle data. Číslo senzoru najdete podle ID z mapy. Jeden senzor se skládá většinou ze dvou senzorů - jeden pro PM částice a druhý pro teplotu a vlhkost. Pokud potřebujete průběh např. teploty místo výchozí PM, změňte vrstvu na teplotní a klikněte na senzor ukazující teplotu. ID jednoho senzoru jsou typicky hned vedle sebe, např. senzor PM: 73632 a senzor teploty a vlhkosti: 73633

</aside>

<aside> ❗ Prosím nezatěžujte archiv příliš častými opakujícími dotazy, vždy se ujistěte, že data která stahujete opravdu potřebujete pro vaši práci. Je to obrovská databáze obsahující miliardy měření spravovaná dobrovolníky ve svém volném čase, chovejte se k ní proto slušně.

</aside>

Jednoduché stažení souboru

Data z archivu ze svého senzoru si můžete stáhnout přímo z archivu ve formátu .csv pro jednotlivé dny. Např.:

PM částice: archive.sensor.community/2024-04-01/2024-04-01_sds011_sensor_73632.csv

teplota: http://archive.sensor.community/2024-04-01/2024-04-01_bme280_sensor_73633.csv

Vypsání dat ze senzoru na obrazovku

Pro vypsání dat z jednoho, nebo vícero senzorů můžete využít jednoduchý python kód, který vám vypíše měření z jednoho, nebo více senzorů naměřené v jednom nebo více dní. Platí pouze pro aktuální rok, pro historická data z minulých let by se kód musel trochu upravit:

import requests
#vložte ID senzorů do tabulky oddělené čárkami, ID najdete např. na mapě
sensor_id = [73737,73632,73015]
#vložte požadovaná data do tabulky ve formátu 'RRRR-MM-DD' oddělené čárkami
dates = ['2024-03-30','2024-03-31','2024-04-01']
url_deb = '<https://archive.sensor.community/>'
for n1 in range(0,len(dates)):
    date = dates[n1]
    url_ok = url_deb + date
    r1 = requests.get(url_ok)
    source_code = r1.text

    for n2 in range(0,len(sensor_id)):
        test = 'sensor_'+str(sensor_id[n2])+'.csv'

        if test in source_code:
            split1 = source_code.split(test)[0]
            split2 = split1.split('<a href="')[-1]
            url_fin = url_ok + '/' + split2 + test
            r2 = requests.get(url_fin)
            data = r2.text
            #data ze senzorů se zobrazí v terminálu
            print(data)

credit: JPGueno

Stažení měření do jednoho sloučeného souboru

Zde je složitější kód, který vypíše požadovaný senzor (nebo senzory) do jednoho sloučeného .csv souboru. Tady už můžeme analyzovat i předešlé roky. Kód obsahuje 2* opakování stažení souboru pokud se vyskytne chyba.

import requests
from datetime import datetime, timedelta
import time

# Sensor IDs
sensor_id = [73632]

# Date range
start_date = '2024-03-30'
end_date = '2024-04-01'

# Function to generate date range
def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days) + 1):
        yield start_date + timedelta(n)

start_date = datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.strptime(end_date, "%Y-%m-%d")

# Base URL
url_deb = '<https://archive.sensor.community/>'

# Retry settings
max_retries = 2
retry_delay = 10  # seconds

for sensor in sensor_id:
    with open(f'sensor_{sensor}_combined.csv', 'wb') as combined_file:
        for single_date in daterange(start_date, end_date):
            date_str = single_date.strftime("%Y-%m-%d")
            url_ok = url_deb + date_str
            attempts = 0

            while attempts < max_retries:
                try:
                    r1 = requests.get(url_ok)
                    r1.raise_for_status()
                    source_code = r1.text

                    file_name = f'sensor_{sensor}.csv'
                    if file_name in source_code:
                        split1 = source_code.split(file_name)[0]
                        split2 = split1.split('<a href="')[-1]
                        url_fin = url_ok + '/' + split2 + file_name

                        r2 = requests.get(url_fin)
                        r2.raise_for_status()
                        combined_file.write(r2.content)

                        print(f'Appended data for {date_str} to {file_name}')
                        break
                except requests.exceptions.RequestException as e:
                    attempts += 1
                    print(f'Attempt {attempts} failed for {date_str}: {e}')
                    time.sleep(retry_delay)

            if attempts == max_retries:
                print(f'Failed to download data for {date_str} after {max_retries} attempts.')

Jak dále s daty pracovat? Koukněte na Vizualizace a analýza dat.