# 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.2.0-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 **¡IMPRESIÓN AUTOMÁTICA!**

**Desarrollada por Angel Luis Barbero Guerras**

## 🎉 **¡NUEVO EN v1.2.0!**

### ✨ **IMPRESIÓN AUTOMÁTICA**
¡Primera librería que permite iniciar impresiones automáticamente sin tocar la pantalla!

### ✨ **CONFIGURACIÓN AMS** 
Setup automático de filamentos y configuraciones AMS

### ✨ **PROCESO COMPLETO**
De archivo local a impresión iniciada en una sola función

## 🚀 **Características**

- ✅ **Socket directo** - Envío de archivos grandes sin problemas
- ✅ **Comunicación ** - Comunicación en tiempo real
- ✅ **Impresión automática avanzada** - Sin intervención manual necesaria
- ✅ **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
- 🎯 **¡IMPRESIÓN AUTOMÁTICA!** - Inicia impresiones sin intervención manual
- 🎨 **Configuración AMS** - Setup automático de filamentos

## 📦 **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()
```

## 🎉 **¡NUEVAS FUNCIONALIDADES v1.2.0!**

### **🚀 Impresión Automática**
```python
from bambuluc import BambuLuc

# Conectar
bambu = BambuLuc("192.168.1.100", "12345678", "SERIAL123")

# ¡Iniciar impresión automáticamente!
success = bambu.start_print_auto(
    filename="mi_modelo.3mf",              # Archivo en la impresora
    plate_gcode="Metadata/plate_1.gcode",  # Placa específica
    use_ams=True,                          # Usar AMS
    bed_type="textured_plate"              # Tipo de cama
)

if success:
    print("🎉 ¡Impresión iniciada automáticamente!")
```

### **🎨 Configuración AMS**
```python
# Configurar filamento en AMS
bambu.configure_ams_filament(
    ams_id=0,                # AMS principal
    tray_id=0,               # Primera bandeja
    filament_type="PLA",     # Tipo de filamento
    color="FF0000FF",        # Rojo (RRGGBBAA)
    temp_min=190,            # Temperatura mínima
    temp_max=230             # Temperatura máxima
)
```

### **🏆 Proceso Completo Premium**
```python
# ¡Todo en una función!
success = bambu.upload_and_print_auto(
    file_path="C:/modelos/figura.3mf",    # Archivo local
    use_ams=True,                         # Configurar AMS
    ams_config={                          # Configuración AMS
        "ams_id": 0,
        "tray_id": 0,
        "filament_type": "PLA",
        "color": "00FF00FF"
    },
    progress_callback=lambda s,t: print(f"📤 {(s/t)*100:.1f}%")
)

if success:
    print("🎊 ¡Archivo subido e impresión iniciada automáticamente!")
```

## 🔧 **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
)
```

### **� Tecnología Propietaria de Impresión Automática**
BambuLuc utiliza algoritmos propietarios avanzados para lograr impresión automática:
```python
# La librería maneja automáticamente toda la configuración interna
# No necesitas configurar nada manualmente
printer.upload_and_print_auto("archivo.3mf")  # ¡Simplemente funciona!
```

## 🐛 **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**

### **� Impresión Automática Propietaria**
BambuLuc es la ÚNICA librería que logra impresión automática real:
```python
# Tecnología propietaria - funciona automáticamente
await printer.upload_and_print_auto("archivo.3mf")
# ¡No necesitas configurar nada más!
```

### **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.
