flashforge-python-api 1.0.0__py3-none-any.whl → 1.0.1__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.
- flashforge/api/controls/files.py +19 -3
- flashforge/client.py +1 -0
- flashforge/models/machine_info.py +2 -2
- flashforge_python_api-1.0.1.dist-info/METADATA +211 -0
- {flashforge_python_api-1.0.0.dist-info → flashforge_python_api-1.0.1.dist-info}/RECORD +8 -8
- {flashforge_python_api-1.0.0.dist-info → flashforge_python_api-1.0.1.dist-info}/WHEEL +1 -1
- flashforge_python_api-1.0.0.dist-info/METADATA +0 -123
- {flashforge_python_api-1.0.0.dist-info → flashforge_python_api-1.0.1.dist-info}/entry_points.txt +0 -0
- {flashforge_python_api-1.0.0.dist-info → flashforge_python_api-1.0.1.dist-info}/licenses/LICENSE +0 -0
flashforge/api/controls/files.py
CHANGED
|
@@ -10,6 +10,7 @@ from ...models.machine_info import FFGcodeFileEntry
|
|
|
10
10
|
from ...models.responses import GenericResponse, GCodeListResponse, ThumbnailResponse
|
|
11
11
|
from ..constants.endpoints import Endpoints
|
|
12
12
|
from ..network.utils import NetworkUtils
|
|
13
|
+
from pydantic import ValidationError
|
|
13
14
|
|
|
14
15
|
if TYPE_CHECKING:
|
|
15
16
|
from ...client import FlashForgeClient
|
|
@@ -90,7 +91,22 @@ class Files:
|
|
|
90
91
|
return []
|
|
91
92
|
|
|
92
93
|
# Parse the response using GCodeListResponse
|
|
93
|
-
|
|
94
|
+
try:
|
|
95
|
+
result = GCodeListResponse(**data)
|
|
96
|
+
except ValidationError:
|
|
97
|
+
raw_list = data.get("gcodeList", [])
|
|
98
|
+
if isinstance(raw_list, list):
|
|
99
|
+
entries: List[FFGcodeFileEntry] = []
|
|
100
|
+
for file_name in raw_list:
|
|
101
|
+
if isinstance(file_name, str):
|
|
102
|
+
entries.append(
|
|
103
|
+
FFGcodeFileEntry(
|
|
104
|
+
gcodeFileName=file_name,
|
|
105
|
+
printingTime=0,
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
return entries
|
|
109
|
+
return []
|
|
94
110
|
|
|
95
111
|
# AD5X and newer printers provide detailed info in gcodeListDetail
|
|
96
112
|
if result.gcode_list_detail and len(result.gcode_list_detail) > 0:
|
|
@@ -105,8 +121,8 @@ class Files:
|
|
|
105
121
|
# Convert string array to FFGcodeFileEntry objects
|
|
106
122
|
return [
|
|
107
123
|
FFGcodeFileEntry(
|
|
108
|
-
|
|
109
|
-
|
|
124
|
+
gcodeFileName=file_name,
|
|
125
|
+
printingTime=0
|
|
110
126
|
)
|
|
111
127
|
for file_name in result.gcode_list
|
|
112
128
|
]
|
flashforge/client.py
CHANGED
|
@@ -114,7 +114,7 @@ class FFPrinterDetail(BaseModel):
|
|
|
114
114
|
estimated_left_weight: Optional[float] = Field(default=None, alias="estimatedLeftWeight")
|
|
115
115
|
estimated_right_len: Optional[float] = Field(default=None, alias="estimatedRightLen")
|
|
116
116
|
estimated_right_weight: Optional[float] = Field(default=None, alias="estimatedRightWeight")
|
|
117
|
-
estimated_time: Optional[
|
|
117
|
+
estimated_time: Optional[float] = Field(default=None, alias="estimatedTime")
|
|
118
118
|
external_fan_status: Optional[str] = Field(default=None, alias="externalFanStatus")
|
|
119
119
|
fill_amount: Optional[float] = Field(default=None, alias="fillAmount")
|
|
120
120
|
firmware_version: Optional[str] = Field(default=None, alias="firmwareVersion")
|
|
@@ -191,7 +191,7 @@ class FFMachineInfo(BaseModel):
|
|
|
191
191
|
# Current print estimates
|
|
192
192
|
est_length: float = 0.0
|
|
193
193
|
est_weight: float = 0.0
|
|
194
|
-
estimated_time:
|
|
194
|
+
estimated_time: float = 0.0
|
|
195
195
|
|
|
196
196
|
# Fans & LED status
|
|
197
197
|
external_fan_on: bool = False
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: flashforge-python-api
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: A comprehensive Python library for controlling FlashForge 3D printers
|
|
5
|
+
Project-URL: Homepage, https://github.com/GhostTypes/ff-5mp-api-py
|
|
6
|
+
Project-URL: Documentation, https://github.com/GhostTypes/ff-5mp-api-py#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/GhostTypes/ff-5mp-api-py.git
|
|
8
|
+
Project-URL: Issues, https://github.com/GhostTypes/ff-5mp-api-py/issues
|
|
9
|
+
Author-email: GhostTypes <notghosttypes@gmail.com>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: 3d-printer,api,async,control,flashforge,python
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
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
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
+
Classifier: Topic :: System :: Hardware :: Hardware Drivers
|
|
24
|
+
Requires-Python: >=3.8
|
|
25
|
+
Requires-Dist: aiohttp>=3.8.0
|
|
26
|
+
Requires-Dist: netifaces>=0.11.0
|
|
27
|
+
Requires-Dist: pydantic>=2.0.0
|
|
28
|
+
Requires-Dist: requests>=2.31.0
|
|
29
|
+
Provides-Extra: all
|
|
30
|
+
Requires-Dist: black>=23.0.0; extra == 'all'
|
|
31
|
+
Requires-Dist: mypy>=1.0.0; extra == 'all'
|
|
32
|
+
Requires-Dist: pillow>=10.0.0; extra == 'all'
|
|
33
|
+
Requires-Dist: pre-commit>=3.0.0; extra == 'all'
|
|
34
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'all'
|
|
35
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
|
|
36
|
+
Requires-Dist: pytest>=7.0.0; extra == 'all'
|
|
37
|
+
Requires-Dist: ruff>=0.1.0; extra == 'all'
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
44
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
45
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
46
|
+
Provides-Extra: imaging
|
|
47
|
+
Requires-Dist: pillow>=10.0.0; extra == 'imaging'
|
|
48
|
+
Description-Content-Type: text/markdown
|
|
49
|
+
|
|
50
|
+
<div align="center">
|
|
51
|
+
|
|
52
|
+
# FlashForge Python API
|
|
53
|
+
|
|
54
|
+
A comprehensive Python library for controlling FlashForge 3D printers.
|
|
55
|
+
|
|
56
|
+
[](https://pypi.org/project/flashforge-python-api/)
|
|
57
|
+
[](https://www.python.org/)
|
|
58
|
+
[](LICENSE)
|
|
59
|
+
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div align="center">
|
|
63
|
+
|
|
64
|
+
## Features & Capabilities
|
|
65
|
+
|
|
66
|
+
| Feature | Description |
|
|
67
|
+
| :--- | :--- |
|
|
68
|
+
| **Printer Discovery** | Automatic UDP broadcast discovery of printers on the network |
|
|
69
|
+
| **Full Control** | Movement (G1), Homing (G28), Temperature (M104/M140), Fans, LED |
|
|
70
|
+
| **Real-time Monitoring** | Live status (M119), Temperatures (M105), Print Progress (M27) |
|
|
71
|
+
| **Job Management** | Start, Pause, Resume, Cancel, File Upload & Listing |
|
|
72
|
+
| **Advanced Parsing** | Thumbnail extraction (M662), Endstop monitoring, Machine state |
|
|
73
|
+
| **Dual Protocol** | Modern HTTP API + Legacy TCP G-code support |
|
|
74
|
+
| **Async Support** | Native async/await implementation for all operations |
|
|
75
|
+
| **Type Safety** | Full type hints and Pydantic models for robust development |
|
|
76
|
+
|
|
77
|
+
<br>
|
|
78
|
+
|
|
79
|
+
## Supported Hardware
|
|
80
|
+
|
|
81
|
+
| Model | Support Level | Connection Type |
|
|
82
|
+
| :--- | :--- | :--- |
|
|
83
|
+
| **FlashForge Adventurer 5M / 5M Pro** | Full Support | HTTP + TCP |
|
|
84
|
+
| **FlashForge Adventurer 5X** | Full Support | HTTP + TCP |
|
|
85
|
+
| **FlashForge Adventurer 3 / 4** | Partial Support | TCP (Legacy) |
|
|
86
|
+
| **Other Networked FlashForge Printers** | Experimental | TCP (Generic) |
|
|
87
|
+
|
|
88
|
+
<br>
|
|
89
|
+
|
|
90
|
+
## Compatible Slicers
|
|
91
|
+
|
|
92
|
+
| Slicer | Compatibility | Notes |
|
|
93
|
+
| :--- | :--- | :--- |
|
|
94
|
+
| **OrcaSlicer** | High | Recommended for Adventurer 5M series |
|
|
95
|
+
| **FlashPrint** | Full | Official FlashForge slicer |
|
|
96
|
+
| **Orca-FlashForge** | High | Optimized for FlashForge printers |
|
|
97
|
+
| **Cura / PrusaSlicer** | Basic | Requires correct G-code flavor |
|
|
98
|
+
|
|
99
|
+
<br>
|
|
100
|
+
|
|
101
|
+
## Installation
|
|
102
|
+
|
|
103
|
+
| Command |
|
|
104
|
+
| :--- |
|
|
105
|
+
| `pip install flashforge-python-api` |
|
|
106
|
+
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<div align="center">
|
|
110
|
+
<h2>Usage Examples</h2>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div align="center">
|
|
114
|
+
<h3>Printer Discovery</h3>
|
|
115
|
+
Discover printers on your local network automatically.
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from flashforge import FlashForgePrinterDiscovery
|
|
120
|
+
import asyncio
|
|
121
|
+
|
|
122
|
+
async def discover():
|
|
123
|
+
discovery = FlashForgePrinterDiscovery()
|
|
124
|
+
printers = await discovery.discover_printers_async()
|
|
125
|
+
for printer in printers:
|
|
126
|
+
print(f"Found: {printer.name} at {printer.ip_address}")
|
|
127
|
+
|
|
128
|
+
asyncio.run(discover())
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
<div align="center">
|
|
132
|
+
<h3>Basic Control</h3>
|
|
133
|
+
Connect to a printer and perform basic operations like setting temperature and homing.
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
from flashforge import FlashForgeClient
|
|
138
|
+
import asyncio
|
|
139
|
+
|
|
140
|
+
async def control_printer():
|
|
141
|
+
# Initialize client with printer details
|
|
142
|
+
client = FlashForgeClient("192.168.1.100", "SERIAL_NUMBER", "CHECK_CODE")
|
|
143
|
+
|
|
144
|
+
if await client.initialize():
|
|
145
|
+
print(f"Connected to {client.printer_name}")
|
|
146
|
+
|
|
147
|
+
# Set bed temperature to 60°C
|
|
148
|
+
await client.temp_control.set_bed_temp(60)
|
|
149
|
+
|
|
150
|
+
# Home all axes
|
|
151
|
+
await client.control.home_xyz()
|
|
152
|
+
|
|
153
|
+
await client.dispose()
|
|
154
|
+
|
|
155
|
+
asyncio.run(control_printer())
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
<div align="center">
|
|
159
|
+
<h3>Real-time Status Monitoring</h3>
|
|
160
|
+
Monitor printer status, temperatures, and print progress.
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
from flashforge import FlashForgeClient
|
|
165
|
+
import asyncio
|
|
166
|
+
|
|
167
|
+
async def monitor_printer():
|
|
168
|
+
async with FlashForgeClient("192.168.1.100", "SERIAL", "CODE") as client:
|
|
169
|
+
# Get comprehensive status
|
|
170
|
+
status = await client.get_printer_status()
|
|
171
|
+
print(f"Machine State: {status.machine_state}")
|
|
172
|
+
|
|
173
|
+
# Get temperatures via TCP
|
|
174
|
+
temps = await client.tcp_client.get_temp_info()
|
|
175
|
+
if temps:
|
|
176
|
+
bed = temps.get_bed_temp()
|
|
177
|
+
extruder = temps.get_extruder_temp()
|
|
178
|
+
print(f"Bed: {bed.get_current()}°C / {bed.get_target()}°C")
|
|
179
|
+
print(f"Extruder: {extruder.get_current()}°C / {extruder.get_target()}°C")
|
|
180
|
+
|
|
181
|
+
# Check print progress
|
|
182
|
+
layer_p, sd_p, current_layer = await client.tcp_client.get_print_progress()
|
|
183
|
+
print(f"Progress: {layer_p}% (Layer {current_layer})")
|
|
184
|
+
|
|
185
|
+
asyncio.run(monitor_printer())
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
<div align="center">
|
|
189
|
+
<h3>File Operations & Thumbnails</h3>
|
|
190
|
+
List files on the printer and extract thumbnails.
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
from flashforge import FlashForgeClient
|
|
195
|
+
import asyncio
|
|
196
|
+
|
|
197
|
+
async def file_ops():
|
|
198
|
+
async with FlashForgeClient("192.168.1.100", "SERIAL", "CODE") as client:
|
|
199
|
+
# List files
|
|
200
|
+
files = await client.files.get_file_list()
|
|
201
|
+
for filename in files:
|
|
202
|
+
print(f"File: {filename}")
|
|
203
|
+
|
|
204
|
+
# Get thumbnail
|
|
205
|
+
thumb = await client.tcp_client.get_thumbnail(filename)
|
|
206
|
+
if thumb and thumb.has_image_data():
|
|
207
|
+
print(f"Thumbnail found: {len(thumb.get_image_bytes())} bytes")
|
|
208
|
+
# thumb.save_to_file_sync(f"{filename}.png")
|
|
209
|
+
|
|
210
|
+
asyncio.run(file_ops())
|
|
211
|
+
```
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
flashforge/__init__.py,sha256=YwiGqt8E6Q5s3_iWxT0skY-468iQwKi2bRmj9pmdDhE,4302
|
|
2
|
-
flashforge/client.py,sha256=
|
|
2
|
+
flashforge/client.py,sha256=dkzIGgFQW37cstXKAAJEg4wmyuQiNdWxHbMgPHOsqxA,12805
|
|
3
3
|
flashforge/api/__init__.py,sha256=Syz3l0UO1ryK5bMKnI_Neh1PTmlkl8iKgzZrdWhArc0,334
|
|
4
4
|
flashforge/api/constants/__init__.py,sha256=JyFtW3DcynTD_VWzw3T7MCs6BYaf9Xkypi_WYUgqFA4,162
|
|
5
5
|
flashforge/api/constants/commands.py,sha256=tcCyAueNYZ7CrYxVy92r9alF6f5AcapErBBgGL1Xqwk,328
|
|
6
6
|
flashforge/api/constants/endpoints.py,sha256=aGDxZk2f_Qsfi_QeIujP8ocDux_wiBBYldaGUuyg8BA,270
|
|
7
7
|
flashforge/api/controls/__init__.py,sha256=5nHCY3U6KJIknYY_VnPjLFQIiPmEEAA6QlkC14AjAzY,292
|
|
8
8
|
flashforge/api/controls/control.py,sha256=4PEYVeHkJTvsIYq2ck_rJ9kGkozsSgJUPkFHvFEfJNk,12061
|
|
9
|
-
flashforge/api/controls/files.py,sha256=
|
|
9
|
+
flashforge/api/controls/files.py,sha256=ieQI3IaWPNwyxLoIP3Ea_xtg_bTmZkleSM460yhFgIk,7626
|
|
10
10
|
flashforge/api/controls/info.py,sha256=5Vv879QL8Qxx6xFyGjIh4xjLzwcQlLdfjeNkxPxZgbw,12496
|
|
11
11
|
flashforge/api/controls/job_control.py,sha256=iC3bmK00r4rS7fsAuRZR-RNWguJ8rl8dCDV1L1a-leM,23169
|
|
12
12
|
flashforge/api/controls/temp_control.py,sha256=H4fdJXXrnRMQvvZhslhNAtAR78S-4Nk79OxDqOEHRM0,3108
|
|
@@ -21,7 +21,7 @@ flashforge/api/network/utils.py,sha256=gpRU24eYtOajV-lWEjMdanjs110xG-jn2EirD5gIo
|
|
|
21
21
|
flashforge/discovery/__init__.py,sha256=1Dz3zqh5ltsv34ZhugWkoC4MKp8qbz3SWpxNkPSIlMU,277
|
|
22
22
|
flashforge/discovery/discovery.py,sha256=fAY8EFw5u8R-wlh21_GrXHLL2KpAxkp0EQi8fNbgJbU,15172
|
|
23
23
|
flashforge/models/__init__.py,sha256=qRV-iuENmwyeiO63cQYA6qFB-UYG36HadSMzgZabGPA,983
|
|
24
|
-
flashforge/models/machine_info.py,sha256=
|
|
24
|
+
flashforge/models/machine_info.py,sha256=Y7nfCepE6sc8slpPsFCFOGXdzxMzUA2Dtod3WHGk7TU,12108
|
|
25
25
|
flashforge/models/responses.py,sha256=LbRiT74j31fra86xorcuUmeWtV27KCj6mysERlUJzZI,5143
|
|
26
26
|
flashforge/tcp/__init__.py,sha256=JYbv_ATMJL1vJ1VP-KPcxdMM7V_aapDkZrCUhPaWLtQ,835
|
|
27
27
|
flashforge/tcp/ff_client.py,sha256=58z6qzfolIOovtzW-C3GwgrOxZV67cOMC5vGjYnsZ7c,20787
|
|
@@ -36,8 +36,8 @@ flashforge/tcp/parsers/print_status.py,sha256=75KlzAMMjvpR4hCvK0LbHKwE_7hm2jExCF
|
|
|
36
36
|
flashforge/tcp/parsers/printer_info.py,sha256=qur6zekWsTY_RsCt6Nndc1eElvJIhSXCpUfX0Z40ONQ,5443
|
|
37
37
|
flashforge/tcp/parsers/temp_info.py,sha256=YaDNCJZvwYhqD3li1aJl-66nVrZ2_lkoQVgiA1x35_w,8276
|
|
38
38
|
flashforge/tcp/parsers/thumbnail_info.py,sha256=hi-e3Dy8h8Vw1Uu5SVAodQKSJEhP0-z1NhnO3rOuYMo,9282
|
|
39
|
-
flashforge_python_api-1.0.
|
|
40
|
-
flashforge_python_api-1.0.
|
|
41
|
-
flashforge_python_api-1.0.
|
|
42
|
-
flashforge_python_api-1.0.
|
|
43
|
-
flashforge_python_api-1.0.
|
|
39
|
+
flashforge_python_api-1.0.1.dist-info/METADATA,sha256=aI0TqrnzqTEM8P0eujjh2_wcXlNdFXIO3LCfr870Dso,7202
|
|
40
|
+
flashforge_python_api-1.0.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
41
|
+
flashforge_python_api-1.0.1.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
|
|
42
|
+
flashforge_python_api-1.0.1.dist-info/licenses/LICENSE,sha256=lW2RvsgnKpSECUO1251Wj_EMkdmuA6Vlxea-eje7wuM,1088
|
|
43
|
+
flashforge_python_api-1.0.1.dist-info/RECORD,,
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: flashforge-python-api
|
|
3
|
-
Version: 1.0.0
|
|
4
|
-
Summary: A comprehensive Python library for controlling FlashForge 3D printers
|
|
5
|
-
Project-URL: Homepage, https://github.com/GhostTypes/ff-5mp-api-py
|
|
6
|
-
Project-URL: Documentation, https://github.com/GhostTypes/ff-5mp-api-py#readme
|
|
7
|
-
Project-URL: Repository, https://github.com/GhostTypes/ff-5mp-api-py.git
|
|
8
|
-
Project-URL: Issues, https://github.com/GhostTypes/ff-5mp-api-py/issues
|
|
9
|
-
Author-email: GhostTypes <notghosttypes@gmail.com>
|
|
10
|
-
License-Expression: MIT
|
|
11
|
-
License-File: LICENSE
|
|
12
|
-
Keywords: 3d-printer,api,async,control,flashforge,python
|
|
13
|
-
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
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
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
-
Classifier: Topic :: Scientific/Engineering
|
|
22
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
-
Classifier: Topic :: System :: Hardware :: Hardware Drivers
|
|
24
|
-
Requires-Python: >=3.8
|
|
25
|
-
Requires-Dist: aiohttp>=3.8.0
|
|
26
|
-
Requires-Dist: netifaces>=0.11.0
|
|
27
|
-
Requires-Dist: pydantic>=2.0.0
|
|
28
|
-
Requires-Dist: requests>=2.31.0
|
|
29
|
-
Provides-Extra: all
|
|
30
|
-
Requires-Dist: black>=23.0.0; extra == 'all'
|
|
31
|
-
Requires-Dist: mypy>=1.0.0; extra == 'all'
|
|
32
|
-
Requires-Dist: pillow>=10.0.0; extra == 'all'
|
|
33
|
-
Requires-Dist: pre-commit>=3.0.0; extra == 'all'
|
|
34
|
-
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'all'
|
|
35
|
-
Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
|
|
36
|
-
Requires-Dist: pytest>=7.0.0; extra == 'all'
|
|
37
|
-
Requires-Dist: ruff>=0.1.0; extra == 'all'
|
|
38
|
-
Provides-Extra: dev
|
|
39
|
-
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
40
|
-
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
41
|
-
Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
|
|
42
|
-
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
43
|
-
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
44
|
-
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
45
|
-
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
46
|
-
Provides-Extra: imaging
|
|
47
|
-
Requires-Dist: pillow>=10.0.0; extra == 'imaging'
|
|
48
|
-
Description-Content-Type: text/markdown
|
|
49
|
-
|
|
50
|
-
# 🖨️ FlashForge Python API
|
|
51
|
-
|
|
52
|
-
A comprehensive Python library for controlling FlashForge 3D printers.
|
|
53
|
-
|
|
54
|
-
## ✨ Features
|
|
55
|
-
|
|
56
|
-
- **🎮 Full Printer Control**: Movement, temperature, speed, LED, filtration, camera control
|
|
57
|
-
- **📋 Job Management**: Start, pause, resume, cancel prints, file upload and management
|
|
58
|
-
- **📊 Real-time Monitoring**: Live status, temperature, progress, and machine state tracking
|
|
59
|
-
- **🔍 Network Discovery**: Automatic printer discovery via UDP broadcast
|
|
60
|
-
- **🔄 Dual Communication**: HTTP API (modern) + TCP G-code (legacy) support
|
|
61
|
-
- **🛡️ Type Safety**: Full type hints and Pydantic models for robust development
|
|
62
|
-
- **⚡ Async Support**: Native async/await support for all operations
|
|
63
|
-
- **🖼️ Advanced Features**: Thumbnail extraction, endstop monitoring, print progress tracking
|
|
64
|
-
|
|
65
|
-
## 🚀 Quick Start
|
|
66
|
-
> 💡 The "new" HTTP API requires LAN-mode, and a check code for authentication. [This](https://www.youtube.com/watch?v=krdEGccZuKo) video shows how to set up LAN-mode, and get the code.
|
|
67
|
-
|
|
68
|
-
```python
|
|
69
|
-
from flashforge import FlashForgeClient, FlashForgePrinterDiscovery
|
|
70
|
-
|
|
71
|
-
# Find printers on the network
|
|
72
|
-
discovery = FlashForgePrinterDiscovery()
|
|
73
|
-
printers = await discovery.discover_printers_async()
|
|
74
|
-
|
|
75
|
-
# Connect to your printer
|
|
76
|
-
client = FlashForgeClient(
|
|
77
|
-
host="192.168.1.100", # Your printer's IP
|
|
78
|
-
serial="ABCD1234", # Your printer's serial
|
|
79
|
-
check_code="12345678" # Your printer's check code
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
# Basic operations
|
|
83
|
-
await client.info.get_machine_status() # Get printer status
|
|
84
|
-
await client.temp_control.set_bed_temp(60) # Set bed temperature
|
|
85
|
-
await client.control.home_xyz() # Home all axes
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## 📦 Installation & Setup
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
# Clone the repository
|
|
92
|
-
git clone https://github.com/your-username/flashforge-python-api.git
|
|
93
|
-
cd flashforge-python-api
|
|
94
|
-
|
|
95
|
-
# Setup & Install
|
|
96
|
-
uv sync # Install core dependencies
|
|
97
|
-
uv sync --all-extras # Install with all optional dependencies
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## 🔧 Requirements
|
|
101
|
-
|
|
102
|
-
- **🐍 Python**: 3.8+ (recommended: 3.11+)
|
|
103
|
-
- **🖨️ Printer**: FlashForge with network connectivity
|
|
104
|
-
- **🌐 Network**: Printer and computer on same network for discovery
|
|
105
|
-
- **🔑 Credentials**: Printer serial number and check code
|
|
106
|
-
|
|
107
|
-
## 🎯 Supported Models
|
|
108
|
-
|
|
109
|
-
**✅ Tested with:**
|
|
110
|
-
- FlashForge Adventurer 5M Series
|
|
111
|
-
- FlashForge Adventurer 4
|
|
112
|
-
|
|
113
|
-
**💫 Should work with:**
|
|
114
|
-
- FlashForge printers with network connectivity
|
|
115
|
-
- Printers supporting HTTP API (new) and/or TCP G-code (legacy)
|
|
116
|
-
|
|
117
|
-
> 💡 **Note**: Some features (camera control, filtration) are model-specific and will be automatically detected.
|
|
118
|
-
|
|
119
|
-
## 🌟 Related Projects
|
|
120
|
-
- **💻 C# API (Windows)**: [ff-5mp-api](https://github.com/GhostTypes/ff-5mp-api)
|
|
121
|
-
- **🌐 TypeScript API (Cross-Platform)**: [ff-5mp-api-ts](https://github.com/GhostTypes/ff-5mp-api-ts)
|
|
122
|
-
- **🎨 FlashForgeUI (Electron, Cross-Platform)**: [FlashForgeUI-Electron](https://github.com/Parallel-7/FlashForgeUI-Electron)
|
|
123
|
-
|
{flashforge_python_api-1.0.0.dist-info → flashforge_python_api-1.0.1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{flashforge_python_api-1.0.0.dist-info → flashforge_python_api-1.0.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|