{
  "schemaVersion": "1.0",
  "item": {
    "slug": "dirigera-control",
    "name": "Dirigera Control (IKEA smart home)",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Falderebet/dirigera-control",
    "canonicalUrl": "https://clawhub.ai/Falderebet/dirigera-control",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/dirigera-control",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=dirigera-control",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/generate_token_wrapper.py",
      "scripts/example_usage.py",
      "scripts/find_dirigera_ip.py",
      "scripts/helpers.py",
      "references/api.md"
    ],
    "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/dirigera-control"
    },
    "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/dirigera-control",
    "agentPageUrl": "https://openagent3.xyz/skills/dirigera-control/agent",
    "manifestUrl": "https://openagent3.xyz/skills/dirigera-control/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/dirigera-control/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": "IKEA Dirigera Smart Home Control",
        "body": "Control lights, outlets, scenes, and other IKEA smart home devices through the Dirigera hub."
      },
      {
        "title": "Prerequisites",
        "body": "pip install dirigera"
      },
      {
        "title": "Find Hub IP",
        "body": "Check the router/DHCP client list for \"Dirigera\" and note its IP address.\n\nIf the agent is on the same LAN, try the IP discovery script. It can:\n\nScan the subnet for likely candidates (no token required).\nVerify the exact hub IP if a token is available.\nAs a last resort, try generate-token against candidates (interactive).\n\npython scripts/find_dirigera_ip.py\n# or\npython scripts/find_dirigera_ip.py --subnet 192.168.1.0/24\n# verify with token (if you have it)\npython scripts/find_dirigera_ip.py --token <dirigera-token>\n# last resort: try generate-token against candidates\npython scripts/find_dirigera_ip.py --try-generate-token"
      },
      {
        "title": "Generate Token",
        "body": "IMPORTANT: Token generation REQUIRES PHYSICAL USER ACTION. Follow this workflow:\n\nStep 1: Start Token Generation Script\n\nRun the wrapper script in the background. It will automatically wait for the button press:\n\npython scripts/generate_token_wrapper.py <dirigera-ip-address> &\n\nThe token will be saved to dirigera_token.txt by default. To specify a custom location:\n\npython scripts/generate_token_wrapper.py <dirigera-ip-address> --output /path/to/token.txt &\n\nStep 2: END YOUR TURN AND INFORM THE USER\n\nCRITICAL: After starting the script, you MUST:\n\nEnd your turn immediately - do not wait or continue processing\nTell the user: \"I've started the token generation process. Please press the ACTION BUTTON on the bottom of your Dirigera hub now. Let me know when you've pressed it.\"\n\nStep 3: Wait for User Confirmation\n\nThe user will:\n\nPhysically press the button on their Dirigera hub\nReply to you confirming they pressed it (e.g., \"Done\" or \"Pressed\")\n\nThe script will automatically detect the button press and save the token to the file.\n\nStep 4: Retrieve the Saved Token\n\nAfter the user confirms, read the token from the file:\n\nfrom pathlib import Path\ntoken = Path(\"dirigera_token.txt\").read_text().strip()\n\nOr from a custom location:\n\nTOKEN=$(cat /path/to/token.txt)\n\nThen use the token to connect:\n\nimport dirigera\nhub = dirigera.Hub(token=token, ip_address=\"<dirigera-ip>\")\n\nAlternative: Manual Command\n\nFor manual use (not recommended for agents):\n\ngenerate-token <dirigera-ip-address>\n\nThis requires interactive terminal access and doesn't save output automatically."
      },
      {
        "title": "Troubleshooting",
        "body": "If you cannot find the hub IP address:\n\nCheck the router/DHCP list and look for \"Dirigera\".\nIf the name is missing, match the hub's MAC address label to a new device entry.\nEnsure the hub and client are on the same network.\nIf you have candidate IPs, run generate-token against them until one succeeds.\nIf you already have a token, run python scripts/find_dirigera_ip.py --token <dirigera-token>.\nIf everything else fails, run python scripts/find_dirigera_ip.py --try-generate-token and follow the prompt."
      },
      {
        "title": "Hub Connection",
        "body": "import dirigera\n\nhub = dirigera.Hub(\n    token=\"token\",\n    ip_address=\"ip_address\"\n)"
      },
      {
        "title": "CRITICAL: Attribute Access",
        "body": "Device state is in .attributes, not top-level.\n\n# CORRECT\nlight.attributes.is_on\nlight.attributes.light_level\n\n# WRONG - raises AttributeError\nlight.is_on\nlight.light_level\n\nTop-level: device.id, device.is_reachable, device.room\nState: device.attributes.is_on, device.attributes.light_level"
      },
      {
        "title": "Discovery",
        "body": "lights = hub.get_lights()\noutlets = hub.get_outlets()\ncontrollers = hub.get_controllers()\nscenes = hub.get_scenes()"
      },
      {
        "title": "Light Control",
        "body": "light = hub.get_light_by_name(lamp_name=\"bedroom light\")\n\n# Check reachability first\nif light.is_reachable:\n    light.set_light(lamp_on=True)\n    light.set_light_level(light_level=75)\n    light.set_color_temperature(color_temp=2700)  # Warm white\n\n# Reload after changes\nlight.reload()"
      },
      {
        "title": "Outlet Control",
        "body": "outlet = hub.get_outlet_by_name(outlet_name=\"living room\")\noutlet.set_on(outlet_on=True)\noutlet.reload()"
      },
      {
        "title": "Scene Triggering",
        "body": "scene = hub.get_scene_by_name(scene_name=\"Sove tid\")\nscene.trigger()"
      },
      {
        "title": "Check Capabilities",
        "body": "# Verify device supports feature before using\nif 'colorTemperature' in light.capabilities.can_receive:\n    light.set_color_temperature(color_temp=3000)"
      },
      {
        "title": "Common Patterns",
        "body": "See references/patterns.md for room-based control, batch operations, status reports, and battery monitoring."
      },
      {
        "title": "Helper Scripts",
        "body": "Use scripts/helpers.py for common operations: get lights by room, check battery levels, find unreachable devices."
      },
      {
        "title": "Complete Reference",
        "body": "See references/api.md for:\n\nComplete attribute reference\nAll control methods\nDevice capabilities\nColor temperature/hue values\nTroubleshooting"
      },
      {
        "title": "Best Practices",
        "body": "Always check device.is_reachable before control\nCall device.reload() after control commands\nUse .attributes for all state access\nAdd 0.5s delays between rapid commands\nCheck capabilities before using features"
      }
    ],
    "body": "IKEA Dirigera Smart Home Control\n\nControl lights, outlets, scenes, and other IKEA smart home devices through the Dirigera hub.\n\nPrerequisites\npip install dirigera\n\nHub Setup\nFind Hub IP\n\nCheck the router/DHCP client list for \"Dirigera\" and note its IP address.\n\nIf the agent is on the same LAN, try the IP discovery script. It can:\n\nScan the subnet for likely candidates (no token required).\nVerify the exact hub IP if a token is available.\nAs a last resort, try generate-token against candidates (interactive).\npython scripts/find_dirigera_ip.py\n# or\npython scripts/find_dirigera_ip.py --subnet 192.168.1.0/24\n# verify with token (if you have it)\npython scripts/find_dirigera_ip.py --token <dirigera-token>\n# last resort: try generate-token against candidates\npython scripts/find_dirigera_ip.py --try-generate-token\n\nGenerate Token\n\nIMPORTANT: Token generation REQUIRES PHYSICAL USER ACTION. Follow this workflow:\n\nStep 1: Start Token Generation Script\n\nRun the wrapper script in the background. It will automatically wait for the button press:\n\npython scripts/generate_token_wrapper.py <dirigera-ip-address> &\n\n\nThe token will be saved to dirigera_token.txt by default. To specify a custom location:\n\npython scripts/generate_token_wrapper.py <dirigera-ip-address> --output /path/to/token.txt &\n\nStep 2: END YOUR TURN AND INFORM THE USER\n\nCRITICAL: After starting the script, you MUST:\n\nEnd your turn immediately - do not wait or continue processing\nTell the user: \"I've started the token generation process. Please press the ACTION BUTTON on the bottom of your Dirigera hub now. Let me know when you've pressed it.\"\nStep 3: Wait for User Confirmation\n\nThe user will:\n\nPhysically press the button on their Dirigera hub\nReply to you confirming they pressed it (e.g., \"Done\" or \"Pressed\")\n\nThe script will automatically detect the button press and save the token to the file.\n\nStep 4: Retrieve the Saved Token\n\nAfter the user confirms, read the token from the file:\n\nfrom pathlib import Path\ntoken = Path(\"dirigera_token.txt\").read_text().strip()\n\n\nOr from a custom location:\n\nTOKEN=$(cat /path/to/token.txt)\n\n\nThen use the token to connect:\n\nimport dirigera\nhub = dirigera.Hub(token=token, ip_address=\"<dirigera-ip>\")\n\nAlternative: Manual Command\n\nFor manual use (not recommended for agents):\n\ngenerate-token <dirigera-ip-address>\n\n\nThis requires interactive terminal access and doesn't save output automatically.\n\nTroubleshooting\n\nIf you cannot find the hub IP address:\n\nCheck the router/DHCP list and look for \"Dirigera\".\nIf the name is missing, match the hub's MAC address label to a new device entry.\nEnsure the hub and client are on the same network.\nIf you have candidate IPs, run generate-token against them until one succeeds.\nIf you already have a token, run python scripts/find_dirigera_ip.py --token <dirigera-token>.\nIf everything else fails, run python scripts/find_dirigera_ip.py --try-generate-token and follow the prompt.\nHub Connection\nimport dirigera\n\nhub = dirigera.Hub(\n    token=\"token\",\n    ip_address=\"ip_address\"\n)\n\nCRITICAL: Attribute Access\n\nDevice state is in .attributes, not top-level.\n\n# CORRECT\nlight.attributes.is_on\nlight.attributes.light_level\n\n# WRONG - raises AttributeError\nlight.is_on\nlight.light_level\n\n\nTop-level: device.id, device.is_reachable, device.room State: device.attributes.is_on, device.attributes.light_level\n\nQuick Commands\nDiscovery\nlights = hub.get_lights()\noutlets = hub.get_outlets()\ncontrollers = hub.get_controllers()\nscenes = hub.get_scenes()\n\nLight Control\nlight = hub.get_light_by_name(lamp_name=\"bedroom light\")\n\n# Check reachability first\nif light.is_reachable:\n    light.set_light(lamp_on=True)\n    light.set_light_level(light_level=75)\n    light.set_color_temperature(color_temp=2700)  # Warm white\n\n# Reload after changes\nlight.reload()\n\nOutlet Control\noutlet = hub.get_outlet_by_name(outlet_name=\"living room\")\noutlet.set_on(outlet_on=True)\noutlet.reload()\n\nScene Triggering\nscene = hub.get_scene_by_name(scene_name=\"Sove tid\")\nscene.trigger()\n\nCheck Capabilities\n# Verify device supports feature before using\nif 'colorTemperature' in light.capabilities.can_receive:\n    light.set_color_temperature(color_temp=3000)\n\nCommon Patterns\n\nSee references/patterns.md for room-based control, batch operations, status reports, and battery monitoring.\n\nHelper Scripts\n\nUse scripts/helpers.py for common operations: get lights by room, check battery levels, find unreachable devices.\n\nComplete Reference\n\nSee references/api.md for:\n\nComplete attribute reference\nAll control methods\nDevice capabilities\nColor temperature/hue values\nTroubleshooting\nBest Practices\nAlways check device.is_reachable before control\nCall device.reload() after control commands\nUse .attributes for all state access\nAdd 0.5s delays between rapid commands\nCheck capabilities before using features"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Falderebet/dirigera-control",
    "publisherUrl": "https://clawhub.ai/Falderebet/dirigera-control",
    "owner": "Falderebet",
    "version": "1.0.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/dirigera-control",
    "downloadUrl": "https://openagent3.xyz/downloads/dirigera-control",
    "agentUrl": "https://openagent3.xyz/skills/dirigera-control/agent",
    "manifestUrl": "https://openagent3.xyz/skills/dirigera-control/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/dirigera-control/agent.md"
  }
}