home / skills / openclaw / skills / oura-analytics

oura-analytics skill

/skills/kesslerio/oura-analytics

This skill fetches Oura Ring metrics, analyzes recovery and trends, and generates alerts and automated reports to improve productivity and wellbeing.

npx playbooks add skill openclaw/skills --skill oura-analytics

Review the files below or copy the command above to add this skill to your agents.

Files (35)
SKILL.md
4.2 KB
---
name: oura-analytics
description: Oura Ring data integration and analytics. Fetch sleep scores, readiness, activity, HRV, and trends from the Oura Cloud API. Generate automated reports, correlations with productivity, and trigger-based alerts for low recovery days. Requires OURA_API_TOKEN (get at cloud.ouraring.com).
metadata: {"openclaw":{"requires":{"bins":["python3"],"env":["OURA_API_TOKEN"]},"homepage":"https://github.com/kesslerio/oura-analytics-openclaw-skill"}}
---

# Oura Analytics

## Quick Start

```bash
# Set Oura API token
export OURA_API_TOKEN="your_personal_access_token"

# Fetch sleep data (last 7 days)
python {baseDir}/scripts/oura_api.py sleep --days 7

# Get readiness summary
python {baseDir}/scripts/oura_api.py readiness --days 7

# Generate weekly report
python {baseDir}/scripts/oura_api.py report --type weekly
```

## When to Use

Use this skill when:
- Fetching Oura Ring metrics (sleep, readiness, activity, HRV)
- Analyzing recovery trends over time
- Correlating sleep quality with productivity/events
- Setting up automated alerts for low readiness
- Generating daily/weekly/monthly health reports

## Core Workflows

### 1. Data Fetching
```bash
export PYTHONPATH="{baseDir}/scripts"
python - <<'PY'
from oura_api import OuraClient

client = OuraClient(token="YOUR_TOKEN")
sleep_data = client.get_sleep(start_date="2026-01-01", end_date="2026-01-16")
readiness_data = client.get_readiness(start_date="2026-01-01", end_date="2026-01-16")
print(len(sleep_data), len(readiness_data))
PY
```

### 2. Trend Analysis
```bash
export PYTHONPATH="{baseDir}/scripts"
python - <<'PY'
from oura_api import OuraClient, OuraAnalyzer

client = OuraClient(token="YOUR_TOKEN")
sleep_data = client.get_sleep(start_date="2026-01-01", end_date="2026-01-16")
readiness_data = client.get_readiness(start_date="2026-01-01", end_date="2026-01-16")

analyzer = OuraAnalyzer(sleep_data, readiness_data)
avg_sleep = analyzer.average_metric(sleep_data, "score")
avg_readiness = analyzer.average_metric(readiness_data, "score")
trend = analyzer.trend(sleep_data, "average_hrv")
print(avg_sleep, avg_readiness, trend)
PY
```

### 3. Alerts
```bash
python {baseDir}/scripts/alerts.py --days 7 --readiness 60 --efficiency 80
```

## Environment

Required:
- `OURA_API_TOKEN`

Optional (used for alerts/reports/timezone/output):
- `KESSLER_TELEGRAM_BOT_TOKEN` (fallback to `TELEGRAM_BOT_TOKEN`)
- `TELEGRAM_CHAT_ID`
- `USER_TIMEZONE`
- `OURA_OUTPUT_DIR`

## Scripts

- `scripts/oura_api.py` - Oura Cloud API wrapper with OuraAnalyzer and OuraReporter classes
- `scripts/alerts.py` - Threshold-based notifications (CLI: `python {baseDir}/scripts/alerts.py --days 7 --readiness 60`)
- `scripts/weekly_report.py` - Weekly report generator

## References

- `references/api.md` - Oura Cloud API documentation
- `references/metrics.md` - Metric definitions and interpretations

## Automation (Cron Jobs)

Cron jobs are configured in OpenClaw's gateway, not in this repo. Add these to your OpenClaw setup:

### Daily Morning Briefing (8:00 AM)
```bash
openclaw cron add \
  --name "Daily Oura Health Report (Hybrid)" \
  --cron "0 8 * * *" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --wake next-heartbeat \
  --deliver \
  --channel telegram \
  --target "<YOUR_TELEGRAM_CHAT_ID>" \
  --message "Run the daily Oura health report with hybrid format: Execute bash /path/to/your/scripts/daily-oura-report-hybrid.sh"
```

### Weekly Sleep Report (Sunday 8:00 AM)
```bash
openclaw cron add \
  --name "Weekly Oura Sleep Report" \
  --cron "0 8 * * 0" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --wake next-heartbeat \
  --deliver \
  --channel telegram \
  --target "<YOUR_TELEGRAM_CHAT_ID>" \
  --message "Run weekly Oura sleep report: bash /path/to/your/oura-weekly-sleep-alert.sh"
```

### Daily Obsidian Note (8:15 AM)
```bash
openclaw cron add \
  --name "Daily Obsidian Note" \
  --cron "15 8 * * *" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --wake next-heartbeat \
  --message "Create daily Obsidian note with Oura data. Run: source /path/to/venv/bin/activate && python /path/to/daily-note.py"
```

**Note:** Replace `/path/to/your/` with your actual paths and `<YOUR_TELEGRAM_CHAT_ID>` with your Telegram channel/group ID.

Overview

This skill integrates with the Oura Cloud API to fetch Oura Ring metrics and produce actionable analytics. It pulls sleep, readiness, activity, and HRV data, generates automated daily/weekly reports, and can trigger alerts for low recovery days. Requires an OURA_API_TOKEN set in the environment.

How this skill works

The skill uses an Oura API client to retrieve time-series data (sleep, readiness, activity, HRV) for specified date ranges. An analyzer computes averages, trends, and correlations (for example between sleep score and productivity), while reporter scripts build human-readable summaries and deliver them via configured channels. A lightweight alerts module checks thresholds and sends notifications when readiness or efficiency falls below configured values.

When to use it

  • Automatically collect Oura Ring metrics for personal or team health tracking
  • Monitor recovery and HRV trends to optimize training or workload
  • Correlate sleep quality with productivity events or calendar items
  • Send alerts when readiness drops below a safety threshold
  • Generate daily, weekly, or monthly health reports for review or journaling

Best practices

  • Store OURA_API_TOKEN securely as an environment variable, not in source control
  • Run regular cron jobs or scheduled tasks to capture consistent time-series data
  • Tune alert thresholds (readiness, efficiency) to your baseline before enabling notifications
  • Align timezone and output directory variables (USER_TIMEZONE, OURA_OUTPUT_DIR) to your workflow
  • Use lightweight reporters for messaging (Telegram) and separate archival copies for long-term analysis

Example use cases

  • Fetch the last 7 days of sleep and readiness to spot early signs of chronic fatigue
  • Generate a weekly report for a coach showing average sleep score, HRV trend, and readiness
  • Trigger a Telegram alert when readiness < 60 or sleep efficiency < 80 over the prior week
  • Correlate sleep score drops with calendar events to identify high-stress periods
  • Append daily Oura summaries into a personal Obsidian note for journaling and review

FAQ

How do I provide the API token?

Set OURA_API_TOKEN in your environment (export OURA_API_TOKEN="your_personal_access_token"). Obtain the token from cloud.ouraring.com.

Can I change alert delivery channels?

Yes. Alerts support Telegram via TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID. Other delivery methods can be added by extending the reporter module.