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
- Confirm the mobile app works — same credentials apply here.
- In GEM admin, add a device with driver
skybell_hdand setemailandpassword. - On first connect the driver generates a stable
app_id/client_idUUID 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. - Run the
get_devicescommand. It returns the doorbells on the account, including their SkyBell device id (24-character hex string). - Create one GEM zone per doorbell, with
address= the SkyBell device id.
Attributes
Device
| Name | Required | Description |
|---|---|---|
email | yes | SkyBell account email. |
password | yes | SkyBell account password — encrypted at rest. |
app_id | no | UUID identifying this GEM install. Auto-generated. |
client_id | no | UUID identifying this GEM install. Auto-generated. |
status_interval | no | Telemetry poll period in ms. Default 60000. |
activity_interval | no | Ring / 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, ormotion. Transient states clear back toidleon the next activity poll. After GEM starts or the device reloads, the first activity read only setsringing/motionif that event happened within the last two activity intervals (at least two minutes); an older event is recorded in thelast_event_*attributes withstateleft atidle, 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
| Command | Args | Notes |
|---|---|---|
get_devices | — | Lists doorbells on the account. |
get_info | address | Raw /devices/<id>/info/. |
get_settings | address | Raw /devices/<id>/settings/. |
get_activities | address | Raw recent activity feed. |
get_avatar_url | address | Returns the current snapshot URL (signed, short-lived). |
set_chime_level | address, level | Indoor chime 0-3. |
set_outdoor_chime | address, level | Doorbell speaker volume 0-3. |
set_motion_enabled | address, enabled | true or 1 (any letter case) turns motion detection on; anything else turns it off. |
set_motion_threshold | address, threshold | 1-100 (lower = more sensitive). |
set_led_color | address, r, g, b | 0-255 each. |
set_led_intensity | address, intensity | 0-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 failedduring 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_timeoutvalues 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 failedon 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 showslogin 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_sensoristrueinget_settingsoutput, and that the doorbell shows recent activities in the mobile app. - State stuck on
ringing/motion: the activity poll is what clears transient state. Checkactivity_intervaland verify the driver isn't returning an error in the log.