Skip to content

ylabonte/myviolet

myviolet — Python client for the Pooldigital Violet pool controller

Lint Test CodeQL Documentation PyPI Package release

PyPI Python Versions

Async Python library for the Pooldigital Violet pool controller — the successor to the ProCon.IP unit (sister library: proconip). Primarily intended as the foundation for a Home Assistant integration, but usable on its own for any Python application that talks to the controller.

Requirements

  • Python ≥ 3.13
  • aiohttp>=3.10,<4
  • yarl>=1.17,<2

The aiohttp and yarl lower bounds are set wide enough to cover older Home Assistant Core deployments — both intentionally accept versions older than HA Core 2026.5's pins.

Install

pip install myviolet

Usage

Reading state

import asyncio
import aiohttp
from myviolet import VioletClient

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with VioletClient(
            session,
            host="violet.local",
            username="admin",
            password="...",
        ) as client:
            snapshot = await client.readings.get()
            if snapshot.water_chemistry.ph is not None:
                print(f"pH:  {snapshot.water_chemistry.ph.value}")
            if snapshot.water_chemistry.orp is not None:
                print(f"ORP: {snapshot.water_chemistry.orp.value} mV")
            if snapshot.pump is not None and snapshot.pump.state.is_on:
                print(f"Pump running for {snapshot.pump.runtime}")

asyncio.run(main())

Control

async with VioletClient(session, host="violet.local", username="admin", password="...") as client:
    await client.control.pump("ON", speed=2)
    await client.control.heater("AUTO")
    await client.control.dosing("CL", "ON", duration=60)
    await client.targets.set_ph(7.2)                 # validates 6.8-7.8 range
    await client.control.cover_open(acknowledge_unsafe=True)

Cover movement is gated behind a mandatory acknowledge_unsafe=True keyword because the vendor disallows fully-automated cover control (people / debris in the pool). Callers are expected to add their own safety logic.

The Violet API at a glance

  • Pure JSON over HTTP, HTTP Basic auth, no WebSocket / SSE — polling.
  • Reads: GET /getReadings?ALL,DOSAGE,RUNTIMES returns ~400 keys.
  • Writes: GET /setFunctionManually?<KEY>,<ACTION>,<DURATION>,<VALUE>, GET /setTargetValues?..., POST /setConfig, POST /setDosingParameters.
  • ~200 documented fields are exposed via typed views (with shared enums for OutputState, CoverState, etc.); the remaining ~200 firmware-specific keys remain accessible via snapshot.raw[...].

Disclaimer

I have nothing to do with the development, selling, marketing, or support of the Violet pool controller itself. This library is a community project intended to make the controller easier to integrate with Home Assistant and other Python-based automations.

License

MIT — see LICENSE.

About

Inofficial python library for the VIOLET swimming pool controller by PoolDigital

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages