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 😃.
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 :
- Rendre tout paramètre facultatif pour simplifier les configurations.
- Ajouter des options, comme un mode arc-en-ciel ou une barre de progression.
- Permettre de supprimer une application directement.
- Spécifier un afficheur en particulier ou diffuser sur tous si rien n’est indiqué.
- Désactiver le défilement des applications et figer l’horloge lorsque je regarde la télévision.
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.
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
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 ! 😊
Laisser un commentaire