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}/tags | seznam č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
- Čas je UTC: sloupec
time(ISO 8601) ats(Unix sekundy).start/endpřijímají obojí; čas bez zóny je UTC. - raw = každé měření (po 10 s) se sloupci
value,quality. Stavy pohonů (bity) se ukládají při změně a aspoň jednou za minutu. - quality:
ok;stuck= analogová hodnota se 10 minut nezměnila (sonda nejspíš stojí), hodnota je prázdná;missing/error= čtení z PLC se nepovedlo. Pro trénování modelů berte jenok. - 1m, 1h = průměry se sloupci
avg,min,max,n(počet dobrých měření). - Jak dlouho se drží: každé měření 30 dní, minutové průměry 1 rok, hodinové napořád. Chcete-li surová data dlouhodobě, stahujte je průběžně.
- Limity: 120 dotazů za minutu na klíč, nejvýš 3 živá spojení a 2 stahování
/datanajednou na klíč, jeden dotaz/datanejvýš 2 miliony řádků (všechna čidla ≈ 1 den raw, 3 čidla ≈ 2 měsíce). Větší rozsah stahujte po dnech.
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.