Skip to main content

pythermacell

A modern, fully-typed async Python client for Thermacell IoT devices (LIV Hub) built on the ESP RainMaker API.

PyPI Version Python Versions License CI GitHub Sponsors Ko-fi

What It Does

pythermacell is an asynchronous Python library for controlling and monitoring Thermacell LIV mosquito-repellent devices through their cloud platform (Espressif ESP RainMaker). It handles authentication, device discovery, power and LED control, and status monitoring behind a clean, fully-typed API. It is the engine behind the Thermacell LIV Home Assistant integration, and is equally suitable for standalone scripts and other applications.

Features

  • Fully asynchronous (aiohttp) with comprehensive type hints (strict mypy).
  • Three-layer architecture: low-level API, coordinating client, stateful devices.
  • Power control, RGB LED control (HSV), and refill/runtime/status monitoring.
  • Optimistic updates with automatic rollback for instant UI responsiveness.
  • State caching, optional background auto-refresh, and change listeners.
  • Built-in resilience: circuit breaker, exponential backoff, and rate limiting.
  • Session injection for sharing an aiohttp session (e.g. with Home Assistant).
  • Custom exception hierarchy and high unit + integration test coverage.

Installation

See INSTALL.md for the complete guide.

pip install pythermacell
# or
uv add pythermacell

Requires Python 3.13+.

Quick Start

import asyncio

from pythermacell import ThermacellClient


async def main() -> None:
    async with ThermacellClient(
        username="your@email.com",
        password="your_password",
    ) as client:
        for device in await client.get_devices():
            print(f"{device.name} ({device.model}) online={device.is_online}")

            await device.turn_on()
            await device.set_led_color(hue=120, saturation=100, brightness=80)

            print(f"Refill life: {device.refill_life}%")


asyncio.run(main())

Usage

The most common workflow is: construct a ThermacellClient, enter its async context, fetch devices, then control or monitor them through ThermacellDevice objects. Device control methods apply optimistically (local state updates immediately, then the API call runs in the background and rolls back on failure).

device = (await client.get_devices())[0]

await device.turn_on()                              # power on (optimistic)
await device.set_led_color(hue=240, saturation=100, brightness=80)  # blue
await device.refresh()                              # pull latest state from API

print(device.is_powered_on, device.refill_life, device.system_status)

For depth — authentication, LED rules, monitoring, optimistic updates, auto-refresh and change listeners, session injection, resilience patterns, and full error handling — see the Usage Guide. Runnable scripts live in examples/.

API Reference

Full reference lives in docs/. Key entry points:

Symbol Description
ThermacellClient High-level client: authentication, device discovery, caching
ThermacellDevice Stateful device: power, LED, monitoring, listeners
ThermacellAPI Low-level ESP RainMaker HTTP layer
AuthenticationHandler JWT authentication and token refresh
pythermacell.resilience Circuit breaker, backoff, rate limiter
Exceptions ThermacellError hierarchy

Endpoint-level details are documented under docs/api/.

Development

See docs/DEVELOPMENT.md. In short:

git clone https://github.com/joyfulhouse/pythermacell.git
cd pythermacell
uv sync
uv run pytest
uv run ruff check
uv run mypy

Support

Support Development

If this library is useful to you, please consider supporting its development:

License

This project is licensed under the MIT License — see LICENSE for details.

This is an unofficial library and is not affiliated with, endorsed by, or sponsored by Thermacell Repellents, Inc. All product names, logos, and brands are the property of their respective owners.

Related Projects

  • Thermacell LIV — the Home Assistant integration built on this library.

Metadata

Release files for pythermacell 0.2.5

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

Source distribution (sdist)

Source distribution for pythermacell 0.2.5
File Size Uploaded
pythermacell-0.2.5.tar.gz 228.6 kB Details

Built distribution (wheel)

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

Total release size: 269.4 kB

Release files / pythermacell-0.2.5.tar.gz

Download URL pythermacell-0.2.5.tar.gz
Size 228.6 kB
Tags Source
SHA-256 checksum
How to use checksums
afd70e35917edfeff5f2bbfdafb65d8ac02509dcd39164b68cb3142543c761f9
BLAKE2b-256 checksum
How to use checksums
c95b0c66b7cad9c5484deb520d8f9d12dcd84a95784b2436a0c85918795aef82
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 Aug 10, 2026.

Transparency log

Release files / pythermacell-0.2.5-py3-none-any.whl

Download URL pythermacell-0.2.5-py3-none-any.whl
Size 40.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3ff2bec97ab74bdc2093ef7eeb92fa55770a42be908f3795e4c546f829889d06
BLAKE2b-256 checksum
How to use checksums
4d4594865da2ca68d0a9cff880c49feb356cd0bada0a1c5904cae0a2e0c68250
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 Aug 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.6

2 release files

This release

0.2.5 This release

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

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