Troubleshooting Guide¶
Common issues and solutions when working with lifx.
Table of Contents¶
Discovery Issues¶
No Devices Found¶
Symptom: discover() returns an empty group
Common Causes:
-
Devices not on same network
-
Firewall blocking UDP port 56700
-
Broadcast address incorrect
Try different broadcast addresses:
from lifx import discover, DeviceGroup
# Default (255.255.255.255)
devices = []
async for device in discover():
devices.append(device)
group = DeviceGroup(devices)
# Network-specific (e.g., 192.168.1.255)
devices = []
async for device in discover(broadcast_address="192.168.1.255"):
devices.append(device)
group = DeviceGroup(devices)
Solution:
import asyncio
from lifx.network.discovery import discover_devices
async def diagnose_discovery():
print("Attempting discovery...")
# Try with extended timeout
devices = await discover_devices(
timeout=10.0,
broadcast_address="255.255.255.255"
)
if not devices:
print("No devices found. Check:")
print("1. Devices are powered on")
print("2. Devices are on the same network")
print("3. Firewall allows UDP port 56700")
print("4. Try a network-specific broadcast address")
else:
print(f"Found {len(devices)} devices:")
for device in devices:
print(f" - {device.serial} at {device.ip}")
asyncio.run(diagnose_discovery())
Partial Device Discovery¶
Symptom: Only some devices discovered
Causes:
- Devices on different subnets
- Network congestion
- Devices slow to respond
Solution:
async def thorough_discovery():
# Multiple discovery passes with different timeouts
all_devices = set()
for timeout in [3.0, 5.0, 10.0]:
devices = await discover_devices(timeout=timeout)
for device in devices:
all_devices.add((device.serial, device.ip))
print(f"Total devices found: {len(all_devices)}")
return all_devices
Connection Problems¶
Connection Refused¶
Symptom: LifxConnectionError: Connection refused
Causes:
- Incorrect IP address
- Device powered off
- Network unreachable
Solution:
from lifx import Light, LifxConnectionError
import asyncio
async def test_connection(ip: str):
try:
async with await Light.from_ip(ip) as light:
label = await light.get_label()
print(f"Connected to: {label}")
return True
except LifxConnectionError as e:
print(f"Connection failed: {e}")
print("Check:")
print("1. Device IP is correct")
print("2. Device is powered on")
print("3. Device is reachable (try ping)")
return False
# Test connectivity
asyncio.run(test_connection("192.168.1.100"))
Connection Drops¶
Symptom: Intermittent LifxConnectionError or LifxNetworkError
Causes:
- WiFi signal weak
- Network congestion
- Device overloaded
Solution:
import asyncio
from lifx import Light, LifxError
async def resilient_operation(ip: str, max_retries: int = 3):
"""Retry operations with exponential backoff"""
async with await Light.from_ip(ip) as light:
for attempt in range(max_retries):
try:
await light.set_power(True)
print("Success!")
return
except LifxError as e:
wait_time = 2 ** attempt # 1s, 2s, 4s
print(f"Attempt {attempt + 1} failed: {e}")
if attempt < max_retries - 1:
print(f"Retrying in {wait_time}s...")
await asyncio.sleep(wait_time)
print("All retries exhausted")
Timeout Errors¶
Request Timeouts¶
Symptom: LifxTimeoutError: Request timed out after X seconds
Causes:
- Device slow to respond
- Network latency high
- Device busy processing other requests
Solution:
from lifx import Light
# Increase timeout for slow devices
async with await Light.from_ip(ip, timeout=5.0) as light:
# get_color() returns (color, power, label)
color, power, label = await light.get_color()
Discovery Timeout Too Short¶
Symptom: Some devices not found
Solution:
from lifx import discover
# Increase discovery timeout
async with discover(timeout=10.0) as group: # Default is 3.0
print(f"Found {len(group.devices)} devices")
Performance Issues¶
Slow Operations¶
Symptom: Operations take longer than expected
Diagnosis:
import time
from lifx import Light
async def measure_latency():
async with await Light.from_ip("192.168.1.100") as light:
# Measure single request
start = time.time()
await light.get_label()
elapsed = time.time() - start
print(f"Single request: {elapsed*1000:.2f}ms")
# Measure sequential requests
start = time.time()
for _ in range(10):
await light.get_label()
elapsed = time.time() - start
print(f"10 sequential: {elapsed*1000:.2f}ms ({elapsed*100:.2f}ms avg)")
# Measure concurrent requests
start = time.time()
await asyncio.gather(*[light.get_label() for _ in range(10)])
elapsed = time.time() - start
print(f"10 concurrent: {elapsed*1000:.2f}ms")
Common Causes:
- Sequential instead of concurrent operations
Slow approach (sequential):
Fast approach (concurrent):
- Not reusing connections
Inefficient (creates new connection each time):
for i in range(10):
async with await Light.from_ip(ip) as light:
await light.set_color(HSBK(hue=(360/10)*i), saturation=1.0, brightness=1.0, kelvin=3500)
Efficient (reuses connection):
async with await Light.from_ip(ip) as light:
for i in range(10):
await light.set_color(HSBK(hue=(360/10)*i), saturation=1.0, brightness=1.0, kelvin=3500)
- Need fresh data?
Use get_*() methods to always fetch from the device:
# Always fetch fresh data
# get_color() returns all three values in one call
color, power, label = await light.get_color()
# Or fetch other device info
version = await light.get_version()
Docker / Container Networking¶
Symptom: Discovery doesn't work in Docker container
Cause: Container network isolation
Solution:
Or use manual device specification:
# Don't rely on discovery
from lifx import Light
async with await Light.from_ip("192.168.1.100") as light:
await light.set_color(Colors.BLUE)
Debugging Tips¶
Enable Debug Logging¶
import logging
# Enable DEBUG logging for lifx
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# Or for specific modules
logging.getLogger('lifx.network').setLevel(logging.DEBUG)
logging.getLogger('lifx.devices').setLevel(logging.DEBUG)
Check Product Registry¶
from lifx.products import get_product, get_registry
# List all known products
registry = get_registry()
for product_id, product in registry.items():
print(f"{product_id}: {product.name}")
# Check specific product
product = get_product(27) # LIFX A19
if product:
print(f"Name: {product.name}")
print(f"Capabilities: {product.capabilities}")
Verify Device Reachability¶
# Ping device
ping 192.168.1.100
# Check UDP port (requires nmap)
sudo nmap -sU -p 56700 192.168.1.100
# Test with netcat
echo -n "test" | nc -u 192.168.1.100 56700
Getting Help¶
If you're still experiencing issues:
- Check GitHub Issues: github.com/Djelibeybi/lifx-async/issues
- Enable debug logging: Capture logs with
logging.DEBUG - Provide details:
- Python version
- lifx version
- Device model and firmware version
- Network configuration
- Minimal reproduction code
- Full error traceback
Common Error Messages¶
| Error | Meaning | Solution |
|---|---|---|
LifxTimeoutError |
Device didn't respond | Increase timeout, check network |
LifxConnectionError |
Can't connect to device | Check IP, firewall, device power |
LifxDeviceNotFoundError |
Device not discovered | Check network, increase timeout |
LifxProtocolError |
Invalid response | Update firmware, check device type |
LifxUnsupportedCommandError |
Device doesn't support command | Check device capabilities |
AttributeError: 'Light' has no attribute 'set_color_zones' |
Wrong device class | Use MultiZoneLight |
Next Steps¶
- Advanced Usage - Optimization patterns
- API Reference - Complete API documentation
- FAQ - Frequently asked questions