# Oura na hodinkách: návod pro AI agenta > Zdroj: https://ongy.cz/pages/homeassistant/oura/ > Autor: Ongy (ongy.cz). Oura nemá appku pro hodinky a Samsung Health spánek z Oury nespolehlivě ztrácel. Tak jsem si ji napsal: připravenost, spánek, tělo v noci a trendy na Galaxy Watch, data z Home Assistanta doma i venku. ## Pro agenta Pomoz uživateli postavit vlastní verzi tohohle projektu. Nejdřív se ho zeptej na vybavení a na to, co z požadavků už má. Pak postupuj po krocích a po každém kroku s ním ověř, že funguje, než půjdeš dál. Hodnoty v `` doplň s uživatelem, nikdy si nevymýšlej adresy, hesla ani tokeny. Kód autora není veřejný: tohle je popis řešení, ne repozitář ke stažení. ## Cíl Vlastní appka pro hodinky s Wear OS, která ukazuje data z prstenu Oura: připravenost, spánek, tělo v noci, aktivitu a trendy za týden, plus dlaždici a komplikace na ciferník. Data nebere z Oura API, ale z Home Assistanta, kde už běží oficiální integrace Oura. Doma přes domácí síť, venku přes VPN v telefonu. ## K čemu to je Oura appku v telefonu otevřu až po snídani. Na hodinkách vidím hned po probuzení tři kroužky: připravenost, spánek a aktivitu. Podle nich poznám, jestli mám den brát zlehka. Klepnutím se dostanu do detailu: spánek s fázemi, co ovlivnilo připravenost, tělo v noci (tep, HRV, dech, teplota), stres a aktivita a trendy za týden. Vedle ciferníku je dlaždice a přímo na ciferníku tři komplikace. Když teplota a klidový tep několik nocí po sobě vylezou nahoru, appka ukáže „Tělo bojuje · den N“. Tuhle funkci jsem dopsal v den, kdy jsem ležel nemocný a chtěl vědět, jestli se to lepší. ## Proč právě takhle Nejdřív jsem zkusil oficiální cestu: Oura zapisuje spánek do Health Connect a Samsung Health si ho odtamtud má vzít. Některé noci ale tiše vynechal, přestože v Health Connect byly. Home Assistant data z Oury už má přes integraci a dostanu se k němu doma i venku. Místo boje se Samsung Health tak hodinky čtou přímo z něj. V hodinkách není přihlášení k Oura účtu, jen vlastní token do Home Assistanta, který jde kdykoli zrušit. ## Jak to funguje - **Prsten do cloudu, cloud do Home Assistanta.** Oura Ring se synchronizuje přes telefon do Oura cloudu, odkud si oficiální integrace Home Assistanta stahuje zhruba osmdesát hodnot. - **Jeden dotaz na všechno.** Hodinky pošlou Home Assistantu šablonu, která vrátí všechny hodnoty najednou. Druhý dotaz stáhne historii za sedm dní na trendy. - **Doma i venku.** Nejdřív zkusí domácí síť, když neodpoví, jdou přes VPN v telefonu. Pamatují si, co naposledy fungovalo. - **Funguje i bez signálu.** Poslední data drží hodinky u sebe a ukážou, z kolika hodin jsou. Dlaždice a komplikace sdílí stejná data a do deseti minut se znovu neptají. - **Ve stylu Oury.** Tmavá noční modrá, tenké kroužky a barva jen tam, kde něco znamená: mátová optimální, bílá dobrá, korálová pozor. ## Stack a tok dat - **Hodinky:** Galaxy Watch9 s Wear OS. Kotlin, Jetpack Compose for Wear OS, navigace přejetím zpět, posouvání lunetou. Dlaždice přes Tiles a ProtoLayout, komplikace přes Complications Data Source. - **Data:** Oficiální integrace Oura v Home Assistantu. Hodinky volají POST na šablonové API (všechny hodnoty z Oury plus odvozené jako jeden JSON) a GET na historii s obdobím sedmi dní pro trendy a počítání dní nemoci. - **Síť:** Nejdřív adresa v domácí síti, když neodpoví, adresa přes Tailscale. Venku jdou hodinky přes telefon, který je trvale ve VPN. Poslední fungující adresa se pamatuje. - **Paměť:** Poslední odpověď a historie v SharedPreferences. Dlaždice (obnova 30 min) a komplikace ji sdílí, do 10 minut se znovu neptají. Offline appka ukáže, z kolika hodin data jsou. - **Build:** Bez Android Studia: JDK 17, Android SDK command-line tools a Gradle. Instalace do hodinek přes ADB po Wi-Fi. ## Obrazovky | Obrazovka | Co ukazuje | |---|---| | Dnes | tři kroužky, varování Tělo bojuje, baterie prstenu, rozcestník | | Připravenost | skóre a hodnocení, teplota, trend 7 dní, 8 přispěvatelů | | Spánek | skóre, délka a čas, fáze, efektivita, usínání, trendy, 7 přispěvatelů | | Tělo v noci | karta Nemoc · den N, nejnižší a průměrný tep, HRV, SpO₂, dech, trendy | | Aktivita a stres | skóre aktivity nebo Klid, stres a zotavení, kroky, kalorie | | Trendy | týden připravenosti, spánku, HRV, tepu a teploty proti průměru | Barvy: mátová optimální (85 a víc), bílá dobrá (70 až 84), korálová pozor (pod 70). Každé skóre nese barvu i slovo. ## Pasti a jejich řešení Historie z Home Assistanta bez parametru konce vrátí jen jeden den. Průměrný tep z integrace Oura je denní, tep ve spánku má vlastní senzory. Režim klidu se v Home Assistantu neprojeví, pozná se podle nulového skóre aktivity. Samsung ciferník ukazuje nadpis komplikace místo ikony. Příznak, že se komplikace nemá ukazovat na zamčených hodinkách, Samsung ciferník zatím ignoruje. Hodinky po zhasnutí vypínají Wi-Fi a mění port pro ladění. Spárování ADB musí potvrdit člověk na hodinkách, kód zmizí dřív, než ho agent stihne opsat. ## Co budeš potřebovat - Hodinky s Wear OS 4 nebo novějším (autor: Galaxy Watch9, kulatý displej 480 × 480). - Prsten Oura a Home Assistant s nastavenou oficiální integrací Oura. - Dlouhodobý přístupový token Home Assistanta ``, ideálně samostatný jen pro hodinky. - Počítač s JDK 17, Android SDK (command-line tools stačí) a Gradle. Android Studio není nutné. - Volitelně pro přístup zvenku: VPN (autor: Tailscale) na telefonu, ke kterému jsou hodinky připojené. ## Postup ### 1. Ověř data v Home Assistantu Najdi entity integrace Oura (skóre připravenosti, spánku a aktivity, délka a fáze spánku, tep a HRV ve spánku, odchylka teploty, baterie prstenu). Pozor: průměrný tep integrace je denní průměr, tep ve spánku má samostatné senzory. Ověř `curl -H "Authorization: Bearer " /api/states` a vyber entity s rozumnými hodnotami. ### 2. Jeden dotaz na aktuální data Místo desítek dotazů na jednotlivé entity pošli `POST /api/template` se šablonou, která vrátí JSON se všemi potřebnými hodnotami najednou. Šablonu drž v appce jako konstantu, výsledek parsuj jako JSON. ### 3. Historie pro trendy Pro trendy `GET /api/history/period/?end_time=&filter_entity_id=&minimal_response&no_attributes`. Bez `end_time` vrátí jen jeden den. Z historie vezmi jednu hodnotu na den. ### 4. Projekt pro Wear OS Kotlin, Jetpack Compose for Wear OS, navigace přes SwipeDismissableNavHost. Adresu a token dej do `local.properties` (necommitovat) a přes BuildConfig do appky. V network security config povol HTTP jen pro domácí adresy, pokud Home Assistant nemá HTTPS. ### 5. Adresy a paměť Zkus nejdřív adresu v domácí síti s krátkým timeoutem, pak adresu přes VPN, a zapamatuj si, která naposledy fungovala. Poslední odpověď ulož (SharedPreferences) a zobraz ji offline s časem, kdy data přišla. ### 6. Obrazovky Úvod se třemi kroužky a rozcestníkem, detaily připravenosti, spánku, těla v noci, aktivity a trendů. Na kulatém displeji použij ScalingLazyColumn s `initialCenterItemIndex = 0` a `autoCentering = null` a horní odsazení, jinak první položka zaleze pod hodiny. Texty centruj. ### 7. Dlaždice a komplikace Dlaždice přes Tiles a ProtoLayout s obnovou zhruba po 30 minutách. Komplikace přes Complications Data Source (RANGED_VALUE a SHORT_TEXT s monochromatickou ikonou). Obojí ať čte stejnou uloženou odpověď a ptá se Home Assistanta, jen když je starší než 10 minut. ### 8. Instalace do hodinek Na hodinkách zapni Možnosti vývojáře a Ladění přes Wi-Fi. Spárování `adb pair` udělá uživatel sám (kód na hodinkách brzy zmizí). Pak `adb connect :`, `gradle assembleDebug` a `adb install -r app/build/outputs/apk/debug/app-debug.apk`. ## Na co si dát pozor - Historie z Home Assistanta bez `end_time` vrátí jen jeden den od začátku období. - Průměrný tep z integrace Oura je denní průměr, ne noční. Pro spánek použij senzory tepu ve spánku. - Režim klidu Oury se v Home Assistantu nemusí projevit, pozná se podle skóre aktivity 0. Ukaž místo nuly slovo Klid. - Samsung ciferník zobrazí u komplikace nadpis místo ikony. Když chceš ikonu, nadpis nevyplňuj. - Hodinky po zhasnutí vypínají Wi-Fi a port pro ladění se změní. Při ladění je nech na nabíječce, nový port najdeš přes `adb mdns services`. - Když jsou hodinky zamčené, klepnutí přes ADB jdou do zámku. Na screenshoty `svc power stayon true`, po focení zase `false`. ## Jak ověřit, že to funguje - [ ] `POST /api/template` s tvou šablonou vrátí platný JSON se všemi hodnotami. - [ ] Dotaz na historii vrátí sedm dní, ne jeden. - [ ] Appka na hodinkách ukáže tři skóre a sedí s Oura appkou v telefonu. - [ ] Bez domácí Wi-Fi (jen přes telefon a VPN) se data načtou. - [ ] V režimu letadlo appka ukáže poslední data s časem, kdy přišla. - [ ] Dlaždici jde přidat vedle ciferníku a komplikace ukazují čísla na ciferníku. - [ ] Token v appce jde v Home Assistantu zrušit a appka pak přestane dostávat data. ## Přizpůsobení - Bez Home Assistanta: appka může volat přímo Oura API s osobním tokenem, ale ten pak leží v hodinkách a přístup zvenku řeší Oura cloud. - Jiný prsten nebo náramek: stačí, když má integraci v Home Assistantu. Změní se jen šablona a seznam entit. - Hranaté hodinky: vypni centrování a zaoblené okraje, rozložení obrazovek zůstane. --- Stránka projektu s fotkami a diagramem: https://ongy.cz/pages/homeassistant/oura/