Context for developing and debugging Hubitat Elevation apps, drivers, and hub environment — sandbox constraints, lifecycle idioms, capability contracts, plus grounded deploy/log-tail/lint mechanisms.
—
—
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
High
Do not use without reviewing
Deterministic mechanisms the skills call. Python 3.9+, standard library only — no external dependencies, so nothing to install and nothing to pin. Each script is JSON-producing, self-error-handling (non-zero exit + stderr diagnostic on failure), and has an entry-point guard.
The floor is 3.9 for zoneinfo (stdlib from 3.9), which hub_mesh.py needs to read a hub's
naive lastTime stamps in the hub's own zone. Guarding the import and degrading to UTC was the
alternative and is worse than a clear ImportError: it silently overstates every zwaveJS node's
age by the hub's UTC offset, which is the bug the zone lookup exists to fix. Python 3.8 reached
end-of-life on 2024-10-07; CI runs 3.11.
| Script | Does | Network |
|---|---|---|
hub_lint.py | Flag sandbox violations and silent-failure traps in Groovy source | none (offline) |
hubclient.py | Shared: hub config resolution + code enumerate/pull/deploy (imported, not a CLI) | — |
hub_pull.py | Pull an app or driver's source + version from a hub | HTTP |
hub_deploy.py | Deploy source to a hub (create/update, version optimistic-concurrency) | HTTP |
hub_logtail.py | Tail the /logsocket or /eventsocket websocket, filtered | WebSocket |
hub_mesh.py | Fetch Z-Wave/Zigbee mesh detail and hub-mesh peer health; flag failed/ghost nodes, PER, weak routes, incomplete joins, unreachable peers; rank timestamp liveness | HTTP |
hub_radiolog.py | Tail the zwaveLogsocket/zigbeeLogsocket for per-frame radio traffic | WebSocket |
hub_device_usage.py | Report a device's delete blast radius; --live audits subscriptions and Rule Machine trigDevs separately | HTTP |
hub_device_command.py | Run a command on a device (enumerate the real command surface, coerce args, POST runmethod) and verify it landed by re-reading the relatedAttribute | HTTP |
hub_device_sequence.py | Fire an ordered list of devices with a timed hold on each (built on hub_device_command); live per-step narration for a field walk that binds observations to device ids | HTTP |
hub_fw_update.py | Batch-flash Z-Wave firmware via the native zwaveJS updater, with a no-progress watchdog, canary radio-health probe + auto-reboot recovery, and an RSSI floor (a failed/stalled OTA can hang the whole controller) | HTTP |
hubs_config.py | Owner of hubs.json — init/add/set-default/remove/list hubs (imported + CLI) | — |
The hub endpoints these drive are undocumented and version-sensitive — see ../_reference/endpoints.md
for what was verified and against which platform. The deterministic cores are unit-tested; only the
socket/HTTP loops touch the network.
python3 -m unittest discover -s tests -p 'test_*.py'Tests are stdlib unittest, deterministic, and network-free — HTTP and websocket layers are
exercised through injected fakes. The live-hub end-to-end checks live in the deploy/debug skills.