Asynchronous Python client for Salus iT600 local gateways
Project description
salus-it600-client
An asynchronous Python client for local control and monitoring of Salus iT600 smart home devices through UGE600 or UG800 gateways — thermostats, TRVs, smart plugs, roller shutters, sensors, and more, all without cloud dependency.
Features
Climate (thermostats & TRVs)
| Device family | Capabilities |
|---|---|
| iT600 / SQ610 | Heat/off/auto modes, Follow Schedule / Permanent Hold / Off presets, humidity (SQ610), floor temperature (external probe), battery level, 0.1 °C precision |
| FC600 fan-coil | Heat/cool/auto modes, five presets, fan modes (auto/high/medium/low/off), separate heating/cooling setpoints |
| TRV3RF | Heat/off/auto modes, valve opening %, battery (voltage curve), open-window detection, error code diagnostics |
Sensors
| Sensor | Source |
|---|---|
| Temperature | Standalone sensors (TS600, PS600) and thermostat readings |
| Humidity | SQ610 (SunnySetpoint_x100) and standalone multi-sensors |
| Floor temperature | SQ610 with external floor probe (OUTSensorProbe) |
| Battery | Status_d (SQ610RF) and voltage curves (TRV, window/door sensors) |
| Power (W) | Smart plug (sMeteringS) and energy meter ECM600 (sMeterS) |
| Energy (kWh) | Smart plug (sMeteringS) and energy meter ECM600 (sMeterS) |
Binary sensors
| Sensor | Source |
|---|---|
| Window / Door | SW600, OS600 (sIASZS) |
| Water leak | WLS600 |
| Smoke | SmokeSensor-EM |
| TRV relay (heat) | it600MINITRV (sIT600I.RelayStatus) |
| Receiver relay | it600Receiver |
| Low battery | Diagnostic child on battery-powered sensors and TRVs |
| Thermostat problem | Aggregated error flags (Error01–Error32) with descriptions |
| Battery problem | Battery-specific error flags (battery models only) |
| Open window | TRV open-window detection (sComm.OpenWindowStatus) |
Covers
Roller shutters and blinds (RS600): open, close, set position (0-100 %).
Switches
Smart plugs and relays (SP600, SPE600, SR600, and RS600 relay endpoints): on/off control. Dual-endpoint devices exposed as separate entities.
RS600 notes
RS600 is a multifunction physical device. Depending on gateway payloads and installation mode, it can expose a cover surface through sLevelS and separate relay switch endpoints through sOnOffS. The client keeps these capabilities separate so Home Assistant can decide how to present them.
Installation
pip install salus-it600-client
Usage
from salus_it600.gateway import IT600Gateway
async with IT600Gateway(host="192.168.1.100", euid="001E5E0D32906128") as gw:
await gw.connect()
await gw.poll_status()
for device_id, device in gw.get_climate_devices().items():
print(f"{device.name}: {device.current_temperature}°C → {device.target_temperature}°C")
# Set temperature
await gw.set_climate_device_temperature("device_001", 21.5)
Encryption & protocol support
Salus gateways encrypt all local API traffic. The library auto-detects the correct protocol by trying each one in order during connection.
| Legacy AES-CBC | AES-CCM (newer firmware) | |
|---|---|---|
| Gateways | UGE600, older UG800 firmware | UG800 with newer firmware |
| Cipher | AES-256-CBC (fallback: AES-128-CBC) | AES-256-CCM (authenticated encryption) |
| Key derivation | MD5("Salus-{euid}") — static, derived from the gateway EUID |
EUID bytes + hardcoded suffix — 32-byte key |
| IV / nonce | Fixed 16-byte IV | 8-byte random nonce (3 random + 2-byte counter + 3-byte timestamp) |
| Authentication | None | 8-byte MAC tag (CBC-MAC) |
| Padding | PKCS7 | None (CCM handles arbitrary lengths) |
| Wire format | Block-aligned encrypted HTTP body | [ciphertext + 8-byte MAC][8-byte nonce] |
Protocol auto-detection order:
- AES-256-CBC — legacy iT600 / UGE600 gateways
- AES-128-CBC — intermediate firmware variant
- AES-CCM — newer UG800 firmware
Rejected attempts are identified by a characteristic 33-byte reject frame (trailer byte 0xAE).
Supported devices
SQ610RF, SQ610RF(WB), SQ610RFNH, SQ610RFNH(WB), FC600, TRV3RF, it600MINITRV, it600Receiver, SP600, SPE600, SR600, RS600, SW600, OS600, WLS600, SmokeSensor-EM, SD600, TS600, RE600, RE10B, PS600, ECM600.
Unsupported
Buttons (SB600, CSB600) — actions only work through the Salus Smart Home app.
Troubleshooting
- If you can't connect using the EUID on your gateway, try
0000000000000000as EUID. - Make sure Local WiFi Mode is enabled:
- Open the Salus Smart Home app and sign in.
- Double-tap your gateway to open the info screen.
- Press the gear icon to enter configuration.
- Check that Disable Local WiFi Mode is set to No.
- Save and power-cycle the gateway.
Development
python -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
pytest
ruff check .
See CONTRIBUTING.md for architecture details and contribution guidelines.
Migration from pyit600
This package replaces the unmaintained pyit600. Update imports:
# Old
from pyit600.gateway import IT600Gateway
# New
from salus_it600.gateway import IT600Gateway
License
MIT License. See LICENSE for details.
Project origin
This project is a maintained fork of epoplavskis/pyit600. It incorporates protocol, device-support, and parser work from leonardpitzu/homeassistant_salus.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file salus_it600_client-0.4.8.tar.gz.
File metadata
- Download URL: salus_it600_client-0.4.8.tar.gz
- Upload date:
- Size: 45.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fe7dcfbe414dc20dcdebfa092acd1696f3172b42bdfec163c135da24417a9f3
|
|
| MD5 |
b4127ddf3223b71de41e78efc9ecec4d
|
|
| BLAKE2b-256 |
19b011e1809ce5a1930bba0ed36e72e452a661b07c7ef4e1bf363956526e5060
|
Provenance
The following attestation bundles were made for salus_it600_client-0.4.8.tar.gz:
Publisher:
publish.yml on Jordi-14/salus-it600-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
salus_it600_client-0.4.8.tar.gz -
Subject digest:
8fe7dcfbe414dc20dcdebfa092acd1696f3172b42bdfec163c135da24417a9f3 - Sigstore transparency entry: 1436100511
- Sigstore integration time:
-
Permalink:
Jordi-14/salus-it600-client@6eac03f313ee176908927132f925e505e00b3d3a -
Branch / Tag:
refs/tags/v0.4.8 - Owner: https://github.com/Jordi-14
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6eac03f313ee176908927132f925e505e00b3d3a -
Trigger Event:
push
-
Statement type:
File details
Details for the file salus_it600_client-0.4.8-py3-none-any.whl.
File metadata
- Download URL: salus_it600_client-0.4.8-py3-none-any.whl
- Upload date:
- Size: 37.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf104e6c4bc7fbda92dea27ee5fd2bebe69d289b6a06b2d2af06a957562ed7c1
|
|
| MD5 |
6178b2b26210ae68b4adb0210df4cafe
|
|
| BLAKE2b-256 |
9d5d2c0813032f72d7facbef257a2115358e762344b8a6ef43c815fea1c11c83
|
Provenance
The following attestation bundles were made for salus_it600_client-0.4.8-py3-none-any.whl:
Publisher:
publish.yml on Jordi-14/salus-it600-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
salus_it600_client-0.4.8-py3-none-any.whl -
Subject digest:
bf104e6c4bc7fbda92dea27ee5fd2bebe69d289b6a06b2d2af06a957562ed7c1 - Sigstore transparency entry: 1436100514
- Sigstore integration time:
-
Permalink:
Jordi-14/salus-it600-client@6eac03f313ee176908927132f925e505e00b3d3a -
Branch / Tag:
refs/tags/v0.4.8 - Owner: https://github.com/Jordi-14
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6eac03f313ee176908927132f925e505e00b3d3a -
Trigger Event:
push
-
Statement type: