[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FHA3EXX9CPXVME2JH7VFEG":3,"skill-same:01M6FHA3EXX9CPXVME2JH7VFEG":107},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6FHA3EXX9CPXVME2JH7VFEG","tado",null,"Control your Tado smart thermostat - check temperature, set heating, manage home\u002Faway modes, and monitor presence via geolocation.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27],"monitor","https","SET","python3","check","manage","away","control","via","temperature","2026-11-10 10:12:30",false,"---\nname: tado\ndescription: Control your Tado smart thermostat - check temperature, set heating, manage home\u002Faway modes, and monitor presence via geolocation.\nhomepage: https:\u002F\u002Fwww.tado.com\nmetadata: {\"openclaw\":{\"emoji\":\"?️\",\"requires\":{\"bins\":[\"python3\",\"pip3\"]}}}\n---\n\n# Tado Smart Thermostat Skill\n\nControl your Tado smart thermostat from OpenClaw.\n\n## Features\n\n- ? **Status:** Get current temperature, humidity, heating status per zone\n- ?️ **Temperature Control:** Set target temperature with optional timer\n- ? **Presence:** Check who is home (geolocation)\n- ? **Modes:** Home, Away, Auto (schedule-based)\n- ⚙️ **Zone Management:** Support for multi-zone setups\n- ? **JSON Output:** Machine-readable format for scripting\n\n## Installation\n\n### 1. Install Dependencies\n\n```bash\ncd ~\u002Fclawd\u002Fskills\u002Ftado\npip3 install libtado --break-system-packages\n```\n\n**Minimum version:** libtado 4.1.1+ (OAuth2 support required)\n\n### 2. OAuth2 Authentication (One-Time Setup)\n\n**⚠️ Important:** libtado 4.1.1+ requires OAuth2. Username\u002Fpassword authentication is **no longer supported**.\n\n**First-time setup:**\n\n```bash\n# Run the libtado CLI to authenticate via browser\npython3 -m libtado -f ~\u002F.tado_auth.json zones\n```\n\n**What happens:**\n1. libtado generates a Tado login URL\n2. Your browser opens (or you paste the URL manually)\n3. Log in with your Tado credentials\n4. libtado saves OAuth2 tokens to `~\u002F.tado_auth.json`\n5. You'll see your zones listed (confirming success)\n\n**After setup:**\n- The skill will automatically use `~\u002F.tado_auth.json`\n- No further browser login needed\n- Tokens refresh automatically\n\n**Security Note:** The token file should be readable only by you:\n\n```bash\nchmod 600 ~\u002F.tado_auth.json\n```\n\n### 3. Test Connection\n\n```bash\ncd ~\u002Fclawd\u002Fskills\u002Ftado\n.\u002Fscripts\u002Ftado.py zones\n```\n\nYou should see a list of your configured zones.\n\n**If authentication fails:**\n```bash\n# Re-authenticate (regenerates tokens)\npython3 -m libtado -f ~\u002F.tado_auth.json zones\n```\n\n## Authentication\n\n### OAuth2 Flow (Required)\n\nAs of **libtado 4.1.1+**, OAuth2 is the only supported authentication method.\n\n**Token file location:** `~\u002F.tado_auth.json`\n\n**How it works:**\n1. First run: Browser login via `python3 -m libtado -f ~\u002F.tado_auth.json zones`\n2. libtado saves access token + refresh token\n3. Skill uses `token_file_path` parameter: `Tado(token_file_path='~\u002F.tado_auth.json')`\n4. libtado automatically refreshes expired tokens\n\n**Token structure (managed by libtado):**\n```json\n{\n  \"access_token\": \"...\",\n  \"refresh_token\": \"...\",\n  \"expires_at\": 1234567890\n}\n```\n\n**Do NOT manually edit this file!** Let libtado manage it.\n\n### Migration from Username\u002FPassword\n\n**Old authentication (no longer works):**\n```python\nTado(username='email', password='pass')  # ❌ Not supported\n```\n\n**New authentication (required):**\n```python\nTado(token_file_path='~\u002F.tado_auth.json')  # ✅ Works\n```\n\n**Migration steps:**\n1. Delete old `~\u002F.tado_credentials.json` (no longer used)\n2. Run `python3 -m libtado -f ~\u002F.tado_auth.json zones`\n3. Follow browser login flow\n4. Done! Skill will work automatically\n\n**No backward compatibility:** Once you upgrade to libtado 4.1.1+, you MUST use OAuth2.\n\n## Usage\n\n### Status Commands\n\n**Get status of all zones:**\n```bash\n.\u002Fscripts\u002Ftado.py status\n```\n\n**Output:**\n```\n? Woonkamer (Zone 1)\n  Current: 20.5°C (55% humidity)\n  Target:  21.0°C\n  Heating: ON (45%)\n  Mode:    Auto (following schedule)\n\n? Slaapkamer (Zone 2)\n  Current: 18.2°C (58% humidity)\n  Target:  18.0°C\n  Heating: OFF (0%)\n  Mode:    Auto (following schedule)\n```\n\n**Get status of specific zone:**\n```bash\n.\u002Fscripts\u002Ftado.py status --zone 1\n.\u002Fscripts\u002Ftado.py status --zone \"Woonkamer\"\n```\n\n**JSON output (for scripting):**\n```bash\n.\u002Fscripts\u002Ftado.py status --json\n```\n\n### Temperature Control\n\n**Set temperature (permanent until next schedule change):**\n```bash\n.\u002Fscripts\u002Ftado.py set --zone 1 --temperature 21\n.\u002Fscripts\u002Ftado.py set --zone \"Woonkamer\" --temperature 21.5\n```\n\n**Set temperature with timer (temporary override):**\n```bash\n# Set 22°C for 60 minutes, then return to schedule\n.\u002Fscripts\u002Ftado.py set --zone 1 --temperature 22 --duration 60\n\n# Short form\n.\u002Fscripts\u002Ftado.py set --zone 1 -t 22 -d 60\n```\n\n**Reset to automatic schedule:**\n```bash\n.\u002Fscripts\u002Ftado.py reset --zone 1\n.\u002Fscripts\u002Ftado.py reset --zone \"Woonkamer\"\n```\n\n### Home\u002FAway Modes\n\n**Set home mode (all zones follow schedule):**\n```bash\n.\u002Fscripts\u002Ftado.py mode home\n```\n\n**Set away mode (energy-saving temperatures):**\n```bash\n.\u002Fscripts\u002Ftado.py mode away\n```\n\n**Set auto mode (geolocation-based):**\n```bash\n.\u002Fscripts\u002Ftado.py mode auto\n```\n\nWhen in auto mode, Tado automatically switches between home\u002Faway based on your phone's location.\n\n### Presence Detection\n\n**Check who is home:**\n```bash\n.\u002Fscripts\u002Ftado.py presence\n```\n\n**Output:**\n```\n? Presence\n  Anyone home: Yes\n  - Sander's iPhone: ? Home\n  - Partner's iPhone: ? Away\n```\n\n### Zone Management\n\n**List all zones:**\n```bash\n.\u002Fscripts\u002Ftado.py zones\n```\n\n**Output:**\n```\n? Available Zones:\n  1: Woonkamer (HEATING)\n  2: Slaapkamer (HEATING)\n  3: Badkamer (HOT_WATER)\n```\n\n## Zone Identification\n\nZones can be referenced by **ID** or **name**:\n\n```bash\n# By ID (faster)\n.\u002Fscripts\u002Ftado.py status --zone 1\n\n# By name (case-insensitive)\n.\u002Fscripts\u002Ftado.py status --zone \"Woonkamer\"\n.\u002Fscripts\u002Ftado.py status --zone \"woonkamer\"\n```\n\n## JSON Output for Scripting\n\nAll commands support `--json` flag for machine-readable output:\n\n```bash\n.\u002Fscripts\u002Ftado.py status --zone 1 --json\n```\n\n**Example output:**\n```json\n{\n  \"zone_id\": 1,\n  \"zone_name\": \"Woonkamer\",\n  \"current_temp\": 20.5,\n  \"current_humidity\": 55,\n  \"target_temp\": 21.0,\n  \"heating\": true,\n  \"heating_power\": 45,\n  \"mode\": \"MANUAL\",\n  \"overlay\": true\n}\n```\n\n**Use in scripts:**\n```bash\n# Get current temperature as number\nTEMP=$(.\u002Fscripts\u002Ftado.py status --zone 1 --json | jq -r '.current_temp')\n\n# Check if heating is on\nHEATING=$(.\u002Fscripts\u002Ftado.py status --zone 1 --json | jq -r '.heating')\n\n# Get all zones data\n.\u002Fscripts\u002Ftado.py status --json | jq '.zones[] | {name: .zone_name, temp: .current_temp}'\n```\n\n## OpenClaw Integration\n\n**From OpenClaw chat:**\n\n```\n@jarvis What's the temperature in the living room?\n→ Uses: .\u002Fscripts\u002Ftado.py status --zone \"Woonkamer\"\n\n@jarvis Set living room to 22 degrees for 1 hour\n→ Uses: .\u002Fscripts\u002Ftado.py set --zone \"Woonkamer\" -t 22 -d 60\n\n@jarvis Is anyone home?\n→ Uses: .\u002Fscripts\u002Ftado.py presence\n\n@jarvis Turn on away mode\n→ Uses: .\u002Fscripts\u002Ftado.py mode away\n```\n\n## Troubleshooting\n\n### Authentication Errors\n\n**Error:** `Tado OAuth2 token not found!`\n\n**Solution:** Run the one-time authentication flow:\n```bash\npython3 -m libtado -f ~\u002F.tado_auth.json zones\n```\n\nThen follow the browser login prompt.\n\n---\n\n**Error:** `Failed to connect to Tado: 401 Unauthorized`\n\n**Possible causes:**\n- Expired or invalid OAuth2 token\n- Token file corrupted\n- Tado service outage\n\n**Solutions:**\n1. Re-authenticate:\n   ```bash\n   python3 -m libtado -f ~\u002F.tado_auth.json zones\n   ```\n2. Check token file exists: `ls -la ~\u002F.tado_auth.json`\n3. Verify token file permissions: `chmod 600 ~\u002F.tado_auth.json`\n4. Check Tado service status at https:\u002F\u002Fstatus.tado.com\n\n### API Errors\n\n**Error:** `Failed to get status: HTTP 500`\n\n**Solution:** Tado API may be temporarily down. Check https:\u002F\u002Fstatus.tado.com\n\n---\n\n**Error:** `Zone 'X' not found`\n\n**Solution:** \n1. List available zones: `.\u002Fscripts\u002Ftado.py zones`\n2. Use exact zone ID or name from the list\n\n### Connection Issues\n\n**Error:** `Failed to connect to Tado: Network unreachable`\n\n**Solution:**\n1. Check internet connection\n2. Verify DNS is working: `ping my.tado.com`\n3. Check firewall settings\n\n### Library Errors\n\n**Error:** `ModuleNotFoundError: No module named 'PyTado'`\n\n**Solution:**\n```bash\npip3 install libtado --break-system-packages\n```\n\n---\n\n**Error:** `AttributeError: 'Tado' object has no attribute 'setAutoMode'`\n\n**Possible cause:** Outdated `libtado` version\n\n**Solution:**\n```bash\npip3 install --upgrade libtado\n```\n\n## API Rate Limits\n\nTado API has rate limits (exact numbers not publicly documented):\n\n**Best practices:**\n- Don't poll status more than once per minute\n- Use `--json` output and cache results when possible\n- Batch multiple zones in one `status` call instead of separate calls\n\n**If rate limited:**\n- Wait 1-2 minutes before retrying\n- Reduce polling frequency\n\n## Data Privacy\n\n**Local data:**\n- Credentials stored in `~\u002F.tado_credentials.json` (mode 600 recommended)\n- No usage tracking or telemetry\n- All API calls go directly to Tado servers\n\n**Never exposed:**\n- Your credentials are never sent anywhere except Tado API\n- Zone names, temperatures, and presence data stay local\n- No third-party analytics\n\n## Advanced Usage\n\n### Temperature Scheduling\n\nCreate a simple heating schedule script:\n\n```bash\n#!\u002Fbin\u002Fbash\n# morning-heat.sh - Warm up before wake-up\n\n# Set living room to 21°C at 6:30 AM\n.\u002Fscripts\u002Ftado.py set --zone \"Woonkamer\" -t 21 -d 120\n\n# Reset to schedule after 2 hours\nsleep 7200\n.\u002Fscripts\u002Ftado.py reset --zone \"Woonkamer\"\n```\n\nRun with cron:\n```\n30 6 * * * \u002Fpath\u002Fto\u002Fmorning-heat.sh\n```\n\n### Smart Away Detection\n\n```bash\n#!\u002Fbin\u002Fbash\n# smart-away.sh - Set away mode if nobody home\n\nANYONE_HOME=$(.\u002Fscripts\u002Ftado.py presence --json | jq -r '.anyone_home')\n\nif [ \"$ANYONE_HOME\" = \"false\" ]; then\n    .\u002Fscripts\u002Ftado.py mode away\n    echo \"Nobody home - enabled away mode\"\nfi\n```\n\n### Energy Monitoring\n\n```bash\n#!\u002Fbin\u002Fbash\n# energy-log.sh - Log heating activity\n\nDATE=$(date +%Y-%m-%d_%H:%M)\n.\u002Fscripts\u002Ftado.py status --json > ~\u002Flogs\u002Ftado-$DATE.json\n\n# Analyze with jq\njq '.zones[] | select(.heating == true) | {zone: .zone_name, power: .heating_power}' \\\n  ~\u002Flogs\u002Ftado-$DATE.json\n```\n\n## Known Limitations\n\n1. **Hot Water Control:** Basic support only (ON\u002FOFF), no temperature setting\n2. **Weather Data:** Not yet implemented (available in Tado API)\n3. **Energy IQ:** Statistics not yet exposed (available in Tado API)\n4. **Multi-Home:** Only one Tado home supported per token file\n\n## Future Enhancements\n\n- [x] OAuth2 authentication (✅ Implemented in v1.1.0)\n- [ ] Weather data integration\n- [ ] Energy IQ statistics\n- [ ] Multi-home support\n- [ ] Web dashboard (optional)\n- [ ] Push notifications for temperature alerts\n\n## Resources\n\n- **libtado Documentation:** https:\u002F\u002Flibtado.readthedocs.io\u002F\n- **libtado GitHub:** https:\u002F\u002Fgithub.com\u002Fgermainlefebvre4\u002Flibtado\n- **Tado API (unofficial):** https:\u002F\u002Fblog.scphillips.com\u002Fposts\u002F2017\u002F01\u002Fthe-tado-api-v2\u002F\n- **Tado Service Status:** https:\u002F\u002Fstatus.tado.com\n\n## Support\n\n**For skill issues:**\n- Check this SKILL.md\n- Read error messages carefully (they include hints)\n- Try `--json` output for debugging\n\n**For Tado API\u002Faccount issues:**\n- Check Tado app first (does it work?)\n- Visit https:\u002F\u002Fmy.tado.com\n- Contact Tado support\n\n## Changelog\n\n**v1.1.0** (2026-02-03)\n- ✅ **OAuth2 authentication** (libtado 4.1.1+)\n- ⚠️ **BREAKING:** Username\u002Fpassword auth removed (no longer supported by libtado)\n- One-time browser login flow via `python3 -m libtado`\n- Automatic token refresh\n- Updated all documentation for OAuth2\n\n**v0.1.0** (2026-01-29)\n- Initial release\n- Status, temperature control, modes, presence\n- JSON output support\n- Zone management (ID and name-based)\n- Error handling and troubleshooting\n","# Tado Smart Thermostat Skill\n\nControl your Tado smart thermostat from OpenClaw.\n\n## Features\n\n- ? **Status:** Get current temperature, humidity, heating status per zone\n- ?️ **Temperature Control:** Set target temperature with optional timer\n- ? **Presence:** Check who is home (geolocation)\n- ? **Modes:** Home, Away, Auto (schedule-based)\n- ⚙️ **Zone Management:** Support for multi-zone setups\n- ? **JSON Output:** Machine-readable format for scripting\n\n## Installation\n\n### 1. Install Dependencies\n\n```bash\ncd ~\u002Fclawd\u002Fskills\u002Ftado\npip3 install libtado --break-system-packages\n```\n\n**Minimum version:** libtado 4.1.1+ (OAuth2 support required)\n\n### 2. OAuth2 Authentication (One-Time Setup)\n\n**⚠️ Important:** libtado 4.1.1+ requires OAuth2. Username\u002Fpassword authentication is **no longer supported**.\n\n**First-time setup:**\n\n```bash\n# Run the libtado CLI to authenticate via browser\npython3 -m libtado -f ~\u002F.tado_auth.json zones\n```\n\n**What happens:**\n1. libtado generates a Tado login URL\n2. Your browser opens (or you paste the URL manually)\n3. Log in with your Tado credentials\n4. libtado saves OAuth2 tokens to `~\u002F.tado_auth.json`\n5. You'll see your zones listed (confirming success)\n\n**After setup:**\n- The skill will automatically use `~\u002F.tado_auth.json`\n- No further browser login needed\n- Tokens refresh automatically\n\n**Security Note:** The token file should be readable only by you:\n\n```bash\nchmod 600 ~\u002F.tado_auth.json\n```\n\n### 3. Test Connection\n\n```bash\ncd ~\u002Fclawd\u002Fskills\u002Ftado\n.\u002Fscripts\u002Ftado.py zones\n```\n\nYou should see a list of your configured zones.\n\n**If authentication fails:**\n```bash\n# Re-authenticate (regenerates tokens)\npython3 -m libtado -f ~\u002F.tado_auth.json zones\n```\n\n## Authentication\n\n### OAuth2 Flow (Required)\n\nAs of **libtado 4.1.1+**, OAuth2 is the only supported authentication method.\n\n**Token file location:** `~\u002F.tado_auth.json`\n\n**How it works:**\n1. First run: Browser login via `python3 -m libtado -f ~\u002F.tado_auth.json zones`\n2. libtado saves access token + refresh token\n3. Skill uses `token_file_path` parameter: `Tado(token_file_path='~\u002F.tado_auth.json')`\n4. libtado automatically refreshes expired tokens\n\n**Token structure (managed by libtado):**\n```json\n{\n  \"access_token\": \"...\",\n  \"refresh_token\": \"...\",\n  \"expires_at\": 1234567890\n}\n```\n\n**Do NOT manually edit this file!** Let libtado manage it.\n\n### Migration from Username\u002FPassword\n\n**Old authentication (no longer works):**\n```python\nTado(username='email', password='pass')  # ❌ Not supported\n```\n\n**New authentication (required):**\n```python\nTado(token_file_path='~\u002F.tado_auth.json')  # ✅ Works\n```\n\n**Migration steps:**\n1. Delete old `~\u002F.tado_credentials.json` (no longer used)\n2. Run `python3 -m libtado -f ~\u002F.tado_auth.json zones`\n3. Follow browser login flow\n4. Done! Skill will work automatically\n\n**No backward compatibility:** Once you upgrade to libtado 4.1.1+, you MUST use OAuth2.\n\n## Usage\n\n### Status Commands\n\n**Get status of all zones:**\n```bash\n.\u002Fscripts\u002Ftado.py status\n```\n\n**Output:**\n```\n? Woonkamer (Zone 1)\n  Current: 20.5°C (55% humidity)\n  Target:  21.0°C\n  Heating: ON (45%)\n  Mode:    Auto (following schedule)\n\n? Slaapkamer (Zone 2)\n  Current: 18.2°C (58% humidity)\n  Target:  18.0°C\n  Heating: OFF (0%)\n  Mode:    Auto (following schedule)\n```\n\n**Get status of specific zone:**\n```bash\n.\u002Fscripts\u002Ftado.py status --zone 1\n.\u002Fscripts\u002Ftado.py status --zone \"Woonkamer\"\n```\n\n**JSON output (for scripting):**\n```bash\n.\u002Fscripts\u002Ftado.py status --json\n```\n\n### Temperature Control\n\n**Set temperature (permanent until next schedule change):**\n```bash\n.\u002Fscripts\u002Ftado.py set --zone 1 --temperature 21\n.\u002Fscripts\u002Ftado.py set --zone \"Woonkamer\" --temperature 21.5\n```\n\n**Set temperature with timer (temporary override):**\n```bash\n# Set 22°C for 60 minutes, then return to schedule\n.\u002Fscripts\u002Ftado.py set --zone 1 --temperature 22 --duration 60\n\n# Short form\n.\u002Fscripts\u002Ftado.py set --zone 1 -t 22 -d 60\n```\n\n**Reset to automatic schedule:**\n```bash\n.\u002Fscripts\u002Ftado.py reset --zone 1\n.\u002Fscripts\u002Ftado.py reset --zone \"Woonkamer\"\n```\n\n### Home\u002FAway Modes\n\n**Set home mode (all zones follow schedule):**\n```bash\n.\u002Fscripts\u002Ftado.py mode home\n```\n\n**Set away mode (energy-saving temperatures):**\n```bash\n.\u002Fscripts\u002Ftado.py mode away\n```\n\n**Set auto mode (geolocation-based):**\n```bash\n.\u002Fscripts\u002Ftado.py mode auto\n```\n\nWhen in auto mode, Tado automatically switches between home\u002Faway based on your phone's location.\n\n### Presence Detection\n\n**Check who is home:**\n```bash\n.\u002Fscripts\u002Ftado.py presence\n```\n\n**Output:**\n```\n? Presence\n  Anyone home: Yes\n  - Sander's iPhone: ? Home\n  - Partner's iPhone: ? Away\n```\n\n### Zone Management\n\n**List all zones:**\n```bash\n.\u002Fscripts\u002Ftado.py zones\n```\n\n**Output:**\n```\n? Available Zones:\n  1: Woonkamer (HEATING)\n  2: Slaapkamer (HEATING)\n  3: Badkamer (HOT_WATER)\n```\n\n## Zone Identification\n\nZones can be referenced by **ID** or **name**:\n\n```bash\n# By ID (faster)\n.\u002Fscripts\u002Ftado.py status --zone 1\n\n# By name (case-insensitive)\n.\u002Fscripts\u002Ftado.py status --zone \"Woonkamer\"\n.\u002Fscripts\u002Ftado.py status --zone \"woonkamer\"\n```\n\n## JSON Output for Scripting\n\nAll commands support `--json` flag for machine-readable output:\n\n```bash\n.\u002Fscripts\u002Ftado.py status --zone 1 --json\n```\n\n**Example output:**\n```json\n{\n  \"zone_id\": 1,\n  \"zone_name\": \"Woonkamer\",\n  \"current_temp\": 20.5,\n  \"current_humidity\": 55,\n  \"target_temp\": 21.0,\n  \"heating\": true,\n  \"heating_power\": 45,\n  \"mode\": \"MANUAL\",\n  \"overlay\": true\n}\n```\n\n**Use in scripts:**\n```bash\n# Get current temperature as number\nTEMP=$(.\u002Fscripts\u002Ftado.py status --zone 1 --json | jq -r '.current_temp')\n\n# Check if heating is on\nHEATING=$(.\u002Fscripts\u002Ftado.py status --zone 1 --json | jq -r '.heating')\n\n# Get all zones data\n.\u002Fscripts\u002Ftado.py status --json | jq '.zones[] | {name: .zone_name, temp: .current_temp}'\n```\n\n## OpenClaw Integration\n\n**From OpenClaw chat:**\n\n```\n@jarvis What's the temperature in the living room?\n→ Uses: .\u002Fscripts\u002Ftado.py status --zone \"Woonkamer\"\n\n@jarvis Set living room to 22 degrees for 1 hour\n→ Uses: .\u002Fscripts\u002Ftado.py set --zone \"Woonkamer\" -t 22 -d 60\n\n@jarvis Is anyone home?\n→ Uses: .\u002Fscripts\u002Ftado.py presence\n\n@jarvis Turn on away mode\n→ Uses: .\u002Fscripts\u002Ftado.py mode away\n```\n\n## Troubleshooting\n\n### Authentication Errors\n\n**Error:** `Tado OAuth2 token not found!`\n\n**Solution:** Run the one-time authentication flow:\n```bash\npython3 -m libtado -f ~\u002F.tado_auth.json zones\n```\n\nThen follow the browser login prompt.\n\n---\n\n**Error:** `Failed to connect to Tado: 401 Unauthorized`\n\n**Possible causes:**\n- Expired or invalid OAuth2 token\n- Token file corrupted\n- Tado service outage\n\n**Solutions:**\n1. Re-authenticate:\n   ```bash\n   python3 -m libtado -f ~\u002F.tado_auth.json zones\n   ```\n2. Check token file exists: `ls -la ~\u002F.tado_auth.json`\n3. Verify token file permissions: `chmod 600 ~\u002F.tado_auth.json`\n4. Check Tado service status at https:\u002F\u002Fstatus.tado.com\n\n### API Errors\n\n**Error:** `Failed to get status: HTTP 500`\n\n**Solution:** Tado API may be temporarily down. Check https:\u002F\u002Fstatus.tado.com\n\n---\n\n**Error:** `Zone 'X' not found`\n\n**Solution:** \n1. List available zones: `.\u002Fscripts\u002Ftado.py zones`\n2. Use exact zone ID or name from the list\n\n### Connection Issues\n\n**Error:** `Failed to connect to Tado: Network unreachable`\n\n**Solution:**\n1. Check internet connection\n2. Verify DNS is working: `ping my.tado.com`\n3. Check firewall settings\n\n### Library Errors\n\n**Error:** `ModuleNotFoundError: No module named 'PyTado'`\n\n**Solution:**\n```bash\npip3 install libtado --break-system-packages\n```\n\n---\n\n**Error:** `AttributeError: 'Tado' object has no attribute 'setAutoMode'`\n\n**Possible cause:** Outdated `libtado` version\n\n**Solution:**\n```bash\npip3 install --upgrade libtado\n```\n\n## API Rate Limits\n\nTado API has rate limits (exact numbers not publicly documented):\n\n**Best practices:**\n- Don't poll status more than once per minute\n- Use `--json` output and cache results when possible\n- Batch multiple zones in one `status` call instead of separate calls\n\n**If rate limited:**\n- Wait 1-2 minutes before retrying\n- Reduce polling frequency\n\n## Data Privacy\n\n**Local data:**\n- Credentials stored in `~\u002F.tado_credentials.json` (mode 600 recommended)\n- No usage tracking or telemetry\n- All API calls go directly to Tado servers\n\n**Never exposed:**\n- Your credentials are never sent anywhere except Tado API\n- Zone names, temperatures, and presence data stay local\n- No third-party analytics\n\n## Advanced Usage\n\n### Temperature Scheduling\n\nCreate a simple heating schedule script:\n\n```bash\n#!\u002Fbin\u002Fbash\n# morning-heat.sh - Warm up before wake-up\n\n# Set living room to 21°C at 6:30 AM\n.\u002Fscripts\u002Ftado.py set --zone \"Woonkamer\" -t 21 -d 120\n\n# Reset to schedule after 2 hours\nsleep 7200\n.\u002Fscripts\u002Ftado.py reset --zone \"Woonkamer\"\n```\n\nRun with cron:\n```\n30 6 * * * \u002Fpath\u002Fto\u002Fmorning-heat.sh\n```\n\n### Smart Away Detection\n\n```bash\n#!\u002Fbin\u002Fbash\n# smart-away.sh - Set away mode if nobody home\n\nANYONE_HOME=$(.\u002Fscripts\u002Ftado.py presence --json | jq -r '.anyone_home')\n\nif [ \"$ANYONE_HOME\" = \"false\" ]; then\n    .\u002Fscripts\u002Ftado.py mode away\n    echo \"Nobody home - enabled away mode\"\nfi\n```\n\n### Energy Monitoring\n\n```bash\n#!\u002Fbin\u002Fbash\n# energy-log.sh - Log heating activity\n\nDATE=$(date +%Y-%m-%d_%H:%M)\n.\u002Fscripts\u002Ftado.py status --json > ~\u002Flogs\u002Ftado-$DATE.json\n\n# Analyze with jq\njq '.zones[] | select(.heating == true) | {zone: .zone_name, power: .heating_power}' \\\n  ~\u002Flogs\u002Ftado-$DATE.json\n```\n\n## Known Limitations\n\n1. **Hot Water Control:** Basic support only (ON\u002FOFF), no temperature setting\n2. **Weather Data:** Not yet implemented (available in Tado API)\n3. **Energy IQ:** Statistics not yet exposed (available in Tado API)\n4. **Multi-Home:** Only one Tado home supported per token file\n\n## Future Enhancements\n\n- [x] OAuth2 authentication (✅ Implemented in v1.1.0)\n- [ ] Weather data integration\n- [ ] Energy IQ statistics\n- [ ] Multi-home support\n- [ ] Web dashboard (optional)\n- [ ] Push notifications for temperature alerts\n\n## Resources\n\n- **libtado Documentation:** https:\u002F\u002Flibtado.readthedocs.io\u002F\n- **libtado GitHub:** https:\u002F\u002Fgithub.com\u002Fgermainlefebvre4\u002Flibtado\n- **Tado API (unofficial):** https:\u002F\u002Fblog.scphillips.com\u002Fposts\u002F2017\u002F01\u002Fthe-tado-api-v2\u002F\n- **Tado Service Status:** https:\u002F\u002Fstatus.tado.com\n\n## Support\n\n**For skill issues:**\n- Check this SKILL.md\n- Read error messages carefully (they include hints)\n- Try `--json` output for debugging\n\n**For Tado API\u002Faccount issues:**\n- Check Tado app first (does it work?)\n- Visit https:\u002F\u002Fmy.tado.com\n- Contact Tado support\n\n## Changelog\n\n**v1.1.0** (2026-02-03)\n- ✅ **OAuth2 authentication** (libtado 4.1.1+)\n- ⚠️ **BREAKING:** Username\u002Fpassword auth removed (no longer supported by libtado)\n- One-time browser login flow via `python3 -m libtado`\n- Automatic token refresh\n- Updated all documentation for OAuth2\n\n**v0.1.0** (2026-01-29)\n- Initial release\n- Status, temperature control, modes, presence\n- JSON output support\n- Zone management (ID and name-based)\n- Error handling and troubleshooting\n",{"name":5,"homepage":33,"metadata":34,"description":7},"https:\u002F\u002Fwww.tado.com",{"openclaw":35},{"emoji":36,"requires":37},"?️",{"bins":38},[21,39],"pip3","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fcgnl\u002Ftado",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add kbarbel640-del\u002Fskills --skill tado",{"tool":53,"command":54},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill tado",{"tool":56,"command":57},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill tado","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FSKILL.md",true,[61,67,71,75,81,85,89,95,99,103],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"_meta.json","REFERENCE","参考文档",258,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002F_meta.json",{"path":68,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":69,"sourceHtmlUrl":70},"MIGRATION.md",4082,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FMIGRATION.md",{"path":72,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":73,"sourceHtmlUrl":74},"OAUTH2_ANALYSIS.md",8060,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FOAUTH2_ANALYSIS.md",{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"pyproject.toml","OTHER","其他",295,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002Fpyproject.toml",{"path":82,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":83,"sourceHtmlUrl":84},"QUICKSTART.md",1784,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FQUICKSTART.md",{"path":86,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":87,"sourceHtmlUrl":88},"README.md",3149,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FREADME.md",{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"scripts\u002Ftado.py","SCRIPT","脚本",14359,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002Fscripts\u002Ftado.py",{"path":96,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":97,"sourceHtmlUrl":98},"scripts\u002Ftest_mock.py",8844,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002Fscripts\u002Ftest_mock.py",{"path":100,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":101,"sourceHtmlUrl":102},"UPDATE_SUMMARY.md",5763,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FUPDATE_SUMMARY.md",{"path":104,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":105,"sourceHtmlUrl":106},"VERIFICATION_COMPLETE.md",6695,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Ftado\u002FVERIFICATION_COMPLETE.md",[108,138,167,187,193,213],{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":119,"publishedAt":28},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,19,136,137],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","content","ai agents",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":149,"publishedAt":28},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[144],{"categoryNo":145,"categoryName":146,"taxonomyType":147,"taxonomyTypeDesc":148},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[150,122,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,127,166],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":176,"publishedAt":28},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[173],{"categoryNo":174,"categoryName":175,"taxonomyType":147,"taxonomyTypeDesc":148},"01JBSEEDCAT000000000000021","资料检索与研究",[177,178,179,180,181,182,183,123,184,164,166,185,122,186,26],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http",{"skillNo":188,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":192,"publishedAt":28},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[191],{"categoryNo":174,"categoryName":175,"taxonomyType":147,"taxonomyTypeDesc":148},[180,179,178,177,26,182,183,123,181,164,166,184,185,122,186],{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":199,"publishedAt":28},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[200,201,202,203,204,205,206,207,208,209,210,211,212],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":214,"name":215,"nameZh":6,"description":216,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":217,"categories":218,"keywords":223,"publishedAt":28},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[219,220],{"categoryNo":145,"categoryName":146,"taxonomyType":147,"taxonomyTypeDesc":148},{"categoryNo":221,"categoryName":222,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000037","律师与法务",[224,225,226,227,123,228,229,40,230,185,22,231,232,233,234,19,235,236,237],"agent constitution","constitution","contracts","tree","query","base","log","Rules","projects","compliance","actions","state","governance","github"]