Ulanzi TC001, Awtrix et Home Assistant

Domotique

J’ai récemment fait l’acquisition d’un afficheur à pixels Ulanzi TC001. Pour être honnête, je l’ai d’abord acheté sans trop savoir quoi en faire, principalement parce qu’il était peu cher (38 € frais de port inclus). Pourtant, il m’a tellement séduit que je viens d’en commander un second 😃.

Progression de la recharge de la Dacia
Progression de la recharge de la Dacia.

Déballage et configuration initiale

Dès que j’ai déballé l’appareil, ma première étape a été de flasher le firmware officiel pour passer sous Awtrix. Au départ, je n’ai pas réussi à utiliser l’outil online flasher, mais après une courte recherche en ligne, j’ai trouvé qu’il suffisait de télécharger le firmware et de l’installer directement via l’interface officielle.

Connexion et intégration avec Home Assistant

Une fois l’appareil configuré, la connexion au réseau est très simple. Mais surtout, il est facile de le connecter au MQTT de mon Home Assistant. Comme j’aime faire les choses proprement, je lui ai créé un compte dédié.

Ensuite, je me suis lancé dans la mise en place d’automatisations via Home Assistant. En explorant un peu, j’ai compris qu’il fallait d’abord créer des scripts, sur lesquels je pourrais baser mes automatisations. Je me suis largement inspiré des scripts de Quentin Joly (merci à lui !) tout en ajoutant mes propres fonctionnalités :

  1. Rendre tout paramètre facultatif pour simplifier les configurations.
  2. Ajouter des options, comme un mode arc-en-ciel ou une barre de progression.
  3. Permettre de supprimer une application directement.
  4. Spécifier un afficheur en particulier ou diffuser sur tous si rien n’est indiqué.
  5. Désactiver le défilement des applications et figer l’horloge lorsque je regarde la télévision.
Progression de l'impression 3D
Progression de l’impression 3D.

Script de notification

alias: Notification Awtrix
sequence:
  - if:
      - condition: template
        value_template: "{{ screen == null or (screen | contains('Salon')) }}"
    then:
      - metadata: {}
        data:
          qos: 0
          retain: false
          topic: awtrix_salon/notify
          payload: |-
            {
              {% if icon != null %}
              icon: "{{ icon }}",
                {% if push_icon != null %}
              pushIcon: "{{ push_icon }}",
                {% else %}
              pushIcon: "2",
                {% endif %}
              {% endif %}
              {% if repeat != null %}
              repeat: "{{ repeat }}",
              {% endif %}
              {% if color != null %}
              color: "{{ color }}",
              {% endif %}
              {% if stack != null %}
              stack: "{{ stack }}",
              {% endif %}
              {% if hold != null %}
              hold: "{{ hold }}",
              {% endif %}
              {% if rainbow != null %}
              rainbow: "{{ rainbow }}",
              {% endif %}
              {% if duration != null %}
              duration: "{{ duration }}",
              {% endif %}
              textCase: 2,
              text: "{{ message }}"
            }
        action: mqtt.publish
    alias: Salon
  - if:
      - condition: template
        value_template: "{{ screen == null or (screen | contains('Dégagement')) }}"
    then:
      - metadata: {}
        data:
          qos: 0
          retain: false
          topic: awtrix_degagement/notify
          payload: |-
            {
              {% if icon != null %}
              icon: "{{ icon }}",
                {% if push_icon != null %}
              pushIcon: "{{ push_icon }}",
                {% else %}
              pushIcon: "2",
                {% endif %}
              {% endif %}
              {% if repeat != null %}
              repeat: "{{ repeat }}",
              {% endif %}
              {% if color != null %}
              color: "{{ color }}",
              {% endif %}
              {% if stack != null %}
              stack: "{{ stack }}",
              {% endif %}
              {% if hold != null %}
              hold: "{{ hold }}",
              {% endif %}
              {% if rainbow != null %}
              rainbow: "{{ rainbow }}",
              {% endif %}
              {% if duration != null %}
              duration: "{{ duration }}",
              {% endif %}
              textCase: 2,
              text: "{{ message }}"
            }
        action: mqtt.publish
    alias: Dégagement
icon: mdi:cloud
mode: single
fields:
  screen:
    selector:
      select:
        options:
          - Salon
          - Dégagement
        multiple: true
    name: Afficheur
    description: L'afficheur où envoyer la notification.
  icon:
    selector:
      text: {}
    name: Icône
    description: Icône utilisée pour la notification.
  push_icon:
    selector:
      number:
        min: 0
        max: 2
        step: 1
    name: Mouvement de l'icône
    default: 2
    description: >-
      0 = L'icône ne bouge pas. 1 = L'icône bouge avec le texte et n'apparaît
      plus. 2 = L'icône bouge avec le texte mais réapparaît lorsque le texte
      commence à défiler à nouveau.
  message:
    selector:
      text: null
    name: message
    required: true
    default: Message
    description: Message à afficher.
  repeat:
    selector:
      number:
        min: 1
        max: 10
    name: Répétition
    default: 1
    description: Nombre de fois à répéter la notification.
  color:
    selector:
      text: null
    name: Couleur
    default: FFFFFF
  rainbow:
    selector:
      boolean: {}
    name: Arc-en-ciel
    default: false
    description: Estompe chaque lettre du texte différemment sur l'ensemble du spectre RVB.
  duration:
    selector:
      number:
        min: 5
        max: 60
    name: Durée
    default: 5
    description: >-
      Définit la durée pendant laquelle l'application ou la notification doit
      être affichée.
  stack:
    selector:
      boolean: {}
    name: Empilement
    default: true
    description: >-
      Définit si la notification sera empilée. false remplacera immédiatement la
      notification actuelle.
  hold:
    selector:
      boolean: {}
    name: Maintien
    default: false
    description: >-
      Maintenir la notification jusqu'à ce que l'utilisateur appuie sur le
      bouton.
description: Afficher des notifications sur l'Awtrix.

Script d’application

Contrairement à une notification qui disparaît automatiquement après un certain temps (sauf si l’option hold est activée), une application défile avec les autres. Le firmware Awtrix offre la possibilité d’ajouter de nouvelles applications.

alias: App custom Awtrix
sequence:
  - if:
      - condition: template
        value_template: "{{ screen == null or (screen | contains('Salon')) }}"
    then:
      - metadata: {}
        data:
          qos: 0
          retain: false
          topic: awtrix_salon/custom/{{ application }}
          payload: |-
            {% if delete != null and delete %} {} {% else %} {
              {% if icon != null %}
              icon: "{{ icon }}",
                {% if push_icon != null %}
              pushIcon: "{{ push_icon }}",
                {% else %}
              pushIcon: "2",
                {% endif %}
              {% endif %}
              {% if repeat != null %}
              repeat: "{{ repeat }}",
              {% endif %}
              {% if color != null %}
              color: "{{ color }}",
              {% endif %}
              {% if hold != null %}
              hold: "{{ hold }}",
              {% endif %}
              {% if rainbow != null %}
              rainbow: "{{ rainbow }}",
              {% endif %}
              {% if duration != null %}
              duration: "{{ duration }}",
              {% endif %}
              {% if progress != null %}
              progress: "{{ progress }}",
              {% endif %}
              textCase: 2,          
              text: "{{ message }}"
            } {% endif %}
        action: mqtt.publish
    alias: Salon
  - if:
      - condition: template
        value_template: "{{ screen == null or (screen | contains('Dégagement')) }}"
    then:
      - metadata: {}
        data:
          qos: 0
          retain: false
          topic: awtrix_degagement/custom/{{ application }}
          payload: |-
            {% if delete != null and delete %} {} {% else %} {
              {% if icon != null %}
              icon: "{{ icon }}",
                {% if push_icon != null %}
              pushIcon: "{{ push_icon }}",
                {% else %}
              pushIcon: "2",
                {% endif %}
              {% endif %}
              {% if repeat != null %}
              repeat: "{{ repeat }}",
              {% endif %}
              {% if color != null %}
              color: "{{ color }}",
              {% endif %}
              {% if hold != null %}
              hold: "{{ hold }}",
              {% endif %}
              {% if rainbow != null %}
              rainbow: "{{ rainbow }}",
              {% endif %}
              {% if duration != null %}
              duration: "{{ duration }}",
              {% endif %}
              {% if progress != null %}
              progress: "{{ progress }}",
              {% endif %}
              textCase: 2,          
              text: "{{ message }}"
            } {% endif %}
        action: mqtt.publish
    alias: Dégagement
icon: mdi:cloud
mode: single
fields:
  screen:
    selector:
      select:
        options:
          - Salon
          - Dégagement
        multiple: true
    name: Afficheur
    description: L'afficheur où définir l'application.
  application:
    selector:
      text: {}
    required: true
    name: Application
    description: Nom de l'applicvation.
  icon:
    selector:
      text: {}
    name: Icône
    description: Icône utilisée pour la notification.
  push_icon:
    selector:
      number:
        min: 0
        max: 2
        step: 1
    name: Mouvement de l'icône
    default: 2
    description: >-
      0 = L'icône ne bouge pas. 1 = L'icône bouge avec le texte et n'apparaît
      plus. 2 = L'icône bouge avec le texte mais réapparaît lorsque le texte
      commence à défiler à nouveau.
  message:
    selector:
      text: null
    name: Message
    default: Message
    description: Message à afficher.
  repeat:
    selector:
      number:
        min: 1
        max: 10
    name: Répétition
    default: 1
    description: Nombre de fois à répéter la notification.
  color:
    selector:
      text: null
    name: Couleur
    default: FFFFFF
  rainbow:
    selector:
      boolean: {}
    name: Arc-en-ciel
    default: false
    description: Estompe chaque lettre du texte différemment sur l'ensemble du spectre RVB.
  duration:
    selector:
      number:
        min: 5
        max: 60
    name: Durée
    default: 5
    description: >-
      Définit la durée pendant laquelle l'application ou la notification doit
      être affichée.
  progress:
    selector:
      number:
        min: 0
        max: 100
    name: Progression
    default: 100
    description: >-
      Affiche une barre de progression. La valeur peut être comprise entre 0 et
      100.
  delete:
    selector:
      boolean: {}
    name: Supprimer
    default: false
    description: Supprime l'application.
description: Afficher sur l'app custom de l'Awtrix.

Script de gestion du défilement

alias: Défilement Awtrix
sequence:
  - if:
      - condition: template
        value_template: "{{ screen == null or (screen | contains('Salon')) }}"
    then:
      - if:
          - condition: template
            value_template: "{{ lock == true }}"
        then:
          - metadata: {}
            data:
              qos: 0
              retain: false
              topic: awtrix_salon/settings
              payload: |-
                {
                  ATRANS: false
                }
            action: mqtt.publish
          - metadata: {}
            data:
              qos: 0
              retain: false
              topic: awtrix_salon/switch
              payload: |-
                {
                  name: "Time"
                }
            action: mqtt.publish
        else:
          - metadata: {}
            data:
              qos: 0
              retain: false
              topic: awtrix_salon/settings
              payload: |-
                {
                  ATRANS: true
                }
            action: mqtt.publish
    alias: Salon
  - if:
      - condition: template
        value_template: "{{ screen == null or (screen | contains('Dégagement')) }}"
    then:
      - if:
          - condition: template
            value_template: "{{ lock == true }}"
        then:
          - metadata: {}
            data:
              qos: 0
              retain: false
              topic: awtrix_degagement/settings
              payload: |-
                {
                  ATRANS: false
                }
            action: mqtt.publish
          - metadata: {}
            data:
              qos: 0
              retain: false
              topic: awtrix_degagement/switch
              payload: |-
                {
                  name: "Time"
                }
            action: mqtt.publish
        else:
          - metadata: {}
            data:
              qos: 0
              retain: false
              topic: awtrix_degagement/settings
              payload: |-
                {
                  ATRANS: true
                }
            action: mqtt.publish
    alias: Dégagement
icon: mdi:cloud
mode: single
fields:
  screen:
    selector:
      select:
        options:
          - Salon
          - Dégagement
        multiple: true
    name: Afficheur
    description: L'afficheur sur lequel agir.
  lock:
    selector:
      boolean: {}
    name: Verrouiller
    default: true
    description: Affiche l'horloge et arrète le défilement.
description: Gestion du défilement sur l'Awtrix.

Automatisations mises en place

Une fois les scripts prêts, je les ai utilisés pour différentes automatisations.

Affichage de l’horloge et température

J’ai d’abord configuré l’affichage de l’horloge uniquement, puis j’ai remplacé le capteur de température par défaut de l’Ulanzi par un capteur personnalisé :

alias: Température sur Awtrix
description: Application custom et précise pour la gestion de la température.
triggers:
  - trigger: state
    entity_id:
      - sensor.thermo_hygro_salon_temperature
    id: salon
  - trigger: state
    entity_id:
      - sensor.thermo_hygro_degagement_temperature
    id: dégagement
conditions:
  - condition: template
    value_template: "{{trigger.to_state.state != 'unavailable'}}"
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - salon
        sequence:
          - action: script.app_custom_awtrix
            data:
              application: Temperature
              icon: "2355"
              message: "{{ trigger.to_state.state | round(1) | replace('.', ',') }} °C"
mode: single

Mode « télévision »

Étant donné que l’afficheur est dans mon champ de vision lorsque je regarde la télévision, j’ai ajouté une automatisation pour désactiver le défilement des informations :

alias: Awtrix VS télé
description: Gestion de l'Awtrix et la télé
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.ping_tele
conditions:
  - condition: template
    value_template: "{{trigger.to_state.state != 'unavailable'}}"
actions:
  - if:
      - condition: template
        value_template: "{{ trigger.to_state.state == \"on\" }}"
    then:
      - action: script.defilement_awtrix
        data:
          lock: true
          screen:
            - Salon
    else:
      - action: script.defilement_awtrix
        data:
          lock: false
          screen:
            - Salon
mode: single

Suivi de progression

Enfin, j’ai configuré l’affichage de la progression de recharge de ma voiture (Dacia Spring) ou de mon imprimante 3D.

Progression de la recharge de la Dacia
Progression de la recharge de la Dacia.
alias: Awtrix Dacia
description: Application custom pour la gestion de la charge de la Dacia.
triggers:
  - trigger: state
    entity_id:
      - sensor.dacia_spring_batterie
    id: batterie
  - trigger: state
    entity_id:
      - sensor.dacia_spring_etat_de_charge
    id: charge
conditions:
  - condition: template
    value_template: "{{trigger.to_state.state != 'unavailable'}}"
actions:
  - if:
      - condition: trigger
        id:
          - batterie
      - condition: state
        entity_id: sensor.dacia_spring_etat_du_branchement
        state: plugged
      - condition: state
        entity_id: sensor.dacia_spring_etat_de_charge
        state: charge_in_progress
    then:
      - action: script.app_custom_awtrix
        metadata: {}
        data:
          message: Dacia
          progress: "{{ trigger.to_state.state }}"
          application: Dacia
          icon: "7281"
    else:
      - action: script.app_custom_awtrix
        metadata: {}
        data:
          application: Dacia
          delete: true
mode: single
Progression de l'impression 3D
Progression de l’impression 3D.
alias: Awtrix Impression 3D
description: Application custom pour la gestion de la progression de l'imprimante 3D.
triggers:
  - trigger: state
    entity_id:
      - sensor.sidewinder_x4_pro_progress
    id: progress
  - trigger: state
    entity_id:
      - sensor.sidewinder_x4_pro_current_print_state
    id: state
conditions:
  - condition: template
    value_template: "{{trigger.to_state.state != 'unavailable'}}"
actions:
  - if:
      - condition: trigger
        id:
          - progress
      - condition: state
        entity_id: sensor.sidewinder_x4_pro_current_print_state
        state: printing
    then:
      - action: script.app_custom_awtrix
        metadata: {}
        data:
          message: Print
          progress: "{{ trigger.to_state.state }}"
          application: Printer3D
          icon: "51841"
    else:
      - action: script.app_custom_awtrix
        metadata: {}
        data:
          application: Printer3D
          delete: true
mode: single

Conclusion

En résumé, cet afficheur à pixels est un gadget complètement inutile… mais absolument indispensable ! 😊

Commentaires

Il n'y a pas encore de commentaire, soyez le premier.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Réseaux sociaux