No description
  • Rust 58.1%
  • Swift 13.6%
  • Kotlin 11.5%
  • Python 10.6%
  • Shell 4.1%
  • Other 2.1%
Find a file
2026-03-15 18:05:30 +01:00
homeassistant/custom_components/tylo feat: add home assistant 2026-03-13 06:53:39 +01:00
i18n app: setup i18n 2026-03-15 18:05:30 +01:00
tylo-android app: setup i18n 2026-03-15 18:05:30 +01:00
tylo-cli feat: add home assistant 2026-03-13 06:53:39 +01:00
tylo-core feat: add ios/android apps 2026-03-15 17:30:29 +01:00
tylo-ffi app: setup i18n 2026-03-15 18:05:30 +01:00
tylo-ios app: setup i18n 2026-03-15 18:05:30 +01:00
tylo-python feat: add home assistant 2026-03-13 06:53:39 +01:00
.envrc initial CLI 2026-03-13 04:55:48 +01:00
.gitignore app: setup i18n 2026-03-15 18:05:30 +01:00
build-android.sh feat: add ios/android apps 2026-03-15 17:30:29 +01:00
build-ios.sh app: setup i18n 2026-03-15 18:05:30 +01:00
Cargo.lock app: setup i18n 2026-03-15 18:05:30 +01:00
Cargo.toml feat: add ios/android apps 2026-03-15 17:30:29 +01:00
flake.lock feat: add ios/android apps 2026-03-15 17:30:29 +01:00
flake.nix feat: add ios/android apps 2026-03-15 17:30:29 +01:00
README.md chore: add README 2026-03-13 07:57:40 +01:00

Tylo

Unofficial tools for controlling Tylö saunas. Reverse-engineered from the Tylo Control Android app — uses the same protobuf-over-UDP protocol locally and the same REST + WebSocket cloud API at remote.tylohelo.com.

Workspace

Crate Description
tylo-core Rust library — discovery, connection, commands, cloud API, proto codegen
tylo-cli CLI binary (tylo) — status, control, watch, cloud pairing
tylo-python PyO3 bindings — build with maturin develop

homeassistant/custom_components/tylo/ is a Home Assistant integration (climate + light + sensors) that uses the Python bindings.

Build

cargo build                   # core + cli + python bindings
cargo build -p tylo-cli       # cli only
cd tylo-python && maturin develop   # install python module

CLI usage

tylo discover                 # find saunas on the network
tylo status --ip 192.168.1.X  # one-shot status
tylo watch --ip 192.168.1.X   # live-updating status
tylo on --ip 192.168.1.X      # turn on
tylo off --ip 192.168.1.X     # turn off
tylo set --ip 192.168.1.X --temp 80 --humidity 20 --time 60
tylo cloud-pair               # opens a local web page to scan the sauna QR code
tylo cloud-status             # status via cloud API
tylo cloud-watch              # live status via cloud WebSocket

Home Assistant

services.home-assistant = {
  enable = true;
  services.home-assistant.customComponents = [
    pkgs.home-assistant-custom-components.tylo
  ];
};

Protocol notes

  • Local: protobuf (tylohelo package) over raw UDP, default port 51113
  • Temperature encoding: raw = celsius * 9 (e.g. 75 °C = 675)
  • Cloud: same protobuf messages, base64url-encoded over WebSocket
  • State inference: the sauna doesn't always send explicit state — ON/OFF/STANDBY is inferred from RunTimeLeft and StandbyEnable values when needed