Docs

15-minute quickstart

Power a WB-1, mint a token, read five events, hot-reload a rule, and add a second zone.

This path starts with a factory-reset WB-1 and ends with a reviewed rule firing across two zones. It does not require the cloud, an app store, or an account on our infrastructure.

0. What you need

  • one WB-1, its USB-C supply, and a laptop on the same network;
  • curl, jq, and websocat;
  • 15 minutes and one input you can change safely.

Use the fictional host below exactly until your unit announces a different .local name.

export WB_HOST="http://bobulator.local"

1. Power and join the network

Connect USB-C. The status ring breathes amber during boot, then holds mint when the local dashboard is ready. Join the temporary WB1-SETUP-XXXX network, open http://bobulator.local, choose the operating Wi-Fi network, and wait for the mint ring to return.

Ethernet and offline commissioning use the same dashboard flow. No internet connection is required.

2. Mint a local token

In Settings → Access tokens, create a token named quickstart with device:read, events:read, and rules:write. Copy it once:

export WB_TOKEN="paste-token-here"

The placeholder is the only secret in this guide. Do not commit the real value. Verify the device record:

curl -fsS "$WB_HOST/api/v1/device" \
  -H "Authorization: Bearer $WB_TOKEN" | jq '{id, firmware, status}'

Expected shape:

{"id":"wb1-lab-01","firmware":"1.0.0-beta.7","status":"ready"}

3. Read five live events

Change the safe input while this is running:

websocat "ws://bobulator.local/api/v1/events" \
  -H "Authorization: Bearer $WB_TOKEN" | head -5

If mDNS is unavailable, replace bobulator.local with the address shown on the dashboard. A REST snapshot should return the same event schema:

curl -fsS "$WB_HOST/api/v1/events?limit=5" \
  -H "Authorization: Bearer $WB_TOKEN" | jq '.data[] | {channel,value,zone,ts}'

4. Install the first rule

Create a local file:

cat > /tmp/quickstart-rule.yaml <<'YAML'
rule: quickstart-safe-indicator
priority: 20
when:
  all:
    - input: lab.button
      equals: pressed
    - zone: lab
then:
  - output: light.lab.indicator
    set: 30%
  - emit: audit.quickstart_indicator
YAML

Validate and hot-reload it in one idempotent PUT:

curl -fsS -X PUT "$WB_HOST/api/v1/rules/quickstart-safe-indicator" \
  -H "Authorization: Bearer $WB_TOKEN" \
  -H "Content-Type: application/yaml" \
  --data-binary @/tmp/quickstart-rule.yaml | jq '{revision,status,activated_at}'

Expected status is active. Press the input and confirm the audit event:

curl -fsS "$WB_HOST/api/v1/audit?event=audit.quickstart_indicator&limit=1" \
  -H "Authorization: Bearer $WB_TOKEN" | jq '.data[0]'

5. Add a second zone

Map another physical input to annex.button in the dashboard, then expand the rule’s paths to *.button and light.${zone}.indicator. Validate before the fleet push:

curl -fsS -X POST "$WB_HOST/api/v1/rules:validate" \
  -H "Authorization: Bearer $WB_TOKEN" \
  -H "Content-Type: application/yaml" \
  --data-binary @/tmp/quickstart-rule.yaml | jq '.valid, .diagnostics'

For a second node, pair it under Fleet → Add node. The rule revision moves only after validation succeeds on both devices; a failed node leaves the current revision active everywhere.

Next

Use the Rule DSL reference for operators, built-ins, action paths, and priority bands. Use the API overview for pagination, WebSocket reconnect, idempotency, and audit schemas.

copied!