{"skill":{"slug":"living-room-air-monitor","displayName":"Living Room Air Monitor","summary":"Monitor and report on living room air quality data. Collects temperature, humidity, PM2.5, and CO2 readings every hour from the Dirigera-connected air sensor...","description":"---\nname: living-room-air-monitor\ndescription: Monitor and report on living room air quality data. Collects temperature, humidity, PM2.5, and CO2 readings every hour from the Dirigera-connected air sensor, stores in SQLite database, and provides querying, averaging, charting, and reporting functions. Use when the user wants to (1) set up automated air quality data collection, (2) query historical air quality data, (3) generate charts for specific time periods, (4) get averages for days or months, or (5) send air quality reports via email or WhatsApp.\n---\n\n# Living Room Air Quality Monitor\n\nThis skill manages automated collection and reporting of air quality data from the living room ALPSTUGA air sensor connected to the IKEA Dirigera hub.\n\n## What It Does\n\n- **Collects data every hour** via cron for detailed tracking\n- **Stores in SQLite database** with schema: datetime, temperature, humidity, pm25, co2\n- **Skips incomplete readings** — only saves when all sensor values are present\n- **Provides query functions** for retrieving data by datetime, day, month, or interval\n- **Calculates averages** for any metric (temperature, humidity, PM2.5, CO2) by day or month\n- **Generates line charts** for day, week, month, 3 months, 6 months, or year views\n- **Sends reports** via email or WhatsApp (requires CONTACTS.json configuration)\n\n**Note:** For smoke/fire detection with alerts, use the separate `living-room-smoke-detector` skill.\n\n## Setup\n\n### 1. Database Initialization\n\nThe database is auto-initialized on first data collection. Manual init:\n\n```bash\npython3 ~/.openclaw/workspace/skills/living-room-air-monitor/scripts/collect_air_data.py\n```\n\n**Data folder location:** `~/.openclaw/workspace/skills/living-room-air-monitor/data/`\n\n**Files in data folder:**\n- `air_quality.db` — SQLite database with all readings\n\n### 2. Cron Setup\n\nAdd to crontab for automatic data collection every hour:\n\n```bash\n0 * * * * /opt/homebrew/bin/python3 /Users/macmini/.openclaw/workspace/skills/living-room-air-monitor/scripts/collect_air_data.py >> /tmp/air_quality_cron.log 2>&1\n```\n\n## Scripts Reference\n\n### collect_air_data.py\n\nCollects a single reading from the air sensor and saves to database.\n\n```bash\n# Collect data now\npython3 scripts/collect_air_data.py\n```\n\n**Behavior:**\n- Fetches data from Dirigera hub (192.168.1.100)\n- Requires token in `~/.openclaw/workspace/.dirigera_token`\n- Skips save if any sensor value is None\n- Prints collected values to stdout\n\n### query_data.py\n\nQuery the database for readings and averages.\n\n```bash\n# Get readings for a specific day\npython3 scripts/query_data.py --day 2026-02-24\n\n# Get readings for a month\npython3 scripts/query_data.py --month 2026-02\n\n# Get averages for a day (all metrics)\npython3 scripts/query_data.py --avg-day 2026-02-24\n\n# Get average for specific metric on a day\npython3 scripts/query_data.py --avg-day 2026-02-24 --metric temperature\n\n# Get averages for a month\npython3 scripts/query_data.py --avg-month 2026-02\n\n# Show available date range\npython3 scripts/query_data.py --range\n```\n\n**Python API:**\n```python\nfrom scripts.query_data import (\n    get_reading_by_datetime,      # Single reading closest to datetime\n    get_readings_by_interval,      # All readings in range\n    get_readings_by_day,           # All readings for a day\n    get_readings_by_month,         # All readings for a month\n    get_average_by_day,            # Average for one metric on one day\n    get_average_by_month,          # Average for one metric in one month\n    get_all_averages_by_day,       # All averages for a day\n    get_all_averages_by_month,     # All averages for a month\n    get_date_range                 # (earliest, latest) datetime strings\n)\n```\n\n### generate_chart.py\n\nGenerate line charts for various time periods.\n\n```bash\n# Chart for today\npython3 scripts/generate_chart.py\n\n# Chart for specific day\npython3 scripts/generate_chart.py --day 2026-02-24\n\n# Chart for week ending on date\npython3 scripts/generate_chart.py --week 2026-02-24\n\n# Chart for month\npython3 scripts/generate_chart.py --month 2026-02\n\n# Chart for 3 months ending on date\npython3 scripts/generate_chart.py --3month 2026-02-24\n\n# Chart for 6 months ending on date\npython3 scripts/generate_chart.py --6month 2026-02-24\n\n# Chart for year\npython3 scripts/generate_chart.py --year 2026\n\n# Custom output directory\npython3 scripts/generate_chart.py --day 2026-02-24 --output ~/charts\n```\n\n**Output:** PNG files saved to `/tmp/air_charts/` by default.\n\n**Python API:**\n```python\nfrom scripts.generate_chart import (\n    generate_day_chart,      # (date, output_dir) -> chart_path\n    generate_week_chart,     # (end_date, output_dir) -> chart_path\n    generate_month_chart,    # (year, month, output_dir) -> chart_path\n    generate_3month_chart,   # (end_date, output_dir) -> chart_path\n    generate_6month_chart,   # (end_date, output_dir) -> chart_path\n    generate_year_chart,     # (year, output_dir) -> chart_path\n    generate_chart           # (start_dt, end_dt, output_path, title) -> chart_path\n)\n```\n\n### send_report.py\n\nSend comprehensive air quality reports via email or WhatsApp.\n\n```bash\n# Send today's report via email (default)\npython3 scripts/send_report.py\n\n# Send specific day via email\npython3 scripts/send_report.py --day 2026-02-24\n\n# Send weekly report via email\npython3 scripts/send_report.py --week 2026-02-24\n\n# Send monthly report via email\npython3 scripts/send_report.py --month 2026-02\n\n# Send via WhatsApp instead of email\npython3 scripts/send_report.py --day 2026-02-24 --channel whatsapp\n\n# Send text-only report (no chart)\npython3 scripts/send_report.py --day 2026-02-24 --no-chart\n```\n\n**Python API:**\n```python\nfrom scripts.send_report import (\n    send_report,          # (start_dt, end_dt, channel, include_chart, chart_path)\n    send_daily_report,    # (date, channel='email')\n    send_weekly_report,   # (end_date, channel='email')\n    send_monthly_report,  # (year, month, channel='email')\n    generate_text_report  # (start_dt, end_dt) -> report_text\n)\n```\n\n## Report Contents\n\nReports include:\n- Period covered and total readings count\n- Average values for all metrics with ranges\n- Air quality assessment (Good/Moderate/Poor) for PM2.5 and CO2\n- All individual readings with timestamps\n\n**PM2.5 thresholds:**\n- ≤12 µg/m³: Good\n- 12.1-35 µg/m³: Moderate\n- >35 µg/m³: Unhealthy\n\n**CO2 thresholds:**\n- ≤1000 ppm: Good\n- 1001-2000 ppm: Moderate\n- >2000 ppm: Poor\n\n## Typical Usage Patterns\n\n### User asks: \"Send me yesterday's air quality report\"\n\n```bash\npython3 scripts/send_report.py --day $(date -v-1d +%Y-%m-%d) --channel email\n```\n\n### User asks: \"What's the average temperature this month?\"\n\n```bash\npython3 scripts/query_data.py --avg-month $(date +%Y-%m) --metric temperature\n```\n\n### User asks: \"Show me a chart of the last week\"\n\n```bash\npython3 scripts/generate_chart.py --week $(date +%Y-%m-%d)\n```\n\n### User asks: \"Email me the monthly air quality report\"\n\n```bash\npython3 scripts/send_report.py --month $(date +%Y-%m) --channel email\n```\n\n### User asks: \"WhatsApp me today's air data\"\n\n```bash\npython3 scripts/send_report.py --day $(date +%Y-%m-%d) --channel whatsapp\n```\n\n## Dependencies\n\n- Python 3.x\n- SQLite3 (built-in)\n- matplotlib (auto-installed if missing)\n- Dirigera hub access (IP: 192.168.1.100)\n- Valid auth token in `~/.openclaw/workspace/.dirigera_token`\n- `gog` CLI for email (already configured)\n- `wacli` CLI for WhatsApp (already configured)\n- `CONTACTS.json` in workspace root (for email/WhatsApp reports)\n\n## Configuration\n\n### CONTACTS.json\n\nCreate `~/.openclaw/workspace/CONTACTS.json` with your contact information:\n\n```json\n{\n  \"name\": \"Your Name\",\n  \"email\": \"your@email.com\",\n  \"whatsapp\": \"+614xxxxxxxxx\"\n}\n```\n\n**Note:** WhatsApp number must be in international format (e.g., `+61400000000`)\n\nThis file is shared across all skills and prevents hardcoding personal information.\n\n## Database Schema\n\n```sql\nCREATE TABLE air_quality (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    datetime TEXT NOT NULL UNIQUE,\n    temperature REAL,\n    humidity REAL,\n    pm25 REAL,\n    co2 REAL,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_datetime ON air_quality(datetime);\n```\n\n## Related Skills\n\n- **[living-room-smoke-detector](https://clawhub.com/skills/living-room-smoke-detector)** — Dedicated smoke/fire detection with continuous Mac speaker alerts. Use this for emergency alerting while air-monitor handles data collection and reporting.\n","tags":{"latest":"1.0.0"},"stats":{"comments":0,"downloads":315,"installsAllTime":0,"installsCurrent":0,"stars":0,"versions":1},"createdAt":1772013610819,"updatedAt":1778993117025},"latestVersion":{"version":"1.0.0","createdAt":1772013610819,"changelog":"Air quality monitoring with SQLite storage, charts, queries, and reports. Uses CONTACTS.json for email/WhatsApp configuration.","license":null},"metadata":null,"owner":{"handle":"maverick-2","userId":"s1744c7bmgen626z8kstjnyvhs885r0p","displayName":"Igor","image":"https://avatars.githubusercontent.com/u/3859269?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1779958911597}}