计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
tado【效率与协作】Control your Tado smart thermostat - check temperature, set heating, manage home/away modes, and monitor presence via geolocation.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Control your Tado smart thermostat from OpenClaw.
cd ~/clawd/skills/tado
pip3 install libtado --break-system-packages
Minimum version: libtado 4.1.1+ (OAuth2 support required)
⚠️ Important: libtado 4.1.1+ requires OAuth2. Username/password authentication is no longer supported.
First-time setup:
# Run the libtado CLI to authenticate via browser
python3 -m libtado -f ~/.tado_auth.json zones
What happens:
~/.tado_auth.jsonAfter setup:
~/.tado_auth.jsonSecurity Note: The token file should be readable only by you:
chmod 600 ~/.tado_auth.json
cd ~/clawd/skills/tado
./scripts/tado.py zones
You should see a list of your configured zones.
If authentication fails:
# Re-authenticate (regenerates tokens)
python3 -m libtado -f ~/.tado_auth.json zones
As of libtado 4.1.1+, OAuth2 is the only supported authentication method.
Token file location: ~/.tado_auth.json
How it works:
python3 -m libtado -f ~/.tado_auth.json zonestoken_file_path parameter: Tado(token_file_path='~/.tado_auth.json')Token structure (managed by libtado):
{
"access_token": "...",
"refresh_token": "...",
"expires_at": 1234567890
}
Do NOT manually edit this file! Let libtado manage it.
Old authentication (no longer works):
Tado(username='email', password='pass') # ❌ Not supported
New authentication (required):
Tado(token_file_path='~/.tado_auth.json') # ✅ Works
Migration steps:
~/.tado_credentials.json (no longer used)python3 -m libtado -f ~/.tado_auth.json zonesNo backward compatibility: Once you upgrade to libtado 4.1.1+, you MUST use OAuth2.
Get status of all zones:
./scripts/tado.py status
Output:
🏠 Woonkamer (Zone 1)
Current: 20.5°C (55% humidity)
Target: 21.0°C
Heating: ON (45%)
Mode: Auto (following schedule)
🏠 Slaapkamer (Zone 2)
Current: 18.2°C (58% humidity)
Target: 18.0°C
Heating: OFF (0%)
Mode: Auto (following schedule)
Get status of specific zone:
./scripts/tado.py status --zone 1
./scripts/tado.py status --zone "Woonkamer"
JSON output (for scripting):
./scripts/tado.py status --json
Set temperature (permanent until next schedule change):
./scripts/tado.py set --zone 1 --temperature 21
./scripts/tado.py set --zone "Woonkamer" --temperature 21.5
Set temperature with timer (temporary override):
# Set 22°C for 60 minutes, then return to schedule
./scripts/tado.py set --zone 1 --temperature 22 --duration 60
# Short form
./scripts/tado.py set --zone 1 -t 22 -d 60
Reset to automatic schedule:
./scripts/tado.py reset --zone 1
./scripts/tado.py reset --zone "Woonkamer"
Set home mode (all zones follow schedule):
./scripts/tado.py mode home
Set away mode (energy-saving temperatures):
./scripts/tado.py mode away
Set auto mode (geolocation-based):
./scripts/tado.py mode auto
When in auto mode, Tado automatically switches between home/away based on your phone's location.
Check who is home:
./scripts/tado.py presence
Output:
👥 Presence
Anyone home: Yes
- Sander's iPhone: 🏠 Home
- Partner's iPhone: 🚶 Away
List all zones:
./scripts/tado.py zones
Output:
📍 Available Zones:
1: Woonkamer (HEATING)
2: Slaapkamer (HEATING)
3: Badkamer (HOT_WATER)
Zones can be referenced by ID or name:
# By ID (faster)
./scripts/tado.py status --zone 1
# By name (case-insensitive)
./scripts/tado.py status --zone "Woonkamer"
./scripts/tado.py status --zone "woonkamer"
All commands support --json flag for machine-readable output:
./scripts/tado.py status --zone 1 --json
Example output:
{
"zone_id": 1,
"zone_name": "Woonkamer",
"current_temp": 20.5,
"current_humidity": 55,
"target_temp": 21.0,
"heating": true,
"heating_power": 45,
"mode": "MANUAL",
"overlay": true
}
Use in scripts:
# Get current temperature as number
TEMP=$(./scripts/tado.py status --zone 1 --json | jq -r '.current_temp')
# Check if heating is on
HEATING=$(./scripts/tado.py status --zone 1 --json | jq -r '.heating')
# Get all zones data
./scripts/tado.py status --json | jq '.zones[] | {name: .zone_name, temp: .current_temp}'
From OpenClaw chat:
@jarvis What's the temperature in the living room?
→ Uses: ./scripts/tado.py status --zone "Woonkamer"
@jarvis Set living room to 22 degrees for 1 hour
→ Uses: ./scripts/tado.py set --zone "Woonkamer" -t 22 -d 60
@jarvis Is anyone home?
→ Uses: ./scripts/tado.py presence
@jarvis Turn on away mode
→ Uses: ./scripts/tado.py mode away
Error: Tado OAuth2 token not found!
Solution: Run the one-time authentication flow:
python3 -m libtado -f ~/.tado_auth.json zones
Then follow the browser login prompt.
Error: Failed to connect to Tado: 401 Unauthorized
Possible causes:
Solutions:
python3 -m libtado -f ~/.tado_auth.json zones
ls -la ~/.tado_auth.jsonchmod 600 ~/.tado_auth.jsonError: Failed to get status: HTTP 500
Solution: Tado API may be temporarily down. Check https://status.tado.com
Error: Zone 'X' not found
Solution:
./scripts/tado.py zonesError: Failed to connect to Tado: Network unreachable
Solution:
ping my.tado.comError: ModuleNotFoundError: No module named 'PyTado'
Solution:
pip3 install libtado --break-system-packages
Error: AttributeError: 'Tado' object has no attribute 'setAutoMode'
Possible cause: Outdated libtado version
Solution:
pip3 install --upgrade libtado
Tado API has rate limits (exact numbers not publicly documented):
Best practices:
--json output and cache results when possiblestatus call instead of separate callsIf rate limited:
Local data:
~/.tado_credentials.json (mode 600 recommended)Never exposed:
Create a simple heating schedule script:
#!/bin/bash
# morning-heat.sh - Warm up before wake-up
# Set living room to 21°C at 6:30 AM
./scripts/tado.py set --zone "Woonkamer" -t 21 -d 120
# Reset to schedule after 2 hours
sleep 7200
./scripts/tado.py reset --zone "Woonkamer"
Run with cron:
30 6 * * * /path/to/morning-heat.sh
#!/bin/bash
# smart-away.sh - Set away mode if nobody home
ANYONE_HOME=$(./scripts/tado.py presence --json | jq -r '.anyone_home')
if [ "$ANYONE_HOME" = "false" ]; then
./scripts/tado.py mode away
echo "Nobody home - enabled away mode"
fi
#!/bin/bash
# energy-log.sh - Log heating activity
DATE=$(date +%Y-%m-%d_%H:%M)
./scripts/tado.py status --json > ~/logs/tado-$DATE.json
# Analyze with jq
jq '.zones[] | select(.heating == true) | {zone: .zone_name, power: .heating_power}' \
~/logs/tado-$DATE.json
For skill issues:
--json output for debuggingFor Tado API/account issues:
v1.1.0 (2026-02-03)
python3 -m libtadov0.1.0 (2026-01-29)