openclaw/skills/presence/SKILL.md
Check who is home at the cabin (Philly) or Crosstown (Boston). Use when the user asks "is anyone home", "who's home", "is Julia/Dylan home", "is anyone at the cabin", or presence detection. This skill is read-only — it reports occupancy status but does NOT trigger any actions.
npx skillsauth add Dbochman/dotfiles presenceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Detect who is home at each location by querying local network devices. This is a detection-only system — it tracks and reports occupancy but takes no automated actions (no lights, thermostats, or routines are triggered).
Read the cached state (updated every 15 min, no scan needed):
cat ~/.openclaw/presence/state.json
Or run a fresh scan:
# Cabin (on Mac Mini)
~/.openclaw/workspace/scripts/presence-detect.sh cabin
# Crosstown (on MacBook Pro via crosstown-network skill)
ssh dylans-macbook-pro "~/.openclaw/workspace/scripts/presence-detect.sh crosstown"
The Mac Mini maintains a correlated view of both locations at ~/.openclaw/presence/state.json:
{
"timestamp": "2026-03-01T22:20:14.043Z",
"people": {
"Dylan": { "cabin": false, "crosstown": true, "location": "crosstown" },
"Julia": { "cabin": true, "crosstown": false, "location": "cabin" }
},
"cabin": { "occupancy": "occupied", "scanAge": "0min", "fresh": true },
"crosstown": { "occupancy": "occupied", "scanAge": "0min", "fresh": true },
"transitions": []
}
| Value | Meaning |
|-------|---------|
| occupied | At least one tracked person is present |
| confirmed_vacant | ALL tracked people absent AND confirmed present at the other location |
| possibly_vacant | Nobody detected, but can't confirm they're elsewhere (no previous location on record) |
Arrival-based (sticky) model: Once a person is detected at a location, they stay there until positively detected at the other location. Phones going to sleep or missing a scan cycle do NOT cause people to "disappear". Vacancy is only confirmed_vacant when everyone has been detected at the other location.
| Location | Tracked people | Vacancy requires | |----------|---------------|------------------| | Cabin | Dylan, Julia | Both detected at Crosstown | | Crosstown | Dylan, Julia | Both detected at Cabin |
Logged when occupancy or person location changes between evaluations:
{"location": "cabin", "from": "occupied", "to": "confirmed_vacant", "timestamp": "..."}
{"person": "Dylan", "event": "relocated", "from": "cabin", "to": "crosstown", "timestamp": "..."}
Recent events (last 100):
cat ~/.openclaw/presence/events.json
MacBook Pro (Crosstown) Mac Mini (Cabin)
┌───────────────────────┐ ┌──────────────────────────┐
│ com.openclaw. │ │ com.openclaw. │
│ presence-crosstown │ │ presence-cabin │
│ Every 15 min: │ │ Every 15 min: │
│ ARP scan 192.168.165 │ │ Starlink gRPC API │
│ Write crosstown- │──tailscale │ Write cabin-scan.json │
│ scan.json │──file cp──▶│ │
└───────────────────────┘ │ com.openclaw. │
│ presence-receive │
│ KeepAlive daemon: │
│ Receive crosstown scan │
│ Trigger evaluate │
│ │
│ Evaluator: │
│ Correlate both scans │
│ Write state.json │
└──────────────────────────┘
| Agent | Host | Schedule | Purpose |
|-------|------|----------|---------|
| com.openclaw.presence-cabin | Mac Mini | Every 15 min | Scan cabin WiFi, evaluate |
| com.openclaw.presence-crosstown | MacBook Pro | Every 15 min | Scan Crosstown LAN, push to Mac Mini |
| com.openclaw.presence-receive | Mac Mini | KeepAlive | Receive Crosstown state via Tailscale |
~/.openclaw/presence/)| File | Contents |
|------|----------|
| state.json | Correlated occupancy (the main file to read) |
| cabin-scan.json | Raw cabin scan result |
| crosstown-scan.json | Raw Crosstown scan result (pushed from MacBook Pro) |
| events.json | Rolling log of last 100 transitions |
| prev-evaluated.json | Previous evaluation (for transition detection) |
~/.openclaw/logs/presence-detect.log (on both machines)~/.openclaw/logs/presence-receive.log (on Mac Mini)grpcurl at 192.168.1.1:9000)192.168.165.0/24 with stale-entry refresh. After initial ping sweep, tracked IPs' ARP entries are deleted and re-pinged — only devices actually on the network re-populate (ARP is layer 2, works even when iPhones are sleeping and ignoring ICMP).6c:3a:ff:5f:fc:ba (private WiFi address off at Crosstown)julias-iphone, MAC 38:e1:3d:c0:40:63, IP 192.168.165.248d4:3d:39:a7:4b:6c, hostname da16200-4b6c. Does NOT affect vacancy decisions.julias-iphone.lan from mDNS) is the most durable — survives MAC/IP rotation. MAC and IP are fallbacks.ssh dylans-macbook-pro) using dedicated key ~/.ssh/id_mini_to_mbp (bypasses 1Password agent which hangs under launchd).This skill is detection-only — it reports who is home but takes no automated actions.
For related tasks, switch to:
com.openclaw.vacancy-actions LaunchAgent) watches state.json and triggers automated actions (lights off, eco mode, Roombas start) when a location becomes confirmed_vacant — this is fully automated and does NOT require the presence skill to be invokeddevelopment
Search the web for current information, news, facts, and answers. Use when asked questions about current events, needing to look something up, finding websites, researching topics, or when you need up-to-date information beyond your training data.
development
Summarize any URL, YouTube video, podcast, PDF, or file into concise text. Use when asked to read an article, summarize a link, get the gist of a video or podcast, extract content from a URL, or when you need to understand what a web page or document contains.
development
Play music via Spotify and control Google Home speakers. Use when asked to play music, songs, artists, playlists, podcasts, or control speakers/volume/audio.
testing
Create new OpenClaw skills, modify and improve existing skills, and measure skill performance with evals. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. Also use when asked to "make a skill", "turn this into a skill", "improve this skill", or "test this skill".