ASIO CARE · pro vývojáře

Datové API

Jen čtení: historie měření i živá data z čistíren, ke kterým máte klíč. Klíč vydává ASIO. Adresa: https://care.2-31-0-50.sslip.io/api/v1

Přihlášení klíčem

Každý dotaz posílá hlavičku Authorization: Bearer care_…. Klíč držte mimo kód a git (proměnná prostředí, správce hesel). Klíč má datum platnosti a ASIO ho může kdykoli zrušit. Po 5 pokusech s neexistujícím klíčem z jedné adresy se ta adresa na hodinu zablokuje (vypršelý nebo zrušený klíč dostane jen 401).

Dotazy

GET /sitesčistírny, ke kterým klíč patří
GET /sites/{site}/tagsseznam čidel: kód, název, jednotka, místo, druh (analog, bit, counter), u bitů texty stavů 0|1
GET /sites/{site}/latest?tags=…poslední hodnota každého čidla
GET /sites/{site}/data?tags=…&start=…&end=…&resolution=raw|1m|1h&format=csv|ndjson historie. Bez tags všechna čidla, bez start posledních 24 h. Řádky jsou seřazené podle čidla, pak podle času.
GET /sites/{site}/stream?tags=…živá data (Server-Sent Events): událost reading pro každé nové měření, každých ~10 s; : ping každých 15 s. Po výpadku spojení doplňte mezeru z /data.

Data

Příklad v Pythonu

Potřebuje requests a pandas. Klíč v proměnné prostředí CARE_API_KEY.

import io, json, os
import pandas as pd
import requests

BASE = "https://care.2-31-0-50.sslip.io/api/v1"
SITE = "pritluky-vav1"
H = {"Authorization": f"Bearer {os.environ['CARE_API_KEY']}"}

# seznam čidel
tags = pd.DataFrame(requests.get(f"{BASE}/sites/{SITE}/tags", headers=H, timeout=30).json()["tags"])

# historie po dnech (raw = každé měření)
def history(tags, day_from, day_to, resolution="raw"):
    parts = []
    for day in pd.date_range(day_from, day_to, freq="D", inclusive="left", tz="UTC"):
        r = requests.get(f"{BASE}/sites/{SITE}/data", headers=H, timeout=300, params={
            "tags": ",".join(tags), "resolution": resolution,
            "start": day.isoformat(), "end": (day + pd.Timedelta(days=1)).isoformat()})
        r.raise_for_status()
        parts.append(pd.read_csv(io.StringIO(r.text), parse_dates=["time"]))
    return pd.concat(parts, ignore_index=True)

df = history(["QIC99", "QIC63", "QIC64", "FIC70", "AT1_BlowerRun"], "2026-11-02", "2026-11-04")
ok = df[df["quality"] == "ok"]
wide = ok.pivot_table(index="time", columns="tag", values="value")   # čas × čidla

# živá data: každé nové měření, jak přijde
with requests.get(f"{BASE}/sites/{SITE}/stream", headers=H, stream=True,
                  params={"tags": "QIC99,QIC63,FIC70"}, timeout=(10, 60)) as r:
    r.raise_for_status()
    event = None
    for line in r.iter_lines(decode_unicode=True):
        if line.startswith("event: "):
            event = line[7:]
        elif line.startswith("data: ") and event == "reading":
            x = json.loads(line[6:])
            print(x["time"], x["tag"], x["value"], x["quality"])

Rychlá zkouška z příkazové řádky: curl -H "Authorization: Bearer $CARE_API_KEY" https://care.2-31-0-50.sslip.io/api/v1/sites

Chyby

401 chybí nebo neplatný klíč · 404 čistírna nebo čidlo, ke kterému klíč nemá přístup · 400 špatný parametr nebo moc dat najednou (zpráva řekne, kolik smíte) · 429 moc dotazů, zkuste za chvíli.