# Anovable
Python library for controlling Anova Precision Cookers via Bluetooth LE.
## Installation
```bash
pip install anovable
```
## Configuration
Create an `anovable.yaml` configuration file (Home Assistant compatible format):
```yaml
# Anovable Configuration File
anova:
mac_address: "01:02:03:04:05:06" # Your Anova device MAC address
connection:
timeout: 5.0
retry_attempts: 3
temperature:
default_unit: "celsius"
logging:
level: "INFO"
```
## Python Usage
```python
import asyncio
from anovable import AnovaBLE
async def main():
# Auto-discovers device or uses config file
anova = AnovaBLE()
if await anova.connect():
# Get status
status = await anova.get_status()
print(f"Status: {status}")
# Set temperature
await anova.set_temperature(60.0)
# Start cooking
await anova.start_cooking()
# Set timer (auto-starts by default, but only if cooker is running)
await anova.set_timer(120) # 120 minutes, auto-starts if cooker running
# Or set timer without auto-starting
await anova.set_timer(120, auto_start=False)
await anova.disconnect()
asyncio.run(main())
```
## CLI Usage
The CLI automatically uses your MAC address from `anovable.yaml`:
### Status Commands
```bash
# Get comprehensive device status
anova-cli status
# or
anova-cli state
# Get current temperature
anova-cli temp
# Get target temperature
anova-cli target
# Get timer status
anova-cli timer
# Get temperature unit
anova-cli unit
```
### Control Commands
```bash
# Typical workflow
anova-cli set-temp 60.0 # Set target temperature
anova-cli start # Start cooking
anova-cli set-timer 120 # Set timer (auto-starts since cooker is running)
# Individual commands
anova-cli start # Start cooking
anova-cli stop # Stop cooking
# Set target temperature (Celsius) - uses positional argument
anova-cli set-temp 60.0
# Set timer (minutes) - automatically starts timer if cooker is running
anova-cli set-timer 120
# Set timer without auto-starting
anova-cli set-timer 120 --no-auto-start
# Manual timer control (requires cooker to be running)
anova-cli start-timer
anova-cli stop-timer
```
### Options
```bash
# Override MAC address (short flag available)
anova-cli --mac-address aa:bb:cc:dd:ee:ff status
anova-cli -m aa:bb:cc:dd:ee:ff status
# Use custom config file (short flag available)
anova-cli --config /path/to/config.yaml status
anova-cli -c /path/to/config.yaml status
# Enable debug logging (short flag available)
anova-cli --debug status
anova-cli -d status
# Show version
anova-cli --version
# Get help for any command
anova-cli --help
anova-cli status --help
# Enable shell completion (bash, zsh, fish, PowerShell)
anova-cli --install-completion
anova-cli --show-completion # Show completion script to copy manually
```
## Device Discovery
If you don't know your Anova's MAC address:
```python
import asyncio
from anovable import AnovaBLE
async def find_device():
anova = AnovaBLE()
mac_address = await anova.discover_device()
if mac_address:
print(f"Found Anova at: {mac_address}")
else:
print("No Anova device found")
asyncio.run(find_device())
```
Raw data
{
"_id": null,
"home_page": null,
"name": "matonb-anovable",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "anova, ble, bluetooth, precision-cooker, sous-vide",
"author": null,
"author_email": "matonb <matonb@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/48/7e/1f29ca3d766600644cfe109f7e5ce796fbdb46208e329caded080b7748fb/matonb_anovable-1.3.1.tar.gz",
"platform": null,
"description": "# Anovable\n\nPython library for controlling Anova Precision Cookers via Bluetooth LE.\n\n## Installation\n\n```bash\npip install anovable\n```\n\n## Configuration\n\nCreate an `anovable.yaml` configuration file (Home Assistant compatible format):\n\n```yaml\n# Anovable Configuration File\nanova:\n mac_address: \"01:02:03:04:05:06\" # Your Anova device MAC address\n\n connection:\n timeout: 5.0\n retry_attempts: 3\n\n temperature:\n default_unit: \"celsius\"\n\n logging:\n level: \"INFO\"\n```\n\n## Python Usage\n\n```python\nimport asyncio\nfrom anovable import AnovaBLE\n\nasync def main():\n # Auto-discovers device or uses config file\n anova = AnovaBLE()\n\n if await anova.connect():\n # Get status\n status = await anova.get_status()\n print(f\"Status: {status}\")\n\n # Set temperature\n await anova.set_temperature(60.0)\n\n # Start cooking\n await anova.start_cooking()\n\n # Set timer (auto-starts by default, but only if cooker is running)\n await anova.set_timer(120) # 120 minutes, auto-starts if cooker running\n\n # Or set timer without auto-starting\n await anova.set_timer(120, auto_start=False)\n\n await anova.disconnect()\n\nasyncio.run(main())\n```\n\n## CLI Usage\n\nThe CLI automatically uses your MAC address from `anovable.yaml`:\n\n### Status Commands\n```bash\n# Get comprehensive device status\nanova-cli status\n# or\nanova-cli state\n\n# Get current temperature\nanova-cli temp\n\n# Get target temperature\nanova-cli target\n\n# Get timer status\nanova-cli timer\n\n# Get temperature unit\nanova-cli unit\n```\n\n### Control Commands\n```bash\n# Typical workflow\nanova-cli set-temp 60.0 # Set target temperature\nanova-cli start # Start cooking\nanova-cli set-timer 120 # Set timer (auto-starts since cooker is running)\n\n# Individual commands\nanova-cli start # Start cooking\nanova-cli stop # Stop cooking\n\n# Set target temperature (Celsius) - uses positional argument\nanova-cli set-temp 60.0\n\n# Set timer (minutes) - automatically starts timer if cooker is running\nanova-cli set-timer 120\n\n# Set timer without auto-starting\nanova-cli set-timer 120 --no-auto-start\n\n# Manual timer control (requires cooker to be running)\nanova-cli start-timer\nanova-cli stop-timer\n```\n\n### Options\n```bash\n# Override MAC address (short flag available)\nanova-cli --mac-address aa:bb:cc:dd:ee:ff status\nanova-cli -m aa:bb:cc:dd:ee:ff status\n\n# Use custom config file (short flag available)\nanova-cli --config /path/to/config.yaml status\nanova-cli -c /path/to/config.yaml status\n\n# Enable debug logging (short flag available)\nanova-cli --debug status\nanova-cli -d status\n\n# Show version\nanova-cli --version\n\n# Get help for any command\nanova-cli --help\nanova-cli status --help\n\n# Enable shell completion (bash, zsh, fish, PowerShell)\nanova-cli --install-completion\nanova-cli --show-completion # Show completion script to copy manually\n```\n\n## Device Discovery\n\nIf you don't know your Anova's MAC address:\n\n```python\nimport asyncio\nfrom anovable import AnovaBLE\n\nasync def find_device():\n anova = AnovaBLE()\n mac_address = await anova.discover_device()\n if mac_address:\n print(f\"Found Anova at: {mac_address}\")\n else:\n print(\"No Anova device found\")\n\nasyncio.run(find_device())\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python library for controlling Anova Precision Cookers via Bluetooth LE",
"version": "1.3.1",
"project_urls": {
"Homepage": "https://github.com/matonb/anovable",
"Issues": "https://github.com/matonb/anovable/issues",
"Repository": "https://github.com/matonb/anovable"
},
"split_keywords": [
"anova",
" ble",
" bluetooth",
" precision-cooker",
" sous-vide"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "71577ef3f46b85d2025966b8f8fca1f7ac5b5a55237aeb11ed855f4b3fefdac6",
"md5": "806d6521f51802fd06eb2946397eff96",
"sha256": "55bde7da8001beecbe2c88f4550356986401221e8710e86e0c144bbaaec1551f"
},
"downloads": -1,
"filename": "matonb_anovable-1.3.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "806d6521f51802fd06eb2946397eff96",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 12759,
"upload_time": "2025-08-03T19:27:55",
"upload_time_iso_8601": "2025-08-03T19:27:55.768108Z",
"url": "https://files.pythonhosted.org/packages/71/57/7ef3f46b85d2025966b8f8fca1f7ac5b5a55237aeb11ed855f4b3fefdac6/matonb_anovable-1.3.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "487e1f29ca3d766600644cfe109f7e5ce796fbdb46208e329caded080b7748fb",
"md5": "d4d2d5b6d0849e1c62be0f919c085fc3",
"sha256": "3711deb981e6c27cea39b3725666e8bfebd6e88c47fb311ddb263450d8d9184c"
},
"downloads": -1,
"filename": "matonb_anovable-1.3.1.tar.gz",
"has_sig": false,
"md5_digest": "d4d2d5b6d0849e1c62be0f919c085fc3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 13597,
"upload_time": "2025-08-03T19:27:57",
"upload_time_iso_8601": "2025-08-03T19:27:57.315905Z",
"url": "https://files.pythonhosted.org/packages/48/7e/1f29ca3d766600644cfe109f7e5ce796fbdb46208e329caded080b7748fb/matonb_anovable-1.3.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-03 19:27:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "matonb",
"github_project": "anovable",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "matonb-anovable"
}