Asynchronous Python library for Jandy iAqualink pool control systems
iaqualink-py is a modern, fully asynchronous Python library for interacting with Jandy iAqualink pool and spa control systems. It provides a clean, Pythonic interface to monitor and control your pool equipment from your Python applications.
- π Fully Asynchronous - Built with
asyncioandhttpxfor efficient, non-blocking I/O - ποΈ Multi-System Support
- iAqua systems (iaqualink.net API)
- eXO systems (zodiac-io.com API)
- π‘οΈ Comprehensive Device Support
- Temperature sensors (pool, spa, air)
- Thermostats with adjustable set points
- Pumps and heaters
- Lights with toggle control
- Auxiliary switches
- Water chemistry sensors (pH, ORP, salinity)
- Freeze protection monitoring
- π Context Manager Support - Automatic resource cleanup
- π‘οΈ Type Safe - Full type hints for modern Python development
- β‘ Rate Limiting - Built-in throttling to respect API limits
pip install iaqualinkOr using uv:
uv add iaqualinkfrom iaqualink import AqualinkClient
async with AqualinkClient('user@example.com', 'password') as client:
# Discover your pool systems
systems = await client.get_systems()
# Get the first system
system = list(systems.values())[0]
print(f"Found system: {system.name}")
# Get all devices
devices = await system.get_devices()
# Access specific devices
pool_temp = devices.get('pool_temp')
if pool_temp:
print(f"Pool temperature: {pool_temp.state}Β°F")
spa_heater = devices.get('spa_heater')
if spa_heater:
print(f"Spa heater: {'ON' if spa_heater.is_on else 'OFF'}")# Turn on pool pump
pool_pump = devices.get('pool_pump')
if pool_pump:
await pool_pump.turn_on()
# Set spa temperature
spa_thermostat = devices.get('spa_set_point')
if spa_thermostat:
await spa_thermostat.set_temperature(102)
# Toggle pool light
pool_light = devices.get('aux_3')
if pool_light:
await pool_light.toggle()# Update system state
await system.update()
# Check if system is online
if system.online:
print(f"System {system.name} is online")
# Get all temperature readings
for device_name, device in devices.items():
if 'temp' in device_name and device.state:
print(f"{device.label}: {device.state}Β°")async with AqualinkClient('user@example.com', 'password') as client:
systems = await client.get_systems()
for serial, system in systems.items():
print(f"System: {system.name} ({serial})")
print(f"Type: {system.data.get('device_type')}")
devices = await system.get_devices()
print(f"Devices: {len(devices)}")The library automatically rate-limits updates to once every 5 seconds per system to respect API limits. Subsequent calls within this window return cached data.
# First call - fetches from API
await system.update()
# Immediate second call - returns cached data
await system.update()
# After 5+ seconds - fetches fresh data
await asyncio.sleep(5)
await system.update()The library uses a plugin-style architecture with base classes and system-specific implementations:
- AqualinkClient - Authentication and system discovery
- AqualinkSystem - Base class with iAqua and eXO implementations
- AqualinkDevice - Device hierarchy with type-specific subclasses
See CLAUDE.md for detailed architecture documentation.
# Clone the repository
git clone https://github.com/flz/iaqualink-py.git
cd iaqualink-py
# Install dependencies
uv sync --group dev --group test# Run all tests
uv run pytest
# Run with coverage
uv run pytest --cov-report=xml --cov=iaqualink
# Run specific test file
uv run pytest tests/test_client.py# Run all pre-commit hooks (ruff, mypy)
uv run pre-commit run --all-files
# Auto-fix linting issues
uv run ruff check --fix .
# Format code
uv run ruff format .
# Type checking
uv run mypy src/- Python 3.13 or higher
- httpx with HTTP/2 support
This project is licensed under the BSD 3-Clause License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Homepage: https://github.com/flz/iaqualink-py
- Issues: https://github.com/flz/iaqualink-py/issues
This is an unofficial library and is not affiliated with or endorsed by Jandy, Zodiac Pool Systems, or Fluidra. Use at your own risk.
Made with β€οΈ by Florent Thoumie