Skip to main content

aioteleco

PyPI Docs

Unofficial async Python SDK and command-line tool for Teleco Automation boxes, the home-automation box behind the Daisy Teleco app and the apps Teleco builds for other brands (Biossun, Brustor, Gibus, Pratic, Kettal, Wise…). It drives pergolas (slats, retractable roofs), awnings, screens, shutters, lights (on/off, dimmers, RGB, tunable white), heaters and more.

It talks to the Teleco cloud (tmate.telecoautomation.com) like the official apps do and, when the box is reachable on your network, sends commands directly to the box over the LAN.

⚠️ This project is not affiliated with, nor endorsed by, Teleco Automation or any of the brands listed below. It is based on the analysis of the Android app for interoperability. Brand names are trademarks of their respective owners. The devices it drives are motorised: test with the equipment in sight.

Full documentation (getting started, API reference, protocol notes): https://trois-six.github.io/aioteleco/

Supported apps / brands

Teleco builds one app per brand from a single codebase. Every brand app that uses a cloud account talks to the same Teleco cloud and the same box, so an account created in any of them works with aioteleco:

  • Daisy Teleco
  • Biossun
  • Brustor
  • Durmi
  • Gibus
  • Hardtop
  • Kettal
  • Pratic
  • Wise

Each app enables its own subset of device models and a few brand-specific tweaks; the SDK follows the Daisy app's behaviour. Reports are welcome (see teleco diagnose).

The same codebase also builds "direct" apps (Wi-Fi Products, Wise Direct) that work without a cloud account; they are not covered.

Status

Alpha: the protocol is fully mapped (see docs/protocol) and implemented; the API may still change.

Install

pip install "aioteleco[cli]"   # SDK + command-line tool
pip install aioteleco          # SDK only

Command line

Use the email and password of your account in the brand app. Credentials: --email/--password, TELECO_EMAIL/TELECO_PASSWORD, or ~/.config/aioteleco/config.toml (the box LAN address can also be given with --local-ip or TELECO_LOCAL_IP):

email = "me@example.com"
password = "…"
# local_ip = "192.0.2.10"   # optional: box address on your LAN
teleco installations            # your boxes, online or not
teleco devices --status          # rooms, devices, current state
teleco box                       # box LAN address, signal, firmware
teleco cover open "Pergola"      # open / close / stop
teleco cover position "Pergola" 66
teleco cover calibrate "Screen" # measure full travel times (interactive)
teleco cover travel "Screen" 40   # timed move to any position, then STOP
teleco light color "LED" 255 120 0 --brightness 80
teleco scenario run "Evening"
teleco send "Pergola" OPEN_STOP_CLOSE STOP      # raw (action, param)
teleco --transport cloud cover stop "Pergola"   # force the cloud
teleco diagnose > teleco-diagnostics.json        # anonymised dump for bug reports

--json switches every command to JSON output.

Library

import asyncio
import aiohttp
from aioteleco import TelecoHub, Slats


async def main() -> None:
    async with aiohttp.ClientSession() as http:
        hub = TelecoHub(http, "me@example.com", "secret")  # transport="auto" by default
        await hub.connect()
        inst = hub.installation()  # first box of the account
        data = await hub.load(inst)  # rooms, devices, scenarios
        for device in data.devices.values():
            await device.refresh()
            print(device, device.status)
        slats = next(d for d in data.devices.values() if isinstance(d, Slats))
        result = await slats.set_position(66)
        print(result.channel)  # "local" or "cloud"
        await hub.close()


asyncio.run(main())

How it works:

  • Every device receives its own list of commands from the cloud. The SDK picks the right one the way the app does, so no command id is hard-coded.
  • Transport:
    • auto: the SDK tries the LAN when the box address is known (from the cloud, or local_host=) and falls back to the cloud if that fails.
    • cloud: the cloud only.
    • local: the LAN only.
  • State is only available from the cloud (status-device-list). The box's LAN channel accepts commands but cannot report state.

Development

uv sync
uv run pytest            # unit tests (no network)
uv run ruff check src tests && uv run mypy

License

MIT

Release files for aioteleco 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aioteleco 0.2.0
File Size Uploaded
aioteleco-0.2.0.tar.gz 60.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aioteleco 0.2.0
File Interpreter ABI Platform
aioteleco-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 106.7 kB

Release files / aioteleco-0.2.0.tar.gz

Download URL aioteleco-0.2.0.tar.gz
Size 60.2 kB
Tags Source
SHA-256 checksum
How to use checksums
34cf81def67d1dd563e39d89bbcce817973f9d383c656146644ad01c3ba01b79
BLAKE2b-256 checksum
How to use checksums
2962a7bdd6a96d60f67b8a45b920749e5ee141f4158481efa1d5d66b4111b319
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release files / aioteleco-0.2.0-py3-none-any.whl

Download URL aioteleco-0.2.0-py3-none-any.whl
Size 46.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
21c8600005dc169efc3163a6ccaf70ef538cb0fc71d63eaadea9e133d9c55c48
BLAKE2b-256 checksum
How to use checksums
76b019a2792fb8230402d9f021a9c9df10f5511560e6a7c27d56ba8e11862470
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release 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