Core async protocol library for local LAN control of Cync/C by GE smart devices - device/session state machine, packet codec, cloud auth, and BLE provisioning
Project description
[!IMPORTANT] DNS redirection REQUIRED - this library controls Cync devices by impersonating the cloud server they phone home to. Without redirecting those hostnames at your DNS, nothing connects.
cync-lan (core protocol library)
Core async protocol library for local LAN control of Cync / C by GE smart devices: the device and session TCP state machine, the wire-format packet codec, Cync cloud authentication and device export, and BLE GATT provisioning.
This package is a dependency, not an application. No MQTT, no Docker,
no configuration of its own, and no CLI aside from cync-lan-ble-provision.
It does nothing until a consumer wires it up to a running event loop - see
Consumers.
[!WARNING] DO NOT contact GE / Savant for troubleshooting while using this project. Open an issue here instead.
[!WARNING] It is HIGHLY recommended that you do NOT perform firmware upgrades on Cync devices after running cync-lan. It would be trivial - change one parameter in a constructor - for Savant to disable this method of local control. This caution is inherited from upstream and still stands.
Repository layout
Three separately-versioned, separately-released artifacts share this one
repository, each on its own branch. You are on core.
| Artifact | Branch | What it is | Distributed via |
|---|---|---|---|
cync-lan |
core (here) |
This library - protocol, sessions, cloud auth, BLE | PyPI |
cync-lan-mqtt |
python |
Standalone Docker/MQTT daemon + HTTP device exporter | PyPI + ghcr.io image |
cync_lan custom_component |
feature/ha-custom-component |
Native Home Assistant integration (no MQTT) | GitHub Release / HACS |
Bumping this library does not require bumping either consumer, or vice
versa. RELEASING.md covers how the three are versioned,
including the rule that decides releases from prereleases: a plain X.Y.Z
version cuts a full release, X.Y.ZbN cuts a prerelease, and anything else
fails the build.
docs/ is mirrored byte-for-byte across all three branches, with this
branch as the canonical copy - CI fails if they drift, because they had
already silently drifted once before that check existed.
Consumers
cync-lan-mqtt- the Docker/MQTT add-on: standalone daemon, MQTT-based Home Assistant discovery, HTTP device-list exporter.custom_components/cync_lan- the native Home Assistant integration, which talks to this package's device and session objects directly.
See either of those for end-user installation and setup.
Installing
pip install cync-lan
Add the ble extra for BLE GATT provisioning of factory-default devices
via bleak:
pip install "cync-lan[ble]"
Requires Python 3.12+. That floor is real, not cautious: devices.py uses a
PEP 701 nested-quote f-string, on top of enum.StrEnum and datetime.UTC.
What's in the package
| Module | Responsibility |
|---|---|
server.py |
The TCP server devices connect to once DNS is redirected; session pool, MITM/proxy mode |
devices.py |
Device model, capability classification, and the mesh command surface |
packet/ |
Wire-format encode/decode (PacketBuilder) |
cloud_api.py |
Cync cloud auth (email + emailed OTP) and device-list export |
ble_provision.py |
BLE GATT provisioning of factory-default devices; the cync-lan-ble-provision entry point (ble extra) |
metadata/ |
Device-type tables - which model is a light, a switch, dimmable, has a motion sensor |
protocols.py |
Protocol-level constants and enums |
structs.py |
Shared dataclasses - EntityState, GlobalObject, and friends |
Protocol documentation
The reverse-engineering notes in docs/ are the most useful part of this
repository if you are doing your own protocol work:
docs/packet_structure.md- the wire format.docs/mesh_opcodes.md- mesh command opcodes. Read the confidence markers before trusting one. Several are derived from the decompiled Android app and have never been run against real hardware; exactly one (set_indicator_led) is hardware-confirmed.docs/hardware_verification.md- what still needs verifying on real devices, in the order worth doing it.docs/known_devices.md- device types and support status.docs/ble_provisioning_protocol.md- the BLE provisioning flow.
Development
pip install -e ".[ble,dev]"
pytest tests/ -q
scripts/cmd_code.py drives every mesh command through a stubbed transport
and checks the computed cmd_code length field against the bytes actually
emitted - calc for one command, audit for all of them. It runs in CI,
because cmd_code is a length field rather than an identifier and a wrong
one is silently accepted by the hardware.
Credits
This project is the current link in a chain of earlier work, and none of it would exist without the people below.
- iburistu - cync-lan, the original. The first public demonstration that Cync devices could be controlled locally by impersonating the cloud server. MIT, © 2022 Zachary Linkletter.
- juanboro - cync2mqtt, the original MQTT bridge and cloud-export approach. Apache-2.0. Little of that code survives verbatim at this point, but the attribution stays. Long live OSS.
- baudneo -
baudneo/cync-lan, the substantial
async rewrite this fork continues from, and the origin of most of the
protocol knowledge encoded here. Upstream stopped at
0.0.6b16. - @CodeNeedsCoffee - initial work on the Home Assistant App.
Full license texts for all of the above are reproduced in LICENSE-3RD-PARTY.
License
MIT, same as the original - see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cync_lan-0.5.1.tar.gz.
File metadata
- Download URL: cync_lan-0.5.1.tar.gz
- Upload date:
- Size: 143.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d365749ddc52f0aeeba4b473b27fc4645311b13167343ea11783dd6a66acf2da
|
|
| MD5 |
67219a951def8e3f9d3c4339504836d4
|
|
| BLAKE2b-256 |
fd49fd5893f3a42c002492884002e22b2cce0aec18fbf58632995749c31fda9c
|
Provenance
The following attestation bundles were made for cync_lan-0.5.1.tar.gz:
Publisher:
publish_pypi_core.yml on Proxy-alt/cync-lan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cync_lan-0.5.1.tar.gz -
Subject digest:
d365749ddc52f0aeeba4b473b27fc4645311b13167343ea11783dd6a66acf2da - Sigstore transparency entry: 2256575211
- Sigstore integration time:
-
Permalink:
Proxy-alt/cync-lan@cdcec293a0fb7786634ecabe76e93ad6d60abc5b -
Branch / Tag:
refs/heads/core - Owner: https://github.com/Proxy-alt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_pypi_core.yml@cdcec293a0fb7786634ecabe76e93ad6d60abc5b -
Trigger Event:
push
-
Statement type:
File details
Details for the file cync_lan-0.5.1-py3-none-any.whl.
File metadata
- Download URL: cync_lan-0.5.1-py3-none-any.whl
- Upload date:
- Size: 120.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a271e7c8061022f002d02c9ecdc5731aae00c040cb3d87b9321da2f8f8c71e7e
|
|
| MD5 |
584a60d16448be1bc177d1d1fe0520ff
|
|
| BLAKE2b-256 |
fa8e5289523c32c36d87ee54706699ebe53d3f684ec0bd95c399ad79fd5f8667
|
Provenance
The following attestation bundles were made for cync_lan-0.5.1-py3-none-any.whl:
Publisher:
publish_pypi_core.yml on Proxy-alt/cync-lan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cync_lan-0.5.1-py3-none-any.whl -
Subject digest:
a271e7c8061022f002d02c9ecdc5731aae00c040cb3d87b9321da2f8f8c71e7e - Sigstore transparency entry: 2256575217
- Sigstore integration time:
-
Permalink:
Proxy-alt/cync-lan@cdcec293a0fb7786634ecabe76e93ad6d60abc5b -
Branch / Tag:
refs/heads/core - Owner: https://github.com/Proxy-alt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_pypi_core.yml@cdcec293a0fb7786634ecabe76e93ad6d60abc5b -
Trigger Event:
push
-
Statement type: