Steven B. 
							
						 
					 
					
						
						
							
						
						44c561b04d 
					 
					
						
						
							
							Add FeatureAttributes to smartcam Alarm ( #1489 )  
						
						... 
						
						
	
		
			
	 
	
	
		
	
	
		
			
				
	CI / Perform linting checks (3.13) (push) Has been cancelled 
				
			 
		
			
				
	CodeQL checks / Analyze (python) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Has been cancelled 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Has been cancelled 
				
			 
		
		
	 
 
	 
						
						Co-authored-by: Teemu R. <tpr@iki.fi > 
						
						
					 
					
						2025-01-29 19:32:01 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						82fbe1226e 
					 
					
						
						
							
							Do not return empty string for custom light effect name ( #1491 )  
						
						
						
						
					 
					
						2025-01-29 18:49:06 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						656c88771a 
					 
					
						
						
							
							Add common alarm interface ( #1479 )  
						
						... 
						
						
	
		
			
	 
	
	
		
	
	
		
			
				
	CI / Perform linting checks (3.13) (push) Waiting to run 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CodeQL checks / Analyze (python) (push) Waiting to run 
				
			 
		
		
	 
 
	 
						
						Add a common interface for the `alarm` module across `smart` and `smartcam` devices. 
						
						
					 
					
						2025-01-26 13:33:13 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						09fce3f426 
					 
					
						
						
							
							Add common childsetup interface ( #1470 )  
						
						... 
						
						
						
						Add a common interface for the `childsetup` module across `smart` and `smartcam` hubs.
Co-authored-by: Teemu R. <tpr@iki.fi > 
						
						
					 
					
						2025-01-24 08:08:04 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						fa0f7157c6 
					 
					
						
						
							
							Deprecate legacy light module is_capability checks ( #1297 )  
						
						... 
						
						
						
						Deprecate the `is_color`, `is_dimmable`, `is_variable_color_temp`, `valid_temperate_range`,
and `has_effects` attributes from the `Light` module, as consumers should use
`has_feature("hsv")`, `has_feature("brightness")`, `has_feature("color_temp")`,
`get_feature("color_temp").range`, and `Module.LightEffect in dev.modules` respectively.
Calling the deprecated attributes will emit a `DeprecationWarning`
and type checkers will fail them. 
						
						
					 
					
						2025-01-22 10:26:37 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						7709bb967f 
					 
					
						
						
							
							Update cli, light modules, and docs to use FeatureAttributes ( #1364 )  
						
						
	
		
			
	 
	
	
		
	
	
		
			
				
	CI / Perform linting checks (3.13) (push) Waiting to run 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Blocked by required conditions 
				
			 
		
			
				
	CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Blocked by required conditions 
				
			 
		
			
				
	CodeQL checks / Analyze (python) (push) Waiting to run 
				
			 
		
		
	 
 
	 
						
						
					 
					
						2024-12-11 15:53:35 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						3dfada7575 
					 
					
						
						
							
							Add common Thermostat module ( #977 )  
						
						
						
						
					 
					
						2024-11-26 09:37:15 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						cb4e28394d 
					 
					
						
						
							
							Update docs for the new module attributes has/get feature ( #1301 )  
						
						
						
						
					 
					
						2024-11-26 08:38:20 +00:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						b525d6a35c 
					 
					
						
						
							
							Annotate fan_speed_level of Fan interface ( #1298 )  
						
						
						
						
					 
					
						2024-11-22 21:21:29 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						cae9decb02 
					 
					
						
						
							
							Exclude __getattr__ for deprecated attributes from type checkers ( #1294 )  
						
						
						
						
					 
					
						2024-11-21 18:40:13 +00:00 
						 
				 
			
				
					
						
							
							
								Teemu R. 
							
						 
					 
					
						
						
							
						
						66eb17057e 
					 
					
						
						
							
							Enable ruff check for ANN ( #1139 )  
						
						
						
						
					 
					
						2024-11-10 18:55:13 +00:00 
						 
				 
			
				
					
						
							
							
								Teemu R. 
							
						 
					 
					
						
						
							
						
						5da41fcc11 
					 
					
						
						
							
							Use stacklevel=2 for warnings to report on callsites ( #1219 )  
						
						... 
						
						
						
						Use stacklevel=2 for warnings, as this will correctly show the callsite
instead of the line where the warning is reported.
Currently:
```
kasa/__init__.py:110
  /home/tpr/code/python-kasa/kasa/__init__.py:110: DeprecationWarning: SmartDevice is deprecated, use IotDevice from package kasa.iot instead or use Discover.discover_single() and Device.connect() to support new protocols
    warn(
```
After:
```
kasa/tests/smart/modules/test_contact.py:3
  /home/tpr/code/python-kasa/kasa/tests/smart/modules/test_contact.py:3: DeprecationWarning: SmartDevice is deprecated, use IotDevice from package kasa.iot instead or use Discover.discover_single() and Device.connect() to support new protocols
    from kasa import Module, SmartDevice
``` 
Currently:
```
kasa/tests/test_lightstrip.py: 56 warnings
  /home/tpr/code/python-kasa/kasa/device.py:559: DeprecationWarning: effect is deprecated, use: Module.LightEffect in device.modules instead
    warn(msg, DeprecationWarning, stacklevel=1)
```
After:
```
kasa/tests/test_lightstrip.py::test_effects_lightstrip_set_effect_transition[500-KL430(US)_2.0_1.0.9.json]
  /home/tpr/code/python-kasa/kasa/tests/test_lightstrip.py:62: DeprecationWarning: set_effect is deprecated, use: Module.LightEffect in device.modules instead
    await dev.set_effect("Candy Cane")
``` 
						
						
					 
					
						2024-10-31 14:12:17 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						7fd8c14c1f 
					 
					
						
						
							
							Create common Time module and add time set cli command ( #1157 )  
						
						
						
						
					 
					
						2024-10-15 08:59:25 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B. 
							
						 
					 
					
						
						
							
						
						7bba9926ed 
					 
					
						
						
							
							Allow erroring modules to recover ( #1080 )  
						
						... 
						
						
						
						Re-query failed modules after some delay instead of immediately disabling them.
Changes to features so they can still be created when modules are erroring. 
						
						
					 
					
						2024-07-30 19:23:07 +01:00 
						 
				 
			
				
					
						
							
							
								Teemu R 
							
						 
					 
					
						
						
							
						
						0f5bafaa43 
					 
					
						
						
							
							Require explicit feature type ( #1006 )  
						
						... 
						
						
						
						Explicit > implicit. Having this previously would have avoided using a
wrong type for water_alert in the first place. 
						
						
					 
					
						2024-06-25 18:30:36 +02:00 
						 
				 
			
				
					
						
							
							
								Teemu R 
							
						 
					 
					
						
						
							
						
						472008e818 
					 
					
						
						
							
							Drop python3.8 support ( #992 )  
						
						... 
						
						
						
						Drop support for soon-to-be eol'd python 3.8.
This will allow some minor cleanups & makes it easier to add support for
timezones.
Related to
https://github.com/python-kasa/python-kasa/issues/980#issuecomment-2170889543  
						
						
					 
					
						2024-06-19 20:24:12 +02:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						0d84d8785e 
					 
					
						
						
							
							Update docs with more howto examples ( #968 )  
						
						... 
						
						
						
						Co-authored-by: Teemu R. <tpr@iki.fi > 
						
						
					 
					
						2024-06-19 09:53:40 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						b4a6df2b5c 
					 
					
						
						
							
							Add common energy module and deprecate device emeter attributes ( #976 )  
						
						... 
						
						
						
						Consolidates logic for energy monitoring across smart and iot devices.
Deprecates emeter attributes in favour of common names. 
						
						
					 
					
						2024-06-17 11:22:05 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						db6e335346 
					 
					
						
						
							
							Fix set_state for common light modules ( #929 )  
						
						... 
						
						
						
						PR contains a number of fixes from testing with HA devices:
- Fixes a bug with turning the light on and off via `set_state`
- Aligns `set_brightness` behaviour across `smart` and `iot` devices
such that a value of 0 is off.
- Aligns `set_brightness` behaviour for `IotDimmer` such that setting
the brightness turns on the device with a transition of 1ms. ([HA
comment](https://github.com/home-assistant/core/pull/117839#discussion_r1608720006 ))
- Fixes a typing issue in `LightState`.
- Adds `ColorTempRange` and `HSV` to `__init__.py`
- Adds a `state` property to the interface returning `LightState` for
validating `set_state` changes.
- Adds tests for `set_state` 
						
						
					 
					
						2024-05-22 15:33:55 +02:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						273c541fcc 
					 
					
						
						
							
							Add light presets common module to devices. ( #907 )  
						
						... 
						
						
						
						Adds light preset common module for switching to presets and saving presets.
Deprecates the `presets` attribute and `save_preset` method from the `bulb` 
interface in favour of the modular approach.  Allows setting preset for `iot` 
which was not previously supported. 
						
						
					 
					
						2024-05-19 11:20:18 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						33d839866e 
					 
					
						
						
							
							Make Light and Fan a common module interface ( #911 )  
						
						
						
						
					 
					
						2024-05-13 17:34:44 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						d7b00336f4 
					 
					
						
						
							
							Rename bulb interface to light and move fan and light interface to interfaces ( #910 )  
						
						... 
						
						
						
						Also rename BulbPreset to LightPreset. 
						
						
					 
					
						2024-05-11 19:40:08 +01:00 
						 
				 
			
				
					
						
							
							
								Steven B 
							
						 
					 
					
						
						
							
						
						9473d97ad2 
					 
					
						
						
							
							Create common interfaces for remaining device types ( #895 )  
						
						... 
						
						
						
						Introduce common module interfaces across smart and iot devices and provide better typing implementation for getting modules to support this. 
						
						
					 
					
						2024-05-10 19:29:28 +01:00