cremalink package
Cremalink: A Python library for interacting with De’Longhi coffee machines.
This top-level package exposes the primary user-facing classes and functions for easy access, including the main Client, the Device model, and factory functions for creating device instances.
- class cremalink.Client(token_path: str)[source]
Bases:
objectClient for interacting with the Ayla IoT cloud platform. Manages authentication (access and refresh tokens) and device discovery.
- get_device(dsn: str, device_map_path: dict | None = None)[source]
Retrieves a specific cloud device by its DSN.
- get_lan_config(dsn: str) dict[source]
Fetch LAN connectivity details for a device (FR-006).
Ported from
delonghi_coffee’sapi.get_lan_config— same Ayla platform, same account. Never raises just because LAN is disabled; returnslan_enabled: Falsewith the other fieldsNoneinstead (FR-008).
- get_serial_number(dsn: str) str | None[source]
Fetch the raw
d270_serialnumberproperty for a device.Used as an input to model detection (FR-004); returns
Noneif the property is absent rather than raising, so callers can safely fall through to the next detection tier.
- list_account_devices() list[dict][source]
Discover coffee-machine devices on the account (cloud-assisted onboarding).
Unlike
get_devices()(kept unchanged for backward compatibility), this re-fetches/devices.jsonand returns one enriched dict per coffee-machine device only — non-coffee appliances (e.g. a Pinguino A/C on the same account) are excluded, not just flagged (FR-002).
- class cremalink.Device(transport: DeviceTransport, dsn: str | None = None, model: str | None = None, nickname: str | None = None, ip: str | None = None, lan_key: str | None = None, scheme: str | None = None, is_online: bool | None = None, last_seen: str | None = None, firmware: str | None = None, serial: str | None = None, coffee_count: int | None = None, command_map: Dict[str, ~typing.Any]=<factory>, property_map: Dict[str, ~typing.Any]=<factory>, monitor_profile: MonitorProfile = <factory>, extra: dict[str, ~typing.Any]=<factory>)[source]
Bases:
objectRepresents a coffee machine, providing methods to control and monitor it.
This class holds the device’s state (e.g., IP, model) and uses a DeviceTransport object to handle the actual communication. Device-specific capabilities are loaded from a “device map” file.
- transport
The transport object responsible for communication.
- monitor_profile
Configuration for parsing monitor data.
- do(drink_name: str) Any[source]
Executes a command by its friendly name (e.g., ‘espresso’).
- Parameters:
drink_name – The name of the command to execute, as defined in the command_map.
- Returns:
The response from the transport.
- Raises:
ValueError – If the command name is not found in the device map.
- classmethod from_map(transport: DeviceTransport, device_map_path: str | None = None, **kwargs) Device[source]
Factory method to create a Device instance with a loaded device map.
If device_map_path is not provided, it attempts to find one using the device’s model.
- Parameters:
transport – The communication transport to use.
device_map_path – Optional path to the device map JSON file.
**kwargs – Additional attributes to set on the Device instance.
- Returns:
A configured Device instance.
- get_commands() list[str][source]
Returns a list of all available command names from the device map.
- get_monitor() MonitorView[source]
Retrieves and parses monitoring data into a structured, human-readable view.
- Returns:
A MonitorView instance containing parsed status information.
- get_monitor_frame() MonitorFrame | None[source]
Decodes the raw monitor data into a MonitorFrame for low-level analysis.
- Returns:
A MonitorFrame if decoding is successful, otherwise None.
- get_monitor_snapshot() MonitorSnapshot[source]
Retrieves the latest raw monitoring data from the transport.
- get_property(name: str) Any[source]
Fetches a single property by its alias or technical name.
- Parameters:
name – The alias or name of the property to fetch.
- Returns:
The value of the requested property.
- get_property_aliases() list[str][source]
Returns a list of all available property aliases from the device map.
- monitor_profile: MonitorProfile
- resolve_property(alias: str, default: str | None = None) str[source]
Translates a property alias to its technical name using the property_map.
- Parameters:
alias – The property alias to resolve.
default – A default value to return if the alias is not found.
- Returns:
The resolved technical name, or the alias/default if not found.
- send_command(command: str) Any[source]
Encodes and sends a raw hex command to the device via the transport.
- Parameters:
command – The hex command string to send.
- Returns:
The response from the transport.
- transport: DeviceTransport
- class cremalink.LocalServer(settings: ServerSettings)[source]
Bases:
objectA wrapper class that encapsulates the Uvicorn server and the web application.
- class cremalink.ServerSettings(_case_sensitive: bool | None = None, _nested_model_default_partial_update: bool | None = None, _env_prefix: str | None = None, _env_prefix_target: EnvPrefixTarget | None = None, _env_file: DotenvType | None = PosixPath('.'), _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_nested_max_split: int | None = None, _env_parse_none_str: str | None = None, _env_parse_enums: bool | None = None, _cli_prog_name: str | None = None, _cli_parse_args: bool | list[str] | tuple[str, ...] | None = None, _cli_settings_source: CliSettingsSource[Any] | None = None, _cli_parse_none_str: str | None = None, _cli_hide_none_type: bool | None = None, _cli_avoid_json: bool | None = None, _cli_enforce_required: bool | None = None, _cli_use_class_docs_for_groups: bool | None = None, _cli_show_env_vars: bool | None = None, _cli_exit_on_error: bool | None = None, _cli_prefix: str | None = None, _cli_flag_prefix_char: str | None = None, _cli_implicit_flags: bool | Literal['dual', 'toggle'] | None = None, _cli_ignore_unknown_args: bool | None = None, _cli_kebab_case: bool | Literal['all', 'no_enums'] | None = None, _cli_shortcuts: Mapping[str, str | list[str]] | None = None, _secrets_dir: PathType | None = None, _build_sources: tuple[tuple[PydanticBaseSettingsSource, ...], dict[str, Any]] | None = None, *, SERVER_SETTINGS_PATH: str = '', SERVER_IP: str = '127.0.0.1', SERVER_PORT: int = 10280, ADVERTISED_IP: str | None = None, NUDGER_POLL_INTERVAL: float = 1.0, MONITOR_POLL_INTERVAL: float = 5.0, REKEY_INTERVAL_SECONDS: float = 60.0, QUEUE_MAX_SIZE: int = 200, LOG_RING_SIZE: int = 200, DEVICE_REGISTER_VERIFY: bool = False, DEVICE_REGISTER_CA_PATH: str | None = None, DEVICE_REGISTER_TIMEOUT: float = 10.0, ENABLE_DEVICE_REGISTER: bool = True, ENABLE_NUDGER_JOB: bool = True, ENABLE_MONITOR_JOB: bool = True, ENABLE_REKEY_JOB: bool = True, FIXED_RANDOM_2: str | None = None, FIXED_TIME_2: str | None = None)[source]
Bases:
BaseSettingsDefines the application’s settings, which can be loaded from environment variables or a .env file. This provides a centralized and type-safe way to configure the server’s behavior.
- model_config = {'arbitrary_types_allowed': True, 'case_sensitive': False, 'cli_avoid_json': False, 'cli_enforce_required': False, 'cli_exit_on_error': True, 'cli_flag_prefix_char': '-', 'cli_hide_none_type': False, 'cli_ignore_unknown_args': False, 'cli_implicit_flags': False, 'cli_kebab_case': False, 'cli_parse_args': None, 'cli_parse_none_str': None, 'cli_prefix': '', 'cli_prog_name': None, 'cli_shortcuts': None, 'cli_show_env_vars': False, 'cli_use_class_docs_for_groups': False, 'enable_decoding': True, 'env_file': '.env', 'env_file_encoding': 'utf-8', 'env_ignore_empty': False, 'env_nested_delimiter': None, 'env_nested_max_split': None, 'env_parse_enums': None, 'env_parse_none_str': None, 'env_prefix': '', 'env_prefix_target': 'variable', 'extra': 'ignore', 'json_file': None, 'json_file_encoding': None, 'nested_model_default_partial_update': False, 'populate_by_name': True, 'protected_namespaces': ('model_validate', 'model_dump', 'settings_customise_sources'), 'secrets_dir': None, 'toml_file': None, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True, 'yaml_config_section': None, 'yaml_file': None, 'yaml_file_encoding': None}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- cremalink.authenticate_cloud(email: str, password: str, language: str = 'en') CloudToken[source]
Performs the multi-step authentication flow to obtain a refresh token for the Ayla IoT cloud platform.
This function executes the following steps: 1. Authorize: Initiates the authorization process to obtain a context parameter. 2. Get IDs: Retrieves necessary IDs (ucid, gmid, gmid_ticket) for the login process. 3. Login: Authenticates the user with their email and password, along with risk context information, to obtain a login token. 4. Get User Info: Fetches user information using the login token to obtain UID, UIDSignature, and signatureTimestamp. 5. Consent: Simulates the user consent process to obtain a signature for the authorization continue step. 6. Authorization Continue: Continues the authorization process using the context, login token, and consent signature to obtain an authorization code. 7. IDP Token: Exchanges the authorization code for an IDP token. 8. Exchange for Ayla: Uses the IDP token to sign in to the Ayla cloud and obtain a refresh token.
- Parameters:
- Returns:
An instance of CloudToken containing the obtained refresh token.
- Return type:
- cremalink.create_app(settings: ServerSettings | None = None, device_adapter: DeviceAdapter | None = None, logger=None) FastAPI[source]
Application factory for the FastAPI server.
Initializes all components (state, settings, adapter, jobs) and wires up the API routes, startup/shutdown events, and dependencies.
- Returns:
A configured FastAPI application instance.
- cremalink.create_cloud_device(dsn: str, access_token: str, device_map_path: str | None = None) Device[source]
Creates a Device instance configured for cloud-based communication.
This factory sets up a CloudTransport, which communicates with the device via the manufacturer’s cloud services, requiring an access token.
- Parameters:
dsn – The Device Serial Number.
access_token – The authentication token for the cloud service.
device_map_path – Optional path to a device-specific command map file.
- Returns:
A Device instance configured with a CloudTransport.
- cremalink.create_local_device(dsn: str, lan_key: str, device_ip: str | None, server_host: str, server_port: int = 10280, device_scheme: str = 'http', auto_configure: bool = True, device_map_path: str | None = None) Device[source]
Creates a Device instance configured for local network communication.
This factory sets up a LocalTransport which requires details about the local network environment, including the device’s IP and the local server’s address.
- Parameters:
dsn – The Device Serial Number.
lan_key – The key for authenticating on the local network.
device_ip – The IP address of the coffee machine.
server_host – The hostname or IP address of the local proxy server.
server_port – The port of the local proxy server.
device_scheme – The communication protocol to use with the device (e.g., ‘http’).
auto_configure – If True, the transport will be configured automatically.
device_map_path – Optional path to a device-specific command map file.
- Returns:
A Device instance configured with a LocalTransport.
- cremalink.detect_model_id(raw_serial: str | None, cloud_metadata: dict[str, Any] | None, oem_model: str | None) str | None[source]
Resolve a discovered device to an existing cremalink device-map id.
- Parameters:
raw_serial – The device’s raw serial number string, if known.
cloud_metadata – Additional cloud-reported fields (e.g.
product_name,model), if any.oem_model – The Ayla
oem_model/modelidentifier, if known.
- Returns:
A valid cremalink device-map id, or
Noneif no detection tier yielded a recognized model. Never returns a guessed or default id.
- cremalink.device_map(model_id: str) str[source]
Finds the absolute path to a device map file for a given model ID.
This function handles packaged resources, extracting them to a temporary directory if they are not directly accessible on the filesystem.
- Parameters:
model_id – The model ID of the device.
- Returns:
The absolute path to the device map JSON file as a string.
- Raises:
DeviceMapNotFoundError – If the map for the given model ID doesn’t exist.
Subpackages
- cremalink.clients package
- cremalink.core package
- cremalink.crypto package
- cremalink.devices package
- cremalink.domain package
DeviceDevice.transportDevice.dsnDevice.modelDevice.nicknameDevice.ipDevice.lan_keyDevice.schemeDevice.is_onlineDevice.last_seenDevice.firmwareDevice.serialDevice.coffee_countDevice.command_mapDevice.property_mapDevice.monitor_profileDevice.extraDevice.coffee_countDevice.command_mapDevice.configure()Device.do()Device.dsnDevice.extraDevice.firmwareDevice.from_map()Device.get_commands()Device.get_monitor()Device.get_monitor_frame()Device.get_monitor_snapshot()Device.get_properties()Device.get_property()Device.get_property_aliases()Device.health()Device.ipDevice.is_onlineDevice.lan_keyDevice.last_seenDevice.modelDevice.monitor_profileDevice.nicknameDevice.property_mapDevice.refresh_monitor()Device.resolve_property()Device.schemeDevice.send_command()Device.serialDevice.transport
create_cloud_device()create_local_device()detect_model_id()- Submodules
- cremalink.local_server_app package
ServerSettingsServerSettings.advertised_ipServerSettings.device_register_ca_pathServerSettings.device_register_timeoutServerSettings.device_register_verifyServerSettings.enable_device_registerServerSettings.enable_monitor_jobServerSettings.enable_nudger_jobServerSettings.enable_rekey_jobServerSettings.fixed_random_2ServerSettings.fixed_time_2ServerSettings.log_ring_sizeServerSettings.model_configServerSettings.monitor_poll_intervalServerSettings.nudger_poll_intervalServerSettings.queue_max_sizeServerSettings.rekey_interval_secondsServerSettings.server_ipServerSettings.server_portServerSettings.server_settings_path
create_app()- Submodules
- cremalink.local_server_app.api module
- cremalink.local_server_app.config module
- cremalink.local_server_app.device_adapter module
- cremalink.local_server_app.jobs module
- cremalink.local_server_app.logging module
- cremalink.local_server_app.models module
- cremalink.local_server_app.protocol module
- cremalink.local_server_app.state module
- cremalink.parsing package
- cremalink.resources package
- cremalink.transports package