Skip to main content

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
Standard heat-only iT600 / TRV devices Heat/off/auto control model, active target temperature, battery level, 0.1 °C precision
SQ610 / SQ610RF Quantum Off/heat modes, cool mode when the thermostat reports cooling support, Away / Permanent Hold / Follow Schedule presets, reported Schedule Override state, normalized humidity, floor temperature (external probe), battery level, 0.1 °C precision
FC600 fan-coil Off/heat/cool modes, Follow Schedule / Permanent Hold / Eco presets when supported, reported Schedule Override state, 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

All thermostat families expose the same normalized climate model where their protocols overlap: hold/system/running state, active target temperature, active range, heat/cool setpoints when present, online status, and whitelisted support fields for 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:

  1. AES-256-CBC — legacy iT600 / UGE600 gateways
  2. AES-128-CBC — intermediate firmware variant
  3. 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 0000000000000000 as EUID.
  • Make sure Local WiFi Mode is enabled:
    1. Open the Salus Smart Home app and sign in.
    2. Double-tap your gateway to open the info screen.
    3. Press the gear icon to enter configuration.
    4. Check that Disable Local WiFi Mode is set to No.
    5. Save and power-cycle the gateway.

Development

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
python -m pytest
python -m 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

Licensed under either the Apache License, Version 2.0 (LICENSE-APACHE) or the MIT License (LICENSE-MIT), at your option. See LICENSE and NOTICE for the license expression and attribution details.

Project origin

This project is a maintained fork of epoplavskis/pyit600. It incorporates protocol, device-support, and parser work from leonardpitzu/homeassistant_salus. Leonard Pitzu has since joined development here, and his fork has been retired.

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

salus_it600_client-0.6.0b1.tar.gz (60.6 kB view details)

Uploaded Source

Built Distribution

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

salus_it600_client-0.6.0b1-py3-none-any.whl (45.9 kB view details)

Uploaded Python 3

File details

Details for the file salus_it600_client-0.6.0b1.tar.gz.

File metadata

  • Download URL: salus_it600_client-0.6.0b1.tar.gz
  • Upload date:
  • Size: 60.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for salus_it600_client-0.6.0b1.tar.gz
Algorithm Hash digest
SHA256 c9552deacbd2733458ab7795321401b1fd8ed702f5fc5b6c2ec4db0e0dda6cd2
MD5 70cd9b3fb5e8e208d684463d6f875759
BLAKE2b-256 db7d0f37350c20d92e8667a475bc6264ec97f8675461803086f0cba3e150cb07

See more details on using hashes here.

Provenance

The following attestation bundles were made for salus_it600_client-0.6.0b1.tar.gz:

Publisher: publish.yml on Jordi-14/salus-it600-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file salus_it600_client-0.6.0b1-py3-none-any.whl.

File metadata

File hashes

Hashes for salus_it600_client-0.6.0b1-py3-none-any.whl
Algorithm Hash digest
SHA256 99412878d867e448072b541572c979d4ce58d35ea9dd866e7f55bc2b1ecea5c7
MD5 136c5ea615ba90a7817857b796037629
BLAKE2b-256 d84e95c0200c63c0a7f6e17a023cf5488a9ef7f46c73ec0a248e0691c727142a

See more details on using hashes here.

Provenance

The following attestation bundles were made for salus_it600_client-0.6.0b1-py3-none-any.whl:

Publisher: publish.yml on Jordi-14/salus-it600-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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