Ultrahuman Ring Air v Home Assistant – zdravotní data přímo na dashboardu
Chytrý prsten Ultrahuman Ring Air měří spánek, srdeční tep, HRV a pohyb nepřetržitě – jenže všechna ta data sedí zamčená v aplikaci. Co kdybych je mohl vidět přímo na svém HA dashboardu v mobilním telefonu? Přesně to jsem si řekl, když jsem narazil na HACS integraci Ultrahuman. Není to integrace, bez které by se nešlo obejít – žádnou automatizaci na ní nemám nastavenou. Ale mít ráno recovery index a spánkové skóre viditelné v telefonu a pracovat s nimi? To se mi líbí. Navíc – kdo ví, co se dá z těch dat ještě dostat. Ale o nápadech na automatizace až na konci.
Co integrace poskytuje
Po nastavení budete mít v Home Assistant tyto senzory (vše s prefixemsensor.ultrahuman_ring_):
| Senzor | Popis |
|---|---|
recovery_index |
Celkový recovery index (0–100) |
sleep_score |
Skóre spánku (0–100) |
sleep_start |
Čas usnutí |
sleep_end |
Čas probuzení |
total_sleep |
Celková délka spánku (minuty) |
time_in_bed |
Čas strávený v posteli (minuty) |
hrv |
Variabilita srdečního tepu (ms) |
night_resting_hr |
Noční klidová tepová frekvence (bpm) |
sleep_rhr |
Klidová TF během spánku (bpm) |
heart_rate |
Aktuální TF |
movement_index |
Index pohybu (0–100) |
steps |
Počet kroků |
temperature |
Tělesná teplota |
spo2 |
Saturace kyslíku v krvi (%) |
vo2_max |
VO2 Max (aerobní kapacita) |
active_minutes |
Aktivní minuty |
Pozn.: Ne všechny senzory jsou vždy dostupné. Pokud API danou metriku v konkrétní chvíli nevrátí, senzor přejde do stavuunknown. Výjimkou jevo2_max– ten bývá k dispozici téměř vždy.
Instalace – krok za krokem
Krok 1: Nainstalujte integraci přes HACS
Otevřete HACS v Home Assistant (postranní menu) a najděte repozitář:- HACS → Integrations → vpravo nahoře klikněte na tři tečky → Custom repositories
- Do pole zadejte:
https://github.com/anant-j/Ultrahuman - Typ: Integration → klikněte Add
- Vyhledejte
Ultrahumanv HACS a klikněte Download - Restartujte Home Assistant (Nastavení → Systém → Restart)
Krok 2: Získejte API klíč
Integrace se připojuje na Ultrahuman cloud – potřebujete osobní API token:- Otevřete vision.ultrahuman.com/developer a přihlaste se
- Klikněte na Personal API Tokens → Generate New Token
- Zadejte libovolný název tokenu (např.
Home Assistant Token) - Nastavte expiraci – doporučuji 10 let (nebo dle preference)
- Zaškrtněte RING DATA ACCESS
- Klikněte Generate Token a zkopírujte vygenerovaný token
Důležité: Token se zobrazí jen jednou. Zkopírujte ho hned – pokud stránku zavřete, bude potřeba vygenerovat nový.
Krok 3: Přidejte integraci do Home Assistant
- Jděte do Nastavení → Zařízení a služby → Přidat integraci
- Vyhledejte
Ultrahuman Ring - Vložte zkopírovaný API klíč
- Potvrďte – integrace se nastaví a za chvíli se objeví nové senzory
Jak funguje synchronizace – tohle je důležité vědět
Integrace nepřijímá data přímo z prstenu. Tahá je ze serverů Ultrahuman, kam je posílá vaše mobilní aplikace. Z toho plyne praktický důsledek: Prstýnek musí napřed synchronizovat s aplikací, ta data odešle na cloud – teprve potom je Home Assistant stáhne. V praxi to vypadá takto: ráno spustím aplikaci Ultrahuman na Androidu, ta si stáhne noční data z prstenu a odešle je na servery. HA poté (defaultně každou hodinu, ale lze změnit) data stáhne a senzory se aktualizují. Pokud aplikace nesynchronizovala na pozadí automaticky, senzory v HA budou zobrazovat data z předchozího dne. Stačí ale aplikaci jednou otevřít a vše se srovná. Záleží na nastavení a typu telefonu.Dashboard karta – zdraví na první pohled
Takhle vypadá moje karta zdraví na telefonu:
Karta funguje ve třech vrstvách:
1. Chip lišta nahoře – okamžitý přehled
Dva barevné chipsty ukazují recovery index a sleep score. Barva odpovídá hodnotě – zelená (≥75), oranžová (50–74), červená (<50). Třetí chip zobrazuje datum, za které jsou data – takový rychlý check, zda synchronizace proběhla.
2. Textový blok – interpretace hodnot
Markdown karta vyhodnotí recovery + sleep score dohromady a vypíše doporučení: „Výborný stav – ideální den pro výkon“ nebo naopak „Tělo potřebuje klid“. Pod tím jsou barevně ohodnocené HRV, délka spánku, efektivita spánku a noční tepová frekvence.
3. Číselné karty
Mřížka Mushroom karet s konkrétními hodnotami – délka spánku, čas usnutí, čas probuzení, HRV, noční HR a index pohybu. Barvy se opět mění dynamicky.
YAML kód karty
Celý kód ke stažení najdete níže. Pokud si ho chcete prohlédnout přímo tady, rozbalte sekci:Zobrazit YAML kód karty
type: vertical-stack
cards:
- type: heading
icon: mdi:ring
heading: Ultrahuman Ring
heading_style: title
card_mod:
style: |
ha-card {
border-bottom: 1px solid rgba(var(--rgb-primary-color), 0.15) !important;
padding-bottom: 2px !important;
}
- type: custom:mushroom-chips-card
chips:
- type: template
entity: sensor.ultrahuman_ring_recovery_index
icon: >-
{% set r = states('sensor.ultrahuman_ring_recovery_index') | int(0) %}
{% if r >= 75 %}mdi:battery-high{% elif r >= 50 %}mdi:battery-medium{%
else %}mdi:battery-low{% endif %}
icon_color: >-
{% set r = states('sensor.ultrahuman_ring_recovery_index') | int(0) %}
{% if r >= 75 %}#7ED321{% elif r >= 50 %}#F5A623{% else %}#D0021B{%
endif %}
content: Recovery {{ states('sensor.ultrahuman_ring_recovery_index') }}/100
tap_action:
action: more-info
- type: template
entity: sensor.ultrahuman_ring_sleep_score
icon: mdi:sleep
icon_color: >-
{% set s = states('sensor.ultrahuman_ring_sleep_score') | int(0) %} {%
if s >= 75 %}#7ED321{% elif s >= 50 %}#F5A623{% else %}#D0021B{% endif
%}
content: Spánek {{ states('sensor.ultrahuman_ring_sleep_score') }}/100
tap_action:
action: more-info
- type: spacer
- type: template
content: >-
Sync {{ as_timestamp(states('sensor.ultrahuman_ring_sleep_start')) |
timestamp_custom('%-d. %-m.') }}
alignment: start
- type: markdown
content: >
{% set r = states('sensor.ultrahuman_ring_recovery_index') | int(0) %}
{% set s = states('sensor.ultrahuman_ring_sleep_score') | int(0) %}
{% set hrv = states('sensor.ultrahuman_ring_hrv') | int(0) %}
{% set mins = states('sensor.ultrahuman_ring_total_sleep') | int(0) %}
{% set tib = states('sensor.ultrahuman_ring_time_in_bed') | int(0) %}
{% set rhr = states('sensor.ultrahuman_ring_night_resting_hr') | int(0) %}
{% if r >= 75 and s >= 75 %}
**✅ Výborný stav – ideální den pro výkon**
Tělo i nervový systém jsou plně regenerované. Dnes bez omezení.
{% elif r >= 75 %}
**🟡 Dobrá regenerace, spánek průměrný**
Fyzicky nabito, ale spánek nebyl ideální. Střední trénink v pořádku – maximální zátěž neplánuj.
{% elif s >= 75 %}
**🟡 Dobrá noc, regenerace se ještě dotahuje**
Kvalitní spánek, ale tělo ještě plně neregenerovalo. Aktivní den bez přetěžování.
{% elif r >= 50 or s >= 50 %}
**🟠 Průměrný stav – klidný den**
Obě hodnoty jsou průměrné. Klidné aktivity, vyhni se stresu. Prioritizuj dnes večer spánek.
{% else %}
**🔴 Tělo potřebuje klid**
Únava nebo stres jsou patrné ze všech hodnot. Procházka ano, trénink ne. Usni dnes dříve.
{% endif %}
---
{% if hrv < 30 %}
⚠️ **HRV {{ hrv }} ms** – velmi nízké, signál stresu nebo přetrénování
{% elif hrv < 50 %}
🟡 **HRV {{ hrv }} ms** – v normálním rozsahu
{% else %}
✅ **HRV {{ hrv }} ms** – výborné
{% endif %}
{% if mins > 0 %}
{% if mins < 360 %}
😴 **Spánek {{ mins // 60 }}h {{ mins % 60 }}min** – výrazný spánkový deficit
{% elif mins < 420 %}
🟡 **Spánek {{ mins // 60 }}h {{ mins % 60 }}min** – pod doporučenou 7h hranicí
{% elif mins <= 540 %}
✅ **Spánek {{ mins // 60 }}h {{ mins % 60 }}min** – délka v pořádku
{% elif mins <= 600 %}
🟡 **Spánek {{ mins // 60 }}h {{ mins % 60 }}min** – trochu delší než obvykle
{% else %}
🟡 **Spánek {{ mins // 60 }}h {{ mins % 60 }}min** – nadměrně dlouhý, sleduj únavu
{% endif %}
{% endif %}
{% if tib > 0 and mins > 0 %}
{% set eff = (mins / tib * 100) | round(0) | int %}
{% if eff < 80 %}
⚠️ **Efektivita spánku {{ eff }}%** – časté probuzení nebo problémy s usínáním
{% elif eff < 85 %}
🟡 **Efektivita spánku {{ eff }}%** – mírně snížená
{% endif %}
{% endif %}
{% if rhr > 0 %}
{% if rhr < 60 %}
✅ **Noční HR {{ rhr }} bpm** – výborné
{% elif rhr <= 75 %}
🟡 **Noční HR {{ rhr }} bpm** – průměr
{% else %}
⚠️ **Noční HR {{ rhr }} bpm** – zvýšené, sleduj stres a zátěž
{% endif %}
{% endif %}
card_mod:
style: |
ha-card {
background: rgba(var(--rgb-primary-color), 0.05) !important;
border-radius: 12px !important;
}
- type: horizontal-stack
cards:
- type: custom:mushroom-template-card
primary: >-
{% set mins = states('sensor.ultrahuman_ring_total_sleep') | int(0) %}
{{ mins // 60 }}h {{ mins % 60 }}min
secondary: Spánek
icon: mdi:bed-clock
icon_color: "#4A90E2"
entity: sensor.ultrahuman_ring_total_sleep
vertical: true
tap_action:
action: more-info
- type: custom:mushroom-template-card
primary: >-
{% set ts = as_timestamp(states('sensor.ultrahuman_ring_sleep_start'), none) %}
{{ '–' if ts == none else (ts | timestamp_custom('%H:%M')) }}
secondary: Usnutí
icon: mdi:weather-night
icon_color: "#9B9B9B"
entity: sensor.ultrahuman_ring_sleep_start
vertical: true
tap_action:
action: more-info
- type: custom:mushroom-template-card
primary: >-
{% set ts = as_timestamp(states('sensor.ultrahuman_ring_sleep_end'), none) %}
{{ '–' if ts == none else (ts | timestamp_custom('%H:%M')) }}
secondary: Probuzení
icon: mdi:white-balance-sunny
icon_color: "#F5A623"
entity: sensor.ultrahuman_ring_sleep_end
vertical: true
tap_action:
action: more-info
- type: horizontal-stack
cards:
- type: custom:mushroom-template-card
primary: "{{ states('sensor.ultrahuman_ring_hrv') }} ms"
secondary: HRV
icon: mdi:heart-flash
icon_color: >-
{% set h = states('sensor.ultrahuman_ring_hrv') | int(0) %}
{% if h >= 50 %}#7ED321{% elif h >= 30 %}#F5A623{% else %}#D0021B{% endif %}
entity: sensor.ultrahuman_ring_hrv
vertical: true
tap_action:
action: more-info
- type: custom:mushroom-template-card
primary: "{{ states('sensor.ultrahuman_ring_night_resting_hr') }} bpm"
secondary: Noční HR
icon: mdi:heart
icon_color: >-
{% set rhr = states('sensor.ultrahuman_ring_night_resting_hr') | int(0) %}
{% if rhr < 60 %}#7ED321{% elif rhr <= 75 %}#F5A623{% else %}#D0021B{% endif %}
entity: sensor.ultrahuman_ring_night_resting_hr
vertical: true
tap_action:
action: more-info
- type: custom:mushroom-template-card
primary: "{{ states('sensor.ultrahuman_ring_movement_index') }}"
secondary: Pohyb
icon: mdi:run
icon_color: >-
{% set m = states('sensor.ultrahuman_ring_movement_index') | int(0) %}
{% if m >= 70 %}#7ED321{% elif m >= 40 %}#F5A623{% else %}#D0021B{% endif %}
entity: sensor.ultrahuman_ring_movement_index
vertical: true
tap_action:
action: more-info
Pozn.: Karta používá Mushroom Cards a card-mod – pokud je nemáte, nainstalujte je přes HACS (Mushroom a card-mod jsou v HACS integrations/frontend).
Nápady na automatizace
Zatím na datech z prstenu nemám žádnou automatizaci ještě nastavenou – ale myšlenek se nabízí hned několik: Ráno po synchronizaci: – Notifikace na mobil s recovery indexem a spánkovým skóre hned po tom, co HA stáhne čerstvá data – Pokud recovery < 40, přehrát na reproduktoru jemnou melodii místo plného budíku (nebo vůbec nezapínat intenzivní světla) Adaptivní osvětlení podle recovery: – Recovery ≥ 75 → standardní ranní scéna (jasné světlo, denní tón) – Recovery < 50 → tlumené teplé světlo ráno, „klidový“ režim přes den Tréninkové upozornění: – Pokud je recovery < 50 a time je 16:00–19:00 (typický čas tréninku), poslat připomenutí: „Dnes raději kratší trénink“ Týdenní přehled: – Každou neděli ráno poslat souhrnnou notifikaci s průměrem recovery a sleep score za týden Dřívější ukončení večerních aktivit: – Pokud sleep score z posledních 3 nocí opakovaně pod 60, automaticky připomenout večer jít dříve spátStažení
Celý YAML kód dashboardové karty ke stažení – zkopírujte, vložte do editoru dashboardu a upravte si entity ID podle vašeho nastavení (prefixultrahuman_ring_ by měl sedět automaticky).
Závěr
Integrace Ultrahuman Ring pro Home Assistant není z těch, na které se napojíte a hned vám změní život. Ale pokud Ultrahuman prsten nosíte, je škoda ta data nechat jen v aplikaci. Zobrazená na dashboardu vedle ostatních dat chytré domácnosti dávají mnohem lepší kontext. A kdo ví – možná se za pár měsíců ukáže, že právě tenhle kousek dat umí pěkně řídit ráno v domácnosti. Začínám sbírat nápady. 🙂Máte jiný nápad na automatizaci s daty z prstenu? Napište do komentářů – rád přidám.