Skip to main content

Integration with the meticulouscoffee machine via its REST API

Project description

pyMeticulous

A comprehensive Python wrapper for the Meticulous espresso machine API.

License: GPL v3

Overview

pyMeticulous provides a complete Python interface to the Meticulous TypeScript API, enabling programmatic control and monitoring of Meticulous espresso machines.

Version 0.2.0 brings comprehensive API parity with the TypeScript implementation, full type safety with Pydantic v2, and extensive test coverage.

Features

  • Profile Management: Create, load, save, and manage espresso profiles
  • Real-time Monitoring: Socket.IO integration for live brewing data
  • Shot History: Search, track, rate, and retrieve shot logs (with .zst decompression)
  • Device Control: Execute actions (start, stop, tare, preheat, calibration)
  • WiFi Management: Configure network settings and scan available networks
  • Settings Control: Manage machine settings and preferences
  • Firmware Updates: Upload and install firmware updates
  • Sound Themes: Control sound playback and themes
  • Type Safety: Pydantic models with full validation
  • Comprehensive Error Handling: All methods return typed responses or errors

Installation

You can install the pyMeticulous package using pip:

pip install pyMeticulous

Quick Start

from meticulous.api import Api
from meticulous.api_types import ActionType

# Initialize the API client
api = Api(base_url="http://localhost:8080/")

# Get device information
device = api.get_device_info()
print(f"Connected to: {device.name}")

# List available profiles
profiles = api.list_profiles()
for profile in profiles:
    print(f"Profile: {profile.name}")

# Load and start a profile
api.load_profile_by_id(profiles[0].id)
api.execute_action(ActionType.START)

API Reference

For complete API documentation including all endpoints, parameters, and return types, see the API Specification.

Key capabilities:

  • Profile management (list, load, save, delete)
  • Real-time brewing data via Socket.IO
  • Shot history search, logs (.zst decompression), and statistics
  • Machine control (start, stop, tare, preheat, calibration)
  • WiFi configuration and network scanning
  • Settings management
  • Firmware updates
  • Device information and diagnostics

Examples

The examples/ directory contains several demonstration scripts:

Basic Profile Management

# examples/load_change_and_execute.py
# Demonstrates loading profiles, modifying them, and executing brewing

Socket.IO Real-time Events

# examples/connect_socketio.py
# Shows how to connect to real-time brewing events

Device Information and Statistics

# examples/device_info_and_stats.py
# Get device details and shot history statistics

History Search and Rating

# examples/history_search_and_rating.py
# Search shot history, filter by date, and rate shots

WiFi Management

# examples/wifi_management.py
# Manage WiFi connections and scan networks

Real-time Events

Subscribe to real-time brewing events using Socket.IO:

from meticulous.api import Api, ApiOptions

def on_status(data):
    print(f"State: {data.state}, Time: {data.profile_time}ms")

def on_temperatures(data):
    print(f"Boiler: {data.t_bar_up}°C")

# Configure event handlers
options = ApiOptions(
    onStatus=on_status,
    onTemperatureSensors=on_temperatures
)

api = Api(base_url="http://localhost:8080/", options=options)
api.connect_to_socket()

# Events will now fire automatically
# ... do work ...

api.disconnect_socket()

Error Handling

All API methods return either the expected type or an APIError object:

from meticulous.api_types import APIError

result = api.get_profile("some-id")

if isinstance(result, APIError):
    print(f"Error: {result.error}")
    if result.description:
        print(f"Details: {result.description}")
else:
    # Success - result is a Profile object
    print(f"Profile loaded: {result.name}")

Type Safety

pyMeticulous uses Pydantic v2 for complete data validation and type safety. All API methods accept and return fully typed models. See the Type Reference section in the API specification for complete model documentation.

Development

Running Tests

# Install test dependencies
pip install -e ".[test]"

# Run tests
pytest tests/

# Run with coverage
pytest --cov=meticulous tests/

Project Structure

pyMeticulous/
├── meticulous/
│   ├── __init__.py
│   ├── api.py              # Main API client
│   ├── api_types.py        # Type definitions
│   └── profile.py          # Profile model
├── tests/
│   ├── test_api.py         # API tests
│   ├── test_profiles.py    # Profile tests
│   └── mock_responses.py   # Test fixtures
├── examples/               # Example scripts
├── API_SPEC.md            # Complete API documentation
├── README.md
└── pyproject.toml

Requirements

  • Python >= 3.11
  • requests >= 2.32.3
  • pydantic >= 2.7.3
  • python-socketio >= 5.11.2
  • websocket-client >= 1.8.0
  • zstandard >= 0.22.0 (for shot log decompression)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Related Projects

License

GPL-3.0 License - see LICENSE file for details

Support

For issues, questions, or feature requests:

Changelog

See CHANGELOG.md for full release notes.

Acknowledgments

This project is a Python wrapper for the Meticulous espresso machine API. Thanks to the Meticulous team for creating an open and well-documented API.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pymeticulous-0.2.0.tar.gz (27.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pymeticulous-0.2.0-py3-none-any.whl (23.2 kB view details)

Uploaded Python 3

File details

Details for the file pymeticulous-0.2.0.tar.gz.

File metadata

  • Download URL: pymeticulous-0.2.0.tar.gz
  • Upload date:
  • Size: 27.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pymeticulous-0.2.0.tar.gz
Algorithm Hash digest
SHA256 e5a0dc6cf763edc5b73d1302135130ddddb0f3c68e7296f23bc274b7e94561f1
MD5 a6d2c0bdcba7ab00f031cf1fb683632a
BLAKE2b-256 db9c20ab43e490eb7e8eb6bdb84c1748e2b806f99f0fa775030e875b94d87d57

See more details on using hashes here.

File details

Details for the file pymeticulous-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: pymeticulous-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 23.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pymeticulous-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 73724fa1b53e1b68f077d227390029440b7690e8d5f8c51cde91bbe9a466d450
MD5 aadcd0a358c91010eb0e41d0720be08d
BLAKE2b-256 61a0c60b8d687d8614e98907355e63e4107260cb330eccec7c829b48b58b1013

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page