A Python library for controlling Lightwave (https://lightwaverf.com) Smart Series (second generation) devices as well as Connect Series (first generation) devices connected to a Link Plus hub. Control and monitor lights (dimmers), power outlets (sockets), smart switches (wirefrees), PIRs, thermostats, TRVs, magnetic switches, relays, energy monitors and other device types.
Supported devices include:
- Link Plus hub (required)
- Light Switches / Dimmers
- Power Outlets
- Smart Switches
- TRVs and Thermostats
- Relays and LED Drivers
- And more...
Important: The LWLink2Public
class has been removed as of version 1.0.0.
pip install lightwave_smart
import asyncio
from lightwave_smart import lightwave_smart
async def main():
# Create and authenticate
link = lightwave_smart.LWLink2()
link.auth.set_auth_method(auth_method="password", username="your_email@example.com", password="your_password")
await link.async_activate()
# Get devices and feature sets
await link.async_get_hierarchy()
# List feature sets
for featureset in link.featuresets.values():
device = featureset.device
print(f"{featureset.name} (ID: {featureset.featureset_id}), Device Product Code: {device.product_code}")
# Control a light
featureset_id = "your-feature-set-id"
await link.async_turn_on_by_featureset_id(featureset_id)
await link.async_set_brightness_by_featureset_id(featureset_id, 75)
await link.async_deactivate()
asyncio.run(main())
- Devices: Physical devices (light switches, thermostats, etc.)
- Feature Sets: Logical groupings within a device (e.g. a 2-circuit switch has 2 feature sets)
# Lights/Switches
await link.async_turn_on_by_featureset_id(featureset_id)
await link.async_turn_off_by_featureset_id(featureset_id)
await link.async_set_brightness_by_featureset_id(featureset_id, 50)
# Thermostats
await link.async_set_temperature_by_featureset_id(featureset_id, 22.5)
# Covers/Blinds
await link.async_cover_open_by_featureset_id(featureset_id)
await link.async_cover_close_by_featureset_id(featureset_id)
device = link.featuresets['featureset-id'].device
print(f"Is light: {device.is_light()}")
print(f"Is climate: {device.is_climate()}")
print(f"Is switch: {device.is_switch()}")
def feature_changed(**kwargs):
# example output for a switch:
# {'feature': 'switch', 'feature_id': 'your-feature-set-id', 'prev_value': 0, 'new_value': 1}
print(f"Feature changed: {kwargs}")
# Register callback
await link.async_register_feature_callback(featureset_id, feature_changed)
async_activate()
- Connect to Lightwave serversasync_get_hierarchy()
- Get all devices and feature sets, reads and updates all features states in the background
After calling async_get_hierarchy
all feature known at that time will have their states updated as they change based on events received from the websocket.
async_turn_on_by_featureset_id(id)
- Turn device onasync_turn_off_by_featureset_id(id)
- Turn device offasync_set_brightness_by_featureset_id(id, level)
- Set brightness (0-100)async_set_temperature_by_featureset_id(id, temp)
- Set temperature
is_light()
,is_climate()
,is_switch()
,is_cover()
,is_energy()
- Device type checksis_gen2()
,is_hub()
,is_trv()
- Specific device checks
example_readme.py
- Basic synchronous usageexample_async.py
- Advanced async usage with callbacks
Contributions welcome! Fork, create a feature branch, commit changes, and submit a PR.
MIT License - see LICENSE file.
Credit to Bryan Blunt for the original version: https://github.com/bigbadblunt/lightwave2