Skip to main content

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.0
  • zeroconf >= 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


Download files

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

Source Distribution

shellyconch-1.0.1.tar.gz (93.8 kB view details)

Uploaded Source

Built Distribution

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

shellyconch-1.0.1-py3-none-any.whl (70.6 kB view details)

Uploaded Python 3

File details

Details for the file shellyconch-1.0.1.tar.gz.

File metadata

  • Download URL: shellyconch-1.0.1.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

Hashes for shellyconch-1.0.1.tar.gz
Algorithm Hash digest
SHA256 2168e2cf5df9c2fe074171a6dcc7cc85e9e185d49e83fe0f43a8b32d2793847f
MD5 e4b7abe351887780f3ab3a991ccfac3f
BLAKE2b-256 63f4fbecdce6168c8ab92420cc40b42574583dfa4bc43fa96539b9a737c6f298

See more details on using hashes here.

File details

Details for the file shellyconch-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: shellyconch-1.0.1-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

Hashes for shellyconch-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 68da28d644a9d775c5f82381bc2455a661e07d6622a80cf73732d41b4420ec35
MD5 98ab33782f0553f59002204b1cb40b86
BLAKE2b-256 80cf9e162b5b69de22d259f73b07ee324c646f5a07e1ee54685702606ef86e8a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page