flashforge-python-api 1.0.2__py3-none-any.whl → 1.1.0__py3-none-any.whl

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 (41) hide show
  1. flashforge/__init__.py +62 -29
  2. flashforge/api/__init__.py +1 -0
  3. flashforge/api/constants/__init__.py +1 -0
  4. flashforge/api/constants/commands.py +1 -0
  5. flashforge/api/constants/endpoints.py +1 -0
  6. flashforge/api/controls/__init__.py +1 -0
  7. flashforge/api/controls/control.py +64 -61
  8. flashforge/api/controls/files.py +28 -26
  9. flashforge/api/controls/info.py +84 -85
  10. flashforge/api/controls/job_control.py +120 -82
  11. flashforge/api/controls/temp_control.py +14 -11
  12. flashforge/api/misc/__init__.py +1 -1
  13. flashforge/api/network/__init__.py +2 -1
  14. flashforge/api/network/utils.py +7 -8
  15. flashforge/client.py +131 -63
  16. flashforge/discovery/__init__.py +30 -3
  17. flashforge/discovery/discovery.py +637 -308
  18. flashforge/models/__init__.py +11 -10
  19. flashforge/models/machine_info.py +220 -100
  20. flashforge/models/responses.py +103 -43
  21. flashforge/tcp/__init__.py +25 -17
  22. flashforge/tcp/a3_client.py +405 -0
  23. flashforge/tcp/ff_client.py +93 -90
  24. flashforge/tcp/gcode/__init__.py +4 -2
  25. flashforge/tcp/gcode/a3_gcode_controller.py +109 -0
  26. flashforge/tcp/gcode/gcode_controller.py +48 -36
  27. flashforge/tcp/gcode/gcodes.py +7 -1
  28. flashforge/tcp/parsers/__init__.py +11 -11
  29. flashforge/tcp/parsers/endstop_status.py +103 -132
  30. flashforge/tcp/parsers/location_info.py +26 -13
  31. flashforge/tcp/parsers/print_status.py +49 -56
  32. flashforge/tcp/parsers/printer_info.py +38 -48
  33. flashforge/tcp/parsers/temp_info.py +46 -47
  34. flashforge/tcp/parsers/thumbnail_info.py +65 -40
  35. flashforge/tcp/tcp_client.py +296 -293
  36. {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/METADATA +35 -14
  37. flashforge_python_api-1.1.0.dist-info/RECORD +45 -0
  38. {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/WHEEL +1 -1
  39. flashforge_python_api-1.0.2.dist-info/RECORD +0 -43
  40. {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/entry_points.txt +0 -0
  41. {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flashforge-python-api
3
- Version: 1.0.2
3
+ Version: 1.1.0
4
4
  Summary: A comprehensive Python library for controlling FlashForge 3D printers
5
5
  Project-URL: Homepage, https://github.com/GhostTypes/ff-5mp-api-py
6
6
  Project-URL: Documentation, https://github.com/GhostTypes/ff-5mp-api-py#readme
@@ -13,15 +13,13 @@ Keywords: 3d-printer,api,async,control,flashforge,python
13
13
  Classifier: Development Status :: 5 - Production/Stable
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.8
17
- Classifier: Programming Language :: Python :: 3.9
18
- Classifier: Programming Language :: Python :: 3.10
19
16
  Classifier: Programming Language :: Python :: 3.11
20
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
21
19
  Classifier: Topic :: Scientific/Engineering
22
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
21
  Classifier: Topic :: System :: Hardware :: Hardware Drivers
24
- Requires-Python: >=3.8
22
+ Requires-Python: >=3.11
25
23
  Requires-Dist: aiohttp>=3.8.0
26
24
  Requires-Dist: netifaces>=0.11.0
27
25
  Requires-Dist: pydantic>=2.0.0
@@ -53,7 +51,7 @@ Description-Content-Type: text/markdown
53
51
 
54
52
  **A comprehensive Python library for controlling FlashForge 3D printers**
55
53
 
56
- ![PyPI](https://img.shields.io/pypi/v/flashforge-python-api?style=flat&color=3776ab) ![Python](https://img.shields.io/badge/Python-3.8%2B-3776ab?style=flat) ![License](https://img.shields.io/badge/License-MIT-brightgreen?style=flat) ![Status](https://img.shields.io/badge/Status-Stable-brightgreen?style=flat)
54
+ ![PyPI](https://img.shields.io/pypi/v/flashforge-python-api?style=flat&color=3776ab) ![Python](https://img.shields.io/badge/Python-3.11%2B-3776ab?style=flat) ![License](https://img.shields.io/badge/License-MIT-brightgreen?style=flat) ![Status](https://img.shields.io/badge/Status-Stable-brightgreen?style=flat)
57
55
 
58
56
  ![aiohttp](https://img.shields.io/badge/aiohttp-%E2%89%A53.8.0-blue?style=flat) ![pydantic](https://img.shields.io/badge/pydantic-%E2%89%A52.0.0-e92063?style=flat) ![netifaces](https://img.shields.io/badge/netifaces-%E2%89%A50.11.0-orange?style=flat) ![requests](https://img.shields.io/badge/requests-%E2%89%A52.31.0-blue?style=flat) ![pillow](https://img.shields.io/badge/pillow-%E2%89%A510.0.0-yellow?style=flat)
59
57
 
@@ -77,7 +75,7 @@ Description-Content-Type: text/markdown
77
75
  | **File Operations** | List, upload, and download files • Extract print thumbnails • File metadata retrieval |
78
76
  | **Async Architecture** | Native async/await implementation • Non-blocking network operations • Concurrent operations support |
79
77
  | **Type Safety** | Full type hints for IDE autocomplete • Pydantic models for data validation • mypy strict mode compatible |
80
- | **Model Detection** | Automatic capability detection • Feature flags for model-specific functions • Graceful degradation for older models |
78
+ | **Model Detection** | Automatic capability detection • Runtime camera stream detection via `camera_stream_url` • Graceful degradation for older models |
81
79
 
82
80
  </div>
83
81
 
@@ -85,15 +83,13 @@ Description-Content-Type: text/markdown
85
83
 
86
84
  <div align="center">
87
85
 
88
- ## Supported Printers
86
+ ## Printer Testing & Coverage
89
87
 
90
- | Model | Support Level | Protocols | Features |
88
+ | Printer Model | Support Status | Testing Status | API Type |
91
89
  | --- | --- | --- | --- |
92
- | **FlashForge Adventurer 5M** | Full Support | HTTP + TCP | All features including LED, camera, filtration |
93
- | **FlashForge Adventurer 5M Pro** | Full Support | HTTP + TCP | All features including advanced filtration control |
94
- | **FlashForge Adventurer 5X** | Full Support | HTTP + TCP | All features with multi-material support |
95
- | **FlashForge Adventurer 3 / 4** | Partial Support | TCP Only | Basic control, temperature, movement, status |
96
- | **Other (Network-enabled)** | Experimental | TCP Only | Generic G-code commands, may vary by model |
90
+ | **AD5X** | Full | Tested | HTTP (New) + TCP |
91
+ | **Adventurer 5M/Pro** | Full | Tested | HTTP (New) + TCP |
92
+ | **Adventurer 3/4** | Partial | Partial | TCP (Legacy) |
97
93
 
98
94
  </div>
99
95
 
@@ -207,6 +203,31 @@ async def monitor_printer():
207
203
  asyncio.run(monitor_printer())
208
204
  ```
209
205
 
206
+ ### Camera Stream Detection
207
+
208
+ Use the printer-reported runtime camera stream URL as the OEM camera source of truth:
209
+
210
+ ```python
211
+ from flashforge import FlashForgeClient
212
+ import asyncio
213
+
214
+ async def check_camera():
215
+ async with FlashForgeClient("192.168.1.100", "SERIAL", "CODE") as client:
216
+ if not await client.initialize():
217
+ return
218
+
219
+ if client.camera_stream_url:
220
+ print(f"OEM camera stream: {client.camera_stream_url}")
221
+ else:
222
+ print("Printer is not reporting an active OEM camera stream")
223
+
224
+ # Camera power control remains Pro-only.
225
+ if client.is_pro:
226
+ await client.control.turn_camera_on()
227
+
228
+ asyncio.run(check_camera())
229
+ ```
230
+
210
231
  ### File Operations and Thumbnails
211
232
 
212
233
  List files and extract G-code thumbnails:
@@ -0,0 +1,45 @@
1
+ flashforge/__init__.py,sha256=k67UUBpSPMCRlexqn43RRHIh8XyNb9Bq5yXOpwChsFo,5170
2
+ flashforge/client.py,sha256=XP_l5FsaUXKWjkRMWxbz7F1d7_8Xdh7oD5zpThtBFhM,15462
3
+ flashforge/api/__init__.py,sha256=vQz-DkG6LTH39bI4fyiUc0D9jQzemLh45pORLptSOlg,335
4
+ flashforge/api/constants/__init__.py,sha256=Q0HL2tqSBYPd4Oz49VHLS3qUvRuv__GCvTGecaLrQ-Y,163
5
+ flashforge/api/constants/commands.py,sha256=S9cBgU3pBXQm-dp3Bv4795NL059pmTY1NtxWzPA5gWU,329
6
+ flashforge/api/constants/endpoints.py,sha256=3CSCvilBJ1uAM_dZiY5NgbYl4rub1RsZZRpCBRZCqH4,271
7
+ flashforge/api/controls/__init__.py,sha256=53s-H25Pjwr0kvPk8MZ2Twy8VHGqGcO6Q6uBphhEOh4,293
8
+ flashforge/api/controls/control.py,sha256=hifFWRPs2fRvNaJMSLgDJ4ytkHrEMGqzgCazuAC6ewA,11787
9
+ flashforge/api/controls/files.py,sha256=fFjxOCVbK7q1P4GM9RcgB2tsJsywT_HiTBcL3-U0_Yo,7749
10
+ flashforge/api/controls/info.py,sha256=r_gi20ZlgpdtCJVqtoyncV714-MQcDjg4Qg4xeTWHNA,12969
11
+ flashforge/api/controls/job_control.py,sha256=uhuQE3weXJPvWBER0P7lvqWEzAVHXFNXWWBFfnZwtR8,23656
12
+ flashforge/api/controls/temp_control.py,sha256=TGkX63WHygVA9DeYfLARbktZ0o-bYX6MNyYOX6V_RB4,3034
13
+ flashforge/api/filament/__init__.py,sha256=isT2dl0hzUS0xMTXMm4Tip0GTG1gCsm8LKWa9xPu4Y8,104
14
+ flashforge/api/filament/filament.py,sha256=TtcC2G2nD9Sq4cOrCZzFLZ6Q0Ve-zfrfuEF9uQ8M3eE,1214
15
+ flashforge/api/misc/__init__.py,sha256=1AG7vOMRBZQtHp6QUzfr9alcJPeNv3JpU44NrznxDHs,211
16
+ flashforge/api/misc/scientific_notation.py,sha256=KSMTrrYhPWLv0gbcEAD6u-jEOcIwUjOCOPMBi0LiO-k,826
17
+ flashforge/api/misc/temperature.py,sha256=qeHlCdPzLyqGDEB874Ib5AgYHMR9Qtw61shnw4G095E,1066
18
+ flashforge/api/network/__init__.py,sha256=G5fBoAlq-NQPDkWp579mFIqsj0v7B1Lb2TAzO6IZA0Q,164
19
+ flashforge/api/network/fnet_code.py,sha256=BR2niVKKk4ZfXtizUDIMXzDhlCxPHzqWg5AQQIcoj3g,402
20
+ flashforge/api/network/utils.py,sha256=jwqyJaByr4q80_MJOTwS0nX8I8FZ54T_CHBwkKTXptA,1519
21
+ flashforge/discovery/__init__.py,sha256=G0WiP70EhfHdjXR1RNlv6xjhyHOdo-HWyOm9J0ds4SM,828
22
+ flashforge/discovery/discovery.py,sha256=qlyLxITY9JMKY_quONdWeZ5sbsF_pXfqRXqk7DwDGfs,26042
23
+ flashforge/models/__init__.py,sha256=MNpnXdS6Yah5kSwBB7cbA2Hd-8azffE62pgUrrKSZk4,984
24
+ flashforge/models/machine_info.py,sha256=tMec0qSq9iTVfUvLl72vL5jlDrBW2mn132dzL8842mA,14602
25
+ flashforge/models/responses.py,sha256=befMeXAc7XXiK7emF8Ep2cd1GuhZ-zyYPbbPqS2lcQI,7214
26
+ flashforge/tcp/__init__.py,sha256=g0xAZf0ZDKnH2g79tK5FeAATRo90GfDB7Lkws1LsZxU,1145
27
+ flashforge/tcp/a3_client.py,sha256=n7Kw0Dn9MYjjj0r2GPEiQFBKZfzuE9lboziuRt2bKgM,15411
28
+ flashforge/tcp/ff_client.py,sha256=CJXk0Qei2FVSpbXxZhiEQgAEcTJaBab1ouooqyC4OL4,20235
29
+ flashforge/tcp/tcp_client.py,sha256=KjymxUXiXgEp9y7mjr5tNO_Y2-bsGEyP-oG5en7rCCs,16996
30
+ flashforge/tcp/gcode/__init__.py,sha256=tFGlqCPFxVJNizXsIG4pMOK7IPFNnc_vIEMciULYkMY,271
31
+ flashforge/tcp/gcode/a3_gcode_controller.py,sha256=x84_xo_Ll5k6hMAwDWuNUo54znV-BBIfwnmeOiEa9Fs,3688
32
+ flashforge/tcp/gcode/gcode_controller.py,sha256=6K1VGgX59AcE_Kh_gm13dmxCY_kuzV_d2ooSpheONRI,10075
33
+ flashforge/tcp/gcode/gcodes.py,sha256=55Ii1JpJNJNmOnBivyF83vz3TZUPDtp01lX72NINfPQ,3658
34
+ flashforge/tcp/parsers/__init__.py,sha256=kDaJmiH0JcR5i693Fj3pwmINLWN0ipirN3LWGFvPst0,730
35
+ flashforge/tcp/parsers/endstop_status.py,sha256=4jTtodJiiAVeeU8Z5daFtETm8ExPGo5P1CQWZ9KYrfg,9815
36
+ flashforge/tcp/parsers/location_info.py,sha256=n1lUUmbk4kuuuBUbIA65dlPa4tsVGUJFlwnoeRW0yx8,2865
37
+ flashforge/tcp/parsers/print_status.py,sha256=4q9ZlJfO0c7_t1o15tgxbguMxpDjEW9pMyaFU6a0Nfk,6164
38
+ flashforge/tcp/parsers/printer_info.py,sha256=QY6LECfcOhVHSIdsvQZwJago0OjXroUwiX0H-uQaH2A,5411
39
+ flashforge/tcp/parsers/temp_info.py,sha256=9Waf68tt-4QBcChyUwfMHDwWdIzM4mmDpZAKeAzklgs,7908
40
+ flashforge/tcp/parsers/thumbnail_info.py,sha256=ZmxdEbVFOzqR1AfhXXZyjENVI66BdRdE7Q8LQ8an9FY,10201
41
+ flashforge_python_api-1.1.0.dist-info/METADATA,sha256=H9Lv3ThMilNw6H-BMtsi2-vdsL0u6f4u7QtGkh-6vlQ,11038
42
+ flashforge_python_api-1.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
43
+ flashforge_python_api-1.1.0.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
44
+ flashforge_python_api-1.1.0.dist-info/licenses/LICENSE,sha256=-cTA-hrmvlb3pqlQrBZQXUnKayhUjsLJMPb7TD91frM,1067
45
+ flashforge_python_api-1.1.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.28.0
2
+ Generator: hatchling 1.29.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,43 +0,0 @@
1
- flashforge/__init__.py,sha256=YwiGqt8E6Q5s3_iWxT0skY-468iQwKi2bRmj9pmdDhE,4302
2
- flashforge/client.py,sha256=dkzIGgFQW37cstXKAAJEg4wmyuQiNdWxHbMgPHOsqxA,12805
3
- flashforge/api/__init__.py,sha256=Syz3l0UO1ryK5bMKnI_Neh1PTmlkl8iKgzZrdWhArc0,334
4
- flashforge/api/constants/__init__.py,sha256=JyFtW3DcynTD_VWzw3T7MCs6BYaf9Xkypi_WYUgqFA4,162
5
- flashforge/api/constants/commands.py,sha256=tcCyAueNYZ7CrYxVy92r9alF6f5AcapErBBgGL1Xqwk,328
6
- flashforge/api/constants/endpoints.py,sha256=aGDxZk2f_Qsfi_QeIujP8ocDux_wiBBYldaGUuyg8BA,270
7
- flashforge/api/controls/__init__.py,sha256=5nHCY3U6KJIknYY_VnPjLFQIiPmEEAA6QlkC14AjAzY,292
8
- flashforge/api/controls/control.py,sha256=4PEYVeHkJTvsIYq2ck_rJ9kGkozsSgJUPkFHvFEfJNk,12061
9
- flashforge/api/controls/files.py,sha256=ieQI3IaWPNwyxLoIP3Ea_xtg_bTmZkleSM460yhFgIk,7626
10
- flashforge/api/controls/info.py,sha256=lAYSkbpFvJrkb9IL8yVAWMFVwsk4Rl7ZlNvgEh32Ub0,12512
11
- flashforge/api/controls/job_control.py,sha256=iC3bmK00r4rS7fsAuRZR-RNWguJ8rl8dCDV1L1a-leM,23169
12
- flashforge/api/controls/temp_control.py,sha256=H4fdJXXrnRMQvvZhslhNAtAR78S-4Nk79OxDqOEHRM0,3108
13
- flashforge/api/filament/__init__.py,sha256=isT2dl0hzUS0xMTXMm4Tip0GTG1gCsm8LKWa9xPu4Y8,104
14
- flashforge/api/filament/filament.py,sha256=TtcC2G2nD9Sq4cOrCZzFLZ6Q0Ve-zfrfuEF9uQ8M3eE,1214
15
- flashforge/api/misc/__init__.py,sha256=IaHcsUieaMEYEFAWTyj-X6N7JRLiLiU7D58Cl-DttJs,211
16
- flashforge/api/misc/scientific_notation.py,sha256=KSMTrrYhPWLv0gbcEAD6u-jEOcIwUjOCOPMBi0LiO-k,826
17
- flashforge/api/misc/temperature.py,sha256=qeHlCdPzLyqGDEB874Ib5AgYHMR9Qtw61shnw4G095E,1066
18
- flashforge/api/network/__init__.py,sha256=BjrtwAMLGJ6_Q4LrZZM9KP1gfYXq4V8uHro_AxmUhD8,163
19
- flashforge/api/network/fnet_code.py,sha256=BR2niVKKk4ZfXtizUDIMXzDhlCxPHzqWg5AQQIcoj3g,402
20
- flashforge/api/network/utils.py,sha256=gpRU24eYtOajV-lWEjMdanjs110xG-jn2EirD5gIoWA,1607
21
- flashforge/discovery/__init__.py,sha256=1Dz3zqh5ltsv34ZhugWkoC4MKp8qbz3SWpxNkPSIlMU,277
22
- flashforge/discovery/discovery.py,sha256=fAY8EFw5u8R-wlh21_GrXHLL2KpAxkp0EQi8fNbgJbU,15172
23
- flashforge/models/__init__.py,sha256=qRV-iuENmwyeiO63cQYA6qFB-UYG36HadSMzgZabGPA,983
24
- flashforge/models/machine_info.py,sha256=Y7nfCepE6sc8slpPsFCFOGXdzxMzUA2Dtod3WHGk7TU,12108
25
- flashforge/models/responses.py,sha256=LbRiT74j31fra86xorcuUmeWtV27KCj6mysERlUJzZI,5143
26
- flashforge/tcp/__init__.py,sha256=JYbv_ATMJL1vJ1VP-KPcxdMM7V_aapDkZrCUhPaWLtQ,835
27
- flashforge/tcp/ff_client.py,sha256=58z6qzfolIOovtzW-C3GwgrOxZV67cOMC5vGjYnsZ7c,20787
28
- flashforge/tcp/tcp_client.py,sha256=GcTp_PAykH4n5NFf8uqCV5H7OfExJFPWordMtgujREU,17331
29
- flashforge/tcp/gcode/__init__.py,sha256=PhRg0RVxZoWQaB8lpHXSEsY1C5ZvJ29QIAUOi0vr5OY,195
30
- flashforge/tcp/gcode/gcode_controller.py,sha256=RKUwxDZkRxtn9TL4w8VS4A6xhi8kHwTche3YPJz-6tw,10053
31
- flashforge/tcp/gcode/gcodes.py,sha256=exPqr7EJbJYgtJ9aQNm8Ut7WfjPCx1i2fLnu7NpgG9c,3392
32
- flashforge/tcp/parsers/__init__.py,sha256=lOxmHv1ECvZ8npm_lfO8gwG23L6QlVSE0TRuOAw64bk,730
33
- flashforge/tcp/parsers/endstop_status.py,sha256=tuHgBjXv9bQzUdMGC6_DHU6RsF5-6LGzjSjUkoMJK64,10374
34
- flashforge/tcp/parsers/location_info.py,sha256=SfdW02nAB5Zlf-l7cPx4EetMFopJrz_IF5IxsjWwi1U,2445
35
- flashforge/tcp/parsers/print_status.py,sha256=75KlzAMMjvpR4hCvK0LbHKwE_7hm2jExCFeHO1v4Kgs,6536
36
- flashforge/tcp/parsers/printer_info.py,sha256=qur6zekWsTY_RsCt6Nndc1eElvJIhSXCpUfX0Z40ONQ,5443
37
- flashforge/tcp/parsers/temp_info.py,sha256=YaDNCJZvwYhqD3li1aJl-66nVrZ2_lkoQVgiA1x35_w,8276
38
- flashforge/tcp/parsers/thumbnail_info.py,sha256=hi-e3Dy8h8Vw1Uu5SVAodQKSJEhP0-z1NhnO3rOuYMo,9282
39
- flashforge_python_api-1.0.2.dist-info/METADATA,sha256=HpduS305a5OSHzR9aUJTRVV13gRp-LmF0Hp1Yz8d9VQ,10780
40
- flashforge_python_api-1.0.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
41
- flashforge_python_api-1.0.2.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
42
- flashforge_python_api-1.0.2.dist-info/licenses/LICENSE,sha256=-cTA-hrmvlb3pqlQrBZQXUnKayhUjsLJMPb7TD91frM,1067
43
- flashforge_python_api-1.0.2.dist-info/RECORD,,