# BambuLuc 🖨️
[](https://www.python.org/downloads/)
[](LICENSE)
[](https://github.com/AngelBarbero/bambuluc)
[](https://pypi.org/project/bambuluc/)
**Librería completa para control de impresoras Bambu Lab** con soporte para archivos grandes, monitoreo en tiempo real y configuración anti-SD.
**Desarrollada por Angel Luis Barbero Guerras**
## 🚀 **Características**
- ✅ **Socket directo** - Envío de archivos grandes sin problemas
- ✅ **Comunicacion** - Comunicación en tiempo real
- ✅ **Configuración anti-SD** - Evita errores de tarjeta SD
- ✅ **Monitoreo completo** - Estado, progreso, temperaturas
- ✅ **Múltiples impresoras** - Gestión de varias impresoras
- ✅ **Callbacks personalizables** - Eventos y notificaciones
- ✅ **Context manager** - Gestión automática de conexiones
- ✅ **Logging integrado** - Depuración y seguimiento
- ✅ **Type hints** - Mejor desarrollo y mantenimiento
## 📦 **Instalación**
```bash
# Instalar desde PyPI
pip install bambuluc
## 🎯 **Uso Básico**
```python
from bambuluc import BambuLabPrinter
# Configuración
PRINTER_IP = "ip_impresora"
ACCESS_CODE = "Access_code" # Código de acceso de la impresora
DEVICE_ID = "device_id" # ID del dispositivo
# Crear instancia
printer = BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID)
# Conectar
if printer.connect():
# Enviar archivo
success = printer.send_file("mi_archivo.gcode.3mf", auto_start=False)
if success:
print("✅ Archivo enviado exitosamente")
# Desconectar
printer.disconnect()
```
## 🔧 **Uso Avanzado**
### **Con Context Manager**
```python
with BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:
# Callbacks
def on_upload_progress(bytes_sent, total_bytes):
progress = (bytes_sent / total_bytes) * 100
print(f"📤 Subida: {progress:.1f}%")
def on_file_progress(event, data):
print(f"📁 {event}: {data}")
# Configurar callbacks
printer.on_file_progress = on_file_progress
# Enviar archivo con progreso
success = printer.send_file(
"archivo_grande.gcode.3mf",
auto_start=False,
use_ams=True,
bed_leveling=True,
progress_callback=on_upload_progress
)
```
### **Monitoreo Continuo**
```python
# Callbacks de estado
def on_status_change(new_stage, old_stage):
print(f"🔄 Estado: {old_stage} → {new_stage}")
def on_print_complete():
print("🎉 ¡Impresión terminada!")
# Configurar
printer.on_status_change = on_status_change
printer.on_print_complete = on_print_complete
# Iniciar monitoreo
printer.start_monitoring()
# Obtener estado
status = printer.get_status()
print(f"Estado: {status.stage}")
print(f"Progreso: {status.progress}%")
print(f"Capa: {status.layer_num}/{status.total_layers}")
print(f"Tiempo restante: {status.remaining_time}s")
```
### **Múltiples Impresoras**
```python
from bambuluc import BambuLabManager
# Crear gestor
manager = BambuLabManager()
# Agregar impresoras
printer1 = manager.add_printer("Salon", "ip_impresora", "access_code", "device_id")
printer2 = manager.add_printer("Taller", "ip_imporesora", "acces_code", "device_id")
# Conectar todas
results = manager.connect_all()
# Enviar archivo a impresora específica
printer = manager.get_printer("Salon")
if printer:
printer.send_file("archivo.gcode.3mf")
# Obtener estado de todas
all_status = manager.get_all_status()
for name, status in all_status.items():
print(f"{name}: {status.stage} - {status.progress}%")
```
## 🎛️ **Control de Impresión**
```python
# Iniciar impresión
printer.start_print()
# Pausar impresión
printer.pause_print()
# Detener impresión
printer.stop_print()
# Verificar estado
if printer.is_printing():
print("🖨️ Imprimiendo...")
# Obtener progreso
progress = printer.get_progress()
print(f"Progreso: {progress}%")
```
## 📊 **Información de Estado**
```python
status = printer.get_status()
# Estado general
print(f"Etapa: {status.stage}")
print(f"Estado GCode: {status.gcode_state}")
print(f"Progreso: {status.progress}%")
# Capas
print(f"Capa actual: {status.layer_num}")
print(f"Total capas: {status.total_layers}")
# Tiempo
print(f"Tiempo restante: {status.remaining_time}s")
# Temperaturas (actuales y objetivo)
print(f"Cama: {status.bed_temp}°C → {status.bed_temp_target}°C")
print(f"Nozzle: {status.nozzle_temp}°C → {status.nozzle_temp_target}°C")
print(f"Cámara: {status.chamber_temp}°C → {status.chamber_temp_target}°C")
# Información de temperaturas detallada
temp_info = printer.get_temperature_info()
heating = printer.is_heating()
print(f"Cama calentando: {heating['bed']}")
print(f"Nozzle calentando: {heating['nozzle']}")
# Velocidades
print(f"Velocidad impresión: {status.print_speed}%")
print(f"Velocidad ventilador: {status.fan_speed}%")
# Conectividad
print(f"Señal WiFi: {status.wifi_signal}%")
# Archivo actual
print(f"Archivo: {status.current_file}")
print(f"Tamaño: {status.file_size} bytes")
# Información de cámara
camera_info = printer.get_camera_info()
if camera_info['available']:
print(f"📸 Cámara disponible: {camera_info['url']}")
print(f"Grabando: {camera_info['recording']}")
print(f"Timelapse: {camera_info['timelapse']}")
# Obtener imagen
image_data = printer.get_camera_image()
if image_data:
print(f"Imagen obtenida: {len(image_data)} bytes")
# Guardar imagen
if printer.save_camera_image("impresora.jpg"):
print("📸 Imagen guardada como 'impresora.jpg'")
# Información de filamento
filament = printer.get_filament_info()
if filament:
print(f"Filamento: {filament.type} - {filament.color}")
print(f"Marca: {filament.brand}")
print(f"Temperatura: {filament.temperature}°C")
print(f"Restante: {filament.remaining}%")
# Información del AMS
ams_info = printer.get_ams_info()
for i, ams in enumerate(ams_info):
print(f"AMS {i}: {ams.filament.type} - {ams.status}")
```
### **Cámara y Monitoreo Visual**
```python
# Verificar disponibilidad de cámara
camera_info = printer.get_camera_info()
if camera_info['available']:
print("📸 Cámara disponible")
# Obtener imagen actual
image_data = printer.get_camera_image()
if image_data:
print(f"Imagen obtenida: {len(image_data)} bytes")
# Guardar imagen con timestamp
from datetime import datetime
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"captura_{timestamp}.jpg"
if printer.save_camera_image(filename):
print(f"📸 Imagen guardada: {filename}")
# Monitoreo continuo con capturas
import time
for i in range(10):
if printer.save_camera_image(f"progreso_{i:02d}.jpg"):
print(f"📸 Captura {i+1}/10 guardada")
time.sleep(30) # Cada 30 segundos
```
### **Información Detallada**
```python
# Obtener toda la información en un diccionario
detailed_info = printer.get_detailed_status()
# Información de archivo actual
file_info = printer.get_current_file_info()
print(f"Archivo: {file_info['name']}")
print(f"Progreso: {file_info['progress']}%")
print(f"Capa: {file_info['layer']}")
print(f"Tiempo restante: {file_info['remaining_time']}s")
```
## 🔧 **Configuración Avanzada**
### **Parámetros de Envío**
```python
success = printer.send_file(
"archivo.gcode.3mf",
auto_start=False, # No iniciar automáticamente
use_ams=True, # Usar AMS si disponible
bed_leveling=True, # Realizar nivelación
progress_callback=None # Callback de progreso
)
```
### **Configuración Anti-SD**
La librería automáticamente usa configuración anti-SD para evitar errores:
```python
# Configuración automática
"sdcard": False, # NO usar configuracion tarjeta SD
"storage": "internal", # Forzar memoria interna sd
```
## 🐛 **Manejo de Errores**
```python
import logging
# Configurar logging
logging.basicConfig(level=logging.INFO)
try:
with BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:
# Callbacks de error
def on_error(error_type, error_message):
print(f"❌ Error {error_type}: {error_message}")
printer.on_error = on_error
# Operaciones...
success = printer.send_file("archivo.gcode.3mf")
except Exception as e:
print(f"❌ Error general: {e}")
```
## 📋 **Eventos y Callbacks**
### **Callbacks Disponibles**
```python
# Estado de impresión
printer.on_status_change = lambda new, old: print(f"Estado: {new}")
# Progreso de archivo
printer.on_file_progress = lambda event, data: print(f"Archivo: {event}")
# Impresión terminada
printer.on_print_complete = lambda: print("¡Terminado!")
# Errores
printer.on_error = lambda type, msg: print(f"Error: {msg}")
```
### **Eventos de Archivo**
- `accepted` - Archivo aceptado por impresora
- `preparing` - Preparando archivo (con porcentaje)
- `prepared` - Archivo preparado y listo
### **Estados de Impresión**
- `idle` - Inactiva
- `prepare` - Preparando
- `printing` - Imprimiendo
- `pause` - Pausada
- `finish` - Terminada
- `error` - Error
## 🛠️ **Utilidades**
```python
from bambu_lab_library import calculate_md5, format_time, format_size
# Calcular MD5
md5 = calculate_md5("archivo.gcode.3mf")
# Formatear tiempo
time_str = format_time(3665) # "1h 1m 5s"
# Formatear tamaño
size_str = format_size(7030927) # "6.7 MB"
```
## 🔍 **Depuración**
```python
import logging
# Nivel de logging
logging.getLogger('bambu_lab_library').setLevel(logging.DEBUG)
# Ver comunicación MQTT
logging.getLogger('paho.mqtt').setLevel(logging.DEBUG)
```
## 📋 **Requisitos**
- Python 3.7+
- paho-mqtt >= 1.6.0
## 🚨 **Problemas Conocidos**
### **Error de Tarjeta SD**
Si obtienes errores de tarjeta SD, la librería automáticamente usa configuración anti-SD:
```python
# Automáticamente aplicado
"sdcard": False,
"storage": "internal"
```
### **Timeout de Conexión**
```python
# Aumentar timeout
printer.connect(timeout=60)
```
### **Archivos Grandes**
La librería usa socket directo, no hay límite de tamaño:
```python
# Funciona con archivos de cualquier tamaño
success = printer.send_file("archivo_muy_grande.gcode.3mf")
```
## 🤝 **Contribuir**
1. Fork el proyecto
2. Crear rama feature (`git checkout -b feature/AmazingFeature`)
3. Commit cambios (`git commit -m 'Add AmazingFeature'`)
4. Push a rama (`git push origin feature/AmazingFeature`)
5. Abrir Pull Request
## 📄 **Licencia**
**BambuLuc** está licenciado bajo una **Licencia Comercial Personalizada** .
### 🎯 **Resumen de Licencia**
**✅ USO GRATUITO PERMITIDO:**
- 🎓 Uso personal, educativo y de investigación
- 👨💻 Desarrollo y pruebas personales
- 📚 Fines académicos y de aprendizaje
**❌ USO COMERCIAL PROHIBIDO SIN LICENCIA:**
- 🏢 Uso en empresas para fines comerciales
- 💰 Productos o servicios que generen ingresos
- 🔧 Integración en software comercial
- � Uso en producción comercial
### 🏢 **Provisión para Empresas**
Todas las empresas que deseen usar BambuLuc para fines comerciales deben obtener una licencia comercial y pagar royalties según los términos establecidos por el autor.
### 💰 **Estructura de Royalties**
Los royalties se determinan caso por caso considerando:
- 📊 Tamaño de la organización
- 🔍 Alcance del uso
- 💵 Ingresos generados
- 👥 Número de usuarios/instalaciones
- 🎯 Valor estratégico
### 📞 **Contacto para Licencia Comercial**
- 🐛 GitHub Issues: [Solicitar Licencia Comercial](https://github.com/AngelBarbero/bambuluc/issues)
- 💼 Crear issue con label "Commercial License Request"
## 📞 **Soporte**
- 🐛 Issues: [GitHub Issues](https://github.com/AngelBarbero/bambuluc/issues)
- 💰 Licencia Comercial: [Contactar](https://github.com/AngelBarbero/bambuluc/issues)
- 💖 Sponsorship: [GitHub Sponsors](https://github.com/sponsors/AngelBarbero)
- 📖 Documentación: [ReadTheDocs](https://bambuluc.readthedocs.io/)
## 🏆 **Reconocimientos**
- Bambu Lab por crear impresoras
- Comunidad de desarrolladores Python
## 💼 **Licencia Comercial**
¿Necesitas usar BambuLuc en un proyecto comercial?
¡Obtén una licencia comercial personalizada!
### 🎯 **¿Cuándo necesitas licencia comercial?**
- ✅ Uso en productos o servicios comerciales
- ✅ Integración en software comercial
- ✅ Aplicaciones que generan ingresos
- ✅ Uso por empresas con fines comerciales
- ✅ **Cuando uses BambuLuc comercialmente**
### 🏆 **Beneficios de la Licencia Comercial**
- ✅ **Sin restricciones** de uso comercial
- ✅ **Soporte prioritario** y personalizado
- ✅ **Funcionalidades exclusivas** para enterprise
- ✅ **Sin atribución requerida** en productos finales
- ✅ **Términos flexibles** adaptados a tu negocio
- ✅ **Actualizaciones garantizadas** durante vigencia
### 💰 **Precios Flexibles**
- **Startups**: Tarifas especiales para empresas emergentes
- **PYMES**: Precios competitivos para pequeñas y medianas empresas
- **Enterprise**: Licencias corporativas con descuentos por volumen
- **Organizaciones**: Condiciones especiales según el tamaño y uso
### 🏢 **Importante para Empresas**
Cualquier empresa que desee usar BambuLuc para fines comerciales debe obtener una licencia comercial y pagar royalties.
[🤝 Solicitar Licencia Comercial](https://github.com/AngelBarbero/bambuluc/issues/new?labels=commercial-license&template=commercial-license.md)
---
**Desarrollado con ❤️ por [Angel Luis Barbero Guerras](https://github.com/AngelBarbero)**
**¡Hecho para la comunidad de impresión 3D!**
### ⚖️ **Aviso Legal**
BambuLuc es una marca registrada de Angel Luis Barbero Guerras.
Todos los derechos reservados. Uso comercial requiere licencia.
Raw data
{
"_id": null,
"home_page": "https://github.com/AngelBarbero/bambuluc",
"name": "bambuluc",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "bambu lab 3d printer mqtt ftp ssl control automation manufacturing",
"author": "Angel Luis Barbero Guerras",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/5c/eb/884ec133213cbe73613c2e65a67e4e91b93e1dae0a7d945e5ea12541a35e/bambuluc-1.0.3.tar.gz",
"platform": null,
"description": "# BambuLuc \ud83d\udda8\ufe0f\r\n\r\n[](https://www.python.org/downloads/)\r\n[](LICENSE)\r\n[](https://github.com/AngelBarbero/bambuluc)\r\n[](https://pypi.org/project/bambuluc/)\r\n\r\n**Librer\u00eda completa para control de impresoras Bambu Lab** con soporte para archivos grandes, monitoreo en tiempo real y configuraci\u00f3n anti-SD.\r\n\r\n**Desarrollada por Angel Luis Barbero Guerras**\r\n\r\n## \ud83d\ude80 **Caracter\u00edsticas**\r\n\r\n- \u2705 **Socket directo** - Env\u00edo de archivos grandes sin problemas\r\n- \u2705 **Comunicacion** - Comunicaci\u00f3n en tiempo real\r\n- \u2705 **Configuraci\u00f3n anti-SD** - Evita errores de tarjeta SD\r\n- \u2705 **Monitoreo completo** - Estado, progreso, temperaturas\r\n- \u2705 **M\u00faltiples impresoras** - Gesti\u00f3n de varias impresoras\r\n- \u2705 **Callbacks personalizables** - Eventos y notificaciones\r\n- \u2705 **Context manager** - Gesti\u00f3n autom\u00e1tica de conexiones\r\n- \u2705 **Logging integrado** - Depuraci\u00f3n y seguimiento\r\n- \u2705 **Type hints** - Mejor desarrollo y mantenimiento\r\n\r\n## \ud83d\udce6 **Instalaci\u00f3n**\r\n\r\n```bash\r\n# Instalar desde PyPI\r\npip install bambuluc\r\n\r\n## \ud83c\udfaf **Uso B\u00e1sico**\r\n\r\n```python\r\nfrom bambuluc import BambuLabPrinter\r\n\r\n# Configuraci\u00f3n\r\nPRINTER_IP = \"ip_impresora\"\r\nACCESS_CODE = \"Access_code\" # C\u00f3digo de acceso de la impresora\r\nDEVICE_ID = \"device_id\" # ID del dispositivo\r\n\r\n# Crear instancia\r\nprinter = BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID)\r\n\r\n# Conectar\r\nif printer.connect():\r\n # Enviar archivo\r\n success = printer.send_file(\"mi_archivo.gcode.3mf\", auto_start=False)\r\n \r\n if success:\r\n print(\"\u2705 Archivo enviado exitosamente\")\r\n \r\n # Desconectar\r\n printer.disconnect()\r\n```\r\n\r\n## \ud83d\udd27 **Uso Avanzado**\r\n\r\n### **Con Context Manager**\r\n```python\r\nwith BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:\r\n # Callbacks\r\n def on_upload_progress(bytes_sent, total_bytes):\r\n progress = (bytes_sent / total_bytes) * 100\r\n print(f\"\ud83d\udce4 Subida: {progress:.1f}%\")\r\n \r\n def on_file_progress(event, data):\r\n print(f\"\ud83d\udcc1 {event}: {data}\")\r\n \r\n # Configurar callbacks\r\n printer.on_file_progress = on_file_progress\r\n \r\n # Enviar archivo con progreso\r\n success = printer.send_file(\r\n \"archivo_grande.gcode.3mf\",\r\n auto_start=False,\r\n use_ams=True,\r\n bed_leveling=True,\r\n progress_callback=on_upload_progress\r\n )\r\n```\r\n\r\n### **Monitoreo Continuo**\r\n```python\r\n# Callbacks de estado\r\ndef on_status_change(new_stage, old_stage):\r\n print(f\"\ud83d\udd04 Estado: {old_stage} \u2192 {new_stage}\")\r\n\r\ndef on_print_complete():\r\n print(\"\ud83c\udf89 \u00a1Impresi\u00f3n terminada!\")\r\n\r\n# Configurar\r\nprinter.on_status_change = on_status_change\r\nprinter.on_print_complete = on_print_complete\r\n\r\n# Iniciar monitoreo\r\nprinter.start_monitoring()\r\n\r\n# Obtener estado\r\nstatus = printer.get_status()\r\nprint(f\"Estado: {status.stage}\")\r\nprint(f\"Progreso: {status.progress}%\")\r\nprint(f\"Capa: {status.layer_num}/{status.total_layers}\")\r\nprint(f\"Tiempo restante: {status.remaining_time}s\")\r\n```\r\n\r\n### **M\u00faltiples Impresoras**\r\n```python\r\nfrom bambuluc import BambuLabManager\r\n\r\n# Crear gestor\r\nmanager = BambuLabManager()\r\n\r\n# Agregar impresoras\r\nprinter1 = manager.add_printer(\"Salon\", \"ip_impresora\", \"access_code\", \"device_id\")\r\nprinter2 = manager.add_printer(\"Taller\", \"ip_imporesora\", \"acces_code\", \"device_id\")\r\n\r\n# Conectar todas\r\nresults = manager.connect_all()\r\n\r\n# Enviar archivo a impresora espec\u00edfica\r\nprinter = manager.get_printer(\"Salon\")\r\nif printer:\r\n printer.send_file(\"archivo.gcode.3mf\")\r\n\r\n# Obtener estado de todas\r\nall_status = manager.get_all_status()\r\nfor name, status in all_status.items():\r\n print(f\"{name}: {status.stage} - {status.progress}%\")\r\n```\r\n\r\n## \ud83c\udf9b\ufe0f **Control de Impresi\u00f3n**\r\n\r\n```python\r\n# Iniciar impresi\u00f3n\r\nprinter.start_print()\r\n\r\n# Pausar impresi\u00f3n\r\nprinter.pause_print()\r\n\r\n# Detener impresi\u00f3n\r\nprinter.stop_print()\r\n\r\n# Verificar estado\r\nif printer.is_printing():\r\n print(\"\ud83d\udda8\ufe0f Imprimiendo...\")\r\n\r\n# Obtener progreso\r\nprogress = printer.get_progress()\r\nprint(f\"Progreso: {progress}%\")\r\n```\r\n\r\n## \ud83d\udcca **Informaci\u00f3n de Estado**\r\n\r\n```python\r\nstatus = printer.get_status()\r\n\r\n# Estado general\r\nprint(f\"Etapa: {status.stage}\")\r\nprint(f\"Estado GCode: {status.gcode_state}\")\r\nprint(f\"Progreso: {status.progress}%\")\r\n\r\n# Capas\r\nprint(f\"Capa actual: {status.layer_num}\")\r\nprint(f\"Total capas: {status.total_layers}\")\r\n\r\n# Tiempo\r\nprint(f\"Tiempo restante: {status.remaining_time}s\")\r\n\r\n# Temperaturas (actuales y objetivo)\r\nprint(f\"Cama: {status.bed_temp}\u00b0C \u2192 {status.bed_temp_target}\u00b0C\")\r\nprint(f\"Nozzle: {status.nozzle_temp}\u00b0C \u2192 {status.nozzle_temp_target}\u00b0C\")\r\nprint(f\"C\u00e1mara: {status.chamber_temp}\u00b0C \u2192 {status.chamber_temp_target}\u00b0C\")\r\n\r\n# Informaci\u00f3n de temperaturas detallada\r\ntemp_info = printer.get_temperature_info()\r\nheating = printer.is_heating()\r\nprint(f\"Cama calentando: {heating['bed']}\")\r\nprint(f\"Nozzle calentando: {heating['nozzle']}\")\r\n\r\n# Velocidades\r\nprint(f\"Velocidad impresi\u00f3n: {status.print_speed}%\")\r\nprint(f\"Velocidad ventilador: {status.fan_speed}%\")\r\n\r\n# Conectividad\r\nprint(f\"Se\u00f1al WiFi: {status.wifi_signal}%\")\r\n\r\n# Archivo actual\r\nprint(f\"Archivo: {status.current_file}\")\r\nprint(f\"Tama\u00f1o: {status.file_size} bytes\")\r\n\r\n# Informaci\u00f3n de c\u00e1mara\r\ncamera_info = printer.get_camera_info()\r\nif camera_info['available']:\r\n print(f\"\ud83d\udcf8 C\u00e1mara disponible: {camera_info['url']}\")\r\n print(f\"Grabando: {camera_info['recording']}\")\r\n print(f\"Timelapse: {camera_info['timelapse']}\")\r\n \r\n # Obtener imagen\r\n image_data = printer.get_camera_image()\r\n if image_data:\r\n print(f\"Imagen obtenida: {len(image_data)} bytes\")\r\n \r\n # Guardar imagen\r\n if printer.save_camera_image(\"impresora.jpg\"):\r\n print(\"\ud83d\udcf8 Imagen guardada como 'impresora.jpg'\")\r\n\r\n# Informaci\u00f3n de filamento\r\nfilament = printer.get_filament_info()\r\nif filament:\r\n print(f\"Filamento: {filament.type} - {filament.color}\")\r\n print(f\"Marca: {filament.brand}\")\r\n print(f\"Temperatura: {filament.temperature}\u00b0C\")\r\n print(f\"Restante: {filament.remaining}%\")\r\n\r\n# Informaci\u00f3n del AMS\r\nams_info = printer.get_ams_info()\r\nfor i, ams in enumerate(ams_info):\r\n print(f\"AMS {i}: {ams.filament.type} - {ams.status}\")\r\n```\r\n\r\n### **C\u00e1mara y Monitoreo Visual**\r\n\r\n```python\r\n# Verificar disponibilidad de c\u00e1mara\r\ncamera_info = printer.get_camera_info()\r\nif camera_info['available']:\r\n print(\"\ud83d\udcf8 C\u00e1mara disponible\")\r\n \r\n # Obtener imagen actual\r\n image_data = printer.get_camera_image()\r\n if image_data:\r\n print(f\"Imagen obtenida: {len(image_data)} bytes\")\r\n \r\n # Guardar imagen con timestamp\r\n from datetime import datetime\r\n timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\r\n filename = f\"captura_{timestamp}.jpg\"\r\n \r\n if printer.save_camera_image(filename):\r\n print(f\"\ud83d\udcf8 Imagen guardada: {filename}\")\r\n \r\n # Monitoreo continuo con capturas\r\n import time\r\n for i in range(10):\r\n if printer.save_camera_image(f\"progreso_{i:02d}.jpg\"):\r\n print(f\"\ud83d\udcf8 Captura {i+1}/10 guardada\")\r\n time.sleep(30) # Cada 30 segundos\r\n```\r\n\r\n### **Informaci\u00f3n Detallada**\r\n\r\n```python\r\n# Obtener toda la informaci\u00f3n en un diccionario\r\ndetailed_info = printer.get_detailed_status()\r\n\r\n# Informaci\u00f3n de archivo actual\r\nfile_info = printer.get_current_file_info()\r\nprint(f\"Archivo: {file_info['name']}\")\r\nprint(f\"Progreso: {file_info['progress']}%\")\r\nprint(f\"Capa: {file_info['layer']}\")\r\nprint(f\"Tiempo restante: {file_info['remaining_time']}s\")\r\n```\r\n\r\n## \ud83d\udd27 **Configuraci\u00f3n Avanzada**\r\n\r\n### **Par\u00e1metros de Env\u00edo**\r\n```python\r\nsuccess = printer.send_file(\r\n \"archivo.gcode.3mf\",\r\n auto_start=False, # No iniciar autom\u00e1ticamente\r\n use_ams=True, # Usar AMS si disponible\r\n bed_leveling=True, # Realizar nivelaci\u00f3n\r\n progress_callback=None # Callback de progreso\r\n)\r\n```\r\n\r\n### **Configuraci\u00f3n Anti-SD**\r\nLa librer\u00eda autom\u00e1ticamente usa configuraci\u00f3n anti-SD para evitar errores:\r\n```python\r\n# Configuraci\u00f3n autom\u00e1tica\r\n\"sdcard\": False, # NO usar configuracion tarjeta SD\r\n\"storage\": \"internal\", # Forzar memoria interna sd\r\n```\r\n\r\n## \ud83d\udc1b **Manejo de Errores**\r\n\r\n```python\r\nimport logging\r\n\r\n# Configurar logging\r\nlogging.basicConfig(level=logging.INFO)\r\n\r\ntry:\r\n with BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:\r\n # Callbacks de error\r\n def on_error(error_type, error_message):\r\n print(f\"\u274c Error {error_type}: {error_message}\")\r\n \r\n printer.on_error = on_error\r\n \r\n # Operaciones...\r\n success = printer.send_file(\"archivo.gcode.3mf\")\r\n \r\nexcept Exception as e:\r\n print(f\"\u274c Error general: {e}\")\r\n```\r\n\r\n## \ud83d\udccb **Eventos y Callbacks**\r\n\r\n### **Callbacks Disponibles**\r\n```python\r\n# Estado de impresi\u00f3n\r\nprinter.on_status_change = lambda new, old: print(f\"Estado: {new}\")\r\n\r\n# Progreso de archivo\r\nprinter.on_file_progress = lambda event, data: print(f\"Archivo: {event}\")\r\n\r\n# Impresi\u00f3n terminada\r\nprinter.on_print_complete = lambda: print(\"\u00a1Terminado!\")\r\n\r\n# Errores\r\nprinter.on_error = lambda type, msg: print(f\"Error: {msg}\")\r\n```\r\n\r\n### **Eventos de Archivo**\r\n- `accepted` - Archivo aceptado por impresora\r\n- `preparing` - Preparando archivo (con porcentaje)\r\n- `prepared` - Archivo preparado y listo\r\n\r\n### **Estados de Impresi\u00f3n**\r\n- `idle` - Inactiva\r\n- `prepare` - Preparando\r\n- `printing` - Imprimiendo\r\n- `pause` - Pausada\r\n- `finish` - Terminada\r\n- `error` - Error\r\n\r\n## \ud83d\udee0\ufe0f **Utilidades**\r\n\r\n```python\r\nfrom bambu_lab_library import calculate_md5, format_time, format_size\r\n\r\n# Calcular MD5\r\nmd5 = calculate_md5(\"archivo.gcode.3mf\")\r\n\r\n# Formatear tiempo\r\ntime_str = format_time(3665) # \"1h 1m 5s\"\r\n\r\n# Formatear tama\u00f1o\r\nsize_str = format_size(7030927) # \"6.7 MB\"\r\n```\r\n\r\n## \ud83d\udd0d **Depuraci\u00f3n**\r\n\r\n```python\r\nimport logging\r\n\r\n# Nivel de logging\r\nlogging.getLogger('bambu_lab_library').setLevel(logging.DEBUG)\r\n\r\n# Ver comunicaci\u00f3n MQTT\r\nlogging.getLogger('paho.mqtt').setLevel(logging.DEBUG)\r\n```\r\n\r\n## \ud83d\udccb **Requisitos**\r\n\r\n- Python 3.7+\r\n- paho-mqtt >= 1.6.0\r\n\r\n## \ud83d\udea8 **Problemas Conocidos**\r\n\r\n### **Error de Tarjeta SD**\r\nSi obtienes errores de tarjeta SD, la librer\u00eda autom\u00e1ticamente usa configuraci\u00f3n anti-SD:\r\n```python\r\n# Autom\u00e1ticamente aplicado\r\n\"sdcard\": False,\r\n\"storage\": \"internal\"\r\n```\r\n\r\n### **Timeout de Conexi\u00f3n**\r\n```python\r\n# Aumentar timeout\r\nprinter.connect(timeout=60)\r\n```\r\n\r\n### **Archivos Grandes**\r\nLa librer\u00eda usa socket directo, no hay l\u00edmite de tama\u00f1o:\r\n```python\r\n# Funciona con archivos de cualquier tama\u00f1o\r\nsuccess = printer.send_file(\"archivo_muy_grande.gcode.3mf\")\r\n```\r\n\r\n## \ud83e\udd1d **Contribuir**\r\n\r\n1. Fork el proyecto\r\n2. Crear rama feature (`git checkout -b feature/AmazingFeature`)\r\n3. Commit cambios (`git commit -m 'Add AmazingFeature'`)\r\n4. Push a rama (`git push origin feature/AmazingFeature`)\r\n5. Abrir Pull Request\r\n\r\n## \ud83d\udcc4 **Licencia**\r\n\r\n**BambuLuc** est\u00e1 licenciado bajo una **Licencia Comercial Personalizada** .\r\n\r\n### \ud83c\udfaf **Resumen de Licencia**\r\n\r\n**\u2705 USO GRATUITO PERMITIDO:**\r\n- \ud83c\udf93 Uso personal, educativo y de investigaci\u00f3n\r\n- \ud83d\udc68\u200d\ud83d\udcbb Desarrollo y pruebas personales\r\n- \ud83d\udcda Fines acad\u00e9micos y de aprendizaje\r\n\r\n**\u274c USO COMERCIAL PROHIBIDO SIN LICENCIA:**\r\n- \ud83c\udfe2 Uso en empresas para fines comerciales\r\n- \ud83d\udcb0 Productos o servicios que generen ingresos\r\n- \ud83d\udd27 Integraci\u00f3n en software comercial\r\n- \ufffd Uso en producci\u00f3n comercial\r\n\r\n### \ud83c\udfe2 **Provisi\u00f3n para Empresas**\r\n\r\nTodas las empresas que deseen usar BambuLuc para fines comerciales deben obtener una licencia comercial y pagar royalties seg\u00fan los t\u00e9rminos establecidos por el autor.\r\n\r\n### \ud83d\udcb0 **Estructura de Royalties**\r\n\r\nLos royalties se determinan caso por caso considerando:\r\n- \ud83d\udcca Tama\u00f1o de la organizaci\u00f3n\r\n- \ud83d\udd0d Alcance del uso\r\n- \ud83d\udcb5 Ingresos generados\r\n- \ud83d\udc65 N\u00famero de usuarios/instalaciones\r\n- \ud83c\udfaf Valor estrat\u00e9gico\r\n\r\n### \ud83d\udcde **Contacto para Licencia Comercial**\r\n\r\n- \ud83d\udc1b GitHub Issues: [Solicitar Licencia Comercial](https://github.com/AngelBarbero/bambuluc/issues)\r\n- \ud83d\udcbc Crear issue con label \"Commercial License Request\"\r\n\r\n## \ud83d\udcde **Soporte**\r\n\r\n- \ud83d\udc1b Issues: [GitHub Issues](https://github.com/AngelBarbero/bambuluc/issues)\r\n- \ud83d\udcb0 Licencia Comercial: [Contactar](https://github.com/AngelBarbero/bambuluc/issues)\r\n- \ud83d\udc96 Sponsorship: [GitHub Sponsors](https://github.com/sponsors/AngelBarbero)\r\n- \ud83d\udcd6 Documentaci\u00f3n: [ReadTheDocs](https://bambuluc.readthedocs.io/)\r\n\r\n## \ud83c\udfc6 **Reconocimientos**\r\n\r\n- Bambu Lab por crear impresoras\r\n- Comunidad de desarrolladores Python\r\n\r\n## \ud83d\udcbc **Licencia Comercial**\r\n\r\n\u00bfNecesitas usar BambuLuc en un proyecto comercial? \r\n\u00a1Obt\u00e9n una licencia comercial personalizada!\r\n\r\n### \ud83c\udfaf **\u00bfCu\u00e1ndo necesitas licencia comercial?**\r\n- \u2705 Uso en productos o servicios comerciales\r\n- \u2705 Integraci\u00f3n en software comercial\r\n- \u2705 Aplicaciones que generan ingresos\r\n- \u2705 Uso por empresas con fines comerciales\r\n- \u2705 **Cuando uses BambuLuc comercialmente**\r\n\r\n### \ud83c\udfc6 **Beneficios de la Licencia Comercial**\r\n- \u2705 **Sin restricciones** de uso comercial\r\n- \u2705 **Soporte prioritario** y personalizado\r\n- \u2705 **Funcionalidades exclusivas** para enterprise\r\n- \u2705 **Sin atribuci\u00f3n requerida** en productos finales\r\n- \u2705 **T\u00e9rminos flexibles** adaptados a tu negocio\r\n- \u2705 **Actualizaciones garantizadas** durante vigencia\r\n\r\n### \ud83d\udcb0 **Precios Flexibles**\r\n- **Startups**: Tarifas especiales para empresas emergentes\r\n- **PYMES**: Precios competitivos para peque\u00f1as y medianas empresas\r\n- **Enterprise**: Licencias corporativas con descuentos por volumen\r\n- **Organizaciones**: Condiciones especiales seg\u00fan el tama\u00f1o y uso\r\n\r\n### \ud83c\udfe2 **Importante para Empresas**\r\nCualquier empresa que desee usar BambuLuc para fines comerciales debe obtener una licencia comercial y pagar royalties.\r\n\r\n[\ud83e\udd1d Solicitar Licencia Comercial](https://github.com/AngelBarbero/bambuluc/issues/new?labels=commercial-license&template=commercial-license.md)\r\n\r\n---\r\n\r\n**Desarrollado con \u2764\ufe0f por [Angel Luis Barbero Guerras](https://github.com/AngelBarbero)** \r\n**\u00a1Hecho para la comunidad de impresi\u00f3n 3D!**\r\n\r\n### \u2696\ufe0f **Aviso Legal**\r\nBambuLuc es una marca registrada de Angel Luis Barbero Guerras. \r\nTodos los derechos reservados. Uso comercial requiere licencia.\r\n",
"bugtrack_url": null,
"license": "Custom Commercial License",
"summary": "\ud83d\udda8\ufe0f Librer\u00eda completa para control de impresoras Bambu Lab",
"version": "1.0.3",
"project_urls": {
"Bug Reports": "https://github.com/AngelBarbero/bambuluc/issues",
"Documentation": "https://bambuluc.readthedocs.io/",
"Funding": "https://github.com/sponsors/AngelBarbero",
"Homepage": "https://github.com/AngelBarbero/bambuluc",
"Source": "https://github.com/AngelBarbero/bambuluc"
},
"split_keywords": [
"bambu",
"lab",
"3d",
"printer",
"mqtt",
"ftp",
"ssl",
"control",
"automation",
"manufacturing"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "343a4c0e637c0d1fbca782f933c90f923195f0e62e4e3417d89b2213f061f957",
"md5": "dff4efc113d6a867e9740682dcb3dffc",
"sha256": "9a2ed434da1909aaf621569bd15da8a5e8da6dc45a57242cd808ae644dc09d9a"
},
"downloads": -1,
"filename": "bambuluc-1.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dff4efc113d6a867e9740682dcb3dffc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 24650,
"upload_time": "2025-07-18T09:34:22",
"upload_time_iso_8601": "2025-07-18T09:34:22.349733Z",
"url": "https://files.pythonhosted.org/packages/34/3a/4c0e637c0d1fbca782f933c90f923195f0e62e4e3417d89b2213f061f957/bambuluc-1.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5ceb884ec133213cbe73613c2e65a67e4e91b93e1dae0a7d945e5ea12541a35e",
"md5": "e083345bd72edc9df50c8030fc6d1985",
"sha256": "8454cc5ecd89840be06ed1a652ebbfa354632d40621e1f5a7f290e8bcd591391"
},
"downloads": -1,
"filename": "bambuluc-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "e083345bd72edc9df50c8030fc6d1985",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 25305,
"upload_time": "2025-07-18T09:34:23",
"upload_time_iso_8601": "2025-07-18T09:34:23.284388Z",
"url": "https://files.pythonhosted.org/packages/5c/eb/884ec133213cbe73613c2e65a67e4e91b93e1dae0a7d945e5ea12541a35e/bambuluc-1.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-18 09:34:23",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "AngelBarbero",
"github_project": "bambuluc",
"github_not_found": true,
"lcname": "bambuluc"
}