bambuluc


Namebambuluc JSON
Version 1.0.3 PyPI version JSON
download
home_pagehttps://github.com/AngelBarbero/bambuluc
Summary🖨️ Librería completa para control de impresoras Bambu Lab
upload_time2025-07-18 09:34:23
maintainerNone
docs_urlNone
authorAngel Luis Barbero Guerras
requires_python>=3.7
licenseCustom Commercial License
keywords bambu lab 3d printer mqtt ftp ssl control automation manufacturing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # BambuLuc 🖨️

[![Python](https://img.shields.io/badge/python-3.7+-blue.svg)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/license-Custom%20Commercial-red.svg)](LICENSE)
[![Version](https://img.shields.io/badge/version-1.0.3-orange.svg)](https://github.com/AngelBarbero/bambuluc)
[![PyPI](https://img.shields.io/badge/pypi-bambuluc-green.svg)](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[![Python](https://img.shields.io/badge/python-3.7+-blue.svg)](https://www.python.org/downloads/)\r\n[![License](https://img.shields.io/badge/license-Custom%20Commercial-red.svg)](LICENSE)\r\n[![Version](https://img.shields.io/badge/version-1.0.3-orange.svg)](https://github.com/AngelBarbero/bambuluc)\r\n[![PyPI](https://img.shields.io/badge/pypi-bambuluc-green.svg)](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"
}
        
Elapsed time: 2.04840s