{"id":49841179,"url":"https://github.com/ylabonte/proconip-pypi","last_synced_at":"2026-06-15T01:02:23.901Z","repository":{"id":154011397,"uuid":"625756990","full_name":"ylabonte/proconip-pypi","owner":"ylabonte","description":"Python library (PyPi package) for basic support of the ProCon.IP swimming pool controller unit.","archived":false,"fork":false,"pushed_at":"2026-06-14T08:42:29.000Z","size":352,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-14T10:19:51.272Z","etag":null,"topics":["library","pool-controller","pool-digital","pooldigital","procon-ip","proconip","pypi","pypi-package","python"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/proconip","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ylabonte.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-10T03:13:00.000Z","updated_at":"2026-06-14T08:42:30.000Z","dependencies_parsed_at":"2024-05-09T21:42:17.392Z","dependency_job_id":"05571371-e1cc-4dcd-a04e-769893ff78fe","html_url":"https://github.com/ylabonte/proconip-pypi","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/ylabonte/proconip-pypi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ylabonte%2Fproconip-pypi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ylabonte%2Fproconip-pypi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ylabonte%2Fproconip-pypi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ylabonte%2Fproconip-pypi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ylabonte","download_url":"https://codeload.github.com/ylabonte/proconip-pypi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ylabonte%2Fproconip-pypi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34343312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["library","pool-controller","pool-digital","pooldigital","procon-ip","proconip","pypi","pypi-package","python"],"created_at":"2026-05-14T06:13:13.344Z","updated_at":"2026-06-15T01:02:23.895Z","avatar_url":"https://github.com/ylabonte.png","language":"Python","funding_links":["https://www.buymeacoffee.com/ylabonte"],"categories":[],"sub_categories":[],"readme":"# Python package for the ProCon.IP Pool Controller\n\n[![Lint](https://github.com/ylabonte/proconip-pypi/actions/workflows/lint.yml/badge.svg)](https://github.com/ylabonte/proconip-pypi/actions/workflows/lint.yml)\n[![Test](https://github.com/ylabonte/proconip-pypi/actions/workflows/test.yml/badge.svg)](https://github.com/ylabonte/proconip-pypi/actions/workflows/test.yml)\n[![CodeQL](https://github.com/ylabonte/proconip-pypi/actions/workflows/codeql.yml/badge.svg)](https://github.com/ylabonte/proconip-pypi/actions/workflows/codeql.yml)\n[![Documentation](https://github.com/ylabonte/proconip-pypi/actions/workflows/docs.yml/badge.svg)](https://ylabonte.github.io/proconip-pypi/)\n[![PyPI Package release](https://github.com/ylabonte/proconip-pypi/actions/workflows/python-publish.yml/badge.svg)](https://github.com/ylabonte/proconip-pypi/actions/workflows/python-publish.yml)\n\n[![PyPI](https://img.shields.io/pypi/v/proconip?label=Current%20Release)](https://pypi.org/project/proconip/)\n[![Python Versions](https://img.shields.io/pypi/pyversions/proconip)](https://pypi.org/project/proconip/)\n\n## Overview\n\n* [Introduction (_What is this library for?_)](#introduction)\n* [Requirements](#requirements)\n* [Installation](#installation)\n* [Usage](#usage-examples)\n  * [Reading the current state](#reading-the-current-state)\n  * [Switching relays](#switching-relays)\n* [A brief description of the ProCon.IP pool controller](#a-brief-description-of-the-proconip-pool-controller)\n* [Get support](#get-support)\n* [Give support](#give-support)\n* [Release Notes](#release-notes)\n* [Disclaimer](#disclaimer)\n\n---\n![ProCon.IP Python Library](https://raw.githubusercontent.com/ylabonte/proconip-pypi/main/logo.png)\n\n## Introduction\n\nThe name of this library refers to the [ProCon.IP pool controller](#a-brief-description-of-the-proconip-pool-controller).\nIt is a port of my [procon-ip](https://github.com/ylabonte/procon-ip)\nTypeScript library (available as [NPM Package](https://www.npmjs.com/package/procon-ip)).\nAs the TypeScript library was a byproduct of my ioBroker adapter for the pool\ncontroller unit, this library is primarily intended for the implementation of a\nHome Assistant integration.\n\nThe library is fully typed (PEP 561). An IDE with auto-completion will give\nyou most of what you need; for the full reference see the documentation site:\n\n- **API reference**: \u003chttps://ylabonte.github.io/proconip-pypi/\u003e\n\nFeel free to ask questions via [GitHub Issues](https://github.com/ylabonte/proconip-pypi/issues)\nso others can benefit from the answers too. Thanks!\n\n## Requirements\n\n- **Python ≥ 3.13**\n- `aiohttp \u003e= 3.10, \u003c 4`\n- `yarl \u003e= 1.9, \u003c 2`\n\nThese dependency ranges are compatible with\n[Home Assistant Core 2026.5](https://www.home-assistant.io/) pins\n(`aiohttp==3.13.5`, `yarl==1.23.0`).\n\n\u003e **v2.0.0 breaking changes** — see [CHANGELOG.md](CHANGELOG.md) for details:\n\u003e - Python ≥ 3.13 required (was ≥ 3.10)\n\u003e - `async-timeout` dependency removed (use `asyncio.timeout` from stdlib)\n\u003e - `Relay` value semantics fixed (offset+gain applied exactly once)\n\u003e - `TimeoutException` is now actually raised for timeouts\n\n## Installation\n\nThis library is available on [PyPI](https://pypi.org/project/proconip/). So you \ncan easily install it with pip:\n```bash\npip install proconip\n```\nor\n```bash\npython -m pip install proconip\n```\nIn both cases you can add `--upgrade` to update to the latest version.\n\n## Usage examples\n\n### Reading the current state\n\n```python\nimport asyncio\nimport aiohttp\nfrom proconip import ConfigObject, GetState\n\n\nasync def reading_data_example():\n    client_session = aiohttp.ClientSession()\n    config = ConfigObject(\"http://192.168.2.3\", \"admin\", \"admin\")\n    get_state_api = GetState(client_session, config)\n    data = await get_state_api.async_get_state()\n    await client_session.close()\n    print(f\"Redox (Chlor): {data.redox_electrode.display_value}\")\n    print(f\"pH: {data.ph_electrode.display_value}\")\n    for relay in (r for r in data.relays() if r.name != \"n.a.\"):\n        print(f\"{relay.name}: {relay.display_value}\")\n    for temp in (t for t in data.temperature_objects if t.name != \"n.a.\"):\n        print(f\"{temp.name}: {temp.display_value}\")\n\n\nasyncio.run(reading_data_example())\n```\n\n### Switching relays\n\n```python\nimport asyncio\nimport aiohttp\nfrom proconip import ConfigObject, GetState, RelaySwitch\n\n\nasync def relay_switching_example():\n    client_session = aiohttp.ClientSession()\n    config = ConfigObject(\"http://192.168.2.3\", \"admin\", \"admin\")\n    get_state_api = GetState(client_session, config)\n    relay_switch = RelaySwitch(client_session, config)\n    data = await get_state_api.async_get_state()\n    print(f\"Relay no. 2: {data.get_relay(1).display_value}\")\n    print(f\"Relay no. 3: {data.get_relay(2).display_value}\")\n    await relay_switch.async_set_auto_mode(data, 1)\n    data = await get_state_api.async_get_state()\n    print(f\"Relay no. 2: {data.get_relay(1).display_value}\")\n    await relay_switch.async_switch_on(data, 2)\n    data = await get_state_api.async_get_state()\n    print(f\"Relay no. 3: {data.get_relay(2).display_value}\")\n    await relay_switch.async_switch_off(data, 1)\n    data = await get_state_api.async_get_state()\n    print(f\"Relay no. 2: {data.get_relay(1).display_value}\")\n    await relay_switch.async_switch_off(data, 2)\n    data = await get_state_api.async_get_state()\n    print(f\"Relay no. 3: {data.get_relay(2).display_value}\")\n    await client_session.close()\n\n\nasyncio.run(relay_switching_example())\n```\n\n### Starting manual dosage\n\nManual dosage depends on the same factors as if started from the web interface\nof the pool control itself.\n\n```python\nimport asyncio\nimport aiohttp\nfrom proconip import ConfigObject, DosageControl\n\n\nasync def manual_dosage_example():\n    client_session = aiohttp.ClientSession()\n    config = ConfigObject(\"http://192.168.2.3\", \"admin\", \"admin\")\n    dosage_control = DosageControl(client_session, config)\n    await dosage_control.async_chlorine_dosage(3600) # start for 1 hour\n    await dosage_control.async_ph_minus_dosage(60) # start for 1 minute\n    await client_session.close()\n\n\nasyncio.run(manual_dosage_example())\n```\n\n### Reading and changing DMX channel states\n\n```python\nimport asyncio\nimport aiohttp\nfrom proconip import ConfigObject, DmxControl\n\n\nasync def dmx_example():\n    client_session = aiohttp.ClientSession()\n    config = ConfigObject(\"http://192.168.2.3\", \"admin\", \"admin\")\n    dmx_control = DmxControl(client_session, config)\n    dmx_data = await dmx_control.async_get_dmx()\n    for channel in dmx_data:\n        print(f\"{channel.name} before: {channel.value}\")\n        dmx_data.set(channel.index, (channel.value + 128) % 256)\n        print(f\"{channel.name} after: {dmx_data.get_value(channel.index)}\")\n      \n    await dmx_control.async_set(dmx_data)\n    await client_session.close()\n\n\nasyncio.run(dmx_example())\n\n```\n\n## A brief description of the ProCon.IP pool controller\n\nThe ProCon.IP pool controller is a low budget network attached control unit for\nhome swimming pools. With its software switched relays, it can control\nmultiple pumps (for the pool filter and different dosage aspects) either\nsimply planned per time schedule or depending on a reading/value from one of\nits many input channels for measurements (eg. i/o flow sensors, Dallas 1-Wire\nthermometers, redox and pH electrodes). At least there is also the option to\nswitch these relays on demand, which makes them also applicable for switching\nlights (or anything else you want) on/off.\nNot all of its functionality is reachable via API. In fact there is one\ndocumented API for reading (polling) values as CSV (`/GetState.csv`). In my\nmemories there was another one for switching the relays on/off and on with\ntimer. But I cannot find the second one anymore. So not even pretty, but\nfunctional: The ProCon.IP has two native web interfaces, which can be\nanalyzed, to some kind of reverse engineer a given functionality (like\nswitching the relays).\n\nFor more information see the following links (sorry it's only in german;\nhaven't found an english documentation/information so far):\n\n* [pooldigital.de webshop](https://pooldigital.de/poolsteuerungen/procon.ip/35/procon.ip-webbasierte-poolsteuerung-/-dosieranlage)\n* [pooldigital.de forum](https://www.poolsteuerung.de/)\n\n## Get support\n\nNeed help? Please use the [github issues system](https://github.com/ylabonte/proconip-pypi/issues)\nto ask your question. This way others can contribute or at least take advantage of the final solution.\n\n## Give support\n\nIf you want to support this project or my work in general, you can do so without having any coding abilities.\nBecause programmers are described as machines that convert coffee (their habitual input) into code (their habitual\noutput), there is a really simple way to support me:\n\n[\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" style=\"height: 40px !important;width: 144px !important;\" \u003e](https://www.buymeacoffee.com/ylabonte)\n\n## Release Notes\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full release history.\n\n## Disclaimer\n\n**Just to be clear: I have nothing to do with the development, selling, marketing or support of the pool controller\nunit itself.  \nI just developed small TypeScript/JS and Python libraries as by-products of an ioBroker adapter and a Home Assistant\nintegration for integrating the pool controller unit with common smart home solutions.**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fylabonte%2Fproconip-pypi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fylabonte%2Fproconip-pypi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fylabonte%2Fproconip-pypi/lists"}