pythermacell
A modern, fully-typed async Python client for Thermacell IoT devices (LIV Hub) built on the ESP RainMaker API.
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
aiohttpsession (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
- Join the JoyfulHouse Discord for support and discussion across all JoyfulHouse Home Assistant integrations and libraries.
- Issues: https://github.com/joyfulhouse/pythermacell/issues
- PyPI: https://pypi.org/project/pythermacell/
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.
Built with Omnigent — the open-source AI agent framework and meta-harness.
Metadata
Release files for pythermacell 0.2.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pythermacell-0.2.6.tar.gz | 230.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pythermacell-0.2.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 271.3 kB
Release files / pythermacell-0.2.6.tar.gz
| Download URL | pythermacell-0.2.6.tar.gz |
|---|---|
| Size | 230.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
75b44f6fcc9243cf752edd0254da08159219e9e8c6f48fadbf979cd6d6b8a7d0
|
|
BLAKE2b-256 checksum How to use checksums |
48dc567349c2b5ea67cb2ec75b8ddc2c49a8921327672035402785edb7473a2e
|
| 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 14, 2026.
Transparency logRelease files / pythermacell-0.2.6-py3-none-any.whl
| Download URL | pythermacell-0.2.6-py3-none-any.whl |
|---|---|
| Size | 41.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f9eeb271ef4def9e6b712f40f3a6bcea233455a0a93264f9012dea70e499d7e6
|
|
BLAKE2b-256 checksum How to use checksums |
db7f29bc30022bf548d1ed88d296a036449b4b4eb933bc576e6b47226b5b77d9
|
| 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 14, 2026.
Transparency log