Skip to main content

SkyBell HD

Cloud-REST driver for SkyBell HD, Trim Plus, and Slim Line Wi-Fi video doorbells. One GEM device row represents one SkyBell account; each enrolled doorbell becomes a GEM zone keyed by its SkyBell device id. The driver polls the SkyBell cloud at cloud.myskybell.com for both device telemetry (battery, signal, settings) and the activity feed (rings, motion events), and writes the current state back to per-zone attributes so triggers and macros can react to them.

Prerequisites​

  • A SkyBell cloud account with at least one enrolled doorbell. SkyBell HD (original), Trim Plus, and Slim Line are all supported by the same v3 API.
  • The email + password that work in the SkyBell mobile app.
  • Outbound HTTPS from the GEM server to cloud.myskybell.com.

Setup​

  1. Confirm the mobile app works — same credentials apply here.
  2. In GEM admin, add a device with driver skybell_hd and set email and password.
  3. On first connect the driver generates a stable app_id / client_id UUID pair and persists them on the device row. These identify this GEM install to the SkyBell cloud. They are auto-generated and should not be edited afterwards.
  4. Run the get_devices command. It returns the doorbells on the account, including their SkyBell device id (24-character hex string).
  5. Create one GEM zone per doorbell, with address = the SkyBell device id.

Attributes​

Device​

NameRequiredDescription
emailyesSkyBell account email.
passwordyesSkyBell account password — encrypted at rest.
app_idnoUUID identifying this GEM install. Auto-generated.
client_idnoUUID identifying this GEM install. Auto-generated.
status_intervalnoTelemetry poll period in ms. Default 60000.
activity_intervalnoRing / motion event poll period in ms. Default 30000.

Zone (per doorbell)​

address is required and is the SkyBell device id (24-char hex). The driver populates these zone attributes on each sweep:

  • state — idle, ringing, or motion. Transient states clear back to idle on the next activity poll. After GEM starts or the device reloads, the first activity read only sets ringing / motion if that event happened within the last two activity intervals (at least two minutes); an older event is recorded in the last_event_* attributes with state left at idle, so a restart does not replay the last ring.
  • last_event_id, last_event_type, last_event_at — the most recent activity entry.
  • last_event_media_url — signed CloudFront URL to the recorded clip if present.
  • wifi_signal_strength, wifi_signal_level — radio quality.
  • firmware_version, hardware_revision, serial_number.
  • online_status, last_seen — connectivity reported by the cloud.
  • chime_level, outdoor_chime_level — current chime volume settings (0-3).
  • motion_enabled, motion_threshold — current motion settings.
  • led_intensity, led_color_r/g/b — current LED settings.

Commands​

CommandArgsNotes
get_devices—Lists doorbells on the account.
get_infoaddressRaw /devices/<id>/info/.
get_settingsaddressRaw /devices/<id>/settings/.
get_activitiesaddressRaw recent activity feed.
get_avatar_urladdressReturns the current snapshot URL (signed, short-lived).
set_chime_leveladdress, levelIndoor chime 0-3.
set_outdoor_chimeaddress, levelDoorbell speaker volume 0-3.
set_motion_enabledaddress, enabledtrue or 1 (any letter case) turns motion detection on; anything else turns it off.
set_motion_thresholdaddress, threshold1-100 (lower = more sensitive).
set_led_coloraddress, r, g, b0-255 each.
set_led_intensityaddress, intensity0-100.
refresh—Force an immediate status + activity poll. Answers an error when email / password are not set.

Every command that takes address refuses a blank or unfilled one, and a padded address is sent trimmed. A reply that comes back as an HTML page (a captive portal or proxy error page) is answered as an error, not as a result.

Known limitations​

  • Live video preview is not exposed. The SkyBell API only surfaces post-event recorded clips. Use the SkyBell app for live view.
  • Setting writes (chime level, motion sensitivity, LED) take effect on the next time the doorbell wakes up — up to ~60 s on units that sleep aggressively.
  • Cloud rate-limits credential-bearing requests; keep activity_interval ≥ 10 s.
  • "Snooze" and DND-window settings are not yet wired through — only the per-setting fields enumerated above are exposed in this version.

Retries and back-off​

  • If the login fails when the device connects (cloud unreachable, credentials refused), the driver tries again after 30 seconds, doubling the wait each time up to 15 minutes. It no longer stays offline until you reload it.
  • If the cloud refuses the credentials, the driver stops sending logins for 30 seconds, doubling the wait up to 15 minutes, so that it doesn't lock the account out. Commands answer login failed during that time. Correcting the email or password ends the wait straight away.
  • A status poll that gets no answer from any doorbell backs off, doubling up to 15 minutes. The activity poll does the same, but never waits more than 5 minutes. Both go back to their normal interval after the first poll that gets an answer.
  • Poll intervals and request_timeout values that are zero, negative, unparseable, or longer than about 24.8 days fall back to the defaults (60 s status, 30 s activity, 10 s timeout).

Troubleshooting​

  • login failed on connect: confirm the email / password in the mobile app first. SkyBell occasionally forces a password reset after long idle. While a refusal back-off is running, the log shows login refused, holding logins for N s.
  • Repeated 401s in the log: the access token has expired and re-login is also failing. Verify credentials, then refresh.
  • Events never surface: confirm motion_sensor is true in get_settings output, and that the doorbell shows recent activities in the mobile app.
  • State stuck on ringing / motion: the activity poll is what clears transient state. Check activity_interval and verify the driver isn't returning an error in the log.