Steven B.
296af3192e
Handle KeyboardInterrupts in the cli better ( #1391 )
...
Addresses an issue with how `asyncclick` deals with `KeyboardInterrupt`
errors. Instead of the `click.main` receiving `KeyboardInterrupt` it
receives `CancelledError` because it's a task running inside the loop.
Also ensures that discovery catches the `CancelledError` and closes the
http clients.
2024-12-20 14:21:38 +01:00
Teemu R.
37ef7b0463
cli: print model, https, and lv for discover list ( #1339 )
...
```
kasa --target 192.168.xx.xx discover list
HOST MODEL DEVICE FAMILY ENCRYPT HTTPS LV ALIAS
192.168.xxx.xxx KP115(EU) IOT.SMARTPLUGSWITCH XOR 0 - Fridge
192.168.xxx.xxx L900-5 SMART.TAPOBULB KLAP 0 2 L900
192.168.xxx.xxx P115 SMART.TAPOPLUG AES 0 2 Nightdesk
192.168.xxx.xxx TC65 SMART.IPCAMERA AES 1 2 Tapo_TC65_B593
```
Also handles `TimeoutError` and `Exception` during `update()`
---------
Co-authored-by: Steven B <51370195+sdb9696@users.noreply.github.com>
2024-12-17 21:09:17 +01:00
Steven B.
223f3318ea
Use DeviceInfo consistently across devices ( #1338 )
...
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
- Make model exclude region for `iot` devices. This is consistent with `smart` and `smartcam` devices.
- Make region it's own attribute on `Device`.
- Ensure that devices consistently use `_get_device_info` static methods for all information relating to device models.
- Fix issue with firmware and hardware being the wrong way round for `smartcam` devices.
2024-12-13 12:37:13 +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.
bf8f0adabe
Return raw discovery result in cli discover raw ( #1342 )
...
Add `on_discovered_raw` callback to Discover and adds a cli command `discover raw` which returns the raw json before serializing to a `DiscoveryResult` and attempting to create a device class.
2024-12-10 22:42:14 +00:00
Puxtril
cb89342be1
Add LinkieTransportV2 and basic IOT.IPCAMERA support ( #1270 )
...
Add LinkieTransportV2 transport used by kasa cameras and a basic
implementation for IOT.IPCAMERA (kasacam) devices.
---------
Co-authored-by: Zach Price <pricezt@ornl.gov>
Co-authored-by: Steven B <51370195+sdb9696@users.noreply.github.com>
Co-authored-by: Teemu Rytilahti <tpr@iki.fi>
2024-12-07 00:06:58 +01:00
Teemu R.
9966c6094a
Add ssltransport for robovacs ( #943 )
...
This PR implements a clear-text, token-based transport protocol seen on
RV30 Plus (#937 ).
- Client sends `{"username": "email@example.com", "password":
md5(password)}` and gets back a token in the response
- Rest of the communications are done with POST at `/app?token=<token>`
---------
Co-authored-by: Steven B. <51370195+sdb9696@users.noreply.github.com>
2024-12-01 18:06:48 +01:00
Steven B.
5ef8f21b4d
Handle missing mgt_encryption_schm in discovery ( #1318 )
2024-11-29 15:23:16 +00:00
Teemu R.
69e08c2385
Expose energy command to cli ( #1307 )
...
Co-authored-by: Steven B <51370195+sdb9696@users.noreply.github.com>
2024-11-26 09:42:55 +00:00
Steven B.
cae9decb02
Exclude __getattr__ for deprecated attributes from type checkers ( #1294 )
2024-11-21 18:40:13 +00:00
Steven B.
879aca77d1
Update cli modify presets to support smart devices ( #1295 )
2024-11-21 19:10:18 +01:00
Steven B.
0058ad9f2e
Remove pydantic dependency ( #1289 )
...
Remove pydantic dependency in favor of mashumaro.
2024-11-20 15:19:12 +00:00
Steven B.
a01247d48f
Remove support for python <3.11 ( #1273 )
...
Python 3.11 ships with latest Debian Bookworm.
pypy is not that widely used with this library based on statistics. It could be added back when pypy supports python 3.11.
2024-11-18 18:46:36 +00:00
Steven B.
fd5258c28b
Fix discovery by alias for smart devices ( #1260 )
...
Fixes #1259
2024-11-18 13:03:13 +00:00
Steven B.
0d1193ac71
Update cli feature command for actions not to require a value ( #1264 )
2024-11-15 14:38:41 +00:00
Steven B.
b8f6651d9b
Remove experimental support ( #1256 )
2024-11-14 15:55:02 +01:00
Steven B.
157ad8e807
Update cli energy command to use energy module ( #1252 )
2024-11-13 15:57:42 +01:00
Steven B.
254a9af5c1
Update DiscoveryResult to use Mashumaro instead of pydantic ( #1231 )
...
Mashumaro is faster and doesn't come with all versioning problems that
pydantic does.
A basic perf test deserializing all of our discovery results fixtures
shows mashumaro as being about 6 times faster deserializing dicts than
pydantic. It's much faster parsing from a json string but that's likely
because it uses orjson under the hood although that's not really our use
case at the moment.
```
PYDANTIC - ms
=================
json dict
-----------------
4.7665 1.3268
3.1548 1.5922
3.1130 1.8039
4.2834 2.7606
2.0669 1.3757
2.0163 1.6377
3.1667 1.3561
4.1296 2.7297
2.0132 1.3471
4.0648 1.4105
MASHUMARO - ms
=================
json dict
-----------------
0.5977 0.5543
0.5336 0.2983
0.3955 0.2549
0.6516 0.2742
0.5386 0.2706
0.6678 0.2580
0.4120 0.2511
0.3836 0.2472
0.4020 0.2465
0.4268 0.2487
```
2024-11-12 22:00:04 +01:00
Teemu R.
66eb17057e
Enable ruff check for ANN ( #1139 )
2024-11-10 18:55:13 +00:00
Puxtril
4e9a3e6b02
Print formatting for IotLightPreset ( #1216 )
...
Now prints presets as such:
```
[0] Hue: 0 Saturation: 0 Brightness/Value: 100 Temp: 6000 Custom: None Mode: None Id: None
[1] Hue: 0 Saturation: 0 Brightness/Value: 100 Temp: 2500 Custom: None Mode: None Id: None
[2] Hue: 0 Saturation: 0 Brightness/Value: 60 Temp: 2500 Custom: None Mode: None Id: None
[3] Hue: 240 Saturation: 100 Brightness/Value: 100 Temp: 0 Custom: None Mode: None Id: None
```
2024-11-09 18:03:06 +01:00
Steven B.
77b654a9aa
Update try_connect_all to be more efficient and report attempts ( #1222 )
2024-11-01 18:17:18 +00:00
Teemu R.
70c96b5a5d
Initial trigger logs implementation ( #900 )
...
Co-authored-by: Steven B. <51370195+sdb9696@users.noreply.github.com>
2024-11-01 15:36:09 +00:00
Steven B.
4aec9d302f
Allow enabling experimental devices from environment variable ( #1194 )
2024-10-29 09:30:30 +00:00
Steven B.
048c84d72c
Add https parameter to device class factory ( #1184 )
...
`SMART.TAPOHUB` resolves to different device classes based on the https value
2024-10-22 18:09:35 +01:00
Steven B.
3c865b5fb6
Add try_connect_all to allow initialisation without udp broadcast ( #1171 )
...
- Try all valid combinations of protocol/transport/device class and attempt to connect.
- Add cli command `discover config` to return the connection options after connecting via `try_connect_all`.
- The cli command does not return the actual device for processing as this is not a recommended way to regularly connect to devices.
2024-10-22 14:33:46 +01:00
Steven B.
852116795c
Add discovery list command to cli ( #1183 )
...
Report discovered devices in a concise table format.
2024-10-22 12:15:08 +01:00
Steven B.
dcc36e1dfe
Initial TapoCamera support ( #1165 )
...
Adds experimental support for the Tapo Camera protocol also used by the H200 hub.
Creates a new SslAesTransport and a derived SmartCamera and SmartCameraProtocol.
2024-10-16 16:53:52 +01:00
Steven B.
380fbb93c3
Enable newer encrypted discovery protocol ( #1168 )
2024-10-16 15:28:27 +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.
9641edcbc0
Make iot time timezone aware ( #1147 )
...
Also makes on_since for iot devices use device time.
Changes the return value for device.timezone to be tzinfo instead of a dict.
2024-10-08 08:16:51 +01:00
Steven B.
d1b43f5408
Fix cli command for device off ( #1121 )
...
Was previously missed when using the full `kasa device off` command as
opposed to the shortcut.
2024-09-27 17:36:45 +01:00
Teemu R.
b7fa0d2040
Add factory-reset command to cli ( #1108 )
...
Allow reseting devices to factory settings using the cli: `kasa device factory-reset`.
2024-09-21 16:52:52 +02:00
Steven B.
ed033679e5
Split out main cli module into lazily loaded submodules ( #1039 )
2024-07-23 19:13:52 +01:00
Steven B
983aacbc24
Structure cli into a package ( #1038 )
...
PR with just the initial structural changes for the cli to be a package.
Subsequent PR will break out `main.py` into modules. Doing it in two
stages ensure that the commit history will be continuous for `cli.py` >
`cli/main.py`
2024-07-04 14:52:01 +02:00