Skip to main content

pygemstone

PyPI Python License

Standalone Python library for Gemstone Lights permanent-Christmas-light controllers.

Gemstone's mobile app talks to an AWS Amplify backend (Cognito + API Gateway + AppSync) in us-west-2, so this library is essentially:

  • a Cognito SRP login wrapper (delegated to pycognito)
  • an aiohttp REST client for the public endpoints that control the lights (/deviceControl/onState, /deviceControl/play/pattern, etc.)

Status: alpha — under active reverse-engineering of the iOS com.gemstone.lights app. APIs will change.

Features

  • Async login / token refresh (via Cognito User Pool SRP)
  • Account & home group:
    • account_profile() — your user profile
    • homegroups() / homegroup_users(hg)
    • invitations(status="pending") — pending invites (raw dict; schema unknown)
  • Devices:
    • devices(hg) — list controllers
    • device_state(id) / set_on_state(id, on) / play_pattern(id, p)
    • device_groups(hg) — multi-device zones (raw dict; schema unknown)
  • Pattern catalogue:
    • folders() / folder_patterns(page=N) / save_folder(id, body)
    • swatches() — colour palettes
    • downloadable_folders(page=N) / downloadable_patterns(page=N) — Gemstone-curated catalogue
  • Autopilot / scheduling:
    • events_settings(hg) — daily on/off window + enabled categories
    • subscribed_events(hg, page=N) — date-bound holiday/event subscriptions
    • events_categories() — full catalogue of holiday / sport / event categories
  • Timers:
    • timers_by_homegroup(hg) — scheduled on/off timers with optional pattern
  • Misc:
    • announcements() — in-app announcements

A note on AppSync (real-time)

The library ships an AppSync GraphQL HTTP + WebSocket transport (pygemstone.appsync.AppSyncClient), but two iOS-app captures show the official app never opens a GraphQL connection — only unauthenticated /ping healthchecks. State updates propagate via REST polling of /deviceControl/currentlyPlaying. The AppSync auth scheme is therefore unknown and the transport is currently un-runnable against the real backend; it's kept as scaffolding for if Gemstone ever flips real-time on.

Planned

  • Cognito global sign-out (currently only clears local tokens)
  • Schedule/event subscribe + unsubscribe mutations
  • Timer create / update / delete (only list is currently captured)

Installation

pip install pygemstone

Usage

import asyncio
from pygemstone import GemstoneClient

async def main():
    async with GemstoneClient("you@example.com", "...") as gc:
        await gc.login()
        for group in await gc.homegroups():
            print(group.name)
            for device in await gc.devices(group.id):
                state = await device.refresh()
                print(" ", device.name, "on" if state.on_state else "off")
                if not state.on_state:
                    await device.turn_on()

asyncio.run(main())

CLI

A small CLI is provided for manual testing:

python -m pygemstone login
python -m pygemstone list
python -m pygemstone state <DEVICE_ID>
python -m pygemstone on <DEVICE_ID>
python -m pygemstone off <DEVICE_ID>

Credentials are read from GEMSTONE_EMAIL / GEMSTONE_PASSWORD env vars, or a .env file in the working directory.

Security note

Like the other Amplify-based IoT services, Gemstone's Cognito user pool id and app client id are public values that any decompiled IPA / packet capture exposes — they're shipped in const.py as defaults. Do not commit credential files, JWT tokens, or mitmproxy .flows files.

Reverse-engineering notes

The endpoint catalogue was derived from a mitmproxy --mode wireguard capture of the official iOS app. Notes are kept private (the capture contains a live Cognito session); the public endpoint shape is in const.py.

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pygemstone-0.0.4.tar.gz (36.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pygemstone-0.0.4-py3-none-any.whl (26.8 kB view details)

Uploaded Python 3

File details

Details for the file pygemstone-0.0.4.tar.gz.

File metadata

  • Download URL: pygemstone-0.0.4.tar.gz
  • Upload date:
  • Size: 36.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pygemstone-0.0.4.tar.gz
Algorithm Hash digest
SHA256 23f42a62b92c7e62c43c081b2fff80593edb54192ebf844764c1910e07e54e85
MD5 e65077ab1c32807ae18c9d77e6066e17
BLAKE2b-256 75a7f33239b440ac8e88f7ec80f1acb281cf2bd5edf0fc1b19e06362885fa131

See more details on using hashes here.

Provenance

The following attestation bundles were made for pygemstone-0.0.4.tar.gz:

Publisher: release.yml on sslivins/pygemstone

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pygemstone-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: pygemstone-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 26.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pygemstone-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 dc503168b5051918efd5f7cfa9328f2242b09391fc50ef4ecf146c49dcbc729c
MD5 bc8bfa46fed8cd01e33f5f3fb0170268
BLAKE2b-256 a923b87af657a662dce5994264f3b3618f3780d73f62a85f1fbbfb3875a148ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for pygemstone-0.0.4-py3-none-any.whl:

Publisher: release.yml on sslivins/pygemstone

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.0.5

2 files

This release

0.0.4 This release

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page