Python library for accessing SensorLinx Device Data
Project description
pysensorlinx
An async Python library for the SensorLinx API. It provides full control of HBX HVAC controllers (such as the ECO-0600) — reading sensor data, getting and setting device parameters, and managing heat-pump staging, tank temperatures, backup settings, and more.
Features
- Async — built on
aiohttpfor non-blocking I/O - Login & session management — authenticate, auto-refresh tokens, and close sessions
- Buildings & devices — list buildings and enumerate devices per building
- Get & set parameters — read and write every ECO-0600 configuration parameter
- Temperature objects —
TemperatureandTemperatureDeltaclasses with automatic °F ↔ °C conversion - Read sensor data — retrieve live temperature sensor readings and stage runtimes
- Exception hierarchy — typed exceptions for login failures and invalid parameters
Installation
pip install pysensorlinx
Development install
git clone https://github.com/sslivins/pysensorlinx.git
cd pysensorlinx
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate
pip install -e .[tests]
Quick start
import asyncio
from pysensorlinx import Sensorlinx, SensorlinxDevice
async def main():
api = Sensorlinx()
await api.login("your_username", "your_password")
# List buildings
buildings = await api.get_buildings()
building_id = buildings[0]["_id"]
# List devices in the first building
devices = await api.get_devices(building_id)
device_id = devices[0]["_id"]
# Create a device helper
device = SensorlinxDevice(api, building_id, device_id)
# Read parameters
mode = await device.get_hvac_mode_priority() # "heat", "cool", or "auto"
temps = await device.get_temperatures() # dict of sensor readings
max_temp = await device.get_hot_tank_max_temp() # Temperature(150, 'F')
# Write parameters
await device.set_hvac_mode_priority("auto")
await device.set_hot_tank_max_temp(160) # accepts int (°F) or Temperature
await api.close()
asyncio.run(main())
Temperature & TemperatureDelta
The library returns temperature values as Temperature or TemperatureDelta objects that handle unit conversion automatically. The API stores all values in °F.
from pysensorlinx import Temperature, TemperatureDelta
# Absolute temperatures (°F = °C × 9/5 + 32)
t = Temperature(212, "F")
print(t.celsius) # 100.0
print(t.to_celsius()) # Temperature(100.0, 'C')
print(t) # 212.00°F
# Temperature differentials (ΔF = ΔC × 9/5, no +32 offset)
d = TemperatureDelta(9, "F")
print(d.celsius) # 5.0
print(d.to_celsius()) # TemperatureDelta(5.0, 'C')
print(d) # 9.00Δ°F
Some getters return 'off' when the feature is disabled:
shutdown = await device.get_warm_weather_shutdown() # Temperature(75, 'F') or 'off'
API reference
Sensorlinx
The low-level API client. Manages authentication and HTTP requests.
| Method | Description |
|---|---|
login(username, password) |
Authenticate with SensorLinx |
close() |
Close the HTTP session |
get_user_profile() |
Fetch the authenticated user's profile |
get_buildings(building_id=None) |
List all buildings, or fetch one by ID |
get_devices(building_id, device_id=None) |
List devices in a building, or fetch one |
set_device_parameter(building_id, device_id, **kwargs) |
Set one or more device parameters |
SensorlinxDevice
A high-level wrapper around a single device. All methods are async.
Getters
| Method | Returns | Notes |
|---|---|---|
get_hvac_mode_priority() |
str |
"heat", "cool", or "auto" |
get_permanent_heat_demand() |
bool |
|
get_permanent_cool_demand() |
bool |
|
get_weather_shutdown_lag_time() |
int |
hours |
get_heat_cool_switch_delay() |
int |
seconds |
get_wide_priority_differential() |
bool |
|
get_number_of_stages() |
int |
1–4 |
get_two_stage_heat_pump() |
bool |
|
get_stage_on_lag_time() |
int |
minutes |
get_stage_off_lag_time() |
int |
seconds |
get_rotate_cycles() |
int | 'off' |
|
get_rotate_time() |
int | 'off' |
hours |
get_off_staging() |
bool |
|
get_warm_weather_shutdown() |
Temperature | 'off' |
|
get_hot_tank_outdoor_reset() |
Temperature | 'off' |
|
get_hot_tank_differential() |
TemperatureDelta |
|
get_hot_tank_min_temp() |
Temperature |
|
get_hot_tank_max_temp() |
Temperature |
|
get_cold_weather_shutdown() |
Temperature | 'off' |
|
get_cold_tank_outdoor_reset() |
Temperature | 'off' |
|
get_cold_tank_differential() |
TemperatureDelta |
|
get_cold_tank_min_temp() |
Temperature |
|
get_cold_tank_max_temp() |
Temperature |
|
get_backup_lag_time() |
int | 'off' |
minutes |
get_backup_temp() |
Temperature | 'off' |
|
get_backup_differential() |
TemperatureDelta | 'off' |
|
get_backup_only_outdoor_temp() |
Temperature | 'off' |
|
get_backup_only_tank_temp() |
Temperature | 'off' |
|
get_temperatures(sensor=None) |
dict |
Live sensor readings |
get_stages() |
list[dict] |
Stage info with runtimes |
get_backup() |
dict |
Backup state and runtime |
get_firmware_version() |
float |
|
get_device_type() |
str |
e.g. "ECO-0600" |
Setters
All setters accept the value as the first argument. Temperature setters accept int (°F), Temperature, or 'off' where applicable.
| Method | Accepts |
|---|---|
set_hvac_mode_priority(value) |
"heat", "cool", "auto" |
set_permanent_heat_demand(value) |
bool |
set_permanent_cool_demand(value) |
bool |
set_weather_shutdown_lag_time(value) |
int (0–240 hours) |
set_number_of_stages(value) |
int (1–4) |
set_two_stage_heat_pump(value) |
bool |
set_stage_on_lag_time(value) |
int (1–240 min) |
set_stage_off_lag_time(value) |
int (1–240 sec) |
set_rotate_cycles(value) |
int (1–240) or "off" |
set_rotate_time(value) |
int (1–240 hours) or "off" |
set_off_staging(value) |
bool |
set_heat_cool_switch_delay(value) |
int (30–600 sec) |
set_warm_weather_shutdown(value) |
int (34–180 °F) or "off" |
set_hot_tank_outdoor_reset(value) |
int (-40–127 °F) or "off" |
set_hot_tank_differential(value) |
int (2–100 °F) |
set_hot_tank_min_temp(value) |
int (2–180 °F) |
set_hot_tank_max_temp(value) |
int (2–180 °F) |
set_cold_weather_shutdown(value) |
int (33–119 °F) or "off" |
set_cold_tank_outdoor_reset(value) |
int (0–119 °F) or "off" |
set_cold_tank_differential(value) |
int (2–100 °F) |
set_cold_tank_min_temp(value) |
int (2–180 °F) |
set_cold_tank_max_temp(value) |
int (2–180 °F) |
set_backup_lag_time(value) |
int (1–240 min) or "off" |
set_backup_temp(value) |
int (2–100 °F) or "off" |
set_backup_differential(value) |
int (2–100 °F) or "off" |
set_backup_only_outdoor_temp(value) |
int (-40–127 °F) or "off" |
set_backup_only_tank_temp(value) |
int (33–200 °F) or "off" |
Exceptions
| Exception | When raised |
|---|---|
LoginError |
Base class for login failures |
InvalidCredentialsError |
Wrong username or password |
LoginTimeoutError |
Login request timed out |
InvalidParameterError |
A setter received an out-of-range or invalid value |
Testing
pip install -e .[tests]
pytest
License
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 pysensorlinx-0.1.9.tar.gz.
File metadata
- Download URL: pysensorlinx-0.1.9.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84be059929dc008f1d476c2e36874ae4f2e77335517807aaaee9925a85df3040
|
|
| MD5 |
7929326abb34505871683721f834c1eb
|
|
| BLAKE2b-256 |
d3dffe25bfa290d25ee1a421f2273757f23b48c53d225a5735507cc000544339
|
Provenance
The following attestation bundles were made for pysensorlinx-0.1.9.tar.gz:
Publisher:
publish_to_pypi.yml on sslivins/pysensorlinx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pysensorlinx-0.1.9.tar.gz -
Subject digest:
84be059929dc008f1d476c2e36874ae4f2e77335517807aaaee9925a85df3040 - Sigstore transparency entry: 953389917
- Sigstore integration time:
-
Permalink:
sslivins/pysensorlinx@935969f2771eb64a671b3aed19be9a96df497908 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sslivins
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_to_pypi.yml@935969f2771eb64a671b3aed19be9a96df497908 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file pysensorlinx-0.1.9-py3-none-any.whl.
File metadata
- Download URL: pysensorlinx-0.1.9-py3-none-any.whl
- Upload date:
- Size: 18.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
195da9528264b2c90b8b765277471e8e2069b6ce1b58df93fb6bfbab69579453
|
|
| MD5 |
0e7f2084424acb2af7b98597122281c9
|
|
| BLAKE2b-256 |
5c016d85c090b8b67bb7d205162bca8038ae2a9ca9ba5b10c5e5a29160cb0f0a
|
Provenance
The following attestation bundles were made for pysensorlinx-0.1.9-py3-none-any.whl:
Publisher:
publish_to_pypi.yml on sslivins/pysensorlinx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pysensorlinx-0.1.9-py3-none-any.whl -
Subject digest:
195da9528264b2c90b8b765277471e8e2069b6ce1b58df93fb6bfbab69579453 - Sigstore transparency entry: 953389922
- Sigstore integration time:
-
Permalink:
sslivins/pysensorlinx@935969f2771eb64a671b3aed19be9a96df497908 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sslivins
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_to_pypi.yml@935969f2771eb64a671b3aed19be9a96df497908 -
Trigger Event:
workflow_dispatch
-
Statement type: