โ† Back to Transportation
Transportation by @hegghammer

location-awareness

Location awareness via privacy-friendly GPS tracking

0
Source Code

Location Awareness

This skill provides commands to execute. When the user asks about location, RUN the appropriate command below.

โš ๏ธ IMPORTANT: All commands use scripts/location.sh

Every command must be run via scripts/location.sh. Example:

User asks: "How long to walk home?"
You run:

scripts/location.sh eta home --mode walk

Output: 4.6 km, about 45 min walk
You reply with the output directly.

Do NOT run eta or other subcommands directly โ€” they don't exist as standalone commands.

Quick Reference โ€” What to Run

User says Run this (copy exactly) Reply with
"Where am I?" scripts/location.sh status Zone name only
"Map" / "map link" scripts/location.sh herewego Just the URL
"What are my coordinates?" scripts/location.sh status Lat/lon from output
"How long to walk home?" scripts/location.sh eta home --mode walk Distance + duration
"How long to bike to X?" scripts/location.sh eta X --mode bike Distance + duration
"How far is X by car?" scripts/location.sh eta X --mode car Distance + duration
"Remind me to X when I get to Y" scripts/location.sh remind "X" Y Brief confirm
"What reminders do I have?" scripts/location.sh reminders Bullet list or "None"
"List my places" scripts/location.sh places Bullet list
"List places nearby" scripts/location.sh places --near Sorted by distance
"List my pubs downtown" scripts/location.sh places --region downtown --category pub Filtered list
"Save this spot as X" scripts/location.sh addplace "X" Confirm
"Delete place X" scripts/location.sh delplace X Confirm
"Disable the grocery rule" scripts/location.sh disable grocery Confirm
"List my geofence rules" scripts/location.sh geofences Bullet list
"When was I last at X?" scripts/location.sh history X Date/time
"Where have I been today?" scripts/location.sh history --days 1 List of places
"Find me a cafe nearby" scripts/location.sh nearby cafe POI list with distances
"Any pubs within 1km?" scripts/location.sh nearby pub 1000 Filtered POI list
"How long was I at work this week?" scripts/location.sh stats --days 7 Hours per place

Response style: Terse. No preamble. No "Here's your location:". Just the answer.

All Commands

All via scripts/location.sh <command>:

Command Description
status Current location, geofences inside, map link
herewego Just the HERE WeGo map link
check Check for triggered actions/reminders (used by cron)
places [--near] [--region R] [--category C] List saved places
geofences List all geofences with full details
remind <text> <place_id> Add one-shot location reminder
reminders List pending reminders
addplace <name> [radius] [--region R] [--category C] Save current location
editplace <id> [--name] [--radius] [--region] [--category] [--action] [--cooldown] Modify a place
delplace <id> Delete a place
enable <id> / disable <id> Toggle geofence on/off
history [place] [--days N] When was I last at a place?
nearby <category> [radius] Find nearby POIs (cafe, pub, restaurant, etc.)
stats [--days N] Time spent at each place, visit counts
proximity <text> <place/lat> [lon] [radius] Alert when approaching a location
eta <place> [--mode walk|bike|car] Travel time and distance to a place

Note: eta accepts saved place names, coordinates (lat,lon), or any place name (geocoded via OpenStreetMap, biased to current location).

Note: status returns the zone name if in a known place, otherwise reverse geocodes to a street address (e.g., "123 Main Street, Downtown").

Concepts

Geofences โ€” Saved places with lat/lon, radius, and optional action. Persistent.

Reminders โ€” One-shot alerts tied to a place. Deleted after delivery.

Region/Category โ€” Optional tags for filtering (e.g., "downtown", "pub").


Setup (for administrators)

Provider Configuration

Edit scripts/config.json:

Home Assistant (default):

{
  "provider": "homeassistant",
  "homeassistant": {
    "url": "https://your-ha.example.com",
    "token": "your-long-lived-token",
    "entity_id": "device_tracker.phone"
  }
}

OwnTracks:

{
  "provider": "owntracks",
  "owntracks": {
    "url": "https://owntracks.example.com",
    "user": "username",
    "device": "phone"
  }
}

Generic HTTP:

{
  "provider": "http",
  "http": {
    "url": "https://your-api.com/location",
    "headers": {"Authorization": "Bearer token"}
  }
}

GPSLogger (file-based):

{
  "provider": "gpslogger",
  "gpslogger": {
    "file": "/path/to/location.json"
  }
}

Secrets support: "env:VAR_NAME" (reads from environment variable) or plain string.

Alternative: Configure entirely via environment variables (no config.json needed):

Provider Env variables
LOCATION_PROVIDER homeassistant, owntracks, http, or gpslogger (default: homeassistant)
Home Assistant HA_URL, HA_TOKEN, HA_ENTITY_ID
OwnTracks OWNTRACKS_URL, OWNTRACKS_USER, OWNTRACKS_DEVICE, OWNTRACKS_TOKEN
HTTP LOCATION_HTTP_URL
GPSLogger GPSLOGGER_FILE

Env vars take precedence over config.json values. Set them in ~/.openclaw/.env or your shell environment.

Output format: Most query commands output human-readable text by default. Add --json for JSON output (useful for scripting).

Travel Speeds

Customize walking/biking speeds for ETA calculations in scripts/config.json:

{
  "speeds_kmh": {
    "walk": 6,
    "bike": 15
  }
}

Geofence Config

Edit scripts/geofences.json:

{
  "geofences": [
    {
      "id": "grocery",
      "name": "Grocery Store",
      "lat": 40.7128,
      "lon": -74.0060,
      "radius_m": 30,
      "action": "shopping_tasks",
      "cooldown_hours": 4,
      "enabled": true,
      "region": "downtown",
      "category": "shop"
    }
  ],
  "location_reminders": [],
  "proximity_alerts": []
}

Automatic Notifications (OpenClaw Cron)

Use OpenClaw's built-in cron to run periodic location checks. Add a job to ~/.openclaw/cron/jobs.json:

{
  "name": "Location Check",
  "schedule": "*/5 * * * *",
  "prompt": "Run scripts/location.sh check --json and notify me of any triggered actions, reminders, or proximity alerts.",
  "channel": "signal",
  "to": "+1234567890",
  "wakeMode": "now"
}

This keeps scheduling within OpenClaw rather than requiring external systemd services.