đŸ€– Surveillance Intelligente d'Imprimante 3D avec IA Gemini

Version Corrigée - 05/11/2025 (15h00)

Description

SystĂšme de surveillance automatique d’imprimante 3D utilisant l’IA Google Gemini pour dĂ©tecter les problĂšmes d’impression en temps rĂ©el. Le script analyse des captures d’écran toutes les 5 minutes pendant l’impression et vous alerte instantanĂ©ment en cas de dĂ©tection d’anomalies (spaghetti, warping, dĂ©tachement, sous/sur-extrusion, etc.).

Fonctionnalités principales

:white_check_mark: Analyse IA automatique toutes les 5 minutes pendant l’impression
:camera_with_flash: Détection des problÚmes courants (spaghetti, warping, détachement, extrusion)
:mobile_phone: Notifications mobiles avec image et actions rapides (pause/arrĂȘt)
:bar_chart: Statistiques par impression (nombre d’analyses, problĂšmes dĂ©tectĂ©s)
:bullseye: Notifications de dĂ©but, fin et pause d’impression avec photos

Prérequis

  • Home Assistant avec intĂ©gration Bambu Lab

  • Extension Google Generative AI Conversation configurĂ©e avec Gemini

  • Application mobile Home Assistant

  • CamĂ©ra de l’imprimante accessible


:clipboard: Mode d’emploi et personnalisation

1 - Entités à personnaliser

Remplacez les entités suivantes par celles de votre imprimante :


Entité à remplacer Votre entité Description
sensor.3d_imprimante_bambu_p1s_etape_actuelle sensor.VOTRE_IMPRIMANTE_etape_actuelle Statut de l’imprimante
camera.3d_imprimante_bambu_p1s_camera camera.VOTRE_IMPRIMANTE_camera CamĂ©ra de l’imprimante
sensor.3d_imprimante_bambu_p1s_nom_de_la_tache sensor.VOTRE_IMPRIMANTE_nom_de_la_tache Nom du fichier en impression
button.3d_imprimante_bambu_p1s_arreter_l_impression button.VOTRE_IMPRIMANTE_arreter Bouton d’arrĂȘt
button.3d_imprimante_bambu_p1s_mettre_en_pause_l_impression button.VOTRE_IMPRIMANTE_pause Bouton de pause

Exemple pour BambuLab A1 :

  • sensor.bambulaba1_etape_actuelle

  • camera.bambulaba1_camera


2 - Service de notification

Remplacez notify.mobile_app_tel_mm par votre service de notification :

  • notify.mobile_app_VOTRE_TELEPHONE (iPhone/Android)

  • Ou votre service de notification prĂ©fĂ©rĂ©

Comment trouver votre service :

  1. Outils de dĂ©veloppement → Services

  2. Cherchez notify.mobile_app_

  3. Notez le nom complet (ex: notify.mobile_app_s25)


3 - Configuration de l’IA Gemini :warning: SECTION CORRIGÉE

Il existe 2 mĂ©thodes pour configurer l’appel Ă  Gemini. Choisissez celle qui fonctionne avec votre installation.

Méthode A : Utilisation de agent_id (recommandée)

  1. Trouver votre agent_id :

    • Allez dans ParamĂštres → Appareils et services

    • Cherchez Google Generative AI Conversation

    • Cliquez dessus, notez l’identifiant affichĂ© (ex: conversation.gemini_1_5_flash)

  2. Modifier le fichier YAML à la ligne de l’action ai_task.generate_data :

- action: ai_task.generate_data
  data:
    agent_id: conversation.gemini_1_5_flash  # ← Remplacez par VOTRE agent_id
    prompt: "Tu es un expert en impression 3D..."
    filenames:
      - /config/www/p1s_ai_check.jpg
  response_variable: gemini_response
  1. Format de la réponse : Utilisez gemini_response.text

Méthode B : Utilisation de entity_id (alternative testée sur A1)

Si la méthode A ne fonctionne pas, utilisez cette syntaxe :

- action: ai_task.generate_data
  data:
    entity_id: ai_task.google_ai_task  # ← Entity ID de l'AI Task
    task_name: Analyse de l'image 3D
    instructions: "Tu es un expert en impression 3D. Analyse cette image..."
    attachments:
      media_content_id: media-source://camera/camera.VOTRE_IMPRIMANTE_camera
      media_content_type: image/jpeg
  response_variable: gemini_response

:warning: IMPORTANT : Avec la Méthode B, remplacez AUSSI :

Dans toutes les actions qui utilisent la réponse Gemini :

Remplacez :

value: "{{ gemini_response.text }}"
message: "{{ gemini_response.text }}"

par :

value: "{{ gemini_response.data }}"
message: "{{ gemini_response.data }}"

Et la condition :

value_template: "{{ 'OK' not in gemini_response.text }}"

Par :

value_template: "{{ 'OK' not in gemini_response.data }}"

4 - FrĂ©quence d’analyse (optionnel)

Par dĂ©faut, l’analyse se dĂ©clenche toutes les 5 minutes. Pour modifier :

trigger:
  - trigger: time_pattern
    minutes: "/5"  # ← Changez (ex: "/10" pour 10 min, "/3" pour 3 min)

5 - Personnalisation du prompt IA (optionnel)

Vous pouvez adapter le prompt pour ajuster la sensibilitĂ© ou ajouter des dĂ©tections spĂ©cifiques dans l’automatisation principale.


:rocket: Installation

  1. Créez le fichier : /config/packages/pkg_google_gemini_imp_3d.yaml

  2. Copiez le code complet (ci-dessous)

  3. Personnalisez les entités selon votre configuration

  4. Choisissez la MĂ©thode A ou B pour l’appel Gemini

  5. Redémarrez Home Assistant

  6. Testez avec une impression !


:bar_chart: Entités créées

Le package crée automatiquement :

  • input_number.gemini_analyses_current_print - Compteur d’analyses

  • input_number.gemini_problemes_current_print - Compteur de problĂšmes

  • input_text.gemini_last_response - DerniĂšre rĂ©ponse de l’IA

  • input_text.gemini_current_print_name - Nom de l’impression en cours

  • input_datetime.gemini_last_check - Horodatage de la derniĂšre vĂ©rification

  • sensor.imprimante_3d_statut_lisible - Statut en français


:page_facing_up: Code complet - VERSION CORRIGÉE

# ========================================
# PACKAGE : Surveillance Imprimante 3D + Gemini
# FICHIER : /config/packages/pkg_google_gemini_imp_3d.yaml
# VERSION : 2.0 - CORRIGÉE
# ========================================

# ========================================
# INPUT HELPERS (stockage infos par impression)
# ========================================
input_number:
  gemini_analyses_current_print:
    name: "Gemini - Analyses (impression actuelle)"
    min: 0
    max: 1000
    step: 1
    icon: mdi:counter
    
  gemini_problemes_current_print:
    name: "Gemini - ProblÚmes détectés"
    min: 0
    max: 100
    step: 1
    icon: mdi:alert-circle

input_text:
  gemini_last_response:
    name: "Gemini - DerniÚre réponse"
    max: 255
    icon: mdi:message-text
    
  gemini_current_print_name:
    name: "Gemini - Nom impression"
    max: 100
    icon: mdi:printer-3d

input_datetime:
  gemini_last_check:
    name: "Gemini - DerniÚre vérification"
    has_date: true
    has_time: true

# ========================================
# AUTOMATISATIONS
# ========================================
automation:
  # ========================================
  # AUTOMATISATION PRINCIPALE - SURVEILLANCE IA
  # ⚠ CHOISISSEZ LA MÉTHODE A OU B CI-DESSOUS
  # ========================================
  
  - alias: "🔍 Surveillance Impression 3D - IA Gemini"
    id: p1s_ai_monitoring_gemini
    trigger:
      - trigger: time_pattern
        minutes: "/5"
    condition:
      - condition: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        state: "printing"
    action:
      # Capture de l'image
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_ai_check.jpg
      
      - delay: {seconds: 2}
      
      # Incrémentation du compteur d'analyses
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_analyses_current_print
        data:
          value: "{{ states('input_number.gemini_analyses_current_print') | float + 1 }}"
      
      # ========================================
      # MÉTHODE A : Utilisation de agent_id
      # ========================================
      - action: ai_task.generate_data
        data:
          agent_id: conversation.gemini_1_5_flash  # ← REMPLACER par votre agent_id
          prompt: "Tu es un expert en impression 3D. Analyse cette image d'une imprimante 3D en cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée), warping (coins décollés), détachement du plateau, sous-extrusion (lignes fines), sur-extrusion (trop de plastique), problÚme de premiÚre couche. Si TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un problÚme, réponds 'PROBLÈME: [description courte en une phrase]'."
          filenames:
            - /config/www/p1s_ai_check.jpg
        response_variable: gemini_response
      
      # ========================================
      # MÉTHODE B (Alternative) : Utilisation de entity_id
      # ⚠ Si vous utilisez la MĂ©thode B :
      # 1. Commentez le bloc MÉTHODE A ci-dessus (ajoutez # devant chaque ligne)
      # 2. Décommentez le bloc ci-dessous (enlevez le # devant chaque ligne)
      # 3. Remplacez gemini_response.text par gemini_response.data PARTOUT
      # ========================================
      
      # - action: ai_task.generate_data
      #   data:
      #     entity_id: ai_task.google_ai_task
      #     task_name: Analyse de l'image 3D
      #     instructions: "Tu es un expert en impression 3D. Analyse cette image d'une imprimante 3D en cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée), warping (coins décollés), détachement du plateau, sous-extrusion (lignes fines), sur-extrusion (trop de plastique), problÚme de premiÚre couche. Si TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un problÚme, réponds 'PROBLÈME: [description courte en une phrase]'."
      #     attachments:
      #       media_content_id: media-source://camera/camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
      #       media_content_type: image/jpeg
      #   response_variable: gemini_response
      
      # Stockage de la réponse
      # ⚠ MÉTHODE A : utilisez .text
      # ⚠ MÉTHODE B : remplacez .text par .data
      - action: input_text.set_value
        target:
          entity_id: input_text.gemini_last_response
        data:
          value: "{{ gemini_response.text }}"  # ← MÉTHODE B: changer en .data
      
      # Horodatage
      - action: input_datetime.set_datetime
        target:
          entity_id: input_datetime.gemini_last_check
        data:
          datetime: "{{ now().isoformat() }}"
      
      # Log systĂšme
      - action: system_log.write
        data:
          message: "Gemini: {{ gemini_response.text }}"  # ← MÉTHODE B: changer en .data
          level: info
      
      # Vérification si problÚme détecté
      # ⚠ MÉTHODE B : remplacez .text par .data
      - condition: template
        value_template: "{{ 'OK' not in gemini_response.text }}"  # ← MÉTHODE B: changer en .data
      
      # Incrémentation du compteur de problÚmes
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_problemes_current_print
        data:
          value: "{{ states('input_number.gemini_problemes_current_print') | float + 1 }}"
      
      # Notification de problĂšme
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "⚠ ProblĂšme Impression 3D !"
          message: "{{ gemini_response.text }}"  # ← MÉTHODE B: changer en .data
          data:
            image: "/local/p1s_ai_check.jpg?t={{ now().timestamp() | int }}"
            priority: high
            ttl: 0
            color: "#FF0000"
            tag: "print_issue"
            actions:
              - action: "PAUSE_PRINT"
                title: "⏞ Pause"
              - action: "STOP_PRINT"
                title: "🛑 ArrĂȘter"

  # ========================================
  # DÉBUT D'IMPRESSION
  # ========================================
  - alias: "đŸ–šïž DĂ©but Surveillance Impression 3D"
    id: print_start_gemini_notification
    trigger:
      - trigger: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        to: "printing"
    action:
      # Réinitialisation des compteurs
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_analyses_current_print
        data:
          value: 0
      
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_problemes_current_print
        data:
          value: 0
      
      # Stockage du nom de l'impression
      - action: input_text.set_value
        target:
          entity_id: input_text.gemini_current_print_name
        data:
          value: "{{ states('sensor.3d_imprimante_bambu_p1s_nom_de_la_tache') }}"  # ← PERSONNALISER
      
      # Capture de démarrage
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_start.jpg
      
      - delay: {seconds: 2}
      
      # Notification de démarrage
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "đŸ–šïž Impression DĂ©marrĂ©e"
          message: "{{ states('sensor.3d_imprimante_bambu_p1s_nom_de_la_tache') }} - Surveillance IA activĂ©e"  # ← PERSONNALISER
          data:
            image: "/local/p1s_start.jpg?t={{ now().timestamp() | int }}"
            priority: normal
            color: "#0000FF"
            tag: "print_status"

  # ========================================
  # FIN D'IMPRESSION
  # ========================================
  - alias: "✅ Fin Impression 3D RĂ©ussie"
    id: print_completed_gemini_notification
    trigger:
      - trigger: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        to: "idle"
        from: "printing"
    action:
      # Capture finale
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_final.jpg
      
      - delay: {seconds: 2}
      
      # Notification de fin avec statistiques
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "✅ Impression TerminĂ©e"
          message: >
            {{ states('input_text.gemini_current_print_name') }}
            
            📊 Analyses IA: {{ states('input_number.gemini_analyses_current_print') | int }}
            ⚠ ProblĂšmes: {{ states('input_number.gemini_problemes_current_print') | int }}
          data:
            image: "/local/p1s_final.jpg?t={{ now().timestamp() | int }}"
            priority: high
            ttl: 0
            color: "#00FF00"
            tag: "print_status"

  # ========================================
  # IMPRESSION EN PAUSE
  # ========================================
  - alias: "⏞ Alerte Impression en Pause"
    id: print_paused_alert_gemini
    trigger:
      - trigger: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        to:
          - "paused_filament_runout"
          - "paused_nozzle_clog"
          - "paused_first_layer_error"
          - "paused_user"
          - "paused_nozzle_temperature_malfunction"
          - "paused_heat_bed_temperature_malfunction"
          - "paused_front_cover_falling"
    action:
      # Capture de pause
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_pause.jpg
      
      - delay: {seconds: 2}
      
      # Notification de pause
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "⏞ Impression en Pause"
          message: "{{ trigger.to_state.state | replace('_', ' ') | title }}"
          data:
            image: "/local/p1s_pause.jpg?t={{ now().timestamp() | int }}"
            priority: high
            color: "#FFA500"
            tag: "print_pause"

  # ========================================
  # ACTIONS DEPUIS NOTIFICATIONS
  # ========================================
  - alias: "🛑 ArrĂȘt Impression depuis Notification"
    id: stop_print_from_notification_gemini
    trigger:
      - trigger: event
        event_type: mobile_app_notification_action
        event_data:
          action: STOP_PRINT
    action:
      - action: button.press
        target:
          entity_id: button.3d_imprimante_bambu_p1s_arreter_l_impression  # ← PERSONNALISER

  - alias: "⏞ Pause Impression depuis Notification"
    id: pause_print_from_notification_gemini
    trigger:
      - trigger: event
        event_type: mobile_app_notification_action
        event_data:
          action: PAUSE_PRINT
    action:
      - action: button.press
        target:
          entity_id: button.3d_imprimante_bambu_p1s_mettre_en_pause_l_impression  # ← PERSONNALISER

# ========================================
# TEMPLATE SENSOR
# ========================================
template:
  - sensor:
      - name: "Imprimante 3D - Statut Lisible"
        unique_id: p1s_status_readable
        state: >
          {% set s = states('sensor.3d_imprimante_bambu_p1s_etape_actuelle') %}
          {% if s == 'printing' %}En impression
          {% elif s == 'idle' %}Inactive
          {% elif 'paused' in s %}En pause
          {% else %}{{ s | replace('_', ' ') | title }}{% endif %}
        icon: mdi:printer-3d

:robot: Surveillance Imprimante 3D par IA Google Gemini - Version Corrigée

Description

SystĂšme de surveillance automatique d’imprimante 3D utilisant l’IA Google Gemini pour dĂ©tecter les problĂšmes d’impression en temps rĂ©el. Le script analyse des captures d’écran toutes les 5 minutes pendant l’impression et vous alerte instantanĂ©ment en cas de dĂ©tection d’anomalies (spaghetti, warping, dĂ©tachement, sous/sur-extrusion, etc.).

Fonctionnalités principales

:white_check_mark: Analyse IA automatique toutes les 5 minutes pendant l’impression
:camera_with_flash: Détection des problÚmes courants (spaghetti, warping, détachement, extrusion)
:mobile_phone: Notifications mobiles avec image et actions rapides (pause/arrĂȘt)
:bar_chart: Statistiques par impression (nombre d’analyses, problĂšmes dĂ©tectĂ©s)
:bullseye: Notifications de dĂ©but, fin et pause d’impression avec photos

Prérequis

  • Home Assistant avec intĂ©gration Bambu Lab

  • Extension Google Generative AI Conversation configurĂ©e avec Gemini

  • Application mobile Home Assistant

  • CamĂ©ra de l’imprimante accessible


:clipboard: Mode d’emploi et personnalisation

:one: Entités à personnaliser

Remplacez les entités suivantes par celles de votre imprimante :

Entité à remplacer Votre entité Description
sensor.3d_imprimante_bambu_p1s_etape_actuelle sensor.VOTRE_IMPRIMANTE_etape_actuelle Statut de l’imprimante
camera.3d_imprimante_bambu_p1s_camera camera.VOTRE_IMPRIMANTE_camera CamĂ©ra de l’imprimante
sensor.3d_imprimante_bambu_p1s_nom_de_la_tache sensor.VOTRE_IMPRIMANTE_nom_de_la_tache Nom du fichier en impression
button.3d_imprimante_bambu_p1s_arreter_l_impression button.VOTRE_IMPRIMANTE_arreter Bouton d’arrĂȘt
button.3d_imprimante_bambu_p1s_mettre_en_pause_l_impression button.VOTRE_IMPRIMANTE_pause Bouton de pause

Exemple pour BambuLab A1 :

  • sensor.bambulaba1_etape_actuelle

  • camera.bambulaba1_camera


:two: Service de notification

Remplacez notify.mobile_app_tel_mm par votre service de notification :

  • notify.mobile_app_VOTRE_TELEPHONE (iPhone/Android)

  • Ou votre service de notification prĂ©fĂ©rĂ©

Comment trouver votre service :

  1. Outils de dĂ©veloppement → Services

  2. Cherchez notify.mobile_app_

  3. Notez le nom complet (ex: notify.mobile_app_s25)


:three: Configuration de l’IA Gemini :warning: SECTION CORRIGÉE

Il existe 2 mĂ©thodes pour configurer l’appel Ă  Gemini. Choisissez celle qui fonctionne avec votre installation.

Méthode A : Utilisation de agent_id (recommandée)

  1. Trouver votre agent_id :

    • Allez dans ParamĂštres → Appareils et services

    • Cherchez Google Generative AI Conversation

    • Cliquez dessus, notez l’identifiant affichĂ© (ex: conversation.gemini_1_5_flash)

  2. Modifier le fichier YAML à la ligne de l’action ai_task.generate_data :

- action: ai_task.generate_data
  data:
    agent_id: conversation.gemini_1_5_flash  # ← Remplacez par VOTRE agent_id
    prompt: "Tu es un expert en impression 3D..."
    filenames:
      - /config/www/p1s_ai_check.jpg
  response_variable: gemini_response

  1. Format de la réponse : Utilisez gemini_response.text

Méthode B : Utilisation de entity_id (alternative testée sur A1)

Si la méthode A ne fonctionne pas, utilisez cette syntaxe :

- action: ai_task.generate_data
  data:
    entity_id: ai_task.google_ai_task  # ← Entity ID de l'AI Task
    task_name: Analyse de l'image 3D
    instructions: "Tu es un expert en impression 3D. Analyse cette image..."
    attachments:
      media_content_id: media-source://camera/camera.VOTRE_IMPRIMANTE_camera
      media_content_type: image/jpeg
  response_variable: gemini_response

:warning: IMPORTANT : Avec la Méthode B, remplacez AUSSI :

Dans toutes les actions qui utilisent la réponse Gemini :

Remplacez :

value: "{{ gemini_response.text }}"
message: "{{ gemini_response.text }}"

Par :

value: "{{ gemini_response.data }}"
message: "{{ gemini_response.data }}"

Et la condition :

value_template: "{{ 'OK' not in gemini_response.text }}"

Par :

value_template: "{{ 'OK' not in gemini_response.data }}"


:four: FrĂ©quence d’analyse (optionnel)

Par dĂ©faut, l’analyse se dĂ©clenche toutes les 5 minutes. Pour modifier :

trigger:
  - trigger: time_pattern
    minutes: "/5"  # ← Changez (ex: "/10" pour 10 min, "/3" pour 3 min)


:five: Personnalisation du prompt IA (optionnel)

Vous pouvez adapter le prompt pour ajuster la sensibilitĂ© ou ajouter des dĂ©tections spĂ©cifiques dans l’automatisation principale.


:rocket: Installation

  1. Créez le fichier : /config/packages/pkg_google_gemini_imp_3d.yaml

  2. Copiez le code complet (ci-dessous)

  3. Personnalisez les entités selon votre configuration

  4. Choisissez la MĂ©thode A ou B pour l’appel Gemini

  5. Redémarrez Home Assistant

  6. Testez avec une impression !


:bar_chart: Entités créées

Le package crée automatiquement :

  • input_number.gemini_analyses_current_print - Compteur d’analyses

  • input_number.gemini_problemes_current_print - Compteur de problĂšmes

  • input_text.gemini_last_response - DerniĂšre rĂ©ponse de l’IA

  • input_text.gemini_current_print_name - Nom de l’impression en cours

  • input_datetime.gemini_last_check - Horodatage de la derniĂšre vĂ©rification

  • sensor.imprimante_3d_statut_lisible - Statut en français


:page_facing_up: Code complet - VERSION CORRIGÉE

# ========================================
# PACKAGE : Surveillance Imprimante 3D + Gemini
# FICHIER : /config/packages/pkg_google_gemini_imp_3d.yaml
# VERSION : 2.0 - CORRIGÉE
# ========================================

# ========================================
# INPUT HELPERS (stockage infos par impression)
# ========================================
input_number:
  gemini_analyses_current_print:
    name: "Gemini - Analyses (impression actuelle)"
    min: 0
    max: 1000
    step: 1
    icon: mdi:counter
    
  gemini_problemes_current_print:
    name: "Gemini - ProblÚmes détectés"
    min: 0
    max: 100
    step: 1
    icon: mdi:alert-circle

input_text:
  gemini_last_response:
    name: "Gemini - DerniÚre réponse"
    max: 255
    icon: mdi:message-text
    
  gemini_current_print_name:
    name: "Gemini - Nom impression"
    max: 100
    icon: mdi:printer-3d

input_datetime:
  gemini_last_check:
    name: "Gemini - DerniÚre vérification"
    has_date: true
    has_time: true

# ========================================
# AUTOMATISATIONS
# ========================================
automation:
  # ========================================
  # AUTOMATISATION PRINCIPALE - SURVEILLANCE IA
  # ⚠ CHOISISSEZ LA MÉTHODE A OU B CI-DESSOUS
  # ========================================
  
  - alias: "🔍 Surveillance Impression 3D - IA Gemini"
    id: p1s_ai_monitoring_gemini
    trigger:
      - trigger: time_pattern
        minutes: "/5"
    condition:
      - condition: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        state: "printing"
    action:
      # Capture de l'image
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_ai_check.jpg
      
      - delay: {seconds: 2}
      
      # Incrémentation du compteur d'analyses
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_analyses_current_print
        data:
          value: "{{ states('input_number.gemini_analyses_current_print') | float + 1 }}"
      
      # ========================================
      # MÉTHODE A : Utilisation de agent_id
      # ========================================
      - action: ai_task.generate_data
        data:
          agent_id: conversation.gemini_1_5_flash  # ← REMPLACER par votre agent_id
          prompt: "Tu es un expert en impression 3D. Analyse cette image d'une imprimante 3D en cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée), warping (coins décollés), détachement du plateau, sous-extrusion (lignes fines), sur-extrusion (trop de plastique), problÚme de premiÚre couche. Si TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un problÚme, réponds 'PROBLÈME: [description courte en une phrase]'."
          filenames:
            - /config/www/p1s_ai_check.jpg
        response_variable: gemini_response
      
      # ========================================
      # MÉTHODE B (Alternative) : Utilisation de entity_id
      # ⚠ Si vous utilisez la MĂ©thode B :
      # 1. Commentez le bloc MÉTHODE A ci-dessus (ajoutez # devant chaque ligne)
      # 2. Décommentez le bloc ci-dessous (enlevez le # devant chaque ligne)
      # 3. Remplacez gemini_response.text par gemini_response.data PARTOUT
      # ========================================
      
      # - action: ai_task.generate_data
      #   data:
      #     entity_id: ai_task.google_ai_task
      #     task_name: Analyse de l'image 3D
      #     instructions: "Tu es un expert en impression 3D. Analyse cette image d'une imprimante 3D en cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée), warping (coins décollés), détachement du plateau, sous-extrusion (lignes fines), sur-extrusion (trop de plastique), problÚme de premiÚre couche. Si TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un problÚme, réponds 'PROBLÈME: [description courte en une phrase]'."
      #     attachments:
      #       media_content_id: media-source://camera/camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
      #       media_content_type: image/jpeg
      #   response_variable: gemini_response
      
      # Stockage de la réponse
      # ⚠ MÉTHODE A : utilisez .text
      # ⚠ MÉTHODE B : remplacez .text par .data
      - action: input_text.set_value
        target:
          entity_id: input_text.gemini_last_response
        data:
          value: "{{ gemini_response.text }}"  # ← MÉTHODE B: changer en .data
      
      # Horodatage
      - action: input_datetime.set_datetime
        target:
          entity_id: input_datetime.gemini_last_check
        data:
          datetime: "{{ now().isoformat() }}"
      
      # Log systĂšme
      - action: system_log.write
        data:
          message: "Gemini: {{ gemini_response.text }}"  # ← MÉTHODE B: changer en .data
          level: info
      
      # Vérification si problÚme détecté
      # ⚠ MÉTHODE B : remplacez .text par .data
      - condition: template
        value_template: "{{ 'OK' not in gemini_response.text }}"  # ← MÉTHODE B: changer en .data
      
      # Incrémentation du compteur de problÚmes
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_problemes_current_print
        data:
          value: "{{ states('input_number.gemini_problemes_current_print') | float + 1 }}"
      
      # Notification de problĂšme
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "⚠ ProblĂšme Impression 3D !"
          message: "{{ gemini_response.text }}"  # ← MÉTHODE B: changer en .data
          data:
            image: "/local/p1s_ai_check.jpg?t={{ now().timestamp() | int }}"
            priority: high
            ttl: 0
            color: "#FF0000"
            tag: "print_issue"
            actions:
              - action: "PAUSE_PRINT"
                title: "⏞ Pause"
              - action: "STOP_PRINT"
                title: "🛑 ArrĂȘter"

  # ========================================
  # DÉBUT D'IMPRESSION
  # ========================================
  - alias: "đŸ–šïž DĂ©but Surveillance Impression 3D"
    id: print_start_gemini_notification
    trigger:
      - trigger: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        to: "printing"
    action:
      # Réinitialisation des compteurs
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_analyses_current_print
        data:
          value: 0
      
      - action: input_number.set_value
        target:
          entity_id: input_number.gemini_problemes_current_print
        data:
          value: 0
      
      # Stockage du nom de l'impression
      - action: input_text.set_value
        target:
          entity_id: input_text.gemini_current_print_name
        data:
          value: "{{ states('sensor.3d_imprimante_bambu_p1s_nom_de_la_tache') }}"  # ← PERSONNALISER
      
      # Capture de démarrage
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_start.jpg
      
      - delay: {seconds: 2}
      
      # Notification de démarrage
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "đŸ–šïž Impression DĂ©marrĂ©e"
          message: "{{ states('sensor.3d_imprimante_bambu_p1s_nom_de_la_tache') }} - Surveillance IA activĂ©e"  # ← PERSONNALISER
          data:
            image: "/local/p1s_start.jpg?t={{ now().timestamp() | int }}"
            priority: normal
            color: "#0000FF"
            tag: "print_status"

  # ========================================
  # FIN D'IMPRESSION
  # ========================================
  - alias: "✅ Fin Impression 3D RĂ©ussie"
    id: print_completed_gemini_notification
    trigger:
      - trigger: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        to: "idle"
        from: "printing"
    action:
      # Capture finale
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_final.jpg
      
      - delay: {seconds: 2}
      
      # Notification de fin avec statistiques
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "✅ Impression TerminĂ©e"
          message: >
            {{ states('input_text.gemini_current_print_name') }}
            
            📊 Analyses IA: {{ states('input_number.gemini_analyses_current_print') | int }}
            ⚠ ProblĂšmes: {{ states('input_number.gemini_problemes_current_print') | int }}
          data:
            image: "/local/p1s_final.jpg?t={{ now().timestamp() | int }}"
            priority: high
            ttl: 0
            color: "#00FF00"
            tag: "print_status"

  # ========================================
  # IMPRESSION EN PAUSE
  # ========================================
  - alias: "⏞ Alerte Impression en Pause"
    id: print_paused_alert_gemini
    trigger:
      - trigger: state
        entity_id: sensor.3d_imprimante_bambu_p1s_etape_actuelle  # ← PERSONNALISER
        to:
          - "paused_filament_runout"
          - "paused_nozzle_clog"
          - "paused_first_layer_error"
          - "paused_user"
          - "paused_nozzle_temperature_malfunction"
          - "paused_heat_bed_temperature_malfunction"
          - "paused_front_cover_falling"
    action:
      # Capture de pause
      - action: camera.snapshot
        target:
          entity_id: camera.3d_imprimante_bambu_p1s_camera  # ← PERSONNALISER
        data:
          filename: /config/www/p1s_pause.jpg
      
      - delay: {seconds: 2}
      
      # Notification de pause
      - action: notify.mobile_app_tel_mm  # ← PERSONNALISER
        data:
          title: "⏞ Impression en Pause"
          message: "{{ trigger.to_state.state | replace('_', ' ') | title }}"
          data:
            image: "/local/p1s_pause.jpg?t={{ now().timestamp() | int }}"
            priority: high
            color: "#FFA500"
            tag: "print_pause"

  # ========================================
  # ACTIONS DEPUIS NOTIFICATIONS
  # ========================================
  - alias: "🛑 ArrĂȘt Impression depuis Notification"
    id: stop_print_from_notification_gemini
    trigger:
      - trigger: event
        event_type: mobile_app_notification_action
        event_data:
          action: STOP_PRINT
    action:
      - action: button.press
        target:
          entity_id: button.3d_imprimante_bambu_p1s_arreter_l_impression  # ← PERSONNALISER

  - alias: "⏞ Pause Impression depuis Notification"
    id: pause_print_from_notification_gemini
    trigger:
      - trigger: event
        event_type: mobile_app_notification_action
        event_data:
          action: PAUSE_PRINT
    action:
      - action: button.press
        target:
          entity_id: button.3d_imprimante_bambu_p1s_mettre_en_pause_l_impression  # ← PERSONNALISER

# ========================================
# TEMPLATE SENSOR
# ========================================
template:
  - sensor:
      - name: "Imprimante 3D - Statut Lisible"
        unique_id: p1s_status_readable
        state: >
          {% set s = states('sensor.3d_imprimante_bambu_p1s_etape_actuelle') %}
          {% if s == 'printing' %}En impression
          {% elif s == 'idle' %}Inactive
          {% elif 'paused' in s %}En pause
          {% else %}{{ s | replace('_', ' ') | title }}{% endif %}
        icon: mdi:printer-3d


:light_bulb: Checklist avant de tester

  • Toutes les entitĂ©s sensor.3d_imprimante_bambu_p1s_* remplacĂ©es

  • Toutes les entitĂ©s camera.3d_imprimante_bambu_p1s_camera remplacĂ©es

  • Service de notification notify.mobile_app_tel_mm remplacĂ©

  • MĂ©thode A ou B choisie et correctement configurĂ©e

  • Si MĂ©thode B : tous les .text remplacĂ©s par .data

  • Fichier sauvegardĂ© dans /config/packages/

  • Home Assistant redĂ©marrĂ©

  • Test avec une impression courte


:bug: Dépannage

ProblĂšme : « agent_id not found Â» → Utilisez la MĂ©thode B avec entity_id

ProblĂšme : Pas de notification → VĂ©rifiez votre service de notification dans Outils de dĂ©veloppement

ProblĂšme : « gemini_response.text Â» vide → Si vous utilisez la MĂ©thode B, remplacez .text par .data

ProblĂšme : L’automatisation ne se dĂ©clenche pas → VĂ©rifiez que l’état de votre imprimante est bien « printing Â» pendant l’impression


:tada: C’est prĂȘt !

Lancez une impression de test et surveillez les notifications. Les premiùres analyses commenceront aprùs 5 minutes d’impression.

Bon printing ! :printer:

2 « J'aime »

Salut, excellent, merci pour le partage.
Tu sais si un compte gratuit pour gemini suffit ou il faut prendre un abonnement ?
On a le droit Ă  combien de requĂȘte avec un compte gratuit ?

J’ai une P1S aussi, si j’ai le temps je test à la prochaine impression

Bonjour,

oui cela suffit :

Quota gratuit de Google Gemini

Google offre un quota gratuit et gĂ©nĂ©reux pour l’API Gemini :

Limites gratuites (API Gemini)

  • 15 requĂȘtes par minute (RPM)

  • 1 500 requĂȘtes par jour (RPD)

  • 1 million de tokens par jour

Pour ton usage (analyse toutes les 5 minutes)

  • 12 analyses par heure = ~288 analyses par jour

  • :white_check_mark: Largement dans les limites gratuites !


:gear: Configuration recommandée pour rester gratuit

:one: Utiliser le bon modĂšle

Dans Home Assistant, configure l’intĂ©gration Google Generative AI Conversation avec :
ModĂšle : gemini-2.0-flash-exp (gratuit)

:two: Obtenir une clé API gratuite

  1. Va sur Google AI Studio

  2. Crée une API Key gratuite

  3. :white_check_mark: Utilise cette clé dans Home Assistant

Important :

  • N’active PAS la facturation sur ton compte Google Cloud

  • Reste sur le tier « Free Â» de l’API

merci pour les précisions !

Vous avez quoi comme imprimante ?

j’ai une P1S Ă©galement

Bonjour @Elmago, fĂ©licitation pour ton travail. J’ai une BambuLab A1. Je ne comprends pas une de partie du tuto.

La partie 3 Configuration de l’IA Gemini la configuration du service se fait dans le fichier yaml créé dans la partie 5 que l’on a positionnĂ© ici

/config/packages/pkg_google_gemini_imp_3d.yaml

Tout d’abord, une super idĂ©e !!! Et aussi merci pour le partage.

J’ai moi aussi une A1 et je bloque Ă  l’étape 3.

Dans le script, tu ne peux prĂ©ciser l’agent-id car la ligne n’est pas prĂ©sente :

- action: ai_task.generate_data
        data:
          prompt: "Tu es un expert en impression 3D. Analyse cette image d'une imprimante 3D en cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée), warping (coins décollés), détachement du plateau, sous-extrusion (lignes fines), sur-extrusion (trop de plastique), problÚme de premiÚre couche. Si TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un problÚme, réponds 'PROBLÈME: [description courte en une phrase]'."
          filenames:
            - /config/www/p1s_ai_check.jpg

Ceci dit, je n’arrive pas Ă  le retrouver. Je n’ai pas ParamĂštres → Extensions et services et pourtant j’ai bien le mode avancĂ© activĂ©.

Peut-ĂȘtre n’est ce pas nĂ©cessaire au final ?

[EDIT]

Donc c’est nĂ©cessaire mais j’ai adaptĂ© l’automatisation et le format de la rĂ©ponse qui ne collait pas.

Voici mon automatisation :

alias: 🔍 Surveillance Impression 3D - IA Gemini
description: ""
triggers:
  - trigger: time_pattern
    minutes: /5
conditions:
  - condition: state
    entity_id: sensor.bambulaba1_etape_actuelle
    state: printing
actions:
  - action: camera.snapshot
    target:
      entity_id: camera.bambulaba1_camera
    data:
      filename: /config/www/p1s_ai_check.jpg
  - delay:
      seconds: 2
  - action: input_number.set_value
    target:
      entity_id: input_number.gemini_analyses_current_print
    data:
      value: "{{ states('input_number.gemini_analyses_current_print') | float + 1 }}"
  - action: ai_task.generate_data
    metadata: {}
    data:
      entity_id: ai_task.google_ai_task
      task_name: Analyse de l'image 3D
      instructions: >-
        Tu es un expert en impression 3D. Analyse cette image d'une imprimante
        3D en
          cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée),
          warping (coins décollés), détachement du plateau, sous-extrusion (lignes
          fines), sur-extrusion (trop de plastique), problĂšme de premiĂšre couche. Si
          TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un problÚme,
          réponds 'PROBLÈME: [description courte en une phrase]'.
      attachments:
        media_content_id: media-source://camera/camera.bambulaba1_camera
        media_content_type: image/jpeg
        metadata:
          title: BambulabA1 Caméra
          thumbnail: /api/camera_proxy/camera.bambulaba1_camera
          media_class: video
          children_media_class: null
          navigateIds:
            - {}
            - media_content_type: app
              media_content_id: media-source://camera
    response_variable: gemini_response
  - action: ai_task.generate_data
    data:
      prompt: >-
        Tu es un expert en impression 3D. Analyse cette image d'une imprimante
        3D en cours d'impression. Détecte ces problÚmes : spaghetti (impression
        détachée), warping (coins décollés), détachement du plateau,
        sous-extrusion (lignes fines), sur-extrusion (trop de plastique),
        problÚme de premiÚre couche. Si TOUT VA BIEN, réponds UNIQUEMENT par le
        mot 'OK'. Si tu détectes un problÚme, réponds 'PROBLÈME: [description
        courte en une phrase]'.
      filenames:
        - /config/www/p1s_ai_check.jpg
    response_variable: gemini_response
    enabled: false
  - action: input_text.set_value
    target:
      entity_id: input_text.gemini_last_response
    data:
      value: "{{ gemini_response.data }}"
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.gemini_last_check
    data:
      datetime: "{{ now().isoformat() }}"
  - action: system_log.write
    data:
      message: "Gemini: {{ gemini_response.data }}"
      level: info
  - condition: template
    value_template: "{{ 'OK' not in  gemini_response.data }}"
  - action: input_number.set_value
    target:
      entity_id: input_number.gemini_problemes_current_print
    data:
      value: "{{ states('input_number.gemini_problemes_current_print') | float + 1 }}"
  - action: notify.mobile_app_s25
    data:
      title: ⚠ ProblĂšme Impression 3D !
      message: "{{ gemini_response.data }}"
      data:
        image: /local/p1s_ai_check.jpg?t={{ now().timestamp() | int }}
        priority: high
        ttl: 0
        color: "#FF0000"
        tag: print_issue
        actions:
          - action: PAUSE_PRINT
            title: ⏞ Pause
          - action: STOP_PRINT
            title: 🛑 ArrĂȘter
mode: single

Pour l’instant, rien Ă  signaler. On verra au prochain Ă©chec ce que ça donne.

Bonjour !

Je comprends votre confusion, c’est effectivement pas trùs clair dans le tutoriel. Laissez-moi vous expliquer :

Ce qu’il faut faire

Étape 1 : Trouver votre agent_id Gemini

  1. Allez dans Paramùtres → Appareils et services

  2. Cherchez Google Generative AI Conversation

  3. Cliquez dessus, vous verrez quelque chose comme : conversation.gemini_1_5_flash ou conversation.gemini_1_5_pro

  4. Notez cet identifiant, c’est votre agent_id

Étape 2 : Modifier le fichier YAML

Dans le fichier /config/packages/pkg_google_gemini_imp_3d.yaml, cherchez cette section (ligne ~60-65) :

action: ai_task.generate_data
data:
agent_id: conversation.VOTRE_AGENT_GEMINI # ← ICI
prompt: « Tu es un expert en impression 3D
 »
filenames:
- /config/www/p1s_ai_check.jpg

Remplacez conversation.VOTRE_AGENT_GEMINI par l’identifiant que vous avez notĂ© Ă  l’étape 1.

**Exemple concret :
**

agent_id: conversation.gemini_1_5_flash

Résumé

  • Partie 3 = Vous donne les instructions pour trouver votre agent_id

  • Partie 5 = Le fichier YAML complet oĂč vous devez appliquer cette modification

C’est juste une information Ă  rĂ©cupĂ©rer dans l’interface Home Assistant, puis Ă  reporter dans le fichier YAML avant de redĂ©marrer HA.

Est-ce plus clair maintenant ? :blush:

1 « J'aime »

@Elmago déja merci pour le partage, je vais réaliser la conf !

Si je comprends bien tu utilises la camera native de la P1S. cela fonctionne bien ?

1 « J'aime »

Oui ca fonctionne avec la camĂ©ra native, je prend un cluchĂ© toute les 5 minutes, mais comme c’est une imprimante top, pour le moment j’ai pas de pb avec donc


Mon but est plus d’avoir une alerte quand je suis pas la pour les “Gros PB” dĂ©collement par exemple.

1 « J'aime »

J’ai retentĂ© avec ta partie AI_task :

action: ai_task.generate_data
data:
  agent_id: conversation.google_ai_conversation
  prompt: >-
    Tu es un expert en impression 3D. Analyse cette image d'une imprimante 3D en
    cours d'impression. Détecte ces problÚmes : spaghetti (impression détachée),
    warping (coins décollés), détachement du plateau, sous-extrusion (lignes
    fines), sur-extrusion (trop de plastique), problĂšme de premiĂšre couche. Si
    TOUT VA BIEN, réponds UNIQUEMENT par le mot 'OK'. Si tu détectes un
    problÚme, réponds 'PROBLÈME: [description courte en une phrase]'.
  filenames:
    - /config/www/p1s_ai_check.jpg
response_variable: gemini_response

Mais j’ai l’erreur suivante : Erreur : extra keys not allowed @ data[â€č agent_id â€ș]

Sinon, avec l’autre AI_task, tout fonctionne sans pb. J’ai eu un dĂ©faut de dĂ©collement et cela me l’a remontĂ© !

Merci bcp pour ton partage.

Ok car la camĂ©ra n’est pas top mais je vais tester.

Sur la P1S j’ai eu du dĂ©collement avec le plateau smooth. AprĂšs il m’arrive parfois d’avoir des spaghettis en fonction du filament ou de certaines conditions. Dans l’ensemble cela reste rare.

Mais bon j’ai un pb sur une impression de 9h et je ne m’en suis rendu compte que le matin alors que le pb avait eu lieu au dĂ©but de l’impression :sweat_smile:

Merci @Elmago pour ta réponse. Je viens de corriger mon yaml et je teste une impression 3D ce soir en rentrant.

encore un grand merci pour ton travail et ce partage. Gemini c’est aussi nouveau pour moi, j’hĂ©sitais Ă  l’employer dans ma domotique.