mijiaAPI 3.0.0__tar.gz → 3.0.1__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.
Files changed (28) hide show
  1. mijiaapi-3.0.1/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  2. mijiaapi-3.0.1/.gitignore +19 -0
  3. mijiaapi-3.0.1/CHANGELOG.md +129 -0
  4. mijiaapi-3.0.1/FAQ.md +23 -0
  5. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/PKG-INFO +50 -16
  6. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/README.md +48 -14
  7. mijiaapi-3.0.1/demos/test_apis.py +116 -0
  8. mijiaapi-3.0.1/demos/test_get_statistics.py +35 -0
  9. mijiaapi-3.0.1/demos/test_login.py +12 -0
  10. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/__main__.py +8 -2
  11. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/apis.py +40 -4
  12. mijiaapi-3.0.1/mijiaAPI/version.py +1 -0
  13. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI.egg-info/PKG-INFO +50 -16
  14. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI.egg-info/SOURCES.txt +8 -0
  15. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/pyproject.toml +5 -2
  16. mijiaapi-3.0.1/uv.lock +749 -0
  17. mijiaapi-3.0.0/mijiaAPI/version.py +0 -1
  18. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/LICENSE +0 -0
  19. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/__init__.py +0 -0
  20. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/devices.py +0 -0
  21. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/errors.py +0 -0
  22. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/logger.py +0 -0
  23. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI/miutils.py +0 -0
  24. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI.egg-info/dependency_links.txt +0 -0
  25. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI.egg-info/entry_points.txt +0 -0
  26. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI.egg-info/requires.txt +0 -0
  27. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/mijiaAPI.egg-info/top_level.txt +0 -0
  28. {mijiaapi-3.0.0 → mijiaapi-3.0.1}/setup.cfg +0 -0
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: Bug report
3
+ about: 提交一个遇到的bug
4
+ title: "[BUG]"
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ <!--
11
+ 感谢使用mijia-api!如果您遇到了任何问题或发现了错误,请按照以下格式提交您的Bug报告。这将帮助我们更快地定位并解决问题。
12
+
13
+ 如何提交一个有效的Bug报告:
14
+
15
+ 1. **确保这是一个Bug**:请先查阅[已知问题](https://github.com/Do1e/mijia-api/issues?q=is%3Aissue%20label%3Awontfix),确认您的问题不是已知的问题或是配置不当造成的。
16
+ 2. **尝试重现问题**:在不同的环境或条件下尝试重现此问题,以确定是否总是发生。
17
+ 3. **搜索现有问题**:查看现有的[Issue列表](https://github.com/Do1e/mijia-api/issues),确认这个问题还没有被报告过。
18
+ 4. **提供详细信息**:
19
+ - 您的操作系统和版本。
20
+ - Python版本。
21
+ - 项目的版本号。
22
+ - 出现问题的具体步骤。
23
+ - 实际行为与预期行为之间的差异。
24
+ - 如果可能的话,附上相关的日志输出或截图。
25
+ -->
26
+
27
+ ## 报告模板
28
+
29
+ ### 基本信息
30
+
31
+ - **操作系统**: [例如: Windows 10, macOS Big Sur, Ubuntu 20.04]
32
+ - **Python版本**: [例如: 3.8.5]
33
+ - **项目版本**: [例如: 1.0.0]
34
+ - **设备model**: [例如: "lumi.acpartner.v2"]
35
+
36
+ ### 描述问题
37
+
38
+ <!-- 简短描述遇到的问题是什么。 -->
39
+
40
+ #### 步骤到复现
41
+ <!--
42
+ 1. 第一步...
43
+ 2. 第二步...
44
+ 3. 等等...
45
+ -->
46
+
47
+ #### 实际结果
48
+ <!--
49
+ 这里写实际发生了什么。
50
+ -->
51
+
52
+
53
+ #### 预期结果
54
+ <!--
55
+ 这里写你期望看到的结果是什么样的。
56
+ -->
57
+
58
+ #### 报错堆栈
59
+ <!--
60
+ 复制并在这里粘贴Python的完整报错堆栈。
61
+ -->
62
+
63
+ #### 日志信息
64
+ <!--
65
+ 在代码开头加上:
66
+ ```python
67
+ import logging
68
+ logging.getLogger("mijiaAPI").setLevel(logging.DEBUG)
69
+ ```
70
+ 然后运行代码,复制并粘贴相关的日志输出,请注意手动隐藏任何敏感信息(如did、token等)。
71
+ -->
72
+
73
+ ### 附加信息
74
+ <!--
75
+ 如果有更多的上下文可以帮助我们理解问题所在,请在这里添加。比如错误消息、堆栈跟踪等。
76
+ -->
77
+
78
+
79
+
80
+ ---
81
+
82
+ <!--
83
+ 再次感谢您的贡献!通过您的帮助,我们可以让这个项目变得更好。
84
+ -->
@@ -0,0 +1,19 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # data
13
+ .mijia-api-data/
14
+
15
+ # vscode debug
16
+ .vscode/launch.json
17
+
18
+ # har files
19
+ *.har
@@ -0,0 +1,129 @@
1
+ # 更新日志
2
+
3
+ 本文档记录了项目的v1.3.7以来的重要变更。
4
+
5
+ ## [3.0.1](https://github.com/Do1e/mijia-api/compare/v3.0.0...v3.0.1) - 2025-12.09
6
+ ### new feature
7
+ * 新增 API `mijiaAPI.get_shared_devices_list()`,用于获取共享设备列表
8
+ ### bugfix
9
+ * 修复了 alpine 下 `locale` 无法正常获取,默认使用 `zh_CN` 解决,如果需要在 alpine 下使用其他位置,请自行设置环境变量 `LC_ALL` 和 `LANG`。
10
+ * 修复了共享家庭中无权限的问题,确保传递正确的 `owner_id`。
11
+
12
+ ## [3.0.0](https://github.com/Do1e/mijia-api/compare/v2.0.2...v3.0.0) - 2025-11.28
13
+ ### new feature
14
+ * 使用最新的米家API接口,从 https://api.io.mi.com/app 切换到 https://api.mijia.tech/app
15
+ * `mijiaAPI` 类的初始化参数变更,请传递用于保存认证数据的路径 `auth_data_path` 而不是认证数据
16
+ * 彻底移除账号密码登录方式,仅支持二维码登录
17
+ * 部分 API 需要指定 `home_id`,不指定将遍历所有家庭
18
+ * 实现自动 `serviceToken` 刷新,现在理论上扫码一次能保活一个月
19
+ * 移除登录类 `mijiaLogin`,相关功能集成进入 `mijiaAPI` 类,请使用 `mijiaAPI.login()` / `mijiaAPI.QRlogin()`,两者均为二维码登录
20
+ * `mijiaDevice` 类的初始化参数变更,不再需要传递 `dev_info`,请选择传递 `did` 或 `dev_name` 进行初始化
21
+ * `mijiaDevice` 类的 `set`, `get`, `run_action` 彻底移除 `did` 参数,初始化时已完成
22
+ * 一些其他更改,请参考代码注释
23
+
24
+ ## [2.0.2](https://github.com/Do1e/mijia-api/compare/v2.0.1...v2.0.2) - 2025-09-23
25
+ ### bugfix
26
+ * 修复了`set`方法在类型检查前进行value_list检查,导致某些设备无法设置值的问题
27
+
28
+ ## [2.0.1](https://github.com/Do1e/mijia-api/compare/v2.0.0...v2.0.1) - 2025-06-29
29
+ ### bugfix
30
+ * 处理一个家庭中超过200个设备的情况,修复了`get_devices_list`方法可能无法获取所有设备的问题
31
+ ### improvement
32
+ * 所有打印内容均使用中文
33
+
34
+ ## [2.0.0](https://github.com/Do1e/mijia-api/compare/v1.5.0...v2.0.0) - 2025-06-27
35
+ #### 此版本有多项破坏性变更,请在升级后参考下述说明修复
36
+ ### new feature
37
+ * 新增API:`get_statistics`,用于获取设备的统计信息,使用方法参见[demos/test_get_statistics.py](demos/test_get_statistics.py)
38
+ * 新增文件[demos/decrypt.py](demos/decrypt.py)和[demos/decrypt_har.py](demos/decrypt_har.py),用于解密米家APP抓包
39
+ * `get_homes_list`支持获取共享家庭
40
+ * `get_consumable_items`支持获取共享家庭的耗材列表,需要额外指定`owner_id`参数
41
+ * `get_devices_list`支持获取共享家庭的设备列表
42
+ ### improvement
43
+ * 认证文件保存`cUserId`,可作为`userId`的替代,暂时未使用
44
+ * **此版本彻底移除了`mijiaDevices`,请及时替换为`mijiaDevice`**
45
+ * **`mijiaDevice`的`set`方法更换了参数顺序,请及时修复**
46
+ * **部分API调用后需要读取返回值的字典,如`api.get_devices_list()['list']`,现在直接返回列表,请注意修改,如`api.get_devices_list()`,具体列表如下:**
47
+ * `api.get_devices_list()['list']` -> `api.get_devices_list()`
48
+ * `api.get_homes_list()['homelist']` -> `api.get_homes_list()`
49
+ * `api.get_scenes_list(home_id)['scene_info_list']` -> `api.get_scenes_list(home_id)`
50
+ * `api.get_consumable_items(home_id)['items']` -> `api.get_consumable_items(home_id)`
51
+
52
+ ## [1.5.0](https://github.com/Do1e/mijia-api/compare/v1.4.5...v1.5.0) - 2025-06-19
53
+ ### new feature
54
+ * 重命名`mijiaDevices`为`mijiaDevice`
55
+
56
+ ## [1.4.5](https://github.com/Do1e/mijia-api/compare/v1.4.4...v1.4.5) - 2025-06-16
57
+ ### bugfix
58
+ * 登陆过程中无法获取用户信息时,处理相关报错
59
+
60
+ ## [1.4.4](https://github.com/Do1e/mijia-api/compare/v1.4.3...v1.4.4) - 2025-06-14
61
+ ### new feature
62
+ * `get_device_info`支持[https://home.miot-spec.com/](https://home.miot-spec.com/)中的中文描述
63
+ ### bugfix
64
+ * cli修复了执行`get_device_info`必须先登录的问题
65
+ ### improvement
66
+ * 优化日志输出
67
+ * 使用`login`方法的警告修改得更加明确
68
+
69
+ ## [1.4.3](https://github.com/Do1e/mijia-api/compare/v1.4.2...v1.4.3) - 2025-05-22
70
+ ### bugfix
71
+ * 针对部分特殊的设备,修复了`get_device_info`的TypeError
72
+
73
+ ## [1.4.2](https://github.com/Do1e/mijia-api/compare/v1.4.1...v1.4.2) - 2025-05-19
74
+ ### new feature
75
+ * `get_device_info`支持缓存结果以加速
76
+
77
+ ## [1.4.1](https://github.com/Do1e/mijia-api/compare/v1.4.0...v1.4.1) - 2025-05-19
78
+ ### new feature
79
+ * cli支持`--run`以使用自然语言描述需求,交给小爱音箱执行
80
+
81
+ ## [1.4.0](https://github.com/Do1e/mijia-api/compare/v1.3.14...v1.4.0) - 2025-05-19
82
+ ### new feature
83
+ * 新增`mijiaAPI`的cli支持,运行`mijiaAPI --help`查看帮助
84
+
85
+ ## [1.3.14](https://github.com/Do1e/mijia-api/compare/v1.3.13...v1.3.14) - 2025-05-18
86
+ ### bugfix
87
+ * `available`属性判断错误,始终返回False
88
+
89
+ ## [1.3.13](https://github.com/Do1e/mijia-api/compare/v1.3.12...v1.3.13) - 2025-05-18
90
+ ### new feature
91
+ * 新增从cookie中提取有效期并保存在凭据中
92
+ ### improvement
93
+ * `available`属性根据有效期判断
94
+
95
+ ## [1.3.12](https://github.com/Do1e/mijia-api/compare/v1.3.11...v1.3.12) - 2025-05-16
96
+ ### improvement
97
+ * 简化`mijiaLogin`的初始化参数,根据`save_path`的值自动判断是否需要保存凭据
98
+ * 重构了对象初始化和方法的注释
99
+
100
+ ## [1.3.11](https://github.com/Do1e/mijia-api/compare/v1.3.10...v1.3.11) - 2025-05-16
101
+ ### bugfix
102
+ * 验证保存路径并确保在保存验证数据之前确保目录存在
103
+
104
+ ## [1.3.10](https://github.com/Do1e/mijia-api/compare/v1.3.9...v1.3.10) - 2025-05-16
105
+ ### improvement
106
+ * 使用logging模块替代print函数
107
+
108
+ ## [1.3.9](https://github.com/Do1e/mijia-api/compare/v1.3.8...v1.3.9) - 2025-05-16
109
+ ### new feature
110
+ * 新增用户个人信息查询
111
+ * 新增用户凭据的可选保存
112
+ ### improvement
113
+ * 支持非tty的二维码打印
114
+ * 优化二维码图片的删除逻辑
115
+
116
+ ## [1.3.8](https://github.com/Do1e/mijia-api/compare/v1.3.7...v1.3.8) - 2025-05-14
117
+ ### improvement
118
+ * 新增了devices里所有方法的注释
119
+ * 新增了`mijiaDevice`实例化时的断言检查
120
+ * 新增了操作失败时的错误提示抛出与错误代码的详情
121
+ * 优化了`mijiaDevice`实例化时的内部变量的赋值逻辑
122
+ * 优化了多处代码的可读性与简洁性
123
+ ### bugfix
124
+ * 修复多处由于数据类型更新而引发的警告
125
+
126
+ ## [1.3.7](https://github.com/Do1e/mijia-api/compare/v1.3.6...v1.3.7) - 2025-05-14
127
+ ### new feature
128
+ * 新增自定义`run_action`参数,`in`等python关键字,可在前面加上下划线`_`
129
+ * `mijiaDevice`支持传入设备名称(米家中自定义的名称)进行初始化
mijiaapi-3.0.1/FAQ.md ADDED
@@ -0,0 +1,23 @@
1
+ # 常见问题
2
+
3
+ ## 账号密码登录失败
4
+
5
+ 现在登录似乎100%遇到验证码,建议使用扫码登录。
6
+
7
+ ## 扫码登录后的有效期多长?
8
+
9
+ `serviceToken` 有效期较短,但是已实现自动刷新。用于刷新的 `passToken` 有效期也许是一个月,即扫码登录后理论上可以保活一个月。
10
+
11
+ ## XXX设备的XXX如何获取/设置?
12
+
13
+ 我拥有的设备有限,无法保证能解答这类问题,但也欢迎提交 [issue](https://github.com/Do1e/mijia-api/issues),可能需要你将设备共享给我进行抓包或者自行抓包给我提供请求和响应,提供har文件的话注意自行删除cookie等敏感信息。
14
+
15
+ ## 如何抓包?
16
+
17
+ 小米官方给了一个[抓包教程](https://iot.mi.com/new/doc/accesses/direct-access/extension-development/troubleshooting/packet_capture),我没试过,不确定是否能行,如果抓包成功数据是加密的,可以使用 [decrypt/decrypt.py](decrypt/decrypt.py) 解密。
18
+
19
+ 我自己的解决方案是使用一个获取了root的手机,安装 [reqable](https://reqable.com/zh-CN/) 进行抓包,导出 HAR 文件后使用 [decrypt/decrypt_har.py](decrypt/decrypt_har.py) 解密后导入电脑版的 reqable 查看。
20
+
21
+ ## 是否可以支持设备回调?
22
+
23
+ 理论上可以实现,但由于[ha_xiaomi_home 开源许可证](https://github.com/XiaoMi/ha_xiaomi_home/blob/main/LICENSE.md)的要求,将不会支持相关功能。
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mijiaAPI
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: A Python API for Xiaomi Mijia
5
- Author-email: Do1e <dpj.email@qq.com>
5
+ Author-email: Do1e <i@do1e.cn>
6
6
  License: GPL-3.0-or-later
7
7
  Project-URL: Homepage, https://github.com/Do1e/mijia-api
8
8
  Project-URL: Repository, https://github.com/Do1e/mijia-api
@@ -97,7 +97,7 @@ api.login()
97
97
  homes = api.get_homes_list()
98
98
  print(homes)
99
99
 
100
- # 获取所有设备
100
+ # 获取所有设备(不包含共享设备)
101
101
  devices = api.get_devices_list()
102
102
  for device in devices:
103
103
  print(f"设备名称: {device['name']}, Model: {device['model']}, Did: {device['did']}")
@@ -105,6 +105,9 @@ for device in devices:
105
105
  # 获取指定家庭的设备
106
106
  home_id = homes[0]['id']
107
107
  devices_in_home = api.get_devices_list(home_id=home_id)
108
+
109
+ # 获取共享设备列表(无法指定家庭ID)
110
+ shared_devices = api.get_shared_devices_list()
108
111
  ```
109
112
 
110
113
  #### 2. 获取和设置设备属性
@@ -349,24 +352,55 @@ usage: mijiaAPI [-h] [-p AUTH_PATH] [--list_homes] [-l] [--list_scenes]
349
352
  {get,set} ...
350
353
 
351
354
  positional arguments:
352
- {get,set} 获取或设置设备属性
355
+ {get,set}
356
+ get 获取设备属性
357
+ set 设置设备属性
353
358
 
354
- optional arguments:
355
- -h, --help 显示此帮助信息
359
+ options:
360
+ -h, --help show this help message and exit
361
+ -v, --version 显示版本信息并退出
356
362
  -p, --auth_path AUTH_PATH
357
- 认证文件保存路径(默认:~/.config/mijia-api/auth.json
358
- --list_homes 列出所有家庭
359
- -l, --list_devices 列出所有米家设备
360
- --list_scenes 列出所有场景
361
- --list_consumable_items 列出所有耗材
363
+ 认证文件保存路径,默认保存在 ~/.config/mijia-api/auth.json
364
+ --list_homes 列出家庭列表
365
+ -l, --list_devices 列出所有米家设备,包含共享设备
366
+ --list_scenes 列出场景列表
367
+ --list_consumable_items
368
+ 列出耗材列表
362
369
  --run_scene SCENE_ID/SCENE_NAME [SCENE_ID/SCENE_NAME ...]
363
- 执行场景,可指定场景ID或名称
370
+ 运行场景,指定场景ID或名称
364
371
  --get_device_info DEVICE_MODEL
365
- 获取设备规格信息(指定设备model
366
- --run PROMPT 使用自然语言描述需求(需要小爱音箱)
372
+ 获取设备信息,指定设备model,先使用 --list_devices 获取
373
+ --run PROMPT 使用自然语言描述你的需求,如果你有小爱音箱的话
367
374
  --wifispeaker_name WIFISPEAKER_NAME
368
- 指定小爱音箱名称(默认为第一个小爱音箱)
369
- --quiet 小爱音箱静默执行
375
+ 指定小爱音箱名称,默认是获取到的第一个小爱音箱
376
+ --quiet 小爱音箱静默执行
377
+ ```
378
+
379
+ ```
380
+ usage: mijiaAPI get [-h] [-p AUTH_PATH] [--did DID] [--dev_name DEV_NAME] --prop_name PROP_NAME
381
+
382
+ options:
383
+ -h, --help show this help message and exit
384
+ -p, --auth_path AUTH_PATH
385
+ 认证文件保存路径,默认保存在 ~/.config/mijia-api/auth.json
386
+ --did DID 设备did,优先于 --dev_name 使用
387
+ --dev_name DEV_NAME 设备名称,指定为米家APP中设定的名称
388
+ --prop_name PROP_NAME
389
+ 属性名称,先使用 --get_device_info 获取
390
+ ```
391
+
392
+ ```
393
+ usage: mijiaAPI set [-h] [-p AUTH_PATH] [--did DID] [--dev_name DEV_NAME] --prop_name PROP_NAME --value VALUE
394
+
395
+ options:
396
+ -h, --help show this help message and exit
397
+ -p, --auth_path AUTH_PATH
398
+ 认证文件保存路径,默认保存在 ~/.config/mijia-api/auth.json
399
+ --did DID 设备did,优先于 --dev_name 使用
400
+ --dev_name DEV_NAME 设备名称,指定为米家APP中设定的名称
401
+ --prop_name PROP_NAME
402
+ 属性名称,先使用 --get_device_info 获取
403
+ --value VALUE 需要设定的属性值
370
404
  ```
371
405
 
372
406
  #### 获取设备属性
@@ -76,7 +76,7 @@ api.login()
76
76
  homes = api.get_homes_list()
77
77
  print(homes)
78
78
 
79
- # 获取所有设备
79
+ # 获取所有设备(不包含共享设备)
80
80
  devices = api.get_devices_list()
81
81
  for device in devices:
82
82
  print(f"设备名称: {device['name']}, Model: {device['model']}, Did: {device['did']}")
@@ -84,6 +84,9 @@ for device in devices:
84
84
  # 获取指定家庭的设备
85
85
  home_id = homes[0]['id']
86
86
  devices_in_home = api.get_devices_list(home_id=home_id)
87
+
88
+ # 获取共享设备列表(无法指定家庭ID)
89
+ shared_devices = api.get_shared_devices_list()
87
90
  ```
88
91
 
89
92
  #### 2. 获取和设置设备属性
@@ -328,24 +331,55 @@ usage: mijiaAPI [-h] [-p AUTH_PATH] [--list_homes] [-l] [--list_scenes]
328
331
  {get,set} ...
329
332
 
330
333
  positional arguments:
331
- {get,set} 获取或设置设备属性
334
+ {get,set}
335
+ get 获取设备属性
336
+ set 设置设备属性
332
337
 
333
- optional arguments:
334
- -h, --help 显示此帮助信息
338
+ options:
339
+ -h, --help show this help message and exit
340
+ -v, --version 显示版本信息并退出
335
341
  -p, --auth_path AUTH_PATH
336
- 认证文件保存路径(默认:~/.config/mijia-api/auth.json
337
- --list_homes 列出所有家庭
338
- -l, --list_devices 列出所有米家设备
339
- --list_scenes 列出所有场景
340
- --list_consumable_items 列出所有耗材
342
+ 认证文件保存路径,默认保存在 ~/.config/mijia-api/auth.json
343
+ --list_homes 列出家庭列表
344
+ -l, --list_devices 列出所有米家设备,包含共享设备
345
+ --list_scenes 列出场景列表
346
+ --list_consumable_items
347
+ 列出耗材列表
341
348
  --run_scene SCENE_ID/SCENE_NAME [SCENE_ID/SCENE_NAME ...]
342
- 执行场景,可指定场景ID或名称
349
+ 运行场景,指定场景ID或名称
343
350
  --get_device_info DEVICE_MODEL
344
- 获取设备规格信息(指定设备model
345
- --run PROMPT 使用自然语言描述需求(需要小爱音箱)
351
+ 获取设备信息,指定设备model,先使用 --list_devices 获取
352
+ --run PROMPT 使用自然语言描述你的需求,如果你有小爱音箱的话
346
353
  --wifispeaker_name WIFISPEAKER_NAME
347
- 指定小爱音箱名称(默认为第一个小爱音箱)
348
- --quiet 小爱音箱静默执行
354
+ 指定小爱音箱名称,默认是获取到的第一个小爱音箱
355
+ --quiet 小爱音箱静默执行
356
+ ```
357
+
358
+ ```
359
+ usage: mijiaAPI get [-h] [-p AUTH_PATH] [--did DID] [--dev_name DEV_NAME] --prop_name PROP_NAME
360
+
361
+ options:
362
+ -h, --help show this help message and exit
363
+ -p, --auth_path AUTH_PATH
364
+ 认证文件保存路径,默认保存在 ~/.config/mijia-api/auth.json
365
+ --did DID 设备did,优先于 --dev_name 使用
366
+ --dev_name DEV_NAME 设备名称,指定为米家APP中设定的名称
367
+ --prop_name PROP_NAME
368
+ 属性名称,先使用 --get_device_info 获取
369
+ ```
370
+
371
+ ```
372
+ usage: mijiaAPI set [-h] [-p AUTH_PATH] [--did DID] [--dev_name DEV_NAME] --prop_name PROP_NAME --value VALUE
373
+
374
+ options:
375
+ -h, --help show this help message and exit
376
+ -p, --auth_path AUTH_PATH
377
+ 认证文件保存路径,默认保存在 ~/.config/mijia-api/auth.json
378
+ --did DID 设备did,优先于 --dev_name 使用
379
+ --dev_name DEV_NAME 设备名称,指定为米家APP中设定的名称
380
+ --prop_name PROP_NAME
381
+ 属性名称,先使用 --get_device_info 获取
382
+ --value VALUE 需要设定的属性值
349
383
  ```
350
384
 
351
385
  #### 获取设备属性
@@ -0,0 +1,116 @@
1
+ import json
2
+ import logging
3
+ import time
4
+
5
+ from mijiaAPI import mijiaAPI
6
+
7
+
8
+ logging.getLogger("mijiaAPI").setLevel(logging.DEBUG)
9
+
10
+ api = mijiaAPI(".mijia-api-data/auth.json")
11
+
12
+ # ----------------------- get homes list -----------------------
13
+ homes = api.get_homes_list()
14
+ with open(".mijia-api-data/homes.json", "w", encoding="utf-8") as f:
15
+ json.dump(homes, f, ensure_ascii=False, indent=2)
16
+ time.sleep(1)
17
+ home_id = homes[0]['id']
18
+ home_name = homes[0]['name']
19
+
20
+ # ---------------------- get devices list ----------------------
21
+ devices = api.get_devices_list()
22
+ with open(".mijia-api-data/devices.json", "w", encoding="utf-8") as f:
23
+ json.dump(devices, f, ensure_ascii=False, indent=2)
24
+ time.sleep(1)
25
+
26
+ # -------------------- get shared homes list -------------------
27
+ shared_devices = api.get_shared_devices_list()
28
+ with open(".mijia-api-data/shared_devices.json", "w", encoding="utf-8") as f:
29
+ json.dump(shared_devices, f, ensure_ascii=False, indent=2)
30
+ time.sleep(1)
31
+
32
+ # ------------------ get devices with home_id ------------------
33
+ devices_with_home = api.get_devices_list(home_id=home_id)
34
+ with open(f".mijia-api-data/devices_in_{home_name}.json", "w", encoding="utf-8") as f:
35
+ json.dump(devices_with_home, f, ensure_ascii=False, indent=2)
36
+ time.sleep(1)
37
+
38
+ # ---------------------- get scenes list -----------------------
39
+ scenes = api.get_scenes_list()
40
+ with open(".mijia-api-data/scenes.json", "w", encoding="utf-8") as f:
41
+ json.dump(scenes, f, ensure_ascii=False, indent=2)
42
+ time.sleep(1)
43
+
44
+ # ------------------ get scenes with home_id -------------------
45
+ scenes_with_home = api.get_scenes_list(home_id=home_id)
46
+ with open(f".mijia-api-data/scenes_in_{home_name}.json", "w", encoding="utf-8") as f:
47
+ json.dump(scenes_with_home, f, ensure_ascii=False, indent=2)
48
+ time.sleep(1)
49
+
50
+ # ------------------------- run scene --------------------------
51
+ scence_id = scenes[0]['scene_id']
52
+ scence_name = scenes[0]['name']
53
+ scence_home_id = scenes[0]['home_id']
54
+ ret = api.run_scene(scence_id, scence_home_id)
55
+ print(f"已执行场景 {scence_name},响应: {ret}")
56
+ time.sleep(1)
57
+
58
+ # -------------------- get consumable items --------------------
59
+ consumable_items = api.get_consumable_items()
60
+ with open(".mijia-api-data/consumable_items.json", "w", encoding="utf-8") as f:
61
+ json.dump(consumable_items, f, ensure_ascii=False, indent=2)
62
+ time.sleep(1)
63
+
64
+ # ------------- get consumable items with home_id --------------
65
+ consumable_items_with_home = api.get_consumable_items(home_id=home_id)
66
+ with open(f".mijia-api-data/consumable_items_in_{home_name}.json", "w", encoding="utf-8") as f:
67
+ json.dump(consumable_items_with_home, f, ensure_ascii=False, indent=2)
68
+ time.sleep(1)
69
+
70
+ # ----------------- get/set device properties ------------------
71
+ # did 和 model 从 get_devices_list() 接口获取
72
+ # siid 和 piid 请查阅 https://home.miot-spec.com/spec/{model}
73
+ # 或者也可以直接在 米家APP->智能->+->手动控制 中
74
+ # 添加 scene,调用 run_scene() 接口控制设备
75
+ for device in devices:
76
+ if device["model"] == "yeelink.light.lamp4":
77
+ break
78
+
79
+ did = device["did"]
80
+ name = device["name"]
81
+
82
+ ret = api.get_devices_prop([
83
+ {"did": did, "siid": 2, "piid": 2},
84
+ {"did": did, "siid": 2, "piid": 3},
85
+ ])
86
+ brightness = ret[0]["value"]
87
+ color_temperature = ret[1]["value"]
88
+ print(f"获取设备 {name} 属性成功: {ret}")
89
+ print(f"亮度: {brightness}%")
90
+ print(f"色温: {color_temperature}K")
91
+
92
+ ret = api.set_devices_prop([
93
+ {"did": did, "siid": 2, "piid": 2, "value": 50},
94
+ {"did": did, "siid": 2, "piid": 3, "value": 2700},
95
+ ])
96
+ print(f"设置设备 {name} 属性成功: {ret}")
97
+ time.sleep(1)
98
+
99
+ # ------------------------- run action -------------------------
100
+ ret = api.run_action({"did": did, "siid": 2, "aiid": 1})
101
+ print(f"执行设备 {name} 动作成功: {ret}")
102
+ time.sleep(1)
103
+
104
+ # ----------------------- get statistics -----------------------
105
+ for device in devices:
106
+ if device["model"] == "lumi.acpartner.mcn04":
107
+ break
108
+ ret = api.get_statistics({
109
+ "did": device["did"],
110
+ "key": "7.1",
111
+ "data_type": "stat_month_v3",
112
+ "limit": 6,
113
+ "time_start": int(time.time() - 24 * 60 * 60 * 30 * 6),
114
+ "time_end": int(time.time()),
115
+ })
116
+ print(f"获取设备 {device['name']} 统计数据成功: {ret}")
@@ -0,0 +1,35 @@
1
+ import time
2
+
3
+ from mijiaAPI import mijiaAPI
4
+
5
+
6
+ api = mijiaAPI(".mijia-api-data/auth.json")
7
+ devices = api.get_devices_list()
8
+ for device in devices:
9
+ if device['model'] == 'lumi.acpartner.mcn04':
10
+ did = device['did']
11
+ break
12
+
13
+ # 参考 https://iot.mi.com/new/doc/accesses/direct-access/extension-development/extension-functions/statistical-interface
14
+ ret = api.get_statistics({
15
+ "did": did,
16
+ "key": "7.1", # siid.piid,这里的7.1表示 lumi.acpartner.mcn04 的 power-consumption
17
+ "data_type": "stat_month_v3", # 按月统计,可选:时(stat_hour_v3)、天(stat_day_v3)、星期(stat_week_v3)、月(stat_month_v3)
18
+ "limit": 6, # 返回的最大条目数
19
+ "time_start": int(time.time() - 24 * 3600 * 30 * 6),
20
+ "time_end": int(time.time()),
21
+ })
22
+
23
+ """
24
+ 已知问题:
25
+ 支持的设备有限,而且我的空调貌似也只支持 stat_month_v3。
26
+ 比较旧的设备使用的API会不一样,需要将`data_type`中的`_v3`去掉。
27
+ 并且`key`也不一样,比如 lumi.acpartner.mcn02 的统计耗电量的`key`为`powerCost`。
28
+ 详见 https://github.com/Do1e/mijia-api/issues/46
29
+ """
30
+
31
+ for item in ret:
32
+ value = eval(item['value'])[0]
33
+ ts = item['time']
34
+ date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(ts))
35
+ print(f'{date}: {value}')
@@ -0,0 +1,12 @@
1
+ import logging
2
+
3
+ from mijiaAPI import mijiaAPI
4
+
5
+
6
+ logging.getLogger("mijiaAPI").setLevel(logging.DEBUG)
7
+
8
+ api = mijiaAPI(".mijia-api-data/auth.json")
9
+ print(api.available)
10
+ api.login() # 实际就是调用 QRlogin 方法
11
+ print(api.available)
12
+ print(api.get_homes_list())
@@ -16,6 +16,12 @@ logging.getLogger("mijiaAPI").setLevel(logging.INFO)
16
16
  def parse_args(args):
17
17
  parser = argparse.ArgumentParser(description=f"Mijia API CLI (v{version})")
18
18
  subparsers = parser.add_subparsers(dest='command')
19
+ parser.add_argument(
20
+ '-v', '--version',
21
+ action='version',
22
+ version=f"%(prog)s {version}",
23
+ help="显示版本信息并退出",
24
+ )
19
25
  parser.add_argument(
20
26
  '-p', '--auth_path',
21
27
  type=Path,
@@ -30,7 +36,7 @@ def parse_args(args):
30
36
  parser.add_argument(
31
37
  '-l', '--list_devices',
32
38
  action='store_true',
33
- help="列出所有米家设备",
39
+ help="列出所有米家设备,包含共享设备",
34
40
  )
35
41
  parser.add_argument(
36
42
  '--list_scenes',
@@ -190,7 +196,7 @@ def get_homes_list(api: mijiaAPI, verbose: bool = True, device_mapping: Optional
190
196
  return home_mapping
191
197
 
192
198
  def get_devices_list(api: mijiaAPI, verbose: bool = True) -> dict:
193
- devices = api.get_devices_list()
199
+ devices = api.get_devices_list() + api.get_shared_devices_list()
194
200
  if verbose:
195
201
  print("设备列表:")
196
202
  for device in devices: