mijiaAPI 1.4.4__tar.gz → 1.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/PKG-INFO +11 -4
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/README.md +10 -3
- mijiaapi-1.5.0/mijiaAPI/__init__.py +3 -0
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/__main__.py +5 -5
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/devices.py +37 -2
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/login.py +10 -11
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/pyproject.toml +2 -2
- mijiaapi-1.4.4/mijiaAPI/__init__.py +0 -3
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/LICENSE +0 -0
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/apis.py +0 -0
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/code.py +0 -0
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/logger.py +0 -0
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/urls.py +0 -0
- {mijiaapi-1.4.4 → mijiaapi-1.5.0}/mijiaAPI/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: mijiaAPI
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.0
|
|
4
4
|
Summary: A Python API for Xiaomi Mijia
|
|
5
5
|
License: GPLv3
|
|
6
6
|
Author: Do1e
|
|
@@ -53,6 +53,13 @@ pip install .
|
|
|
53
53
|
poetry install
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
### aur
|
|
57
|
+
如果你使用 Arch Linux 或基于 Arch 的发行版,可以通过 AUR 安装:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
yay -S python-mijia-api
|
|
61
|
+
```
|
|
62
|
+
|
|
56
63
|
## 使用
|
|
57
64
|
|
|
58
65
|
使用实例可以参考 `demos` 文件夹下的示例代码,以下是基本使用说明。
|
|
@@ -115,12 +122,12 @@ device_info = get_device_info('yeelink.light.lamp4') # 米家台灯 1S 的 mode
|
|
|
115
122
|
|
|
116
123
|
### 设备控制封装
|
|
117
124
|
|
|
118
|
-
`
|
|
125
|
+
`mijiaDevice`:基于 `mijiaAPI` 的高级封装,提供更简便的设备控制方式。
|
|
119
126
|
|
|
120
127
|
#### 初始化:
|
|
121
128
|
|
|
122
129
|
```python
|
|
123
|
-
|
|
130
|
+
mijiaDevice(api: mijiaAPI, dev_info: dict = None, dev_name: str = None, did: str = None, sleep_time: float = 0.5)
|
|
124
131
|
```
|
|
125
132
|
|
|
126
133
|
* `api`:已初始化的 `mijiaAPI` 对象
|
|
@@ -148,7 +155,7 @@ mijiaDevices(api: mijiaAPI, dev_info: dict = None, dev_name: str = None, did: st
|
|
|
148
155
|
|
|
149
156
|
```python
|
|
150
157
|
# 示例:控制台灯
|
|
151
|
-
device =
|
|
158
|
+
device = mijiaDevice(api, dev_name='台灯')
|
|
152
159
|
device.on = True # 打开灯
|
|
153
160
|
device.brightness = 60 # 设置亮度
|
|
154
161
|
current_temp = device.color_temperature # 获取色温
|
|
@@ -29,6 +29,13 @@ pip install .
|
|
|
29
29
|
poetry install
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
+
### aur
|
|
33
|
+
如果你使用 Arch Linux 或基于 Arch 的发行版,可以通过 AUR 安装:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
yay -S python-mijia-api
|
|
37
|
+
```
|
|
38
|
+
|
|
32
39
|
## 使用
|
|
33
40
|
|
|
34
41
|
使用实例可以参考 `demos` 文件夹下的示例代码,以下是基本使用说明。
|
|
@@ -91,12 +98,12 @@ device_info = get_device_info('yeelink.light.lamp4') # 米家台灯 1S 的 mode
|
|
|
91
98
|
|
|
92
99
|
### 设备控制封装
|
|
93
100
|
|
|
94
|
-
`
|
|
101
|
+
`mijiaDevice`:基于 `mijiaAPI` 的高级封装,提供更简便的设备控制方式。
|
|
95
102
|
|
|
96
103
|
#### 初始化:
|
|
97
104
|
|
|
98
105
|
```python
|
|
99
|
-
|
|
106
|
+
mijiaDevice(api: mijiaAPI, dev_info: dict = None, dev_name: str = None, did: str = None, sleep_time: float = 0.5)
|
|
100
107
|
```
|
|
101
108
|
|
|
102
109
|
* `api`:已初始化的 `mijiaAPI` 对象
|
|
@@ -124,7 +131,7 @@ mijiaDevices(api: mijiaAPI, dev_info: dict = None, dev_name: str = None, did: st
|
|
|
124
131
|
|
|
125
132
|
```python
|
|
126
133
|
# 示例:控制台灯
|
|
127
|
-
device =
|
|
134
|
+
device = mijiaDevice(api, dev_name='台灯')
|
|
128
135
|
device.on = True # 打开灯
|
|
129
136
|
device.brightness = 60 # 设置亮度
|
|
130
137
|
current_temp = device.color_temperature # 获取色温
|
|
@@ -6,7 +6,7 @@ import sys
|
|
|
6
6
|
import time
|
|
7
7
|
|
|
8
8
|
from .apis import mijiaAPI
|
|
9
|
-
from .devices import
|
|
9
|
+
from .devices import mijiaDevice, get_device_info
|
|
10
10
|
from .login import mijiaLogin
|
|
11
11
|
|
|
12
12
|
def parse_args(args):
|
|
@@ -253,14 +253,14 @@ def run_scene(api: mijiaAPI, scene_id: str, scene_mapping: Optional[dict] = None
|
|
|
253
253
|
|
|
254
254
|
def get(args):
|
|
255
255
|
api = init_api(args.auth_path)
|
|
256
|
-
device =
|
|
256
|
+
device = mijiaDevice(api, dev_name=args.dev_name)
|
|
257
257
|
value = device.get(args.prop_name)
|
|
258
258
|
unit = device.prop_list[args.prop_name].unit
|
|
259
259
|
print(f"The {args.prop_name} of {args.dev_name} is {value} {unit if unit else ''}")
|
|
260
260
|
|
|
261
261
|
def set(args):
|
|
262
262
|
api = init_api(args.auth_path)
|
|
263
|
-
device =
|
|
263
|
+
device = mijiaDevice(api, dev_name=args.dev_name)
|
|
264
264
|
ret = device.set_v2(args.prop_name, args.value)
|
|
265
265
|
unit = device.prop_list[args.prop_name].unit
|
|
266
266
|
if ret:
|
|
@@ -307,12 +307,12 @@ def main(args):
|
|
|
307
307
|
wifispeaker = None
|
|
308
308
|
for device in device_mapping.values():
|
|
309
309
|
if 'xiaomi.wifispeaker' in device['model']:
|
|
310
|
-
wifispeaker =
|
|
310
|
+
wifispeaker = mijiaDevice(api, dev_name=device['name'])
|
|
311
311
|
break
|
|
312
312
|
if wifispeaker is None:
|
|
313
313
|
raise ValueError("No wifispeaker found")
|
|
314
314
|
else:
|
|
315
|
-
wifispeaker =
|
|
315
|
+
wifispeaker = mijiaDevice(api, dev_name=args.wifispeaker_name)
|
|
316
316
|
wifispeaker.run_action('execute-text-directive', _in=[args.run, args.quiet])
|
|
317
317
|
if hasattr(args, 'func') and args.func is not None:
|
|
318
318
|
if args.func == 'get':
|
|
@@ -74,7 +74,7 @@ class DevAction(object):
|
|
|
74
74
|
return f' {self.name}: {self.desc}'
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
class
|
|
77
|
+
class mijiaDevice(object):
|
|
78
78
|
def __init__(
|
|
79
79
|
self,
|
|
80
80
|
api: mijiaAPI,
|
|
@@ -376,9 +376,44 @@ class mijiaDevices(object):
|
|
|
376
376
|
return result['code'] == 0
|
|
377
377
|
|
|
378
378
|
|
|
379
|
+
class mijiaDevices(mijiaDevice):
|
|
380
|
+
def __init__(
|
|
381
|
+
self,
|
|
382
|
+
api: mijiaAPI,
|
|
383
|
+
dev_info: Optional[dict] = None,
|
|
384
|
+
dev_name: Optional[str] = None,
|
|
385
|
+
did: Optional[str] = None,
|
|
386
|
+
sleep_time: Optional[Union[int, float]] = 0.5
|
|
387
|
+
):
|
|
388
|
+
"""
|
|
389
|
+
初始化设备对象。
|
|
390
|
+
|
|
391
|
+
如果未提供设备信息,则根据设备名称获取设备信息。如果两者均未提供,则抛出异常。
|
|
392
|
+
如果同时提供了设备信息和设备名称,则以设备信息为准。
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
api (mijiaAPI): 米家API对象。
|
|
396
|
+
dev_info (dict, optional): 设备信息字典,从get_device_info获取。默认为None。
|
|
397
|
+
dev_name (str, optional): 设备名称,从get_devices_list获取。默认为None。
|
|
398
|
+
did (str, optional): 设备ID,如未指定,则需要在调用get/set时指定。默认为None。
|
|
399
|
+
sleep_time ([int, float], optional): 调用设备属性的间隔时间。默认为0.5秒。
|
|
400
|
+
|
|
401
|
+
Raises:
|
|
402
|
+
RuntimeError: 如果dev_info和dev_name都未提供。
|
|
403
|
+
ValueError: 如果找不到指定设备或找到多个同名设备。
|
|
404
|
+
|
|
405
|
+
Note:
|
|
406
|
+
- 如果同时提供了dev_info和dev_name,则以dev_info为准。
|
|
407
|
+
- 如果只提供了dev_name,则根据名称自动获取设备信息。
|
|
408
|
+
- 如果只提供了dev_info,则直接使用该信息。
|
|
409
|
+
"""
|
|
410
|
+
super().__init__(api, dev_info, dev_name, did, sleep_time)
|
|
411
|
+
logger.warning("`mijiaDevices` will be deprecated in future versions, use `mijiaDevice` instead.")
|
|
412
|
+
|
|
413
|
+
|
|
379
414
|
def get_device_info(device_model: str, cache_path: Optional[str] = os.path.join(os.path.expanduser("~"), ".config/mijia-api")) -> dict:
|
|
380
415
|
"""
|
|
381
|
-
获取设备信息,用于初始化
|
|
416
|
+
获取设备信息,用于初始化mijiaDevice对象。
|
|
382
417
|
|
|
383
418
|
Args:
|
|
384
419
|
device_model (str): 设备型号,从get_devices_list获取。
|
|
@@ -74,7 +74,7 @@ class mijiaLogin(object):
|
|
|
74
74
|
})
|
|
75
75
|
return data
|
|
76
76
|
|
|
77
|
-
def
|
|
77
|
+
def _get_account_info(self, user_id: str) -> dict[str, str]:
|
|
78
78
|
"""
|
|
79
79
|
获取账户信息。
|
|
80
80
|
|
|
@@ -87,14 +87,13 @@ class mijiaLogin(object):
|
|
|
87
87
|
Raises:
|
|
88
88
|
LoginError: 获取账户信息失败时抛出。
|
|
89
89
|
"""
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
90
|
+
try:
|
|
91
|
+
ret = self.session.get(accountURL + str(user_id))
|
|
92
|
+
if ret.status_code != 200:
|
|
93
|
+
raise LoginError(ret.status_code, f'Failed to get account page, {ret.text}')
|
|
94
|
+
data = json.loads(ret.text[11:])['data']
|
|
95
|
+
except (KeyError, json.JSONDecodeError) as e:
|
|
96
|
+
data = {}
|
|
98
97
|
return data
|
|
99
98
|
|
|
100
99
|
@staticmethod
|
|
@@ -190,7 +189,7 @@ class mijiaLogin(object):
|
|
|
190
189
|
'deviceId': data['deviceId'],
|
|
191
190
|
'serviceToken': cookies['serviceToken'],
|
|
192
191
|
'expireTime': self._extract_latest_gmt_datetime(cookies).strftime('%Y-%m-%d %H:%M:%S'),
|
|
193
|
-
|
|
192
|
+
'account_info': self._get_account_info(ret_data['userId'])
|
|
194
193
|
}
|
|
195
194
|
|
|
196
195
|
self._save_auth()
|
|
@@ -275,7 +274,7 @@ class mijiaLogin(object):
|
|
|
275
274
|
'deviceId': data['deviceId'],
|
|
276
275
|
'serviceToken': cookies['serviceToken'],
|
|
277
276
|
'expireTime': self._extract_latest_gmt_datetime(cookies).strftime('%Y-%m-%d %H:%M:%S'),
|
|
278
|
-
|
|
277
|
+
'account_info': self._get_account_info(ret_data['userId'])
|
|
279
278
|
}
|
|
280
279
|
|
|
281
280
|
self._save_auth()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mijiaAPI"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.5.0"
|
|
4
4
|
description = "A Python API for Xiaomi Mijia"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.9,<4.0"
|
|
@@ -15,7 +15,7 @@ mijiaAPI = "mijiaAPI.__main__:cli"
|
|
|
15
15
|
|
|
16
16
|
[tool.poetry]
|
|
17
17
|
name = "mijiaAPI"
|
|
18
|
-
version = "1.
|
|
18
|
+
version = "1.5.0"
|
|
19
19
|
description = "A Python API for Xiaomi Mijia"
|
|
20
20
|
authors = ["Do1e <dpj.email@qq.com>"]
|
|
21
21
|
license = "GPLv3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|