Caldera Sauna — Home Assistant integration
Local control of Relaxe Caldera infrared saunas over Bluetooth LE — no cloud, no account. Adds sauna controls to Home Assistant, and works through an ESPHome BLE proxy if the sauna is out of range of your HA host.
⚠️ Safety: Unofficial, as-is software with no warranty — and not a safety device. Never rely on it as your only safeguard. Follow all of the sauna manufacturer's safety instructions, including unplugging the sauna when it's not in use, and never run it unattended. See Safety & liability below.
Install (HACS)
- In HACS → ⋮ → Custom repositories, add
https://github.com/realark/caldera-bleas an Integration. - Search for Caldera Sauna, download it, and restart Home Assistant.
- Open Settings → Devices & Services — your sauna should be discovered automatically. Click Configure to add it.
Disconnect the manufacturer's phone app from the sauna first — the sauna allows only one Bluetooth connection at a time.
That's it. You'll get:
- Climate — power on/off, current & target temperature
- Light — RGB mood light (color presets as effects)
- Switch — cabin lamp
- Number — session timer (minutes)
- Binary sensor — fault/problem indicator (diagnostic)
Manual install (without HACS)
Copy custom_components/caldera_sauna/ into your HA config/custom_components/
and restart.
How it works
Reverse-engineered from the manufacturer's Android app: the sauna exposes a
cheap serial-over-BLE module (service FFF0, characteristic FFF1) speaking a
plain ASCII protocol — no pairing, PIN, or auth. The integration talks to it
through Home Assistant's Bluetooth stack, so both host adapters and ESPHome BLE
proxies work. Full wire protocol: PROTOCOL.md.
The protocol logic lives in a standalone, hardware-independent Python library
(caldera-sauna on PyPI); the Home
Assistant integration is a thin layer on top.
Developing
src/caldera_sauna/
protocol.py pure codec (no I/O) — encode commands, decode status frames
device.py bleak + bleak-retry-connector transport (proxy-compatible)
monitor.py read-only CLI: scan, connect, print decoded state
scripts/ hardware probes / calibration tools (read-only unless noted)
tests/ unit tests for the codec (no hardware needed)
custom_components/caldera_sauna/ the Home Assistant integration
python3 -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
pytest # codec tests, no hardware
ruff check src tests scripts custom_components
# Home Assistant integration tests (separate env; needs Python <= 3.12 for now)
python3.12 -m venv .venv-ha && . .venv-ha/bin/activate
pip install -e ".[ha-test]"
pytest tests_ha/ -o asyncio_mode=auto
Device-specific info stays out of git — copy .env.example to .env and set
your sauna's BLE address (find it with bluetoothctl scan on or nRF Connect).
The scripts/ tools read .env; with no address set they scan by name
(default Sauna). Read-only state monitor:
caldera-sauna-monitor # scan by name, print decoded state; sends nothing
Releases are cut with ./release.sh <version> (bumps versions, publishes to
PyPI, tags, pushes, and creates the GitHub release HACS installs from).
Safety & liability
This is free, unofficial, as-is software (see LICENSE). It comes with no warranty of any kind, and the authors accept no liability for any damage, injury, or loss arising from its use — including malfunction, incorrect readings, dropped or delayed commands, or a heater being left on.
This is not a safety device. Do not rely on it for safety-critical control of your sauna, and do not assume that software commands, reported state, or connectivity are reliable. It does not replace or augment any safety mechanisms provided by the manufacturer — never bypass or disable those. Don't run the sauna unattended, and follow all of the manufacturer's safety instructions, including unplugging the sauna when it's not in use. You are solely responsible for how you use this software.
Independent project — not affiliated with, endorsed by, or supported by Relaxe or Caldera. Reverse-engineered for personal interoperability.
Metadata
Release files for caldera-sauna 0.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| caldera_sauna-0.0.6.tar.gz | 16.8 kB | Without provenance | Details for caldera_sauna-0.0.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| caldera_sauna-0.0.6-py3-none-any.whl | Python 3 | none | any | Details for caldera_sauna-0.0.6-py3-none-any.whl |
Total release size: 29.2 kB
Release files / caldera_sauna-0.0.6.tar.gz
| Download URL | caldera_sauna-0.0.6.tar.gz |
|---|---|
| Size | 16.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6575d4d609796411c1604c0ab21ffbd0235a02d4ffd04cb87391185c8253731c
|
|
BLAKE2b-256 checksum How to use checksums |
35fa10cb71e12dd9e7d9e7486afde20f0ab9615555800d6e5e27ca56bf7367e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / caldera_sauna-0.0.6-py3-none-any.whl
| Download URL | caldera_sauna-0.0.6-py3-none-any.whl |
|---|---|
| Size | 12.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dc902c1701fb21ad9cceee421c2617d9eb1c82098fa46742862dd8c11560c74a
|
|
BLAKE2b-256 checksum How to use checksums |
87d21d1ec645543fa0e12072bd1c0fef26c345f3d0a560b7c25f86fce71a1c16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for caldera-sauna 0.0.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.