{
  "schemaVersion": "1.0",
  "item": {
    "slug": "nest-sdm",
    "name": "Nest SDM",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/tag-assistant/nest-sdm",
    "canonicalUrl": "https://clawhub.ai/tag-assistant/nest-sdm",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/nest-sdm",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=nest-sdm",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "nest-events.sh",
      "nest-sdm.sh"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/nest-sdm"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/nest-sdm",
    "agentPageUrl": "https://openagent3.xyz/skills/nest-sdm/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nest-sdm/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nest-sdm/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Nest SDM Skill",
        "body": "Control and monitor Google Nest devices via the Smart Device Management REST API."
      },
      {
        "title": "Prerequisites",
        "body": "Device Access Console — Register at https://console.nest.google.com/device-access ($5 one-time fee)\nGCP Project — Create at https://console.cloud.google.com with SDM API enabled\nOAuth Client — Web application type with https://www.google.com as redirect URI\nSDM scope — Add https://www.googleapis.com/auth/sdm.service to OAuth consent screen"
      },
      {
        "title": "First-time Authorization",
        "body": "Build the authorization URL:\n\nhttps://nestservices.google.com/partnerconnections/<PROJECT_ID>/auth?redirect_uri=https://www.google.com&access_type=offline&prompt=consent&client_id=<CLIENT_ID>&response_type=code&scope=https://www.googleapis.com/auth/sdm.service\n\nOpen in browser, sign in as the device owner Google account\nEnable ALL device permissions, click Next, then Continue through consent\nCopy the code= parameter from the redirect URL\nExchange for tokens:\n\ncurl -s -X POST https://oauth2.googleapis.com/token \\\n  -d \"client_id=<CLIENT_ID>\" \\\n  -d \"client_secret=<CLIENT_SECRET>\" \\\n  -d \"code=<AUTH_CODE>\" \\\n  -d \"grant_type=authorization_code\" \\\n  -d \"redirect_uri=https://www.google.com\"\n\nSave tokens to the config file (see Configuration below)"
      },
      {
        "title": "Configuration",
        "body": "Create ~/.openclaw/workspace/.nest-sdm-tokens.json:\n\n{\n  \"client_id\": \"<your-client-id>\",\n  \"client_secret\": \"<your-client-secret>\",\n  \"project_id\": \"<device-access-project-id>\",\n  \"refresh_token\": \"<your-refresh-token>\",\n  \"token_type\": \"Bearer\",\n  \"scope\": \"https://www.googleapis.com/auth/sdm.service\"\n}\n\nSecure it: chmod 600 ~/.openclaw/workspace/.nest-sdm-tokens.json"
      },
      {
        "title": "CLI Usage",
        "body": "# Alias for convenience\nalias nest=\"<skill-dir>/nest-sdm.sh\""
      },
      {
        "title": "Device Discovery",
        "body": "nest devices                    # List all devices (JSON)\nnest structures                 # List structures/rooms"
      },
      {
        "title": "Thermostat",
        "body": "nest thermostat                 # Current status (temp, humidity, mode, setpoints)\nnest set-cool <°F>              # Set to COOL mode at temperature\nnest set-heat <°F>              # Set to HEAT mode at temperature\nnest set-range <low°F> <high°F> # Set HEATCOOL range\nnest set-mode <MODE>            # HEAT | COOL | HEATCOOL | OFF\nnest set-eco <MODE>             # MANUAL_ECO | OFF\nnest fan-on [duration_seconds]  # Turn fan on (default: 900s / 15min)\nnest fan-off                    # Turn fan off"
      },
      {
        "title": "Doorbell & Cameras",
        "body": "nest doorbell                   # Doorbell info & capabilities\nnest display                    # Kitchen display info\nnest camera-stream <DEVICE_ID>  # Generate WebRTC live stream (returns SDP answer)\nnest camera-image <EVENT_ID>    # Get event snapshot URL"
      },
      {
        "title": "Raw API",
        "body": "nest api GET devices                              # Raw device list\nnest api GET devices/<DEVICE_ID>                  # Single device\nnest api POST devices/<DEVICE_ID>:executeCommand '{\"command\":\"...\",\"params\":{...}}'"
      },
      {
        "title": "Supported Devices",
        "body": "TypeTraitsControlTHERMOSTATTemperature, Humidity, Mode, Eco, Fan, HVAC, Setpoint, ConnectivityFull read/writeDOORBELLLiveStream, CameraImage, Person, Motion, Chime, EventImage, ClipPreviewRead + streamDISPLAYLiveStream, CameraImage, Person, Sound, Motion, EventImageRead + stream"
      },
      {
        "title": "Thermostat Commands",
        "body": "CommandParamsThermostatMode.SetMode{\"mode\": \"HEAT|COOL|HEATCOOL|OFF\"}ThermostatTemperatureSetpoint.SetHeat{\"heatCelsius\": <float>}ThermostatTemperatureSetpoint.SetCool{\"coolCelsius\": <float>}ThermostatTemperatureSetpoint.SetRange{\"heatCelsius\": <float>, \"coolCelsius\": <float>}ThermostatEco.SetMode{\"mode\": \"MANUAL_ECO|OFF\"}Fan.SetTimer{\"timerMode\": \"ON\", \"duration\": \"<seconds>s\"}"
      },
      {
        "title": "Camera Commands",
        "body": "CommandParamsCameraLiveStream.GenerateWebRtcStream{\"offerSdp\": \"<SDP offer>\"}CameraLiveStream.StopWebRtcStream{\"mediaSessionId\": \"<id>\"}CameraLiveStream.ExtendWebRtcStream{\"mediaSessionId\": \"<id>\"}CameraEventImage.GenerateImage{\"eventId\": \"<event-id>\"}"
      },
      {
        "title": "Pub/Sub Real-Time Events",
        "body": "Get instant alerts for doorbell presses, motion, person detection, and device state changes."
      },
      {
        "title": "CLI: nest-events",
        "body": "nest-events setup-check         # Verify Pub/Sub config is ready\nnest-events create-topic        # Create GCP Pub/Sub topic\nnest-events grant-permissions   # Grant SDM publisher role\nnest-events create-subscription # Create pull subscription\nnest-events poll                # Pull events once\nnest-events listen              # Poll continuously (daemon)"
      },
      {
        "title": "Setup Steps",
        "body": "OAuth with Pub/Sub scope — Run OAuth flow as your-email@example.com with pubsub + cloud-platform scopes. Save tokens to .nest-pubsub-tokens.json.\nCreate topic — nest-events create-topic (creates projects/YOUR_GCP_PROJECT/topics/nest-sdm-events)\nGrant permissions — nest-events grant-permissions (adds sdm-publisher@googlegroups.com)\nCreate subscription — nest-events create-subscription\nEnable in Device Access Console — https://console.nest.google.com/device-access → Enable Pub/Sub → Enter topic ID\nTrigger initial events — nest devices (one-time API call)\nStart listener — nest-events listen"
      },
      {
        "title": "Event Types Supported",
        "body": "EventAlertDoorbellChime.Chime🔔 DOORBELL — Someone rang!CameraPerson.Person👤 Person detected at deviceCameraMotion.Motion🏃 Motion at deviceCameraSound.Sound🔊 Sound at deviceThermostatHvac status change❄️/🔥 HVAC now COOLING/HEATINGThermostatTemperatureSetpoint🌡️ Setpoint changedTemperature trait🌡️ Ambient temperature change"
      },
      {
        "title": "Configuration",
        "body": "Environment Variables:\n\nVariableDescriptionDefaultNEST_PUBSUB_TOKENSPath to Pub/Sub OAuth tokens~/.openclaw/workspace/.nest-pubsub-tokens.jsonTELEGRAM_BOT_TOKENBot token for alertsfrom ~/.zshenvTELEGRAM_CHAT_IDUser/chat ID for alertsfrom ~/.zshenvPOLL_INTERVALSeconds between polls10GCP_PROJECTGCP project IDYOUR_GCP_PROJECTPUBSUB_TOPICTopic namenest-sdm-eventsPUBSUB_SUBSCRIPTIONSubscription namenest-sdm-events-sub"
      },
      {
        "title": "Event Logs",
        "body": "Raw events are logged to data/nest-events/events-YYYY-MM-DD.jsonl."
      },
      {
        "title": "Alert Dedup",
        "body": "Same event type won't re-alert within 60 seconds to prevent alert fatigue."
      },
      {
        "title": "Important Notes",
        "body": "Token expiry: If the GCP app is in \"testing\" mode, refresh tokens expire in 7 days. Publish the app to avoid re-auth.\nTemperature: API uses Celsius internally. The CLI handles F↔C conversion.\nSetpoint constraints: HEATCOOL range must have at least 1.5°C (2.7°F) gap between heat and cool setpoints.\nCamera streams: WebRTC only (no RTSP). Requires SDP offer/answer exchange.\nRate limits: 10 queries/min per device, 10 commands/min per device.\nEvents: Use nest-events listen for real-time alerts. Requires Pub/Sub setup (see above)."
      }
    ],
    "body": "Nest SDM Skill\n\nControl and monitor Google Nest devices via the Smart Device Management REST API.\n\nSetup\nPrerequisites\nDevice Access Console — Register at https://console.nest.google.com/device-access ($5 one-time fee)\nGCP Project — Create at https://console.cloud.google.com with SDM API enabled\nOAuth Client — Web application type with https://www.google.com as redirect URI\nSDM scope — Add https://www.googleapis.com/auth/sdm.service to OAuth consent screen\nFirst-time Authorization\nBuild the authorization URL:\nhttps://nestservices.google.com/partnerconnections/<PROJECT_ID>/auth?redirect_uri=https://www.google.com&access_type=offline&prompt=consent&client_id=<CLIENT_ID>&response_type=code&scope=https://www.googleapis.com/auth/sdm.service\n\nOpen in browser, sign in as the device owner Google account\nEnable ALL device permissions, click Next, then Continue through consent\nCopy the code= parameter from the redirect URL\nExchange for tokens:\ncurl -s -X POST https://oauth2.googleapis.com/token \\\n  -d \"client_id=<CLIENT_ID>\" \\\n  -d \"client_secret=<CLIENT_SECRET>\" \\\n  -d \"code=<AUTH_CODE>\" \\\n  -d \"grant_type=authorization_code\" \\\n  -d \"redirect_uri=https://www.google.com\"\n\nSave tokens to the config file (see Configuration below)\nConfiguration\n\nCreate ~/.openclaw/workspace/.nest-sdm-tokens.json:\n\n{\n  \"client_id\": \"<your-client-id>\",\n  \"client_secret\": \"<your-client-secret>\",\n  \"project_id\": \"<device-access-project-id>\",\n  \"refresh_token\": \"<your-refresh-token>\",\n  \"token_type\": \"Bearer\",\n  \"scope\": \"https://www.googleapis.com/auth/sdm.service\"\n}\n\n\nSecure it: chmod 600 ~/.openclaw/workspace/.nest-sdm-tokens.json\n\nCLI Usage\n# Alias for convenience\nalias nest=\"<skill-dir>/nest-sdm.sh\"\n\nDevice Discovery\nnest devices                    # List all devices (JSON)\nnest structures                 # List structures/rooms\n\nThermostat\nnest thermostat                 # Current status (temp, humidity, mode, setpoints)\nnest set-cool <°F>              # Set to COOL mode at temperature\nnest set-heat <°F>              # Set to HEAT mode at temperature\nnest set-range <low°F> <high°F> # Set HEATCOOL range\nnest set-mode <MODE>            # HEAT | COOL | HEATCOOL | OFF\nnest set-eco <MODE>             # MANUAL_ECO | OFF\nnest fan-on [duration_seconds]  # Turn fan on (default: 900s / 15min)\nnest fan-off                    # Turn fan off\n\nDoorbell & Cameras\nnest doorbell                   # Doorbell info & capabilities\nnest display                    # Kitchen display info\nnest camera-stream <DEVICE_ID>  # Generate WebRTC live stream (returns SDP answer)\nnest camera-image <EVENT_ID>    # Get event snapshot URL\n\nRaw API\nnest api GET devices                              # Raw device list\nnest api GET devices/<DEVICE_ID>                  # Single device\nnest api POST devices/<DEVICE_ID>:executeCommand '{\"command\":\"...\",\"params\":{...}}'\n\nSupported Devices\nType\tTraits\tControl\nTHERMOSTAT\tTemperature, Humidity, Mode, Eco, Fan, HVAC, Setpoint, Connectivity\tFull read/write\nDOORBELL\tLiveStream, CameraImage, Person, Motion, Chime, EventImage, ClipPreview\tRead + stream\nDISPLAY\tLiveStream, CameraImage, Person, Sound, Motion, EventImage\tRead + stream\nSDM API Commands Reference\nThermostat Commands\nCommand\tParams\nThermostatMode.SetMode\t{\"mode\": \"HEAT|COOL|HEATCOOL|OFF\"}\nThermostatTemperatureSetpoint.SetHeat\t{\"heatCelsius\": <float>}\nThermostatTemperatureSetpoint.SetCool\t{\"coolCelsius\": <float>}\nThermostatTemperatureSetpoint.SetRange\t{\"heatCelsius\": <float>, \"coolCelsius\": <float>}\nThermostatEco.SetMode\t{\"mode\": \"MANUAL_ECO|OFF\"}\nFan.SetTimer\t{\"timerMode\": \"ON\", \"duration\": \"<seconds>s\"}\nCamera Commands\nCommand\tParams\nCameraLiveStream.GenerateWebRtcStream\t{\"offerSdp\": \"<SDP offer>\"}\nCameraLiveStream.StopWebRtcStream\t{\"mediaSessionId\": \"<id>\"}\nCameraLiveStream.ExtendWebRtcStream\t{\"mediaSessionId\": \"<id>\"}\nCameraEventImage.GenerateImage\t{\"eventId\": \"<event-id>\"}\nPub/Sub Real-Time Events\n\nGet instant alerts for doorbell presses, motion, person detection, and device state changes.\n\nCLI: nest-events\nnest-events setup-check         # Verify Pub/Sub config is ready\nnest-events create-topic        # Create GCP Pub/Sub topic\nnest-events grant-permissions   # Grant SDM publisher role\nnest-events create-subscription # Create pull subscription\nnest-events poll                # Pull events once\nnest-events listen              # Poll continuously (daemon)\n\nSetup Steps\nOAuth with Pub/Sub scope — Run OAuth flow as your-email@example.com with pubsub + cloud-platform scopes. Save tokens to .nest-pubsub-tokens.json.\nCreate topic — nest-events create-topic (creates projects/YOUR_GCP_PROJECT/topics/nest-sdm-events)\nGrant permissions — nest-events grant-permissions (adds sdm-publisher@googlegroups.com)\nCreate subscription — nest-events create-subscription\nEnable in Device Access Console — https://console.nest.google.com/device-access → Enable Pub/Sub → Enter topic ID\nTrigger initial events — nest devices (one-time API call)\nStart listener — nest-events listen\nEvent Types Supported\nEvent\tAlert\nDoorbellChime.Chime\t🔔 DOORBELL — Someone rang!\nCameraPerson.Person\t👤 Person detected at device\nCameraMotion.Motion\t🏃 Motion at device\nCameraSound.Sound\t🔊 Sound at device\nThermostatHvac status change\t❄️/🔥 HVAC now COOLING/HEATING\nThermostatTemperatureSetpoint\t🌡️ Setpoint changed\nTemperature trait\t🌡️ Ambient temperature change\nConfiguration\n\nEnvironment Variables:\n\nVariable\tDescription\tDefault\nNEST_PUBSUB_TOKENS\tPath to Pub/Sub OAuth tokens\t~/.openclaw/workspace/.nest-pubsub-tokens.json\nTELEGRAM_BOT_TOKEN\tBot token for alerts\tfrom ~/.zshenv\nTELEGRAM_CHAT_ID\tUser/chat ID for alerts\tfrom ~/.zshenv\nPOLL_INTERVAL\tSeconds between polls\t10\nGCP_PROJECT\tGCP project ID\tYOUR_GCP_PROJECT\nPUBSUB_TOPIC\tTopic name\tnest-sdm-events\nPUBSUB_SUBSCRIPTION\tSubscription name\tnest-sdm-events-sub\nEvent Logs\n\nRaw events are logged to data/nest-events/events-YYYY-MM-DD.jsonl.\n\nAlert Dedup\n\nSame event type won't re-alert within 60 seconds to prevent alert fatigue.\n\nImportant Notes\nToken expiry: If the GCP app is in \"testing\" mode, refresh tokens expire in 7 days. Publish the app to avoid re-auth.\nTemperature: API uses Celsius internally. The CLI handles F↔C conversion.\nSetpoint constraints: HEATCOOL range must have at least 1.5°C (2.7°F) gap between heat and cool setpoints.\nCamera streams: WebRTC only (no RTSP). Requires SDP offer/answer exchange.\nRate limits: 10 queries/min per device, 10 commands/min per device.\nEvents: Use nest-events listen for real-time alerts. Requires Pub/Sub setup (see above)."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/tag-assistant/nest-sdm",
    "publisherUrl": "https://clawhub.ai/tag-assistant/nest-sdm",
    "owner": "tag-assistant",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/nest-sdm",
    "downloadUrl": "https://openagent3.xyz/downloads/nest-sdm",
    "agentUrl": "https://openagent3.xyz/skills/nest-sdm/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nest-sdm/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nest-sdm/agent.md"
  }
}