openclaw/skills/dog-walk/SKILL.md
Automated dog walk detection and Roomba control. Detects departures via Fi GPS collar, starts Roombas, and monitors return via Ring motion + WiFi + Fi GPS. Use when asked about dog walks, Roomba automation during walks, or walk tracking.
npx skillsauth add Dbochman/dotfiles dog-walkInstall 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.
Detects dog walks via Fi GPS collar (departure) and manages Roomba automation with multi-signal return detection (Ring motion + WiFi + Fi GPS).
home_location.walk_id and origin_location fields at departure.~/.openclaw/dog-walk/routes/<location>/<YYYY-MM-DD>/<walk_id>.json.distance_m, point_count, inferred end_location, and is_interhome_transit.7 AM-12 PM, 12 PM-5 PM, 5 PM-9 PM.Departure uses combo triggers for fast detection (~1 min), with a GPS geofence fallback.
Typical latency: ~1 minute
This trigger works without Ring (e.g., leaving through back door at cabin) and fires as soon as Fi recognizes the walk activity.
Typical latency: ~1-2 minutes
If no combo trigger fires, the GPS-only path still works:
Typical latency: ~5-7 minutes (normal), ~2 minutes (accelerated)
Acceleration: When the base station is disconnected OR Fi activity is Walk, polling switches from 3min to 30s and the confirmation threshold drops from 3min to 60s. Backyard time does not trigger departure — the 30m geofence (Crosstown) / 75m geofence (Cabin) is large enough that GPS still shows Potato at home even with base station BLE out of range (~30-50m).
Walk hours: 7 AM-12 PM, 12-5 PM, 5-9 PM
Pre-checks:
Per-location Roomba commands:
| Location | Start | Dock |
|----------|-------|------|
| Crosstown | crosstown-roomba start all | crosstown-roomba dock all |
| Cabin | roomba start floomba + roomba start philly | roomba dock floomba + roomba dock philly |
Fi GPS geofences:
| Location | Radius | |----------|--------| | Crosstown (19 Crosstown Ave, West Roxbury) | 30m | | Cabin (95 School House Rd, Phillipston) | 75m |
After departure, the return monitor uses three signals — any one triggers Roomba docking:
| Signal | Interval | How it works | |--------|----------|-------------| | Ring motion | Event-driven | Person detected at doorbell during monitoring | | WiFi / network presence | Every 30s (after 10min) | ARP scan (Crosstown via MBP) or Starlink gRPC (Cabin). Detects phone reconnecting to WiFi. Ignored for first 10 minutes — phones linger on WiFi at the front door. | | Fi GPS | Every 30s | Polls Potato's Fi collar GPS. Docks when Potato re-enters home geofence. Base-station echo detection prevents false "at home" readings. | | Fi GPS (inter-home) | Every 30s | If Potato enters the other home's geofence during monitoring, the walk is auto-finalized as an inter-home transit. Roombas dock at origin, home anchor updates to the new location. |
OngoingWalk path is fetched (dense polyline) and merged into the route fileactivityFeed for authoritative timestamps and distance, then merges all Walk segments that overlap our outing window ([our_started_at - 5min, our_ended_at + 5min]). Fi splits a single outing into multiple Walks when the dog pauses for Play/Rest (sniffing, yard time); the merge takes the earliest start, latest end, sum of distances, and records fi_walk_count for transparency. A background thread retries at 5 / 10 / 20 min after return to catch Walks Fi finalizes late — retries are idempotent and always scheduled so late segments can be merged in.crosstown-roomba dock command sends stop before dock because iRobot's MQTT dock is silently ignored during active cleaning. The CLI now skips stop+dock for any robot whose phase is charge (already on dock), so the verify-retry path doesn't re-stop a docked robot when only one needs a re-dock.Charging (on dock) in status). If not, it retries the dock command up to 2 times (3min between each). If still not docked after all retries, sends an iMessage warning. State is updated with dock_verified: true/false and dock_retry_count.On departure, the collar switches to LOST_DOG mode for high-frequency GPS (~15-30s updates vs ~3-7min in NORMAL). This produces dense route data for dashboard mapping.
Battery protection: If consecutive GPS readings show car speeds (>30mph) for 6+ minutes, the collar switches back to NORMAL to avoid unnecessary drain during inter-home car trips. Speed resets if Potato slows to walking pace.
The collar always resets to NORMAL when the walk ends (via the return monitor's finally block). On listener startup, the collar mode is checked and reset to NORMAL if stuck in LOST_DOG (safety net for crashes/power outages).
Roomba automation can be temporarily disabled per-location via the Roomba Dashboard (port 8553). When snoozed:
Snooze state is stored at ~/.openclaw/dog-walk/snooze.json and expires automatically.
Dashboard UI: Snooze bar on the Roomba Dashboard (port 8553) with 1h / 3h / 8h / Indef presets per location, plus a Clear button.
API: POST http://localhost:8553/api/snooze with {"location": "crosstown", "minutes": 60} (or "all", 0 to clear).
Start commands have a 2-hour cooldown to prevent re-triggering. Dock commands always execute immediately — Roombas should never be left running because of a cooldown.
dog-walk-start <location> # "cabin" or "crosstown"
Starts Roombas and signals the listener to begin return monitoring via inbox IPC.
~/.openclaw/dog-walk/state.json~/.openclaw/dog-walk/history/YYYY-MM-DD.jsonl~/.openclaw/dog-walk/routes/<location>/<YYYY-MM-DD>/<walk_id>.json~/.openclaw/dog-walk/inbox/The listener runs as a persistent KeepAlive LaunchAgent (ai.openclaw.dog-walk-listener).
To check:
launchctl list | grep dog-walk-listener # should show PID
tail -f ~/.openclaw/logs/dog-walk-listener.log
To restart:
launchctl unload ~/Library/LaunchAgents/ai.openclaw.dog-walk-listener.plist
launchctl load ~/Library/LaunchAgents/ai.openclaw.dog-walk-listener.plist
Recent dog-walk changes touched these paths:
openclaw/skills/dog-walk/dog-walk-listener.pyopenclaw/bin/dog-walk-dashboard.pyopenclaw/bin/roomba-dashboard.pyopenclaw/skills/fi-collar/fi-api.pyIf deploying to the Mac Mini, make sure the updated files are present under ~/.openclaw/, then restart:
launchctl kickstart -k gui/$(id -u)/ai.openclaw.dog-walk-listener
launchctl kickstart -k gui/$(id -u)/ai.openclaw.dog-walk-dashboard
launchctl kickstart -k gui/$(id -u)/ai.openclaw.roomba-dashboard
Quick verification:
tail -20 ~/.openclaw/logs/dog-walk-listener.log
tail -20 ~/.openclaw/logs/dog-walk-dashboard.log
tail -20 ~/.openclaw/logs/roomba-dashboard.log
curl -s http://localhost:8552/api/routes?days=30 | jq '.meta'
curl -s http://localhost:8553/api/roombas | jq '.'
This skill handles dog walk detection and Roomba automation triggered by Fi GPS departure.
For related tasks, switch to:
com.openclaw.vacancy-actions) is separate — starts Roombas on vacancydevelopment
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".