Python library for discovering and controlling Shelly smart home devices over HTTP (local LAN + Shelly Cloud).
Project description
shellyconch
A conch is a type of shell that you can blow into to communicate or listen to. shellyconch is a Python library for discovering and controlling Shelly smart home devices over HTTP — both locally on your LAN and remotely via the Shelly Cloud API.
Features
- Local control of Gen1 and Gen2+ Shelly devices over HTTP
- Auto-discovery of devices on the local network via mDNS (no configuration needed)
- Generation-agnostic wrapper (
ShellyDevice) that works transparently with both Gen1 and Gen2+ - Cloud control via the Shelly Cloud Control API v2
- Authentication support: HTTP Basic Auth (Gen1) and SHA-256 Digest Auth (Gen2+)
- Covers switches/relays, rollers/covers, lights/dimmers, RGBW, energy metering, sensors, schedules, scripts, and more
Requirements
- Python >= 3.14
requests >= 2.26.0zeroconf >= 0.38.0
Installation
pip install shellyconch
The package installs as the import name shelly:
from shelly import ShellyDevice, discover_devices
From source
git clone https://github.com/ilpersi/shellyconch.git
cd shellyconch
pip install -e .
Quick Start
from shelly import ShellyDevice, ShellyGen1, ShellyGen2, ShellyCloud, discover_devices
# Generation-agnostic: auto-detect and connect
device = ShellyDevice.connect("192.168.1.100", password="secret")
print(device.get_info()) # {"mac": "...", "model": "...", "generation": 2, ...}
device.turn_on(0)
device.cover_goto_position(0, pos=50)
# Auto-discover all Shelly devices on the local network
for raw in discover_devices(timeout=10):
d = ShellyDevice(raw)
info = d.get_info()
print(f"{info['model']} gen={info['generation']} mac={info['mac']}")
# Gen1 direct access (Shelly1, Plug, 2.5, etc.)
sw = ShellyGen1("192.168.1.100")
sw.relay_on(0) # turn relay 0 ON
sw.relay_off(0) # turn relay 0 OFF
sw.relay_toggle(0) # toggle relay 0
sw.relay_on(0, timer=30) # turn ON, auto-off after 30 s
# Gen2+ direct access (ShellyPlus, ShellyPro, etc.)
sw2 = ShellyGen2("192.168.1.101", password="mypassword")
sw2.switch_set(0, on=True)
sw2.switch_set(0, on=True, toggle_after=60)
sw2.switch_toggle(0)
# Cloud control — works regardless of local network
cloud = ShellyCloud("shelly-13-eu.shelly.cloud", auth_key="your_auth_key")
cloud.turn_on("b48a0a1cd978")
cloud.cover_goto_position("dc4f2276846a", pos=30)
states = cloud.get_devices_state(["b48a0a1cd978"], select=["status"])
Device Discovery
The library uses mDNS to find devices on your local network and probes each candidate's /shelly endpoint to confirm its generation and capabilities.
from shelly import discover_devices, ShellyDiscovery
# One-shot scan
devices = discover_devices(timeout=10)
for device in devices:
print(device) # ShellyGen1(host='192.168.1.100') or ShellyGen2(...)
# Continuous discovery with a context manager
with ShellyDiscovery(on_discover=lambda d: print("Found:", d)) as disc:
disc.start()
# ... do other work ...
Error Handling
All exceptions inherit from ShellyError:
| Exception | When raised |
|---|---|
ShellyConnectionError |
Cannot reach the device |
ShellyTimeoutError |
Request timed out |
ShellyAuthError |
HTTP 401 — bad credentials |
ShellyHTTPError |
Non-2xx HTTP response (.status_code attribute) |
ShellyRPCError |
Gen2+ JSON-RPC error response (.code attribute) |
ShellyCloudError |
Cloud API error (.error string, .messages list) |
ShellyDiscoveryError |
mDNS discovery failure |
from shelly import ShellyGen2, ShellyAuthError, ShellyRPCError
try:
sw = ShellyGen2("192.168.1.101", password="wrong")
sw.switch_set(0, on=True)
except ShellyAuthError:
print("Bad password")
except ShellyRPCError as e:
print(f"RPC error {e.code}: {e}")
Architecture
shelly/
exceptions.py — ShellyError hierarchy
models.py — str-enums and device lookup table
auth.py — ShellyDigestAuth (SHA-256 Digest, RFC 7616)
base.py — BaseShelly: HTTP session, error mapping
gen1.py — ShellyGen1: all Gen1 REST endpoints
gen2.py — ShellyGen2: JSON-RPC 2.0 over HTTP
device.py — ShellyDevice: generation-agnostic wrapper
cloud.py — ShellyCloud: Shelly Cloud Control API v2
discovery.py — discover_devices() + ShellyDiscovery
- Gen1 — plain GET requests to REST endpoints; booleans as
"true"/"false"strings. - Gen2+ — JSON-RPC 2.0 POSTed to
/rpc; SHA-256 Digest authentication. - ShellyDevice — composition wrapper; dispatches to Gen1 or Gen2 internally. Access generation-specific APIs via
device.underlying.
API Reference
See docs/usage.md for a complete, annotated reference covering every method group across all classes.
External API docs:
License
GNU GPL 3
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 shellyconch-1.0.tar.gz.
File metadata
- Download URL: shellyconch-1.0.tar.gz
- Upload date:
- Size: 93.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4a3cb5dc788f5d8543c3cfde8286d7729afb6351d57b4aa4c8d01823171f789
|
|
| MD5 |
be6f617222598eac0eef69fae99a4b16
|
|
| BLAKE2b-256 |
1a0db1186461a9d183192f3657cacd7b264f236cb64e1e9c36af60d1a221a87e
|
File details
Details for the file shellyconch-1.0-py3-none-any.whl.
File metadata
- Download URL: shellyconch-1.0-py3-none-any.whl
- Upload date:
- Size: 70.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2bd083555d3eb10c2829aaaabcc1a9b3788324a43ece46cfcb91266ca581757
|
|
| MD5 |
2266aef7eff4504502a93391984ca17b
|
|
| BLAKE2b-256 |
5888c84302cf78b3b469c218cd4709f5564d966c0125791656e98dfde47e829c
|