External device dashboard
List only the agent’s enrolled LAN devices; keep availability honest.
Documentation revision 1 · Contract reference API 54 · Installed readiness unknown
Preview offline card · Complete HTML interaction body · Machine-readable recipe
What runs where
- Explicit refresh → phone returns enrolled device inventory without a probe → dashboard.
- The phone must be on the supported direct LAN for an authorized status action; the controller may connect remotely through direct or relay transport.
Controller integration
- Controller or owner performs credentialed verification/enrollment using supported adapters; not part of this learning example.
- Retain checked_at per successful status response. Stop polling on pause/stop and cancel the card.
Only explicit decision-model/weather requests leave the phone; direct or relay transport still requires a running reachable phone.
Boundaries
- Listing does not test devices: availability=not_checked is not online. Discovery is partial and unverified; enrollment is separate.
- No enrollment credentials are embedded. No relay switch, motor, light or other physical action is run by the template.
Lifecycle
start
Configure card data, POST the generated HTML interaction; this does not automatically capture or poll.
update
Owner explicitly refreshes; controller stores approved data and posts a replacement card as needed, cancelling old pending cards.
pause
The Pause button suspends this card’s controls and suppresses results from a pending refresh. There is no background job in this starter; an in-flight capture may finish. Controller integrations must separately pause their jobs.
stop
The Stop button stops this card, suppresses late results, and requests controller shutdown through one response. Confirm/close the controller job and DELETE the interaction separately. Local stop is not proof that an external process stopped.
Failures and costs
- No enrolled devices: show empty. A failed status call does not prove a device is offline.
- Unsupported adapter: display its actual advertised actions, do not substitute arbitrary URLs or claim universal smart-home support.
- No remote inference. LAN availability depends on phone/network and owner-approved enrollment.
Complete synthetic contract examples
These fixtures demonstrate contracts. They are not observations from a phone. Replace image/resource IDs with returned authorized IDs. Load request.json as the complete body of POST /v1/interactions; it contains the full offline HTML.
list-empty
{
"id": "list-empty",
"request": {
"method": "GET",
"path": "/v1/lan/devices"
},
"response": {
"status": 200,
"body": {
"devices": [],
"adapters": [
{
"id": "shelly_gen1",
"actions": [
"status",
"relay_on",
"relay_off"
],
"implemented": true,
"enrollment": "/v1/lan/devices/enroll",
"limitations": "Gen1 HTTP Basic or no auth; relay devices only, 1..4 channels; MAC checked before control"
},
{
"id": "openwrt_ubus",
"actions": [
"status",
"dhcp_leases"
],
"implemented": true,
"enrollment": "/v1/lan/devices/enroll",
"limitations": "rpcd ubus session login; system.board and dhcp.ipv4leases ACLs; read-only, no router settings changes"
},
{
"id": "tapo_onvif",
"actions": [
"status"
],
"implemented": true,
"enrollment": "/v1/lan/devices/enroll",
"limitations": "Tapo-style fixed ONVIF port 2020 and RTSP stream1/2; not arbitrary ONVIF cameras; capture and PTZ require lan_camera"
}
],
"camera_inventory": "/v1/lan-cameras"
}
},
"evidence": "Synthetic contract fixture, not a device observation."
}
Extensions
- After explicit authorization, add status for one enrolled ID using POST /v1/lan/devices/action.
- Use only that device’s advertised action schema; keep physical control separate from reading inventory.